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

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

[复制链接]

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

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

admin 楼主

2017-4-17 21:56:09

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

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

x
+ T1 ]! n& K' ]4 j. Q0 o3 z8 L
Catia二次开发源码分享: 通过鼠标点击创建直线3 f* Z- t6 \# K9 d% J; L& _

, z5 F* u2 K6 U3 f* a' c0 ^! l- D2 |1 p5 s( ?0 k' N
" m& |& q4 p6 t
#include "CAARCCreateLine.h"
9 b2 v( e5 u/ e. g#include "CATIndicationAgent.h"2 K: k; L: t/ a8 z/ ^$ w: Q( C1 H1 w
#include "CATMathPlane.h"5 d) s' U) K) [/ `- G2 O0 d

' K' x8 G5 W9 I: F1 R#include "CATCreateExternalObject.h"; X* R! b( W" C! m5 ], N* N

, c, _. a8 ]& d8 P0 K4 g( G5 \#include "CATMathPoint2D.h"4 W- b, e) h8 C* p/ G
#include "CATMathPoint.h"
; s, W1 o& D! ^% s#include "CATMathPlane.h"
: U& H% R8 R) u  [  p# E" k# J% M2 R+ M$ d' N: Q, q
#include "CATIGSMPoint.h"/ d# Z! I# v1 ]
#include "CATIGSMLinePtPt.h") M5 \' a& K4 i
+ v% t$ c' @1 g0 U' {
#include "CATFrmEditor.h"! J% X7 g9 J6 s( ^$ E  _2 ?
#include "CATPathElement.h"  w  D; ?4 M( [) O3 u* F% l

7 K% w% }6 m; }8 u3 _#include "CATIProduct.h"; P5 ]& w, a8 z; h7 G) r- N
#include "CATILinkableObject.h"
. p- m% J! v8 Y, s8 U4 `$ p#include "CATDocument.h"; b+ a7 e9 a8 w

. t+ B- B: S& _% n/ B& T8 Z. R#include "CATIContainerOfDocument.h"- f2 J! V# u7 w# s

" P. j" U6 Y0 U& p6 [#include "CATIGSMProceduralView.h"8 v( P/ k- }1 ~  I

0 q) v1 t1 `" O( a) O2 q. ~& O" d#include "CATIContainer.h"
3 N' n1 y: n: m  z5 E  f#include "CATIGSMFactory.h"
# u* x8 P+ {; o, b" B+ u" t& p' J
1 F8 o  T2 [0 k8 e& q' \& u#include "CATISpecObject.h"
! i3 A1 L6 Y& @0 nCATCreateClass( CAARCCreateLine);& F& m- y8 j) t; g5 l' h

5 U# Q& D( }: |- e. y& p) n+ x
, i0 B( p4 h- b* R9 o4 a//-------------------------------------------------------------------------# D" P: y% c9 @$ k) f# f6 @
// Constructor% N. b6 B* C" R! ]2 U4 q. M! N
//-------------------------------------------------------------------------
4 z  \6 f" g9 ^3 B' b6 YCAARCCreateLine::CAARCCreateLine() :
- x. o* ~* j/ w  CATStateCommand ("CAARCCreateLine", CATDlgEngOneShot, CATCommandModeExclusive)
9 Q- b! H! x5 J) V* w; q1 C  P//  Valid states are CATDlgEngOneShot and CATDlgEngRepeat* g. K/ ]. r" }. u) N
  ,_IndicationOnePoint(NULL),_IndicationTwoPoint(NULL)
