QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
goto3d 说: 版主微信号:caivin811031;还未入三维微信群的小伙伴,速度加
2022-07-04
全站
goto3d 说: 此次SW竞赛获奖名单公布如下,抱歉晚了,版主最近太忙:一等奖:塔山817;二等奖:a9041、飞鱼;三等奖:wx_dfA5IKla、xwj960414、bzlgl、hklecon;请以上各位和版主联系,领取奖金!!!
2022-03-11
查看: 3644|回复: 0
收起左侧

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

[复制链接]
发表于 2013-12-10 16:58:30 | 显示全部楼层 |阅读模式

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

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

x

AcGeMatrix3d有几种方法:

移动

Acad::ErrorStatus Move(AcDbObjectId entId, const AcGePoint3d ptFrom, const AcGePoint3d ptTo)
5 y9 [# N2 U- i: B8 [' [{
0 j: |" m' r% F% [- V) e! S" |// 构建用于实现移动实体的矩阵& \0 V1 Z1 ]- O# x% \
AcGeVector3d vec(ptTo[X] – ptFrom[X], ptTo[Y] – ptFrom[X], ptTo[Z] – ptFrom[Z]);5 L$ s; d5 f8 p# t/ C) h  D
AcGeMatrix3d mat;0 ?: x7 }  H9 O7 j: _2 h: N# u
mat.setToTranslation(vec);2 T/ ^1 ]( g$ d6 I
AcDbEntity *pEnt = NULL;& k& [% z2 @) `) X' f6 f; \6 X
Acad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);3 y$ G5 D' K! Q" u. s
if (es != Acad::eOk)2 g" K/ M- d4 @: J$ C
return es;
/ q- a3 r" @8 n6 C% v1 _es = pEnt->transformBy(mat);
) U8 S# ^$ z, G* D* J, J. wpEnt->close();
3 j' Y8 e4 [* t' j) O+ Creturn es;
/ \$ i6 v7 @: W2 g/ e. K}

复制

BOOL Copy(AcDbObjectId entId, const AcGePoint3d ptFrom,const AcGePoint3d ptTo)
: R2 q, D: E" T8 y6 ~0 u  j{
/ ?* ]% {8 ~8 |: dAcDbEntity *pEnt = NULL;
1 m! X/ [" Y6 P4 Jif (acdbOpenObject(pEnt, entId , AcDb::kForRead) != Acad::eOk). ?1 g# M5 R* a! m# E) V# H* [
return FALSE;, h  [/ x4 }. K7 @3 v  ^- ]. s
AcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());  f7 I( n* V7 j" K/ C% R+ b
AcDbObjectId copyEntId;
' u( v+ M7 q7 uif (pCopyEnt)
: a0 K* k" m3 ^) scopyEntId = PostToModelSpace(pCopyEnt);
& R8 y, P2 w, R, N% sMove(copyEntId, ptFrom, ptTo);

return TRUE;; C& Q0 q! a+ q3 {) B% E  v) V
}

镜像

Acad::ErrorStatus Mirror(AcDbObjectId entId, const AcGePoint3d dp1,const AcGePoint3d dp2)6 ~& G2 R/ w. a
{
3 \+ P3 W, ^5 Z1 W& P7 Z' m// 构建用于实现移动实体的矩阵! e/ u6 S# w+ p* ]9 J- t7 |- N: p" Y
AcGeMatrix3d mat;AcGeLine3d line;2 a2 A% ]' G/ h; v' C; ?. J2 ]" W
line.set(dp1,dp2);: X# n) b; a, ?5 `9 S& l
mat.setToMirroring(line);
' Q8 m5 T! O- X' d: }. rAcDbEntity *pEnt = NULL;8 y4 s, Q1 |+ y
Acad::ErrorStatus es = acdbOpenObject(pEnt, entId,AcDb::kForWrite);; A. M1 w. H# u$ d4 r
if (es != Acad::eOk)
% T7 d* x; w' o. _( I4 M* ^return es;
" I3 X2 m! u& LAcDbEntity *pCopyEnt = AcDbEntity::cast(pEnt->clone());1 d+ k7 t$ ^" \+ ~6 T
AcDbObjectId copyEntId;  \8 T, e) e! b
if (pCopyEnt)
6 g* U) |1 [8 N1 G9 K7 zcopyEntId = PostToModelSpace(pCopyEnt);& I/ U  ^9 ?$ [# W
es = pEnt->transformBy(mat);4 P  P% [+ a5 w0 M! ^
pEnt->close();
! `' D6 \5 ^" r( M: \2 lreturn es;! {1 a0 j$ N' g
}! g) o: E& H; w7 s3 H
static AcDbObjectId PostToModelSpace(AcDbEntity* pEnt)
& u8 f5 T) u6 x% u6 y{
9 v( w, j5 \' X- b( v5 iAcDbBlockTable *pBlockTable;) a  l5 a5 u9 F% z# w1 F& V% C! B2 D0 Q
acdbHostApplicationServices()->workingDatabase() ->getBlockTable(pBlockTable, AcDb::kForRead);% `" s5 d8 `: i+ w! ^
AcDbBlockTableRecord *pBlockTableRecord;
1 k9 z4 ?2 k, ~% S: [4 w. HpBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
5 d3 j5 l& q% S9 Y# v6 U8 l" TAcDbObjectId entId;
" ]6 C4 [$ H/ f8 D6 @$ rpBlockTableRecord->appendAcDbEntity(entId, pEnt);
5 g1 G( V# _1 M; \pBlockTable->close();
5 r. f7 H& e$ rpBlockTableRecord->close();
  E; R+ z# V3 ?9 w8 I6 @. hpEnt->close();
' D4 w2 m7 x' W3 jreturn entId;

}

0 G; A6 z$ N$ x4 @) [
参考:http://www.colinchou.com/archives/245
& Q$ d- `  V4 Y( B% V, m; o0 i/ w( h/ }+ c. d

0 t8 V. d1 v8 T8 T. h! S& e: c' a! U

, s4 ~, M# Y2 F3 T6 z 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备13008828号-1 )

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