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

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

[复制链接]

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

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

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

x

0 k' |. ?) D) }; UCatia二次开发源码分享: 通过鼠标点击创建直线) T5 N2 z/ Z' d" d$ _' @
. ~7 l0 m+ M8 J! {
# f: n& Q5 f7 R; G  |8 f8 I* j; \6 V

/ N4 a! e8 x. g: D( I1 f( s' G#include "CAARCCreateLine.h"+ A) _0 f( s! P6 O/ i8 I
#include "CATIndicationAgent.h"
' Y& r" k" M& }5 X#include "CATMathPlane.h"
$ B7 |  U+ ?) s8 c
' ~2 G; g2 l$ Q& i. v- s, Z#include "CATCreateExternalObject.h"
5 R5 P& y+ W! A# r9 @9 B+ z$ U3 \' o4 N: B4 ~) d$ C
#include "CATMathPoint2D.h"
% J* C; O9 a: o7 l$ ~& ^) A/ i! W#include "CATMathPoint.h"
7 y: U3 ~9 o' c. K0 R#include "CATMathPlane.h"
- _; U7 n$ C' }) b8 p( a  w6 N+ D* o
& M) B8 S! e2 |: x- k  o' ^3 U#include "CATIGSMPoint.h"' g1 K# K; M. _/ r2 s, a' j. \
#include "CATIGSMLinePtPt.h"( E+ B$ F1 g$ ]

1 [4 U5 z/ e& e. j#include "CATFrmEditor.h"
+ X( J' c% n3 }#include "CATPathElement.h"
8 m7 ?% w* g! O1 p8 g2 \9 y7 j. L- I+ d* q( w
#include "CATIProduct.h"
" N$ i" t" a7 o" ?2 |! e#include "CATILinkableObject.h"
  {2 M4 A; c6 @8 t, \$ ~#include "CATDocument.h"
# u: c5 v4 p- B# X- V+ q' r3 K9 e! o: [& S6 D+ N
#include "CATIContainerOfDocument.h": @& L2 K' x. w) F

4 h1 }9 V9 P2 R1 h; }8 A5 [#include "CATIGSMProceduralView.h"  k' Q9 u3 y6 Y" a

  N* z7 T" G3 c1 O3 F+ L+ K#include "CATIContainer.h"
# U; k( T$ F) n& V9 w4 `: j#include "CATIGSMFactory.h"
: M" J, l: S$ d* ^/ `) f
! h9 m$ \2 L0 j: M8 Y+ w$ {#include "CATISpecObject.h"( _+ }) B6 s0 `' e* y% |
CATCreateClass( CAARCCreateLine);
0 O4 m7 }1 V% x) D  W) g2 s) h. y4 S+ z% x; ?! ~

