PLM之家PLMHome-工业软件践行者

[原创] CATIA二次开发入门教程---15 通过点击屏幕创建点

[复制链接]

2024-6-12 17:01:01 4747 1

admin 发表于 2017-5-6 13:17:52 |阅读模式

admin 楼主

2017-5-6 13:17:52

请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!

您需要 登录 才可以下载或查看,没有账号?注册

x
CATIA二次开发入门教程---15 通过点击屏幕创建点
. t* I5 C* d/ i1 B5 y5 Q3 _通过点击屏幕,自动创建点, 这里直接建立了一个简单的对话框,通过pushbutton来添加一个回掉函数,函数里面去执行创建点的类。
; a, D3 g6 i; k0 e# l createPoint.PNG ; 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
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 doTeam.tech
回复

使用道具 举报

全部回复1

onerice 发表于 2024-6-12 17:01:01

onerice 沙发

2024-6-12 17:01:01

  _Indication指的是什么呀
2 ?6 G2 m  I7 N* p
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.diantuankj.com/ doTeam.tech
回复 支持 反对

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 注册

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

    本网站(plmhome.com)为PLM之家工业软件学习官网站

    展示的视频材料全部免费,需要高清和特殊技术支持请联系 QQ: 939801026

    PLM之家NX CAM二次开发专题模块培训报名开始啦

    我知道了