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

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

[复制链接]

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

2470

主题

1275

回帖

8万

积分

管理员

PLM之家站长

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

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

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

x
CATIA二次开发入门教程---15 通过点击屏幕创建点6 L5 Q) J" Y  O7 A. T
通过点击屏幕,自动创建点, 这里直接建立了一个简单的对话框,通过pushbutton来添加一个回掉函数,函数里面去执行创建点的类。1 E" b. D# }% C  J2 N
createPoint.PNG ; l, I/ t' x9 o5 I! g
5 z- S- I7 W5 j4 C6 s  a0 Q
void DialogTesTCmdDialog::OnPushButtonCreatePointPushBActivateNotification(CATCommand* cmd, CATNotification* evt, CATCommandClientData data)8 ~$ u. T3 l$ \2 S) e/ r
{% S! {" v, f  \. k. ~( M2 r0 I
  // Add your code here
! |5 I3 N8 k- e$ A      CreatePointCmd *createPoint = new CreatePointCmd();0 K9 v% t  X- j' w
}
: H2 q- [- {0 L3 b( j# a6 l% |) n' t( y* f4 M- u" |( s
新建一个catia 的命令,名称为 CreatePointCmd ,接下来要做的就是在 action one 里面进行点的创建,代码如下:
- v2 U5 h$ e& V% M: U( K' d: n3 e& W. ^3 U% F
CATBoolean CreatePointCmd::ActionOne( void *data )5 X, T$ ]: @# ^3 P- [
{- A- O1 Y2 B% W$ n, O6 }
  // TODO: Define the action associated with the transition 3 p& m0 [8 t2 T/ E! _: d4 Z+ K! v% n
  // ------------------------------------------------------* t" B& }/ I2 z) R9 w
CATMathPoint2D point2D =  _Indication->GetValue();
- N2 a4 T2 d- P8 `, R CATMathPlane plane = _Indication->GetMathPlane();
  @: V/ A; r* J! g CATMathPoint point3D;1 c9 @) p6 Z- D8 J
plane.EvalPoint(point2D.GetX(),point2D.GetY(),point3D);  X$ ]9 a5 r4 ]4 Z

' y& g) U% R% V) x3 U8 [2 h cout<<"Point coordinates:" << point3D.GetX() << "," << point3D.GetY() << "," << point3D.GetZ()<<endl;
* z. Q0 a' C% \    ) J3 \* ]5 O+ C2 `4 {
  //设置Container(非根节点)7 @3 b! k  l4 q1 n( N
  //获得Editor0 X9 r9 w0 F0 W3 k+ f  Q' r; b
  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
: B( o  m3 A$ _# m" B2 {" l1 g% V  //得到当前对象的文档$ i8 X% H1 u* p& g, j6 I) U# N
  CATDocument * pDocument = NULL ;
& h: E. r/ F( g+ n2 v% ?6 Z# X8 ~+ C% m  //取得当前活动对象2 x) t% v9 E, W' h9 ?" ~
  CATPathElement activePath = pEditor->GetUIActiveObject();1 @7 k. r9 @" g  p
  //取得当前活动的product
7 b$ J( B6 I( r$ a: h: ~% F  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());5 Y; U+ c2 y0 [3 I1 u# g' C
  //当前活动对象不存在
* n3 c* l/ o) F  if (pActiveProduct == NULL)
+ @6 l$ i7 ?! h' B  {
4 {1 b, K+ t  g( C. M& z3 O    pDocument = pEditor->GetDocument();
  z0 K& q3 o# ^5 P6 k$ M2 g  }6 c' O$ l" i2 N( L3 t' A
  else
2 D/ z3 f0 W9 r% U" Z2 }5 U" ]- Q  {
. B' v- _. O3 z2 o9 ^    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
4 h" I9 G/ H9 R7 w# H. e    //当前对象的引用对象是否存在5 l. A( H4 k! o. A- c! ~
    if ( NULL_var == spRef )
: @3 b  ]- ]' a( C    {
" G# {% [3 y' Z8 F      return FALSE;3 C: ?5 E* o" U) z5 [3 z
    }
) r* L2 v) o6 b0 h0 i  k8 f/ S    //当前对象的链接对象) E9 ]3 H7 ~4 S
    CATILinkableObject * piLinkableObject = NULL;, C. Q+ L- s# R- P+ G; |6 P1 Z2 H, Z
    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                            ( o5 o8 I7 r" \2 V: f4 x# \2 P* F
    if ( FAILED(rc) )
8 ~9 f+ C2 i% x, U4 A4 U: q    {
' ~* C2 J% N$ H" Q5 s, |1 u/ }      piLinkableObject->Release();
4 _2 q; D4 _1 \! x1 o8 w8 S      piLinkableObject = NULL ;
7 \1 e0 S+ q' O2 [" L      return FALSE;" l# u9 Q" b, E& @
    }9 N' _: Y# v1 t$ m* a* R
    //得到当前对象的文档) o- M: N+ a: e4 W- N$ Z
    pDocument = piLinkableObject->GetDocument();5 k: g- `, ~& p" `
    piLinkableObject->Release();
& e2 \3 I* m5 G' Y( X1 h$ X    piLinkableObject = NULL ;
1 N; s( h" L2 ]* Z! f) w$ |    if ( NULL == pDocument)
" g, F8 f! u, }8 o/ a    {
, D, f) N/ L; M- {" k      return FALSE;
" r4 m+ _& {2 L    }" r# [- E; @$ O& |- L
  }
, v3 u* E1 i: D& _' l6 X% Z4 R  //得到文档容器集0 K6 p( E# R" a6 Z* ^. u) p
  CATIContainerOfDocument * pIContainerOfDocument = NULL;. ?$ _& I3 \* [- d4 C" Q4 T
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);- x1 Q  n8 R% f
  if (FAILED(rc))- l+ c6 i. {+ @4 v
  {
+ r& x* W) Q2 O: T4 x1 C- k4 _    //pIContainerOfDocument->Release();$ ]9 }  Q- j% {! k
    pIContainerOfDocument = NULL ;6 O/ i$ V& x7 |, p
    return FALSE;
& g2 }8 |& s$ M# @7 t5 |: q) Y$ I  }4 o2 G1 H! f3 A- G. r$ ~
  
& ^% ?, ~/ @  P6 a$ m2 ?1 c  //获得Document0 [% w  N1 L" V# Z- E  s
  CATIContainer* _pContainer = NULL; 7 b4 g9 }8 r5 w2 t3 b/ ~
  //获得SpecContainer  f9 N( e; c- \8 Q7 v' h
  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);" H- ?% A) l/ Q8 D# h
  u/ W: ^* v% y' Y, m- Y$ z
  //GSM工厂. ^$ H, k4 g% J! r' }$ J5 A6 ]
  CATIGSMFactory_var spGSMFactory = NULL_var;
5 E' I: n: P, M3 c& n$ }$ n  //设置工厂  
% X3 M6 L3 X# \) [4 t: H  spGSMFactory = _pContainer;         
. y- ^, [5 Q6 e6 S- I( ]  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(point3D);
! I6 A! f. a. m; j- W6 U  CATISpecObject_var spSpecPoint= spPoint;     
7 ^$ @$ N- M$ B4 U# E, j  CATIGSMProceduralView_var spSndPntObj = spSpecPoint;
/ D5 p# Z8 g) V9 w6 Q' j* G# E2 u8 }# P
  //*将点显示在屏幕上
5 L: E% e4 c+ R( t7 u  V  spSndPntObj->InsertInProceduralView();
8 u0 @+ o: m/ P! T5 _  //更新点对象
: @& J" E1 T) ?  u5 L; `  spSpecPoint->Update();5 F* m* m) ]* n" k- S
  V/ N" B1 k- C
  return TRUE;
, R& p+ h& c  Q0 D' q) u* T}
* [# ~* b9 E+ M, X! F7 `0 _$ l
7 ]' j& o2 }9 e0 u7 E
* E% O; f8 i% ~效果如下:/ h; A: B" B7 [& G* X
7 M& G  x  J+ C' P% M+ W; U

( d" q4 j0 q" A8 P3 S
) y3 Q. r6 B! ~. V
上海点团信息科技有限公司,承接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指的是什么呀
) j$ P$ i# |# @6 j( q5 C2 v
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了