4 w* ?( u' M+ m$ D# T  H//-------------------------------------------------------------------------
& L, ], @$ Q/ R; T, R- B! c// Constructor
8 f! N' B. ]  S+ M" L- `//-------------------------------------------------------------------------
6 M* E4 N2 H' b9 u% o! m9 f4 N1 PCAARCCreateLine::CAARCCreateLine() :
2 J/ J. h0 R; `# t2 ]0 E  CATStateCommand ("CAARCCreateLine", CATDlgEngOneShot, CATCommandModeExclusive)
1 [" e7 ]0 n) L" X5 _- K//  Valid states are CATDlgEngOneShot and CATDlgEngRepeat
  U' J/ r2 u) E3 I& ~2 @  ,_IndicationOnePoint(NULL),_IndicationTwoPoint(NULL)# Q0 T  E# _8 ?
{
6 |" ?* n: |4 d6 d& n9 E% Z7 H% X}* G. D7 ?3 J3 D" P. {4 \4 h

9 F6 z% r2 I& x' k( ?! w//-------------------------------------------------------------------------$ g5 Y! ^8 Q6 }+ o% i
// Destructor3 d  b& A. A& {. ^% I& D
//-------------------------------------------------------------------------" D0 G9 l- k) j5 g1 V
CAARCCreateLine::~CAARCCreateLine()
2 m6 O! k7 E' X{
( n. q" f# B6 ]6 Y7 O   if (_IndicationOnePoint != NULL)
0 T6 Y( d+ I) f6 |) {& G: H! p& [      _IndicationOnePoint->RequestDelayedDestruction();! m& T; b# O) y
   if (_IndicationTwoPoint != NULL)
' y( r  l" O/ C0 d     _IndicationTwoPoint->RequestDelayedDestruction();
) Q/ g: w. H& ~% h}- Z0 n# N, v" ]( U( X
; b. C+ i& \9 d8 _. \2 s
% ]# ]) J8 j5 f, i& i0 J: M% w
//-------------------------------------------------------------------------6 X0 G! r& f6 k+ L3 W, X7 ?1 `0 a; L
// BuildGraph()5 W9 d. @, u0 g% J  ^3 w3 V# r# m6 i9 o
//-------------------------------------------------------------------------2 J  k3 J' F* K4 M7 \* X0 L( I
void CAARCCreateLine::BuildGraph()$ O5 |2 A8 j: [% v
{
. d* H" |  ?/ i4 \+ h$ U; C( e' O4 {. r. |

0 U  G2 v4 E* X* n, X  // TODO: Define the StateChart 0 b& i% m& k! W3 L3 J
  // ---------------------------
: }. n9 b- l! q1 E5 o# W* R/ \  _IndicationOnePoint = new CATIndicationAgent ("IndicationOnePoint");" u, E. a" R5 l8 a
  AddCSOClient(_IndicationOnePoint);+ _: S& O) @$ ]- k

