PLM之家PLMHome-工业软件与AI结合践行者

Catia二次开发源码分享: 通过鼠标点击创建直线

[复制链接]

2017-4-17 21:56:09 4835 0

admin 发表于 2017-4-17 21:56:09 |阅读模式

admin 楼主

2017-4-17 21:56:09

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

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

x

- L: R$ t% G" I  `, UCatia二次开发源码分享: 通过鼠标点击创建直线
, U7 {2 v! b/ t4 b; V( h# w  {* Q& q' N, Y
  d+ `* G9 ~/ z% V) U1 Q2 y5 r0 v
' u* \2 @! i2 Z! j0 d  B! W
#include "CAARCCreateLine.h"3 B) ]% @, }! {5 I
#include "CATIndicationAgent.h"
, E% S! O: r5 z* y5 k; u  ]#include "CATMathPlane.h"
& z- J, w" I" \; d: j4 y' ^5 D; w% m9 E' F
#include "CATCreateExternalObject.h"! n. e! R* }" H! S9 u
! s" U9 d, f' o& K. M9 G! p6 t
#include "CATMathPoint2D.h"
+ E; |0 w, C" F#include "CATMathPoint.h"
; O% H+ A: c* t9 \#include "CATMathPlane.h"
- A! @9 D$ Z: i, Z, d& _) F
$ t( w$ S5 _4 t" Y5 V& X4 S#include "CATIGSMPoint.h"8 |6 O1 w4 D5 V- J
#include "CATIGSMLinePtPt.h"6 _; \: C- ]  M# X
) f1 {4 `' ^& W% X
#include "CATFrmEditor.h"
: F- l. V3 z7 A8 a# F#include "CATPathElement.h"
2 `7 V7 {0 y4 M' m  E& M- p
8 J4 _4 |5 n6 l# Y* ~% U* o7 {#include "CATIProduct.h"
2 n; J# z/ }3 b5 J. }+ p. _1 v#include "CATILinkableObject.h"  Z; D- ]9 V$ c9 C7 v5 M4 U
#include "CATDocument.h"
' `, L" n* \, U, `4 q
3 I! |+ d: R! S% e+ U#include "CATIContainerOfDocument.h"5 Y1 ]4 Y) y) s5 g$ p
7 z# R  v  ^1 Y- u  P& D: }
#include "CATIGSMProceduralView.h"
  [% U1 n  T. o6 h9 O+ G' n' u$ E0 v+ |# Q0 c2 H
#include "CATIContainer.h"; X0 I, q- t+ t6 i! o# S. D
#include "CATIGSMFactory.h"& B9 y9 ]1 f. W3 m7 X
& F# a( Q) P/ l
#include "CATISpecObject.h", l  h# Q/ l4 Q
CATCreateClass( CAARCCreateLine);: u5 l& b) l) a9 R, R/ s1 Y* x( I
2 Q  \1 M4 Q* G1 i3 A" \( G
2 G. J/ e( \; t1 h
//-------------------------------------------------------------------------
5 t' h3 v% C8 M( @- r// Constructor
- p3 _/ b% ~' D/ c9 Z//-------------------------------------------------------------------------3 w1 J8 w, z, k
CAARCCreateLine::CAARCCreateLine() :
/ t) a7 ?, b2 ^3 x8 ~- N2 x  CATStateCommand ("CAARCCreateLine", CATDlgEngOneShot, CATCommandModeExclusive)
+ q6 U! L- {. r* i! F9 {; N, b//  Valid states are CATDlgEngOneShot and CATDlgEngRepeat' b+ U8 A! {' g9 i' j& W
  ,_IndicationOnePoint(NULL),_IndicationTwoPoint(NULL)  _/ }0 n, ^6 H  W9 U1 \7 _
{
+ B2 ^4 Q2 Z* X+ d* ?, ]% F' v}
7 `+ D( @. _, g7 u4 M% O
6 N: Q$ d) q6 ]- a/ A+ ?//-------------------------------------------------------------------------
1 p; q' n* q9 h- f// Destructor/ |/ z+ T5 Q. i$ C
//-------------------------------------------------------------------------
# d) r7 K9 L4 X0 y! f8 {3 dCAARCCreateLine::~CAARCCreateLine()& y, H0 u+ F6 s& H, c
{
) I4 A$ J9 a. D0 N: o' O4 B   if (_IndicationOnePoint != NULL)
$ _% M5 ~) ]7 V$ Y9 p5 r& u      _IndicationOnePoint->RequestDelayedDestruction();/ U  B# u) @8 K0 H  Q
   if (_IndicationTwoPoint != NULL)
  d: C1 j; m8 h; s     _IndicationTwoPoint->RequestDelayedDestruction();7 S: w% P7 Q% U5 [
}9 S% y& j2 W5 |, ]1 F2 `

& _$ t0 d9 i- \  d4 [# a- e7 A6 i! F1 D+ W; @$ W
//-------------------------------------------------------------------------9 Z! ~+ R, W5 c1 K$ [
// BuildGraph()/ i! v/ ?/ h$ e; ^. l& z- V, K# N
//-------------------------------------------------------------------------1 j+ `/ O% }/ [( w3 h! u
void CAARCCreateLine::BuildGraph()
! Z& g  U, O+ C* R% A{6 P6 h! i& y1 U1 R% a4 P" E; m

  s' ^! j4 @4 d& ?$ `3 n
' F% w6 L( _0 L* _( K  // TODO: Define the StateChart
, [, ^: y; G: v9 N  // ---------------------------
" T% C' a6 Q# C2 X: d& I# L2 B  _IndicationOnePoint = new CATIndicationAgent ("IndicationOnePoint");$ X% N$ c+ c: V
  AddCSOClient(_IndicationOnePoint);
8 }# }, Y# |; M- v2 o8 k: M3 z/ l4 z- a  r/ q) Q/ l5 F+ G* r
  _IndicationTwoPoint = new CATIndicationAgent ("IndicationTwoPoint");3 x( i: ~4 i5 _) O! Q0 E
$ c) l: c1 ~# @' A3 s
  CATMathPlane PlaneXY;: i2 C+ e4 r0 G: C; |
  _IndicationOnePoint -> SetMathPlane (PlaneXY);
1 P8 y2 [6 _$ g' H7 G3 l  _IndicationTwoPoint -> SetMathPlane (PlaneXY);. N0 |6 c( L* e8 ^- ^: G; B
8 k6 _, ?3 B- ~1 R# i/ d, b& U/ N& I% p
  CATDialogState * initialStateOne = GetInitialState("选择第一个点位置");6 v1 T4 f2 `, j; v: ?  b# v5 t1 l
  initialStateOne -> AddDialogAgent (_IndicationOnePoint);% J+ {4 ~# T* c' f* W7 e# _: R
) e* a) m' B) H; H+ D0 G( l
  CATDialogState * initialStateTwo = AddDialogState("选择第二个点位置");9 p! f( ?( ?3 p( E4 f
  initialStateTwo -> AddDialogAgent (_IndicationTwoPoint);
  f: i( b7 T: P9 \/ Z
! ^" a7 G. ^  x1 z/ B6 ]  AddTransition( initialStateOne,
" t+ W! c$ U) L# n, j                 initialStateTwo, ) }  w" o/ c9 H( A% H
                 IsOutputSetCondition (_IndicationOnePoint),1 Q' k  U" }9 V5 u; e/ E4 [3 [
                 Action ((ActionMethod) &CAARCCreateLine::ActionOne));- s3 V/ P! q$ M" h! i1 t( l

4 {: w6 Y% S" P8 S( C$ P- S, Z0 Q4 u7 _  AddTransition( initialStateTwo, ( X' |/ v7 x/ d. U6 i7 n
                NULL,
. d9 v" C. T8 L5 k: }6 S. z; I" }" N                IsOutputSetCondition (_IndicationTwoPoint),
/ h3 p! N; X( O3 f" j' X( S- Y5 S                Action ((ActionMethod) &CAARCCreateLine::ActionTwo));% ~9 r3 @0 [4 D) A1 ?! R+ f
}& Z$ D" s" d! ]9 i; ^

( p- y& p0 @3 V$ p/ \9 c' v2 M- u6 l# j8 w: X
//-------------------------------------------------------------------------% k0 j4 Q' ^6 t' E7 B5 b7 i
// ActionOne ()
4 I5 o8 t6 P) q- ?1 M4 F! E1 U//-------------------------------------------------------------------------
& i" i1 J2 {" j0 b3 xCATBoolean CAARCCreateLine::ActionOne( void *data )
! p6 h* C+ O6 |: J6 @: k5 O+ j: \{8 {) x, r) I/ M- d
  // TODO: Define the action associated with the transition " k( t" r4 x* s: C7 h9 s* D
  // ------------------------------------------------------
# d0 K# z3 X( f1 o' x9 ~8 x  CATMathPoint2D point2D = _IndicationOnePoint->GetValue();//获得一个2D的点- J, Y) y1 J" e: d
. [' N  }' h0 Q; C% N3 h9 o
  CATMathPoint Point3D;$ E! O& E! r' t6 O( H6 S' V9 ?
  CATMathPlane Plane = _IndicationOnePoint->GetMathPlane();
/ M% K" u; p; l5 J
- `# [4 g* E% a6 s) m- V  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点
% k' f: n' B# X4 B/ h5 |! O" t8 u, ]+ s* q* S; I
  //设置Container(非根节点)/ w  D1 {4 S$ a) D* r
  //获得Editor
8 s' j( `: e$ A6 d  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();; F2 ^: `) j2 Q! ^) U
4 e3 o% ]- L  p* ?1 `5 C0 K) f
  //得到当前对象的文档% t& s2 e: V" S
  CATDocument * pDocument = NULL ;
. m4 ?% r5 c5 c- n' z" C1 D2 t. P$ a0 v- b8 U8 i# }! c) D
  //取得当前活动对象
1 X" N! j* e1 I/ s8 x& v2 S  CATPathElement activePath = pEditor->GetUIActiveObject();% E0 R7 G+ p2 P6 N) t
  f6 p3 e; I" `3 L9 f+ m# F
  //取得当前活动的product
0 j9 M0 {( z  k) A. t. q3 v' X% L  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());! ~$ p8 a6 c2 a1 M7 h& @' m7 X

* V* E+ E6 ^7 `  //当前活动对象不存在0 J. l2 }3 O! e
  if (pActiveProduct == NULL)
& C/ s; N$ n. X2 P+ e- l  {# f2 B* S9 U  ]- R
    pDocument = pEditor->GetDocument();, z) C2 r( c5 ?
  }
9 J( w" O; \1 D4 t$ ?  else, u; u) G0 J* A) T! }1 y1 T
  {- w& `' |9 c: A9 _, j) Q
    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
' X3 _6 z! k( t* j" A' x/ ]- v    //当前对象的引用对象是否存在
7 t6 [1 y  ~8 V0 I    if ( NULL_var == spRef )
; m: P- ~$ Q& H% g  L# h7 @' t% s# T# k' Z    {4 q5 r" ]6 h$ J5 s) G5 k
      return FALSE;+ v$ D1 ]; g# R) H1 ^
    }
# v+ H# A% O/ x' n* `0 w5 v2 x" W* x9 e  i, `6 {1 i9 X* x6 G& B
    //当前对象的链接对象. R/ e! x7 W) o4 K2 Q4 I6 i9 g! D" v8 g
    CATILinkableObject * piLinkableObject = NULL;
" A4 W5 p2 Q$ d. s% F    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
) N' _: r' d  L8 K, c3 L2 }    if ( FAILED(rc) )4 N( X) j! v8 p7 I$ k0 Z6 a
    {
& w, G; j$ E/ I" M. b      piLinkableObject->Release();
5 [, b: S& R$ a9 M/ A, k      piLinkableObject = NULL ;
7 i- g2 b* K/ J( c) P  V  l9 X- C      return FALSE;
+ f/ F8 Y$ |, Q7 ?! n6 x    }
: y1 S) P+ G7 G1 A+ n  u, e/ V! A/ @& d) x3 N  g) \
    //得到当前对象的文档8 [5 X. R( l# }' N' }
    pDocument = piLinkableObject->GetDocument();! D2 m2 T8 S8 T5 }# r7 \' k
    piLinkableObject->Release();: x- r8 Z$ v- `& j8 k# _- b4 `
    piLinkableObject = NULL ;
