QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
7天前
查看: 4033|回复: 0
收起左侧

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

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

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

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

x

AcGeMatrix3d有几种方法:

移动

Acad::ErrorStatus Move(AcDbObjectId entId, const AcGePoint3d ptFrom, const AcGePoint3d ptTo)- z" f; Y9 r4 @; q1 g3 B
{
5 B% W, z" y' H// 构建用于实现移动实体的矩阵
& L1 s: @( T: K) J- q0 BAcGeVector3d vec(ptTo[X] – ptFrom[X], ptTo[Y] – ptFrom[X], ptTo[Z] – ptFrom[Z]);5 ]( s0 g+ e# ]6 V
AcGeMatrix3d mat;7 @) n0 [2 w% b1 @% ~: y! E
mat.setToTranslation(vec);8 n$ p) u, F+ |" r
AcDbEntity *pEnt = NULL;
$ t0 M3 Z" {, h  DAcad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);0 f* w! {) n& A  B* c
if (es != Acad::eOk)! ^1 x9 Q; C' @) s1 y( S
return es;
4 O' [0 `1 {3 P7 x! T) Wes = pEnt->transformBy(mat);9 @% Z+ p! }4 x0 r/ c' J
pEnt->close();; ]0 d- y! v0 J
return es;) @9 {7 n) G5 J0 Y/ f, P
}

复制

BOOL Copy(AcDbObjectId entId, const AcGePoint3d ptFrom,const AcGePoint3d ptTo)2 ^& M+ l9 U; Z( O. j0 k9 M
{. @+ ]5 K3 V9 w6 M- q
AcDbEntity *pEnt = NULL;
0 h& n9 G) z' p& M# {) `if (acdbOpenObject(pEnt, entId , AcDb::kForRead) != Acad::eOk)
. }9 |6 h. ]! X) ^, N9 A* Mreturn FALSE;
  G: L% J& m! ~! _# CAcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());2 A- E7 s: P8 l2 b/ F$ U: G
AcDbObjectId copyEntId;
# n- V( u8 Y; ]( ^+ w: |! ~if (pCopyEnt)5 X6 ^  |# z$ `, W  q& ^
copyEntId = PostToModelSpace(pCopyEnt);
' J# F' |" S  M3 o* D3 x' A  q# hMove(copyEntId, ptFrom, ptTo);

return TRUE;. {6 y  Z9 Q$ i! M7 Y7 w
}

镜像

Acad::ErrorStatus Mirror(AcDbObjectId entId, const AcGePoint3d dp1,const AcGePoint3d dp2)
$ z6 s+ V6 }% G, v9 y{4 D5 d8 ~. ^8 t3 C$ j
// 构建用于实现移动实体的矩阵
6 A! `4 P/ Y2 [; N0 x; IAcGeMatrix3d mat;AcGeLine3d line;6 I3 M1 M1 U7 e5 W( C. V- H+ _
line.set(dp1,dp2);
1 i* `; R5 x2 y2 imat.setToMirroring(line);
7 h# h3 ]$ Y" k, L  z( G' @- QAcDbEntity *pEnt = NULL;4 j. H, i/ r* U% U6 n& h
Acad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);. j, O' c' r" R' B3 s% f& w
if (es != Acad::eOk)! C3 ?! G  N  [8 [7 m
return es;$ \" ]; b2 l" z- X  B" o) ?
AcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());/ z+ T* h  J0 |
AcDbObjectId copyEntId;
! j2 R( K% i0 L) r5 ?if (pCopyEnt)
, U& K! Z, N* [$ ^2 M  _4 |0 x8 BcopyEntId = PostToModelSpace(pCopyEnt);
% H! r! Y( r) p+ x3 Ges = pEnt->transformBy(mat);! ?* C& l; E6 q3 V* c( b
pEnt->close();
6 D! \( e4 P5 g, {5 |! w8 o7 g; hreturn es;- s$ Z* W! F& m, c8 I- |
}
5 u- T5 F: K' z  R' o6 W1 tstatic AcDbObjectId PostToModelSpace(AcDbEntity* pEnt)
4 i5 k. h' H, E" f( n{1 i$ Z5 M2 A3 Z6 F! f0 B
AcDbBlockTable *pBlockTable;
/ }- R8 H- J8 I5 F, I$ V5 BacdbHostApplicationServices()->workingDatabase() ->getBlockTable(pBlockTable, AcDb::kForRead);
* I4 u" E8 A) Z. B- wAcDbBlockTableRecord *pBlockTableRecord;8 N$ G+ n7 m: A7 G; {
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
; \8 k& |% R6 `AcDbObjectId entId;
+ l9 B: d1 a; A: L% y8 S7 A+ ipBlockTableRecord->appendAcDbEntity(entId, pEnt);
4 R3 ?. Y  S. D, {0 lpBlockTable->close();# h& U6 r* D) J4 s, t% T, o
pBlockTableRecord->close();
: ^+ S2 Y# b; `7 HpEnt->close();3 n- ~8 m, T- a; Z
return entId;

}

% o$ t* s1 ~, P
参考:http://www.colinchou.com/archives/245
! K* M5 b" T$ s1 C3 G0 e
4 F( t7 n1 q3 b
9 p, o  B: M5 F: B" m8 s' A( P; n: S* S5 @/ J9 n: z  |  }6 i  `
5 G4 u: W1 h) l5 B
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 )

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