QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
9天前
查看: 3972|回复: 0
收起左侧

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

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

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

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

x

AcGeMatrix3d有几种方法:

移动

Acad::ErrorStatus Move(AcDbObjectId entId, const AcGePoint3d ptFrom, const AcGePoint3d ptTo)
6 z2 L  s/ @4 ^! o$ J2 o{; c  E3 o6 O. M. p# ?
// 构建用于实现移动实体的矩阵( V9 q3 N. Z! e
AcGeVector3d vec(ptTo[X] – ptFrom[X], ptTo[Y] – ptFrom[X], ptTo[Z] – ptFrom[Z]);5 e9 C( ^8 j' h$ Q9 O6 o& E
AcGeMatrix3d mat;
& M9 Y  Z. G+ @) k: }7 Mmat.setToTranslation(vec);, B7 h' _8 D3 M' h' Y$ ]
AcDbEntity *pEnt = NULL;" S+ W: V9 {0 `; F: W; r' t7 l
Acad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);
! ~6 \8 T1 P" P+ a6 Lif (es != Acad::eOk)
8 e( X$ F, p& S, k2 greturn es;7 S0 C% p: j, B/ U; K1 P: H' t
es = pEnt->transformBy(mat);3 ?; ^0 Y1 F+ z) ]+ P* w4 b
pEnt->close();' g0 O: b$ p; z6 i
return es;7 s7 {1 @3 _+ c- K1 f
}

复制

BOOL Copy(AcDbObjectId entId, const AcGePoint3d ptFrom,const AcGePoint3d ptTo)1 b/ v9 C# W/ Z" i( h' X$ G9 S
{1 J0 ~" c0 S4 F6 \- o
AcDbEntity *pEnt = NULL;9 h- L) t# c  F( H! u
if (acdbOpenObject(pEnt, entId , AcDb::kForRead) != Acad::eOk)% }: i6 E9 p- Z4 d
return FALSE;+ i% O& O# y+ t
AcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());
2 I; \  v" C5 wAcDbObjectId copyEntId;% P* ?/ w  g/ `; M- O  F8 a
if (pCopyEnt), N  ~6 f' t; x
copyEntId = PostToModelSpace(pCopyEnt);
/ R9 z6 |9 i( [' F. DMove(copyEntId, ptFrom, ptTo);

return TRUE;& I# W( b- Q0 T9 J
}

镜像

Acad::ErrorStatus Mirror(AcDbObjectId entId, const AcGePoint3d dp1,const AcGePoint3d dp2)
4 d: d! p% e! ?{: _) ?, t. l( W  a
// 构建用于实现移动实体的矩阵% g: w- v# ~0 ~4 Q- i- J! s
AcGeMatrix3d mat;AcGeLine3d line;
* D9 x: M7 B- \& D5 m# G, K8 wline.set(dp1,dp2);
( Z" l' p; [9 T6 cmat.setToMirroring(line);, E; q" ~$ V* N
AcDbEntity *pEnt = NULL;
! L: W6 j; B# n3 {8 F  h3 H7 ?Acad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);7 C6 e7 D9 d( Z9 G; ]0 m9 V1 v! v8 n
if (es != Acad::eOk)
% P7 ^  k  m& y6 Zreturn es;! o! }. d2 W3 {0 K$ g8 C9 l; d4 {( _
AcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());* |+ O, s1 }- o
AcDbObjectId copyEntId;: R, j+ F% y! y; t; J* p8 J
if (pCopyEnt)
' C! F* G5 j0 n0 q' n4 T6 @, GcopyEntId = PostToModelSpace(pCopyEnt);$ `( p1 N7 ^3 V( B4 Z
es = pEnt->transformBy(mat);3 W6 a' q' ]- x1 C
pEnt->close();, O; e  `/ \, b% @
return es;
) t0 X5 a( Y9 m' @: f}# D! W5 }* y# K* Q, l/ u
static AcDbObjectId PostToModelSpace(AcDbEntity* pEnt)3 Z4 C# C) P! c- U) U
{: _9 _/ d6 Q% b
AcDbBlockTable *pBlockTable;
& p3 p* X9 S  _3 iacdbHostApplicationServices()->workingDatabase() ->getBlockTable(pBlockTable, AcDb::kForRead);
" ]# D, W! x! n% u& t5 T# j& \AcDbBlockTableRecord *pBlockTableRecord;
- ~, r; t, e7 n  D5 o: g4 zpBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);1 [7 F& P' Q- W. A6 m+ O9 R
AcDbObjectId entId;
# h8 w. ^3 u+ X6 [pBlockTableRecord->appendAcDbEntity(entId, pEnt);
- k8 W6 k/ X: ZpBlockTable->close();
/ m# \0 ?! k+ V. HpBlockTableRecord->close();
, R# T, L( V3 _# L* g# ?pEnt->close();- F1 K/ I4 f/ h$ F3 ]
return entId;

}

9 p) g2 `- K+ R- C) Q
参考:http://www.colinchou.com/archives/245+ b" r$ V6 K+ `9 m6 _$ m8 N* h

% b6 m+ g5 e. j3 i6 j- ?% A- u7 `% N$ s2 r6 e; W2 V
. ]/ U/ W/ H, B# F) I

3 L- O0 ~1 k6 n+ z3 m1 d/ i' H. o 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 )

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