PLM之家PLMHome-工业软件与AI结合践行者

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

[复制链接]

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

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

admin 楼主

2017-5-6 13:17:52

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

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

x
CATIA二次开发入门教程---15 通过点击屏幕创建点! q. J" ?: M0 y/ g$ P9 C' B, s
通过点击屏幕,自动创建点, 这里直接建立了一个简单的对话框,通过pushbutton来添加一个回掉函数,函数里面去执行创建点的类。
0 h- {3 r8 X$ R7 ] createPoint.PNG
- 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
上海点团信息科技有限公司,承接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指的是什么呀% C6 b% R& e1 g1 u
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了