5 m6 g: c$ X9 ]; `9 h{
' U  k! ]# Z6 h4 G9 J}
& T4 _* ~! p$ m1 l4 x2 `& P3 g7 v# }9 R* n. f5 y
//-------------------------------------------------------------------------% @, l% s, v; x1 E6 K' A! _: `% l1 |
// Destructor5 x, Z+ \$ `7 A' ~& O/ E! t' z
//-------------------------------------------------------------------------
! V! W9 X! @9 v1 F5 CCAARCCreateLine::~CAARCCreateLine()( n! Y3 S( E8 L6 U
{
5 E. W5 u7 H5 j! C5 d9 z) N   if (_IndicationOnePoint != NULL)
% t  W- X" V% E7 ~, h      _IndicationOnePoint->RequestDelayedDestruction();
* }) P+ A( E) E% j% M0 h   if (_IndicationTwoPoint != NULL)
& `) V+ j+ u6 z     _IndicationTwoPoint->RequestDelayedDestruction();* C) f+ m+ P1 b+ k' h
}
( E' W! F6 N, u/ u  L0 {9 n& U3 w' r- j& z

) M3 e" B9 ^5 D% x//-------------------------------------------------------------------------# z3 `6 I1 `/ b) p
// BuildGraph()' y; ^' `! P! B
//-------------------------------------------------------------------------
9 Z6 W* ^& B6 M: i1 H5 ~3 N+ Mvoid CAARCCreateLine::BuildGraph()# `" `! C: W" F/ W7 A
{
5 O5 W4 F7 K- E; L' Q' I7 _  K( K( {" ]* ?3 u5 l

# G! `' s. \' v( h: D9 M  // TODO: Define the StateChart : k5 x- T. \4 Z, T6 [
  // ---------------------------* ]+ y. n7 q: V) O
  _IndicationOnePoint = new CATIndicationAgent ("IndicationOnePoint");1 L: b2 m. f0 x: n
  AddCSOClient(_IndicationOnePoint);
7 @+ r* x. }/ ^* ?! k4 _7 h" K7 [5 ]$ b
  _IndicationTwoPoint = new CATIndicationAgent ("IndicationTwoPoint");
5 g! P- F3 T" ]# Q2 O7 h% Z7 I) E- j; x$ T
  CATMathPlane PlaneXY;
$ \) n) M$ Z4 N' C: ?2 ]/ L  _IndicationOnePoint -> SetMathPlane (PlaneXY);  p5 m3 r2 y& Z) V  E- C8 e
  _IndicationTwoPoint -> SetMathPlane (PlaneXY);( e4 r- f7 J( p% l+ r# y/ y- b
6 b: C8 c, ?% \8 k8 Z; ?
  CATDialogState * initialStateOne = GetInitialState("选择第一个点位置");
8 u& v6 d4 ^/ |$ H  initialStateOne -> AddDialogAgent (_IndicationOnePoint);
  Y3 u# k6 n- F8 X0 Y9 T7 f' V) _( R6 Y* A
  CATDialogState * initialStateTwo = AddDialogState("选择第二个点位置");* \8 f9 D) L# Q/ t  _" G+ ^8 k
  initialStateTwo -> AddDialogAgent (_IndicationTwoPoint);
6 L  A4 t( k& N( N
5 h* ]( q$ r/ @2 u3 ?" W5 T# t, l  AddTransition( initialStateOne,
( ^; A' i; J& |; o                 initialStateTwo,
8 b- A5 O3 o3 ?                 IsOutputSetCondition (_IndicationOnePoint)," [, n! f7 o4 c
                 Action ((ActionMethod) &CAARCCreateLine::ActionOne));
8 {8 p' P9 ]- U' X4 _1 t' U3 H
/ x6 O' z! y" b1 {# W; W- M  AddTransition( initialStateTwo, * l/ l4 v4 r6 @
                NULL,
( F; E4 `+ j) e. }) V' C                IsOutputSetCondition (_IndicationTwoPoint),
3 p0 z# ^$ x7 M* x! m# ^: m                Action ((ActionMethod) &CAARCCreateLine::ActionTwo));% x5 h3 A% S" v+ m- r3 B$ W
}) E' }$ I9 \  _

; b$ L7 ]# B3 L1 [) g) B) j/ J9 |
//-------------------------------------------------------------------------
! |& |1 J5 f0 q) p4 H3 T/ r$ @/ g// ActionOne ()7 D; b+ l; |: X4 L* U
//-------------------------------------------------------------------------
- ~' j2 i  p  g4 l+ ^/ lCATBoolean CAARCCreateLine::ActionOne( void *data )
0 W4 A1 \6 k6 o9 ?{
  N$ ?  U/ l& P6 F. x8 f  // TODO: Define the action associated with the transition
' y5 a9 Z% ?3 f  // ------------------------------------------------------) s. {! [1 U$ n  {8 j5 Q
  CATMathPoint2D point2D = _IndicationOnePoint->GetValue();//获得一个2D的点
% s: ?- ]* D% G. G- b) n' {' \  w1 [3 X0 D) l) `; I3 X/ \
  CATMathPoint Point3D;
0 ~& n# w, |  Z# s  CATMathPlane Plane = _IndicationOnePoint->GetMathPlane();9 G# `9 [( [, n/ ]! V  D
. t2 E; r# t7 s
  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点9 P* y$ z5 L' L5 T: ~6 S" {
5 _* A' }  X8 f
  //设置Container(非根节点)
% H0 ]2 Q( K2 [! p  //获得Editor
) z+ n) _5 s$ d/ u  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
. j! i! |$ f: I4 I) ^) s, ?) j% I; x/ Z* ]; Q/ I* M
  //得到当前对象的文档5 |" l; X( v0 L$ ]6 d7 L4 {2 H
  CATDocument * pDocument = NULL ;
% K& [3 _/ X) K- u! j9 g
' d/ }4 `* v0 \$ T. v; d+ _  //取得当前活动对象
; |3 \+ o# M9 [, u0 V" N9 I0 {  CATPathElement activePath = pEditor->GetUIActiveObject();; p& i# |- Y$ P& o# z" f' L

: k) D) G6 j) Z+ Q" @2 h. g: M" X  //取得当前活动的product
. U# A, j. w" b6 V' ~& a/ ]  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());
$ |1 O$ Q: o7 g1 \. |2 G; N8 I9 j5 z' L0 b
  //当前活动对象不存在
  q7 L8 Y! q. k! r8 b  if (pActiveProduct == NULL)
