QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
4天前
查看: 3968|回复: 0
收起左侧

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

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

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

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

x

AcGeMatrix3d有几种方法:

移动

Acad::ErrorStatus Move(AcDbObjectId entId, const AcGePoint3d ptFrom, const AcGePoint3d ptTo)
1 Y5 L1 c0 a2 b0 r$ j7 I{
5 h, x2 |2 i5 ~# P/ l8 E// 构建用于实现移动实体的矩阵" j: I& S# o4 U& r
AcGeVector3d vec(ptTo[X] – ptFrom[X], ptTo[Y] – ptFrom[X], ptTo[Z] – ptFrom[Z]);
- Q/ \6 N/ {2 _) j5 \6 X5 hAcGeMatrix3d mat;: C3 v& `3 _" {% t4 C
mat.setToTranslation(vec);* x/ D5 H% T# m2 F- A0 t  ]
AcDbEntity *pEnt = NULL;
6 Q' E; N: T/ r) I( L2 gAcad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);
$ ?$ Y" Y  @# V1 rif (es != Acad::eOk)
4 D/ p& H6 L: U7 G4 z+ N# K- z5 x; zreturn es;
- I0 ]& S; |# \3 B% U/ ues = pEnt->transformBy(mat);/ o) X( r# j' W
pEnt->close();0 }  Z( y& Y" g7 W
return es;5 V$ h# z- z0 a7 [. X
}

复制

BOOL Copy(AcDbObjectId entId, const AcGePoint3d ptFrom,const AcGePoint3d ptTo)
- t6 e; T+ M! h4 C7 a1 w: t{
- E. M& g$ G# K) m, KAcDbEntity *pEnt = NULL;
% R( D, X7 ~9 \& gif (acdbOpenObject(pEnt, entId , AcDb::kForRead) != Acad::eOk)
$ h% H! t# O! X/ T% nreturn FALSE;
6 [  Y# ^9 G1 O1 k+ c! U5 tAcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());& C' k$ e2 x0 S
AcDbObjectId copyEntId;4 D7 m8 X& z: [* B9 k
if (pCopyEnt)2 m% f! L3 B; s8 K$ O( R2 l
copyEntId = PostToModelSpace(pCopyEnt);" f. C! [8 g$ \8 [  M
Move(copyEntId, ptFrom, ptTo);

return TRUE;1 @1 h; {' B9 n! ^: p; w. G$ H" f
}

镜像

Acad::ErrorStatus Mirror(AcDbObjectId entId, const AcGePoint3d dp1,const AcGePoint3d dp2)
: k+ p" j' r" _8 L{+ Y7 i- e( O" o  v2 v
// 构建用于实现移动实体的矩阵
- y# v) K0 M# o1 Z( pAcGeMatrix3d mat;AcGeLine3d line;
* V7 b, X3 q& |/ B/ E2 j9 h6 E! ]line.set(dp1,dp2);& k0 ^& K3 D5 g/ n3 m
mat.setToMirroring(line);2 H+ }2 H/ U; V1 T/ U* k  F
AcDbEntity *pEnt = NULL;
% f! T8 y. g4 VAcad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);% t8 X$ z0 m" v8 B: G7 n
if (es != Acad::eOk)
! N; W$ ~7 r3 F, ~* {! Oreturn es;; q2 b  e) \: J7 X' @' y* p
AcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());9 S9 S9 O4 q! o2 L0 m* `! Y
AcDbObjectId copyEntId;
% s# x: X% a" g; y. L  h7 Iif (pCopyEnt). D: z) S: ]: ~; {
copyEntId = PostToModelSpace(pCopyEnt);7 Y7 g! {5 A! L/ a5 l7 k* y
es = pEnt->transformBy(mat);
4 ~* S- D, r. v2 V4 R6 npEnt->close();
& f* n) z! X" x& ], q( V+ g. N8 ureturn es;# a2 O  |% `3 h: a' |
}' _. v- L: C( P
static AcDbObjectId PostToModelSpace(AcDbEntity* pEnt)! W7 e" l9 W; O; Y. r
{5 p) Y) O6 o0 Q
AcDbBlockTable *pBlockTable;
5 I) w$ w0 P( p* F+ C1 MacdbHostApplicationServices()->workingDatabase() ->getBlockTable(pBlockTable, AcDb::kForRead);& ?+ v  F7 Q1 n: A
AcDbBlockTableRecord *pBlockTableRecord;
2 I+ F( e( t+ _; c: s5 F1 [pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);2 D! t" O3 v% j
AcDbObjectId entId;4 m3 @$ Q+ h. u5 r4 @+ H( D# X5 M
pBlockTableRecord->appendAcDbEntity(entId, pEnt);' C# _# r) ~' e1 S
pBlockTable->close();- o+ }6 ^) v  U! H. f+ r" r& x
pBlockTableRecord->close();
, Z4 o. i: h$ C/ KpEnt->close();
6 I: B4 Y4 p  |3 J' [" Greturn entId;

}

6 c% a2 X2 Y% a  I0 C( a+ B8 s0 g& u
参考:http://www.colinchou.com/archives/245& t% R3 y* k6 O- [3 e0 W( R
0 ~# o- K: f' J& u; e
2 S  t. @3 a& L9 N; j% N

* f7 k' e$ p( b  |; {4 P) a( u3 E. j0 H1 t2 \9 n, D
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 )

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