QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
7天前
查看: 4034|回复: 0
收起左侧

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

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

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

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

x

AcGeMatrix3d有几种方法:

移动

Acad::ErrorStatus Move(AcDbObjectId entId, const AcGePoint3d ptFrom, const AcGePoint3d ptTo)
0 ]7 W  \+ k% j8 i# M' B8 O{& n! P) X3 {' q4 [1 K
// 构建用于实现移动实体的矩阵! O- a- ~* e. K' G* [
AcGeVector3d vec(ptTo[X] – ptFrom[X], ptTo[Y] – ptFrom[X], ptTo[Z] – ptFrom[Z]);- Q9 m1 l+ r3 M6 w+ V8 m( X
AcGeMatrix3d mat;
& N/ R& P( o- U  ~mat.setToTranslation(vec);9 P1 W1 D7 h- ^
AcDbEntity *pEnt = NULL;# g* x8 ^; v! g6 q; M
Acad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);9 G5 p- f2 Q4 S3 d5 u" L3 a) s
if (es != Acad::eOk)6 p5 E# b- f3 J
return es;8 I! Q% K- i0 X
es = pEnt->transformBy(mat);7 H1 `# G" L" f9 `$ U# O0 K- q
pEnt->close();, Y0 K) w; k0 K" g% L. O/ `
return es;, }0 b$ U/ [7 {% e/ {7 z0 Q8 j
}

复制

BOOL Copy(AcDbObjectId entId, const AcGePoint3d ptFrom,const AcGePoint3d ptTo)
  N$ V+ r. y% g  ?7 x- Y/ K{3 m# ]: {( o, w1 F& b# m
AcDbEntity *pEnt = NULL;
2 L( y' l+ Z0 e+ E# p/ x+ {' }if (acdbOpenObject(pEnt, entId , AcDb::kForRead) != Acad::eOk)
+ W+ t" l- }) k0 areturn FALSE;
8 i$ J: c, {# i5 T) h0 EAcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());4 w5 ?3 y6 r& W0 [- S5 Q
AcDbObjectId copyEntId;
6 V8 V; v: m) @; Kif (pCopyEnt)+ T8 Q+ r7 z/ c
copyEntId = PostToModelSpace(pCopyEnt);
% S" e3 q- K( h+ a1 y5 Z! pMove(copyEntId, ptFrom, ptTo);

return TRUE;7 _. a& w6 ~5 N* f4 L4 W4 }
}

镜像

Acad::ErrorStatus Mirror(AcDbObjectId entId, const AcGePoint3d dp1,const AcGePoint3d dp2)
. M. t5 c# g2 X$ j8 Y# ?0 t{
( L3 ~3 Y5 m$ T// 构建用于实现移动实体的矩阵
" T7 E5 S/ \  R& g+ F  u( rAcGeMatrix3d mat;AcGeLine3d line;& N8 b. ?5 k  U1 G3 i+ Z- V
line.set(dp1,dp2);2 N  H. y8 v+ k9 r8 S
mat.setToMirroring(line);
4 X0 x& j3 t0 ?9 L+ s8 o/ |AcDbEntity *pEnt = NULL;
5 w; U; x' K! L% iAcad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);
6 S4 w) Z7 R! x) u: g- Fif (es != Acad::eOk)
# N+ F! o& o! i# P  n0 j2 F# L( Oreturn es;
4 u4 A% y2 M5 ^2 d  NAcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());  \8 K" i- _% t7 z
AcDbObjectId copyEntId;
* ^  M# W: `+ x. d% ]1 e8 }if (pCopyEnt)  @! w& P. Y- N/ H* P" M5 K
copyEntId = PostToModelSpace(pCopyEnt);
+ Y' s& U5 d* ?. z1 \es = pEnt->transformBy(mat);
# _) o. H5 u3 G5 b! JpEnt->close();
5 L/ a4 l- z0 B) Q0 r" u. @, V/ Z5 qreturn es;8 [8 z7 w* e/ `' s
}& i, w, U/ `- Q& N
static AcDbObjectId PostToModelSpace(AcDbEntity* pEnt)6 c0 f) P7 S' R4 ~# y
{6 M5 T( K& }, }6 b5 i
AcDbBlockTable *pBlockTable;; U( g) g4 ~* j
acdbHostApplicationServices()->workingDatabase() ->getBlockTable(pBlockTable, AcDb::kForRead);  e( a  ?4 P7 b
AcDbBlockTableRecord *pBlockTableRecord;) J9 s9 w8 X' K6 s6 Y1 U3 y" Y1 h
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
" Q( M3 u  k1 X% `' p9 Y/ KAcDbObjectId entId;
% C8 d6 T( T* q# H$ w6 PpBlockTableRecord->appendAcDbEntity(entId, pEnt);6 Y7 U) M0 I8 }; z& J5 }
pBlockTable->close();, B9 h( }5 ]/ E. V7 R7 n
pBlockTableRecord->close();) e1 s- T. R. n
pEnt->close();! o! P3 k% Y/ D4 ]4 l  q
return entId;

}


/ B3 B! z" B, G: E0 X参考:http://www.colinchou.com/archives/245
0 a' z7 Z% b" \- s+ }+ Q* y
+ K( J* z4 g$ R3 C/ f6 K2 w6 h/ D4 \- E- N5 j

  e( E7 N% ]% r8 n  `" R
$ F/ `( P& v) g 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 )

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