QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
10天前
查看: 3973|回复: 0
收起左侧

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

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

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

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

x

AcGeMatrix3d有几种方法:

移动

Acad::ErrorStatus Move(AcDbObjectId entId, const AcGePoint3d ptFrom, const AcGePoint3d ptTo)
9 z8 f9 w1 n! g8 C{) P1 e4 G+ Q7 m/ A; ]1 p- w/ B
// 构建用于实现移动实体的矩阵9 m  s/ }* a7 N# q
AcGeVector3d vec(ptTo[X] – ptFrom[X], ptTo[Y] – ptFrom[X], ptTo[Z] – ptFrom[Z]);9 J, O8 A$ f4 X4 l! [# ^- y
AcGeMatrix3d mat;( ?9 F+ a& O* g8 ~7 \# B
mat.setToTranslation(vec);
$ h0 y6 h, F- e; {2 [AcDbEntity *pEnt = NULL;
. j6 W+ {( ~7 oAcad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);3 S' S- C6 H4 J6 u
if (es != Acad::eOk)6 h4 |* [. N/ @
return es;* Z* U( n3 S3 M& g6 f
es = pEnt->transformBy(mat);
. v: ^1 F. n) P: K. B! F8 IpEnt->close();: o+ M1 H" @! v' f3 E
return es;
4 E$ B$ I4 W' A% D! V% T% D# Y+ S}

复制

BOOL Copy(AcDbObjectId entId, const AcGePoint3d ptFrom,const AcGePoint3d ptTo)
: J; v2 B4 R' R& k0 p9 T. T{/ f( _. A/ @6 Z- z) k  }& Y7 w7 @7 }. J
AcDbEntity *pEnt = NULL;  K" G# \6 h; X4 C* d# g. u
if (acdbOpenObject(pEnt, entId , AcDb::kForRead) != Acad::eOk)  @3 a0 I2 H& q6 d7 n' D: q3 R
return FALSE;
. }! h$ X* K! mAcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());% C: s8 b- r4 d6 C7 u  B
AcDbObjectId copyEntId;4 s! ~2 ^) V& b9 T9 N1 K& P1 k, b
if (pCopyEnt)
+ s* m% b; y0 Z% _- V7 fcopyEntId = PostToModelSpace(pCopyEnt);
9 {- j( m( y) [3 sMove(copyEntId, ptFrom, ptTo);

return TRUE;
4 o+ Q/ r4 `  \9 \* M- L+ R0 B}

镜像

Acad::ErrorStatus Mirror(AcDbObjectId entId, const AcGePoint3d dp1,const AcGePoint3d dp2)
. p/ v2 K/ z9 M, O7 r' c) c6 q+ H{" ~) k9 T5 @# b( W: M5 q3 z' }
// 构建用于实现移动实体的矩阵
$ C; K3 ~3 l( Z" G( `AcGeMatrix3d mat;AcGeLine3d line;
/ s" y/ p8 q4 Z/ [7 d0 K7 bline.set(dp1,dp2);, u# j: F  z: t. b, B' h2 S
mat.setToMirroring(line);& o1 @# l: I; C% v
AcDbEntity *pEnt = NULL;6 T! b' b8 e; n9 O1 t# R/ g
Acad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);
* S* U5 v0 W6 _- {7 {) Uif (es != Acad::eOk)
, v: k2 w) w! v( }return es;
: u( [7 ]8 H2 f3 RAcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());
4 |: ~: Y5 D( X. W- WAcDbObjectId copyEntId;7 Q" a( [3 z9 h/ J0 \: X* W# X
if (pCopyEnt)9 W1 @4 h% p' r: C
copyEntId = PostToModelSpace(pCopyEnt);
: B. ?: q5 [( j7 _4 Kes = pEnt->transformBy(mat);  s3 G- {- ?- d, Z( p5 M; o
pEnt->close();
+ N5 W" K1 f3 a, {5 ~7 rreturn es;! m# A- A$ n3 y4 ]% w5 u8 A# U
}
$ `1 f0 M: m( m* g% ostatic AcDbObjectId PostToModelSpace(AcDbEntity* pEnt). Q. D7 i+ O* ?: r4 S* f
{
8 [: F. N0 p7 T9 F$ fAcDbBlockTable *pBlockTable;
$ N- ]) a% ~3 R' lacdbHostApplicationServices()->workingDatabase() ->getBlockTable(pBlockTable, AcDb::kForRead);2 `# ^! `7 E9 v( J2 [
AcDbBlockTableRecord *pBlockTableRecord;, Y4 z" K- I7 d4 v
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
: V/ J1 }# Y. P$ x; eAcDbObjectId entId;# ?) Y' t- \! H
pBlockTableRecord->appendAcDbEntity(entId, pEnt);, O4 M& O) M0 s! s* x/ q
pBlockTable->close();# J- e0 _' F- g; k) X6 _
pBlockTableRecord->close();+ |0 w# Z  v5 e
pEnt->close();/ s1 o2 h! w' p' C) }
return entId;

}


7 S9 z8 g/ T/ p$ ?+ q参考:http://www.colinchou.com/archives/245# {0 t5 {: D7 \2 C% H. }
& F) ?' F4 E  i1 ~4 s1 e, P

6 n* G7 P. M* v) ]3 {3 ?: g% r* n: u6 D2 j) |4 H2 {3 U
' r5 g$ X) r7 Z/ X1 t
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 )

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