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

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

[复制链接]

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

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

admin 楼主

2017-4-17 21:56:09

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

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

x
: Q4 S# S7 q$ M
Catia二次开发源码分享: 通过鼠标点击创建直线
0 c2 L6 C# Z" |* o* c9 G7 X" Q$ c- b, D  H; S2 Q, E, f
& q6 L3 {/ _# p/ f& d! s& L

& `. ]% ]& N5 Y, B$ E#include "CAARCCreateLine.h"" {/ [" _6 _0 e8 n
#include "CATIndicationAgent.h"
* Z1 r. s; _  h* E& B" \% p, Y#include "CATMathPlane.h"9 [2 \6 R* D- I, }3 ?3 r* ]; z3 R& K# x
( s/ A; l2 Y3 c) F( p
#include "CATCreateExternalObject.h", |/ ?- \. `* }( S* c2 Q0 o) L
- w4 ~" k! ^7 h' \  u/ G0 @0 H5 U
#include "CATMathPoint2D.h"; Y/ S4 C9 O3 Q" H
#include "CATMathPoint.h"
2 J1 x5 b+ V  s+ r/ @/ x#include "CATMathPlane.h"# y$ d( @' H. o, t$ I3 c; V3 D

' Q2 z" o$ `% y3 S#include "CATIGSMPoint.h"
, q! W) C' Y2 _% ]#include "CATIGSMLinePtPt.h"
  i. P+ m6 S  S6 I' _1 Z$ S# f: k& r) c' v, L
