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

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

[复制链接]

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

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

admin 楼主

2017-4-17 21:56:09

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

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

x
7 D, R$ ^* D; V
Catia二次开发源码分享: 通过鼠标点击创建直线
& R8 j$ E& l# F/ a
: K) H+ {$ Z6 m$ p! J: u6 Z  N5 D
% c- w2 y* b+ z5 z% }4 k! C: U
" p6 Q. H+ @$ r$ n# k; v1 }3 a#include "CAARCCreateLine.h"
* f- W: L6 Q5 A) u5 Y! S' M7 Y#include "CATIndicationAgent.h"
: K: U" D0 U$ ]7 D#include "CATMathPlane.h"5 y( y' Y0 D9 k$ t# R7 X
7 n+ ]8 c; ]: f
#include "CATCreateExternalObject.h"
7 l' S4 W6 ^+ K% P) U- J/ Q2 U, k- z6 L9 n2 W1 L; g
#include "CATMathPoint2D.h"
4 d2 J2 p# L* b& c" B9 r#include "CATMathPoint.h"
. F: x" o: l" F9 w: p#include "CATMathPlane.h"
) X  {# B/ G# G$ E% Z
9 }7 ?. P1 y2 U2 ?#include "CATIGSMPoint.h"
& ^- ~1 c( G6 r3 U2 L#include "CATIGSMLinePtPt.h"
2 |2 H* w) ]; h! ?
4 U) \) T5 s/ a! j% q3 Y#include "CATFrmEditor.h"
4 n  R2 \1 Z6 b1 ~' n! U+ r#include "CATPathElement.h") i0 P  X" R) z) L; j
% l2 m3 Z, X& p  d$ A' Y
#include "CATIProduct.h"
$ A* ~( I. y1 ~* L' @% e' O% }* `#include "CATILinkableObject.h"1 g6 m0 u' S2 M9 b
#include "CATDocument.h"
# n+ [8 o5 G& p& N5 ]( K% F! a9 b! C" L# v5 Q3 m/ [
#include "CATIContainerOfDocument.h"
+ Y. K# \% d% C& ^# a6 N8 w! V* b
#include "CATIGSMProceduralView.h"
& @* w) B2 N) l( H1 v) M9 {3 V5 T7 z. d* n) G
#include "CATIContainer.h"; Q% M! u1 A/ ?6 @4 V7 s* Q( R
#include "CATIGSMFactory.h"& Z, S2 r7 D# E6 g
# Q6 u6 a+ T+ L3 E
#include "CATISpecObject.h"
1 a7 O, z2 a  C0 m% n% PCATCreateClass( CAARCCreateLine);
; w' l: r# U, J) z$ I% Z* A- `/ l/ V# t; k
$ [8 r1 s8 F# a- N* I0 f7 a
//-------------------------------------------------------------------------* m5 S. ]$ x% \; Z5 ^) `( V. l2 h
// Constructor
- v7 B% N! Q7 n) U( I! o//-------------------------------------------------------------------------
& F' x9 R* A( m' T& uCAARCCreateLine::CAARCCreateLine() :
6 x/ `# ?- q- h+ ]* u) @  CATStateCommand ("CAARCCreateLine", CATDlgEngOneShot, CATCommandModeExclusive)
1 k) G+ z1 R" p, H! V5 \//  Valid states are CATDlgEngOneShot and CATDlgEngRepeat
7 u( X; O; d" a1 z& g  ,_IndicationOnePoint(NULL),_IndicationTwoPoint(NULL)
5 b  M1 w! h& [4 o9 Y3 A{$ g. _9 Z) z$ L. u( _( D5 Y
}+ G7 q. W# E3 F( T- h) g  f

& R( x% ^$ C! R! s  s//-------------------------------------------------------------------------+ |$ \) S: j2 D8 s& s0 \) f/ {
// Destructor
$ P2 t9 G& o. T- v3 P. Z2 G//-------------------------------------------------------------------------0 U( m% S4 B) ?7 k
CAARCCreateLine::~CAARCCreateLine()" t0 Q1 U& n' t7 {6 q. r7 n$ u6 {4 l
{5 b3 D8 Y. k7 B/ _  ~( Y1 N  A
   if (_IndicationOnePoint != NULL) + ~4 p" N1 H* q6 N/ P; P# M  c: |* b
      _IndicationOnePoint->RequestDelayedDestruction();
% p4 \- ^6 |9 ^8 C4 |6 @1 X$ L   if (_IndicationTwoPoint != NULL) * f) g- r8 m; @" U& @( f. Q8 `0 p
     _IndicationTwoPoint->RequestDelayedDestruction();
( v; N$ b0 F- t3 E' s$ |+ {}/ {' z; v4 B9 ]% M1 h
# [/ z1 @* F" ?) i# T

7 D; m2 g8 J/ g' K+ I//-------------------------------------------------------------------------  E5 u+ b, T' c2 K
// BuildGraph()
& e5 I4 v( i; i" |//-------------------------------------------------------------------------
* q( t) A# E7 S/ y4 t! \: V+ c3 Avoid CAARCCreateLine::BuildGraph()7 r# F9 [/ {; [  X3 k5 @
{
, n/ @- Z- O2 f" _  O" s' Q6 w
  i1 l- ]2 }" _% P; `
* y7 _3 p6 N( X- Y  // TODO: Define the StateChart
) n/ a7 ]* o  j* y) K. @5 t. n  // ---------------------------
$ n5 B1 J9 t5 O! {' X  _IndicationOnePoint = new CATIndicationAgent ("IndicationOnePoint");
* j! t4 t" o" |7 K5 Y) S) `7 w  AddCSOClient(_IndicationOnePoint);
* R: C( I: C% r/ D! U' V/ V
, H" N9 x) |0 E& n% @+ U7 i  _IndicationTwoPoint = new CATIndicationAgent ("IndicationTwoPoint");
- V3 u, B( Y9 n. S0 w* [4 v- ^! m/ [% D+ M- j
  CATMathPlane PlaneXY;
+ {/ r6 Z$ z8 e* u. O, a  _IndicationOnePoint -> SetMathPlane (PlaneXY);/ Y- b! L+ w# v1 J7 k7 v& S
  _IndicationTwoPoint -> SetMathPlane (PlaneXY);
  ?' y  A" N  u1 J/ z1 C+ X8 D; ^9 y" B0 {- x9 A
  CATDialogState * initialStateOne = GetInitialState("选择第一个点位置");1 f* B$ j1 r3 K3 M4 t
  initialStateOne -> AddDialogAgent (_IndicationOnePoint);
. r) D. B8 t% p. Y, w% v" n- Z- A7 s* Q9 w) b( I4 m
  CATDialogState * initialStateTwo = AddDialogState("选择第二个点位置");
2 d+ O# E( c( x+ X* S8 J  initialStateTwo -> AddDialogAgent (_IndicationTwoPoint);
0 A( R& z% C* }9 m' v6 x5 m" s( ~9 P% t. |
  AddTransition( initialStateOne, / }! g) q0 R. R1 }$ Y
                 initialStateTwo,
9 U1 P  C1 X  ~6 Y8 T                 IsOutputSetCondition (_IndicationOnePoint),
8 R5 v- y2 @; D0 [# _* X  y& G2 Q                 Action ((ActionMethod) &CAARCCreateLine::ActionOne));
, Q8 z; [$ u: R1 W+ h. Y
* T: x: |, V+ ^  AddTransition( initialStateTwo, - \) v9 c0 _" y7 R( `  s
                NULL,
