QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x

AcGeMatrix3d有几种方法:

移动

Acad::ErrorStatus Move(AcDbObjectId entId, const AcGePoint3d ptFrom, const AcGePoint3d ptTo)
7 {8 R2 `8 A  y{
- {2 l' ~2 }0 L8 P9 ~// 构建用于实现移动实体的矩阵( j# Q1 T! c! w
AcGeVector3d vec(ptTo[X] – ptFrom[X], ptTo[Y] – ptFrom[X], ptTo[Z] – ptFrom[Z]);+ Z& K7 R  @' Q5 S
AcGeMatrix3d mat;
1 e( j0 h# J) _! u; Ymat.setToTranslation(vec);1 f/ s; r& x0 H
AcDbEntity *pEnt = NULL;3 E  U# u6 L2 o$ M0 Q5 R+ [: Z
Acad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);
$ k1 R0 m# \4 J6 A$ K. g# }. Bif (es != Acad::eOk)
! i; v% i  N* `$ h4 _! Freturn es;
8 ~" E. C, @1 C/ g; @es = pEnt->transformBy(mat);; R+ j2 }7 K, X" _# T& ]1 ~8 w
pEnt->close();, ?7 D9 G0 b9 E  B7 ~" U" W
return es;- f$ a: W$ W' ^7 K0 [' _( ?3 W
}

复制

BOOL Copy(AcDbObjectId entId, const AcGePoint3d ptFrom,const AcGePoint3d ptTo)' W& z# M+ d$ p# Y& p1 Y
{/ P1 ^' M# G0 D  X( \2 H3 o
AcDbEntity *pEnt = NULL;; u: v" [0 k- @: {7 _/ l9 `
if (acdbOpenObject(pEnt, entId , AcDb::kForRead) != Acad::eOk)0 E5 q. i  I& I
return FALSE;2 }$ ?& L" a! D  U, R5 f
AcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());/ A% u" G5 `& f6 M
AcDbObjectId copyEntId;8 u/ G8 x9 k5 b5 I
if (pCopyEnt)- F; Z* W+ u( M" [
copyEntId = PostToModelSpace(pCopyEnt);8 r' K3 c7 a- b# C; L
Move(copyEntId, ptFrom, ptTo);

return TRUE;4 a5 y: `- D# d9 `- [
}

镜像

Acad::ErrorStatus Mirror(AcDbObjectId entId, const AcGePoint3d dp1,const AcGePoint3d dp2)! e6 W+ p) C6 p1 Z) c* p4 L! Y
{- e: h! h3 U) T4 W, b! K/ s' v
// 构建用于实现移动实体的矩阵' ^0 B1 U9 C- G. D2 ]
AcGeMatrix3d mat;AcGeLine3d line;
" C8 p9 u8 o+ tline.set(dp1,dp2);" `4 [6 h$ f5 f( }/ }, @+ H4 U
mat.setToMirroring(line);+ Y' d7 {3 l% C  o, n: G
AcDbEntity *pEnt = NULL;
8 @, i* q  e% f9 GAcad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);
4 L* o9 G' ]: d: D/ B" p" nif (es != Acad::eOk)
; Q' E! k8 s( S6 h' f0 \. Ereturn es;" L! {; q$ l- O0 a, C
AcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());
: H; C7 }6 S' ?AcDbObjectId copyEntId;2 b4 X, t" C% F9 ]
if (pCopyEnt)- Z2 }4 f0 i+ C" t$ f9 i
copyEntId = PostToModelSpace(pCopyEnt);
( y0 u1 ]. j( l* pes = pEnt->transformBy(mat);; g. ?  Z3 C. V# x3 v5 t  A- n; E
pEnt->close();
( g/ M% \! t  h; Y3 C: vreturn es;
* x! |* E4 I- w- j) X+ ]5 V. \}
/ H; x# ~( z7 H# M) c7 t3 ]static AcDbObjectId PostToModelSpace(AcDbEntity* pEnt)
) W. T6 p0 }, D# Y- `/ K9 q{% Y, y& @: z: c+ Z" W9 x
AcDbBlockTable *pBlockTable;
1 e/ K# s  W& TacdbHostApplicationServices()->workingDatabase() ->getBlockTable(pBlockTable, AcDb::kForRead);3 c( H5 v2 H& j! `' {3 W( n
AcDbBlockTableRecord *pBlockTableRecord;
, X6 ?0 Z& B8 n/ \pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
+ l# k  B( b( ^+ ]) R; LAcDbObjectId entId;
$ C! n$ f3 P: k% lpBlockTableRecord->appendAcDbEntity(entId, pEnt);2 Z; |2 Z/ g) X& M" S
pBlockTable->close();
+ Y$ d, d1 d0 x' {pBlockTableRecord->close();
% Q. d8 V3 }0 L3 PpEnt->close();3 G# c( w6 O" Z& Q
return entId;

}

3 Z; o) x: S2 a' x  j
参考:http://www.colinchou.com/archives/2454 {- e" Z6 [6 ?, Q. K, V
0 C1 ]( w5 r9 T3 t3 w' f' Y
1 P$ e% M2 P% g/ x2 d0 t

6 ?+ w8 o5 g0 K3 a9 r$ B5 I$ H
) U' i8 q  S; i2 X0 n+ H 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 )

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