|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
CATIA二次开发入门教程---15 通过点击屏幕创建点
0 s' C4 c' r8 W通过点击屏幕,自动创建点, 这里直接建立了一个简单的对话框,通过pushbutton来添加一个回掉函数,函数里面去执行创建点的类。4 U; B! u' p, _, O
# w& g/ _1 P2 D8 {( o+ f( ~ v2 _( ]8 D
5 {- M+ b0 u/ N& svoid DialogTesTCmdDialog::OnPushButtonCreatePointPushBActivateNotification(CATCommand* cmd, CATNotification* evt, CATCommandClientData data)
# T5 U- L: [# g; |. j: ], f C( m, H{
- V- F4 X, @; |5 E1 w) O" ^ // Add your code here" N* L! q& h3 e" J7 l
CreatePointCmd *createPoint = new CreatePointCmd();
. e: Z: J( D2 p1 Q2 B: x* q; j}
$ @7 U* H; b# K! a5 s( |, q# [3 H! w( e5 ]
新建一个catia 的命令,名称为 CreatePointCmd ,接下来要做的就是在 action one 里面进行点的创建,代码如下:( y! W1 @8 {. h$ j
; S- u( M. j$ a# r
CATBoolean CreatePointCmd::ActionOne( void *data ). t9 j _$ \ t- A2 e
{* W2 G5 \6 o/ i& `( `: U g
// TODO: Define the action associated with the transition 6 r0 C: o. Y+ l9 d3 [
// ------------------------------------------------------& s( B1 @* p. q8 _
CATMathPoint2D point2D = _Indication->GetValue();
. F6 `& g' ?/ ]9 ^8 M) V$ H3 c CATMathPlane plane = _Indication->GetMathPlane();
0 h3 ]* l7 C( q& M8 X$ B CATMathPoint point3D;
, s3 X) r; B) ^5 {' R4 T7 J# @; X plane.EvalPoint(point2D.GetX(),point2D.GetY(),point3D);
& x6 p' e6 {* _/ B
+ y' J* M9 V- X: C! S cout<<"Point coordinates:" << point3D.GetX() << "," << point3D.GetY() << "," << point3D.GetZ()<<endl;
& _1 v: \: W2 b1 H ` 3 ^& X' q7 O$ [9 m; l1 g' ^" m! S. ~. v
//设置Container(非根节点); W* k6 v X; p1 ?) |* [
//获得Editor
# A8 y( R. W6 | ]5 X, F CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();# ^3 ^2 Y# I, ?5 ?
//得到当前对象的文档
. a0 u1 n, A( h) E5 H CATDocument * pDocument = NULL ;
, E5 y1 _4 _, s) U% e1 k //取得当前活动对象+ s/ v7 {% p! z6 p: D
CATPathElement activePath = pEditor->GetUIActiveObject();
8 X8 Z* x+ ^! P) M //取得当前活动的product8 U4 @1 }: c: p9 b* E0 s
CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());1 ?6 t0 }! S, i. ~, Z: G' ^0 b6 M. Q
//当前活动对象不存在
5 q! H% `1 I% M if (pActiveProduct == NULL)
+ R" O, y8 m e( A* N {. D G( m6 [( q: L' F
pDocument = pEditor->GetDocument();
8 P# x- h6 L% [ }
( Z1 S0 N* q& n1 E, D# O9 E else0 n. W" W" ?" m* R) P* u
{# s) c h5 n4 K$ o; q: v
CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();3 O! E1 B: n0 L; @: a
//当前对象的引用对象是否存在
9 V5 N7 Y, m* o/ [9 ^ if ( NULL_var == spRef )# `9 d- L8 u. Z0 u# u- {6 s _
{8 ~- q& |' D7 M9 t
return FALSE;
1 K' L& U% O0 A4 |- ?$ K5 ] }
" {1 J3 A$ ^+ G: b8 z0 | //当前对象的链接对象
* i m/ ]" `! L6 Q CATILinkableObject * piLinkableObject = NULL;0 E; q! R6 {( Z$ V/ h
HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );
& ~( P9 x, R/ C if ( FAILED(rc) )( R; h# Y t& t- p( k$ N! r
{
6 Z2 C' k1 ^0 Y* @, ]6 c1 u piLinkableObject->Release();
- Q8 |& J; R2 o. h8 p( d& Y; f piLinkableObject = NULL ;$ }3 ]# n# H7 ^8 r
return FALSE;
. C% E& B7 Q9 {8 } }8 U1 |! W* p, J* v9 r
//得到当前对象的文档
* w1 L4 A. u& ?0 Z( A pDocument = piLinkableObject->GetDocument();
' e6 a1 C+ ]* u: C: Z: ?# ]4 L piLinkableObject->Release();3 |, T9 {) ]: ]9 c) c% O9 J% {' t/ i
piLinkableObject = NULL ;* ?! t$ Z! `4 ]9 p r2 x [
if ( NULL == pDocument)0 p3 _7 ]. r' ~! a" r
{9 o. G- y: c# v& H7 t! t. r5 e
return FALSE;
: [& T# t1 j/ q9 U* m7 t; n }
4 H+ @ x9 p7 Z; L }
9 a( z' ~4 X2 C2 ~! S3 m- N //得到文档容器集
6 c# ]& G, j9 f CATIContainerOfDocument * pIContainerOfDocument = NULL;6 U; q, `5 W ~* ?1 {, R- t
HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);: a0 t) Q+ c, B+ U
if (FAILED(rc))
w. h O* n! T {
( ?# _! H! L6 J7 Y3 H1 g) D //pIContainerOfDocument->Release();
( |! R( K* T. A pIContainerOfDocument = NULL ;! p' }8 t" p" ]7 H# f8 R0 F
return FALSE; \* t2 K: e' V4 t; j) L
}6 n; i. {! |! j- y: s
2 x5 o/ ?/ ~1 |0 Z+ `
//获得Document
, c. ` R) r2 M, Y CATIContainer* _pContainer = NULL;
9 \: v$ I& R y+ @' j //获得SpecContainer
1 F* l* i3 S+ h6 h9 H" ~4 s5 n& U HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
( i0 m9 q" j" k, d ' C- W: Q& A# p
//GSM工厂3 o9 P! P$ ]# D7 H% z
CATIGSMFactory_var spGSMFactory = NULL_var;
: i& ^ J5 n1 h; X5 W //设置工厂
) c. U+ Y( S* b- g( w8 J spGSMFactory = _pContainer; : o+ _& v3 j2 D. O6 A6 \0 H ?
CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(point3D);
Z6 ^. O9 J3 E1 E5 y CATISpecObject_var spSpecPoint= spPoint; ( r! C. ?5 N' E# ^# t W
CATIGSMProceduralView_var spSndPntObj = spSpecPoint;
2 k" t/ T* \7 W! P# _, E) U- j% F( T9 z9 u$ f* D' \
//*将点显示在屏幕上( T; N3 h" d8 K5 V
spSndPntObj->InsertInProceduralView();
" q) y0 ?7 |) T //更新点对象
+ r* {- q5 \' P) N6 Q- f | k! ~ spSpecPoint->Update();
' ~( r6 u, v, Z; X ( T# ?- ^8 d4 z2 f1 e( y# j! x
return TRUE;. b t: U, W6 M1 m* k! x ^4 e
}% T# P4 _9 N/ B @5 c0 Z5 d7 ~
6 J2 p3 S$ ~" ~2 Y( K* k% O3 M; E& R0 s* q- p) t
效果如下:
) d2 o, b7 h' K/ V9 m/ _/ a
6 j7 e* [7 _, M! x) }* `1 o( |9 E- h$ N. L
0 e0 I( s. ~: Y! o" z9 z: B4 l9 z
|
|