QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x

AcGeMatrix3d有几种方法:

移动

Acad::ErrorStatus Move(AcDbObjectId entId, const AcGePoint3d ptFrom, const AcGePoint3d ptTo). ~: l  T$ U2 u: Q9 w/ s
{
/ P: x% v' T) ?* ?! n// 构建用于实现移动实体的矩阵5 T8 [3 O4 Y8 b0 E3 C6 u3 F
AcGeVector3d vec(ptTo[X] – ptFrom[X], ptTo[Y] – ptFrom[X], ptTo[Z] – ptFrom[Z]);
/ E8 F+ o' b6 x& QAcGeMatrix3d mat;2 Y; }+ R% ~! _' `, q$ Y- |
mat.setToTranslation(vec);
& n* O; X0 w$ ~5 \) T- e! ^  q6 bAcDbEntity *pEnt = NULL;
- l- v9 ^- S% V3 \; k* UAcad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);* o; ?% y1 O* V! C+ N& e- a7 z. n
if (es != Acad::eOk)" ~! D7 W& x% E2 o& a) k5 E2 @0 @
return es;; k$ a# Z# i$ n8 c; B% [* q
es = pEnt->transformBy(mat);
$ V( F5 _4 }, G: }) ]% u* ypEnt->close();( x8 _, P' O: Y, D# R0 m  v
return es;
9 y0 h$ S' h( I* w7 D) S6 U# i}

复制

BOOL Copy(AcDbObjectId entId, const AcGePoint3d ptFrom,const AcGePoint3d ptTo)8 n6 q4 D9 N: h" g0 W
{
* @- Y/ ?; m' o5 vAcDbEntity *pEnt = NULL;% `0 m7 Q6 d2 m* R2 D$ W  U
if (acdbOpenObject(pEnt, entId , AcDb::kForRead) != Acad::eOk)
; F# m( w* L* C0 y: h0 Jreturn FALSE;. F* T- W2 X/ r9 Q8 P
AcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());
. J1 w( F9 z+ r9 I  N, gAcDbObjectId copyEntId;" N1 j' ~. ~' p7 @
if (pCopyEnt)# u% o% Q. W# \& W8 d% c+ n
copyEntId = PostToModelSpace(pCopyEnt);/ n( H6 D# A" F% D- [; d! Z- V9 _1 @
Move(copyEntId, ptFrom, ptTo);

return TRUE;
  W7 L% K2 F9 u' z: @. l; V+ l6 }}

镜像

Acad::ErrorStatus Mirror(AcDbObjectId entId, const AcGePoint3d dp1,const AcGePoint3d dp2)
1 P, @5 K2 s  B$ j% w{
, I' z3 s, ?% }# x& F4 w' k// 构建用于实现移动实体的矩阵
/ q  y- C+ _1 f7 H/ \# CAcGeMatrix3d mat;AcGeLine3d line;4 t5 R1 t& }4 \7 ?" k$ r
line.set(dp1,dp2);
. M1 x( E2 ^6 O* T" C4 G$ @' Kmat.setToMirroring(line);& M" G/ N1 M4 W6 @) s
AcDbEntity *pEnt = NULL;! F& o: T9 ~6 D4 D0 t
Acad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);
% d) S' ?* p( sif (es != Acad::eOk)2 `8 F- G2 a; k+ H3 s8 {
return es;+ k' u! X' \: J9 |2 h5 v
AcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());
( X- Z  m  M; Q. r" rAcDbObjectId copyEntId;: C3 X1 e+ f2 m6 j+ X1 _/ a
if (pCopyEnt)
2 O+ b4 ^: N* H) T1 z$ }copyEntId = PostToModelSpace(pCopyEnt);
* {1 k8 e+ S$ e/ G3 W, nes = pEnt->transformBy(mat);% \/ C6 O- L- }* t: N  a5 t
pEnt->close();
2 W, U4 l% v8 t" G( \( o# \return es;* K# j$ u$ l+ Q) R8 m0 P3 L
}
! h- k$ Q0 _4 o) D  nstatic AcDbObjectId PostToModelSpace(AcDbEntity* pEnt)! V, \8 O, d* ~1 B9 P) f
{' S4 g! P% F# p6 M: S& r6 D
AcDbBlockTable *pBlockTable;
# |: j  E7 O" R8 b! P+ EacdbHostApplicationServices()->workingDatabase() ->getBlockTable(pBlockTable, AcDb::kForRead);+ @9 @- {( r7 B) N$ M( W
AcDbBlockTableRecord *pBlockTableRecord;
& A& e9 w+ @4 ]$ @; DpBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
0 h2 J( J6 V: w: X& c5 M( YAcDbObjectId entId;, X0 v+ w! A2 o7 \) x
pBlockTableRecord->appendAcDbEntity(entId, pEnt);
8 n, B. e* b4 z% p* o2 D) ApBlockTable->close();
; y2 |2 Q0 w8 B( Y; l3 vpBlockTableRecord->close();8 b. @7 j9 [) o
pEnt->close();4 w1 \6 t+ ^, W1 P: @1 |
return entId;

}


4 z) {/ o( i4 |0 C3 H参考:http://www.colinchou.com/archives/245
0 `0 L3 d7 ~4 j! h: o! j
4 z+ O/ S7 s- u. j% ?% _5 I
* O& P! M: o- Z* z' q& ~, S3 X: G5 f
; G; V7 x: Q$ K) W4 P4 w) d$ n+ Z! K
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 )

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