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

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

[复制链接]

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

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

admin 楼主

2017-4-17 21:56:09

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

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

x
* S5 J2 u& V  p
Catia二次开发源码分享: 通过鼠标点击创建直线
1 B" c1 Q. y7 |0 O4 E7 {. b" {6 w' G/ R" Q6 \

, U5 q+ m( U+ G. y+ U
$ Q0 j% B8 ?8 z5 P#include "CAARCCreateLine.h"
! O- Q+ F4 @3 D4 l: o2 X& a#include "CATIndicationAgent.h"' i* a9 @/ n* k6 W# K% T3 N; \* ?
#include "CATMathPlane.h"' u2 }" K( {7 n: J
1 _6 _  o& j9 i' W' q- e+ T. B1 O6 T
#include "CATCreateExternalObject.h"
2 ]/ J- P9 Y: o
- C3 N6 Z( o3 m4 G#include "CATMathPoint2D.h"
8 L* N4 P; ?) o, i#include "CATMathPoint.h"9 S; i' w1 Q( z5 m( L
#include "CATMathPlane.h"
+ ?, r6 s+ B2 D5 y
  F5 Q/ n: E) B, `# Q* q& N#include "CATIGSMPoint.h"& b0 M4 ]) r. h' I1 o' D
#include "CATIGSMLinePtPt.h"
+ Y& I8 A1 m* o
. Z' p" W9 l, u5 U#include "CATFrmEditor.h"" C: s* r, E8 C8 E' O2 z
#include "CATPathElement.h": W4 L* U+ X4 _9 P9 Y! N1 o; f$ }

6 Y: j9 ~5 r, ~& E#include "CATIProduct.h"$ t1 j0 c  p+ P
#include "CATILinkableObject.h"; q" {+ q. z% y3 ~" ^& a
#include "CATDocument.h"
/ d& k) z% a8 X/ ]3 O% Y3 V
1 ]' Q% ]! J$ F3 j0 g% h#include "CATIContainerOfDocument.h"
2 @2 v- }9 a% _3 b. z. S2 t8 Z$ U3 n3 Q
" t0 x  j  z& D  S' f5 w! H#include "CATIGSMProceduralView.h"
8 W; w/ }, H  f: i; Y  L3 I
/ h8 _1 E( o( K& b4 m# i& V6 H% `#include "CATIContainer.h"1 ]+ x% Y( d- x* W
#include "CATIGSMFactory.h"9 }9 X( E, n+ s/ c( e% t0 s
+ y1 @* p# Z# ?  ]! I' G* ~: y
#include "CATISpecObject.h"
6 Q9 v4 H, I, d3 |. O9 JCATCreateClass( CAARCCreateLine);" z" t! ^7 l) V4 L1 j& c9 H
# t6 }' d8 z' w% l7 w) x
" r6 |9 v5 N- c0 h# M% Y: W, A+ c
//-------------------------------------------------------------------------
  S( R7 U5 G. `, m9 |3 ?7 J// Constructor7 {7 ^% P; z- X; K2 S
//-------------------------------------------------------------------------
) u: g8 B7 f% A% G( x. ICAARCCreateLine::CAARCCreateLine() :
* v/ K  Y- @. |& P0 X& w- @& c2 l3 k  CATStateCommand ("CAARCCreateLine", CATDlgEngOneShot, CATCommandModeExclusive) / q( H6 G" x: e. H' R! k% p; n8 l
//  Valid states are CATDlgEngOneShot and CATDlgEngRepeat
0 l0 H7 k5 t2 m: r& L( @9 S: l3 z! b  ,_IndicationOnePoint(NULL),_IndicationTwoPoint(NULL)
3 J3 ^- c" T# K$ G{
1 i6 X- s* T/ a/ X& _' i}! W9 q; A7 ~' u! I3 V7 w* a
! I- d" p5 l& o9 |& a3 X  K) {1 t& k1 S
//-------------------------------------------------------------------------) N8 F& R1 g6 M6 ]9 n* J) q
// Destructor% X& [' E3 S* ]4 i; O
//-------------------------------------------------------------------------+ f4 g) O3 n& j4 R0 p
CAARCCreateLine::~CAARCCreateLine()
, Y! a, @" Q$ A- A9 |( D) S{. w$ I0 ~# m/ t5 \
   if (_IndicationOnePoint != NULL)
9 i# `7 n: B+ `: C7 \      _IndicationOnePoint->RequestDelayedDestruction();1 S# G% O9 Q' e/ b. H
   if (_IndicationTwoPoint != NULL) % J; ?+ K; W# H1 C
     _IndicationTwoPoint->RequestDelayedDestruction();# k! l6 [5 b' c) s* W  i- K4 }8 E
}
, ^! ?2 g) F% r8 s' F) [  A! W
1 ^# d$ |  n- x  p% _, ]% P3 A) X0 U; U# u/ O3 G6 {! [
//-------------------------------------------------------------------------
) s6 B9 C; g5 X8 v8 R; x4 x// BuildGraph()/ @% }+ @, O7 Q" n6 ]4 H& N7 P
//-------------------------------------------------------------------------2 C# V: b7 u3 T- b/ `
void CAARCCreateLine::BuildGraph()  d1 Z, D9 @4 _$ I  Q
{
. S; @( R9 J! |, ^  z. {9 |
* W& X& p' v0 Y# `( g  ~* U
7 g% h9 X: y4 v. L  // TODO: Define the StateChart
" w0 n5 O5 r& p9 P& G3 y, j8 x  // ---------------------------. N- |! P) e3 G( S; E
  _IndicationOnePoint = new CATIndicationAgent ("IndicationOnePoint");0 y6 M% y; _! C! X" ]
  AddCSOClient(_IndicationOnePoint);
2 W" P+ p1 w, E) c' w1 `8 e3 R
5 N9 L4 O% H6 w) f- N& J5 O  _IndicationTwoPoint = new CATIndicationAgent ("IndicationTwoPoint");
9 ~* X; h3 d1 s) H! \# }$ q. ~2 k' v: x% K) L3 c  l
  CATMathPlane PlaneXY;
7 \6 d9 `9 c6 {2 D9 M  _IndicationOnePoint -> SetMathPlane (PlaneXY);
! U7 p/ B0 J& {! B  H  _IndicationTwoPoint -> SetMathPlane (PlaneXY);' B4 r. l* ?: B& r3 O
5 j4 @1 d* K' X$ Y6 r
  CATDialogState * initialStateOne = GetInitialState("选择第一个点位置");
( ^. G4 x* T" J- y7 \8 \5 u  initialStateOne -> AddDialogAgent (_IndicationOnePoint);
  X2 m, M) g) x' }; J8 `
+ M4 T' u/ l$ @1 e) B: w  CATDialogState * initialStateTwo = AddDialogState("选择第二个点位置");
- G% L9 j9 y2 R: Q  initialStateTwo -> AddDialogAgent (_IndicationTwoPoint);
; h% Y$ _/ c: M/ I0 }1 Y
( c% ~4 H2 B" Q2 O% S9 Q  AddTransition( initialStateOne,
% t5 O: O7 `( G4 n9 w$ ]4 l' g                 initialStateTwo, 1 N% {) _- H$ W% s  o
                 IsOutputSetCondition (_IndicationOnePoint),
3 @1 o% u0 Q0 P9 P' N+ p' y                 Action ((ActionMethod) &CAARCCreateLine::ActionOne));
* e2 o1 E( r8 U+ Y% Y( A8 n) P' o+ _! a3 y& Y
  AddTransition( initialStateTwo, ! S8 `5 J3 w: i# w7 W' }8 s
                NULL,
! R+ n! A! v& x6 J1 O' r1 [; L: @                IsOutputSetCondition (_IndicationTwoPoint),  j2 O/ g  G2 ~; b9 p1 M
                Action ((ActionMethod) &CAARCCreateLine::ActionTwo));0 ~3 Y; H" V5 Z9 A8 U
}
  {% d/ V) s7 T& c$ L3 o3 c/ f3 U& _: i, |9 t+ y/ a- J