#include "CATFrmEditor.h"
/ h; c# d! K/ g2 y5 |2 ?5 D# G! l#include "CATPathElement.h"
0 h* `  s- g* o
7 n/ w( G7 e5 J1 T$ s9 N* v( m#include "CATIProduct.h"9 g) r/ \! [2 W' \, z
#include "CATILinkableObject.h"
! V9 `5 g; u6 L- o/ b$ f#include "CATDocument.h"
/ l7 Z6 T; @( P) l6 B" p7 V
! r# i5 F" s8 \8 _- M2 S: D#include "CATIContainerOfDocument.h"
, ]/ u8 h% {. A$ \- b& i9 m( y; n/ l& D% y7 [6 L
#include "CATIGSMProceduralView.h", ]5 v# N7 ^+ D2 j7 c

& H" s% |$ I9 ~) ?" ^#include "CATIContainer.h"' ]) }" E# M3 V$ u  Q# {
#include "CATIGSMFactory.h"
# N5 @! l$ s8 A3 ], c
2 V( E* F. n0 _. w, q7 ?2 U#include "CATISpecObject.h", T9 @3 }9 a% T+ `& r4 X& _# W
CATCreateClass( CAARCCreateLine);: F# ~9 P! _# }' {

0 T7 O0 W. ^8 V( e' H/ G  [
/ V" S0 ]. G. @9 ^! H//-------------------------------------------------------------------------
0 h. ]2 z% t: `) x// Constructor
  [5 \) d; F+ z6 ^+ d/ D# Q- ?//-------------------------------------------------------------------------
# X8 _7 h4 `* w% H1 LCAARCCreateLine::CAARCCreateLine() :/ J+ a, p8 U( x' k8 ?
  CATStateCommand ("CAARCCreateLine", CATDlgEngOneShot, CATCommandModeExclusive)
9 {' z6 A' k7 U% g//  Valid states are CATDlgEngOneShot and CATDlgEngRepeat* h" |% y/ P; C1 T  [0 I! w
  ,_IndicationOnePoint(NULL),_IndicationTwoPoint(NULL)
+ i* h$ c" ^9 _) e7 _{
* C9 G: r# }' @$ k& A  K}0 E* ^# t  `( q8 I

( n2 U5 B1 p2 |9 X; {5 C  x//-------------------------------------------------------------------------
+ R' [! O$ `, z2 ?  Z* S( d// Destructor
  L* N! D7 L+ g0 \//-------------------------------------------------------------------------6 X' Q' q8 G4 H% n6 S/ Q. i8 {
CAARCCreateLine::~CAARCCreateLine()
' b% L9 h* H- B" ^* D! B4 P{6 V1 F" S- |( h8 R9 I
   if (_IndicationOnePoint != NULL)
8 L; O0 \2 M) a3 Y/ q# R      _IndicationOnePoint->RequestDelayedDestruction();
! S  H! M; V" a% r8 h   if (_IndicationTwoPoint != NULL)
0 k; Q) g" X. }. }8 I  R     _IndicationTwoPoint->RequestDelayedDestruction();% w+ a9 e' e( g6 }' Q
}0 i7 f9 T6 X- f$ r6 [' o! I5 M
" e2 z( z' ]6 M. S

9 Q. x2 f& N; B//-------------------------------------------------------------------------6 k0 R# `9 j' Y% e4 ?
// BuildGraph()
  [# _2 Z5 V" }0 ]/ |//-------------------------------------------------------------------------
& W$ p% Q) X" o! j/ n+ u6 U. q3 Svoid CAARCCreateLine::BuildGraph()
+ W% f& [9 v. K, v/ F' U3 i{
# I( x: P; L3 I7 n0 ?3 I
9 ?4 t2 e" O7 V+ L5 r2 I5 t) d. G# L  X
  // TODO: Define the StateChart : J4 _( G% K: j0 z4 h4 c. R, W- u
  // ---------------------------: b- l" C* K% C' s7 g+ z9 P
  _IndicationOnePoint = new CATIndicationAgent ("IndicationOnePoint");
3 [, S1 O9 \% ?; P  AddCSOClient(_IndicationOnePoint);
* W0 r: J+ X! w3 s. W6 p
7 I5 m8 _9 A! I  V) L/ J  _IndicationTwoPoint = new CATIndicationAgent ("IndicationTwoPoint");
3 g9 T) ?" j5 z1 e9 G0 B& g2 `
" F$ t  X1 E  G" ]2 c  CATMathPlane PlaneXY;) X0 S* e  ?& I& Z4 x* A- t
  _IndicationOnePoint -> SetMathPlane (PlaneXY);
  f) j, S. N* q/ j1 |" Z3 [; M  _IndicationTwoPoint -> SetMathPlane (PlaneXY);6 |1 w7 ]- h% W! k; Q
( o, W2 M; G) N: k: R
  CATDialogState * initialStateOne = GetInitialState("选择第一个点位置");
; K' o* |9 C$ M; U8 A  initialStateOne -> AddDialogAgent (_IndicationOnePoint);1 r+ L) B$ C% ?

- f# _/ P  b! B! |- }  f" m  CATDialogState * initialStateTwo = AddDialogState("选择第二个点位置");
2 Z1 i# q  X5 Z. z- R  initialStateTwo -> AddDialogAgent (_IndicationTwoPoint);
# k, M  D8 g* W' n3 B; D
5 O' Y2 s  [$ Z4 x, x8 M' z0 n  AddTransition( initialStateOne,
9 S! D. B0 j4 H0 V4 @                 initialStateTwo,
( [0 K* E7 }" s0 M* n                 IsOutputSetCondition (_IndicationOnePoint),, j1 h% X. T8 V5 G/ X) O5 I! S# s
                 Action ((ActionMethod) &CAARCCreateLine::ActionOne));
6 Q; s5 P0 r4 o! z4 I1 v& p2 G8 J' ?4 j3 n) n5 A; u6 l
  AddTransition( initialStateTwo,
3 k2 E# r0 A" a1 |, v6 j                NULL, . b& Q5 V% ?  |6 S" b7 L1 v
                IsOutputSetCondition (_IndicationTwoPoint),8 R/ `% y- ^% E7 x' V. t$ g) ^
                Action ((ActionMethod) &CAARCCreateLine::ActionTwo));
- S/ P" Q2 P2 T& ^/ ~% K}
  L$ O) }- ^& O
, x* Q8 H! f1 p/ s8 k- u+ R. f8 A. F* B5 |2 w1 E  h# X; I
//-------------------------------------------------------------------------
; a! j4 Y! T6 k  u7 Q8 f// ActionOne ()- X  c; D7 x7 V1 s  M/ K
//-------------------------------------------------------------------------' h# l7 Q& s+ S& g5 p& K
CATBoolean CAARCCreateLine::ActionOne( void *data )* A1 m6 a4 Y& }; W8 v9 P( c. D
{6 w" |. Q& a& t7 Y) c& L8 @# J5 ]! T) P
  // TODO: Define the action associated with the transition 0 w4 K- ^% n" `
  // ------------------------------------------------------# M/ B8 Y2 x# ^* ~& G7 M# Q+ _$ t
  CATMathPoint2D point2D = _IndicationOnePoint->GetValue();//获得一个2D的点. p" i, y: w# t& d/ p! M8 m
3 V* `" R. H. S: ?2 w8 V9 D8 V
  CATMathPoint Point3D;  F2 `2 o9 p. U( i
  CATMathPlane Plane = _IndicationOnePoint->GetMathPlane();
- }6 [+ ~% S: Z  O' t5 N( {: d" p5 g* C
  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点
: ^( M2 K2 c  q2 i
7 d# E& r$ {$ D- `5 \! B0 J  N  //设置Container(非根节点)2 K* q9 W5 s* }/ G2 {0 u- H
  //获得Editor
3 H3 m0 |+ o  N4 m$ r  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
( G. _: l! Y! s  K) |8 `0 n. S/ y6 h; i. \* w7 @
  //得到当前对象的文档" A# `: U( C+ c- q3 P% Q/ k
  CATDocument * pDocument = NULL ;4 G0 k  [& I7 j" m3 D6 W9 T4 b9 k
- u) F  n# \: E) {0 R( N7 {" W! x7 x
  //取得当前活动对象4 M& l, L8 k* H; C/ ?1 ]' i
  CATPathElement activePath = pEditor->GetUIActiveObject();
: g8 _" m2 r8 [' K6 y- ]( u
/ ?  ^6 e& L' b3 D8 d& {" Q+ Z  //取得当前活动的product" G: a5 J/ R. k/ O2 Y
  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());
+ z$ X7 C. B% |% O/ h+ e  E. B: U/ H# c+ G4 d( X; f% ]9 A
  //当前活动对象不存在
: a8 Z! I- _7 L  if (pActiveProduct == NULL)1 n  e3 B- I( ^: M; B/ r4 X& M. s
  {. G2 a, {5 u4 Q# o8 g, y
    pDocument = pEditor->GetDocument();) Q7 A( D/ `0 P# P* J
  }& p/ m8 m, L" s7 O8 Y) f+ W8 L
  else. D9 w) {* m+ _: J9 a
  {, _3 C6 `3 N0 E( L7 f) l  M) w
    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();) `0 V' f3 n5 V/ r9 g, G- l
    //当前对象的引用对象是否存在
' O7 m9 ~9 H1 @; ?' t7 ]# x    if ( NULL_var == spRef )( H5 K4 K3 p+ H
    {5 t7 h# o/ C* U9 d! o1 Q6 V/ B
      return FALSE;  B8 _; S$ ?0 ^$ n, s# G
    }  x% D" n8 o: P5 D% j' q

5 S1 ?% P  f: ~: h4 _9 R$ ?5 w    //当前对象的链接对象7 D' s5 r0 S! _! e8 ~6 Y% g3 ?3 V
    CATILinkableObject * piLinkableObject = NULL;0 }/ Z  k4 M) |8 _  I
    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
' g/ r  t) {  f3 j" Z& j    if ( FAILED(rc) )5 d8 n2 `+ K7 x( a1 @$ ^
    {
' e' Q6 E: y! E      piLinkableObject->Release();
5 T; b' q# q  K0 ^5 ~      piLinkableObject = NULL ;
4 F. ?+ W5 o( i, |      return FALSE;1 N- q! @4 F  U( R
    }' z6 q4 y9 Y& Y' t1 S6 D0 M$ ~: N
; h# K" G) G' _% S. L. ~
    //得到当前对象的文档% p/ u) k( b7 H2 Q* D* Z
    pDocument = piLinkableObject->GetDocument();% O9 m& t! |# T+ U- S( a7 b- {
    piLinkableObject->Release();* Q" q$ Q+ g/ {, w1 z
    piLinkableObject = NULL ;
# I- m+ a1 a- j6 q& B% [1 @8 R4 s6 x& [
    if ( NULL == pDocument)7 f; X6 R2 l4 X, a
    {1 g' h+ R, B/ p4 a, d, K" K$ i. U
      return FALSE;
. x6 l' p' X9 j! L    }! u' m! D+ k7 p/ I) }1 d3 b
  }) \$ i4 r0 R7 W# t
3 C; r3 e4 r3 t; z  H! c$ v8 |
  //得到文档容器集
7 {' @& f9 c% W7 z  CATIContainerOfDocument * pIContainerOfDocument = NULL;, l. T2 i( G( t! E) S
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);
7 X7 r3 J8 [7 G2 Z6 [9 ^! H  if (FAILED(rc))9 E: a" ^7 a' V& y2 f4 J
  {
5 V' D9 t7 K/ B9 T  e+ b0 z4 d4 E; s    //pIContainerOfDocument->Release();; W/ j/ C3 e2 l3 [
    pIContainerOfDocument = NULL ;# S! n# g+ z( k! x6 g( Q
    return FALSE;
0 |6 i  o5 W7 ~6 s  }3 D  R# [! G$ ^
9 K, |7 g; u- p( ^
  //获得Document. h1 h" O- F% L) \
  CATIContainer* _pContainer = NULL;        1 @/ K3 B# H3 O1 o
  //获得SpecContainer
3 p2 ^' ~+ J/ E7 N  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
) M! j0 Q; G& H9 f* e1 f8 x        ' ^$ I0 Y6 T' @8 Y6 L3 C- f
  //GSM工厂
  y, n) m9 G5 N" {/ e- d! i% \  CATIGSMFactory_var spGSMFactory = NULL_var;$ B" ^( m  F9 f! p
  //设置工厂               
7 S; a7 z6 [9 b% K* Q2 D  spGSMFactory = _pContainer;                                                                       
  E# t/ ~1 I6 `1 Q  C+ N' i( K  ]6 B6 a2 V7 m
  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);1 g4 K6 g( w, o8 J9 Y

8 C/ ]  k/ O  K) w# i+ K3 t  spSpecPoint1= spPoint;                                        . C3 k; i  i7 U3 M; X) W

  B( n  W/ K) n: N6 J8 [  CATIGSMProceduralView_var spSndPntObj = spSpecPoint1;0 l6 o  p/ J/ g' I; x5 s

. g; K5 a/ _  V$ J; A  //*将点显示在屏幕上  H- O5 x- F) {$ ^5 r  K5 Y
  spSndPntObj->InsertInProceduralView();
$ |5 j# ~2 R4 E& ^* x0 p1 a. |% t6 D" Z) }  v/ y4 a8 O9 R
  spSpecPoint1->Update();- f; y! z4 X* w
- l& `8 B  B% ]  Z/ a
  return TRUE;' \3 N, Q8 v& g( o
}2 _! n1 `7 T/ r5 {: y" Z/ r

9 y$ [: E0 R0 p7 {9 d6 h% M. V//-------------------------------------------------------------------------1 ]) i, K- v+ P  h! Q4 h4 Y
// ActionTwo ()
: }3 N, w9 g9 L- b. X2 h" o//-------------------------------------------------------------------------" n/ D% f% h0 z4 H+ g
CATBoolean CAARCCreateLine::ActionTwo( void *data )
2 A* |% V! @9 s# r  j0 ^{3 p2 S0 B7 P% g: k7 C6 N- l! H& h
  // TODO: Define the action associated with the transition
5 d# b  Q7 K* h# h, s  // ------------------------------------------------------
) m) J4 s# A# v) V5 s# Q* ?3 b  CATMathPoint2D point2D = _IndicationTwoPoint->GetValue();//获得一个2D的点
9 |. x: Y& \# D0 O$ x6 X! E4 E* E/ M& }- f
  CATMathPoint Point3D;
. w( n9 @* r/ h5 w) y  CATMathPlane Plane = _IndicationTwoPoint->GetMathPlane();
; }) `  O& A# i' G6 f9 ^) X; j' M  R( C' o& X1 w7 u0 f4 |2 E
  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点/ ^7 U# D1 g* X: i! i

; q; }4 Z, f* T  K  //设置Container(非根节点)2 f* ^, t! Y/ L
  //获得Editor
# s+ Y0 r/ s$ G  R2 J: k- }  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();7 X% ]2 J4 y7 k! f% v
0 o9 n- a) x) p
  //得到当前对象的文档
8 {% K1 y- ]- |3 g  CATDocument * pDocument = NULL ;' `  S- Y9 w  g5 V. a1 g

6 W0 ]9 l$ t- u# @  //取得当前活动对象
' w& P. d) }* |3 i7 c; u1 x  CATPathElement activePath = pEditor->GetUIActiveObject();
* u+ N$ E3 B: n) x8 j6 H. I3 U* t' K* P. |1 `1 z: P' H# F* Q4 M
  //取得当前活动的product
0 T' K$ e" i% N$ ^  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());$ B" e* t$ G" q* h( {# I# t

. ?: f& e& D* Y. t  //当前活动对象不存在
8 J. G  d$ m1 I  if (pActiveProduct == NULL)
/ L- {% u+ J1 k' M7 v  {
  v# M# L2 h4 C( ?8 `    pDocument = pEditor->GetDocument();
, h: c# q  j4 u; B& I' _/ O" x  }
) L0 y4 F8 B  ~" X6 l( d( w! U  else. F* T# |0 m, j( ]5 j( F/ G
  {
+ O( w: a  F" k% A    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
2 I" ?  N- B0 M& f0 l0 w    //当前对象的引用对象是否存在
, t5 s% j* N7 s2 k7 O. U7 i2 A3 T    if ( NULL_var == spRef )9 P, f9 `6 B6 ~+ m6 T3 t8 U( Y/ S! i! i
    {
: g+ R( x4 n% H) |      return FALSE;& a) R, m$ ~6 j5 }: ?7 |
    }
% a( u- P7 i2 P, ~" |' l! h3 L9 V& [
, E0 A- _/ P6 ?7 V6 a5 G- f    //当前对象的链接对象9 ~$ s8 }7 s+ ?3 L1 w# Q7 B) V
    CATILinkableObject * piLinkableObject = NULL;
" i; s9 {! s5 C, D* r    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
3 G! j7 c' `" q- n  E* S7 ~. x    if ( FAILED(rc) )
; B' f8 U1 d9 g8 m    {
* S9 ~/ o& x+ Z/ C2 E$ U: }/ Q      piLinkableObject->Release();
( M2 E" k7 U/ n6 ~      piLinkableObject = NULL ;$ Z' p% C; \" Q& E$ g' C
      return FALSE;
6 R- f' |2 l  }; s6 r    }
; a8 c6 P2 X5 g" w/ v; ^" f
/ n) \2 m% K" U    //得到当前对象的文档
- G1 N+ x, w3 Q5 u0 A8 t    pDocument = piLinkableObject->GetDocument();
+ m0 ?) _) M6 J  V# X    piLinkableObject->Release();
6 a- W" m% i3 B' h: F  O    piLinkableObject = NULL ;
& G! E0 K# D" F' C; `3 U. J9 j
: C) V  N" G5 F3 |% n5 \9 r7 j+ v' m    if ( NULL == pDocument)
8 ^, n7 N5 y- `' N4 w, D6 t5 N    {6 ]9 T' V$ t1 t3 ]8 J
      return FALSE;& o5 }( @0 G8 c2 _8 F7 Q6 x" D
    }: D: l; @* s5 v! o
  }7 k+ @: {% V, K9 i, t' X( F. Q  i
' A" G6 C8 Y" f+ V8 [' y
  //得到文档容器集4 A* F" _4 C! G3 W9 J
  CATIContainerOfDocument * pIContainerOfDocument = NULL;4 D& T$ n1 s! v. \
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);
. n  C: w! |) i2 \9 t1 I. T  if (FAILED(rc))8 Z9 y; n5 T3 _* E, w
  {
1 s: Z  {8 ~! J( k1 A9 ^7 S4 o    //pIContainerOfDocument->Release();
, j6 F# u! N  g" k& R1 a) i- {    pIContainerOfDocument = NULL ;
5 n# J! J+ |2 O3 y9 k0 H) z    return FALSE;  ?* P0 i& I, g# M' J4 x, ~  C8 \0 ^
  }
4 S( o8 q8 k) ~* o2 X0 K) T' u' S$ n$ M: i" [) m' p
  //获得Document- s$ E. {& I6 k- T' y: J5 e7 J  L
  CATIContainer* _pContainer = NULL;       
+ D' D7 K( _/ K! ^  //获得SpecContainer
( P0 C; k1 H0 ?  G& E* R  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);$ [3 V+ x  f' W6 p6 ]* R
        * K) M2 q" x6 i' N, B
  //GSM工厂
8 m, W: R% [$ H6 c( H# X  CATIGSMFactory_var spGSMFactory = NULL_var;/ y6 ]: E! {( ?8 D+ r- S, U+ q* Q
  //设置工厂                : M- {1 |& Q2 T  |. {  E4 j. h( R
  spGSMFactory = _pContainer;                                                                       
$ y' p) e; l" J! T8 q- {* B( M* c8 K* O) J
  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);
$ u7 ]' D# j- J+ Y  C1 M1 w: ~: m$ @) N+ E4 o
  CATISpecObject_var spSpecPoint2= spPoint;                                        " Z# ]( \3 R3 a

( v3 _+ z7 q$ O% `( e  CATIGSMProceduralView_var spSndPntObj = spSpecPoint2;# }6 e4 h% w3 g* J) Y+ h* v+ p6 z. q
, X4 E0 j* C& i' A* H. D
  //*将点显示在屏幕上" c: ]- J7 v, T1 ]
  spSndPntObj->InsertInProceduralView();3 |: r( Y3 m6 P# J: q

" d* [0 X) ?" g/ i; {  spSpecPoint2->Update();
0 w; h4 A: P# U3 C# |
7 D! w% A$ f. P5 G, }% V  //生成线8 R* r( y8 h) Y0 |& T  S
  CATIGSMLinePtPt_var spLine = spGSMFactory->CreateLine(spSpecPoint1, spSpecPoint2, NULL_var);
- {- u2 D* r; v/ D3 H! Y0 p7 G# ^2 B3 ~
  CATISpecObject_var spSpecLine= spLine;                                        ) `+ {& s3 O+ B; n- |, v
  k7 @" W4 L: T% R6 E' j
  CATIGSMProceduralView_var spSndPntObjLine = spSpecLine;  g, H' r* U6 c- a& k1 p
% v, g2 D) u5 G* f% N
  //*将线显示在屏幕上
8 O+ ?1 t1 z* v& S1 }  spSndPntObjLine->InsertInProceduralView();7 s2 L; c  @$ y+ p
  ]  a$ u2 s0 R1 h4 Z$ G" c; J
  spSpecLine->Update();
2 A4 J" a- y; y% a/ W" l- M% U, B2 k/ f3 K/ j
  return TRUE;
" z$ p' x) ~' C+ o" W. I}  l0 J7 j; E& ^6 E

: J! O% r" I; x
9 ^: j9 I9 b) M" A3 r
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了