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

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

[复制链接]

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

2470

主题

1275

回帖

8万

积分

管理员

PLM之家站长

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

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

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

x
CATIA二次开发入门教程---15 通过点击屏幕创建点
' k* N) W( l$ ]" C: G$ {通过点击屏幕,自动创建点, 这里直接建立了一个简单的对话框,通过pushbutton来添加一个回掉函数,函数里面去执行创建点的类。" d4 N, u+ n: U0 ]
createPoint.PNG $ w+ Z2 B. P5 k
  V2 r3 A. J# |: ^8 h
void DialogTesTCmdDialog::OnPushButtonCreatePointPushBActivateNotification(CATCommand* cmd, CATNotification* evt, CATCommandClientData data)
, J" I2 k3 o, F& q" X( p. M0 ?{
. Q$ E# _, E. `" ~9 w7 Q& o: M  // Add your code here
2 z8 D  X  I+ g3 f+ H$ z9 j4 W      CreatePointCmd *createPoint = new CreatePointCmd();
4 @, V8 U7 `8 T. m. w' X}  ?$ r1 d1 L# S  X
% R3 ]$ j  d  j
新建一个catia 的命令,名称为 CreatePointCmd ,接下来要做的就是在 action one 里面进行点的创建,代码如下:
0 ~. N) R) H+ {0 L3 D  [# w# ?! s) A+ t0 t/ n' v9 a
CATBoolean CreatePointCmd::ActionOne( void *data )
0 t0 y; _# x! i7 r( R9 U% b. g{3 P/ J$ i3 o* N! w
  // TODO: Define the action associated with the transition
+ M. d6 I: p5 l) }9 R  // ------------------------------------------------------2 U; @  @0 }9 _
CATMathPoint2D point2D =  _Indication->GetValue();4 T9 O( r7 n; r
CATMathPlane plane = _Indication->GetMathPlane();5 z; M% ~5 P2 U5 [/ v0 |
CATMathPoint point3D;
' t3 v/ F4 T) a+ | plane.EvalPoint(point2D.GetX(),point2D.GetY(),point3D);
: m7 @0 ^! Z6 \! ~# G& y
! J, f, v, ~9 I+ o: h cout<<"Point coordinates:" << point3D.GetX() << "," << point3D.GetY() << "," << point3D.GetZ()<<endl;
$ Y+ a$ @0 R+ R% w. P% _   
* P2 W% x6 v3 g- L  _/ h, f  //设置Container(非根节点)
. G$ n8 ^) x( o% E; s3 j7 M& {) H  //获得Editor
- O6 L* V6 |7 b7 O  o, l  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
9 D( b3 Z1 Z6 L# [  //得到当前对象的文档
; ]4 p: c8 R6 V: r; z' Q7 N2 z& w  CATDocument * pDocument = NULL ;
6 e' @' e' j8 ]/ e+ ]3 s! E& H  //取得当前活动对象
% _/ _( b/ [* f; |- P9 }5 b- W  CATPathElement activePath = pEditor->GetUIActiveObject();0 a% K1 I; Y5 f% {! n) g# `, _
  //取得当前活动的product
  O2 q+ v. R2 N  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());" [9 G% |: y' h6 I6 j9 i' v
  //当前活动对象不存在
1 \) A# r! x- F; E  if (pActiveProduct == NULL)
! i. s6 p" ^& A& h1 Z  {+ l! _' D9 _9 ]+ H" w. X
    pDocument = pEditor->GetDocument();" A. Z) K1 R# T
  }% y9 s9 ^+ w- K0 h7 F- f( q5 v
  else
5 B0 i% c: I, k* G, c  {6 W) u& }9 E  V) B* w! e2 N9 {& U
    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
, @+ z/ w" H+ V: h& ?    //当前对象的引用对象是否存在
; D( b* C" U) f( @0 K    if ( NULL_var == spRef )& L4 L" U2 h- @2 ?
    {
8 h6 _8 S' D& z- H3 y      return FALSE;
  D. X7 Y1 r. I, l    }
5 x" g" R% e! v4 [    //当前对象的链接对象6 d* ]9 ^8 C. V
    CATILinkableObject * piLinkableObject = NULL;
% H! R& e6 \2 |* g    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                            8 ]* m- t' s3 R
    if ( FAILED(rc) )( D' W  D* x' c8 p
    {
1 T7 Q; n( v0 H; W  Z, {9 C      piLinkableObject->Release();
# T# h, v7 H* z+ e  A. h# @1 C/ P      piLinkableObject = NULL ;
+ `3 q9 }2 A% p7 M      return FALSE;
2 }. [7 e0 n) f& E0 J    }+ b9 V! G5 }8 R* ^: ?
    //得到当前对象的文档, w! |# K! Q4 {5 g, s1 Y9 W
    pDocument = piLinkableObject->GetDocument();
: e) L$ Q3 k9 F7 I) J" V    piLinkableObject->Release();- Z/ A4 S6 E8 i/ O) P4 m
    piLinkableObject = NULL ;" O+ g/ g8 ?$ r3 B1 Q
    if ( NULL == pDocument)2 ^* u% O0 D  s8 w  A1 R% u% {
    {
. @9 N* X; g3 y# _9 p      return FALSE;' p' O9 x* }, k9 v( X3 p; Z
    }
! J5 y! o# Z- b8 R* [  }
7 ?5 [, t0 P, J  //得到文档容器集6 S3 Q: K4 x8 ~( X
  CATIContainerOfDocument * pIContainerOfDocument = NULL;
* ~: p2 E! a1 Q  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);$ |- M0 @4 ?- ^2 {  n
  if (FAILED(rc))6 W1 N3 n. k- P' H
  {
% w/ \& Q- g6 y% T9 R% x) Q2 O, d    //pIContainerOfDocument->Release();
( ?+ T( k' e6 n) R+ l6 r    pIContainerOfDocument = NULL ;
3 t- v6 G4 }. j    return FALSE;
7 @9 H6 z$ \- P# R( W" y  }( `2 W  W" p$ y& p% H7 z
  : }2 p8 E% R+ U8 s& Z8 Q
  //获得Document
; D0 N5 E- u+ F& L- B  Z3 `  CATIContainer* _pContainer = NULL;
+ j8 l& F* \3 M+ X, i/ c& Z  M  //获得SpecContainer* v% _- S& j) r$ c6 i
  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);  Y2 h- n9 ], i/ H/ Z& d5 O

% v* ]! D1 q4 K  //GSM工厂
; c( q( u4 C8 c0 d. H8 V: t% o  l, j8 r  CATIGSMFactory_var spGSMFactory = NULL_var;& @* q6 t5 ~& h1 L% s. F5 ~  N3 W
  //设置工厂  4 z) I) |9 f2 l/ j
  spGSMFactory = _pContainer;         3 `* Z) e7 T/ W+ p
  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(point3D);; G4 o" b% u& R6 s8 g5 N
  CATISpecObject_var spSpecPoint= spPoint;     2 M' X- k  X( d- \( i9 e
  CATIGSMProceduralView_var spSndPntObj = spSpecPoint;
, Y5 i. h% N9 x3 S
/ C" G) ^. x0 p* G! g  //*将点显示在屏幕上
7 x! L# o' \2 E' |  spSndPntObj->InsertInProceduralView();, g0 }6 U  e; d1 m* T
  //更新点对象
, |2 x3 j1 c3 f( t0 U" R& I, v  spSpecPoint->Update();; p! B' q. ~  ^1 t9 l, o) P
! J; B# u# M8 _6 X$ O0 V' g' R
  return TRUE;
1 U0 O! ^9 d6 X* C# h. }' D* |}
1 S0 s( L7 G% S' a, z; I0 o$ v% N
7 l  Q# R9 E# V$ ^% c
效果如下:
6 k8 n, {: ^( A, t
" N8 c1 k" X- f3 C9 ^' N
* W7 ?8 L2 d8 ?5 s3 o
9 E' I8 R! I+ F- Z$ J1 F
上海点团信息科技有限公司,承接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+ b7 i% J) y* @/ P; ^% J
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了