|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
CATIA二次开发入门教程---15 通过点击屏幕创建点! q. J" ?: M0 y/ g$ P9 C' B, s
通过点击屏幕,自动创建点, 这里直接建立了一个简单的对话框,通过pushbutton来添加一个回掉函数,函数里面去执行创建点的类。
0 h- {3 r8 X$ R7 ]
- u6 i' t1 g# w" x( c
- j4 Q9 Y; f1 q8 W' mvoid DialogTesTCmdDialog::OnPushButtonCreatePointPushBActivateNotification(CATCommand* cmd, CATNotification* evt, CATCommandClientData data)
9 h( M/ B, r: G L) P7 Q2 v+ K3 F+ I{: c3 d M+ O* _0 q$ W }
// Add your code here
0 b K2 z! r- c8 t4 |1 [0 w CreatePointCmd *createPoint = new CreatePointCmd();
9 D+ u, e- x+ h9 A* W}) @, A a7 n% H1 O5 [1 n8 M x
+ S! D3 G; C8 d0 [* ?9 R( r
新建一个catia 的命令,名称为 CreatePointCmd ,接下来要做的就是在 action one 里面进行点的创建,代码如下:
( y9 O" @4 k8 ]6 I+ t% r$ d Z+ {8 e
CATBoolean CreatePointCmd::ActionOne( void *data )8 W0 X9 \; g H
{
# e2 ^ h7 D1 g, L2 V# f // TODO: Define the action associated with the transition
# D/ a5 i9 \6 {5 w) ~7 S // ------------------------------------------------------$ C$ g: P" |/ r* t
CATMathPoint2D point2D = _Indication->GetValue();9 V3 e* J0 j" E) O" k
CATMathPlane plane = _Indication->GetMathPlane();
7 n9 z, ~9 S3 k8 M CATMathPoint point3D;
% Y) K( b# }) D* O6 W% ^1 G plane.EvalPoint(point2D.GetX(),point2D.GetY(),point3D);; r" k, {/ L O5 s) e1 ^1 k! R
8 y/ B& \5 B, C5 \/ W' x. h
cout<<"Point coordinates:" << point3D.GetX() << "," << point3D.GetY() << "," << point3D.GetZ()<<endl;
% {( h2 G% J, ]+ s0 ^6 y6 d, g 3 r. D$ I- d8 I$ F! d, J0 S
//设置Container(非根节点)
9 \2 n2 o- u: V- W //获得Editor
8 S- @2 l% z0 t1 k/ l, S' F0 p Z! y CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();) z% S% r' G; c8 j/ c/ A) E
//得到当前对象的文档
7 I g. X' _ E7 j u6 Q CATDocument * pDocument = NULL ;2 z: q% E0 X# s& ^7 H1 \
//取得当前活动对象
% }! {% N; D" S: C2 o' p% k% m4 F/ ` CATPathElement activePath = pEditor->GetUIActiveObject();
* k2 a; `* S, b" I //取得当前活动的product
1 j y1 `! h7 w6 m CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());
( l! D0 V1 [1 A/ a6 k. B //当前活动对象不存在
+ @( Q- M6 X4 |0 n3 T if (pActiveProduct == NULL)( ]; U- ]3 }* A# ?4 D
{1 t9 r, z" `# ?; l2 O" \
pDocument = pEditor->GetDocument();
1 r9 F8 N5 B8 n( T7 Q' D i+ Z+ A }# z5 u: {* B2 F8 T& x0 z
else; u& f) ]& d5 h1 m d! d& m
{
1 t1 W9 D z% ^0 v. B- ]" F CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();* Q" S% ~9 w1 R) f
//当前对象的引用对象是否存在
2 a4 @0 k6 b, O# a9 ` if ( NULL_var == spRef )
2 `. s {' ^3 R; _2 G) P8 x, @6 H {
, |: d: X' f1 ^( }6 Z5 m# A+ ~ return FALSE;; v% g. M( p$ [ F$ b4 b) f: [
}
4 l! l/ S3 x9 I //当前对象的链接对象; V- {7 }9 ]& `
CATILinkableObject * piLinkableObject = NULL;* G* T# J1 R3 J. E& u8 _
HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );
, q4 G8 h. }& c9 t6 H if ( FAILED(rc) )
8 c. e3 a; \; w! o9 R {- V6 X; p R! \
piLinkableObject->Release();# M- X2 S, m! k( J& F* s: `' Z, j
piLinkableObject = NULL ;
' m3 L5 R8 w: a return FALSE;# n7 A, X2 @9 b* v- q. m
}
8 \" O# }& l( j$ }) E7 L //得到当前对象的文档
8 j% e* i T1 {6 i X {( a3 E pDocument = piLinkableObject->GetDocument();
- d" E5 `8 X) z. k0 N( J1 G- s5 H piLinkableObject->Release();
( B, ]5 K' G7 F* {. D piLinkableObject = NULL ;
+ i* _& f: ~1 _, D2 A' |# C if ( NULL == pDocument)
3 ~2 n& I- D- F* k/ E" ]7 s) F( P {
7 R5 m8 n; G' k0 z# f return FALSE;. D5 B2 a$ b- K$ Q
}4 P, j3 C8 [2 t( i
}
9 D3 W1 o7 \( S //得到文档容器集
6 l. T; H2 i; D/ l8 I7 J# {2 b CATIContainerOfDocument * pIContainerOfDocument = NULL;8 _& A7 z6 H' v4 A7 ? ]
HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);
. P; _6 z" `) K2 ^8 G$ u$ @, } if (FAILED(rc))* l6 p9 Q' `. M- d( c- g& [" t
{ j% O7 r! h3 n
//pIContainerOfDocument->Release();
" r! y/ C: E8 `3 X6 ? pIContainerOfDocument = NULL ;
' Q/ m( u8 g0 J) W7 x return FALSE;; D' _: p5 A2 w7 w2 {& P& ~' ?$ q
}% `+ T* o) x5 Y
; Y K8 o' c2 T' a. ?: l5 ]
//获得Document
- f q9 G& X5 y6 x CATIContainer* _pContainer = NULL; . d5 ^# A9 \: w3 H# D
//获得SpecContainer
c D) W# |; ` HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);# P; R( F+ A9 w" J& H
/ \8 r4 M1 _* i# s* d; U* | //GSM工厂$ B4 O3 O4 k- Q- A, P
CATIGSMFactory_var spGSMFactory = NULL_var;! w$ _* a+ n9 s+ v; C
//设置工厂
* R3 G; R, Z$ s* \$ P/ s2 `& q spGSMFactory = _pContainer; c3 E+ r F% f: ]: Q7 o, f8 E" @
CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(point3D);6 k1 @& A3 ?! k
CATISpecObject_var spSpecPoint= spPoint; 3 k% U. h' W7 d- I1 K: F- D
CATIGSMProceduralView_var spSndPntObj = spSpecPoint;! P+ Q" O5 p% h5 L2 [4 l* p
- v5 c! e: p8 o6 K: j //*将点显示在屏幕上6 d% w; K1 T2 ~; J, V2 i
spSndPntObj->InsertInProceduralView();
$ y! L; R" |3 f& q- U# q //更新点对象
+ r3 c; L, b4 q. x" x* ?: E spSpecPoint->Update();, ]% |* {) V" H( I
' c+ F: ] [5 j, w I return TRUE;) N7 m3 o4 @4 ?" `9 o
}! f, Z5 |! M/ B8 J9 n8 K( X
: g# W2 J/ c- P+ b7 C( T+ h
6 }( C+ X9 t ]: w" Q, E T效果如下:
; P6 x3 b9 W1 k1 T! @/ ~$ D, I5 F6 J
, k- ?) H) L9 w( B; _
; O2 j9 \5 C z/ j3 v# z! ?. J
|
|