PLM之家PLMHome-工业软件与AI结合践行者

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

[复制链接]

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

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

admin 楼主

2017-4-17 21:56:09

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

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

x
- _8 s6 }7 H9 E! d8 n
Catia二次开发源码分享: 通过鼠标点击创建直线! A) V& C) ?2 K5 B: n

% ?9 L: z5 v! d% b8 s4 ?
3 D8 {0 g. D7 H( D! K& o- O$ J  [+ s0 s( \2 x' q6 T+ E' [6 q  R
#include "CAARCCreateLine.h", c; ]0 f' W9 E( r$ A
#include "CATIndicationAgent.h"
9 J4 m4 j# ^( B9 {# J/ v5 K& f#include "CATMathPlane.h"% v! l+ q0 e  s' |6 {3 x# }

* a+ e3 `  G/ C1 Q0 d( Y( s#include "CATCreateExternalObject.h"$ K2 l- g3 q# B) e% Y& g
# k7 A9 M- r" i8 `8 G% c
#include "CATMathPoint2D.h": _; U8 D+ O0 f! y$ G
#include "CATMathPoint.h"
4 @+ [: @6 g8 y. Z  p#include "CATMathPlane.h". ~5 f8 Q$ A6 t2 E

* O- F" }5 L& [( J% H! \* X#include "CATIGSMPoint.h"3 R( p* c9 }: z9 u
#include "CATIGSMLinePtPt.h"# K8 H% `0 ]6 `5 z% y1 W) _2 ~
' g- @, r: E8 ^2 U; C7 `
#include "CATFrmEditor.h"
) ^/ \$ z. M3 z! k$ Y( S! b#include "CATPathElement.h"
4 N, Q0 ?4 h4 _, T" N9 M9 z
; q3 K& j  m: I$ j#include "CATIProduct.h"
7 g  T, O  F9 U. ^# s: m#include "CATILinkableObject.h"
2 e$ D0 {' c# a/ O1 G#include "CATDocument.h"1 S$ w4 K" P" j$ g" s. N
* C7 m% G0 T% i- G1 t* T
#include "CATIContainerOfDocument.h"0 C0 E8 t) y5 C# X8 f

$ |' @1 p: B& X8 y1 x- v#include "CATIGSMProceduralView.h"( R+ C7 C' T1 y; I6 O9 `% [

) L/ n7 |- g& q- p) X: `2 N#include "CATIContainer.h"
+ y+ z  L: i7 J- `+ s#include "CATIGSMFactory.h"3 k2 t& Z. `, i0 [1 N- a
0 A  B9 \! y7 o# D0 S$ t/ _- v
#include "CATISpecObject.h"- v- O+ ]4 s; r2 K+ [5 s
CATCreateClass( CAARCCreateLine);
% Y. R! C. ?+ E0 H) z1 w0 n6 P8 ^
+ y2 o1 v% F5 s  o; h" [3 k  B; ?" _- L) e$ O$ O
//-------------------------------------------------------------------------
3 G' X) n3 w0 S# M// Constructor  q. j5 P1 U  N' D/ V, g
//-------------------------------------------------------------------------
! c8 j% Z* k" Q2 q$ y% Z% WCAARCCreateLine::CAARCCreateLine() :* g, v! ?' Q: w1 q! B& s, U: `
  CATStateCommand ("CAARCCreateLine", CATDlgEngOneShot, CATCommandModeExclusive) . |7 U  u. _- D) i
//  Valid states are CATDlgEngOneShot and CATDlgEngRepeat
  u/ i- L0 g3 H  v. ~6 k( C$ m  ,_IndicationOnePoint(NULL),_IndicationTwoPoint(NULL)& k( H  H# ]. j* I2 M
{
/ g6 j5 Z) f. }. G- ^9 m% T! W) E- F}
& m, a+ s2 C0 N4 H/ M: T" O0 Q  r' d( [8 s
//-------------------------------------------------------------------------- L: d6 {* M5 B5 r1 j# M
// Destructor
: K  K' T6 K' ]( z. h//-------------------------------------------------------------------------+ |. N. e" M& P9 g& d
CAARCCreateLine::~CAARCCreateLine()
6 |, _9 D6 S" b" q5 |7 B9 ?9 L1 \{1 \' k4 s5 i, Q
   if (_IndicationOnePoint != NULL)
( l+ y' O5 r" M      _IndicationOnePoint->RequestDelayedDestruction();) @( Q" O7 `, p4 ^* z
   if (_IndicationTwoPoint != NULL) / P/ |! J2 h/ R' A3 y+ \- d
     _IndicationTwoPoint->RequestDelayedDestruction();
! y; a8 t6 \! G2 j' k( Y}
* C, s- h7 S; f' Y* j( d- F& x% e1 C3 [- J/ U8 _* H

3 h( q# a! o1 S3 y" M//-------------------------------------------------------------------------
6 h) p7 r, x" E// BuildGraph()
6 v8 o; \  f2 n//-------------------------------------------------------------------------
! B% A& ?, b/ @7 i' \void CAARCCreateLine::BuildGraph()
7 d' [( U) U% P3 Y: H& x7 g: n{
, l: a5 l- j/ w* u! T6 w  ~# }% @4 ?: J0 }& `: X/ t0 h: o

0 E( b5 N% m$ j0 [: K5 [  // TODO: Define the StateChart
# y+ n& c9 P! i9 ~9 F4 J5 |6 ]  // ---------------------------
* Q/ h" u, M$ I! t  _IndicationOnePoint = new CATIndicationAgent ("IndicationOnePoint");
* k- _" L: B$ c4 O3 j  AddCSOClient(_IndicationOnePoint);
8 ^5 _! B- r2 {9 L/ P0 y3 q" r5 ~% f9 x0 y2 C$ U6 V0 O
  _IndicationTwoPoint = new CATIndicationAgent ("IndicationTwoPoint");/ C1 p& c  t# L
! C& \% s/ b  `7 H( J
  CATMathPlane PlaneXY;# P+ x0 ^+ F1 {" A# Z8 p
  _IndicationOnePoint -> SetMathPlane (PlaneXY);8 ~0 E8 c5 H# T( B- Q
  _IndicationTwoPoint -> SetMathPlane (PlaneXY);2 W: `7 G$ ?! {) @3 M

5 z0 f1 e- J5 M! @: U- q5 v1 A# m, {  CATDialogState * initialStateOne = GetInitialState("选择第一个点位置");" S$ u) |/ n) C1 {! ~7 ?( q
  initialStateOne -> AddDialogAgent (_IndicationOnePoint);. ]: H, p4 H6 S( y' Y2 [8 E

( m! m& B/ M( h- H, z- O  CATDialogState * initialStateTwo = AddDialogState("选择第二个点位置");# u) g  q) t7 K( c7 m, N) y
  initialStateTwo -> AddDialogAgent (_IndicationTwoPoint);" _* o; j: e; K4 P7 }

( b* s9 M, L( O, S$ K  AddTransition( initialStateOne, 6 p* }+ t1 @$ @9 d
                 initialStateTwo,
3 m% U) i# c8 a3 e: ^6 y$ F                 IsOutputSetCondition (_IndicationOnePoint),6 S6 P1 Z+ E+ K3 F
                 Action ((ActionMethod) &CAARCCreateLine::ActionOne));
4 v4 p* f1 a1 @
" V6 G9 d; w, o2 C% H  AddTransition( initialStateTwo, 0 i2 C3 h3 x9 ]
                NULL, & T5 A" N3 H+ w$ `% b
                IsOutputSetCondition (_IndicationTwoPoint),
2 i7 J: m6 D7 B: t                Action ((ActionMethod) &CAARCCreateLine::ActionTwo));
3 `' F$ S* \; F; r}9 M2 g3 h* q. S! e# J( `$ k. b
% h: e# [2 S4 p, [! V! j
3 ?4 m1 [0 v( ^: B3 r
//-------------------------------------------------------------------------
3 C& f8 {- _  T5 o0 Y2 ^% W// ActionOne ()
9 W7 `3 C( c% J# m1 ^2 g3 @//-------------------------------------------------------------------------3 w/ E) {0 X3 t5 J. z
CATBoolean CAARCCreateLine::ActionOne( void *data )
, B0 x8 c1 A6 x4 Y/ E. ^, m3 b# I{% {0 t1 n3 m# D) k" j
  // TODO: Define the action associated with the transition ( k7 y' v3 h! k1 g# ?
  // ------------------------------------------------------$ a% [+ Y4 r/ A6 P7 K2 Y, Z# z
  CATMathPoint2D point2D = _IndicationOnePoint->GetValue();//获得一个2D的点* Q) C) h& I8 ?9 O4 ^# O

7 W# ^2 G' e' [  CATMathPoint Point3D;
# h  I. @* b& C" t. M  CATMathPlane Plane = _IndicationOnePoint->GetMathPlane();* ^& f* d" |( S/ a+ f. \0 Q

6 j: {; R. V7 Y" P  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点
. f" r+ A. s* i; e6 \' ~8 n, W4 n1 M! _) _% y
  //设置Container(非根节点)( K6 e, n# z4 Z4 k2 q+ D
  //获得Editor; o9 j' x1 a3 P" |
  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
- r! y7 f. \! G6 @" b
; A" c1 Z9 ]5 j; E+ T( _4 a  //得到当前对象的文档9 w9 D) E) J" [5 a7 o# @
  CATDocument * pDocument = NULL ;. G( ?! m9 y! M7 c# j

. P' p( C( y9 Q1 W3 ~  //取得当前活动对象' [# R" N$ f, |' [2 [
  CATPathElement activePath = pEditor->GetUIActiveObject();  u  _! x$ a8 W/ L3 U/ O
( W: N  u- u" I; R! G" {
  //取得当前活动的product
# G8 B! p! |9 R  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());
0 u+ ^. e* \) [& ?  m
. H- z  m! z7 ]  //当前活动对象不存在
3 E" g; X, l9 h* V  J/ k3 b7 [  if (pActiveProduct == NULL)
3 g- a2 x$ e- P, H9 J2 [  {* Q3 \) T2 ~! g: p0 q. S# G
    pDocument = pEditor->GetDocument();' f0 T9 a5 }% P/ F3 h+ [! T( i
  }
7 v- t# B, j4 a% U% b" u  else  K5 |3 `' @9 ^" W/ D
  {
. {' @. ?/ d5 y% h    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
& f" |! p) L+ K, Z+ i) L    //当前对象的引用对象是否存在9 Y. D# M# y5 i( Q
    if ( NULL_var == spRef )
! g: d: e! P& }0 ~+ [2 u    {6 M3 g% T. b" [
      return FALSE;: Y' Y' i3 I: {6 l+ g6 ^. }
    }1 c+ K6 b& _* G( |, N* s- ?

, d2 ^$ H9 h% ]+ V9 n! ]: o    //当前对象的链接对象
! Y0 M# h; ^0 q- p( U8 U    CATILinkableObject * piLinkableObject = NULL;- k$ G( ]: X4 n  U& h5 `1 ]
    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
+ i- I) s. `+ N# Z6 D    if ( FAILED(rc) )" V! C+ W2 w% d. j* y+ d
    {1 s* q, J' ~/ X- M  y( |
      piLinkableObject->Release();% K# B* L$ Z2 Y5 k: y# P& y4 a
      piLinkableObject = NULL ;) W: p* d) ~- V) U; u
      return FALSE;+ Y, v" l2 M% F8 \3 c/ f
    }
' _: D$ r+ o# a0 ^0 o2 t, r0 F3 w( t" ?0 x" o
    //得到当前对象的文档9 X2 R6 |) @# c3 k' H/ R. C1 k6 `6 s
    pDocument = piLinkableObject->GetDocument();
" a' M9 @! m8 A! }$ J) u    piLinkableObject->Release();
/ W- w& V5 `2 ~0 U' V. i; T' Z: B, J    piLinkableObject = NULL ;
7 Y8 d- X4 _& z! [: I6 ^1 E, G9 T
  i+ M. b( [' P    if ( NULL == pDocument)
, r5 B# P2 J- v    {
4 m" z/ l& N" K2 A$ J& M9 u& k      return FALSE;
1 e, `) b- m2 m) l6 F6 z    }
1 B6 o6 s1 b) Y. M  }
+ x) a: |$ w+ C# s4 f6 M/ A  w6 }% p6 }
  //得到文档容器集1 U& N/ r7 n9 C8 J. |, q1 f0 l
  CATIContainerOfDocument * pIContainerOfDocument = NULL;. v; {! _5 W/ g2 I
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);
6 c0 w2 V6 f) q7 s! N  if (FAILED(rc))
! K2 X' f, ]6 |, L* S- I1 j" }  {* V% s3 t0 `' U0 R, }+ X% w" g/ C1 y
    //pIContainerOfDocument->Release();* b! x8 F* k$ \9 ^  l
    pIContainerOfDocument = NULL ;
- X) B' z% ^1 M' }4 S3 C    return FALSE;
% j2 I8 j. D4 c% q! g" {  }/ a# g- v3 t8 h

; J+ B" _7 ?( m: |% e  //获得Document0 c& ?# f2 t( B9 F
  CATIContainer* _pContainer = NULL;        ) \# T7 h0 u5 s5 r$ }/ h
  //获得SpecContainer5 x: z( h9 i6 S7 W/ Z* p( c
  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);( i0 D, Y. G9 w- e& L
       
2 @" a  F4 }5 i2 e+ N4 u  //GSM工厂. {2 [2 I$ h: W' @
  CATIGSMFactory_var spGSMFactory = NULL_var;
$ W( g- g& @. ~! k) C8 p  //设置工厂               
3 ]4 X# @% T* q3 L% I6 P  spGSMFactory = _pContainer;                                                                       
' i$ G/ Q5 {+ i' v  m
/ J' |7 ?' ~' Y1 W4 `  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);' \$ y; z4 y1 c) G; p& H
. c6 @& P9 ~+ l- K) N2 {. c! ~: f* u
  spSpecPoint1= spPoint;                                       
$ i+ z4 }: A3 M) O( K% G
. e; u4 s! z$ Z; u( E/ ?: s  CATIGSMProceduralView_var spSndPntObj = spSpecPoint1;9 _' F3 n& |) e/ f/ o4 \
, L) @. s% a* h& r- F
  //*将点显示在屏幕上: z% L. f1 T& |8 Q. }' x
  spSndPntObj->InsertInProceduralView();
, @, u6 I- m! w: ^8 q: E9 Z- f3 q
) J9 A) `# e# h8 Z7 T  spSpecPoint1->Update();5 E) ~( h* |$ t3 _
+ c) U' Q0 Q  ]  N6 I) z3 A
  return TRUE;' u2 l* T2 s3 Q( Q9 u
}
7 ]2 y! T& d# t' [" v
: K+ U: x, k; v7 Q) Q; s//-------------------------------------------------------------------------
2 [3 g) W- t; N6 G// ActionTwo ()9 |; X& x9 \6 i9 y
//-------------------------------------------------------------------------0 p5 C1 C" G0 w6 W
CATBoolean CAARCCreateLine::ActionTwo( void *data )
3 P( E. n# X9 K{
9 B8 e# G! ^/ I. F8 z" \2 w  F  // TODO: Define the action associated with the transition
- x9 y6 p( g- i4 l# G  // ------------------------------------------------------  L8 f) E+ S6 D- h7 `. O
  CATMathPoint2D point2D = _IndicationTwoPoint->GetValue();//获得一个2D的点
