QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x

AcGeMatrix3d有几种方法:

移动

Acad::ErrorStatus Move(AcDbObjectId entId, const AcGePoint3d ptFrom, const AcGePoint3d ptTo), |# d& j% E0 }, G; i+ z3 ~
{
) ?4 [) a* F- R- w6 W// 构建用于实现移动实体的矩阵
+ Q. n: }( {: DAcGeVector3d vec(ptTo[X] – ptFrom[X], ptTo[Y] – ptFrom[X], ptTo[Z] – ptFrom[Z]);
7 p1 @0 \* ^1 Q3 y5 |! BAcGeMatrix3d mat;
4 b0 H0 S6 g" b# @! |mat.setToTranslation(vec);
1 p  Y9 A' V9 E+ W! iAcDbEntity *pEnt = NULL;6 e: a# a! L* y1 n9 b1 `
Acad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);
7 F$ z! \* P, p3 L( Y, ]  bif (es != Acad::eOk)
7 o/ ?+ Y! u( \. ureturn es;
9 \& i  X/ i. b, e# d$ S7 ges = pEnt->transformBy(mat);
' u  E# U" c4 v8 TpEnt->close();; t: q6 b5 a4 v- Y3 I' t9 c
return es;
% q6 u/ U3 }) v; \+ Y5 x0 ^}

复制

BOOL Copy(AcDbObjectId entId, const AcGePoint3d ptFrom,const AcGePoint3d ptTo)
$ \7 z/ w, W4 E8 ?$ x8 g9 ?0 K{
2 y$ ~% l9 c% C6 Z( G' }% F( pAcDbEntity *pEnt = NULL;; O; O2 e- a# C" H
if (acdbOpenObject(pEnt, entId , AcDb::kForRead) != Acad::eOk)
. k) n* g0 L2 Y, D: Breturn FALSE;
4 U4 p! P: O5 H: c. V2 I0 lAcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());9 J4 b1 l4 G( s, h; L" z( ?* ]+ \
AcDbObjectId copyEntId;5 v/ Q. Z9 G! |, r! L. Z
if (pCopyEnt)
) O5 @1 U" a+ L3 n6 h( y7 L. F% [copyEntId = PostToModelSpace(pCopyEnt);. c$ |1 k; S4 y! P0 r7 c
Move(copyEntId, ptFrom, ptTo);

return TRUE;
4 [7 G+ U. B' S" d" o7 D, Z$ S}

镜像

Acad::ErrorStatus Mirror(AcDbObjectId entId, const AcGePoint3d dp1,const AcGePoint3d dp2)
% C0 G5 Q+ g: X' Y2 _{& q, t) s- p; q# o( j* R6 ]5 h
// 构建用于实现移动实体的矩阵; Z5 }7 |1 j1 [& j$ b/ F
AcGeMatrix3d mat;AcGeLine3d line;
. u! _$ w/ z0 g( `  S& r/ }line.set(dp1,dp2);
) B- l7 E2 m$ Q: fmat.setToMirroring(line);6 t2 E# N1 _$ _# v
AcDbEntity *pEnt = NULL;# s8 F0 p0 R; }! [8 Z( P( t+ O
Acad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);
5 o! ]1 f. X/ u* a: Hif (es != Acad::eOk)8 s+ u& s& K, {" O/ S
return es;
, D" B8 Y/ j- v  r% A8 d6 eAcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());
5 n1 O7 F2 o$ a- H6 {  }( QAcDbObjectId copyEntId;
8 X+ N1 {2 V7 c; ?( i$ a/ z9 eif (pCopyEnt)
* s$ V9 m7 d. |8 m+ d+ DcopyEntId = PostToModelSpace(pCopyEnt);
6 u! L: |3 t) y, T4 N) j" y+ F  fes = pEnt->transformBy(mat);( d0 ~. I; T* V/ n; w
pEnt->close();
. I0 _" P6 t/ g2 X- jreturn es;
0 A' X$ T0 i! w/ z  o2 l6 Q}
, z% _' X$ b( a  @2 H& ystatic AcDbObjectId PostToModelSpace(AcDbEntity* pEnt)
1 B- {9 O; }- Z" @- W{
% `/ ]' Q( x1 k" l8 E9 `9 ~" ?AcDbBlockTable *pBlockTable;
# g9 D# s7 ^. h$ b+ M. O; m# ^acdbHostApplicationServices()->workingDatabase() ->getBlockTable(pBlockTable, AcDb::kForRead);- l, r* r+ ^+ [' g% O( w
AcDbBlockTableRecord *pBlockTableRecord;9 N' K$ V* N- k8 E' Z  G
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
2 H. V# c+ U7 \AcDbObjectId entId;7 _. @2 G1 e5 h" S
pBlockTableRecord->appendAcDbEntity(entId, pEnt);
2 i& r9 y$ G9 ]4 u# z5 d- C) tpBlockTable->close();1 O. @: T" u0 d- E" A% J/ `/ C3 o* q4 B
pBlockTableRecord->close();& r+ H5 q+ g' }5 X- `9 s" }5 }% w
pEnt->close();
# ^2 A/ k" C) Jreturn entId;

}


$ o. a* @$ B; i0 k参考:http://www.colinchou.com/archives/245
/ u) K( k. o8 N6 _1 R8 v+ R4 w; X( e+ Z, m" T- t' E% g2 U

( e: D) y, S0 T& d- q9 N- O5 }/ I
* v) `/ e. m1 j' a4 Q
# ]  v! j$ G* f 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 )

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