|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
CATIA二次开发入门教程---15 通过点击屏幕创建点
( u6 O8 @8 O. s( l ?; C) }通过点击屏幕,自动创建点, 这里直接建立了一个简单的对话框,通过pushbutton来添加一个回掉函数,函数里面去执行创建点的类。1 H1 \4 b; P# s
+ q' u1 @2 x0 L* h3 i" l: x; O3 j, m7 q* a6 I
void DialogTesTCmdDialog::OnPushButtonCreatePointPushBActivateNotification(CATCommand* cmd, CATNotification* evt, CATCommandClientData data)3 m9 `* W* G7 T8 U, p! W/ x
{
) P0 g/ k% I1 r% Q7 Q' L // Add your code here; H% P% G# V6 R1 }
CreatePointCmd *createPoint = new CreatePointCmd();
5 y) ^+ K- N7 Y$ J, D0 W2 `2 A}
. `' x( Q5 w# a/ F5 F t8 P
! o0 u4 F7 T. u# a& I& C% \9 I/ A新建一个catia 的命令,名称为 CreatePointCmd ,接下来要做的就是在 action one 里面进行点的创建,代码如下:
& N6 @8 }% ]0 j1 v @
# G0 b ?6 ]( W% F' H: @CATBoolean CreatePointCmd::ActionOne( void *data )% F' m4 [7 o% a) K# o5 T
{* m' Q; G7 l: D9 a6 C7 A) G! p
// TODO: Define the action associated with the transition
9 V. B: M: A5 @/ l+ P H% H // ------------------------------------------------------( Z7 g# L! X) M! M1 Y) c
CATMathPoint2D point2D = _Indication->GetValue();9 d3 B( k9 r8 }3 y- l! e
CATMathPlane plane = _Indication->GetMathPlane();& C1 J' {* ?+ R) z
CATMathPoint point3D;: [, o: a0 l& i( B/ K, h. R# b
plane.EvalPoint(point2D.GetX(),point2D.GetY(),point3D);
5 p- ^7 W! n0 J" a* U+ x: H. s8 X. a& s R
cout<<"Point coordinates:" << point3D.GetX() << "," << point3D.GetY() << "," << point3D.GetZ()<<endl;4 |8 X: l6 B' b0 E, ^. Q
F' ]3 b; I4 |; m( b) z+ m7 N* a
//设置Container(非根节点)
2 z6 W( H/ P; v o/ b; j //获得Editor
7 E V* E. x$ n CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
7 P9 k' Y& c5 l; X; W //得到当前对象的文档) j# [. S5 M1 o# u$ q: b
CATDocument * pDocument = NULL ;1 \4 ]0 Z' p( m, }# n
//取得当前活动对象
9 K6 e" t8 T0 G, h2 q% H7 O CATPathElement activePath = pEditor->GetUIActiveObject();
% |# ]2 M: ?' o1 z4 N( F: w //取得当前活动的product
# I1 z+ X% l) o- V CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());
2 I# \9 j2 K6 }+ ?: G$ b# k //当前活动对象不存在3 Z# Z" G: k& @& s9 ?% V
if (pActiveProduct == NULL); E! A7 p O* C+ q: D
{
- F# v7 v, L. U- M! s pDocument = pEditor->GetDocument();: i% t4 ?( q9 U0 s7 x0 c6 j
}
( o7 U& d( ^ C4 H, D2 ] L else' ]6 d7 B: K; b; n7 @* T; T9 t% h
{* T/ h4 j9 P: k) `+ ?% C' V
CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
% u5 J$ u, M- W& V) x+ J //当前对象的引用对象是否存在) o; z/ |. x( ?! Q. b) ?/ U
if ( NULL_var == spRef )
: F$ J# H& ]# J, e2 f3 Y {
, H p* L: o: c& u0 q( H: b: G return FALSE;( P! m: O# R% Q# P5 y9 G
}
% f# n. Q* R. N4 K x! f* B //当前对象的链接对象4 ]& V# O& t. l
CATILinkableObject * piLinkableObject = NULL;- u& \( Q8 s! P( p) N0 _2 `
HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject ); % U" N" N* c0 F2 U2 D
if ( FAILED(rc) )
+ P2 @8 z; A0 u- g1 S, R {
+ A- {& I9 u) F( t1 j5 k* M piLinkableObject->Release();
; e+ x0 q# ~+ N, t" o" ]# y piLinkableObject = NULL ;7 D: P) l. E% H' y4 l2 a
return FALSE;
$ B9 h/ m& G$ w# j& D4 J* C% U6 q4 j }
; B5 y# d3 {/ x; V) r9 Q //得到当前对象的文档" m# L4 X" N( k6 K
pDocument = piLinkableObject->GetDocument();
/ r) ~2 R& v9 F1 b piLinkableObject->Release();7 |% S" s! r9 O6 B% g; ]
piLinkableObject = NULL ;
9 `$ l% w: w4 z2 g# r4 p if ( NULL == pDocument)
- V' T" [( m1 T% b {
$ X# u" r: q r' W return FALSE;" J& h, K/ y' q* f, J$ _; ~. J
}& e$ D! \+ A% M% i3 A' P
}
; K2 m6 v5 k- J5 \/ J: r. O //得到文档容器集
3 J8 U) g0 z0 y" y/ l CATIContainerOfDocument * pIContainerOfDocument = NULL;5 b9 L6 x( ~' c- l) ~
HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);
% W) Z- E+ N2 o* v# V if (FAILED(rc))" m1 H: c t+ |
{" a% Q1 [; i% q8 ~
//pIContainerOfDocument->Release();& O! X7 f7 J# p% Y9 h4 G& `, G, S. B
pIContainerOfDocument = NULL ;
; H2 G& l7 E0 E- H return FALSE;
" D( Z) L z/ J/ V7 Q$ P }
" M- R; N) q+ e! Z$ T( _
7 C0 c7 y+ v/ C, g; [ //获得Document
3 K( M6 C( h7 J0 Z+ m CATIContainer* _pContainer = NULL; - O- _" M9 g0 H1 C$ g% j7 S q
//获得SpecContainer) |# V4 h6 E9 H
HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);0 d4 x3 Y. f. W- _$ u& M: j, ^
- i# |( L" I6 k6 y //GSM工厂
6 c9 F. V$ e( D) n- \ CATIGSMFactory_var spGSMFactory = NULL_var;2 C6 ~. J ]+ {. T
//设置工厂 4 C2 K/ u% r& T6 W" x6 k8 P E
spGSMFactory = _pContainer; ! q: G9 E; h5 [3 F4 ?
CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(point3D);
7 d9 _! E" C! D* ^/ u+ m CATISpecObject_var spSpecPoint= spPoint; g& v3 k1 H! n6 }3 ]2 c d
CATIGSMProceduralView_var spSndPntObj = spSpecPoint;
; y0 J. b/ r" z @* _2 x' e" c7 W; q) I( S V& I
//*将点显示在屏幕上6 ?" ?5 e5 l* |$ ]* @/ G
spSndPntObj->InsertInProceduralView();# j, t! }+ h& K5 E! k m
//更新点对象
N* y; Y2 N- J0 q spSpecPoint->Update();
, C& s* b5 j) v7 q+ x" q) O( A ! b) v: G; q/ e3 |
return TRUE;
* d8 x/ [- \0 o( k) Y. r) i}1 f) G1 C' H5 X. t& L, W2 ?: |2 Z
* S0 O# o4 G% E" W) \+ O! d$ m, y) r4 T2 U* o+ d
效果如下:+ y8 t! n8 t4 D8 `9 p. O3 B% H: F
% j6 w, @+ U' g/ t1 M( _2 s. a
7 H% z8 S7 O- s5 g' f
0 j$ i i7 _- O3 u0 R0 i5 H
|
|