PLM之家PLMHome-工业软件践行者

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

[复制链接]

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

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

admin 楼主

2017-4-17 21:56:09

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

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

x
7 G0 K( `8 y4 _- ?+ m9 {, ^9 K
Catia二次开发源码分享: 通过鼠标点击创建直线
+ e) s) D, `- A1 o
1 S  s; U5 i- {" o; l3 }/ H# h- I& r! @; H1 ~/ Z
- q. Q& H+ r+ Y" _
#include "CAARCCreateLine.h"6 K4 _  A) d/ k5 J% Q$ u
#include "CATIndicationAgent.h"+ G$ m7 `$ k5 @( {1 e' o3 N
#include "CATMathPlane.h"4 j/ k: t2 l, [1 ^8 `( X+ L7 d8 r

% |: M" e' P1 Y$ Y9 \/ D* l6 R#include "CATCreateExternalObject.h"
% u3 e2 I& B4 q
2 |& V6 K! B+ D; D+ E) x. W+ U0 U#include "CATMathPoint2D.h"
( I; z5 P3 ~: U( {6 T% l' q#include "CATMathPoint.h"" S5 b5 X( }" r: A- g( \
#include "CATMathPlane.h"
1 P0 P6 S/ X5 v
! K: `3 \5 U* Y. J* @8 d) r: H#include "CATIGSMPoint.h"
3 a' w( y5 a4 \; r) M" ~  C. e$ U#include "CATIGSMLinePtPt.h"
( N% y+ O! `) Q2 {7 K! _& K
; n& F7 f) \/ N2 U: i& {# z#include "CATFrmEditor.h"8 [& D1 t" h, H# |/ V
#include "CATPathElement.h"( @+ a/ G% R! m8 r# e4 R
# C3 @- Z4 F! f: P
#include "CATIProduct.h"
5 r( S" h' c$ g#include "CATILinkableObject.h"+ v9 X& y& w1 Z8 T: J7 e9 h4 u
#include "CATDocument.h": z8 o6 n  k, y6 [( R# r
- e8 ^2 e; k6 J$ `
#include "CATIContainerOfDocument.h"$ Z- U6 V/ Y) X  x% z2 B
. V/ C. z0 ~% S6 L) m
#include "CATIGSMProceduralView.h"
: q( E3 u: V! C, t" ?! K6 n( }3 w5 Y; T+ P1 [. X
#include "CATIContainer.h"/ y! j, l% \0 t0 X
#include "CATIGSMFactory.h"8 x. o6 J, o8 r+ z4 _0 e
& [; r3 C- }+ D7 F* I4 h
#include "CATISpecObject.h"
, X; i" k! ^6 S0 e6 ZCATCreateClass( CAARCCreateLine);/ U' l, {1 i* O; `: B, M

9 d  r' Z" Y; s/ j  b
1 X( X+ P7 ?% ^: g8 \//-------------------------------------------------------------------------
4 F- g* J! P. r+ B+ ]9 f- V2 i// Constructor& ~, i. |- k) Q3 d# {9 g
//-------------------------------------------------------------------------
6 _  b; y# F' F' ~8 b+ mCAARCCreateLine::CAARCCreateLine() :4 P1 P0 v' T  Z6 i$ e/ X7 ?: P
  CATStateCommand ("CAARCCreateLine", CATDlgEngOneShot, CATCommandModeExclusive)
0 Z( |; \  v- U0 W  B7 y7 v5 l2 q//  Valid states are CATDlgEngOneShot and CATDlgEngRepeat
7 e. V0 C' J$ @) o6 i  ,_IndicationOnePoint(NULL),_IndicationTwoPoint(NULL)4 A1 ]1 J5 g, \+ z- M; R; @
{
$ i, I( K8 I- p- I. z' l& A- J}
9 |4 t5 D0 n' {2 o' Y9 i  Y1 k$ l) z' x" ]1 w$ O6 n. ~* }
//-------------------------------------------------------------------------
" n; C* s  B5 i: a' ?9 \/ i+ E+ \// Destructor
- z# @! f4 l! C, b" m( Y! J- c//-------------------------------------------------------------------------6 O, t! u3 ~+ t: l5 B& r# U
CAARCCreateLine::~CAARCCreateLine()- A! t, e7 [) ~
{
  f" T2 P2 c& g   if (_IndicationOnePoint != NULL)
2 W# ]/ r& G6 G3 T% y3 [1 T! t  W, Q      _IndicationOnePoint->RequestDelayedDestruction();
8 J6 e9 ^5 M6 o& |' Z) R, z   if (_IndicationTwoPoint != NULL) ( q' m( k' L: j$ }
     _IndicationTwoPoint->RequestDelayedDestruction();' H! y4 F3 r4 j
}; x$ y2 k+ ?: F1 l  B3 Q" x9 n
' O* \8 J3 v. [7 T+ ]5 {; s) g
  K4 h: D: M, Q9 L4 j7 I* {1 p5 Y
//-------------------------------------------------------------------------
4 e- A2 `- Q% x( g$ y" Q1 i  g// BuildGraph()" y4 B: Y/ T& |, c
//-------------------------------------------------------------------------
# Z1 v) D' j6 N  {# M7 V7 uvoid CAARCCreateLine::BuildGraph()
/ Y* o, e3 _4 v{4 r4 F$ n0 Z& r$ H9 N2 W

$ m7 S9 Z0 E' j
  E4 V* ?+ v, P. U  U6 f) V  // TODO: Define the StateChart ' E4 Q( L2 P9 x) z" T
  // ---------------------------: ^! C6 S$ Z, P4 i9 P9 O2 \
  _IndicationOnePoint = new CATIndicationAgent ("IndicationOnePoint");1 J: Q: Q4 M; A) i( C
  AddCSOClient(_IndicationOnePoint);
" @# Z$ J- W3 R. N5 l) a9 W5 a6 t" z( |+ I9 J0 n
  _IndicationTwoPoint = new CATIndicationAgent ("IndicationTwoPoint");; I& c" B% h$ v4 [8 |8 j

- U2 E6 U+ ~6 G, v3 W) `( e  CATMathPlane PlaneXY;4 `- m  P  j' n
  _IndicationOnePoint -> SetMathPlane (PlaneXY);1 i' I: l/ v& t* j) s
  _IndicationTwoPoint -> SetMathPlane (PlaneXY);
& w3 p/ t' X0 m4 Y' v8 E
; k) A( A2 B: X' C8 A  CATDialogState * initialStateOne = GetInitialState("选择第一个点位置");
8 P+ e0 {" n! I- ?  initialStateOne -> AddDialogAgent (_IndicationOnePoint);* X# u) [- j: e- f0 C! }

$ M$ b% D& p0 @$ r# p6 H& Z2 }  CATDialogState * initialStateTwo = AddDialogState("选择第二个点位置");
# L1 }4 d* \6 V6 C$ z  initialStateTwo -> AddDialogAgent (_IndicationTwoPoint);7 _( t9 r: `$ A; W6 d1 C
% x+ L# Y4 o, j# A/ a& d2 z, _
  AddTransition( initialStateOne, & Q( f; U; S, W) u$ Y( o; c
                 initialStateTwo,
1 A$ Z7 m/ j& q! @8 }                 IsOutputSetCondition (_IndicationOnePoint),, F' g( c* [: {; m0 y2 c
                 Action ((ActionMethod) &CAARCCreateLine::ActionOne));1 u- I1 N  j, o
- f$ T6 t. v& g6 w* N6 a. d8 T, Z$ z
  AddTransition( initialStateTwo,
3 H, S0 y1 |) }                NULL, , V: S9 |, C1 g3 B7 o
                IsOutputSetCondition (_IndicationTwoPoint),
0 K6 E( ~% Z+ J" H0 K, k                Action ((ActionMethod) &CAARCCreateLine::ActionTwo));
- D6 ~$ A. y$ l3 y+ Z0 i% d}/ C7 W6 F. Y. o0 b# {6 l, q- f
+ m! F, T, v+ i* }8 W. t

+ b$ ~1 p/ O! T& n  I6 G//-------------------------------------------------------------------------
. R3 N, U  l1 p// ActionOne ()
) S  N3 P/ }: {0 p5 r- ]//-------------------------------------------------------------------------" v. A- y2 y, {9 Y% A1 e
CATBoolean CAARCCreateLine::ActionOne( void *data )
4 M8 b1 z7 x# N5 `7 J3 n% q9 G{
2 E! k9 y$ g  `' J0 H  j  // TODO: Define the action associated with the transition $ C! G0 {' I# [, X& L/ t! Z3 U- O
  // ------------------------------------------------------1 o  r8 z! n! s6 N' x* i$ h; l/ O
  CATMathPoint2D point2D = _IndicationOnePoint->GetValue();//获得一个2D的点
- Z  {8 ^7 C( J) y: f8 p8 O/ T& e# S% F: v. W+ i1 b& L
  CATMathPoint Point3D;, x* O+ K* @4 p' o$ j8 Z3 a
  CATMathPlane Plane = _IndicationOnePoint->GetMathPlane();' X0 V6 q0 N! i5 ~# W

5 ]% A' j# q- h: y/ K  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点5 D  M. [' Z) `9 ^* J

& Y- w( C1 w! b1 l  Q5 T9 M  //设置Container(非根节点)1 G, j1 K) f! ~0 y$ k
  //获得Editor
( E$ I$ m$ @+ |- D; U' c  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();) z# I' Q* o  y; U
( c2 Q% Y: y5 Y- o/ ^- `3 G' g% w7 c
  //得到当前对象的文档" {' u- \* t! b. o4 n
  CATDocument * pDocument = NULL ;) s. w1 _4 y* `$ ^/ _, E/ s
$ v1 x$ t+ L# C5 E- O
  //取得当前活动对象
' p" U' f" }. W) V4 W  CATPathElement activePath = pEditor->GetUIActiveObject();" Y, D5 R& B) e/ s, g% x2 m
# X0 c; V5 U& \7 `0 P% g( \7 G
  //取得当前活动的product* ~! W) w* P. q* P( L0 v$ b
  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());" d0 u* l$ Z  H( n4 c

0 r2 [5 ~) s: |5 R4 K6 k7 d  //当前活动对象不存在* E( I7 C" w$ w& I
  if (pActiveProduct == NULL)
9 W/ b2 ~- X4 h1 J0 \2 _  {- @9 M9 q# M2 O+ c3 f4 o/ K! h
    pDocument = pEditor->GetDocument();2 I/ [7 I6 H, j" Z) a% }
  }9 Y# z# B2 r) y& H
  else
" X8 V9 N! l! n! ~4 \# b5 Q- L' W  {3 k5 t9 k6 s' w( ^! `1 ?
    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
' E' {6 p, V: M% ]    //当前对象的引用对象是否存在5 X( r3 G! o8 T: n% I5 L
    if ( NULL_var == spRef )
6 t; ~% v9 J! c4 M9 {2 S& y    {4 ?" U/ b) O0 [- @- e1 a
      return FALSE;
9 h( Y6 ?% l8 m/ B  @    }
+ B( u- b2 o6 g4 y8 G8 N9 X% x* {0 \, z: ?, z
    //当前对象的链接对象
! r! _% o. Q/ z1 F" Y    CATILinkableObject * piLinkableObject = NULL;/ d. |) s, D. r- v2 ?$ x4 P1 d
    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                            9 L8 N( R6 R" [0 o8 t
    if ( FAILED(rc) )
  j& ~3 @2 [( K0 D4 M: n    {- y$ M8 p- K$ q# }. W) e: T- |
      piLinkableObject->Release();
# L$ t# T* M2 }' b      piLinkableObject = NULL ;
; s, x. ]# o- K+ w, v      return FALSE;
# Q( P- a' \9 c; t' v    }
# y$ j# v" q) T! K) R7 i1 H
/ O! l! W. k  s5 e9 ~' ^2 z    //得到当前对象的文档" b) j4 p6 u0 \1 e
    pDocument = piLinkableObject->GetDocument();# ?1 v2 z9 H% s
    piLinkableObject->Release();
; d! @( ?: Y+ ]/ a+ M6 c6 ]$ `    piLinkableObject = NULL ;
% o- o  Y5 T: F3 t, {- O0 W
* X* }2 S- ?9 x* P. t    if ( NULL == pDocument)
6 }: v, ]) y; c6 q5 _    {
5 S7 E/ O: i" ^  M      return FALSE;1 l  j) S' J" J% E% k" \7 }5 \5 g
    }
2 W1 W6 A. q2 c  }
6 w9 b" O. t( e. ]3 j/ Y+ b8 w' \2 \  ]
  //得到文档容器集
* g# f- \& j3 t/ R2 U4 s4 X9 w  CATIContainerOfDocument * pIContainerOfDocument = NULL;* w8 R; l2 i  Z; r. N5 `
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);( K( |2 U" }( R7 ?: t. ?
  if (FAILED(rc))! \5 {* |3 P7 I9 V  A2 G0 k: N9 @
  {4 B( r. C8 W0 y  ]' S. {. v: \) x
    //pIContainerOfDocument->Release();0 v9 y* R9 x5 i  k
    pIContainerOfDocument = NULL ;
" S! z2 Z' x3 J9 M6 a5 N; {    return FALSE;
# C0 k) Z* i' K! K# P. L  }" x2 S- V& z3 O

! o; Q7 X; x. F! w  //获得Document
" X) ^6 N. B$ x: _# c% v# v7 v* T  CATIContainer* _pContainer = NULL;        ( x% |# }9 ^& N
  //获得SpecContainer
9 I4 e0 V$ L1 }. J4 R8 h* p( N  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
* G3 Q/ K' Q/ S4 j. H: c8 [       
+ I- C; [: s/ [+ H" n) ]  //GSM工厂
) i: K2 Z& V% R& Y) U- `6 ~  CATIGSMFactory_var spGSMFactory = NULL_var;5 Y; S6 Q+ {! z7 o
  //设置工厂                # N2 D; v$ U/ `8 l
  spGSMFactory = _pContainer;                                                                        5 J! X# z' p* Q4 j

8 Z! t/ \" F4 e  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);) R) r6 [$ ^! Z0 }$ W
4 D5 s* _+ X# t, @
  spSpecPoint1= spPoint;                                       
) ^; Z7 ^# j% P  O
7 m; p. c; S3 b: o  CATIGSMProceduralView_var spSndPntObj = spSpecPoint1;1 f2 c' c; B0 t$ W' r
! q' W- k' G& H. K* F! l' B2 \
  //*将点显示在屏幕上* \: @8 J* o4 g2 ?/ S
  spSndPntObj->InsertInProceduralView();
1 Q6 a" ?7 |+ p: l* [4 }$ \' d9 y, [+ m4 e$ A0 w* @
  spSpecPoint1->Update();
' d! `, h; k# F8 a! Z* P+ B4 u8 w6 W& ]
  return TRUE;
& p$ S8 d, ]9 n& ~}$ c) `$ P* l9 R! d9 E; U( e+ V
' v9 A5 ]2 q5 F# e' g8 y! M: g
//-------------------------------------------------------------------------
# c3 c+ y: v0 O# {8 m6 L// ActionTwo ()
/ I7 n+ m9 g' C//-------------------------------------------------------------------------
$ @8 I! j4 Z4 YCATBoolean CAARCCreateLine::ActionTwo( void *data )
% P8 ^2 p% l8 |: n3 n" \4 r{/ O8 U# [* B( K3 ~5 X, e
  // TODO: Define the action associated with the transition : g+ N+ a% K" p3 W8 q
  // ------------------------------------------------------
4 K& h. ^9 M& g( y# A  CATMathPoint2D point2D = _IndicationTwoPoint->GetValue();//获得一个2D的点6 o7 }* a: L7 ^" S# V7 B
3 Y1 n2 G5 E8 T4 C
  CATMathPoint Point3D;
2 _* n. u, _1 z" K! R' p& T  CATMathPlane Plane = _IndicationTwoPoint->GetMathPlane();
0 i& O  q; K5 M, E2 U; h
* C0 F2 [- c7 I. q  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点
  a) ?7 `4 {. d! x, b1 q9 |* B* T4 A, l8 C
  //设置Container(非根节点)
, d* M" S2 l& _9 e; j; C7 L; h  //获得Editor& U! b# ~9 s1 R  q4 c% p3 i; z5 H
  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();7 i. k2 q. a+ L5 p0 {9 [( y4 k
; ~  u, g, S- U  S0 B# H* d8 w8 |
  //得到当前对象的文档
6 h2 y! U3 b  r. {  CATDocument * pDocument = NULL ;; ?1 @6 B, w1 v$ Y
/ Z( I6 u! g* z3 f* S9 u5 `
  //取得当前活动对象
* ?8 R" ~0 h/ s3 c+ F/ [  CATPathElement activePath = pEditor->GetUIActiveObject();% A* Y$ _& P7 @: \( t
' @1 {; w3 ~! t# w0 {) l* y
  //取得当前活动的product
+ z: F, P. ]* A8 D7 r  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());
4 W3 ~+ n+ h/ F9 W: q- ]- T' G
" V; H  x. [, Q8 ^& A, d8 W9 M3 J4 T! T  //当前活动对象不存在% t" q/ e7 n, J( j" R8 R0 a
  if (pActiveProduct == NULL)8 k$ _1 x! j* j+ j! l# ]
  {
: D, m9 i% j0 z9 W3 g: y    pDocument = pEditor->GetDocument();0 ?$ a% P4 y3 i3 _" w
  }4 B/ g9 D, O2 b
  else
  j/ s; J: G: P. Y- u6 Q  {2 E0 q# g; `% r7 E
    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();) c# P3 @. ~) y4 g; w# o* D/ G
    //当前对象的引用对象是否存在
( o7 K: V( H# w/ n7 H9 u% _6 D    if ( NULL_var == spRef )
2 a% y: A( l$ _3 l( ?: l8 K% ]* y    {0 {" K4 ~/ b- z: b0 i
      return FALSE;# H+ G3 g9 ^# C( X) U. H$ d5 p
    }" D( Y" D  @. v% R* s
9 A; \& d0 g0 c0 z/ M0 g
    //当前对象的链接对象1 P- [! ^3 G- i* g7 A) x
    CATILinkableObject * piLinkableObject = NULL;
- a, B7 x  z, Z5 v    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
6 m) t( j" ]( Z& Q# n) Y    if ( FAILED(rc) )0 @2 n/ c: D* u/ k, S) S: ~
    {+ F! n7 S; b5 f
      piLinkableObject->Release();
# C8 ?6 D5 p( v      piLinkableObject = NULL ;, J6 y7 O3 R, G2 I; a# u+ G3 f
      return FALSE;
6 Q2 ?+ f6 {1 l- S    }& F6 ^+ @& r. B7 Q8 x6 G
' n6 q0 s% B. N4 c
    //得到当前对象的文档
, M5 j, R: P9 u0 m" ^* f    pDocument = piLinkableObject->GetDocument();
! g' e7 ~7 ]2 E8 J( `7 @    piLinkableObject->Release();. E/ v0 j3 K7 H$ y# U0 F3 L6 k5 y
    piLinkableObject = NULL ;/ g0 ~  s9 F( g
4 L5 [2 o0 M( b/ V, M
    if ( NULL == pDocument)1 o1 H+ l) O- F3 c7 u
    {+ ?& \7 P- B+ S- ]! B/ r. ?
      return FALSE;
9 B" h6 e, g/ C) d3 x. e    }
' U/ \4 c) z9 M2 O( v  }9 `/ X2 a2 ~+ j0 ]$ ?! e
" A: ]& J9 E' U1 c$ N
  //得到文档容器集
7 w7 Y/ }! i( ~  CATIContainerOfDocument * pIContainerOfDocument = NULL;3 b* K2 W- f+ a' t. @$ B
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);6 M; W. D: \6 E" H$ w# h
  if (FAILED(rc))
% w0 k1 [+ S0 q% }+ T# V  {0 \3 |% d# `3 x  d7 C: z& H; x
    //pIContainerOfDocument->Release();0 c4 j( P! ]" q; P6 t8 e; J
    pIContainerOfDocument = NULL ;0 E7 B. c7 m. m  Z1 c# }5 x
    return FALSE;
# m/ s# o& I( J- l  }( K/ `0 G$ @$ T
: I/ M6 ^9 B9 M! ~& Y9 \
  //获得Document$ m* D4 E0 b0 P
  CATIContainer* _pContainer = NULL;        9 L$ s( X7 O2 k9 W! X1 J
  //获得SpecContainer
1 Z) W+ t" m- `2 G( U" m/ G: d1 s1 N  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
3 H5 e3 ]: X" U, h$ O' e        / A  r6 P$ e7 F" v- d
  //GSM工厂
5 M9 N, P4 p" _# U- @4 \* G- t  CATIGSMFactory_var spGSMFactory = NULL_var;
( l/ U, L" F5 h/ D' e) C1 N/ W* X/ B  //设置工厂                5 l' W" ~8 T1 o0 j! C" x
  spGSMFactory = _pContainer;                                                                       
" a3 l0 F- z0 V$ u$ R
4 b5 D! _1 a9 u9 Z2 c  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);/ M  Z. V6 d, ^6 U* Q3 |

0 z7 l  t8 r, X1 s  CATISpecObject_var spSpecPoint2= spPoint;                                        # c1 G0 o! ^9 e( r* r! T3 Y
" H( g( `+ X, M! d; c
  CATIGSMProceduralView_var spSndPntObj = spSpecPoint2;
/ W# p. w+ v) z# m# n0 M" O
$ O! y2 T8 E' D& p" {  //*将点显示在屏幕上
. D+ o' p: {* _7 x- X. `  spSndPntObj->InsertInProceduralView();1 x/ p* q/ l6 Y4 c, X3 X% E

! s% _2 h, `& A" N' [  spSpecPoint2->Update();4 H. ~6 l1 k- `8 h* i) n

$ w* {, }  |( K2 f6 \! S& h  //生成线) G0 H2 ~! ]3 S6 @
  CATIGSMLinePtPt_var spLine = spGSMFactory->CreateLine(spSpecPoint1, spSpecPoint2, NULL_var);
. z" `( @# r) f$ a! ^; o% ~8 w
# r( k/ ?. J- P8 v  CATISpecObject_var spSpecLine= spLine;                                        7 M( g# R$ a! ~; `2 J( t0 P2 m* _* X

. w+ O" d  C1 D/ a) o/ I! x( J  CATIGSMProceduralView_var spSndPntObjLine = spSpecLine;. Y- V# h8 `, C5 l: q3 c* d

9 q' Z9 E1 D1 S  //*将线显示在屏幕上
7 o- b" v9 \  R0 k2 ~  spSndPntObjLine->InsertInProceduralView();& [' H6 u* V6 j5 G6 Q7 F( B' [: O
' g- N- n0 A$ N6 N: V. [' J
  spSpecLine->Update();
6 a1 L2 H! F3 ^/ E3 P
7 c5 t7 ?+ J2 C7 ]. N5 [0 n. b' o& m8 ~  return TRUE;
8 B  ]  {1 g9 J+ ^* f}  ]9 c; q' M% i/ ^! U

9 E2 x& R+ n' ~8 r
6 {$ A# V% A& a2 G
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了