QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 4071|回复: 0
收起左侧

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

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

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

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

x

AcGeMatrix3d有几种方法:

移动

Acad::ErrorStatus Move(AcDbObjectId entId, const AcGePoint3d ptFrom, const AcGePoint3d ptTo)" |! P+ J) J3 }) ?% ^2 x
{
4 P6 L. q* X9 m* c( T& S// 构建用于实现移动实体的矩阵7 z  `5 J. M( |5 H$ T2 ~
AcGeVector3d vec(ptTo[X] – ptFrom[X], ptTo[Y] – ptFrom[X], ptTo[Z] – ptFrom[Z]);
) c3 g6 t$ W& d& e% N+ R- E& kAcGeMatrix3d mat;
9 P& y9 L& S2 W1 H! `) Vmat.setToTranslation(vec);' A8 C; P9 N* B/ V
AcDbEntity *pEnt = NULL;2 H; C  @: H/ Y4 Z
Acad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);: \* p3 a3 W! Z; f9 Q1 {% F. M/ I
if (es != Acad::eOk)2 L2 \& W& N& B$ `3 j, z( s
return es;
9 c7 D) i" \) k/ Q; _es = pEnt->transformBy(mat);2 G, E+ b, E# T" w- p, p
pEnt->close();
5 f  g4 }: ?2 l5 {3 Vreturn es;4 B* c- k0 d( |; |, J0 E
}

复制

BOOL Copy(AcDbObjectId entId, const AcGePoint3d ptFrom,const AcGePoint3d ptTo)
1 c3 ^2 V0 P5 E& z" d3 F% m{
* I- x: M, J; ^+ \) ~* I; PAcDbEntity *pEnt = NULL;
5 C  w6 W4 X9 d- z) uif (acdbOpenObject(pEnt, entId , AcDb::kForRead) != Acad::eOk)) F4 F$ t1 G! {2 \# o, d
return FALSE;6 X( Q3 i1 c6 o. C2 w7 o
AcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());
  g* {2 b) W$ ^. Y  c$ l1 x# oAcDbObjectId copyEntId;
; s/ E+ a- k7 [5 j$ T2 kif (pCopyEnt); \: q4 J6 |0 q  L  e" P6 z9 B& a
copyEntId = PostToModelSpace(pCopyEnt);1 m+ c1 u1 W, j: i# A) {
Move(copyEntId, ptFrom, ptTo);

return TRUE;+ j3 ?" K& D5 [1 Z1 i# q3 R' R
}

镜像

Acad::ErrorStatus Mirror(AcDbObjectId entId, const AcGePoint3d dp1,const AcGePoint3d dp2), b  \/ A+ d* y8 \3 P& [
{: m" N. _: g7 b) O
// 构建用于实现移动实体的矩阵
) z0 y6 w3 _* OAcGeMatrix3d mat;AcGeLine3d line;7 i* P$ [* G. {1 T' r5 W5 D
line.set(dp1,dp2);
  P: U/ y. p# H) `! Omat.setToMirroring(line);
9 ?4 @  S9 T) dAcDbEntity *pEnt = NULL;
& x( }& x5 ]9 ^5 |; ^6 M" ^Acad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);3 h9 q5 G: d! X1 D7 P# ]8 ^
if (es != Acad::eOk)
! r* k  X( }8 D7 O1 L8 preturn es;
/ G# P5 ]  ]% y# E7 n- mAcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());
9 F9 H4 A9 D, V0 I2 L" |9 ~AcDbObjectId copyEntId;+ A2 v  r) ^7 {9 o+ K% R; a+ K
if (pCopyEnt)1 L/ h$ F5 y( Y; K. @2 H# b
copyEntId = PostToModelSpace(pCopyEnt);
# F, Q0 ]" v( A+ H1 d2 kes = pEnt->transformBy(mat);
: z7 ^; p/ [% gpEnt->close();
( @/ x; ~& W9 E- u  C. Xreturn es;
9 e7 S. ]' I4 W" T) f}
7 d8 z+ v3 o, F& d! b. m4 sstatic AcDbObjectId PostToModelSpace(AcDbEntity* pEnt)
: y  o; C* Z0 E) X: U+ N{
; `% y5 A6 Y; H* qAcDbBlockTable *pBlockTable;
# Y: A' A/ ?4 b$ a5 ~2 uacdbHostApplicationServices()->workingDatabase() ->getBlockTable(pBlockTable, AcDb::kForRead);
/ f8 X) N  U+ j  t; o: rAcDbBlockTableRecord *pBlockTableRecord;9 g  J7 b. x0 K/ N. R
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
8 F1 U4 P7 N; y. m/ F/ U1 ?; J. bAcDbObjectId entId;
. D. P) {" A3 F3 M, p1 b, opBlockTableRecord->appendAcDbEntity(entId, pEnt);4 p' n6 X( |+ {/ {) t1 g- v
pBlockTable->close();" Q+ n' }0 e. E7 {) z
pBlockTableRecord->close();: q: Q, ^7 P9 p; ?5 S( D# F9 S! Y
pEnt->close();
3 R7 p. V  S, I, s4 Vreturn entId;

}


' U" c. X  c+ C- u参考:http://www.colinchou.com/archives/245
: \6 n2 a7 f, Y6 A( I7 @3 @+ V
& ?9 A* }" `! P7 |) o
2 t' p" S/ C1 r/ R
& d4 [# ~' r/ L, J& g$ N, b3 s7 j- [! p7 R$ G
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 )

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