|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
CATIA二次开发入门教程---15 通过点击屏幕创建点
; H0 q. s' ]0 U$ q2 `通过点击屏幕,自动创建点, 这里直接建立了一个简单的对话框,通过pushbutton来添加一个回掉函数,函数里面去执行创建点的类。: [$ \- k3 f7 b* A. A) l
- E0 v& M0 K, T. f' n
# l" r; }/ R4 P3 j- ^7 a. A8 Yvoid DialogTesTCmdDialog::OnPushButtonCreatePointPushBActivateNotification(CATCommand* cmd, CATNotification* evt, CATCommandClientData data)
' S! G4 t* e6 s{) H- e4 K# ~! N7 U) I
// Add your code here6 X' r' G. H0 Y9 \2 ^
CreatePointCmd *createPoint = new CreatePointCmd();4 _- d/ P$ w- B* S3 m/ {
}
: s1 D0 U$ e% h* b
4 ]. d) `2 f# D1 i7 R- z新建一个catia 的命令,名称为 CreatePointCmd ,接下来要做的就是在 action one 里面进行点的创建,代码如下:
* V2 `" i3 W% M5 W/ u( h. M# D* \, c& K- q# p6 m( B: _# z0 Z. m
CATBoolean CreatePointCmd::ActionOne( void *data )7 w1 `# D2 _3 `0 R% j8 n
{
9 F5 V' l* O. h& R' k& ? X& ?8 M$ N // TODO: Define the action associated with the transition / {* t) P0 D" f2 D; h( j7 ^7 G
// ------------------------------------------------------* z5 ]' R6 J ~: j/ J1 U6 K
CATMathPoint2D point2D = _Indication->GetValue();
* Q% x7 d( Y2 ~ _/ l CATMathPlane plane = _Indication->GetMathPlane();6 s7 E6 Q1 }2 G" d4 r
CATMathPoint point3D;: y1 j* w1 z- x& z
plane.EvalPoint(point2D.GetX(),point2D.GetY(),point3D);
d1 \1 D6 F0 A$ @7 p( p2 Y( u
- k9 p6 Z2 j1 i B: h; G' W cout<<"Point coordinates:" << point3D.GetX() << "," << point3D.GetY() << "," << point3D.GetZ()<<endl;0 I2 ?- R+ c3 f* y
6 n" T+ Z$ o& l F
//设置Container(非根节点)9 m' E$ b2 a4 \7 ~
//获得Editor
/ s$ M& K5 T: t: u5 u( ^, F CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
1 s) `; N( k' A( ?# Z( }) m //得到当前对象的文档1 j3 S' _% A( R2 }- ?
CATDocument * pDocument = NULL ;
# S' A5 h% ~1 D0 M& K% g //取得当前活动对象
* K( J! ^/ T: O# d! u' [% U, u CATPathElement activePath = pEditor->GetUIActiveObject();
3 @( u# E8 {! y4 w //取得当前活动的product( S) J J* I8 P% i
CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());3 c; {( Y1 k( W+ C1 q: r
//当前活动对象不存在
! c( J/ |) ]& @ if (pActiveProduct == NULL)2 u$ B9 ]3 f7 h+ C) G
{) `2 ~- p; M* F6 M3 N
pDocument = pEditor->GetDocument();6 k9 _5 E* P @; f1 D4 T
}
+ v* l$ W8 s( C% ~0 z else) l3 T/ c7 q K8 c; ~3 g3 h' Y3 ~
{7 m$ n$ V! ?4 d$ J
CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();' n! n) K |. A3 h0 G2 v2 C$ O7 q
//当前对象的引用对象是否存在+ c) q: } _! ?; E3 J
if ( NULL_var == spRef )
: ]0 X4 r- i2 l; G* ` {! \9 f& G k1 ]$ L7 `* K
return FALSE;5 p8 T7 i, r* f3 ^
}9 n" Y4 v5 K3 E0 X2 n5 h# N
//当前对象的链接对象
9 l; c, w# J7 S- ?$ K CATILinkableObject * piLinkableObject = NULL;' F# |9 Y4 p. O+ C+ B/ P
HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );
9 x, T; G3 S/ u8 q1 o% ] if ( FAILED(rc) )! p1 T9 S0 a$ I, k/ Y2 Y) ?
{
H) F0 J/ `) \ piLinkableObject->Release();' u# [; d4 G4 w- F% ?
piLinkableObject = NULL ;! U3 e8 V" n7 s
return FALSE; w# d. W% N0 d; M; E
}. i$ D9 n9 r0 U3 `
//得到当前对象的文档
2 u& g2 n3 X$ K2 z8 F) z' g0 f% C pDocument = piLinkableObject->GetDocument();4 d+ V8 L' n) ]- b/ e v* L V
piLinkableObject->Release();
5 S3 H3 D" q4 N0 V$ b: e piLinkableObject = NULL ;
& w& V0 x" T& V& J if ( NULL == pDocument)
+ Q1 D4 F6 H# n+ r0 e {0 h0 P- E7 k$ O: Y; x* \: W
return FALSE;
/ E- Y( T$ B8 a# F$ p }
5 B% e! L/ g( H" u }
3 W2 ~1 n6 d& W% m: n: o+ L8 `7 ~ //得到文档容器集3 b+ P: Q, R/ M# V1 j: o
CATIContainerOfDocument * pIContainerOfDocument = NULL;
1 m' I0 b( U5 \. q G* q$ ` HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);4 u' W: U" J: h6 \% T) N
if (FAILED(rc))0 n* n: K8 q; L+ T k
{
! q! Z& h# P: a) r9 N& s: x //pIContainerOfDocument->Release();5 ]$ Q4 _( H- n* I2 K0 w2 [
pIContainerOfDocument = NULL ;
9 A; J2 X: i3 f, c) T2 e return FALSE;$ Y* g. b, J4 ]
}1 Y* Y' \" o$ H/ a% y) O( a; w
& ]5 L2 {6 b. z5 u
//获得Document+ O$ F" \3 X7 {' _, b+ t' Q2 x+ b
CATIContainer* _pContainer = NULL;
3 r# A* `4 o& m$ Z //获得SpecContainer
" Y$ ~3 u- j. D6 g6 W HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
; Z$ P1 L4 X7 w- q4 |; M
5 f7 K- A& T3 l( |9 e //GSM工厂
2 |: M2 N, V7 D( Q$ B, C- Z$ f) S CATIGSMFactory_var spGSMFactory = NULL_var;
: z2 J8 h1 K) L: y1 X6 b9 E4 d //设置工厂 5 |; Y8 a. q1 [5 q
spGSMFactory = _pContainer; 2 T" E8 }& t9 l6 Z
CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(point3D);$ v/ G) a- K8 z) d
CATISpecObject_var spSpecPoint= spPoint;
) E2 v4 H2 {# c7 n CATIGSMProceduralView_var spSndPntObj = spSpecPoint;6 t+ m4 p0 v+ C* X4 J% z% H; j
4 b3 k2 u- `6 k$ z' k( J //*将点显示在屏幕上' @' J4 ~9 g% c9 P
spSndPntObj->InsertInProceduralView();
* G/ D b6 O6 J4 {, w" J //更新点对象7 P" B- J# c3 w" d$ Y" e: {& r
spSpecPoint->Update();3 J; l: c& C L: |% k# U5 Y
) m1 b7 \8 }. J! ]* H return TRUE;
& T8 b- X d+ o, d+ u% d- [" n1 c. ]}
% v" N3 Z3 {+ X: L
5 n/ R q/ a! S5 y2 D- Z5 T) W! R1 D9 C2 Z$ r" x
效果如下:
1 {+ F# ~8 P- k' ^ x: V2 b7 u+ P% d% S
: m* x( \+ J5 s7 `, `6 ?" W
$ p0 m2 m3 u# K# j% e. L" i |
|