查看: 5024|回复: 1

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

[复制链接]

6

主题

4

回帖

60

积分

管理员

积分
60
发表于 2017-5-6 13:17:52 | 显示全部楼层 |阅读模式

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

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

×
CATIA二次开发入门教程---15 通过点击屏幕创建点' \8 j. C9 ?' ~: r5 e3 d
通过点击屏幕,自动创建点, 这里直接建立了一个简单的对话框,通过pushbutton来添加一个回掉函数,函数里面去执行创建点的类。+ j5 Q; y6 p2 m" @8 R" g3 M: x
createPoint.PNG
9 o/ h) O$ E4 s  M
2 @$ n/ Z) v. X) q5 bvoid DialogTesTCmdDialog::OnPushButtonCreatePointPushBActivateNotification(CATCommand* cmd, CATNotification* evt, CATCommandClientData data)
+ Y0 }$ d* l# d( B$ H$ h0 R{
& Z0 h. \/ u' p/ G/ s  // Add your code here
2 X1 g! b  O7 ]/ u8 y      CreatePointCmd *createPoint = new CreatePointCmd();
- B$ A: ]3 G: Y}2 K- L6 A' t) W2 u) o8 v; Y
& X8 @6 p: _6 i
新建一个catia 的命令,名称为 CreatePointCmd ,接下来要做的就是在 action one 里面进行点的创建,代码如下:9 L, U; ^# w0 h# X/ @6 C& P
; h; i# U# h" `- d- s( z# P
CATBoolean CreatePointCmd::ActionOne( void *data )
8 D4 e6 q. d" ~* [$ I7 M7 V. Y{
2 L9 N8 H8 y" s  // TODO: Define the action associated with the transition 8 ]# [4 X3 c& ]) M) S
  // ------------------------------------------------------
. M$ C6 j" R, P6 L, U: r CATMathPoint2D point2D =  _Indication->GetValue();
% U6 |% n  n$ t6 Y! _ CATMathPlane plane = _Indication->GetMathPlane();
  h% |0 s  X9 T2 z4 c: Q$ R CATMathPoint point3D;+ s6 L: I( [* k& {
plane.EvalPoint(point2D.GetX(),point2D.GetY(),point3D);/ w. j; i! o. j) D4 p$ F* b
8 A. h8 p' U! P4 P+ K
cout<<"Point coordinates:" << point3D.GetX() << "," << point3D.GetY() << "," << point3D.GetZ()<<endl;
3 E: O1 r* l7 I1 V; V: Y3 [1 w# r/ G    6 A% |  L& F& ?3 V& N
  //设置Container(非根节点)% K3 k$ P! R; E$ _) q
  //获得Editor' l. Z7 u5 V( L& c9 Z) T0 M
  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();7 S# T7 I+ l; x1 h# @
  //得到当前对象的文档, |& l8 I0 T% I. d/ O
  CATDocument * pDocument = NULL ;
. M  g5 m9 i& u1 T2 u7 q  //取得当前活动对象! {: }4 q5 Z" k4 @4 m
  CATPathElement activePath = pEditor->GetUIActiveObject();
. Q# {% e! e1 v+ R8 w% T" [  //取得当前活动的product
* a# H& ]' e* j% d  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());' f6 U) \; j: j" X, K
  //当前活动对象不存在2 T7 T  E3 [  S( [6 F  x
  if (pActiveProduct == NULL)
! `; S+ Z* e9 i8 {" ^3 u$ _# e7 Z: y  {# `% @; }/ s0 o& ?% `9 e
    pDocument = pEditor->GetDocument();, i) [' f$ R; y# z! _! c
  }( i  I+ i! _. q0 H
  else! y6 [% c/ X$ s6 r8 e
  {
; t7 B1 ]7 {- s5 }! s1 r+ i    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
/ R8 @. F  b# [# N* V6 h8 y' ?    //当前对象的引用对象是否存在! z0 x2 w9 |3 w4 X$ z+ K' l
    if ( NULL_var == spRef )
6 c6 K0 T9 Y- R9 h3 u1 T( {    {
  m& E& ?, B( a; t      return FALSE;
5 E1 e2 K8 l# U. z& _; }    }
8 ?6 V* F: @  q. D- g    //当前对象的链接对象" A0 q, Q, v+ [- o
    CATILinkableObject * piLinkableObject = NULL;& \3 {9 `7 f6 k
    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
' @; P/ W; t; [# x1 H7 Z- A    if ( FAILED(rc) )9 q8 n( q& S8 R1 I3 j. ^
    {% |% ]; ?* M! v8 g% @
      piLinkableObject->Release();
3 k- h* b: y1 W6 i      piLinkableObject = NULL ;3 u1 p" i+ ]6 W2 G8 M2 R$ L
      return FALSE;
  w' M, A' U- V- _& M7 @: t/ @' o    }
6 r" n% v4 _9 c& g8 G) _0 O    //得到当前对象的文档
6 }# I2 [4 h: `# T6 j1 F    pDocument = piLinkableObject->GetDocument();: F" a3 V* B1 t/ a- n
    piLinkableObject->Release();
. q$ k+ m* `/ e5 `    piLinkableObject = NULL ;
* G) B/ e1 a0 S* e    if ( NULL == pDocument)' @% m" E$ w& h' |% m+ r
    {
7 S: L8 a, [9 a* ~' M5 L# T# k      return FALSE;1 Z7 d% r) g# ^8 i
    }( W( E) E3 x4 l# m7 y
  }
( v6 }' h8 `3 L9 B6 b6 ^8 d) l  //得到文档容器集! M4 a3 A! s# w! W( O7 r5 I
  CATIContainerOfDocument * pIContainerOfDocument = NULL;
/ H$ _) J# g8 ~$ g& u. E9 c1 Y  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);
' Q* @' t; g* r4 {; r9 j9 O6 L* u# b; z  if (FAILED(rc))$ Y  L# K2 K& j+ D  l, T
  {
3 @8 D3 X, n8 ]: S8 r    //pIContainerOfDocument->Release();. Q: c  u. U+ Q) q; E& s( M' P
    pIContainerOfDocument = NULL ;# C0 A; G+ o7 V$ L9 ?
    return FALSE;
% D* ?7 J0 N6 @& p  }. m0 M' F2 M8 q+ V* h; ^' s8 |
  9 o$ H0 P8 P6 A, S
  //获得Document
