QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 4069|回复: 0
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
1#
发表于 2013-12-10 16:58:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式 来自: 中国江苏南京

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

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

x

AcGeMatrix3d有几种方法:

移动

Acad::ErrorStatus Move(AcDbObjectId entId, const AcGePoint3d ptFrom, const AcGePoint3d ptTo)
4 V* b& \7 ~# ^4 h{
" |8 T0 L& ?9 l$ y" E6 G// 构建用于实现移动实体的矩阵2 K7 B" X& l5 t/ e+ d( [! I7 ?
AcGeVector3d vec(ptTo[X] – ptFrom[X], ptTo[Y] – ptFrom[X], ptTo[Z] – ptFrom[Z]);
- T/ P/ M0 A' t6 O. H; g( xAcGeMatrix3d mat;& ~% B$ p8 g4 Z
mat.setToTranslation(vec);* O9 B7 w/ I' s2 L' h
AcDbEntity *pEnt = NULL;
7 u$ A% u) a4 h: \) K" KAcad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);, d- r, i* e& k
if (es != Acad::eOk)( f9 h+ o2 k9 ]9 A
return es;
4 r9 y. r! E: C, S" w, b, ces = pEnt->transformBy(mat);
- ^8 m9 s! x6 a6 E& DpEnt->close();: I( d5 [* u2 K8 c
return es;, C2 K" M2 c& i6 P" }
}

复制

BOOL Copy(AcDbObjectId entId, const AcGePoint3d ptFrom,const AcGePoint3d ptTo)
1 o' s% a% v. a7 `6 N{, f, b6 z/ B* Z5 _
AcDbEntity *pEnt = NULL;- V5 W) Y( ~2 X! X9 t( }" S
if (acdbOpenObject(pEnt, entId , AcDb::kForRead) != Acad::eOk)
5 B& D2 ]1 M' creturn FALSE;* Z3 q, [, s7 G3 ]& R( ^
AcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());
2 c. O# H3 y3 T( `4 `AcDbObjectId copyEntId;6 f0 n/ d9 x( b2 D% h
if (pCopyEnt)
' I  C1 H  a# e2 h% G- BcopyEntId = PostToModelSpace(pCopyEnt);" [4 X& O/ g. Y+ n3 x7 [5 A
Move(copyEntId, ptFrom, ptTo);

return TRUE;
( @" Q5 I1 S  X+ e}

镜像

Acad::ErrorStatus Mirror(AcDbObjectId entId, const AcGePoint3d dp1,const AcGePoint3d dp2)
) w' o3 B" e, F4 u) M{% @: M& |, ~9 T. ^" @: ~% Y, [
// 构建用于实现移动实体的矩阵
8 H: t6 y: C. Q& {9 B& \; l. i* aAcGeMatrix3d mat;AcGeLine3d line;3 V# D% z+ s* i- I' A. G. D* V
line.set(dp1,dp2);
( g; l; V0 L- y  z1 G8 hmat.setToMirroring(line);
3 f# h; E/ g% }9 i- f7 FAcDbEntity *pEnt = NULL;+ b5 l: {* f6 r1 W
Acad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);% A$ j4 {: t3 f7 y8 E$ d
if (es != Acad::eOk)
1 n& B+ S3 a0 Q8 x' creturn es;7 \  K0 L1 B* f
AcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());
3 e, `% ?1 y, n3 R/ a) x$ mAcDbObjectId copyEntId;
1 a6 F) Z( A- S& C# ^if (pCopyEnt)
, Y% B% u* t) XcopyEntId = PostToModelSpace(pCopyEnt);( x7 q$ V1 t( @, d! }8 A/ T
es = pEnt->transformBy(mat);1 e3 M' i# ?, ^. _/ ~5 C1 X7 t% S
pEnt->close();
& O4 @5 v; e1 j# Y9 ^: C! Ereturn es;
2 \$ |; o: N/ A% N}
. H* q6 f5 U& e4 h/ c! `0 Zstatic AcDbObjectId PostToModelSpace(AcDbEntity* pEnt)
! ~+ B7 `) x. _5 U; U( z{
" H# n/ u' s! y" z5 T4 wAcDbBlockTable *pBlockTable;; k. J2 {* I- X% T' w$ _6 }
acdbHostApplicationServices()->workingDatabase() ->getBlockTable(pBlockTable, AcDb::kForRead);  g8 ^% f: g( X. b) |
AcDbBlockTableRecord *pBlockTableRecord;$ A* y- o2 g4 b/ R
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
; t1 e1 t. ~# H- o6 {( PAcDbObjectId entId;) \& L  p- c4 D2 j# U: ^
pBlockTableRecord->appendAcDbEntity(entId, pEnt);
; @! @: c9 r, A$ UpBlockTable->close();
' v: f; O3 Q9 y9 DpBlockTableRecord->close();' {5 Q1 a. ?; K9 b# E% h0 N- `
pEnt->close();
$ k' \& V! v# G/ ^$ m- hreturn entId;

}

$ I# K- Q& t% _" ~2 W: O, r
参考:http://www.colinchou.com/archives/2454 d* q8 P* B5 y
* x0 h. i9 l4 @

0 d4 B% X9 A( T* ^3 G2 ~, Y6 `& V2 T4 L/ C1 }! E8 V

: }% i% J$ C' b- {/ I8 p 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 )

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