: o9 V7 @4 U0 P2 j3 T                IsOutputSetCondition (_IndicationTwoPoint),8 S4 N0 E  _0 d' E& k$ R& x
                Action ((ActionMethod) &CAARCCreateLine::ActionTwo));
2 j# B, \  ^5 u& I' }! R9 }; M# @}
1 X8 Z# L( S0 k) \! E- ]$ y5 b) `5 @# S6 }! x, o  _
" M  u  j, _/ k  o, C
//-------------------------------------------------------------------------' n2 i) h# S3 V! B
// ActionOne ()3 \: Z( o# S' X+ L1 G( s
//-------------------------------------------------------------------------  @( a, B" \3 G( U2 k
CATBoolean CAARCCreateLine::ActionOne( void *data )
! ]. b" ^% q* m! S, N1 l. |1 a{
9 A( u( j$ p% M& x& z  // TODO: Define the action associated with the transition
4 J: M" b' d. ], [- b; E& W  g  // ------------------------------------------------------
* p, R* M/ L/ D4 Z  CATMathPoint2D point2D = _IndicationOnePoint->GetValue();//获得一个2D的点
3 T  r# Q4 ]/ Q/ h) v
0 L, X! \$ k& ?& S6 N1 T( Z  CATMathPoint Point3D;
7 o/ d9 L5 B$ r3 T; O  CATMathPlane Plane = _IndicationOnePoint->GetMathPlane();
3 q* h1 O9 y5 N1 w( L- E( X" t# R# }
7 [- J6 |3 g  O, g2 \  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点
' X* R- e8 l1 ]' s% @! j9 e0 o
$ W( j" |/ ]6 ~4 P: ?  //设置Container(非根节点)
$ Y& I3 ~) q: G8 `  //获得Editor1 A! x  ~# c: q) f8 K7 ^
  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();- c1 v$ Z' X+ ~% v0 G

- ~6 S& H3 ]" o2 @' W  //得到当前对象的文档
! Q- k' n0 W5 ^+ H  l- Y  CATDocument * pDocument = NULL ;: b/ s8 Z4 @8 m2 A  ?# O- N
  h0 \9 x+ }; M2 b( a
  //取得当前活动对象7 L9 c. F6 K9 D
  CATPathElement activePath = pEditor->GetUIActiveObject();
$ M9 J" G: Q, M1 [5 |) S
2 F/ H' L1 T5 t! m  M  //取得当前活动的product
5 S+ l9 L0 ~! P3 B4 F5 y) l  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());
  N% P9 e3 \& N5 q2 K, X8 m- ]) U  C0 j/ f$ z1 B" K1 F3 Q
  //当前活动对象不存在9 `% Z1 c' k$ }% |: O6 ?4 V8 s
  if (pActiveProduct == NULL)
4 M0 i3 H0 _8 k, k+ K1 |9 p; P9 F  {* Z' ?1 }1 A& R$ s  ?
    pDocument = pEditor->GetDocument();
, w7 F. o3 v- y4 X/ s" B7 ?3 k' H  }) i: V# |0 M- t# L9 y
  else9 l9 e* h8 ]. z9 ]4 f: O6 g* m* n( |
  {
8 |3 J+ h( j7 Y( ]$ n5 |4 v    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();6 l( M0 X! d! s. [) s! G
    //当前对象的引用对象是否存在
7 s$ \/ w. J; {7 H    if ( NULL_var == spRef )
1 Z; b1 o1 _% O# F+ }0 E    {% O$ c3 l+ Z$ B3 B, q7 e6 d! `7 U* V
      return FALSE;) T. }; D# Q4 k& E3 U" P, C5 N
    }, L% ?4 d4 M" W* \2 |
9 R- ?' D/ r: D1 n4 P( F
    //当前对象的链接对象
9 @) h( O5 d1 b8 _0 |% ^# m    CATILinkableObject * piLinkableObject = NULL;6 O) b& `6 \3 n+ s6 l
    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                            & `6 [0 P& V: z# P3 M
    if ( FAILED(rc) )
0 _, i4 X6 U1 W" y' y    {
7 j  @( b* h7 v" `      piLinkableObject->Release();
; j( [+ ]9 b' q2 @" M1 h      piLinkableObject = NULL ;9 y& T: F9 ]* M0 ]& A
      return FALSE;
- @* l( Z- ~2 V; Q7 q0 ?5 k    }
9 G" y, @3 k# l' K: c
7 n4 N0 E, D! z7 g/ ]    //得到当前对象的文档+ m2 [" n1 Q; f0 k$ |% a$ k5 A" I
    pDocument = piLinkableObject->GetDocument();
8 }2 B* N2 f6 `3 t. ~- @7 h2 h7 Z    piLinkableObject->Release();
. o3 T3 m0 F4 @2 [8 k; H    piLinkableObject = NULL ;; `" S+ R% l+ O& R9 ^- U+ x' u3 S
$ n0 b+ `' q: s& W
    if ( NULL == pDocument)
1 _5 `1 H% ]7 n    {: g& v. {( H" f# u* }
      return FALSE;
, o8 z( d. ]- P7 A5 J* B! o    }
& M8 G5 h- s, P+ K& J- f" m  }$ V" e: H  j" b$ a- v. A, b
! i$ H; b0 [6 F% h
  //得到文档容器集. H) V' ^# E4 R; ~% k  `7 f
  CATIContainerOfDocument * pIContainerOfDocument = NULL;+ i4 F4 A3 ]  o& x0 o) u! Y  U- E* N
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);+ i, W4 i7 H- [7 F1 U
  if (FAILED(rc))  ~# r4 w+ }) i% s3 d9 {9 u/ N
  {
# K  k  Q' l7 O/ u    //pIContainerOfDocument->Release();, ^9 U& o9 `3 \0 B
    pIContainerOfDocument = NULL ;: o( L$ K- {. I- z( \& O  N% r9 I
    return FALSE;/ ?1 \4 @6 D7 p7 U9 U
  }
1 I  Y6 }$ ?9 z. v' h  C! Y" g4 w; Y
  //获得Document
3 i) e& f& {+ `) n  CATIContainer* _pContainer = NULL;        0 f- C( r" o8 b3 o; v
  //获得SpecContainer: t# \7 D- s& N8 u) W+ B! Q/ o
  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
4 X2 _$ Y* @4 k2 q; R+ d9 e& Q& h9 K        5 _# O9 D* W5 S3 T6 m
  //GSM工厂9 ^- a  H; Z  \0 E: l# o$ |
  CATIGSMFactory_var spGSMFactory = NULL_var;3 c+ S: \) e: d+ @* X, H
  //设置工厂               
( R# ^* {+ F/ M5 N" c4 }* d  spGSMFactory = _pContainer;                                                                       
  r6 |, Y: w! ~; d- q! ?3 a5 H# T' a, [* A- ^
  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);0 i2 e4 Q% ~/ j
2 b3 Q$ O- v1 g" M/ ~
  spSpecPoint1= spPoint;                                        % K0 k& V1 Z- C3 Y* Z, [

9 j8 A& }$ S* K) m  CATIGSMProceduralView_var spSndPntObj = spSpecPoint1;
6 l# T0 E- f; Y, E
' D1 V+ P2 M! O* V* c9 h1 F+ R  //*将点显示在屏幕上
$ @; ?! O$ o1 j; ~7 a# g& \& a& X  spSndPntObj->InsertInProceduralView();" r8 @) j# w9 m, \6 |! ~. l

( ?/ f: o3 I: w2 [8 e5 y) m  spSpecPoint1->Update();: G* Y4 ]( {& ?1 D4 r4 G

- w/ U- _5 V! b  x1 U: w  return TRUE;  G3 G+ B, J1 E  n( j4 D
}
" N4 B8 ^, z) |( x. K$ D# y* B. }; o  p$ [) P9 M+ ~" O7 r" Y
//-------------------------------------------------------------------------# I: u0 I. F( g4 j
// ActionTwo ()1 ]; ]) m2 F2 r7 D8 o% y8 a
//-------------------------------------------------------------------------0 J7 u0 E; a0 h. F. f2 W
CATBoolean CAARCCreateLine::ActionTwo( void *data ), F9 @" F* [! Y: O: R
{
. t' d( t2 X9 ~6 o$ w3 P: i  // TODO: Define the action associated with the transition
* |; ]  ]( L1 O3 A! Q* u& j  // ------------------------------------------------------1 ]" W  J& `" H% c* \6 f$ a
  CATMathPoint2D point2D = _IndicationTwoPoint->GetValue();//获得一个2D的点- U( @3 K: z% O, F  u. m9 v
  O  A2 C: t/ q( W  a- C0 Y' x
  CATMathPoint Point3D;
( H8 F" y+ B2 H3 Y  CATMathPlane Plane = _IndicationTwoPoint->GetMathPlane();
0 D. a2 L7 i- g" j5 w0 Z& M- `/ Y( y& C% Q) F; f& W9 U
  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点
( z9 y) h$ X  g( z# i- m% Y+ E. `4 d0 Y$ F6 D* m$ R/ {% j* x
  //设置Container(非根节点). b1 v4 t! m) |* K
  //获得Editor4 b: N4 V( @! \4 ~1 ?! F
  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
- h( u8 v( X5 @# J- U. o' Y# r
! M, c$ M# z4 V# Y" ^, g; a  //得到当前对象的文档8 [0 x/ B6 \6 ?: S9 N
  CATDocument * pDocument = NULL ;
/ S1 p5 q+ e/ c2 q% n5 {$ P/ h  S
( X$ f( x) L3 G+ v  //取得当前活动对象% `% B; F& B) m
  CATPathElement activePath = pEditor->GetUIActiveObject();& `8 n) I0 f; ~- ?% J
+ D$ \. n8 P: v- k3 t* Q
  //取得当前活动的product9 @: d% Q5 E' \* q
  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());
% ~* z% m/ ^! H! k
0 Q  j/ J2 I9 A& s- m3 E" t# c. D  //当前活动对象不存在
1 u* l! }. c, \: ^  if (pActiveProduct == NULL)
) _, C* M& h. i1 l0 _. @  {& F; u/ V2 K; Q# z/ D
    pDocument = pEditor->GetDocument();# g/ D; j) Z! L; y1 N" a* c+ d
  }  h3 i+ ?* i1 I; u, ~7 P
  else' H( E4 p. d, n
  {8 {% r4 I0 ~3 e
    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();) q$ ^8 a* O3 ?9 E/ s; Q6 H
    //当前对象的引用对象是否存在
# D# I! y" ]5 [" L- f    if ( NULL_var == spRef )
2 e. ?0 h8 K! P& k3 a9 u    {
4 \1 Z. k) v+ c- C& h4 y      return FALSE;
8 m+ R3 E9 a& j) R  b8 q1 \4 q" f( ^    }8 ]7 _4 c) p0 x, x' }. r; N
- I' h" s% b5 C1 V3 z5 N
    //当前对象的链接对象
- y6 _! N3 y; p/ Y% r" T    CATILinkableObject * piLinkableObject = NULL;1 ~, o: }8 l2 V- {& a  J" T
    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                            3 n; R  L$ K7 I  A
    if ( FAILED(rc) )
+ q0 n2 W9 F5 {/ n    {
7 P/ q" Q' P; Z+ p7 [      piLinkableObject->Release();
: M. q+ o: F3 X, X$ |      piLinkableObject = NULL ;1 i8 J6 a2 v' q1 ]# w
      return FALSE;' d$ q; L% u) g! F3 W! a) b1 X
    }
; ?! y6 y, D* v% {5 M5 o; A
; J, x' n0 z* D( N- K: b    //得到当前对象的文档
8 v( ^& i! l0 w: U) i7 j    pDocument = piLinkableObject->GetDocument();
; K1 _6 C6 {3 D+ T. E* P    piLinkableObject->Release();  @! ^! ^" o$ _
    piLinkableObject = NULL ;
2 e+ T) j8 V" M3 K6 V2 ]: V5 h+ l7 p1 }1 F% K/ d0 f# V7 G9 J" B
    if ( NULL == pDocument)
. z3 {1 w; p) l# Y" ?2 f* u    {
. Y* C- d7 ]6 j$ R* S& K      return FALSE;3 e! n3 s4 B/ H$ ?
    }
, w1 T9 l) A6 O/ K8 d6 x. O7 b  }
5 Y; |% l$ v; t: Q$ L5 C/ k* {' B- G' g- b* t/ f6 U' _! I
  //得到文档容器集. r% ~8 O3 l; A+ ?8 O
  CATIContainerOfDocument * pIContainerOfDocument = NULL;
1 O4 |! j) s: H6 L7 d  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);
: q: t2 a/ w0 Z& x, F* w1 N  if (FAILED(rc))4 P4 U# ?2 [* Y/ z$ W2 X
  {/ F; t( c  k. |- ~
    //pIContainerOfDocument->Release();( a7 B4 |0 y6 Y  B0 o1 e3 c2 x
    pIContainerOfDocument = NULL ;" M- f) Q+ C5 Z: h1 O5 p+ g8 c6 I
    return FALSE;
# W* ], ?8 I  ]6 x* u  }
' Z8 \$ {5 }$ K" b. B- H7 P
7 m$ y( O5 X2 j, W) T  //获得Document
3 k- j! k* a) r8 _( z  CATIContainer* _pContainer = NULL;       
; |% h; @1 [2 l  //获得SpecContainer
2 q* |3 W1 o5 ~" ^* F+ h, p$ x  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
% p: p4 n; w- V8 }        + T1 f3 S) k; _
  //GSM工厂
/ {! u1 q" r# t$ M  CATIGSMFactory_var spGSMFactory = NULL_var;. q+ A; v1 z/ v
  //设置工厂                ( p) O7 z0 g5 }3 Y0 {: b
  spGSMFactory = _pContainer;                                                                       
9 X! M6 F6 x! h  z' H/ p4 U
2 v" G# ~" F; m; N  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);
) v0 E; D2 ~# |) V& i% W" j6 |# Q2 p2 X- w2 k% g  ?
  CATISpecObject_var spSpecPoint2= spPoint;                                        ( K8 T' u& Z6 F" x* H' k! O
  ~/ `1 E  j" c! S# O
  CATIGSMProceduralView_var spSndPntObj = spSpecPoint2;. x! u" C* O- N" ~* P/ C+ ~$ D

; x/ n; C$ L" T- C" v  //*将点显示在屏幕上2 p. ~4 @2 `+ O, F; U+ W
  spSndPntObj->InsertInProceduralView();7 B  w- h' S0 U" u/ b9 {! X
+ Z) W" r* O* s- Z$ E
  spSpecPoint2->Update();
% s: H& o- U! j
2 @  ]/ E7 \, v) r7 a. I. {5 z  //生成线) W$ W6 C+ b0 s  r
  CATIGSMLinePtPt_var spLine = spGSMFactory->CreateLine(spSpecPoint1, spSpecPoint2, NULL_var);4 n  P9 x' g9 x8 |  t8 B
5 z) X; f% N% p2 o2 I/ d3 w
  CATISpecObject_var spSpecLine= spLine;                                       
, L5 L+ J' _4 z5 ~1 |! ?  J& \0 J
  CATIGSMProceduralView_var spSndPntObjLine = spSpecLine;3 r( G% t7 @/ v0 Z- `; h
! g6 x9 }0 m0 b* f. F8 B7 o% L, O% [
  //*将线显示在屏幕上
, ?5 l) d% ~+ E1 @+ P. V1 J  spSndPntObjLine->InsertInProceduralView();
/ L* n8 X6 j) [5 n& z5 q
1 }0 n- ~; y) x- F( V; M, @) y: R  spSpecLine->Update();
& n0 \5 w3 d. E
4 K+ M8 k5 e) d2 G* |  return TRUE;
! {) K+ h) L/ u4 a}
. ^/ I8 v# [3 F7 P! g, ]6 h% B4 \9 q  b3 d- n& f* a

& J" P. b; P( S7 f4 U
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了