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

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

[复制链接]

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

2470

主题

1275

回帖

8万

积分

管理员

PLM之家站长

积分
82170
QQ
发表于 2017-4-17 21:56:09 | 显示全部楼层 |阅读模式

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

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

x

, d/ e; {: ?" ]Catia二次开发源码分享: 通过鼠标点击创建直线" O! W" Z: _% A, C1 F
/ X" u8 D; X" u: E7 T% I5 Q+ V7 y

: e; X9 a  W$ c0 O0 @6 ?8 `% e- Z) ~% b' d' z7 T
#include "CAARCCreateLine.h"8 r4 W0 ^$ a1 K( @( D* M/ C+ \! V7 [
#include "CATIndicationAgent.h"
7 S9 j* n& T0 T3 D2 N& v- {* {#include "CATMathPlane.h"
5 V& |$ H  `# D! h) j% U
2 i/ e+ T2 ~' e/ v0 j#include "CATCreateExternalObject.h"
) X2 o. E1 S( u% h/ j
" R3 M* G7 V; B" c+ k, J4 K1 u#include "CATMathPoint2D.h"- r8 U/ W6 _3 d4 e% _' Q, S
#include "CATMathPoint.h"
; s9 h/ O5 {" d#include "CATMathPlane.h"( I" b4 Z+ r6 [$ Z$ m
3 K# K0 S, H: l1 J- v+ n" y
#include "CATIGSMPoint.h"0 w$ {0 n$ Y0 o% V1 t& H
#include "CATIGSMLinePtPt.h"6 {8 ]# b7 N; H5 N
( u/ V( C5 m7 o- S+ G
#include "CATFrmEditor.h"
9 p9 e. R4 _! N* v#include "CATPathElement.h"
" Z- y8 t5 _, B; [: K* \1 Q/ e8 n- {" V! p8 ]( w( ?
#include "CATIProduct.h"
8 G2 ^8 d  ?  d$ m3 ^7 O% D#include "CATILinkableObject.h"; L8 p# l/ [' y* l0 k
#include "CATDocument.h"
3 Y6 ^5 Z5 S8 I4 G) l
& J2 u# z( j- I#include "CATIContainerOfDocument.h"
0 _; P3 Y6 ~% O! p* ^4 W
" G1 i; D; _8 y' U8 {- y% ~8 M#include "CATIGSMProceduralView.h"
' ?4 a# ~4 L, C& P2 P4 B
, b0 y" t2 B  u; [+ e#include "CATIContainer.h"
+ A& \9 D4 q* @; S  a/ R; @) p  ^/ S#include "CATIGSMFactory.h", _# J+ ]3 C2 r) o' z9 \

2 B. y, w$ I( ^# I/ P4 ~#include "CATISpecObject.h"
5 O4 `$ L/ v* b3 x; oCATCreateClass( CAARCCreateLine);$ r0 c+ n# w0 q3 @$ s0 E

% E7 f& ~) v+ ^9 m$ {& U
% f: ^8 b( }! a. K" K0 L//-------------------------------------------------------------------------" @( m* K- X/ f: [, E' x7 N' J
// Constructor
1 Z7 e) ^- q6 O, H. d4 G! `! O: U; p//-------------------------------------------------------------------------
2 L% a: ]  Y  ?# J6 uCAARCCreateLine::CAARCCreateLine() :
) }& r, I( U3 k( E4 X) g  CATStateCommand ("CAARCCreateLine", CATDlgEngOneShot, CATCommandModeExclusive)
: J8 x% B5 P3 l3 J//  Valid states are CATDlgEngOneShot and CATDlgEngRepeat' P; K+ O) F- y1 f0 f/ M# _
  ,_IndicationOnePoint(NULL),_IndicationTwoPoint(NULL)
- x3 G' M) A* d! y4 ^: m5 e2 U% q6 z{
" Z7 R* W0 ~4 q- F: R$ ?}
# E9 s* |4 X+ O! v! R
0 o+ Y0 a8 O% Z//-------------------------------------------------------------------------# Z. H# x$ M1 T- W9 H
// Destructor
' `0 z! k7 w6 r" D! V/ |! S' J) v//-------------------------------------------------------------------------
" E! T" v  e6 I( ^7 i3 hCAARCCreateLine::~CAARCCreateLine()
* j  o! F% W- C; V$ S. o{
0 ]. _/ d* A/ e: A! p/ X/ r   if (_IndicationOnePoint != NULL)
3 E$ C$ W, q8 y1 `      _IndicationOnePoint->RequestDelayedDestruction();
; K2 I% H8 P+ Y9 v   if (_IndicationTwoPoint != NULL) 4 g: Z3 `$ Y0 {$ U
     _IndicationTwoPoint->RequestDelayedDestruction();
% ], r# S$ X. R! H% _}3 c! G, a& Y. n# z

4 P% T! e6 E7 Z2 x( L+ R- k* [; s2 e$ k2 x3 k4 ?" X# A
//-------------------------------------------------------------------------+ @6 O1 k4 a& K$ {& t
// BuildGraph()
  V+ F  K% w/ y$ f! C. j//-------------------------------------------------------------------------
: N9 \( a, P+ N; ^void CAARCCreateLine::BuildGraph()
( O# H5 a9 z! c4 j, ~{
! V7 q: M. z( x( W) o: ]; [
1 s" _, }, U- z) T. w% f* f5 t+ r" r  {
  // TODO: Define the StateChart
; }" J5 N* ~# D+ V4 j) A  // ---------------------------! {# Z0 E* w; q- ]7 _
  _IndicationOnePoint = new CATIndicationAgent ("IndicationOnePoint");8 s/ c! Z; {; e
  AddCSOClient(_IndicationOnePoint);! t+ ^$ H( n+ C" t- n

; |; ~! j( ^4 f! I  _IndicationTwoPoint = new CATIndicationAgent ("IndicationTwoPoint");( d0 e/ K- z' H3 H9 P) N- Z
0 J! H1 E& }! U6 d  }
  CATMathPlane PlaneXY;. b- n8 Y5 O! E
  _IndicationOnePoint -> SetMathPlane (PlaneXY);" e! i) v, k" N; ]8 B# A
  _IndicationTwoPoint -> SetMathPlane (PlaneXY);
4 e2 ?% b: ^4 P0 W1 z: X& s; i% z" W' U
  CATDialogState * initialStateOne = GetInitialState("选择第一个点位置");
( j8 q# a: G8 @/ H' Q/ J( r) v# \  initialStateOne -> AddDialogAgent (_IndicationOnePoint);
0 m/ w# }* P) s  O% `: I( A
. {% ]" F0 b: e/ i3 I  CATDialogState * initialStateTwo = AddDialogState("选择第二个点位置");
! [: O; ~# A; e& T: z( ]5 B  initialStateTwo -> AddDialogAgent (_IndicationTwoPoint);# M+ e3 e* x" D1 s1 y0 t
: P# y4 w' E/ `# f9 W
  AddTransition( initialStateOne, + @1 a8 J" q/ N! u
                 initialStateTwo, # S" f$ N8 m) C6 g8 j5 L
                 IsOutputSetCondition (_IndicationOnePoint),
, G, ^" o4 m  J& V# M6 o                 Action ((ActionMethod) &CAARCCreateLine::ActionOne));$ q! r$ T% f" c! ^

( m1 y! g& \  X; C9 ?$ W  AddTransition( initialStateTwo, 9 b1 w' s7 G' B2 S6 C4 n( M
                NULL,
% q+ u2 J( e( z5 `8 P                IsOutputSetCondition (_IndicationTwoPoint),
8 T% f- D- v! S                Action ((ActionMethod) &CAARCCreateLine::ActionTwo));
  l: d( P* T# Y7 l6 w}
2 t8 j; s9 u3 G" s+ E. k0 B) \
3 R7 W9 z' y! v% ?9 Q5 m& |
//-------------------------------------------------------------------------
" C. O1 V; [7 w$ d$ w% k// ActionOne ()+ C5 x& x6 |$ l4 s, h. q& K( F
//-------------------------------------------------------------------------' |; r- C$ N8 I0 J- ]
CATBoolean CAARCCreateLine::ActionOne( void *data )2 k# y# {/ D0 a0 |
{  e- s7 {2 u5 A) t# P
  // TODO: Define the action associated with the transition 6 j( F! R* g1 z3 k5 e' j+ h
  // ------------------------------------------------------
2 J- `5 }' B, u" A/ N/ p, }7 H  CATMathPoint2D point2D = _IndicationOnePoint->GetValue();//获得一个2D的点
/ n7 |/ {, |. T7 \9 J  C! m- x2 w3 ?1 ]  x4 b) @
  CATMathPoint Point3D;+ A$ D/ Y2 V" [3 \7 i- t: H8 |
  CATMathPlane Plane = _IndicationOnePoint->GetMathPlane();1 I: D) D5 k/ t/ {* b( D# t8 B
( i) ]' z, e3 [
  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点/ n5 T3 t: M8 b& Z2 a7 i# {, r

% W2 v& M1 r% p* |  //设置Container(非根节点)
, P! n& T% `. A: A  //获得Editor5 e& y4 Q1 i4 {- m/ c
  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
3 Q" \* U8 y: O! c8 J1 f' ^. T4 _. e' u! w2 j
  //得到当前对象的文档+ b( `' a, |% _) u' I9 @
  CATDocument * pDocument = NULL ;8 n1 n) q+ B+ k# o/ {- O2 Y7 c
) c, o) k$ d) d! r3 F4 P
  //取得当前活动对象$ p9 J! x' f$ X8 ?5 Q. r: c( C
  CATPathElement activePath = pEditor->GetUIActiveObject();- }1 ]2 x7 A7 _: ~" Q
7 l; |, ]# B) H9 s3 [
  //取得当前活动的product
7 j; T: @3 t3 W4 Q1 G- a9 f% h  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());
( m8 p5 D  W9 z+ e0 e
. }' U( j: a& I: z  //当前活动对象不存在
$ T* B2 [% g" n  _  if (pActiveProduct == NULL). _( B) M. e" T+ N2 o
  {5 r0 e  u* D/ {& b7 \) r" P
    pDocument = pEditor->GetDocument();
3 b' t9 S& j4 M  }- ]# [9 \' v( y) h
  else# G" `* k; I% F: R
  {/ @: T) \5 }' T
    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
# F& Q  k+ R& {4 \" O3 V    //当前对象的引用对象是否存在; d: _$ x" Q6 E/ d, ^8 M
    if ( NULL_var == spRef )
; v% r3 |( W- _# E    {
. ?0 T- B0 a/ S3 _9 x! m! s      return FALSE;  k/ {& W$ o7 T5 R6 P$ J9 t0 O
    }# e  ]- n% M! @3 N
2 b9 t$ M  f( {) l0 G- e9 Z" C, y5 ?
    //当前对象的链接对象# t% V7 [5 B- a+ L7 @+ @" ?
    CATILinkableObject * piLinkableObject = NULL;
% ?% w! b( q# K1 l6 J    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                              b; [& M0 s- h3 C- g- A
    if ( FAILED(rc) )
* U9 X. z$ A& T: H$ S! V    {, W2 s5 Y2 ^; I3 e* D1 {
      piLinkableObject->Release();" {& j6 c! W$ M3 s, F
      piLinkableObject = NULL ;( K) b. Z" _$ j. p; h( M
      return FALSE;% D, l; A$ y7 Z0 g9 G! X6 {
    }2 S. e5 N6 W: Q- `$ y2 Z# e( B
& F8 a2 a- S( J+ Y* h+ P8 d. r
    //得到当前对象的文档0 l6 ~$ R: a$ Y. `
    pDocument = piLinkableObject->GetDocument();
- t- L8 `5 J! a# j- t" E+ s/ f    piLinkableObject->Release();
* C# W7 R/ y% H; t( d' z/ e    piLinkableObject = NULL ;8 f' y9 _3 w! s7 H7 b

% P. `1 F: r0 e    if ( NULL == pDocument)
6 Z8 G+ V3 _% D5 y    {" j: N5 @" t9 d4 Z, J  F+ K9 Y7 ?
      return FALSE;, k! N3 T! {: B" i8 H
    }
$ M( _( k, D; Q7 v  }
+ N% X  ^' ~- M2 t0 T" e( v+ D, B; u* N1 P" |% k. R7 {5 j8 V
  //得到文档容器集2 s, V5 D) X, ]  f, L( d  D
  CATIContainerOfDocument * pIContainerOfDocument = NULL;
  i9 _2 K# B! o  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);
2 x6 f9 B& G1 B3 g) c3 I  if (FAILED(rc))
( ?/ [) F8 ^" C" n: Y5 u' k  {) n' s5 }6 D+ N( H3 y) f2 c/ k
    //pIContainerOfDocument->Release();
9 ^# N3 z# V+ _' c) a    pIContainerOfDocument = NULL ;4 h3 r3 r+ q: Q* j$ o7 [- s0 q
    return FALSE;
- B& q8 ~4 [7 q% a$ @  }
, k( U" c) Z( I9 y: e, [6 @: n
! w0 s; B1 T- o( U( {" N/ g0 A  //获得Document( t! q/ o/ e' D7 Q& g. A9 y
  CATIContainer* _pContainer = NULL;       
* X! q# w# {1 a! ?  //获得SpecContainer
2 }) }( }& e2 I) d& P; G  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
" W( `! v, }5 p; `; L9 [        ) |6 \2 j! q9 N0 N" w
  //GSM工厂
$ u1 _5 P) t' c' Z  CATIGSMFactory_var spGSMFactory = NULL_var;8 N  h4 h9 J5 [& ?
  //设置工厂                9 m  L  {7 B- q' ^, l7 Z1 u
  spGSMFactory = _pContainer;                                                                       
7 Q/ I$ @7 I4 }+ P' T, ?( p$ N# C5 C
6 d- q9 K, z, J; c5 a& X4 x6 u  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);
2 l6 u( t* v6 r
& {; `0 a9 Z5 x4 B5 U" @. o  spSpecPoint1= spPoint;                                       
9 i2 W  Y8 g, ?- U8 k
7 A/ {' e  i- e6 J& j2 t0 _6 P1 n  CATIGSMProceduralView_var spSndPntObj = spSpecPoint1;. e% M0 d9 A; c& I4 X

7 d7 R  ?" m& ~# W( L( D1 n  //*将点显示在屏幕上* _* ?4 K0 O- ~4 S2 i4 ^
  spSndPntObj->InsertInProceduralView();
6 C3 Q7 ?" s  s" _- O
. g  u9 \+ H/ c5 s- }2 Q  spSpecPoint1->Update();! y. C# l4 P1 C
# ]+ F# U5 K9 C5 _9 i6 m) c: M9 A
  return TRUE;( A, c0 P4 o# p% s7 O- R
}
0 n- ~/ V* V' z6 ^. r0 p1 e$ }8 d$ j; i, q9 `- O6 v
//-------------------------------------------------------------------------
- e) l- S5 m5 G1 o9 b// ActionTwo ()5 {8 O' C1 l# ~
//-------------------------------------------------------------------------
# ~+ W9 ]! m6 Z. P8 E( J/ dCATBoolean CAARCCreateLine::ActionTwo( void *data )! X# h( B5 ^$ y8 L, |
{' a2 d2 f+ D5 {6 \2 l; X& x7 e3 j
  // TODO: Define the action associated with the transition % f2 B/ H9 j( i3 l& x8 a
  // ------------------------------------------------------3 d& @* l6 u3 j
  CATMathPoint2D point2D = _IndicationTwoPoint->GetValue();//获得一个2D的点$ O8 V3 I1 R: F1 Q: E: V2 g

- O' r; o' Y, m4 q; ~5 ^$ U, v  CATMathPoint Point3D;: q8 |9 o. B. P/ q3 O0 J) H
  CATMathPlane Plane = _IndicationTwoPoint->GetMathPlane();$ K  P, y  b2 Z! r8 J& y% p$ j
# d' ^# K! N1 d* @5 t1 e
  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点
( W, z/ }1 I2 x" s' M3 G' V
( k9 r' x% i$ E$ V( p% w  //设置Container(非根节点)
& ]# ^3 P' R& A! ~- a; ]  //获得Editor8 M5 {2 D; G! \) O: d- B
  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
# J% k7 W* J7 p3 e5 {$ {
  K/ o2 e7 R* Y" E5 k# o4 I6 J  //得到当前对象的文档
, {4 T5 @" o: f/ f0 ~  CATDocument * pDocument = NULL ;7 ^: [4 W' c$ [1 ~3 d8 {/ |" Z8 |# w
6 F5 e1 m1 V- P6 u6 U! Q
  //取得当前活动对象+ t" [/ c! V0 E" I1 `
  CATPathElement activePath = pEditor->GetUIActiveObject();3 B; u. E4 v, e5 N
/ ~# ^, F* l2 d+ p( Z( i6 F
  //取得当前活动的product+ Z& `+ C: Z# {, Z
  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());) }0 j6 T6 U3 Z& \7 p
- _$ m5 ]# ]7 H( {# C5 R- J  \
  //当前活动对象不存在; `* o2 z- N0 g; {5 |% o  X
  if (pActiveProduct == NULL)
2 }  g8 u8 B; i9 |- H( m  {
/ U9 H# q. t- }; _1 K  B0 R    pDocument = pEditor->GetDocument();
% k+ t3 X- _- J' h) [  }1 C7 G: }6 w2 I0 `
  else
- P9 Z* H' O* {7 F0 `& k  {# s9 ^) a) [! I# \8 I  _
    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
1 G+ V! e( |& g' Z# u    //当前对象的引用对象是否存在
5 r, S$ U6 I7 ^3 c* y& z$ j    if ( NULL_var == spRef )
$ H; f4 K( y* B; k. G: e. P    {
- p) l1 D3 w6 l% O4 X2 A' P      return FALSE;' g$ F& p1 j# c5 _3 P
    }
. t1 f2 ?$ c2 L* \0 N" {+ x2 Z3 k* v, D6 p
    //当前对象的链接对象! Q( @# E6 M& u/ T
    CATILinkableObject * piLinkableObject = NULL;
5 Q/ Q9 B+ E0 r' |! S6 N    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
$ a% n$ w4 }$ k- P0 T5 I0 C    if ( FAILED(rc) )
& D7 g( T$ I' ]    {- N$ y. L* V- {! R7 c  n+ I
      piLinkableObject->Release();
% [9 L+ Q" C* d/ P1 a! y* T3 I      piLinkableObject = NULL ;
/ g! O; T7 U) Q" D+ g      return FALSE;% |- ?  I) k0 L! e  q( n
    }
& z) ]2 A% k. x! x2 T- E
; j6 e% U$ T# k3 `    //得到当前对象的文档) F+ B* T+ T9 W" p1 f
    pDocument = piLinkableObject->GetDocument();+ `9 S# C1 w- h! x& P
    piLinkableObject->Release();
: M, F. X9 f3 G' D2 p* X; w    piLinkableObject = NULL ;
2 x) k: t7 P, M0 K. L( J3 L2 e) [8 ~/ J! U
    if ( NULL == pDocument). m. E1 g* n% m% s* b3 p% f
    {
  ?+ |- G- w! g7 z7 k+ L( h      return FALSE;
2 d  A( {" b1 s: m4 d' g# y    }* }4 o5 K) C% k; V
  }
8 k3 `. x; C" N* n" _) N0 S# Y4 h
  //得到文档容器集
0 P8 ]" ^4 P$ O; |  CATIContainerOfDocument * pIContainerOfDocument = NULL;$ M# P( _- M6 D- |7 F; p
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);
( h* a, `  c8 ]- j( U# ]/ B  if (FAILED(rc))  k. \" B2 s! u  c7 A
  {
: L5 M5 g. G# ]5 `    //pIContainerOfDocument->Release();
, Z5 P3 T0 q+ s- Y    pIContainerOfDocument = NULL ;
1 k) s. d) W  |0 {    return FALSE;
) g! |, C; a4 @9 ~- I) s' Y  }
' d2 z; [# S$ e' y" W& K& l' }1 W2 l# ]( v- D$ x" q3 F
  //获得Document, D3 N% ]+ I4 L6 S
  CATIContainer* _pContainer = NULL;        " a& \5 e1 A5 r+ M2 b( Q
  //获得SpecContainer
/ K0 ]3 a7 E5 J# i; N; C  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
% G) h' a/ k1 {' O0 n/ d        # N/ s7 x: r9 A  \# @& M
  //GSM工厂" o  u6 s7 L$ ~$ J- B. M
  CATIGSMFactory_var spGSMFactory = NULL_var;9 u& |" X, i/ m: b5 {5 T; P
  //设置工厂               
' J4 P; d2 ]( K  spGSMFactory = _pContainer;                                                                       
# X. G3 e3 R7 f: u1 r: d* r' f1 ~
3 B8 x# ?/ ~. o! K" y5 E; H, U  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);& G9 M1 Y2 U+ j' |
  M0 ]5 E# e- m% E
  CATISpecObject_var spSpecPoint2= spPoint;                                       
0 Q$ H! G: a; D2 r2 z  R- D4 b
4 e& s  e7 `) a& I" k  CATIGSMProceduralView_var spSndPntObj = spSpecPoint2;$ K/ X3 [  P6 k& C: w1 a

# {9 ]8 T1 o, X  //*将点显示在屏幕上0 @: F2 n! ?# k8 _
  spSndPntObj->InsertInProceduralView();
4 i9 a; E/ Q  c! [* v% h" Q( f0 H8 X$ a; x4 _  _! B
  spSpecPoint2->Update();* i3 |' g, f6 L8 Q
# a% x5 s- m: n' @5 ~
  //生成线
: n! W7 k6 _% Q  v  CATIGSMLinePtPt_var spLine = spGSMFactory->CreateLine(spSpecPoint1, spSpecPoint2, NULL_var);/ Q  I% U: _' N/ N3 A
; m0 |3 O& r' m$ i. J! \
  CATISpecObject_var spSpecLine= spLine;                                       
2 G/ l, Z" U, H! U' F. {* a4 K. d$ E' n! @% {. `
  CATIGSMProceduralView_var spSndPntObjLine = spSpecLine;
3 t8 Q: O' r& I, C2 Y4 u# y) d: ^- c! n
  //*将线显示在屏幕上
+ ]; c# M7 n: E  \, @2 P  spSndPntObjLine->InsertInProceduralView();$ C% V3 v' p8 z* S# i

2 e$ ^: m2 a7 _0 o: ]! ~  w! {' U# O3 a  spSpecLine->Update();- z5 b0 D. _1 c4 P
5 T* h- ]5 Y" _! P% @' L
  return TRUE;
( k( T0 y( S* [8 X6 M2 G}
" f! D7 m$ z9 `5 N
, Y6 Z. b0 N' h3 B( U
0 c$ ^; y/ A- \/ v& C* 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二次开发专题模块培训报名开始啦

    我知道了