3 r+ X. k$ W3 |//-------------------------------------------------------------------------6 _# j& ]+ a9 x8 Y  S
// ActionOne ()! S6 D6 k* A3 O
//-------------------------------------------------------------------------
$ R0 j1 U$ Y/ H" jCATBoolean CAARCCreateLine::ActionOne( void *data )( Q2 D0 R6 E7 S" J1 \
{7 u0 N3 H0 X! M% J# B
  // TODO: Define the action associated with the transition
3 n6 s7 C; u! m. q# l4 Q  // ------------------------------------------------------
# y) F" s. d' h6 e9 `6 F8 c  CATMathPoint2D point2D = _IndicationOnePoint->GetValue();//获得一个2D的点
  u$ `( I# \" E) G- V0 K( [. K% [: g. r0 `$ q8 l/ Q
  CATMathPoint Point3D;
+ d' h! n7 x, r  CATMathPlane Plane = _IndicationOnePoint->GetMathPlane();/ U3 z; H5 L3 [8 y( ~, b0 Q

" Y: _2 I) v# Q9 t* t. x( m  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点3 A% ]/ I; W# H4 Q( F) i8 f
: |5 f0 R4 W# b2 l/ h% G. W) u
  //设置Container(非根节点)! O3 I, j4 o% ^# k5 y. O7 G9 B4 l
  //获得Editor, i) `7 @1 Q* \4 q/ p; }
  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();  }+ X! z9 E) [

/ ~- d9 a$ q/ |* u" h# a2 S7 C  //得到当前对象的文档& X  Y! L% ?7 q, }# Y2 ~, Z5 m7 L
  CATDocument * pDocument = NULL ;. }$ ~3 D2 a; t/ x" J- Z: O# |

