查看: 5210|回复: 0

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

[复制链接]

2477

主题

1280

回帖

60

积分

管理员

PLM之家站长

积分
60
QQ
发表于 2017-4-17 21:56:09 | 显示全部楼层 |阅读模式

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

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

×

. i4 l/ e, x  x) X1 mCatia二次开发源码分享: 通过鼠标点击创建直线9 |& Q- T- b. n9 c% f- K: f4 k

* w  F, C( Y# a4 b. Y2 K& B
( _- G% N" R7 H' e9 t+ G5 |! Q1 r. z% u; ]: l
#include "CAARCCreateLine.h"1 m& l7 d! N) [5 f9 j" q
#include "CATIndicationAgent.h"0 _# O4 r7 `5 S: Q) u, o7 Q! M% P
#include "CATMathPlane.h"
* }. i" p  ^% r" Z* m
  W- I; e2 ~- q0 }; x# K#include "CATCreateExternalObject.h"
1 E/ d% k, o+ \0 W! G! {( F" m
$ E' c* U5 z9 z3 }8 j" a#include "CATMathPoint2D.h"2 x, L# S" \$ |
#include "CATMathPoint.h"
( j7 G3 Y6 o  E. c0 w#include "CATMathPlane.h"9 s  [# R4 W& ~, j! I% E

1 s: m( b: h1 P& m#include "CATIGSMPoint.h"
* {" S) ?6 _1 o1 W9 i* ~#include "CATIGSMLinePtPt.h"
, A# Y% L- N' w+ q, ]: `! T! c3 r
6 ?- q% g- r# F# D6 ^& X#include "CATFrmEditor.h"
, \0 [( ^7 j( [% ?7 F#include "CATPathElement.h"
5 H, m' H5 R) d/ }; T. `) m8 M" t; V1 {/ S
#include "CATIProduct.h"
5 h' e. P; b6 p6 B( K4 Z#include "CATILinkableObject.h"6 k- ]: y) R+ G4 ?, F; {; w* `
#include "CATDocument.h"7 k' v0 v" A/ j4 {! |9 y$ u) c8 c

! Q; z; q) t7 p, m, s" N$ _#include "CATIContainerOfDocument.h"; a8 r. \4 |, T5 t+ ?; o6 E8 G+ T
1 ]- @% m8 ]* D0 G3 G6 B: A
#include "CATIGSMProceduralView.h"9 N9 ?) k0 Q, Q8 I2 v' s* V) i
' s" ]! l3 W" E5 T5 D
#include "CATIContainer.h"
" _) Q8 C3 ^0 w+ B* w#include "CATIGSMFactory.h"
7 P  Y% x2 g8 z& g) H6 B0 C+ {% Y5 y( ], T) R0 [; }- l
#include "CATISpecObject.h"
9 K' x+ J" R% L1 d3 KCATCreateClass( CAARCCreateLine);" q  p& g. G) x, h+ N6 \% a
! R' t6 w7 O( \6 T+ I
! e/ ?$ J# e1 ~4 ]8 M! _6 ~
//-------------------------------------------------------------------------
2 A9 \+ n" t* `# s" H! c$ [$ a. }% j// Constructor, D' y  i. i' @2 I/ R( x$ o9 W
//-------------------------------------------------------------------------
3 @& W, W& k% _) @* ~$ M- w; d  OCAARCCreateLine::CAARCCreateLine() :9 X$ F3 b! H9 @
  CATStateCommand ("CAARCCreateLine", CATDlgEngOneShot, CATCommandModeExclusive) ) B$ _+ Q  X! y
//  Valid states are CATDlgEngOneShot and CATDlgEngRepeat
* _3 `  I# N9 D* t  ,_IndicationOnePoint(NULL),_IndicationTwoPoint(NULL)
( Q  M& R( A! ?, J5 C# w+ _0 f{" z% t# m% A' s6 _+ B2 N3 `* g% A
}
, x5 L, I/ d% y% V2 @9 r* J. c- R5 Z7 S, j* a7 J+ O6 H$ [" u
//-------------------------------------------------------------------------; t# |; ^9 G* |+ G( Q# \. s: x# T
// Destructor
$ H# @3 ^( V1 c* _7 h0 G; y//-------------------------------------------------------------------------. `4 i) c/ O% \' `" ?9 L- @+ p9 o
CAARCCreateLine::~CAARCCreateLine()
" E# x0 ]9 t( w5 A{( d1 x1 N/ E9 p6 A  }/ o
   if (_IndicationOnePoint != NULL) : f& f0 ?1 q- X4 U
      _IndicationOnePoint->RequestDelayedDestruction();
& F  v; z6 }# k. s% T/ E" @* H   if (_IndicationTwoPoint != NULL)
; q- ~- d  f+ l" k: ?     _IndicationTwoPoint->RequestDelayedDestruction();
9 y, ~' `6 I: E% F# g}' }$ R+ x( I/ n2 ~$ f/ V

2 ^- j1 m! o: q' \) I1 x/ ^! \
- D9 F$ ]7 T7 j; m( h- h0 `4 m//-------------------------------------------------------------------------2 W- H6 \7 T  r0 C
// BuildGraph()
3 ~( K% O- s5 U  X$ O//-------------------------------------------------------------------------/ M% z0 q9 s/ s' ~0 }7 w3 ?
void CAARCCreateLine::BuildGraph()
0 @  i' N8 k8 K0 z4 S, K2 t{/ v7 ^3 m6 O% _. [4 u

' j: Q  L4 [  d2 O* R8 l, d
6 ^& E% E; B* Y& Z' ?( G  // TODO: Define the StateChart + b/ t, X& x0 b  B
  // ---------------------------/ w: w+ H& t( F$ Z( H; H/ G2 R
  _IndicationOnePoint = new CATIndicationAgent ("IndicationOnePoint");
5 N" O8 O& y7 P( f% F  AddCSOClient(_IndicationOnePoint);
- ~" m: r+ H0 p% e. v5 M* r" l+ g
, O- U$ G& u/ Z  _IndicationTwoPoint = new CATIndicationAgent ("IndicationTwoPoint");# q% w& r* [7 H7 r9 }6 ?( m
- V9 r# o: o# S8 W; e
  CATMathPlane PlaneXY;6 ^& \6 J4 v' ~  i
  _IndicationOnePoint -> SetMathPlane (PlaneXY);
6 v! h( |" P+ w" A+ t  _IndicationTwoPoint -> SetMathPlane (PlaneXY);0 I0 _2 B' `8 w  c: M- A- x
* J! b+ o2 Z& o& ?/ m
  CATDialogState * initialStateOne = GetInitialState("选择第一个点位置");2 Q/ T( |: V+ n. K8 C9 D$ S* g
  initialStateOne -> AddDialogAgent (_IndicationOnePoint);, H! T& o& h- k% ]8 o% j( g4 U# I

( A/ P3 F4 v9 u. O5 a3 x  r1 t  CATDialogState * initialStateTwo = AddDialogState("选择第二个点位置");
8 [6 Y/ a( Y" [" _  initialStateTwo -> AddDialogAgent (_IndicationTwoPoint);( b5 L7 h6 b4 Z7 S

; \4 x2 j  L' u/ Z- a  AddTransition( initialStateOne,
( [5 w0 o; N9 Q2 K- I                 initialStateTwo,
. r; G5 J# [9 M' c' N% e                 IsOutputSetCondition (_IndicationOnePoint),* ?* c7 |/ q3 L
                 Action ((ActionMethod) &CAARCCreateLine::ActionOne));
" q, W2 [5 D' l6 x1 U( n2 [2 ?0 \& O, s  P; u" g- h$ Q5 [- I
  AddTransition( initialStateTwo, 5 R2 P( `. X/ r+ p8 _( J! }! A& C
                NULL, & C; d3 Z) {- \  _
                IsOutputSetCondition (_IndicationTwoPoint),
* l0 o" a, N' E1 Y( m& h                Action ((ActionMethod) &CAARCCreateLine::ActionTwo));" G7 I% D1 J* M& B5 m" u
}
- _% R2 p3 t9 A0 n) b$ m" y. a) a3 c+ m' f8 |  g

9 w3 J+ ~) m, `3 M- @" G* u//-------------------------------------------------------------------------
  l) Q# ?! h% Q3 Y2 Z// ActionOne ()
$ d, U" V6 ?: \- B- e1 @+ L" t//-------------------------------------------------------------------------
7 x: G# a/ l  B, ]! b7 FCATBoolean CAARCCreateLine::ActionOne( void *data )% @- t% v) w5 Q) I, L+ K, U
{. T- y+ j8 U  S3 p% ?
  // TODO: Define the action associated with the transition
0 K; C$ }! f; d6 S0 h4 O0 ]6 a  // ------------------------------------------------------; [! t- _* ?2 m0 J; G# ~3 ]
  CATMathPoint2D point2D = _IndicationOnePoint->GetValue();//获得一个2D的点, S9 d+ o. [- p. w7 n
4 K! [, v! b; c6 Y, ^$ y5 q
  CATMathPoint Point3D;1 Z! a! P* O) _
  CATMathPlane Plane = _IndicationOnePoint->GetMathPlane();0 q  a0 C& o% f- c/ r

! t/ v8 e; M1 m  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点- p7 `  i' i) [' E5 c

6 ]) x$ y9 s8 _' g. i) o6 \  //设置Container(非根节点)
. j  T) K+ c4 K, A$ L. H, s$ N  //获得Editor0 @$ V% t6 R/ U4 F; v1 `
  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
/ U4 P; i5 ~7 R4 m3 Z& \2 ^- I8 F# A: @% y
  //得到当前对象的文档# d3 K& I' W, j* w; J' j. R
  CATDocument * pDocument = NULL ;5 Y" j6 q! y* e% ?
" b6 E2 W' P: @! |* Q
  //取得当前活动对象
2 `0 i6 A4 E+ e8 |* b/ L- H1 Z6 r  CATPathElement activePath = pEditor->GetUIActiveObject();
+ F% |2 H# \$ l' ^$ j" o: M  g7 K  n0 |0 ~
  //取得当前活动的product
9 r+ r0 k) V& u2 }& D  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());0 L7 k7 f7 X& m  e. Y" V( ?
+ d/ ?1 r# t- Z+ Y: i! E( ?
  //当前活动对象不存在% B- W" V: p" G' u: O, y
  if (pActiveProduct == NULL)! S9 x# b$ N# b( b. h0 S
  {# i2 m; b6 D% O8 V" B5 y8 K6 f
    pDocument = pEditor->GetDocument();
4 U* E6 U, B$ I2 K) `, q  }' P  X/ H8 r# P
  else
) R: B9 L" s* z; t  j9 @  {4 V" X4 ~* T" K* P
    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
* l5 o  ?* S- v2 S    //当前对象的引用对象是否存在1 V+ {# z! b: K9 y# a# P  k% I; [
    if ( NULL_var == spRef )
9 X5 J- a! H* V+ Y    {
' n* I9 U# g! v0 [( O# y      return FALSE;
! H# D9 Q6 [& [6 F% m: m; W  X    }# j+ E* H, Z! l6 f( T

9 R: j6 K! J- r! x    //当前对象的链接对象8 S- f/ G" X) c* V7 d% S2 E7 b
    CATILinkableObject * piLinkableObject = NULL;
0 _  C2 R' _5 M/ D    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
$ ^) n. `+ H+ ?5 ]' p/ I0 ?- R    if ( FAILED(rc) )
- i; y# E& w& U2 v6 z" m" I    {7 @0 c0 O1 _) \8 B
      piLinkableObject->Release();
% p( y1 l0 E; i      piLinkableObject = NULL ;
- R% c( g' C3 C) v3 s# g      return FALSE;* \! d/ @8 C* l
    }
2 D  N  B/ }% V3 W+ A1 A
; Z/ {4 L& S6 ]- q    //得到当前对象的文档# w+ I) |# L4 a5 a+ g* ?
    pDocument = piLinkableObject->GetDocument();
1 E" V* `+ r7 p& _8 Z* T, M    piLinkableObject->Release();
0 i- ?/ G% t5 |; A3 F    piLinkableObject = NULL ;6 p8 Y$ b; _) z1 S

" W; B/ `2 V, r. t+ }, }0 x2 L# X    if ( NULL == pDocument)6 q& T8 A& Q- j0 o+ K% d# o
    {+ c; e& b) V1 r) ^3 f; J) ^' j9 J- R
      return FALSE;: e0 |# u. @2 d6 o  z1 {) z' \$ j
    }  \4 u# b9 V- n, R8 {
  }: U' }' T+ W" f

  ~4 z5 k% R' ^' y  O' u  //得到文档容器集
6 ^$ \& m; P9 t; B' G. g: ~9 ]: E  CATIContainerOfDocument * pIContainerOfDocument = NULL;$ d; T& y6 M6 M/ x( I3 V, q- S
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);4 y) I% W9 n1 @2 E
  if (FAILED(rc))
/ `5 Y: ~1 x5 q) L+ v8 Y  D  T  {
$ Q$ V! ^: y3 ~# E# K* O4 [/ K" W    //pIContainerOfDocument->Release();
5 C9 _. L4 v! b; D    pIContainerOfDocument = NULL ;
& U$ B) T, U" e" r8 |    return FALSE;9 X0 Q) \9 i$ f! a3 _, z
  }# f% g; J( V& t4 k, n0 Q) x8 e( P

" G- J2 c1 M3 U1 ^) Q& O  //获得Document
, j: H3 t3 g; Q0 b5 E  CATIContainer* _pContainer = NULL;        : D" c: d* s/ q
  //获得SpecContainer: K* o- }' r4 |% R/ V! w
  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);# j  {) o/ l/ U* R: V$ w  l" _
       
/ m  k' _" O( {. y4 ^( J/ F) U* L  //GSM工厂% b5 u' _7 E1 ~8 n( J  B
  CATIGSMFactory_var spGSMFactory = NULL_var;/ B+ c4 u! N+ C, o4 y. A, z
  //设置工厂                6 w  G2 a7 N4 z# |6 J+ D# P
  spGSMFactory = _pContainer;                                                                        7 p! C* s" O1 X9 G. @
% ~8 A' i1 K8 C
  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);
: O, _8 s& W- H+ h: _* S2 G$ u3 e4 J
  spSpecPoint1= spPoint;                                       
+ f/ _. _3 c8 `6 ^7 |0 Q7 h. |6 L+ g
  CATIGSMProceduralView_var spSndPntObj = spSpecPoint1;: q7 y) D4 Y! T$ V. v) E