! G, J+ }* n1 H3 A5 H9 s* M& X  {) \. Y4 g1 P9 M) I$ G! M: d
    pDocument = pEditor->GetDocument();9 n0 F  p+ i7 X* O" H, T% b; N
  }
" v# a& H! E( `* a( U  else3 t7 s2 |- k. @% K. Q
  {
$ g! R9 e7 ?! B. d. r' ]' N4 J    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();3 Y3 J. H, N4 i+ u
    //当前对象的引用对象是否存在" y9 r# f; n& L  i5 }. ^
    if ( NULL_var == spRef )
( K. t1 e- k! o. H1 [    {
. Y7 A4 K' ~* p0 f9 B  y& K1 I      return FALSE;
% ^* Y" c% u4 a$ B; L) f    }
8 X& P# l: s; _' _1 _8 Q9 ~0 D+ z: t- X1 g
    //当前对象的链接对象
$ t3 f- c$ x, I; i/ O' z% s    CATILinkableObject * piLinkableObject = NULL;
8 K: B4 I0 U  w& W2 u3 r2 W# u2 u0 J    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                            8 O$ t8 s* f/ b, k
    if ( FAILED(rc) )
( U; M8 i6 Q7 D4 Q8 x% r! `; E    {
$ B, X  f0 b! w& K$ B, l* R      piLinkableObject->Release();! h2 `! h+ R$ e: C4 c
      piLinkableObject = NULL ;2 L# ^$ h5 V" b: \2 e) j- Q
      return FALSE;1 C3 A* E! S9 w" ?/ Q
    }7 v. ?2 b4 C) y* b9 d% c1 n
* I  a# f4 h) [, e. |
    //得到当前对象的文档( m# ]& W$ p# ?, }8 N% o
    pDocument = piLinkableObject->GetDocument();
, D3 n; r: i9 _- I, g    piLinkableObject->Release();7 L5 p4 z: l, w7 O. x5 B0 J
    piLinkableObject = NULL ;3 i- S' h0 B, r1 m6 R3 V' g

; ]4 h' H2 ]8 P2 Z. A% n+ ~$ O    if ( NULL == pDocument)& X' B: k5 }% T" f4 C
    {
5 T3 U/ b9 M5 }3 i      return FALSE;5 g+ g) L. w8 R5 q, J
    }
