|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
CATIA二次开发入门教程---15 通过点击屏幕创建点
) J( `& e; g6 U& u# X& W! K通过点击屏幕,自动创建点, 这里直接建立了一个简单的对话框,通过pushbutton来添加一个回掉函数,函数里面去执行创建点的类。! |3 \5 u, ]3 T2 M, @% z, o3 B2 l( W
- i. H2 ~0 t3 H) b1 }
. i- h9 Q7 {* V! ?7 R" ivoid DialogTesTCmdDialog::OnPushButtonCreatePointPushBActivateNotification(CATCommand* cmd, CATNotification* evt, CATCommandClientData data)1 r% P! t7 y) X% y2 } M" ^6 N0 n) I1 U
{
1 C& A% z5 Q: M9 @$ e7 t // Add your code here5 K- o6 N$ E$ C j! h
CreatePointCmd *createPoint = new CreatePointCmd();1 L( q; X/ K: {0 |; T! d) w
}
& |" u: |' x+ r. Z
1 T$ K8 l/ [, W4 K0 k9 {$ W9 `新建一个catia 的命令,名称为 CreatePointCmd ,接下来要做的就是在 action one 里面进行点的创建,代码如下:; w9 P! E1 P! d4 S
* j: y6 A8 Y) t- a% H
CATBoolean CreatePointCmd::ActionOne( void *data )
# n5 `: P. a0 x. R{
9 Z" K. c! q' M0 x( H+ A. A" P; z // TODO: Define the action associated with the transition " @1 H' ]( [2 d F4 {
// ------------------------------------------------------
! }6 Y) s" O; L2 k CATMathPoint2D point2D = _Indication->GetValue();' k. a# L( ~7 O1 y% b
CATMathPlane plane = _Indication->GetMathPlane();# J5 ]- B1 E* n
CATMathPoint point3D;
' m1 F) \3 `! t3 i plane.EvalPoint(point2D.GetX(),point2D.GetY(),point3D);6 K9 Z2 X2 h; E# E. X! k, L( g" C
1 X- d5 g7 S0 m: O cout<<"Point coordinates:" << point3D.GetX() << "," << point3D.GetY() << "," << point3D.GetZ()<<endl;
G L8 d/ d& l/ d5 a
" K. q2 D% i, p# S9 _, o1 D6 }& j //设置Container(非根节点)6 L0 g% o) f9 ~; Z: v" e% K
//获得Editor1 o* ?5 ^8 i5 }- J& s, w# {1 ^2 i$ x
CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
# l( s+ {( @: [; M2 Y* B0 @6 S //得到当前对象的文档+ z6 K' d5 g1 N# j
CATDocument * pDocument = NULL ;
% {' z/ l `7 I& I k$ D2 h //取得当前活动对象* t7 w, f$ O% }
CATPathElement activePath = pEditor->GetUIActiveObject();3 n- b% V. u( ~6 @, v9 t+ F! q
//取得当前活动的product
' y0 F: i; y% s CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());
, p. h- y( U5 }; K# f //当前活动对象不存在& W( s* m# E. A1 L/ s# X* L
if (pActiveProduct == NULL)
) g* V; q8 L" g7 Q {
- _% m/ ^! W2 Y6 g pDocument = pEditor->GetDocument();
" X H/ z8 F3 M' k* o, p _, a }6 `) O2 p6 Z' a9 n" ]
else
: P( ~* _2 s3 f; X, I3 }. v: P0 S {
3 v1 d! B6 l( x1 i# @& R* [ CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
; E t- `! o) b& f //当前对象的引用对象是否存在
+ E" Z% k& t( P4 s9 ?/ `8 X if ( NULL_var == spRef )! o- W8 C6 T; h7 [5 x
{9 i& r+ Z. v+ ]5 v: s9 N
return FALSE;
& m- o2 k j) A }, Q0 `7 l/ [7 K5 c( j6 \
//当前对象的链接对象
2 z( d2 q# v" z/ `) \. [5 X) q CATILinkableObject * piLinkableObject = NULL;
& X8 R4 g+ |4 f7 p4 B0 ]( _ HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject ); 9 }% j) h# H; ]! Y
if ( FAILED(rc) )
9 G. N1 g# a; F: y( @9 e ^; _ {. T# w$ \ d' e' |* P# j3 z
piLinkableObject->Release();: [/ @ Y4 k$ ^3 m! C
piLinkableObject = NULL ;/ r+ [) W: ~4 w/ T' l. ^2 O* i% X4 O. H
return FALSE;8 e* C: Q- Z) P" |3 f6 c
}
8 `: E: x. D0 u: V" S0 l //得到当前对象的文档
% l* Z- H* V7 N/ D4 t pDocument = piLinkableObject->GetDocument();
, O' x$ [: i0 l. G `) W+ F6 z piLinkableObject->Release();
9 d, c5 \. _. g, x9 g piLinkableObject = NULL ;, f' S& p7 w) ]7 w: m6 x6 R, I$ H# T5 x
if ( NULL == pDocument)& M! c0 F, l8 |" s* R/ r
{6 G; U6 F# `. Q5 K, A+ |! n1 v
return FALSE;% C8 z7 B6 T. I% A
}
( a; S" Y* P$ n) E& p }" @$ x, ^4 k0 t* y
//得到文档容器集1 t: b. j# {! F
CATIContainerOfDocument * pIContainerOfDocument = NULL;* _" r0 _/ C% W: K) A% I# c
HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);/ m5 s p& J" q' V
if (FAILED(rc))! ] c" W" g5 ]+ x# V6 C& L5 [, G% h
{
: O1 U; R1 |4 J4 h- x0 ` //pIContainerOfDocument->Release();
" v2 S v' V% E) \0 D1 K* U7 ^ pIContainerOfDocument = NULL ;7 l# X3 c3 r6 N; [
return FALSE;
8 f3 S4 W0 H" i+ C! g }/ U( C L$ Y7 C6 L
. ^/ ]4 ?" h$ [" g# h7 [) d
//获得Document
# O- Q- a! U5 ?! g3 W4 B CATIContainer* _pContainer = NULL; 9 N! A# a: D! K
//获得SpecContainer
; p9 h5 Y P# Z1 w0 a+ l HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
2 l# }- T ~. c/ T7 Z3 i+ n
5 L9 G0 T/ h' t1 A //GSM工厂
% [+ u, l* z( Q! t( Z0 F! Z CATIGSMFactory_var spGSMFactory = NULL_var;8 H3 n5 T- L* \ r6 U( m v- y
//设置工厂
m9 t* y- j' l- p6 K5 Z" ^$ _ spGSMFactory = _pContainer;
% s0 K) G# `& R9 w, y$ C3 x1 U( X CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(point3D);1 [: b. B- L( r" y
CATISpecObject_var spSpecPoint= spPoint;
7 @$ f: |) e/ {1 b# Q CATIGSMProceduralView_var spSndPntObj = spSpecPoint;& A+ G( X' b: o8 Q! y
( R/ }4 y8 }# `7 m% z
//*将点显示在屏幕上$ N% J9 y+ i/ O4 x9 B" l9 \$ N
spSndPntObj->InsertInProceduralView();+ y* x; ?" p& N8 p
//更新点对象
! n e: W) b$ ^/ d& y4 v4 q spSpecPoint->Update();
: u& z* S$ [: f# v" d& V0 c # Y4 u* [* ]: Q8 \: i
return TRUE;4 p9 s; U0 g/ V! w
}
1 k; V9 ~. |" ]
! E6 X% g+ V, T) n' z0 r, L$ M' e
3 b* l% w: Z4 o1 o. l效果如下:
2 K) w) `) S# l0 A, h
u; L& X% [# u" S* P ?
3 N% A5 }: A# C) J. C
" [, A7 a0 R$ w0 M+ |! j2 B |
|