- S' q' Z% \* N( U* }  I* Z, Z. M3 s8 R, h: T  ]8 X  H$ l) i& y
  CATMathPoint Point3D;
6 L0 a" D4 n. B4 b  CATMathPlane Plane = _IndicationTwoPoint->GetMathPlane();# X, n( r0 u1 G8 b+ Y& G* }

7 _" C, e5 ^( O; n  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点# D) q, N# @) t. O8 j, O
& }, L% d7 M8 {* Y. a  Z
  //设置Container(非根节点)
/ Y  ^9 {4 l% o, H" p1 _: L  //获得Editor
0 K3 T2 D& `' ?" P2 Z4 E& a0 M  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
# h% I0 Z" ]" h. I
; P7 R' W- B( Y5 o7 p& v  //得到当前对象的文档
+ t; C9 q$ ~3 m& B  CATDocument * pDocument = NULL ;( u; l* |+ j" l: [
7 t  {$ F6 ?/ ^' n! L3 H9 I' z
  //取得当前活动对象" X6 H7 ?6 g4 w3 M) ]5 V
  CATPathElement activePath = pEditor->GetUIActiveObject();4 @* T( C! L5 k% E, L# _
" a5 t; J: h$ d4 q: j& i
  //取得当前活动的product  B& U! U4 ^% e9 w0 g, a5 r
  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());$ m- J7 F* U8 `. R! y

# F! y$ e$ m' B0 f  //当前活动对象不存在/ v- D1 M5 V0 q& \7 a( G! L
  if (pActiveProduct == NULL)" p1 R. B6 Y4 n, W  N! o- `
  {
9 D& @! H! H- h. Q$ G6 S    pDocument = pEditor->GetDocument();' W- S# s; v- r0 H
  }# l  h' I) _( x8 p5 Y3 r" g7 W- ]
  else
  j* q) y8 Q1 u" b  {  Y6 O4 U- Z/ {
    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();% T6 \- }1 k; z) m  Z
    //当前对象的引用对象是否存在