6 E7 |% S8 ?0 F4 u" h  CATIContainer* _pContainer = NULL;
. R6 ~0 h# h6 ]0 L  //获得SpecContainer
$ o) ~) V9 N/ i3 M" Z1 S; x! j$ q  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
0 i% k* U: c- @5 D
4 }$ Q, I$ `5 ^7 q& O; B* X  //GSM工厂
0 g1 U4 x* X" Y& W5 H2 ^  CATIGSMFactory_var spGSMFactory = NULL_var;
8 W! L: z& ]+ {0 w% c, M5 z  //设置工厂  
  ~. s1 D) |' A: }* @$ }- M  spGSMFactory = _pContainer;         ! e- ~8 r- N& R. j
  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(point3D);
7 }; W/ A7 R- X7 X: G3 X  CATISpecObject_var spSpecPoint= spPoint;     : N5 V- l% R3 G; h
  CATIGSMProceduralView_var spSndPntObj = spSpecPoint;
5 y' q3 L' R+ j) |; o9 K$ A! I# q
  //*将点显示在屏幕上% B9 @) |5 m1 G* {. ?" `
  spSndPntObj->InsertInProceduralView();- n# T" n- {. m8 k0 {
  //更新点对象: b  `( A! K9 ]! Y1 w" [
  spSpecPoint->Update();
/ a, K, U5 _; l+ A. c: }& Y
. L& n1 |# [' i" x; ?) `  return TRUE;
) ]( \, m# Y( Q6 W$ F}
( I+ p; I3 ~5 }  y; U
# J7 I5 R+ ?! l# Q6 {& K" g3 a! O# G& q5 E6 {& D9 i0 J
效果如下:* h+ K& S/ t! ^8 k0 [& j( y: S

' {* e! N7 A+ K/ ^( |. X+ _6 G; ^- P! [: s% n" T

$ _2 q9 \: f( d, ^
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复

使用道具 举报

0

主题

1

回帖

12

积分

新手上路

积分
12
发表于 2024-6-12 17:01:01 | 显示全部楼层
  _Indication指的是什么呀
( L. j, w. Z2 [' C0 N' n, w# A/ T
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复 支持 反对

使用道具 举报

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

本版积分规则

在本版发帖
关注公众号
QQ客服返回顶部