% J. E5 s6 |, c% Z. Y
  //*将点显示在屏幕上
. S" i  b- w; L: A8 F+ ^  spSndPntObj->InsertInProceduralView();
. y* ^! z% s  Q0 c" `9 a% h' Y1 W3 [
  spSpecPoint1->Update();
' r2 ^" Y) b3 b" a$ o1 ~5 T; N( Z1 v
  return TRUE;
3 f3 J/ G- j! C}! G8 B8 k( |3 m( o) t0 l! e

! P" i0 z4 `$ |4 C( z2 x//-------------------------------------------------------------------------
$ Z# S' k  i& m; j// ActionTwo ()
8 H% b5 t  M6 O* H1 F  N; O//-------------------------------------------------------------------------; s: @4 X/ F0 {! k
CATBoolean CAARCCreateLine::ActionTwo( void *data )
% S6 [# V, n6 }0 i3 y/ I  k0 j# L{
. I% r/ l% c1 }! V# C1 s  // TODO: Define the action associated with the transition 5 i# i8 A1 N5 ]+ Q- _/ P0 ]+ h- I
  // ------------------------------------------------------
) s( F) V$ f: Z4 e+ S  CATMathPoint2D point2D = _IndicationTwoPoint->GetValue();//获得一个2D的点8 ?2 v" g, X- O, z) Q! J