& G  y$ ^  W0 e4 b- a    if ( NULL_var == spRef )
+ w$ _  Q' Z  s6 D    {
/ C" P6 G7 O$ E" ^      return FALSE;) h) C% E; z# p
    }5 k% e) ?0 f& O# j
8 e; M/ O+ }- f& V) d
    //当前对象的链接对象
5 f/ ~; s" L3 ~2 y+ x% a: W    CATILinkableObject * piLinkableObject = NULL;8 z5 Q; y1 ]" l$ v+ v- ]
    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                            1 [% c# w) @8 P$ x. ^" u  y
    if ( FAILED(rc) )
# n( M# T! f6 F4 j0 J    {( \) S. A- a9 |! e9 R# V+ c
      piLinkableObject->Release();
( P  m7 u& m+ ]* U  t) ^      piLinkableObject = NULL ;
  k, N9 n' U' r      return FALSE;
+ L' \' r2 {6 s) b/ p    }
' x; a" p% Y$ c! A* N* x5 {5 C5 A! n/ }, r# D. P" j
    //得到当前对象的文档" \% H& `. ]$ x* M% j
    pDocument = piLinkableObject->GetDocument();
3 ~9 z( s0 k0 a  h9 a& q7 c3 ^/ Q    piLinkableObject->Release();2 g+ l/ f- }5 G% y) D4 T: W
    piLinkableObject = NULL ;
