PLM之家PLMHome-国产软件践行者

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

[复制链接]

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

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

admin 楼主

2017-5-6 13:17:52

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

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

x
CATIA二次开发入门教程---15 通过点击屏幕创建点5 T5 W* `8 \& T, q; d
通过点击屏幕,自动创建点, 这里直接建立了一个简单的对话框,通过pushbutton来添加一个回掉函数,函数里面去执行创建点的类。
7 f$ C" y& H, m0 g% | createPoint.PNG
# T7 B# _1 z, S. }( U
4 ?8 g* Z/ Q' Q- O5 bvoid DialogTesTCmdDialog::OnPushButtonCreatePointPushBActivateNotification(CATCommand* cmd, CATNotification* evt, CATCommandClientData data)1 Z9 [) f' \" h1 A2 e2 I- f
{
6 L/ D% J8 M8 e; C0 C/ u5 n7 b" k( W3 x  // Add your code here
& p6 B$ u* s- b9 S  D      CreatePointCmd *createPoint = new CreatePointCmd();1 Q5 _: a$ `6 v/ V1 z! t4 _+ Q6 A
}
) M; _( @8 w3 t# k0 L  i+ y- j2 {# h- X9 H
新建一个catia 的命令,名称为 CreatePointCmd ,接下来要做的就是在 action one 里面进行点的创建,代码如下:
" T/ i% W# }, a1 j3 ~) M. n) w+ m* q' r+ T/ D0 |  `& \$ U/ S
CATBoolean CreatePointCmd::ActionOne( void *data )
5 x: o/ U2 y  W% @{
+ D! n4 v3 a8 }  // TODO: Define the action associated with the transition
$ H4 C7 z. i+ n$ w/ Q) ^$ t  // ------------------------------------------------------: q; W3 m5 P% E7 w/ m
CATMathPoint2D point2D =  _Indication->GetValue();
" G/ ~0 W  c! P* P2 }, y* f: g CATMathPlane plane = _Indication->GetMathPlane();4 _5 _, G  y; ~7 O8 X
CATMathPoint point3D;, h  \4 s7 w0 }3 s. D8 |, \
plane.EvalPoint(point2D.GetX(),point2D.GetY(),point3D);
7 p8 @% W% W; j% E9 u3 I" T( n% W" |, O4 ^! v( d
cout<<"Point coordinates:" << point3D.GetX() << "," << point3D.GetY() << "," << point3D.GetZ()<<endl;) O2 @$ R+ m$ \3 ^9 m$ a
   
* B5 a! O& I4 P% T  //设置Container(非根节点)
6 ~& ]0 U6 G* }) q9 [+ w  //获得Editor" l9 L. K, [8 l4 F% T
  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
7 D9 H/ \# s; h6 ~8 r  //得到当前对象的文档0 C; r( n% {* l
  CATDocument * pDocument = NULL ;
$ r7 K$ l  A! q# g. P; Y  A2 V6 L  //取得当前活动对象% W) T+ Y4 @  v  d# U" S, x5 @! P
  CATPathElement activePath = pEditor->GetUIActiveObject();
4 j% \3 Z/ H2 x" e5 I  //取得当前活动的product& N* S& ^  s! v3 H4 @2 m4 {  z
  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());
/ \1 q$ ~$ n7 \/ w, [8 c2 H: b  //当前活动对象不存在
9 l3 I* X  K* ^2 o% H3 Y  if (pActiveProduct == NULL)
/ z: K5 ~8 Y: n; e4 F; x6 G: ~  {
- E* C* C- G2 k9 h0 t9 B5 v3 L    pDocument = pEditor->GetDocument();
- E3 X: p8 O& ~$ g  }
0 u, Z2 ^+ e. O) n2 J  else' @' W" K( {. i
  {/ c0 p8 o1 G5 T, }/ }2 E' _6 a! F
    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();& y6 r5 C$ s8 u2 x, [  a
    //当前对象的引用对象是否存在
! b, j. a# Z" B    if ( NULL_var == spRef )' a" E9 [( y, z# F) m& |
    {3 _% N) O) o$ v& C+ u- s6 {
      return FALSE;, M* T1 K- ?& ~, E8 ]
    }
