QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x

AcGeMatrix3d有几种方法:

移动

Acad::ErrorStatus Move(AcDbObjectId entId, const AcGePoint3d ptFrom, const AcGePoint3d ptTo)6 ?2 I, G: \* I2 X! U7 c6 \0 Y
{
# \* J. y9 f+ S9 e, ~& T0 [* G// 构建用于实现移动实体的矩阵/ d$ }/ {6 j+ x1 F, C: j8 D$ g
AcGeVector3d vec(ptTo[X] – ptFrom[X], ptTo[Y] – ptFrom[X], ptTo[Z] – ptFrom[Z]);' P; G: s. c8 r7 S; d2 ~* N6 @/ ]
AcGeMatrix3d mat;
9 \/ Z8 J! M' W* Z9 p) L# x: lmat.setToTranslation(vec);
1 j1 o) z4 R2 h8 x9 F# u; O/ p$ ~! A0 FAcDbEntity *pEnt = NULL;
# @, s( W- v7 O; |Acad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);- e% Q! n. l9 b5 m
if (es != Acad::eOk)( n- q0 e8 z5 b! c
return es;. r, E0 ^! d, F: q
es = pEnt->transformBy(mat);
2 B$ F# i1 f( V* D5 T9 t; bpEnt->close();
/ w7 ~0 O5 s! A: Freturn es;7 w) b- ]$ q5 }7 B6 A! a0 T' g
}

复制

BOOL Copy(AcDbObjectId entId, const AcGePoint3d ptFrom,const AcGePoint3d ptTo)" C; W, D( _4 a" T1 b
{* X* l1 p3 P; d5 T# V4 G7 p$ P
AcDbEntity *pEnt = NULL;4 ?6 o; d( E+ G3 H9 S
if (acdbOpenObject(pEnt, entId , AcDb::kForRead) != Acad::eOk)! H5 `# ~8 n. w
return FALSE;
% O5 f* |8 P: W. a5 h, RAcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());
7 a8 E1 u; ]( m) q/ X' QAcDbObjectId copyEntId;, a+ V& r0 l2 h+ \3 E7 o2 e3 q
if (pCopyEnt)% u9 Z: Q$ ]) N7 V
copyEntId = PostToModelSpace(pCopyEnt);
' t/ |" o+ S7 _8 fMove(copyEntId, ptFrom, ptTo);

return TRUE;: Q/ n8 H  c3 j  g. x
}

镜像

Acad::ErrorStatus Mirror(AcDbObjectId entId, const AcGePoint3d dp1,const AcGePoint3d dp2)6 P/ x9 M( l% n) Y8 b4 V
{
- n  o& z$ f1 M7 y1 v$ h- d8 l// 构建用于实现移动实体的矩阵) }, ]  W+ d8 e, q  o: \
AcGeMatrix3d mat;AcGeLine3d line;3 N% v4 n) M  X" }; w% q- v% B
line.set(dp1,dp2);
( ?( w5 y4 y# z7 {$ i, ^% qmat.setToMirroring(line);6 M: L' _( ?4 S) J1 w
AcDbEntity *pEnt = NULL;
3 M) X! a- U8 }9 W3 iAcad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);3 ^8 Q$ R% x. u4 I
if (es != Acad::eOk)9 d& s* W  D  [* S: V# K
return es;, }) X5 z! E  U
AcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());: ?4 e* S7 H( M  B% E
AcDbObjectId copyEntId;; l1 k' C! \  a. h0 Z
if (pCopyEnt)
# Y; N7 r+ _) E( I( x9 W9 tcopyEntId = PostToModelSpace(pCopyEnt);
: _7 e, W& \3 C! L$ [es = pEnt->transformBy(mat);3 G1 }  z" n9 h
pEnt->close();
5 H% x! F1 }% o+ i" ?" ?return es;0 }, e% c6 \1 A, h: k2 ^  o) q; I
}2 {# h! N0 k" I, Q4 X% S& E
static AcDbObjectId PostToModelSpace(AcDbEntity* pEnt)
0 K" ]% v4 C' S! H# q{
& n; k/ j# I* h( f: m. F) t! p; LAcDbBlockTable *pBlockTable;1 y- }& d. F+ b5 {5 i7 J
acdbHostApplicationServices()->workingDatabase() ->getBlockTable(pBlockTable, AcDb::kForRead);
1 t. H8 M, v! S) r' PAcDbBlockTableRecord *pBlockTableRecord;& u, n2 Q- d2 Z7 ^! g  F
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
7 L8 B; q+ x4 I7 h5 V0 C) WAcDbObjectId entId;; k9 q% [5 [5 b6 O( _
pBlockTableRecord->appendAcDbEntity(entId, pEnt);
* ~' z' Q2 b0 n- ZpBlockTable->close();
6 \. x* Z" |& }! }pBlockTableRecord->close();
; |/ e& a7 M: G! K( n5 ypEnt->close();
+ H7 i& M* E* Q7 j. W7 c( k: dreturn entId;

}

8 Q: d/ F5 J0 M" b0 a: Z
参考:http://www.colinchou.com/archives/245) P) }9 H: o, p3 s6 X& H. `! I
& h4 R) Q  e1 O) |6 c

- W  p( V" ^. g8 ~
7 z; ~7 q  k& E1 X7 F" _' j
8 @* F4 v2 S( R8 Y$ C  J) O. j% 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 )

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