三维网

标题: 【ARX 一步一步开发CAD】04-复制、移动、镜像函数 [打印本页]

作者: colinzhoucn    时间: 2013-12-10 16:58
标题: 【ARX 一步一步开发CAD】04-复制、移动、镜像函数

AcGeMatrix3d有几种方法:

移动

Acad::ErrorStatus Move(AcDbObjectId entId, const AcGePoint3d ptFrom, const AcGePoint3d ptTo)
& l1 ?/ V2 S" a$ b/ G. M' u6 |! s{$ c2 z  g( h' B+ n
// 构建用于实现移动实体的矩阵
& y2 z/ L' q( n1 o( JAcGeVector3d vec(ptTo[X] – ptFrom[X], ptTo[Y] – ptFrom[X], ptTo[Z] – ptFrom[Z]);  t2 }  b+ q5 Z& m2 ~/ F  K
AcGeMatrix3d mat;
" q  N. e% R$ q, {6 o5 w* T: Z4 vmat.setToTranslation(vec);
# u$ v4 k7 \( zAcDbEntity *pEnt = NULL;, @' n+ g6 J  I* l% u$ [
Acad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);
2 E/ @0 m+ B; \( T% c2 @  K; j1 tif (es != Acad::eOk); [1 }0 I0 X" M% o2 P
return es;( m2 _' e% Y$ h9 c% A
es = pEnt->transformBy(mat);
+ L0 I* N% w4 X. p4 D1 ^! V8 npEnt->close();
/ {( ^+ f7 F+ l" \. C- Vreturn es;
6 l, o0 y. s  a}

复制

BOOL Copy(AcDbObjectId entId, const AcGePoint3d ptFrom,const AcGePoint3d ptTo)
& I8 _$ k+ u$ X' f/ \' z{
! s8 Z# N# [8 YAcDbEntity *pEnt = NULL;( p& y; }6 _/ I/ z- n+ x: l
if (acdbOpenObject(pEnt, entId , AcDb::kForRead) != Acad::eOk)
" T! F/ t' T* o$ p+ b, preturn FALSE;0 s1 {. u  h3 [' c; A
AcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());
# r% ^' |) W$ _6 vAcDbObjectId copyEntId;! \; `! r$ D' g$ D9 g
if (pCopyEnt)" [  s4 X$ \: D: A. `; f
copyEntId = PostToModelSpace(pCopyEnt);% J2 H6 R; J) _( U: f  f/ g
Move(copyEntId, ptFrom, ptTo);

return TRUE;2 ^0 |' w. G. _, C) r+ }6 h: h) a6 P5 K
}

镜像

Acad::ErrorStatus Mirror(AcDbObjectId entId, const AcGePoint3d dp1,const AcGePoint3d dp2)
/ {6 z! M6 w/ `3 J3 X{
, S$ Y6 O, V8 N1 ?0 r# T0 I; O// 构建用于实现移动实体的矩阵$ y" w  L) r/ p( n9 j
AcGeMatrix3d mat;AcGeLine3d line;
' V7 D6 E- p! Z- B0 w! Aline.set(dp1,dp2);' n( o- Z( H2 Z" V% m1 D) O8 n
mat.setToMirroring(line);
2 U* Z, ~' D3 N7 aAcDbEntity *pEnt = NULL;3 |9 n0 _3 E& A- i, p
Acad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);
2 M) F; v) f5 fif (es != Acad::eOk)  F% F. g" i8 S4 e' [! V% J
return es;
* G& f& c7 X8 ?) J* T' f! hAcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());1 W+ j  y7 y2 J, s8 T1 C
AcDbObjectId copyEntId;
$ u, Q0 m* `% uif (pCopyEnt); [  j( W3 K& Q1 U# i
copyEntId = PostToModelSpace(pCopyEnt);
  j6 ^6 j: _6 {' C0 u' l! ^$ ^es = pEnt->transformBy(mat);
, y7 L7 a  S, g  U- `/ v+ `pEnt->close();
# d7 b  c3 H# F0 [/ L5 breturn es;
" y( V: ]: L1 ?- e5 m( K4 y}- Q# n5 @+ L" S, n( j+ X6 [
static AcDbObjectId PostToModelSpace(AcDbEntity* pEnt)
6 O0 w0 `) R: G& R5 c{1 P% q1 Y/ X$ J# w9 F
AcDbBlockTable *pBlockTable;& G% S! P7 D( e6 X4 [& p5 a
acdbHostApplicationServices()->workingDatabase() ->getBlockTable(pBlockTable, AcDb::kForRead);7 H: X- C% l3 O1 f: k! v
AcDbBlockTableRecord *pBlockTableRecord;
/ {5 g$ F4 R3 R! V) ?! QpBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
+ W# {+ {3 [1 p/ B1 N8 q+ WAcDbObjectId entId;
9 q) c) S8 B& F/ a0 H, hpBlockTableRecord->appendAcDbEntity(entId, pEnt);
$ J7 b+ d7 r# _3 l7 O9 R* y6 v. UpBlockTable->close();
! m/ K( t$ u2 T4 o$ f% \( Z) rpBlockTableRecord->close();# n' i8 ~6 P, l1 V+ x
pEnt->close();3 ]! X4 e+ u5 _
return entId;

}


6 N, a% W) R3 |* U参考:http://www.colinchou.com/archives/245
# C6 d4 c* y+ L5 u  b! e. i3 `

* E5 i$ ^- f4 u8 P4 |; w( J1 ~, u9 W: n* f- I
: n/ ^2 i" C; Q# }
http://www.3dportal.cn/discuz/source/plugin/sina_xweibo_x3/xwb/images/bgimg/icon_logo.png 该贴已经同步到 colinzhoucn的微博




欢迎光临 三维网 (https://www.3dportal.cn/discuz/) Powered by Discuz! X3.4