6 R& b, G( @, S6 L  //取得当前活动对象: `3 s5 D! K9 R; Y, n3 N7 A) a
  CATPathElement activePath = pEditor->GetUIActiveObject();
5 B7 k9 I+ Q0 R+ p
0 V: b0 c  q& q6 p  //取得当前活动的product3 i* J* j8 C' s# c7 \2 m" D0 c/ d
  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());- p8 e. j9 {" j  _: {8 J
1 v2 w! X1 {6 b3 n/ A$ b! a
  //当前活动对象不存在6 D' G: _/ x- N5 j" H/ X
  if (pActiveProduct == NULL)
0 v3 k7 S4 K, ~2 V, F. u. Z  {
# Z, Q/ S6 C- b    pDocument = pEditor->GetDocument();
4 R7 S/ p" t; ]! Q0 R9 z  }& ^% [5 K, h) F7 v: m
  else
; @/ F8 X: U* R. V; l  {
7 Y& g8 y/ t3 m0 m; a0 t    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
+ O  {8 B/ u; ?5 N5 i7 C& L    //当前对象的引用对象是否存在
$ U1 G- c4 m3 J0 z6 F1 i7 p: K2 K2 ~5 g    if ( NULL_var == spRef )
; x3 t) U/ l- \9 |    {
+ c" T, f- ]0 M5 t- ^. U+ D      return FALSE;) A" f3 T, g) p- s- h& r+ v$ ?
    }
" M# f! ]5 {/ _4 m* d* x8 E3 Z8 U0 r! j
    //当前对象的链接对象/ M2 |7 d- ~: }
    CATILinkableObject * piLinkableObject = NULL;9 H! B# h# b% }7 t1 e9 u! Z; O/ J9 k
    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
" c/ i, f9 W6 H2 t, T/ L, F    if ( FAILED(rc) )$ _( \& ~% I" k5 S, I4 ~5 I
    {3 i4 ~6 A% i- c
      piLinkableObject->Release();
# ?% o$ w8 h6 v2 `5 C2 V      piLinkableObject = NULL ;0 l9 N% u; L  R2 y" [+ U6 G' \4 d
      return FALSE;
; s( b; A" v1 N5 }( {( v" q    }8 @- r: _6 u! O$ P
+ t0 @/ P9 q, i) i' {1 n7 @
    //得到当前对象的文档
) I" g2 ]& I% d    pDocument = piLinkableObject->GetDocument();
' M: I% B0 a( a% }! ^7 n    piLinkableObject->Release();; R% `5 p; w' w% Q
    piLinkableObject = NULL ;! j7 ~6 @$ S2 D' x" f! N5 J" ]

4 e8 X( h7 e6 q+ }' z5 K% G% _& Q/ ]4 o    if ( NULL == pDocument)
7 Z& U' W; h4 k" b" M6 ?* q7 C4 A0 d    {6 o7 f6 g$ G/ T" ^2 G
      return FALSE;
5 u0 p" H% P  f8 ]5 @6 q    }, x' q) ~1 I) [" Q" l7 H0 u3 U
  }
3 A* m1 X* x4 h% M7 @5 p  O) D; w; z. J6 F9 b6 {6 Y
  //得到文档容器集
6 k3 B: e9 ^1 w) ?  CATIContainerOfDocument * pIContainerOfDocument = NULL;1 |: b  ]0 Q. j4 G! }7 B) l* b  P
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);
* c3 _7 z# f- Q+ E5 Q  if (FAILED(rc))8 E0 J& f# G/ B2 a: {$ y0 B
  {( D% H6 ~/ v3 H4 L# K
    //pIContainerOfDocument->Release();
( \' y; j  K7 T4 |    pIContainerOfDocument = NULL ;
( g" L0 r. J4 h) Y4 \    return FALSE;9 A7 p2 Y! [# N5 @4 w
  }0 P( C& b2 h9 B! v& }$ k% m

7 f5 ^/ A( E) C5 I! Y( o/ P% K) x  //获得Document
5 c- b7 Q% M& o" o7 M* T  CATIContainer* _pContainer = NULL;        7 [" `- U* \, t7 h- `
  //获得SpecContainer9 ~* Z$ _7 Q/ Y: h5 D$ g- C% z
  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);+ {3 X) c4 Q) `9 Z3 u: o3 v
       
! A8 {: Y5 c1 x5 K" o3 ^7 L  //GSM工厂
9 Z  A" w% z$ o# k& w1 ?  CATIGSMFactory_var spGSMFactory = NULL_var;& Z9 K6 j. _  ?: Q
  //设置工厂                + Q2 C$ L1 E9 l4 [$ |1 m
  spGSMFactory = _pContainer;                                                                        / z6 C9 [( \  z( {* H! Y
- c8 a4 B  w+ F. k3 H# d! m6 F
  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);' d" z6 R: v  P* o
% M: |& f3 ~- y" y
  spSpecPoint1= spPoint;                                        1 W" `$ Q/ e- H' U- r/ b

  M9 h$ N2 M& j* i  CATIGSMProceduralView_var spSndPntObj = spSpecPoint1;
( U5 B. x, A- y, s# \$ Y3 V
) E; p1 J) k7 O" X  //*将点显示在屏幕上$ c9 ], r, j8 Q) i; A# ~$ t# F
  spSndPntObj->InsertInProceduralView();6 s0 q7 R7 j# [- e& ?( @7 Z
