|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
CATIA二次开发入门教程---15 通过点击屏幕创建点
. t* I5 C* d/ i1 B5 y5 Q3 _通过点击屏幕,自动创建点, 这里直接建立了一个简单的对话框,通过pushbutton来添加一个回掉函数,函数里面去执行创建点的类。
; a, D3 g6 i; k0 e# l
; s/ B% J) U- Q8 `3 n0 j$ g) S/ V
* g1 j2 v; `4 A( n; i* t3 @void DialogTesTCmdDialog::OnPushButtonCreatePointPushBActivateNotification(CATCommand* cmd, CATNotification* evt, CATCommandClientData data)
3 D1 Q) m5 O, v+ q+ \{' b5 I4 h5 H3 V9 p
// Add your code here: o2 [$ h0 q& ]
CreatePointCmd *createPoint = new CreatePointCmd();
U. _( Q6 K" N3 V% ~3 w3 P' ^* E}* n# u. M5 J4 ], }$ Q7 C
8 ~( x, Y8 i+ Q) p- W
新建一个catia 的命令,名称为 CreatePointCmd ,接下来要做的就是在 action one 里面进行点的创建,代码如下:
9 m; J e! {9 h% o' z+ {$ n
0 F! n- b+ l3 U" LCATBoolean CreatePointCmd::ActionOne( void *data )
) o2 H4 w: j- w E8 d) n O3 U{
# D8 t4 Q0 b$ Q+ h4 J: ^' ^- L // TODO: Define the action associated with the transition ( U' E3 t- t/ {+ U+ L* D; _( A
// ------------------------------------------------------
* p4 I& s. [& i" j CATMathPoint2D point2D = _Indication->GetValue();) M5 i- Q! s. J4 W$ k
CATMathPlane plane = _Indication->GetMathPlane();* Z! }8 O, I( I. S1 {4 w' p; ^2 D
CATMathPoint point3D;
6 r6 I4 O5 K. R plane.EvalPoint(point2D.GetX(),point2D.GetY(),point3D);
% S$ i1 m" t' a& D9 ~ A( X0 A% y
, K1 Q4 J/ E7 u cout<<"Point coordinates:" << point3D.GetX() << "," << point3D.GetY() << "," << point3D.GetZ()<<endl;9 ?8 o" l2 V5 F" I) y
' P/ w) v, b) ^2 ]7 W! V/ V
//设置Container(非根节点)
1 v( o p+ V# p //获得Editor
- |1 E+ T a& ~2 O# X4 J$ Q CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();8 D; t6 J+ \' K( P7 H" P
//得到当前对象的文档
6 a) j$ ^$ j. B" D( x8 _1 J2 o8 d8 D CATDocument * pDocument = NULL ;
% X6 W1 O1 D2 o( @9 c //取得当前活动对象
2 S5 u6 e" a( i& J) Q, X+ N CATPathElement activePath = pEditor->GetUIActiveObject();: a x5 k, P1 V7 p
//取得当前活动的product
C) y/ _0 |2 S' E. k D, F1 s CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());9 c2 t+ F8 A4 _" A
//当前活动对象不存在2 t3 E! s1 r' Q8 r" ?8 f, H
if (pActiveProduct == NULL)7 A6 d1 m% A9 ^$ u+ g/ ~+ L" d
{: Z& F" g5 r. K
pDocument = pEditor->GetDocument();, r) | Y. s9 {% U9 {! g
}+ ]$ B& m) \% |3 F7 R( d
else$ _( a5 C$ i; ^0 j& E$ ]
{+ k" C2 a/ F. `; P4 \
CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();& z0 u: F9 X" |% J! O
//当前对象的引用对象是否存在
( W7 D& ~$ {' C* N3 c$ x9 T6 R if ( NULL_var == spRef )1 c8 z7 z$ l$ f! d% Z$ d
{
8 p2 z. I3 E: O3 z' p% o return FALSE;& h' D2 [0 d# B) Y
}8 w( \2 C- D5 c; w' F
//当前对象的链接对象1 k5 s# r; m0 S2 i- X
CATILinkableObject * piLinkableObject = NULL;
5 h" i S9 ]3 M5 ^ HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );
3 [2 X& w' t9 G if ( FAILED(rc) )
6 K, ~. {. ^1 M E; ~& D! Z3 s {
9 ?( j+ I- P2 f: S$ a piLinkableObject->Release();
/ b- S8 W' o, j8 B$ [ piLinkableObject = NULL ;6 r5 ], v1 s. h/ Q$ D
return FALSE;
3 w( o$ K5 `# K" b/ h }
9 [" c$ g: g' b$ i5 o //得到当前对象的文档4 H3 {1 B5 Q7 f7 ^
pDocument = piLinkableObject->GetDocument();: o: O* ]/ U1 d! C, I6 J
piLinkableObject->Release();
2 C2 ?1 ]5 J, W5 u, t# X2 b piLinkableObject = NULL ;
5 {! X" Y* R, B( ~/ i- P if ( NULL == pDocument)
5 h- J/ ?: o4 F. @7 r" ?8 `. W {
* { k6 T: p6 s, e return FALSE;
6 Q1 ]! t1 ^( @ }( v X: j2 l. g* Q0 X
}
5 k5 a3 b" q) s; Z4 `! ~. C! m //得到文档容器集
0 u. x" V3 x, u9 v0 U CATIContainerOfDocument * pIContainerOfDocument = NULL; u R" [$ J0 x( A9 |9 K! s/ N
HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);0 J2 Y0 k% e6 \
if (FAILED(rc))
# X& d2 k+ a! G- A4 N {* s' P; `' K! i' {! a( S% S& g
//pIContainerOfDocument->Release();
4 H1 X7 C; Q b1 i( L+ ~+ t4 }6 n pIContainerOfDocument = NULL ;
g3 u; Z4 l1 o6 q return FALSE;
" Y/ o/ @8 F& H2 ]$ o }3 @/ Y/ u( O6 D2 z
9 M/ j' X7 B J& B7 v2 |5 J" h //获得Document( `' N; E1 z( f3 R2 k
CATIContainer* _pContainer = NULL; 2 w( [" n" F! }1 u- k: T3 Y* f
//获得SpecContainer ^0 Z, [- k, l# o. u
HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
; m. o3 j9 G: n6 P* a7 I* G
3 B0 v6 M( n% |$ P9 `5 \0 I //GSM工厂
/ W6 m. T' w: @# x; `+ J. v K CATIGSMFactory_var spGSMFactory = NULL_var;
2 B0 o2 g& Y, v) y3 g //设置工厂 ) f3 W7 L9 N# H8 ^! i( Z- v2 b& y
spGSMFactory = _pContainer; ' a& y0 q0 K; X
CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(point3D);
) E# R0 O$ ^7 [0 R V; | CATISpecObject_var spSpecPoint= spPoint;
) H" i ]0 C6 d" W& K CATIGSMProceduralView_var spSndPntObj = spSpecPoint;' t$ F* L+ w2 @: z2 l
# {" z: h% B3 Q7 `( e' j //*将点显示在屏幕上
0 `- T. m& V+ y" C# ` spSndPntObj->InsertInProceduralView();, Y7 _' _" L- [* M3 X
//更新点对象; i' n% [' R9 Z h; i
spSpecPoint->Update();8 [3 g q3 W v; C( G5 K' f/ r, v
* [( [& n* |- b
return TRUE;: r( ]0 ~( O0 _+ Y5 Q
}* O( X* K- _; u a2 @0 n
! _( o' s9 P* \8 ?. u7 Q
1 |* J) o& P/ z. \( C效果如下:
* o/ }0 k: {, p! i- l+ p2 g5 I- m
3 |. F' b0 C; \. _# d2 U2 H) v1 @+ m/ D" p* F
- d" n3 v1 N+ J) Z) A
|
|