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

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

[复制链接]

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

2470

主题

1275

回帖

8万

积分

管理员

PLM之家站长

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

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

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

x
CATIA二次开发入门教程---15 通过点击屏幕创建点
0 s' C4 c' r8 W通过点击屏幕,自动创建点, 这里直接建立了一个简单的对话框,通过pushbutton来添加一个回掉函数,函数里面去执行创建点的类。4 U; B! u' p, _, O
createPoint.PNG # w& g/ _1 P2 D8 {( o+ f( ~  v2 _( ]8 D

5 {- M+ b0 u/ N& svoid DialogTesTCmdDialog::OnPushButtonCreatePointPushBActivateNotification(CATCommand* cmd, CATNotification* evt, CATCommandClientData data)
# T5 U- L: [# g; |. j: ], f  C( m, H{
- V- F4 X, @; |5 E1 w) O" ^  // Add your code here" N* L! q& h3 e" J7 l
      CreatePointCmd *createPoint = new CreatePointCmd();
. e: Z: J( D2 p1 Q2 B: x* q; j}
$ @7 U* H; b# K! a5 s( |, q# [3 H! w( e5 ]
新建一个catia 的命令,名称为 CreatePointCmd ,接下来要做的就是在 action one 里面进行点的创建,代码如下:( y! W1 @8 {. h$ j
; S- u( M. j$ a# r
CATBoolean CreatePointCmd::ActionOne( void *data ). t9 j  _$ \  t- A2 e
{* W2 G5 \6 o/ i& `( `: U  g
  // TODO: Define the action associated with the transition 6 r0 C: o. Y+ l9 d3 [
  // ------------------------------------------------------& s( B1 @* p. q8 _
CATMathPoint2D point2D =  _Indication->GetValue();
. F6 `& g' ?/ ]9 ^8 M) V$ H3 c CATMathPlane plane = _Indication->GetMathPlane();
0 h3 ]* l7 C( q& M8 X$ B CATMathPoint point3D;
, s3 X) r; B) ^5 {' R4 T7 J# @; X plane.EvalPoint(point2D.GetX(),point2D.GetY(),point3D);
& x6 p' e6 {* _/ B
+ y' J* M9 V- X: C! S cout<<"Point coordinates:" << point3D.GetX() << "," << point3D.GetY() << "," << point3D.GetZ()<<endl;
& _1 v: \: W2 b1 H  `    3 ^& X' q7 O$ [9 m; l1 g' ^" m! S. ~. v
  //设置Container(非根节点); W* k6 v  X; p1 ?) |* [
  //获得Editor
# A8 y( R. W6 |  ]5 X, F  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();# ^3 ^2 Y# I, ?5 ?
  //得到当前对象的文档
. a0 u1 n, A( h) E5 H  CATDocument * pDocument = NULL ;
, E5 y1 _4 _, s) U% e1 k  //取得当前活动对象+ s/ v7 {% p! z6 p: D
  CATPathElement activePath = pEditor->GetUIActiveObject();
8 X8 Z* x+ ^! P) M  //取得当前活动的product8 U4 @1 }: c: p9 b* E0 s
  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());1 ?6 t0 }! S, i. ~, Z: G' ^0 b6 M. Q
  //当前活动对象不存在
5 q! H% `1 I% M  if (pActiveProduct == NULL)
+ R" O, y8 m  e( A* N  {. D  G( m6 [( q: L' F
    pDocument = pEditor->GetDocument();
8 P# x- h6 L% [  }
( Z1 S0 N* q& n1 E, D# O9 E  else0 n. W" W" ?" m* R) P* u
  {# s) c  h5 n4 K$ o; q: v
    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();3 O! E1 B: n0 L; @: a
    //当前对象的引用对象是否存在
9 V5 N7 Y, m* o/ [9 ^    if ( NULL_var == spRef )# `9 d- L8 u. Z0 u# u- {6 s  _
    {8 ~- q& |' D7 M9 t
      return FALSE;
1 K' L& U% O0 A4 |- ?$ K5 ]    }
" {1 J3 A$ ^+ G: b8 z0 |    //当前对象的链接对象
* i  m/ ]" `! L6 Q    CATILinkableObject * piLinkableObject = NULL;0 E; q! R6 {( Z$ V/ h
    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