" f, f( j- }" t$ \3 N' K: o
  spSpecPoint1->Update();
) X7 ]4 O+ n/ [) O# D9 I% D: L1 l3 Q7 i. n+ w. K9 D. d8 K
  return TRUE;
0 b0 K8 H' }8 w: K5 n}! M# g& O% P, W1 o' L; Y: T, N7 N
. H# a* l# P+ R* I! k
//-------------------------------------------------------------------------* c7 C0 g( f. d" g  h- S- e5 v
// ActionTwo ()' Q- v: a7 E7 d4 N) @
//-------------------------------------------------------------------------
1 `- ?4 B( n+ m) r) {) UCATBoolean CAARCCreateLine::ActionTwo( void *data )* M. B6 o; E8 G0 v' M) c
{
- i$ x* o/ s+ B/ `; ^% w  [) `  // TODO: Define the action associated with the transition
( |/ p  b( o1 t5 K5 Q: C$ g- q  // ------------------------------------------------------
1 v" D( j5 Y* I+ J0 k8 X2 Y  CATMathPoint2D point2D = _IndicationTwoPoint->GetValue();//获得一个2D的点" C1 ]' K. t& S' @8 U, {, b

$ F" {% N' G1 N* D4 l8 b  CATMathPoint Point3D;+ K. A( n1 z/ ]9 W0 n9 d: t' U8 t1 \
  CATMathPlane Plane = _IndicationTwoPoint->GetMathPlane();
0 r/ ?& O" O/ X, W1 d# l; U! F% J6 E' i* T1 g
  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点5 {; N' S6 h) G4 N

% I) @" T" c: q5 v  //设置Container(非根节点)
! @/ @3 O: g2 C$ J  //获得Editor) I/ [4 o+ I% p& m
  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();$ q# e$ }2 A2 v) M6 y& V& r* e

, z3 @$ j  j0 D8 l% _/ n8 W' P9 }  //得到当前对象的文档" U9 L. J2 d- b6 F$ k& A4 Q
  CATDocument * pDocument = NULL ;
1 @3 F4 J4 }0 `) J$ R* Y! s+ `' @  w% t6 P  o" [; W
  //取得当前活动对象
1 K. C" N2 f: ?! B  CATPathElement activePath = pEditor->GetUIActiveObject();+ t1 M' `0 v2 A* a9 |. W) E, m( L+ ~

; H2 N* O4 A9 u, Y. J+ c; T/ i  //取得当前活动的product
- A, X% c0 b, b2 @, K% {" M  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());
) l6 P8 U0 i' x$ R$ n' @+ j2 F& o1 s, h9 ]: t  |; k9 u
  //当前活动对象不存在, g: ]5 ]9 i  W7 V
  if (pActiveProduct == NULL)