/ d9 J' U# U( g0 j; q/ f+ s/ M% {
    if ( NULL == pDocument)
. P5 {' @8 M9 b3 c    {  J+ @* w# G5 J) Z3 E& O) w
      return FALSE;
1 J- S, [7 i) G4 H    }
' V" v5 z1 d1 n9 L5 }9 Q3 @  }
/ ?5 |4 F( x' b- s  z  L* o
, B; o) q+ ~- ]1 h  //得到文档容器集
; y- B" K8 C9 ]  CATIContainerOfDocument * pIContainerOfDocument = NULL;9 u: h& c4 P2 u0 U4 O# ]. N0 m7 u
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);
' C7 D( H$ F9 f' u) O* _  if (FAILED(rc))
* Y' O( V, m  b1 O5 C  {
  m) J- {, G6 B% D    //pIContainerOfDocument->Release();
0 l2 w/ F. ]% Z* ~; d9 a. T' }" a4 ?2 ^    pIContainerOfDocument = NULL ;; ^/ B4 q4 N5 o. V
    return FALSE;/ T9 }' `% ^+ G2 j  A# M
  }
- V  t0 f/ P6 B* R' F6 E# \% ]( f) I, V* j0 r8 M1 k
  //获得Document" H  {% ?7 x( o7 J% B0 E. w- q
  CATIContainer* _pContainer = NULL;        % {5 |6 D% N+ F' e: ^6 W1 y7 A
  //获得SpecContainer* p4 Y: Y+ z7 ^! i; K
  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);! o% w+ K5 d* _6 V2 X; L/ f8 Z
        ; e8 u* b  O  Y7 R- W2 g' a
  //GSM工厂
