|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
CATIA二次开发入门教程---15 通过点击屏幕创建点6 L5 Q) J" Y O7 A. T
通过点击屏幕,自动创建点, 这里直接建立了一个简单的对话框,通过pushbutton来添加一个回掉函数,函数里面去执行创建点的类。1 E" b. D# }% C J2 N
; l, I/ t' x9 o5 I! g
5 z- S- I7 W5 j4 C6 s a0 Q
void DialogTesTCmdDialog::OnPushButtonCreatePointPushBActivateNotification(CATCommand* cmd, CATNotification* evt, CATCommandClientData data)8 ~$ u. T3 l$ \2 S) e/ r
{% S! {" v, f \. k. ~( M2 r0 I
// Add your code here
! |5 I3 N8 k- e$ A CreatePointCmd *createPoint = new CreatePointCmd();0 K9 v% t X- j' w
}
: H2 q- [- {0 L3 b( j# a6 l% |) n' t( y* f4 M- u" |( s
新建一个catia 的命令,名称为 CreatePointCmd ,接下来要做的就是在 action one 里面进行点的创建,代码如下:
- v2 U5 h$ e& V% M: U( K' d: n3 e& W. ^3 U% F
CATBoolean CreatePointCmd::ActionOne( void *data )5 X, T$ ]: @# ^3 P- [
{- A- O1 Y2 B% W$ n, O6 }
// TODO: Define the action associated with the transition 3 p& m0 [8 t2 T/ E! _: d4 Z+ K! v% n
// ------------------------------------------------------* t" B& }/ I2 z) R9 w
CATMathPoint2D point2D = _Indication->GetValue();
- N2 a4 T2 d- P8 `, R CATMathPlane plane = _Indication->GetMathPlane();
@: V/ A; r* J! g CATMathPoint point3D;1 c9 @) p6 Z- D8 J
plane.EvalPoint(point2D.GetX(),point2D.GetY(),point3D); X$ ]9 a5 r4 ]4 Z
' y& g) U% R% V) x3 U8 [2 h cout<<"Point coordinates:" << point3D.GetX() << "," << point3D.GetY() << "," << point3D.GetZ()<<endl;
* z. Q0 a' C% \ ) J3 \* ]5 O+ C2 `4 {
//设置Container(非根节点)7 @3 b! k l4 q1 n( N
//获得Editor0 X9 r9 w0 F0 W3 k+ f Q' r; b
CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
: B( o m3 A$ _# m" B2 {" l1 g% V //得到当前对象的文档$ i8 X% H1 u* p& g, j6 I) U# N
CATDocument * pDocument = NULL ;
& h: E. r/ F( g+ n2 v% ?6 Z# X8 ~+ C% m //取得当前活动对象2 x) t% v9 E, W' h9 ?" ~
CATPathElement activePath = pEditor->GetUIActiveObject();1 @7 k. r9 @" g p
//取得当前活动的product
7 b$ J( B6 I( r$ a: h: ~% F CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());5 Y; U+ c2 y0 [3 I1 u# g' C
//当前活动对象不存在
* n3 c* l/ o) F if (pActiveProduct == NULL)
+ @6 l$ i7 ?! h' B {
4 {1 b, K+ t g( C. M& z3 O pDocument = pEditor->GetDocument();
z0 K& q3 o# ^5 P6 k$ M2 g }6 c' O$ l" i2 N( L3 t' A
else
2 D/ z3 f0 W9 r% U" Z2 }5 U" ]- Q {
. B' v- _. O3 z2 o9 ^ CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
4 h" I9 G/ H9 R7 w# H. e //当前对象的引用对象是否存在5 l. A( H4 k! o. A- c! ~
if ( NULL_var == spRef )
: @3 b ]- ]' a( C {
" G# {% [3 y' Z8 F return FALSE;3 C: ?5 E* o" U) z5 [3 z
}
) r* L2 v) o6 b0 h0 i k8 f/ S //当前对象的链接对象) E9 ]3 H7 ~4 S
CATILinkableObject * piLinkableObject = NULL;, C. Q+ L- s# R- P+ G; |6 P1 Z2 H, Z
HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject ); ( o5 o8 I7 r" \2 V: f4 x# \2 P* F
if ( FAILED(rc) )
8 ~9 f+ C2 i% x, U4 A4 U: q {
' ~* C2 J% N$ H" Q5 s, |1 u/ } piLinkableObject->Release();
4 _2 q; D4 _1 \! x1 o8 w8 S piLinkableObject = NULL ;
7 \1 e0 S+ q' O2 [" L return FALSE;" l# u9 Q" b, E& @
}9 N' _: Y# v1 t$ m* a* R
//得到当前对象的文档) o- M: N+ a: e4 W- N$ Z
pDocument = piLinkableObject->GetDocument();5 k: g- `, ~& p" `
piLinkableObject->Release();
& e2 \3 I* m5 G' Y( X1 h$ X piLinkableObject = NULL ;
1 N; s( h" L2 ]* Z! f) w$ | if ( NULL == pDocument)
" g, F8 f! u, }8 o/ a {
, D, f) N/ L; M- {" k return FALSE;
" r4 m+ _& {2 L }" r# [- E; @$ O& |- L
}
, v3 u* E1 i: D& _' l6 X% Z4 R //得到文档容器集0 K6 p( E# R" a6 Z* ^. u) p
CATIContainerOfDocument * pIContainerOfDocument = NULL;. ?$ _& I3 \* [- d4 C" Q4 T
HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);- x1 Q n8 R% f
if (FAILED(rc))- l+ c6 i. {+ @4 v
{
+ r& x* W) Q2 O: T4 x1 C- k4 _ //pIContainerOfDocument->Release();$ ]9 } Q- j% {! k
pIContainerOfDocument = NULL ;6 O/ i$ V& x7 |, p
return FALSE;
& g2 }8 |& s$ M# @7 t5 |: q) Y$ I }4 o2 G1 H! f3 A- G. r$ ~
& ^% ?, ~/ @ P6 a$ m2 ?1 c //获得Document0 [% w N1 L" V# Z- E s
CATIContainer* _pContainer = NULL; 7 b4 g9 }8 r5 w2 t3 b/ ~
//获得SpecContainer f9 N( e; c- \8 Q7 v' h
HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);" H- ?% A) l/ Q8 D# h
u/ W: ^* v% y' Y, m- Y$ z
//GSM工厂. ^$ H, k4 g% J! r' }$ J5 A6 ]
CATIGSMFactory_var spGSMFactory = NULL_var;
5 E' I: n: P, M3 c& n$ }$ n //设置工厂
% X3 M6 L3 X# \) [4 t: H spGSMFactory = _pContainer;
. y- ^, [5 Q6 e6 S- I( ] CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(point3D);
! I6 A! f. a. m; j- W6 U CATISpecObject_var spSpecPoint= spPoint;
7 ^$ @$ N- M$ B4 U# E, j CATIGSMProceduralView_var spSndPntObj = spSpecPoint;
/ D5 p# Z8 g) V9 w6 Q' j* G# E2 u8 }# P
//*将点显示在屏幕上
5 L: E% e4 c+ R( t7 u V spSndPntObj->InsertInProceduralView();
8 u0 @+ o: m/ P! T5 _ //更新点对象
: @& J" E1 T) ? u5 L; ` spSpecPoint->Update();5 F* m* m) ]* n" k- S
V/ N" B1 k- C
return TRUE;
, R& p+ h& c Q0 D' q) u* T}
* [# ~* b9 E+ M, X! F7 `0 _$ l
7 ]' j& o2 }9 e0 u7 E
* E% O; f8 i% ~效果如下:/ h; A: B" B7 [& G* X
7 M& G x J+ C' P% M+ W; U
( d" q4 j0 q" A8 P3 S
) y3 Q. r6 B! ~. V |
|