查看: 5004|回复: 1

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

[复制链接]

4

主题

3

回帖

46

积分

管理员

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

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

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

×
CATIA二次开发入门教程---15 通过点击屏幕创建点0 o' p- u3 R/ h2 r
通过点击屏幕,自动创建点, 这里直接建立了一个简单的对话框,通过pushbutton来添加一个回掉函数,函数里面去执行创建点的类。
# |4 h$ \2 M3 I* o* e createPoint.PNG
  ]! d8 v7 [. B: o. s* ^% [8 f; o3 \" C2 y2 r0 V
void DialogTesTCmdDialog::OnPushButtonCreatePointPushBActivateNotification(CATCommand* cmd, CATNotification* evt, CATCommandClientData data)& Z  G- Y* r. ^9 ?
{0 F2 H& {' `) D8 u' Y
  // Add your code here
7 D: Q" h& o( I" C      CreatePointCmd *createPoint = new CreatePointCmd();
. w! u5 Q( i* s& _) M, h$ A}
7 u5 e" X: F: a. [5 N/ J/ m& H, _! q2 [* G4 G3 v, g: i+ r. v
新建一个catia 的命令,名称为 CreatePointCmd ,接下来要做的就是在 action one 里面进行点的创建,代码如下:
" ^, T; C3 a% Z! j; N$ U7 C
( ~2 C/ T9 |' W3 M2 i0 M- E+ GCATBoolean CreatePointCmd::ActionOne( void *data )9 D( [) e$ q6 v1 f
{
: Z4 [) @- d6 n* v# U  // TODO: Define the action associated with the transition
5 ^* a- {9 C) o. Z; U  // ------------------------------------------------------
. t$ g% q) F% k( b' m CATMathPoint2D point2D =  _Indication->GetValue();
0 X7 s& P9 u2 u: l CATMathPlane plane = _Indication->GetMathPlane();
7 K6 v: ~6 I. v0 S$ [, ? CATMathPoint point3D;1 w  i) K2 B3 T% [& e8 U, {. W
plane.EvalPoint(point2D.GetX(),point2D.GetY(),point3D);
; `$ C2 |  C4 h! T* g' m3 V- t* Q2 X% N% e3 v& w6 b& c2 B4 j. A' d
cout<<"Point coordinates:" << point3D.GetX() << "," << point3D.GetY() << "," << point3D.GetZ()<<endl;/ V4 r, z6 V( c/ }- S
   
( u% X- T/ V' t' @6 G  //设置Container(非根节点)
8 t/ M& b' C* p4 }0 b  //获得Editor
# X& {* b, ?4 l3 S4 }5 X  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();. b# s% |* ]7 m) p
  //得到当前对象的文档
  w' V% T/ l+ ^: Q$ G  CATDocument * pDocument = NULL ;# l5 O, o0 l  X
  //取得当前活动对象
3 v% M9 S) y4 F  H- O* M* ~  CATPathElement activePath = pEditor->GetUIActiveObject();) C2 B" c! {' j( [/ E( M
  //取得当前活动的product
( @: S0 P0 N$ g" i- ~; `0 I: f  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());  ]* M0 j4 Q+ x  \& g  ~7 g
  //当前活动对象不存在
  s4 o6 R" n" m! H, J9 z# c  if (pActiveProduct == NULL)" T2 g  n) I5 i' F" i/ x
  {" H+ |- U0 S+ q
    pDocument = pEditor->GetDocument();' @3 g& m9 G4 V! [$ r
  }
5 E+ v& h- b! L3 u1 W$ \  else
' V5 ^- l5 B$ c- s1 \6 X5 S  {
" e3 [  d8 ?: U- b    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();' e6 f! B, v" O$ }& P) ^0 U
    //当前对象的引用对象是否存在8 m# X" |5 N$ d
    if ( NULL_var == spRef )
# d- p3 X: Q' A1 Q- K2 E, v, K( m    {; c5 E) P" e* S, U$ T) X9 M& m
      return FALSE;
5 Y9 u* q2 a. m" Y6 x8 i    }
% G) @: g& @7 j% Q* L    //当前对象的链接对象0 u6 q: m2 K+ V# y. F$ U9 x. \0 j
    CATILinkableObject * piLinkableObject = NULL;
: ~- v7 i+ ?8 [    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                            2 ~# P, M9 M. _; t1 L5 e
    if ( FAILED(rc) )
& d; W$ n! v7 g( V/ @* R    {$ P$ G' b: [: v8 \" d
      piLinkableObject->Release();# ]' D% s' {( u. A/ P: X
      piLinkableObject = NULL ;1 H* N( b$ q" n
      return FALSE;
: c/ b, K: g# c; [# i7 Y' k    }
6 {8 C! _3 e! z( \5 r' m" b! f2 a$ p$ W    //得到当前对象的文档! o3 T- f' c: A0 r0 L) z1 i9 J
    pDocument = piLinkableObject->GetDocument();* X2 r) E& M1 X/ K$ \) {' @
    piLinkableObject->Release();% E" r& h8 F2 m; I
    piLinkableObject = NULL ;( R* ^" C6 @) w% u% ?& s
    if ( NULL == pDocument)
. Q6 ?3 e" }* V5 s    {- J1 v5 v9 |7 x  K' F) I
      return FALSE;  P; T- ~; `& q/ B
    }* a$ S& K6 W4 v& T4 E- u6 u) Z7 c: Y$ a
  }
. Z1 L! x  A, J- _" y0 V  //得到文档容器集" b5 ~' Y+ X4 O4 j: P
  CATIContainerOfDocument * pIContainerOfDocument = NULL;. r  c" ~4 E! ], a% d, X5 u
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);( H  m; z8 M* O8 E( A+ W
  if (FAILED(rc))  s$ y) t0 n9 p; M* C# p4 `
  {- O# d/ Z6 o3 S; C% I" H8 ]
    //pIContainerOfDocument->Release();, Y: J% R) j  {
    pIContainerOfDocument = NULL ;$ S  r6 E$ ]( v  x! i% P
    return FALSE;8 I5 U) u$ m" ?/ I0 C2 s2 F
  }
* |8 Z3 O4 e3 h3 F  . K" Z0 m. J1 U0 b1 V. y5 y
  //获得Document
1 X- Y6 @/ _0 {: ?3 \5 q: K/ a  CATIContainer* _pContainer = NULL;
0 j) S; V! x# d/ Z6 g  //获得SpecContainer2 R& q" |. y4 `* T
  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
% M- t& r( s6 P1 u
' [& `, B% w: w4 W. L  //GSM工厂
- s  Y. z, k1 R: z- [. |  CATIGSMFactory_var spGSMFactory = NULL_var;
; O% w/ z& O+ {8 }  //设置工厂  4 v, e9 C9 B6 H- R$ ^# b
  spGSMFactory = _pContainer;         
$ F: x# [% X5 K( W% {  n  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(point3D);
: r& P" ~& @! R+ q# b  CATISpecObject_var spSpecPoint= spPoint;     
7 T" T  B/ d+ {  CATIGSMProceduralView_var spSndPntObj = spSpecPoint;' D8 v) J% P& \& g( R4 k

7 b* O5 v7 g8 U' x, |+ {  //*将点显示在屏幕上6 E/ R* c5 F4 f3 E* a
  spSndPntObj->InsertInProceduralView();
9 L7 ?7 t3 y# {! Q  //更新点对象
; j$ M4 X5 q. d5 @* B# x) j# ]  spSpecPoint->Update();5 t0 P& i6 T% q5 x# q: h0 ?6 c

  c# z7 D2 R8 f# k/ s! `! }  return TRUE;* p1 K4 R$ l3 h1 R7 y0 M+ o; C
}7 m0 K* T" |9 y# z* v* R9 T

2 X5 v( r. B" Z& |) Y2 W
, Q; }. f3 t" d3 P2 }效果如下:# ~( a# i0 ~1 Q" J) }, _

% `  i3 Q8 J8 y7 S; y' ~; B$ R) q' v
- E5 C$ u1 l/ m1 A& Y7 K
上海点团信息科技有限公司,承接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指的是什么呀! x! f2 o* Q% a/ }/ I, d$ G9 M
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复 支持 反对

使用道具 举报

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

本版积分规则

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