QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
7天前
查看: 3971|回复: 0
收起左侧

[原创] 【ARX 一步一步开发CAD】04-复制、移动、镜像函数

[复制链接]
发表于 2013-12-10 16:58:30 | 显示全部楼层 |阅读模式 来自: 中国江苏南京

马上注册,结识高手,享用更多资源,轻松玩转三维网社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x

AcGeMatrix3d有几种方法:

移动

Acad::ErrorStatus Move(AcDbObjectId entId, const AcGePoint3d ptFrom, const AcGePoint3d ptTo)$ {2 q/ n' V+ B5 f# I0 R( O4 w
{
8 o; B0 [% L  d// 构建用于实现移动实体的矩阵7 _6 x% l% q1 k5 q4 ?* b/ w; h
AcGeVector3d vec(ptTo[X] – ptFrom[X], ptTo[Y] – ptFrom[X], ptTo[Z] – ptFrom[Z]);+ G* Y3 F* |' p7 f2 _2 J/ A' p
AcGeMatrix3d mat;
/ Y, ]% ?9 @# v0 R0 z- f0 i- bmat.setToTranslation(vec);
2 }, j/ B1 f4 K3 R& ?8 q+ ]% lAcDbEntity *pEnt = NULL;, o: Z, e6 q7 D
Acad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);
6 X& B2 b( ]- m0 K2 p, \) Cif (es != Acad::eOk)
7 _3 k& c0 w8 `- ~8 F/ J) hreturn es;
0 {' o4 J! [  Y( Ges = pEnt->transformBy(mat);: J* J' a, L+ Y2 S+ H
pEnt->close();
" A% ~* |5 V8 g8 n5 hreturn es;
1 Y3 \; Z7 o. u}

复制

BOOL Copy(AcDbObjectId entId, const AcGePoint3d ptFrom,const AcGePoint3d ptTo)
& H7 f8 F# h: v{) i+ V# g! {3 Z
AcDbEntity *pEnt = NULL;: O; g, k# U) b& Q
if (acdbOpenObject(pEnt, entId , AcDb::kForRead) != Acad::eOk)* A* l/ R4 s1 m: @
return FALSE;
, c9 m9 n$ k5 i! t  a- L+ }9 C& wAcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());
  b; m2 S0 [: HAcDbObjectId copyEntId;( a, Z2 t! ^  n* h) Q- I
if (pCopyEnt)% B; k& o  J) [) R" P# ?8 M
copyEntId = PostToModelSpace(pCopyEnt);; o5 D( r8 M- x8 n, z$ X. `3 E" a& ]
Move(copyEntId, ptFrom, ptTo);

return TRUE;- e% I+ U4 |- u
}

镜像

Acad::ErrorStatus Mirror(AcDbObjectId entId, const AcGePoint3d dp1,const AcGePoint3d dp2)  a) ?# P$ V% v; s
{" F+ N" {0 h; g7 X4 p9 {
// 构建用于实现移动实体的矩阵3 x) K$ E8 b5 L2 U! ^/ k
AcGeMatrix3d mat;AcGeLine3d line;
0 p0 Y; o) G8 a! n0 Bline.set(dp1,dp2);5 Q4 o/ c$ e  |' v2 v  G, B2 A
mat.setToMirroring(line);
" h' q1 e/ h: T6 X% l9 SAcDbEntity *pEnt = NULL;
, M4 x* O) t" `' J: eAcad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);. _* k8 s+ y! Z* a+ s. n
if (es != Acad::eOk)9 x. @0 K$ ^$ ?% I$ _! e
return es;
) W1 H- P; @! z& Y! HAcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());
4 M8 v' X" e; B( h( A& u' G6 }AcDbObjectId copyEntId;! o$ i" d  n3 ^: o% H' q6 P
if (pCopyEnt)7 q5 s8 Q7 I. C+ R2 Z+ J$ k- F3 x
copyEntId = PostToModelSpace(pCopyEnt);
% }  b* _+ Q, G. b- h# mes = pEnt->transformBy(mat);
9 T' O; Y, M" ?; S  i" f: G! OpEnt->close();
' r7 n4 O0 w( U9 preturn es;! N* `" V, [2 M3 e
}1 t# P  S) c( x; u! R6 _  f0 \
static AcDbObjectId PostToModelSpace(AcDbEntity* pEnt)$ M1 W5 V' B; j% Y
{( P* D' |, v$ e2 _
AcDbBlockTable *pBlockTable;
( y  N8 E' x; ?& t% o" oacdbHostApplicationServices()->workingDatabase() ->getBlockTable(pBlockTable, AcDb::kForRead);  |: \% d+ T* h& _: r5 r& q9 K
AcDbBlockTableRecord *pBlockTableRecord;
2 E+ q4 S3 T5 i: U/ \8 ypBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
) |/ m* ?5 G2 R6 CAcDbObjectId entId;
7 I* f- q. n! o, f8 C) CpBlockTableRecord->appendAcDbEntity(entId, pEnt);
: N* S) u7 s2 m1 u3 BpBlockTable->close();: B! ~. n- Q) H$ I7 }1 Z
pBlockTableRecord->close();
) e. o; B  \: d" x# DpEnt->close();* I! l' P# {  v. [5 M# I" u
return entId;

}

+ r+ D: s* F9 e6 B5 t
参考:http://www.colinchou.com/archives/245
6 e% e; _/ P" a# ^0 k2 A( G3 R2 S: V

! p6 r9 A* u* @) ^) X6 s  R
9 h3 Q: G) D  _" H5 {$ c! {. `3 R. n& h# z
http://www.3dportal.cn/discuz/source/plugin/sina_xweibo_x3/xwb/images/bgimg/icon_logo.png 该贴已经同步到 colinzhoucn的微博
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Licensed Copyright © 2016-2020 http://www.3dportal.cn/ All Rights Reserved 京 ICP备13008828号

小黑屋|手机版|Archiver|三维网 ( 京ICP备2023026364号-1 )

快速回复 返回顶部 返回列表