: o; p6 O1 q/ F. p! b  }
- d- I8 e8 j6 N4 \: O6 m6 e9 d; Z8 U8 M. p. `6 a7 y
  //得到文档容器集4 N& g% W' g6 D
  CATIContainerOfDocument * pIContainerOfDocument = NULL;  N9 @4 X9 _' D* T2 c" A
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);# R3 g% p+ l2 K9 a5 ]1 ^& h/ t' B  W
  if (FAILED(rc))5 N; u4 j; n+ p2 ^8 F5 s* [  g$ ~
  {
, e7 U. v( y* |8 u) S. k    //pIContainerOfDocument->Release();3 T$ d7 s! m$ @8 y2 ^( N; k& m
    pIContainerOfDocument = NULL ;
1 s  u& J, l0 ~    return FALSE;
# C+ W- P, \' y0 \( C$ q/ }3 t  }* n9 t. W& _0 r: C2 Z2 z
3 ?2 f1 e* Y1 x" Z
  //获得Document8 `. f+ |1 y' p& ?
  CATIContainer* _pContainer = NULL;          o5 ^8 p! s9 y) a. E
  //获得SpecContainer
; h$ N9 @% l3 M- \- _% o  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
/ `% V5 a& e) {' L5 t- a$ D% a: C       
3 b( G: I# z) x) Y3 |  //GSM工厂, s4 {" B8 R: g9 K8 @
  CATIGSMFactory_var spGSMFactory = NULL_var;
. q# c" @3 `: z" z  o& d6 X/ ^% E' g  //设置工厂               
& f. q5 @- d0 G  spGSMFactory = _pContainer;                                                                        6 u: V# }9 q; H& V, Q0 @! l

, Z: q, [0 u6 o2 l: v; @  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);
; D4 I3 A5 W- v: b; E; F# L4 ^: e) \2 ~; {
  spSpecPoint1= spPoint;                                        / S  n4 B) U& _+ }5 \1 d- u- M

) @; O0 W6 y1 G8 _- i8 r  CATIGSMProceduralView_var spSndPntObj = spSpecPoint1;
7 r& y1 p* s- }2 L+ v# V& Q" X3 W
: N0 L' z) l. J; ?4 b  //*将点显示在屏幕上+ s  }& M; J( [/ t5 Y& p, _- T
  spSndPntObj->InsertInProceduralView();