2 h3 D" j4 S0 S# F4 N8 n- x( J  {' |5 U1 H) N- m
    pDocument = pEditor->GetDocument();
2 K, X; ]" q5 Q& f  }
; N  ^/ u) C9 o  else9 u% o# C: E. [7 |+ b/ b
  {( R- r, Q% S5 q# r1 P' d+ K
    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
  T  J; W  ]) [3 @0 d5 ~$ X    //当前对象的引用对象是否存在) [5 F+ @9 O3 r5 I
    if ( NULL_var == spRef ); e9 n! Z9 |  W5 i
    {
: Q- A( a' ]# u" M; ~. P      return FALSE;) |8 l! H2 M/ F" ?( D; X
    }* |; ]: q8 L/ q" [, }, ]

' O+ t" Y' `. ?$ z7 b    //当前对象的链接对象# w7 Q6 S0 Y9 _6 n/ j
    CATILinkableObject * piLinkableObject = NULL;
- u* e( q0 m/ q2 b5 y    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
  B. H2 W8 p8 N" I2 P    if ( FAILED(rc) )
2 |  Y0 C* k' I4 K. f9 D    {
, i6 g! s& X/ G9 W7 P( s      piLinkableObject->Release();/ Z/ ^) ~/ m2 a$ S% n. C, M
      piLinkableObject = NULL ;' S; S( W4 U) f1 w) a
      return FALSE;
2 S6 Z- ]/ k: x2 k/ A    }
1 ?' @# ^3 j" f0 B
" W7 q( Z$ f1 Q8 {1 I% Z! M    //得到当前对象的文档7 L) j6 T$ ~* z( P( C
    pDocument = piLinkableObject->GetDocument();- R0 x: J, v9 A" Y
    piLinkableObject->Release();
9 M* H" Z* \* K. t    piLinkableObject = NULL ;" o  d9 D6 l$ Q0 C  e* ~! [
8 l) V1 V7 O# H; ]; N. [* H
    if ( NULL == pDocument)( [. M+ l; |- C2 c4 f3 T% @7 b
    {* `) t( W7 U5 I
      return FALSE;
0 ^) j* B* y2 P8 B( P  G7 V; k    }
4 X) b0 f! }- i$ A, o7 M  }
: W0 {! c* `  ^. H$ J2 `5 p1 I* l$ b, z4 I3 i% r$ F% o- q, \
  //得到文档容器集9 F& d. M! P- m$ Q0 e% p9 q
  CATIContainerOfDocument * pIContainerOfDocument = NULL;: U4 c6 s/ \8 k) s
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);
9 A6 J2 @" @# T2 s( ^( ^' U  if (FAILED(rc))
$ h  ~8 V. r0 r& [/ B9 J  {
, N) [- F9 _, Y1 @" N( L* a: K    //pIContainerOfDocument->Release();
+ s' F; D, B' H: I    pIContainerOfDocument = NULL ;2 q  A) s' _# U
    return FALSE;
( g8 d7 q5 L; ^  T- A9 ~  }
7 M- G! l4 w3 S& n6 H4 U# g# k9 ~
  //获得Document; c  r6 ]" I+ H- D$ l
  CATIContainer* _pContainer = NULL;        8 ], I9 l2 A2 \& k( y
  //获得SpecContainer9 f# z# ^5 l# ~  z. V6 s7 L; h
  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
2 X6 I9 H; c  l       
2 ]" U! \7 N2 h1 m, j2 X  //GSM工厂
8 p6 G" |; r! }9 O1 v* ?" W  CATIGSMFactory_var spGSMFactory = NULL_var;1 c4 I* b8 L! G( i
  //设置工厂                2 Z( G0 H$ v4 ~  d
  spGSMFactory = _pContainer;                                                                       
( V; @4 ]; Q: v$ L. l$ r6 O. ?# [( G% D% K
  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);2 i* q  E) a# S6 Z
