QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x

AcGeMatrix3d有几种方法:

移动

Acad::ErrorStatus Move(AcDbObjectId entId, const AcGePoint3d ptFrom, const AcGePoint3d ptTo)' `7 u* |4 N# r% ^
{# v. k/ w+ A$ O8 X) g2 F
// 构建用于实现移动实体的矩阵9 f" d4 I. y8 l7 }- e
AcGeVector3d vec(ptTo[X] – ptFrom[X], ptTo[Y] – ptFrom[X], ptTo[Z] – ptFrom[Z]);
6 u. A- ?2 }6 x5 Y2 y% ]4 b) aAcGeMatrix3d mat;  W3 X" ]/ _) X! R; V
mat.setToTranslation(vec);6 x8 }, T: {2 Z: L8 w1 c2 y
AcDbEntity *pEnt = NULL;
; I' ^: g8 z  m" h) Y* jAcad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);/ \$ E7 D9 A3 `' I6 d5 z
if (es != Acad::eOk)
; \9 e" D) a4 K. _) v8 T& O; Mreturn es;4 c5 M' d4 n! D* a2 d8 A
es = pEnt->transformBy(mat);
/ ]" o5 a& O4 y" a, C; mpEnt->close();! X. T7 P8 ]( I* j. G- a
return es;
. `1 |0 r4 x% L( C- i2 E! g}

复制

BOOL Copy(AcDbObjectId entId, const AcGePoint3d ptFrom,const AcGePoint3d ptTo)
; P; q0 g; V' j( _7 z{
4 z! D$ v1 @4 I+ ~AcDbEntity *pEnt = NULL;. C% I7 a* F; J& Y  W; F9 _- r
if (acdbOpenObject(pEnt, entId , AcDb::kForRead) != Acad::eOk)/ V  M* ]5 s; \+ I, E( Q. S
return FALSE;
  A, P; _. A' w+ tAcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());
# V& T' I" j* W! v* M' LAcDbObjectId copyEntId;0 k# W7 F% U. r
if (pCopyEnt)& v; q( C3 U& M$ r4 e. o
copyEntId = PostToModelSpace(pCopyEnt);
2 o% a; \  C; Y& Q7 b- LMove(copyEntId, ptFrom, ptTo);

return TRUE;
* z3 |" J: m" K# r6 W}

镜像

Acad::ErrorStatus Mirror(AcDbObjectId entId, const AcGePoint3d dp1,const AcGePoint3d dp2)
8 m6 s* W6 S' _" ~# l. r{, N  J$ h5 {* E  R
// 构建用于实现移动实体的矩阵& {4 e0 ~& s: F5 g/ G2 \
AcGeMatrix3d mat;AcGeLine3d line;
! w) S3 A' ]3 ^% kline.set(dp1,dp2);
. \/ B9 a0 e. A. Lmat.setToMirroring(line);1 ]2 V/ `' a) R" `' M0 d# N, q
AcDbEntity *pEnt = NULL;# ?3 y0 T  S" a; o
Acad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);) N+ m8 E) ]6 r$ ?
if (es != Acad::eOk)* u; R$ C$ P# B* i: H% I% ?3 q2 |' C
return es;9 t  }- B1 V& A, y' |- a
AcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());# h  |8 h# ~8 z* I. r% k
AcDbObjectId copyEntId;) j3 @, I4 g3 |, k2 c
if (pCopyEnt)
9 p4 T+ B0 j+ p0 t: A8 vcopyEntId = PostToModelSpace(pCopyEnt);; c; R3 |1 e" X
es = pEnt->transformBy(mat);
1 B6 q$ L. N" F0 O+ x8 y% kpEnt->close();) ?& C+ B$ k2 @* n0 w
return es;
  z5 W, U! g7 H0 q}
3 z( L+ j' R* A5 k% ystatic AcDbObjectId PostToModelSpace(AcDbEntity* pEnt): k9 d1 X- C* v5 Z# e
{
7 I: @' ?5 s9 u4 }AcDbBlockTable *pBlockTable;
$ _& n6 z* l: l3 ^acdbHostApplicationServices()->workingDatabase() ->getBlockTable(pBlockTable, AcDb::kForRead);( g9 F4 A8 F9 W! M: a
AcDbBlockTableRecord *pBlockTableRecord;" E) g% ^" I4 ~3 p/ h% o2 K
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);* \' z* g6 X$ {
AcDbObjectId entId;
( s6 A1 r; d3 ], o. JpBlockTableRecord->appendAcDbEntity(entId, pEnt);, q+ R- b5 y4 F( w
pBlockTable->close();
5 i2 \8 ^& {/ j* A8 _0 ypBlockTableRecord->close();
0 _& r8 ~/ x# H" I2 T" E/ H4 ^% \pEnt->close();- [% V/ B1 H6 z1 T3 e
return entId;

}

2 x; ]3 T$ E; ?2 _
参考:http://www.colinchou.com/archives/245
3 X. [  O% V8 J; Q
9 z- y6 @0 T# l& S' p. q0 ^0 p* i- G# W  p

8 m! j5 l* `2 c) i& l" U; ~# k8 Y& l: u0 \
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 )

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