- }. D& J8 Q1 P/ L% c  \& j" h  CATIGSMFactory_var spGSMFactory = NULL_var;
( h5 D+ O# T' s, |3 E  //设置工厂               
4 y- b) `1 W% @9 {+ M2 L  spGSMFactory = _pContainer;                                                                       
0 P( i& k! U$ T  Y% K4 H2 a- g1 V5 K# s  w
  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);
5 X' ^, h# h; O( Q' @9 O1 Z+ i! H4 x% c# a/ R$ a
  CATISpecObject_var spSpecPoint2= spPoint;                                       
* z! |. ]! I6 i9 E
1 o# `) |3 u5 M  CATIGSMProceduralView_var spSndPntObj = spSpecPoint2;
, W8 Y  C& Q, E6 J) f' G
- T, H! E. m( l# Y& E  //*将点显示在屏幕上( @5 }& }5 g  m, c7 G
  spSndPntObj->InsertInProceduralView();
* W! K- f9 P( \6 h, S. [5 S  C
, E: T0 s4 ^/ \( F  spSpecPoint2->Update();) R$ Z2 e9 e8 b( T8 ?
0 f6 K4 U  F& B. Z4 t
  //生成线7 F) D4 V6 R4 [! i( F! D$ L0 o
  CATIGSMLinePtPt_var spLine = spGSMFactory->CreateLine(spSpecPoint1, spSpecPoint2, NULL_var);* |, W* a1 m! G6 h1 _
6 M2 P4 H0 N9 ?' ?3 U, l
  CATISpecObject_var spSpecLine= spLine;                                        - X. [- o) X/ H2 |9 B4 ^9 l/ _

3 h2 t2 [7 i' u4 [  m, L  CATIGSMProceduralView_var spSndPntObjLine = spSpecLine;6 h3 j' O6 [8 J7 t' S

3 }( n/ G' J( G" p  //*将线显示在屏幕上2 S* I( F( {: r
  spSndPntObjLine->InsertInProceduralView();
: B0 B# c! I7 J  U6 X" b' W, K9 a8 ~: R
  spSpecLine->Update();8 a& S0 F, i0 j7 y" r

. W  g3 `% v( [7 l! C  return TRUE;6 `6 ?/ b9 O% e. B0 n! u: w
}
  b8 R, w# ^4 o" v1 h& ?+ G1 A3 P( i9 |- \6 m
1 g/ H7 K$ a9 a# S  N) C$ b; C
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了