, L" p( b: Z) ]* ^
3 e# w% _; Z3 T- {3 q% P6 N' ^5 P    if ( NULL == pDocument)
: i( N/ K3 z0 m* E& q0 _! y    {
" Y; [9 B3 @3 O: r. R# g      return FALSE;, Q0 a; W7 `# A$ N! V8 j
    }, m) B% H( l& z3 ]$ v" \! b
  }
* P9 o  J- n4 G6 [/ }  V; y8 c& i) \) d0 m( Y. D
  //得到文档容器集
/ z. [  U$ R* n( A3 K  CATIContainerOfDocument * pIContainerOfDocument = NULL;& l2 O1 q! W; O8 Z; u
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);
3 L( ?2 e0 `& d9 `- x4 X  if (FAILED(rc))
6 T7 V5 w6 U2 h8 M5 M* `1 `; G; H  {0 A0 u. w& H1 Z6 w- Z
    //pIContainerOfDocument->Release();8 q) N' W) g! t: P) {1 |2 Q$ W
    pIContainerOfDocument = NULL ;! K, \5 y7 x4 T1 {# B
    return FALSE;3 g" |2 S: `: s& b: f
  }
0 w0 N/ S* F' @" k
* c( M! J& W6 h9 W8 a, a  //获得Document! h7 W1 Y6 F# B
  CATIContainer* _pContainer = NULL;       
2 U4 {( y; Q5 Z; H8 V2 |( P  //获得SpecContainer
( l2 W  Q4 _+ s6 a' C8 h  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);9 Z2 ]; o" g8 y7 T$ o- j; H
        " m+ ]) k2 y/ R# _
  //GSM工厂1 F3 w0 B$ h0 o6 u8 T: B) [% r! O0 A
  CATIGSMFactory_var spGSMFactory = NULL_var;4 A% o. u/ d% K, p; U) O6 n
  //设置工厂               
1 M  `( P, Q3 @1 I7 q) I5 q  spGSMFactory = _pContainer;                                                                       
% y& V6 m+ Z3 O! F+ @4 D0 R. `. v' {5 I" ~& d4 B3 U
  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);# Y( h4 p* i1 z% w/ k, K- f# i. g

. K1 k5 J9 x" s; a" N* J  spSpecPoint1= spPoint;                                       
6 z& b& ~) J' D  Q+ \" A  W4 q2 o# q* y
  CATIGSMProceduralView_var spSndPntObj = spSpecPoint1;
5 q4 E# g# a% T) N  q
) T1 l# |& p% i5 [  //*将点显示在屏幕上
3 o8 m% S8 S" \1 l2 d  spSndPntObj->InsertInProceduralView();- D4 k" `; n$ F  R' k
3 P* C5 r$ |) Z/ J# J- l
  spSpecPoint1->Update();' |# f5 n9 y1 p( ]( i) [6 @

* l. W& _5 N+ z+ }" Z  l  return TRUE;
" J7 ^9 F  J- \4 @3 X3 l. z}- d1 R- v0 E2 N4 H& l' X

7 n" }+ G# b6 R. z//-------------------------------------------------------------------------
2 G! r( A2 g2 a4 t" g// ActionTwo ()
' Z. N. F& C1 _: o8 V5 G+ o! T9 b//-------------------------------------------------------------------------
5 E5 I: O: w2 BCATBoolean CAARCCreateLine::ActionTwo( void *data )
$ E6 E0 I4 N8 ^, g* E3 R! Q{
' R% q2 l6 O( }( c. h* U, r" _  // TODO: Define the action associated with the transition : T3 F: j7 o! X
  // ------------------------------------------------------" j9 u. i# t0 m) P9 m0 a
  CATMathPoint2D point2D = _IndicationTwoPoint->GetValue();//获得一个2D的点! L$ K' F) q- n7 q1 e

% i; q7 T& H8 ?; I; O! y- D' U: C  CATMathPoint Point3D;2 A, M: R9 ^% X- l
  CATMathPlane Plane = _IndicationTwoPoint->GetMathPlane();, Y5 z9 }2 S5 k$ q+ x/ [: e) I4 X) Z6 _

$ U  f/ D6 C: F  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点, b9 ?: `5 Z8 T2 y  K/ G
3 @- r; Z! J) u! c9 G( N
  //设置Container(非根节点); ]9 B6 {5 ^  d1 w) E+ y
  //获得Editor
0 m# m, w7 e/ l; F7 w1 S. F2 v  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
/ [, `+ |0 z! k& H; j$ O* W1 J7 s4 ^# Q6 K1 w4 [( _
  //得到当前对象的文档
# m! S* x+ P. w! }* ]) W  CATDocument * pDocument = NULL ;
5 m9 o. R3 ~; P5 e
4 H* o4 r5 c7 D0 r1 U% X  //取得当前活动对象
8 q, f; Y; z  W  j  CATPathElement activePath = pEditor->GetUIActiveObject();' k! V) F$ x8 S9 y% r# @& Y# K

; v; Y$ L8 Q5 N' B3 J6 G/ {8 H  //取得当前活动的product8 L& T+ x9 `' A4 I% F: N
  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());
' K- E8 y# A! X3 v
2 V) e  s: T- ^- ?3 P) ]  //当前活动对象不存在
* u5 Z0 J4 ^, @1 B& J  if (pActiveProduct == NULL)- o( m0 L& t: ^9 z1 G" o/ b
  {* c$ Y5 R  o4 r% G! R  {2 a9 [
    pDocument = pEditor->GetDocument();1 {; I4 Z' Y! F/ ~
  }( I: X0 s0 [/ _. q
  else5 F, n1 u! \" b0 ]+ Y" n8 A
  {) ~$ L: E& Z  G) q8 Z+ @2 t$ |
    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();" T- U; ?/ G  i) M) l6 A
    //当前对象的引用对象是否存在
1 @) y9 W8 @  {8 N5 |    if ( NULL_var == spRef )
0 N3 w; L! y8 d0 J, ^    {7 z' S$ w2 v2 j! w6 g1 n
      return FALSE;9 y0 |0 P  g) A/ J" G1 W3 J
    }. @9 ?& M, z& C! u0 _

: J6 r$ S6 e  R# H/ H+ Y) b8 A    //当前对象的链接对象% b1 c: D1 o. }5 a9 w4 m
    CATILinkableObject * piLinkableObject = NULL;
/ }, i+ p. Q$ `: ~9 s  C4 ^# G    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                            4 T* _) O6 o* G1 X' N, h
    if ( FAILED(rc) )
: x) Y# ~/ G9 P& m1 o    {
: \6 J$ j& j4 _9 Z- b, u. P      piLinkableObject->Release();9 J4 {1 w8 I( E/ h" S
      piLinkableObject = NULL ;) I" U) ], u4 y+ u0 N& B) ^; v
      return FALSE;  x9 I6 O# H, r) g
    }, _% Q: w' u% k- q$ m
: R! U% v( i4 H- i
    //得到当前对象的文档
  L- Y; g0 d1 d# d* }/ F! B9 o    pDocument = piLinkableObject->GetDocument();3 u+ ]- m4 x7 e4 h* z
    piLinkableObject->Release();, k  s5 j1 H: \4 a; |
    piLinkableObject = NULL ;
$ M- T* ?) Z3 }
+ Y0 X3 j% ]( ?    if ( NULL == pDocument)4 g& w# U$ {4 [5 ~
    {
& w! j9 `5 Y' o4 ~/ {' v      return FALSE;
6 D; n, N. p" k) l. S! z    }
2 A+ k- d  k( U$ S7 n. S  }8 ^+ J: F6 {" v8 E* z+ o  h
/ s0 R2 O; c( H% u
  //得到文档容器集
+ K( W2 b& N5 b; a% D  CATIContainerOfDocument * pIContainerOfDocument = NULL;* }( W6 g% ^5 H! M7 v
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);
  d( ?5 o3 v0 K# `  if (FAILED(rc))
; a& D. _2 K% F. S1 J' @/ {! k  {
3 _1 v" x: w1 ?8 U  p! B    //pIContainerOfDocument->Release();( {7 |9 L5 a1 s3 V  k9 [. y
    pIContainerOfDocument = NULL ;/ w) I, d. o7 f3 b9 }" }! |
    return FALSE;
$ B# M7 G" v4 W# K# U$ ?1 q3 \  }( D. _6 E& q# u8 O5 ?, z7 h# U

0 h$ |9 r1 ~1 ?9 a, m# M( j8 Z  //获得Document8 w. G' x* Z7 l  v
  CATIContainer* _pContainer = NULL;        $ Q% N; j9 D' u+ t* G7 u
  //获得SpecContainer
0 P, r2 ]- Z/ _# Y5 {! M3 }. Q  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);6 g7 F5 W% L% j4 ^
        ( q0 G* t' \2 Q" @/ z3 L/ c- |% E$ Q
  //GSM工厂
; }0 W( S# H) L2 L. d# s  CATIGSMFactory_var spGSMFactory = NULL_var;" S2 W/ K3 L& {# R$ C4 }
  //设置工厂                . A6 ~; Z/ L5 O2 `  Q7 X. }' h
  spGSMFactory = _pContainer;                                                                        . z4 \% W8 ^6 w, Z

, O' E: s7 [4 N6 V0 n: ?* h  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);& g8 {" }; p' U! C( _
/ l/ [) E5 E2 m/ S+ W! f. |) }2 @
  CATISpecObject_var spSpecPoint2= spPoint;                                        : N$ X% ^- G3 f6 P& h/ D7 d

: C7 s9 W5 b" \5 o2 s1 ~  CATIGSMProceduralView_var spSndPntObj = spSpecPoint2;
2 X. N/ F9 T# J) d  {  E$ P4 u1 u
  //*将点显示在屏幕上: n2 O4 o# V+ X" p7 W4 Q' n
  spSndPntObj->InsertInProceduralView();
" O& c: _2 w! P3 T7 W" K$ d! T0 _2 I) V" f5 s/ b2 }- T
  spSpecPoint2->Update();
- t  k. u- ~& ~5 t; |# x8 ^) E& [. {1 o5 a- {! `3 r
  //生成线
7 K( Q  j) a% _# g: }$ o  CATIGSMLinePtPt_var spLine = spGSMFactory->CreateLine(spSpecPoint1, spSpecPoint2, NULL_var);8 t5 Z: {! I) z: x& n' [9 }
' D: ^/ y( s3 L: T# p
  CATISpecObject_var spSpecLine= spLine;                                        , Q) \" g2 A+ F& Q  U

: z' v' {. K0 c% b  CATIGSMProceduralView_var spSndPntObjLine = spSpecLine;# x( Y  o: S0 e
8 i9 }: c6 B: \" c% |' P9 f
  //*将线显示在屏幕上
+ \, ]+ M6 D2 B! Y6 M) u  spSndPntObjLine->InsertInProceduralView();; l, P* i2 z1 |# |

" K% z3 z' p' G' x! @- e  spSpecLine->Update();
% W3 w& p/ {( g, q" O. l* K2 O, |6 c' F  C4 Q! u+ @
  return TRUE;
+ |% n7 t4 k& e4 K3 u}* K- G' @1 h$ M2 `. `$ n- ~& h1 i

+ }5 @. t0 B" p% H6 K, J$ a9 d% J
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 doTeam.tech
回复

使用道具 举报

发表回复

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

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

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

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

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

    我知道了