+ _; K- V8 z1 r* J9 F    //当前对象的链接对象
; c: b# w( r4 F' p. n    CATILinkableObject * piLinkableObject = NULL;
6 p+ G& x4 K6 O( o+ g; y; a    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                            5 K, j4 A' r& `  B: D2 m
    if ( FAILED(rc) )5 T' y, E1 ?( ?4 K1 q
    {
- s7 H/ c  X0 B      piLinkableObject->Release();! S% M; o+ a/ K$ P- q
      piLinkableObject = NULL ;
" G% |; i  k8 j, ^3 k      return FALSE;
  W2 Y, }9 G. X4 F    }
1 L' G, H- {  ~  x, @    //得到当前对象的文档
" @$ c" V- W. S4 i2 D" Q    pDocument = piLinkableObject->GetDocument();
. `0 H+ |+ q; I0 b$ t- [    piLinkableObject->Release();
. c) O# n3 t0 @/ w9 g! n    piLinkableObject = NULL ;
6 j. _" s7 Z! A. h  c    if ( NULL == pDocument)
, W0 g4 l3 I% W1 n1 x3 @8 M) T9 m    {- x& d# H4 N' E$ p! N- Z% d* e
      return FALSE;
& ]: A8 y' ^8 e4 g: Z/ A3 n& Q    }
% }  F0 e1 [+ l' R3 g2 _; H  }5 q% f) P8 J7 s* ]
  //得到文档容器集
; f. r" t4 i. l1 F3 Z/ A  CATIContainerOfDocument * pIContainerOfDocument = NULL;3 x- G" j$ A: Q' T5 U
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);
$ T* ?0 [; `$ z1 g" Y6 H- x8 h; H% U  if (FAILED(rc))& G! G+ p% r0 U0 h
  {5 P1 U  @7 _8 J+ Y/ p, g
    //pIContainerOfDocument->Release();
+ ]* ~+ z& ?. J" i$ a" j# w    pIContainerOfDocument = NULL ;  a6 S% e2 r# a$ `' U) {
    return FALSE;, y* M: l' I+ i0 X: V
  }
; s& K& l" M$ o5 d1 M. [8 S  
0 U$ @: T. c0 p# P; W7 d  //获得Document% V5 b* w( a: T5 n" Q  V
  CATIContainer* _pContainer = NULL;
! y* j3 S, @7 \# x  //获得SpecContainer
* q9 ~: j  P0 C  v/ C& e  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
+ S# C) f% _  |3 r  [" U* ~; Y
+ E7 }8 x( G) X: I! l) E  //GSM工厂
7 ?4 T9 c% k0 o( Y/ J% t5 Y# t  CATIGSMFactory_var spGSMFactory = NULL_var;) y8 x$ t' h: ~* j) x% I' d
  //设置工厂  2 @1 m" e: s2 y1 t6 d% N
  spGSMFactory = _pContainer;         
7 H0 x2 P8 f+ A" \- k- t' I+ _5 L  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(point3D);5 e6 v7 A6 v; W" ?
  CATISpecObject_var spSpecPoint= spPoint;     
/ Z( g- H' J/ D0 p1 v) P  CATIGSMProceduralView_var spSndPntObj = spSpecPoint;8 Q9 I! t- \% [3 Y' C
1 Q+ V0 C8 }0 P5 [; P* s
  //*将点显示在屏幕上2 d& _; }5 X2 Y% H3 Q5 A& t
  spSndPntObj->InsertInProceduralView();! D4 w, E7 F! J  e4 ~
  //更新点对象! g, R" ?7 l; e% z- x( A/ J4 M, r) ~- C
  spSpecPoint->Update();
4 p3 i! F( b8 b4 U" O$ S ; `% m* C& \" ^8 {
  return TRUE;( L4 Z; l4 j9 i' W$ k; b5 w4 X
}1 C/ ?+ ~) f8 Z  ^

5 N8 @9 ~6 i( ^/ F
  ]% n# Q! ~8 \  V. R' s# O效果如下:
1 I  x, a2 I3 P6 D5 z5 q$ Y7 ?1 ~2 p4 V& H- c9 A

7 k/ n: s# I8 Y2 ~7 Q% c4 s0 Z# s' ]$ B7 s6 n; X' V2 [4 u
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.diantuankj.com/ doTeam.tech
回复

使用道具 举报

全部回复1

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

onerice 沙发

2024-6-12 17:01:01

  _Indication指的是什么呀4 u% L. B2 \; l! z6 q$ ]  J
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了