( F7 L7 v+ l, h+ D( E0 Y- l4 z7 D- U  CATMathPoint Point3D;/ ~+ D* Y" C- d0 N6 r
  CATMathPlane Plane = _IndicationTwoPoint->GetMathPlane();) n# j% K( h* V1 G$ P) C* N$ f
* {- K+ h2 D* }4 @0 a/ D1 b
  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点* K* Y# M$ W* R2 w" |! S" E7 `

$ `4 ]1 N9 O3 n, J9 u  //设置Container(非根节点); u: W0 D* i+ @
  //获得Editor: X8 E, f+ G9 z0 Z4 Z$ V. y
  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();% P9 }; m- K" ^- J% @' f! H

1 C  i8 R7 ^1 J  //得到当前对象的文档
, R9 ]8 C0 e, t/ `$ b" K% t: `  CATDocument * pDocument = NULL ;
+ J+ Q1 K6 O9 F2 R$ G! f! ~" X9 m0 }  s* k+ W7 r( ]1 F1 q
  //取得当前活动对象& z; z# e. Q6 x( c8 z/ W) E
  CATPathElement activePath = pEditor->GetUIActiveObject();4 y7 b) ?( M8 z. |1 s+ h

7 b3 ~6 V( a. R, ?* R- j* U  //取得当前活动的product
5 r" n5 h3 D6 W2 p6 |4 s& }2 L  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());) O5 ]! S8 @2 [5 b2 t2 S
8 t) g/ ^1 J2 ]1 {- O
  //当前活动对象不存在8 ^1 @6 @5 {, b. G) A+ a4 ^
  if (pActiveProduct == NULL)1 Z8 t* V* n+ x- r: [0 k
  {
) {8 v# `' X- P9 o: x6 N    pDocument = pEditor->GetDocument();3 c+ B, I2 D( x: y7 y* i
  }. J1 ~9 x: \) j  _' }1 _5 J
  else
; Z* S" C, A3 ^% N8 H! @6 t  {
, @  W% P9 I( H; x0 d! n    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
4 q1 N) ?, W! e, f* n' m# \* S    //当前对象的引用对象是否存在
# p  N  M' {& Z; t# g! [( {    if ( NULL_var == spRef )
/ I$ r: }! r) u0 |0 ]2 \2 M    {9 S  |" G+ N/ L3 R) E
      return FALSE;
8 i% W! x1 \. @& ?8 l$ J2 }    }3 \7 h/ S6 ?( i" W

" T! s2 v' M1 |& v5 g, U    //当前对象的链接对象6 s. A: u* e0 o* M  j0 h- R
    CATILinkableObject * piLinkableObject = NULL;: ~6 E. b$ _9 b( B# w
    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                            , K, G& \% |. P5 X; V
    if ( FAILED(rc) )9 @. ?  P4 h, i8 Q
    {
7 _$ s7 J8 H: o* E" P      piLinkableObject->Release();; Q6 @2 i  d4 G
      piLinkableObject = NULL ;% e' P5 r9 v- k. q* o
      return FALSE;
/ K/ ~9 C# {# \: X$ t4 V    }
0 H" V8 j7 q+ e% \" p  v. O; U/ d2 `( o! o. c0 K1 w& A! [
    //得到当前对象的文档2 f" z1 u: K) t* C
    pDocument = piLinkableObject->GetDocument();3 Y, Q2 t8 v( O- e5 o; h
    piLinkableObject->Release();: }! U( X5 o5 K/ G2 G
    piLinkableObject = NULL ;
" u& e, s  v) o: ]7 q
  T' |! A) I/ n2 o9 p    if ( NULL == pDocument)+ B2 `. g: H9 w; v& ]! J
    {- R! Y3 U* G8 o0 j9 ?7 V
      return FALSE;. t1 K4 a6 K# P5 U' R0 r/ W
    }+ Y6 N0 C2 K# q; v
  }6 ?7 X9 o- y1 H( P+ z7 O/ R2 j
8 W/ j; N& V, Y) F9 ~8 W; d1 N
  //得到文档容器集
$ |6 B& P8 f+ v7 C* Y  CATIContainerOfDocument * pIContainerOfDocument = NULL;
  |& k  j1 w, W, i2 |  n7 ?7 P4 T  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);- x/ `* F$ W  D( ^$ \7 F
  if (FAILED(rc))8 j6 ^. G" Z; v4 K% ?5 j4 V% J
  {
7 g( v1 G4 F5 }8 k9 F& Y9 }    //pIContainerOfDocument->Release();  Z( V% v  W9 k3 w# C. n  h! ^- Q
    pIContainerOfDocument = NULL ;
7 V8 J7 x" n; `1 o- U9 Q    return FALSE;, r/ t: J# s& ]) M. J8 S& {; ]. N
  }
, ^6 k7 q' o7 b/ m. q) M9 _9 ?' N# F. o( I7 k* ~8 Q) R+ M; X3 G
  //获得Document/ \4 `! b4 K' X) ]. K
  CATIContainer* _pContainer = NULL;        9 m  X7 d: o$ K' F) J
  //获得SpecContainer4 O' b3 A+ @5 u+ c
  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);- }. w& C5 w, b1 F$ C8 e
       