, `1 ?; E$ r$ a1 Z3 \8 D2 d' C. @! B- b- X/ E) w2 ]0 v, N6 d
  spSpecPoint1->Update();& v4 v; |5 k1 J9 m: e8 S: T: X3 h

4 ^! f( U1 n' y. J1 U6 O  return TRUE;
9 ]9 `* W9 o: g8 u2 `}
8 T% t2 I) g( E& D2 |7 ^
- q( b9 O3 A) }( t0 S; l//-------------------------------------------------------------------------
# e2 B1 E" G" ~2 i  v// ActionTwo (), L3 x: Q( ]4 W* ~8 L- a
//-------------------------------------------------------------------------
) o+ z4 _* z$ w0 p6 OCATBoolean CAARCCreateLine::ActionTwo( void *data )& W2 c* K% p& O( A% V6 k; d. `
{, j( `; v" Q* r% p) g8 c
  // TODO: Define the action associated with the transition 5 y/ {$ K: C1 r( m7 d
  // ------------------------------------------------------
$ H- Q& f* r0 M0 f9 d8 L$ ?( I  CATMathPoint2D point2D = _IndicationTwoPoint->GetValue();//获得一个2D的点
) V! D8 X9 |% e- o& E, K! D0 Y, {6 O1 s5 \' g
  CATMathPoint Point3D;
8 I& t! ^- {: K7 s7 A4 O8 {  CATMathPlane Plane = _IndicationTwoPoint->GetMathPlane();7 p& Z+ H1 u: s( b5 J
3 g* p) y6 I# d( b5 F6 t! z
  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点/ X. W1 I4 W% {/ m  R& I/ ]& ^

$ S: u+ G7 g  K% k* G2 S  //设置Container(非根节点)
7 E. c! O8 i  G* G8 p  //获得Editor& G( _; g7 |1 k4 ?! g9 e
  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
( `1 o1 t4 t1 J: ?8 a3 s1 ^
8 w( Z4 d) g5 A$ \  //得到当前对象的文档
* J+ A( t9 I/ ~2 k% X/ W  CATDocument * pDocument = NULL ;0 P  S8 Q: K, x. @# H" i6 C
% j2 c" D. A' p
  //取得当前活动对象
. Q& B* E3 @8 f' B4 o  CATPathElement activePath = pEditor->GetUIActiveObject();% T# z" z2 g/ N

, e6 ~9 C  C& {: K; N0 H- c  //取得当前活动的product% l9 f$ J0 I1 \& l7 }% w; O
  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());
$ j8 P# h  b  x5 M$ h6 g5 ~+ S7 a* ~2 r, E
  //当前活动对象不存在
; h2 @0 v( Z* h1 P- V% I5 p( M  if (pActiveProduct == NULL): L- z7 ~8 I8 E+ |/ R4 J
  {1 v& X/ W9 y: G. E' e& T% t/ t4 m
    pDocument = pEditor->GetDocument();1 ]* W4 K+ H) S' M" o
  }
( k: b. O4 V* `% g! f) q7 F: X( n  else  [8 o% q, T2 n& i& C& O
  {+ @* h0 t6 q0 D1 t; P( w1 I2 O7 v6 n
    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
) t. n1 [& J6 Y8 `    //当前对象的引用对象是否存在# F0 J" l( R/ C& J$ N  t
    if ( NULL_var == spRef )5 `( p% T& h  G
    {
7 r; D3 T  u" S& _! \, Q      return FALSE;" H0 F( Y# h8 T. b# Q/ [0 X
    }
  s6 v% I$ _% w4 ^% ?3 l8 |  W! c- G3 D' ^1 m3 u. G' h% ]# X
    //当前对象的链接对象9 m9 K2 B/ w" K. R
    CATILinkableObject * piLinkableObject = NULL;
' J3 l  Q4 V7 K: \' M1 j    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
5 v+ Z( `. o6 l: ]    if ( FAILED(rc) )- X9 O5 a$ q& @( e
    {5 D! K4 d: X/ x: `7 A2 Q
      piLinkableObject->Release();
( v0 E" u( `& v; c$ f! `      piLinkableObject = NULL ;. Z, w. d* `5 F3 [' L, X! t
      return FALSE;
0 h* l0 ~* F- D    }
7 ~1 F* N/ d, g. a% Q$ d: p5 ]# m5 n; ]3 x
    //得到当前对象的文档
4 j# ^1 d' [: `: @1 V# L    pDocument = piLinkableObject->GetDocument();
# t$ v3 m$ P& _, `    piLinkableObject->Release();; m1 N0 ?' z& z; {. g; P
    piLinkableObject = NULL ;
) N7 B1 P* j: \. r0 x3 s8 o( I6 I, t2 h
    if ( NULL == pDocument): d  m0 L& _+ w  V, C
    {
. y' C+ H/ E0 t0 a/ e. W      return FALSE;
3 j5 l# a! d. C5 s" k9 x    }
2 Z# N6 y% a! h2 Z/ m" i# k% ?9 Q  }
0 z* r  d1 E% N% M  w9 F3 b
: e* ?. n. [# o/ c$ I: ?  //得到文档容器集4 ^4 N+ H6 M& F# f5 @  D1 q$ A
  CATIContainerOfDocument * pIContainerOfDocument = NULL;3 e: O  B! d' y- O( d* z) ~, I/ Y
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);
" J7 ]5 w- v3 r, |. v1 i) u  if (FAILED(rc)); B; J1 t/ e) f( p2 s
  {: T2 d7 k2 o  k8 ?
    //pIContainerOfDocument->Release();
% U8 I% c  s0 J' n    pIContainerOfDocument = NULL ;8 h" W7 r$ c* ]2 d" o4 A
    return FALSE;9 `  U. I9 O$ V4 N
  }
7 `2 i0 p+ i. F! \9 @1 n0 y( @. h+ m: {- ^
  //获得Document4 _& s6 v" e: }" d* o$ y) ?
  CATIContainer* _pContainer = NULL;       
1 S6 q6 x- n+ ^4 ^! g  //获得SpecContainer  [5 \( [0 E' d# c% `' ~) Q
  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
; _' R& }- C1 J/ Y0 d       
3 [& x$ X) {# {/ d& S  //GSM工厂
8 V0 U" u& `5 J* `  CATIGSMFactory_var spGSMFactory = NULL_var;8 \, ~- V" f) {/ h+ ~
  //设置工厂               
* ^+ N2 W5 k8 ?" ~. T# L  spGSMFactory = _pContainer;                                                                       
1 B/ F0 y+ a6 Y8 o
9 X: ]3 z$ L# d7 d4 G  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);9 w: l8 n" W' E& |' M( f: B* d2 t' S  s
$ D% l. h% a* V5 c) |
  CATISpecObject_var spSpecPoint2= spPoint;                                       
7 [0 E9 F9 J- e/ p
- k2 B' c/ d( t7 u* P. T8 `4 K8 e  CATIGSMProceduralView_var spSndPntObj = spSpecPoint2;  z3 Y* D0 n7 d3 ^3 z" y: N! U

# L  j" J: y' B3 x* u" {+ ^  //*将点显示在屏幕上
9 \/ W0 n& p5 S4 W  spSndPntObj->InsertInProceduralView();5 w. T9 W. ~/ H6 ~

; G' I$ [5 I! o8 g  spSpecPoint2->Update();
- r! z4 `5 F. [9 }$ A& @/ e+ E  X2 V$ }  H) G  q
  //生成线9 W& p! K4 m6 G$ S8 c
  CATIGSMLinePtPt_var spLine = spGSMFactory->CreateLine(spSpecPoint1, spSpecPoint2, NULL_var);
4 ^6 l! ~- H8 t) e+ J- A5 l" R  [5 C  c  O5 U/ e/ w
  CATISpecObject_var spSpecLine= spLine;                                       
. O% A( a6 z' K  }0 I
0 {/ [3 E  i  |' z5 O, J/ y2 j& Q  CATIGSMProceduralView_var spSndPntObjLine = spSpecLine;2 ]+ H  }4 z% e7 c

$ s: S9 L! W4 y4 J  //*将线显示在屏幕上
) [+ `! B1 \; F  spSndPntObjLine->InsertInProceduralView();
; B, L5 v8 Z  \  Q6 Y) P# R5 T9 z2 Y' x: e6 S* }" X0 x
  spSpecLine->Update();
4 c( p( f8 ]- w, G
' j4 V8 d( f7 p0 P  return TRUE;+ b: e& x8 b- H! p* ~
}; x5 V! C! N( ?# a, F0 y9 D5 p9 P( h
/ U2 |' O( G. H" p" o% V/ `

: r" @% k% p4 T% g/ O
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了