QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x

AcGeMatrix3d有几种方法:

移动

Acad::ErrorStatus Move(AcDbObjectId entId, const AcGePoint3d ptFrom, const AcGePoint3d ptTo)
5 M' N# T4 b9 A( @' a7 g1 \{* Q' J9 v& V9 f9 j" f( i
// 构建用于实现移动实体的矩阵4 }. O) s  c, j. n# s6 U
AcGeVector3d vec(ptTo[X] – ptFrom[X], ptTo[Y] – ptFrom[X], ptTo[Z] – ptFrom[Z]);, |* b  w0 o8 P* y: \; H  c
AcGeMatrix3d mat;$ ]0 M0 ~5 k# J4 A; T" W
mat.setToTranslation(vec);
1 }( H; T: X- U1 s7 Q+ S& k6 r6 d) xAcDbEntity *pEnt = NULL;
. N) W7 Z3 a" e( D+ y2 i# S3 {Acad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);( f) _4 s- O: z, r/ l
if (es != Acad::eOk), x; P6 D$ O9 H, [# ]
return es;8 y& z+ M+ ]) B. l7 ?3 t$ z2 Y+ [
es = pEnt->transformBy(mat);9 O+ n. X# O4 w5 M; B
pEnt->close();: e4 j6 G! B. F0 Q5 R
return es;
8 ^/ {" O6 {' R: D2 P}

复制

BOOL Copy(AcDbObjectId entId, const AcGePoint3d ptFrom,const AcGePoint3d ptTo)
3 P) i* H# x$ M* N6 z8 e$ l{% o# c" v1 X% _. n2 i% a( u" H2 L
AcDbEntity *pEnt = NULL;+ q7 S& o8 d! K5 x6 {" T( j
if (acdbOpenObject(pEnt, entId , AcDb::kForRead) != Acad::eOk)
; \: [  H# @& }* u7 _return FALSE;
2 [- n# D, h2 x% qAcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());# l% j: A2 p6 D' A+ h
AcDbObjectId copyEntId;
. e2 x* j& C; W2 M0 O- e" {5 wif (pCopyEnt)
) m9 ]$ R  D: e$ |8 i- \copyEntId = PostToModelSpace(pCopyEnt);
$ J8 a1 _( b3 C/ t+ d: _/ |3 vMove(copyEntId, ptFrom, ptTo);

return TRUE;
+ t6 I% r  @9 y: o; K; L}

镜像

Acad::ErrorStatus Mirror(AcDbObjectId entId, const AcGePoint3d dp1,const AcGePoint3d dp2)
0 I# {* d& `) R# r{
  [' }4 K* f/ k' }6 g* T" S  Q// 构建用于实现移动实体的矩阵
8 ^/ \( d2 z5 C1 u2 gAcGeMatrix3d mat;AcGeLine3d line;
( j$ E1 J" o4 B& B" tline.set(dp1,dp2);* [3 Y4 [: v  Q3 s/ D$ a- [' W
mat.setToMirroring(line);0 A7 L1 U# n, n6 G  w
AcDbEntity *pEnt = NULL;
) P) C2 Q+ b  h: Y# QAcad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);
3 L1 v/ w# p1 P$ {8 S/ A" \; d3 I7 nif (es != Acad::eOk)8 Y/ \! {5 Q$ L6 |# O+ z. ?% J
return es;
% n% m$ n' E$ L+ x% W5 G% G+ z2 JAcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());
# [6 I6 w6 w: G+ q( _AcDbObjectId copyEntId;
8 a# K, f' d! j( ^9 o! D" D5 kif (pCopyEnt)& h- [0 _8 e& P0 l3 L
copyEntId = PostToModelSpace(pCopyEnt);# t: |9 x% f% k
es = pEnt->transformBy(mat);
" x6 k9 f& ~5 J3 e" i  DpEnt->close();
% S+ U; u7 O* y% n% _return es;
. w# ]6 B' h9 O; x- a( m}
9 U7 a2 O  j, i& Cstatic AcDbObjectId PostToModelSpace(AcDbEntity* pEnt)
/ [  j6 o, h0 q% I8 a0 N8 k{3 {+ q4 C  x4 D
AcDbBlockTable *pBlockTable;$ J+ E- V5 [. s
acdbHostApplicationServices()->workingDatabase() ->getBlockTable(pBlockTable, AcDb::kForRead);
0 m0 g. b7 k& m) P# f* v& v/ `% m+ EAcDbBlockTableRecord *pBlockTableRecord;
7 v( i( r# p8 y' TpBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);; G& ^1 K: v3 @* e
AcDbObjectId entId;
2 B  h5 M( ]1 D2 i6 q% r& N! wpBlockTableRecord->appendAcDbEntity(entId, pEnt);! D+ }% y# K: G- s5 h
pBlockTable->close();
# t2 D. B( P1 j) l0 r7 k8 zpBlockTableRecord->close();
* e1 v+ C$ d2 A/ Q. M8 ]0 BpEnt->close();
3 _/ l/ g5 O% P0 zreturn entId;

}


, l* b' R# s7 n2 l* J! N; A参考:http://www.colinchou.com/archives/245' w( L( x& u/ }
" r, [4 p6 L4 W) u2 w
8 `# I8 ?3 D5 y1 W

% w6 U1 H0 r% ^  e8 [2 X
. z1 p! ^5 ?  v3 ]1 U1 s6 E) X 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 )

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