|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
CATIA二次开发入门教程---15 通过点击屏幕创建点! J/ {3 c! Q Z3 k- P/ |( \
通过点击屏幕,自动创建点, 这里直接建立了一个简单的对话框,通过pushbutton来添加一个回掉函数,函数里面去执行创建点的类。
Y( {, l# B4 E
# U% Y. k2 x$ K( u
9 h, l* Z$ y6 x' E6 nvoid DialogTesTCmdDialog::OnPushButtonCreatePointPushBActivateNotification(CATCommand* cmd, CATNotification* evt, CATCommandClientData data): b# U2 }; v& |, z* m* O, i
{
( a3 _2 W7 j/ d. | // Add your code here
) `& V" q; h# m, V CreatePointCmd *createPoint = new CreatePointCmd();
7 D! M4 U6 m6 V c0 [' X}
3 A5 j \( p. |4 U
$ I; \; X# \: w1 k* P0 K新建一个catia 的命令,名称为 CreatePointCmd ,接下来要做的就是在 action one 里面进行点的创建,代码如下:
4 k' E0 m1 Z( d/ h7 c' N5 L
$ a, Q! ~) R- i- ^, J. c- PCATBoolean CreatePointCmd::ActionOne( void *data )4 b/ ]% Z! E$ C+ p* W) D5 m" D' W
{2 K& O, _" P) Z6 P: ~7 E
// TODO: Define the action associated with the transition ( W" m/ L' K/ J6 R* M3 u' M
// ------------------------------------------------------4 ~+ L' K5 `4 o5 ^ `8 T0 Q* @3 {
CATMathPoint2D point2D = _Indication->GetValue();
W' A# t) X5 J+ | x CATMathPlane plane = _Indication->GetMathPlane();
2 ~; F7 k1 U' d CATMathPoint point3D;& ^2 @+ A7 r# I5 G$ p6 D; ~3 \* ^3 N
plane.EvalPoint(point2D.GetX(),point2D.GetY(),point3D);
5 x8 Y r& M8 }
6 n% { g' s: y cout<<"Point coordinates:" << point3D.GetX() << "," << point3D.GetY() << "," << point3D.GetZ()<<endl;* \0 N% X, M, ~
! l; Y# ^& P: E //设置Container(非根节点)
6 N1 _/ m! J2 @0 { //获得Editor
7 G' p) t& r, Y- s" Y CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();" B# Z5 o/ N6 n1 m( M6 N
//得到当前对象的文档" e8 _5 \. k- E4 P( R5 V/ g/ t! P8 X. Z
CATDocument * pDocument = NULL ;! g `) V3 a4 Z2 l
//取得当前活动对象
( b: a- T) _3 M2 k0 s1 g4 B! l CATPathElement activePath = pEditor->GetUIActiveObject();& b3 q- B; j7 n
//取得当前活动的product
2 M1 K% E. _$ \% @* e3 O4 S0 o CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());! @" q0 Z0 X3 M& X1 f9 r: E7 a" V
//当前活动对象不存在
7 \- G. Y1 X) f if (pActiveProduct == NULL)/ U2 j7 s3 T, u0 M5 f7 b
{1 s. L6 V5 T& _! q, k- ]
pDocument = pEditor->GetDocument();
. K/ w% R8 C) ` }
3 K L1 |7 e" Y8 ? else) n% L7 k2 h6 O' T) W
{
) Q+ v6 Z5 D4 Z3 u; I) T CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
; ~$ A7 p1 x4 s+ G5 K //当前对象的引用对象是否存在
3 U9 ~" O* D0 C if ( NULL_var == spRef )0 k, Z9 B/ ]& V. F5 X
{7 w. w, G1 b& B! u
return FALSE;
' l5 y4 M8 F/ p5 @ }9 K& R4 s8 t. Y) k5 p" c7 i" N
//当前对象的链接对象0 A7 i% H5 G! N1 _1 m$ }; d
CATILinkableObject * piLinkableObject = NULL;3 [& h" |" x9 g
HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );
1 b7 w; _& J5 R Z if ( FAILED(rc) )3 l l3 U( f, e
{. G* X; s( R$ t; J
piLinkableObject->Release();7 r; \4 s/ ~) { G: O3 D+ j) w; u
piLinkableObject = NULL ;
6 U) |4 Z S3 d8 g6 P' K3 u return FALSE;: g$ p8 J1 |5 V" {+ }; k
}
7 M* L8 R. I2 j; X7 p //得到当前对象的文档- Y# p7 }- ?9 c2 K$ n5 N' O
pDocument = piLinkableObject->GetDocument();
; F; O; A- k$ y' z* w piLinkableObject->Release();; n; {7 Y/ o0 G4 W9 Z: X
piLinkableObject = NULL ;
" G* ^0 M4 q# x8 W- l if ( NULL == pDocument)3 _, x+ W; l' I8 k. Z7 ]! ?( @; Q
{# x+ D3 U- ^5 x; G$ l- O! w
return FALSE;
/ |( M0 q* ~8 f }
% Y) z8 G) j l, g! b }
0 }. h& H9 g. @2 {/ @* x/ n //得到文档容器集- H9 c3 G% v+ i/ F: {
CATIContainerOfDocument * pIContainerOfDocument = NULL;
' _/ `0 J4 v) k7 y1 A/ E HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);
/ }) j8 S4 d, r$ ` if (FAILED(rc))
& l( \3 h) y; c; s3 Z$ q$ ~% d6 ` {8 D$ r( R: J+ n* m6 M$ F. Z- s$ t
//pIContainerOfDocument->Release();
2 G f- c; o' m pIContainerOfDocument = NULL ;2 K- ?6 t4 C( j: f! Z
return FALSE;, ^8 e9 a e- A8 f
}1 s& {* l# n, H, b, G
0 ~/ m' y2 P$ x3 M
//获得Document/ ?% C9 w6 K! Y+ K
CATIContainer* _pContainer = NULL; , D: q$ R# w: ]+ J( y$ N9 ]
//获得SpecContainer
4 z; x) V- B! P- B HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);1 s. g# O8 b- V& ?# z! R0 [, F
3 u) {, M) S/ O //GSM工厂
6 b; i. m3 X$ v- } CATIGSMFactory_var spGSMFactory = NULL_var;" L( P: ^0 p( D5 {1 o1 K5 y* e
//设置工厂
) u- g9 u) |! b spGSMFactory = _pContainer;
$ N2 |* V' Y Y# Q2 |& } CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(point3D);, F! ?+ u1 l8 w/ }- { Q( K q
CATISpecObject_var spSpecPoint= spPoint;
2 A4 K' ], |9 P8 f CATIGSMProceduralView_var spSndPntObj = spSpecPoint;- b" U) l. n/ e
) R$ ?' t/ k& V5 S
//*将点显示在屏幕上& p& E. G8 l5 y' W
spSndPntObj->InsertInProceduralView();
4 I' l3 t# d& J/ t //更新点对象
, D1 |+ O* Z- l+ Z0 x spSpecPoint->Update();- {" t- d: u' F" S8 B6 s+ W; D' d
$ o0 c( {* ^: ?! b$ U" e return TRUE;
1 n4 \3 H0 \9 q2 F0 T# e$ h! ?}
" V0 j; `/ a3 D+ }: U( a: g$ w9 U/ \! G E5 Y4 I( b' ^
. p- H9 n k( a4 E
效果如下:
- J* ^* q: S4 `2 G' {6 X) U6 K- ]' n3 s% C4 [9 R
5 c; p6 V% O5 r% I' M7 O2 f& S( M: }4 l2 G
|
|