& ~( P9 x, R/ C    if ( FAILED(rc) )( R; h# Y  t& t- p( k$ N! r
    {
6 Z2 C' k1 ^0 Y* @, ]6 c1 u      piLinkableObject->Release();
- Q8 |& J; R2 o. h8 p( d& Y; f      piLinkableObject = NULL ;$ }3 ]# n# H7 ^8 r
      return FALSE;
. C% E& B7 Q9 {8 }    }8 U1 |! W* p, J* v9 r
    //得到当前对象的文档
* w1 L4 A. u& ?0 Z( A    pDocument = piLinkableObject->GetDocument();
' e6 a1 C+ ]* u: C: Z: ?# ]4 L    piLinkableObject->Release();3 |, T9 {) ]: ]9 c) c% O9 J% {' t/ i
    piLinkableObject = NULL ;* ?! t$ Z! `4 ]9 p  r2 x  [
    if ( NULL == pDocument)0 p3 _7 ]. r' ~! a" r
    {9 o. G- y: c# v& H7 t! t. r5 e
      return FALSE;
: [& T# t1 j/ q9 U* m7 t; n    }
4 H+ @  x9 p7 Z; L  }
9 a( z' ~4 X2 C2 ~! S3 m- N  //得到文档容器集
6 c# ]& G, j9 f  CATIContainerOfDocument * pIContainerOfDocument = NULL;6 U; q, `5 W  ~* ?1 {, R- t
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);: a0 t) Q+ c, B+ U
  if (FAILED(rc))
  w. h  O* n! T  {
( ?# _! H! L6 J7 Y3 H1 g) D    //pIContainerOfDocument->Release();
( |! R( K* T. A    pIContainerOfDocument = NULL ;! p' }8 t" p" ]7 H# f8 R0 F
    return FALSE;  \* t2 K: e' V4 t; j) L
  }6 n; i. {! |! j- y: s
  2 x5 o/ ?/ ~1 |0 Z+ `
  //获得Document
, c. `  R) r2 M, Y  CATIContainer* _pContainer = NULL;
9 \: v$ I& R  y+ @' j  //获得SpecContainer
1 F* l* i3 S+ h6 h9 H" ~4 s5 n& U  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
( i0 m9 q" j" k, d ' C- W: Q& A# p
  //GSM工厂3 o9 P! P$ ]# D7 H% z
  CATIGSMFactory_var spGSMFactory = NULL_var;
: i& ^  J5 n1 h; X5 W  //设置工厂  
) c. U+ Y( S* b- g( w8 J  spGSMFactory = _pContainer;         : o+ _& v3 j2 D. O6 A6 \0 H  ?
  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(point3D);
  Z6 ^. O9 J3 E1 E5 y  CATISpecObject_var spSpecPoint= spPoint;     ( r! C. ?5 N' E# ^# t  W
  CATIGSMProceduralView_var spSndPntObj = spSpecPoint;
2 k" t/ T* \7 W! P# _, E) U- j% F( T9 z9 u$ f* D' \
  //*将点显示在屏幕上( T; N3 h" d8 K5 V
  spSndPntObj->InsertInProceduralView();
" q) y0 ?7 |) T  //更新点对象
+ r* {- q5 \' P) N6 Q- f  |  k! ~  spSpecPoint->Update();
' ~( r6 u, v, Z; X ( T# ?- ^8 d4 z2 f1 e( y# j! x
  return TRUE;. b  t: U, W6 M1 m* k! x  ^4 e
}% T# P4 _9 N/ B  @5 c0 Z5 d7 ~

6 J2 p3 S$ ~" ~2 Y( K* k% O3 M; E& R0 s* q- p) t
效果如下:
) d2 o, b7 h' K/ V9 m/ _/ a
6 j7 e* [7 _, M! x) }* `1 o( |9 E- h$ N. L
0 e0 I( s. ~: Y! o" z9 z: B4 l9 z
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 doTeam.tech
回复

使用道具 举报

全部回复1

0

主题

1

回帖

12

积分

新手上路

积分
12
发表于 2024-6-12 17:01:01 | 显示全部楼层
  _Indication指的是什么呀
, W( o, x" e: C4 H! g% E$ D; b
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复 支持 反对

使用道具 举报

发表回复

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

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

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

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

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

    我知道了