6 K' x) T" `2 i; i
  CATISpecObject_var spSpecPoint2= spPoint;                                          ~3 E. n) E9 E# G' M9 h1 l( t1 C8 W
, q  X" D2 Q, _2 }0 E# C
  CATIGSMProceduralView_var spSndPntObj = spSpecPoint2;. V, t3 w6 e2 `( y1 Y! S

: f# S/ j( s. W% Z8 \2 B0 ]4 ?  //*将点显示在屏幕上+ h# l6 {# k# k
  spSndPntObj->InsertInProceduralView();
6 O& \/ s$ k2 C
9 j/ ?+ g, i7 t6 s1 Q, M  spSpecPoint2->Update();& t* {  G& O8 H/ x: }
+ q- q( P  o2 q
  //生成线
( Y) \* X2 m9 R9 M9 p+ _  CATIGSMLinePtPt_var spLine = spGSMFactory->CreateLine(spSpecPoint1, spSpecPoint2, NULL_var);
  _4 c& w/ X' P% w* V0 ~
0 |$ C+ @& J1 Q  CATISpecObject_var spSpecLine= spLine;                                          t  n) a+ Z) I" g* _3 h- a
( m- C& `' k- n/ {
  CATIGSMProceduralView_var spSndPntObjLine = spSpecLine;
& X1 p( N9 Z4 m" P) b5 S
. D( ]0 c" W6 Y7 _3 h' C* t  //*将线显示在屏幕上
; }: _0 B1 ^! L6 h9 T  spSndPntObjLine->InsertInProceduralView();
$ z) f; u2 S# U2 M: F* J: i8 c" O. J6 B* L
  spSpecLine->Update();6 |, h7 B' a8 W/ z8 h2 d
( l# N) _9 H* s( x/ H# }$ F
  return TRUE;
& `3 d3 d. o1 C7 s1 V  N% @}
7 l$ c9 W* v) j9 D6 j& L- L. Q5 F+ u4 I4 U

( F  ]1 a; Q0 a
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了