2 `7 T6 [3 i+ W4 w! a8 n  //GSM工厂' M; h0 b# R6 Z
  CATIGSMFactory_var spGSMFactory = NULL_var;- e3 }& G! p' ]
  //设置工厂               
; a& K* z- j" g) X2 b  spGSMFactory = _pContainer;                                                                       
: _. M, s9 J7 O5 S% Z5 n( A8 Z' c1 n7 @2 Z& Y( M
  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);3 m% r, h- J6 J3 T5 X' I

. A1 S. \% j* }/ \! H4 J  CATISpecObject_var spSpecPoint2= spPoint;                                        6 ?% ^8 b8 d: U" f" T
8 _" p% k9 `/ e- L+ m
  CATIGSMProceduralView_var spSndPntObj = spSpecPoint2;5 \6 |) f% c! N% m! I6 [: `
' x  ~$ P7 d1 N2 k! H
  //*将点显示在屏幕上
9 B  B/ X  y+ D# q( g  spSndPntObj->InsertInProceduralView();1 }8 _1 z% g  J& X

* Z1 n( h& D- Y  spSpecPoint2->Update();
2 E) B$ |3 U( R0 @8 |/ s, }( T9 [- J6 ?/ v
  //生成线
( B$ L* O+ J  U5 d+ Q% \; |  CATIGSMLinePtPt_var spLine = spGSMFactory->CreateLine(spSpecPoint1, spSpecPoint2, NULL_var);
+ u" O; E6 h# U3 ]- d' s
- o, P2 d2 ~7 ?  CATISpecObject_var spSpecLine= spLine;                                          }& k4 D1 m  b. h: S  K: L

+ ]; B+ L: I8 H  @' m  CATIGSMProceduralView_var spSndPntObjLine = spSpecLine;9 ]9 M+ d- L7 x6 [) z% _& D* ]# M
! B* |+ W4 Q1 w, @
  //*将线显示在屏幕上
1 y1 J3 @6 n, J. h' _0 ~; ^  spSndPntObjLine->InsertInProceduralView();& m5 r  m/ x8 }1 T' Z' l% ~

7 q2 d/ P* r+ [* }6 M/ G5 r  spSpecLine->Update();" w+ |+ |( y, i- k* f3 {5 a

7 X& `- X3 Q" _) f+ [  return TRUE;( l" N& [! Z8 V9 L& P( u- D
}- D1 F* V7 Z9 A
% C  q8 s# |6 ^
. i  k) A5 f0 [, k% A
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 doTeam.tech
回复

使用道具 举报

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

本版积分规则

在本版发帖
关注公众号
QQ客服返回顶部