+ {* H, Z4 S4 M- H. G  _IndicationTwoPoint = new CATIndicationAgent ("IndicationTwoPoint");
- {" \* l3 o; r, i% j; q1 a* o# ], I6 T8 t0 O; D* F4 q  I& V4 J
  CATMathPlane PlaneXY;
& Y3 C+ T( G; k0 K- S  _IndicationOnePoint -> SetMathPlane (PlaneXY);
* K" {6 ?& K$ L$ P% W# P  _IndicationTwoPoint -> SetMathPlane (PlaneXY);, w- y4 v" x3 U! U% ?& H% j5 j
# R, Z6 C8 Y  c9 w8 y$ V7 ~& M( q3 m
  CATDialogState * initialStateOne = GetInitialState("选择第一个点位置");
; I: \2 c" I/ [+ Q+ G( e: S  initialStateOne -> AddDialogAgent (_IndicationOnePoint);
. {% F5 r3 I, W5 E; U" b
( i8 y! @- q2 M4 u  CATDialogState * initialStateTwo = AddDialogState("选择第二个点位置");: m8 s. |/ \7 M. g- r, K4 W5 F
  initialStateTwo -> AddDialogAgent (_IndicationTwoPoint);
% q: @# D. o" o- n: u# C2 o$ b8 n
$ ]# L& w( x7 D- W  AddTransition( initialStateOne, " R- A1 ^; r, n0 k
                 initialStateTwo, ! I6 H6 a+ S! M- P/ K- Y
                 IsOutputSetCondition (_IndicationOnePoint),: d3 k( H9 B9 Z1 {
                 Action ((ActionMethod) &CAARCCreateLine::ActionOne));- l1 `8 H) A& z) d" Z/ I* ^
# T; E, L3 z1 y. R  x9 o
  AddTransition( initialStateTwo,
2 [5 x' }; @/ ]                NULL, : \$ f- U  z  d/ ]4 F9 p/ |; ?
                IsOutputSetCondition (_IndicationTwoPoint),
& r" z3 }8 N$ S$ Q  R                Action ((ActionMethod) &CAARCCreateLine::ActionTwo));- m+ h( |8 g1 x! |
}7 H3 e7 b" u/ s9 Z7 p
+ @0 t% _+ `$ O1 f
* o$ @. }$ _4 Z3 B# i2 r' [
//-------------------------------------------------------------------------
0 W4 ~( F' H! `8 c& @% q// ActionOne ()3 K7 b+ I6 Q7 h
//-------------------------------------------------------------------------, b0 X1 Z+ W6 l, \0 Q( n/ e
CATBoolean CAARCCreateLine::ActionOne( void *data ). |. X. b& H1 J! j7 J6 t
{
; K4 p$ L: {& C9 f  // TODO: Define the action associated with the transition % ]( l+ {3 \4 M; W5 G
  // ------------------------------------------------------
9 ]0 z% J( f! S  CATMathPoint2D point2D = _IndicationOnePoint->GetValue();//获得一个2D的点3 }; i. f" q! y6 z8 G; g% J

3 y. O6 q: ?  E* O( C0 N  CATMathPoint Point3D;7 a9 ^, A7 J. X7 k2 d! l/ [
  CATMathPlane Plane = _IndicationOnePoint->GetMathPlane();* i( A- b9 z' c' `' P+ f9 r4 u

6 j& _2 v' D9 V  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点% S; e- U- S  t. m* G- R7 n

, z- X3 i4 R" W% o; ^) W; W; {7 S0 H  //设置Container(非根节点)
) Z2 W4 f; R4 p0 P: D  //获得Editor6 l4 I' o3 y9 T" B
  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
( I; K( e- B7 |1 ~$ ~- H3 }5 F4 e# P8 u! n
  //得到当前对象的文档9 U" [; K9 X4 Y
  CATDocument * pDocument = NULL ;2 ^9 r' e+ R" _5 ~5 {
. K, K# r$ M  d1 }
  //取得当前活动对象
% \2 H* \' l) \  CATPathElement activePath = pEditor->GetUIActiveObject();
$ L/ {! R8 E  o: O7 k5 M- Z& |+ K3 X# p( M( n) q! O
  //取得当前活动的product) ]) U" K9 p4 {9 Q  J
  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());
' y, \! _/ D/ _2 _9 z# `3 D) C" A  {) p2 G0 P
  //当前活动对象不存在
( _. \1 R% z9 G! v2 Q# K1 h  if (pActiveProduct == NULL)# a* K. n' m2 N, V
  {
8 V6 [& M' X) e  |0 S    pDocument = pEditor->GetDocument();
# R) g6 Q* E* Q' C9 T0 M$ \# G  }+ w& H/ t6 W0 Y! y
  else6 ?9 |0 P, m" O" K4 ]; c& A* o
  {
* u6 Q8 Q6 Y: G/ V/ w/ X" _    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
1 D% I- M# R, ?* S% T    //当前对象的引用对象是否存在  g6 S6 K9 g9 `7 E9 D, y: c
    if ( NULL_var == spRef )1 K2 l, N( {( F  j
    {
$ \& D( f" J& [: u. M$ T      return FALSE;% V  ^. \: W0 T. o! Z- N
    }4 x/ j6 q7 ]' q. a1 h- |7 ^
2 J3 I8 T5 o+ I7 o# }% q
    //当前对象的链接对象. _+ L1 i1 s$ v" [' V! h
    CATILinkableObject * piLinkableObject = NULL;
" p, E1 E- @3 C    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
  e0 h# w4 X& t# P3 M& R% P    if ( FAILED(rc) )
8 \9 f; s- W4 K/ B. A- [6 J2 i    {
2 e+ U- f9 M6 O* \/ P7 P      piLinkableObject->Release();: X) Q4 r% A6 `- o& B& @4 y
      piLinkableObject = NULL ;$ }# W, ^5 i5 t7 B2 e
      return FALSE;% ]3 a6 a0 X1 i
    }6 n# ~8 u! j0 H" @$ {8 Y( r
8 l7 X. m1 d0 M
    //得到当前对象的文档
( I+ y9 ]. C2 m* }8 ?/ i    pDocument = piLinkableObject->GetDocument();* q" _; P) N7 j( n' Y2 B
    piLinkableObject->Release();$ @. P: A8 T, ~
    piLinkableObject = NULL ;
) r( R( v* `6 i. {
$ Z+ y9 r0 R& z4 n$ F    if ( NULL == pDocument)$ }! V- N% G! T# q! p, }
    {$ l. @2 U" V% `( W% Y4 i( E& K2 w
      return FALSE;  x7 P1 n5 A/ B
    }
- ^! a. Z- l7 }! E  }  H) {, g9 e* }  b2 u- D! B$ N& T) E

" ?: i" S! G, V+ I6 a  //得到文档容器集$ w/ T0 K* @0 P) u
  CATIContainerOfDocument * pIContainerOfDocument = NULL;
2 o1 y! M2 j0 x& s5 d  G6 T2 g  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);
4 I6 _- g5 l2 @9 M5 \( L  if (FAILED(rc))
! K4 F5 _5 H' s5 C/ v  {
" O3 m: N* m: N6 R% ]* g) E8 u    //pIContainerOfDocument->Release();6 ?( f; F) Y5 j! v: Y! r/ }& b( U
    pIContainerOfDocument = NULL ;
* n* X+ L0 a2 U: ]( F    return FALSE;& A  m+ c: y) {/ w# |( i
  }
9 F: M+ c3 m0 O# l4 x. j! F+ c9 u7 D: c7 _" j
  //获得Document/ }& b7 N% I. i1 n! |8 |4 t8 n
  CATIContainer* _pContainer = NULL;        # H  Y5 U( }5 o8 ^# v& W
  //获得SpecContainer
1 u% s" g) @& |6 X# t  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);2 d. ]; K* ^& r
        8 H3 v8 I) `0 A
  //GSM工厂
; f$ ^- Z2 x7 @0 d' i4 }8 Y  CATIGSMFactory_var spGSMFactory = NULL_var;
% S% Z9 v( Y/ n2 h; U  @) o  //设置工厂               
" m, _$ E! j/ K3 u  v1 A  spGSMFactory = _pContainer;                                                                       
: b+ `  e5 }; G: T  Y
* v" b6 a. r3 {4 G* |  c# ]  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);
5 a+ |3 m2 t4 k0 H
- o4 E( W  j6 f  spSpecPoint1= spPoint;                                        ; R  s  ?/ S. u, F9 w

, G0 T) B0 Y3 Y. o' ]* n  CATIGSMProceduralView_var spSndPntObj = spSpecPoint1;
/ v' ^7 S" N7 d8 [4 \
1 p7 f, `- q5 y  ]2 ^" ~8 E  //*将点显示在屏幕上- c6 t# d% ^' W' F$ U
  spSndPntObj->InsertInProceduralView();
0 B4 M" |! `7 E, S
! C/ |- v% f4 r2 v) j: ~! C  spSpecPoint1->Update();
) B0 k" X1 b  B/ H
! h0 R$ ~' b5 \: K$ @3 H3 t  return TRUE;$ I; @; l5 b7 L" c" \
}
7 y! ?, _+ x8 T3 B8 [4 L8 j6 G
% b* T5 T/ j7 F) k//-------------------------------------------------------------------------% Y. [. l$ N2 l8 O& T, X
// ActionTwo ()
' T7 s& o) g9 K6 x# K0 J//-------------------------------------------------------------------------
; @% G7 C7 z$ Q) M* w( \CATBoolean CAARCCreateLine::ActionTwo( void *data )
( B7 o- r9 B- ~6 C( T& q{
( B1 n6 C) s3 q/ X2 h. W9 c; e  // TODO: Define the action associated with the transition , x9 C$ u/ N% Y6 p. q9 ~, ?
  // ------------------------------------------------------
5 U( W  N( t' f! u  ^$ Z4 X7 }  CATMathPoint2D point2D = _IndicationTwoPoint->GetValue();//获得一个2D的点
* ^  e& n, t! @: w
0 w' z; O  }7 `5 r  CATMathPoint Point3D;
# J0 Y0 c! D+ x( K  CATMathPlane Plane = _IndicationTwoPoint->GetMathPlane();
% B8 h- i( i9 C& m% x* a1 P: b* z/ n( k( Q, T2 h/ L, ?
  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点
4 a: v' a) p5 J) u1 K5 B7 h
5 ~. f) Q1 f( s* b" Q: r  //设置Container(非根节点)
: f" ]. L' _4 K' u: U% a  //获得Editor
% Y1 `2 x' H; T5 Q! E  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
+ C. l% Q/ `7 z' N/ L% `  K5 ^3 A) T
  //得到当前对象的文档
# \$ o5 l9 O- i% u2 f( F; l+ D2 i  CATDocument * pDocument = NULL ;2 F5 ^( O9 X8 I0 F* U+ y9 M

- Z8 k' Z+ u$ L& S' y; P/ O# Y  //取得当前活动对象/ `4 X& J9 i% F% P
  CATPathElement activePath = pEditor->GetUIActiveObject();
3 u  F- p6 |9 ?- j1 y8 U" G( q: n. L4 ?/ Y  Z
  //取得当前活动的product% W% V! G* _! O- c2 h) d) ]
  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());
  o" X( g# P. ]& N% m% K7 a# I7 a$ v& w( S
  //当前活动对象不存在; P7 A. {3 ?+ `# M# D, y+ @
  if (pActiveProduct == NULL): h( m3 X/ h2 ?4 e& _- a
  {
, `& U2 G& M' m- n. Y! a" k) F0 N    pDocument = pEditor->GetDocument();# J8 C! P/ D# i/ R3 Z! }
  }" u+ ?# V+ G* F  L0 ]
  else# _: ~5 ?4 O9 |6 H" P
  {
  [: m$ {) F7 J    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();" G& W- h; @% |, M# U, o
    //当前对象的引用对象是否存在) H$ `. y% s* c" a" p1 g/ A
    if ( NULL_var == spRef ): ?) l3 G6 o$ p( [6 y* y
    {
. S4 Q$ j; v6 E) s4 \      return FALSE;8 \; M' S$ }- C3 V% i
    }
7 G5 S1 k% U" Z# g9 A2 k$ W/ h
) `, a: W& q. \3 Z0 h3 F    //当前对象的链接对象
/ s1 y' y6 p9 Q- W2 G2 s    CATILinkableObject * piLinkableObject = NULL;0 z$ e0 l* [& H+ ^. m; N
    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
% k- i7 E& o) C    if ( FAILED(rc) )2 u$ u1 T; |) y  ^0 L4 m6 s5 z7 T
    {
$ _- _: Q/ L! K( d      piLinkableObject->Release();8 i% X3 _3 e) v8 r3 G3 I. z
      piLinkableObject = NULL ;4 c5 M% ~' ?" ?. _4 S# @! x
      return FALSE;
' z! L( L& K$ ~    }7 x2 w; `9 c" ^1 [

& ?4 w4 O- \+ f/ t+ f3 C( q% V" a    //得到当前对象的文档, v) Z, R6 T! o, r9 x. O9 I
    pDocument = piLinkableObject->GetDocument();; E2 U& B  o: R; k. |
    piLinkableObject->Release();! y# w* w& B. M% i$ Q
    piLinkableObject = NULL ;! |$ @+ M! v0 b
) f7 f4 x: |) n2 G$ v  m
    if ( NULL == pDocument)
! d, K9 ^- ]7 T7 ]1 {. s    {2 ]8 |9 }6 \. M6 }6 N
      return FALSE;
3 ?7 }1 [* W6 X* Z7 p; d5 w$ a    }. w$ G! ?+ z) Y
  }  T& ^6 s2 O. W8 Q$ _
4 d9 h9 Y. a% U; o# i2 k+ G; V
  //得到文档容器集
. o+ t4 a$ I% a" U  CATIContainerOfDocument * pIContainerOfDocument = NULL;
8 n; a6 c/ z' F2 S3 w  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);3 G8 C+ m; }& ]  H
  if (FAILED(rc))
' h0 b. n  i8 }5 h6 y  {
/ Y4 ]/ J9 A- ]# _    //pIContainerOfDocument->Release();
, B$ d9 y$ ?" ?( n  A/ V$ {    pIContainerOfDocument = NULL ;
. T% b- k" h) A    return FALSE;% J7 U2 _/ v" j9 x6 }* m* I
  }  O/ E! Z5 Q( ^* l( o
& \6 D) |' S1 s+ |0 _
  //获得Document
7 r+ V& o" c- [! |1 h7 B4 \  CATIContainer* _pContainer = NULL;        * h; n' v7 |6 L8 E5 o2 W
  //获得SpecContainer' @3 k5 z2 _7 L# ]
  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
  M- i) I; P' u2 v% ~* W8 ?( V       
" d1 }1 a& j1 w6 ~+ S1 n  //GSM工厂
7 o" Q. y/ ~0 D1 a# E  CATIGSMFactory_var spGSMFactory = NULL_var;" Y) z" d2 |$ x3 c( J% m% Z
  //设置工厂                ( e8 d' N0 O" _. k) b
  spGSMFactory = _pContainer;                                                                        ! o% [3 E9 z5 p( I) q8 |3 K/ q4 |
8 X  H8 S6 |/ _1 N2 N7 S
  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);: ~. Y, m4 K4 k! _9 B1 o

4 U% }  G0 x# J: ~) r  CATISpecObject_var spSpecPoint2= spPoint;                                        2 j, S; ]' b2 y3 G, q

- q5 c9 v( Y0 @+ j0 A% a  CATIGSMProceduralView_var spSndPntObj = spSpecPoint2;
2 h$ \) {5 V9 w3 G" z* B, T7 [9 [$ v" q! ]% ~
  //*将点显示在屏幕上) L3 O/ S3 a) X; x$ `* R; N( r
  spSndPntObj->InsertInProceduralView();1 B: x; U( @& F5 Z) s, }

1 C1 D% B0 s  m) j. S9 q1 Y  spSpecPoint2->Update();8 G, ?2 E3 n' J; @7 ]
; E" K+ Y6 I" G
  //生成线7 Q# x# O6 |9 {: Z: @: ^
  CATIGSMLinePtPt_var spLine = spGSMFactory->CreateLine(spSpecPoint1, spSpecPoint2, NULL_var);3 y" f8 W: t( P' w5 R0 D: S. ?

/ Q7 G/ H+ c# }" N6 X; L" b5 H  CATISpecObject_var spSpecLine= spLine;                                        ) A6 L6 D- M4 E
$ |( J; D% C% Y* o
  CATIGSMProceduralView_var spSndPntObjLine = spSpecLine;
% E9 o- V7 q6 l/ g' Q
& `' U( T# }1 n* \. B# M  //*将线显示在屏幕上. e+ {- ~" i4 g- u  L
  spSndPntObjLine->InsertInProceduralView();
' P+ G. o& S% C" B! h, U6 _( S% n& G: O, E5 ^, i$ Q
  spSpecLine->Update();
% `3 P8 i1 @: B. G* b) j2 |; n
8 ?; J: S- n0 ?& x6 s  return TRUE;1 X9 P/ i( g# y
}
" o0 s' |( K! v& t' C4 G% ?7 B7 p8 Z! [/ ?  n9 F- L! X

2 q6 ~9 o& w5 e7 s  _. O. j
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了