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

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

[复制链接]

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

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

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

x
. ]9 z, v' }: f$ r
Catia二次开发源码分享: 通过鼠标点击创建直线, C8 o7 C8 Y: [5 M4 s

3 w1 u( M9 O" H0 G* S  F- a5 U' {4 S  I- c  d/ C
7 Q' J" R" O: R% N
#include "CAARCCreateLine.h"
$ {6 t4 H- l4 B. T( I# _( Y#include "CATIndicationAgent.h"" H3 N/ _9 \6 H! |. h+ }2 f# B
#include "CATMathPlane.h"3 m+ W' m  V) q& J/ b

3 g# i, t5 y# l0 a, c#include "CATCreateExternalObject.h"
# D: s6 m; a5 \# \3 f# s( J5 z; a+ S$ y; o  {4 P( W% ]( _+ i# t
#include "CATMathPoint2D.h"" C) o9 O5 @/ u$ a3 J
#include "CATMathPoint.h"5 d- ?4 y- Y. s2 K9 |
#include "CATMathPlane.h"* W+ q$ p' N/ l8 y9 y
# O- H( Y" ?3 D2 p5 R$ F7 R- y9 r: G
#include "CATIGSMPoint.h"
" u0 A9 }* D/ j) [$ t- \1 y#include "CATIGSMLinePtPt.h", f+ f3 a5 o* T: T) a) P% m+ O
$ a8 `) V; T: O, V/ p- U  l
#include "CATFrmEditor.h": a( u$ h$ v- t5 C/ U% _0 q
#include "CATPathElement.h"
4 a/ J( s5 Y, {; N$ A* ^
6 o& m+ X6 i3 a% P6 F# z; Z#include "CATIProduct.h"
4 n" ]! Z, b. E#include "CATILinkableObject.h"
1 @5 Y1 p7 r; g" D! f#include "CATDocument.h"
8 U6 y. K$ c; p8 W* B" t
/ H. s1 S$ }3 ~: C" c$ x#include "CATIContainerOfDocument.h"
3 ^+ Q, X4 \( O* I7 m
6 [7 H: y0 N" _  h#include "CATIGSMProceduralView.h"
7 w; q0 |! @+ d  v4 [9 b
7 W5 W9 s* h2 k2 R5 r3 g& v! Z- ^' Z#include "CATIContainer.h"
. @- G( c! E4 e! a" l7 r! `, @#include "CATIGSMFactory.h"+ w3 z3 Q- a; z8 v' K0 g
) T' x+ ?  @5 e% G& V0 ^
#include "CATISpecObject.h"# b6 t" I3 o' P8 _  Z/ C( K+ V- t
CATCreateClass( CAARCCreateLine);
$ Q2 J$ d& I& D5 W& ~. M
* m" O8 ~6 n4 Y' p) Q  n) S7 T$ Q6 ]$ C2 O- p; o- B
//-------------------------------------------------------------------------
- N7 A) }' ]* V1 }// Constructor
5 c5 C- @! U( h6 d7 y//-------------------------------------------------------------------------% y7 W' d2 t$ Q1 c
CAARCCreateLine::CAARCCreateLine() :; D3 [2 q# {/ u
  CATStateCommand ("CAARCCreateLine", CATDlgEngOneShot, CATCommandModeExclusive)
/ C. e' g0 Z+ E3 W//  Valid states are CATDlgEngOneShot and CATDlgEngRepeat8 _2 L  m  s! v+ S6 @8 [
  ,_IndicationOnePoint(NULL),_IndicationTwoPoint(NULL)
- b+ J2 r5 S4 q3 J; L! ^4 c{6 t6 x8 Y8 Z: ?% |. Z2 w% `+ l
}
1 l1 l8 Z% Z" D! _5 d! \# W0 Y% l7 g" M4 P7 I
//-------------------------------------------------------------------------
1 \0 P" R# `; [6 e! q9 z, q// Destructor) ?* `* }" p4 `
//-------------------------------------------------------------------------# H$ m% T2 o( X) E& I1 a3 D3 G- N
CAARCCreateLine::~CAARCCreateLine()
1 I. E& q  Q! q6 M; j* _/ V% C{
6 }5 R. [3 ~+ j4 f   if (_IndicationOnePoint != NULL) 4 f6 m8 a  T" ]
      _IndicationOnePoint->RequestDelayedDestruction();
7 w" O: w( R, @   if (_IndicationTwoPoint != NULL)
  {. Q4 F% P- ~1 l     _IndicationTwoPoint->RequestDelayedDestruction();1 ]. _" x* t: H! S# ^/ @" r
}
6 ?& V- [1 j/ Q$ `6 W3 d5 {3 ^0 Q& m# K+ _3 L* ~

  a4 x7 K. Z' y) R2 v' a9 Z//-------------------------------------------------------------------------- [8 d! j4 {4 L" n. i
// BuildGraph()
& S7 c' P% o" t//-------------------------------------------------------------------------
4 C# s# w4 ^! d3 r9 Xvoid CAARCCreateLine::BuildGraph()- z5 p8 U0 |0 y5 K) w  A+ b
{
! V0 t4 m1 z$ w$ y; q7 m
( `% k, l0 X) u1 I, v1 f0 {0 i
$ l: [! U" M! Q- c  // TODO: Define the StateChart 6 H9 R  ^/ x8 k8 f; c6 o
  // ---------------------------2 `7 P2 O" |+ Z" o* d, b! k# I
  _IndicationOnePoint = new CATIndicationAgent ("IndicationOnePoint");
* ]# ^, h1 u7 y8 @: b) n  AddCSOClient(_IndicationOnePoint);- y1 i& V' V7 J; ?6 B

% P, h( C( `! A! r2 v4 U  _IndicationTwoPoint = new CATIndicationAgent ("IndicationTwoPoint");
4 Q7 ~0 f3 `% q) q+ B/ J) ~  z
9 h+ o: F: l. P# k5 N; w) O0 t  CATMathPlane PlaneXY;, j# B& z- s& X$ @* _; Q
  _IndicationOnePoint -> SetMathPlane (PlaneXY);& b; p" O8 M" g& R& V8 W+ `6 A
  _IndicationTwoPoint -> SetMathPlane (PlaneXY);
; w: o/ J4 D: j+ P: ]4 v. Q/ g) x$ @: c! p7 h1 g+ Q
  CATDialogState * initialStateOne = GetInitialState("选择第一个点位置");4 ^& G+ z( h5 Q4 I2 k
  initialStateOne -> AddDialogAgent (_IndicationOnePoint);
( }" I% b" x# {% H0 D( ]
) M3 t' r9 N6 F* v: A  CATDialogState * initialStateTwo = AddDialogState("选择第二个点位置");* K2 Q2 _5 j# V5 S; D, V+ B. P
  initialStateTwo -> AddDialogAgent (_IndicationTwoPoint);' D0 V) n: M, Q7 c
" A$ ]) b9 f) _
  AddTransition( initialStateOne, 0 J9 ~- g; y7 Z; z4 o
                 initialStateTwo, $ K: b6 I6 h. Q) R5 K+ w
                 IsOutputSetCondition (_IndicationOnePoint),$ U4 @* N. T4 r' q0 A
                 Action ((ActionMethod) &CAARCCreateLine::ActionOne));
( T8 V5 t" w7 b$ R
4 A$ c  Z6 e1 j  AddTransition( initialStateTwo,
3 S2 f8 |  E9 o. ]" g                NULL,
6 L" X/ i  m* U% m9 i3 y                IsOutputSetCondition (_IndicationTwoPoint),3 G( I' P  `% `; E; l
                Action ((ActionMethod) &CAARCCreateLine::ActionTwo));
; r8 s2 t/ N5 _; F& P, A0 v3 Z}
2 y& y% B( @; ~. T- C; |4 G8 R6 H5 ?/ _9 M

# T1 l/ U% e; x, x1 \- C4 }8 w//-------------------------------------------------------------------------
( u8 F" C: @& n// ActionOne ()
1 I$ ~( a4 J5 Q  ~//-------------------------------------------------------------------------& [, l  ?$ T% k: }* f- n9 Q
CATBoolean CAARCCreateLine::ActionOne( void *data )
9 w6 q" i8 x' q( v{) f8 J( G' ?  M
  // TODO: Define the action associated with the transition
8 }3 s( {7 }  D; i* V  // ------------------------------------------------------0 ^0 I: o: g* Z0 e
  CATMathPoint2D point2D = _IndicationOnePoint->GetValue();//获得一个2D的点
; ^% }/ s; l9 z$ M! G4 J) k9 ]5 F+ M. V9 @/ S
  CATMathPoint Point3D;! v5 f6 S8 q1 _  j) L' Z7 C0 n
  CATMathPlane Plane = _IndicationOnePoint->GetMathPlane();& X7 Q  P6 e& u5 d

$ |* i3 e$ ?) M/ O  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点
: l1 j& c4 g" G6 ~% \* |9 F: C6 C# B6 T5 p) P
  //设置Container(非根节点)* r0 u+ g: X7 @# w! Q
  //获得Editor
$ B1 z: N6 |& j/ O$ n1 G. h  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();1 k/ z: k# W4 x. `- {8 k9 f, B4 ^

0 U  W% |7 W8 t& G. x  //得到当前对象的文档" {( @/ f1 s8 V4 M% @& _  T, I
  CATDocument * pDocument = NULL ;5 {! F& [  _8 O$ K( W9 u

* t# [# X4 V" f& h( O1 M  //取得当前活动对象
0 [4 S3 Y( l; V5 {: |; v! R# m/ |- b  CATPathElement activePath = pEditor->GetUIActiveObject();+ r4 P5 f. b/ e! e2 C

- K2 r2 a+ q! ^/ Z" F  //取得当前活动的product' e6 a8 w0 d: P" Z  `0 R  x
  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());
( }" S, J- r. ~' T
# w$ B( I* g6 B1 Z  //当前活动对象不存在: R* z8 J" o& o# o: e/ X
  if (pActiveProduct == NULL)8 A. N! v0 ~4 G+ |7 y
  {
! e) e4 l  U3 ]& A, c) E) v7 `$ L    pDocument = pEditor->GetDocument();& D- y9 \6 j, m" v5 @7 R; D
  }
: x, P- g/ V' m% T  else
$ P( D/ W6 S6 X6 U0 t  q  {: g- X' _4 J  ^, K7 @2 j
    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();+ w6 @% g, {# w! H
    //当前对象的引用对象是否存在
0 h7 t# W2 P* X' S: v, G) d4 N- t* T; G    if ( NULL_var == spRef )
# L7 U2 ]: }- \  J    {% }- G9 R1 @6 K# H/ Y
      return FALSE;! X& f# ^  ?, J4 c) ]8 u+ s9 X$ Z
    }
" G1 i2 |& @9 n8 ^7 y
! n0 U8 g# q  m) u' L; }) w7 m/ y5 q    //当前对象的链接对象
( q, Z: g  Z* r    CATILinkableObject * piLinkableObject = NULL;
# l6 {" T: I( @# x3 l5 ?6 D- o    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                            3 o6 l/ m8 W) t2 n" R% |4 {
    if ( FAILED(rc) )/ g. [+ Q8 B4 W9 u/ x! h
    {1 [' ]& L' c# x, h$ f! y
      piLinkableObject->Release();
  J; \  o/ r8 }" F' \) i      piLinkableObject = NULL ;+ C+ m# _* e' `* j$ U0 b
      return FALSE;
4 \4 s6 f+ U% {# y+ h! e    }
) }) r$ C. S) b3 P" t3 k* K- G3 |9 G! U8 |/ ]4 U
    //得到当前对象的文档; f) l! T. C+ T3 r6 B
    pDocument = piLinkableObject->GetDocument();% m0 E6 U1 F0 e' \
    piLinkableObject->Release();
2 a: ]3 O, r7 N3 C    piLinkableObject = NULL ;3 k: g0 ?1 r& s6 H
# Y( S( ?0 s' a. e. H
    if ( NULL == pDocument)% P/ S. F& v. F: T7 L/ ~2 l
    {9 \* g, N. E, K5 l( f$ _) D
      return FALSE;( Z9 ~, A7 l0 t- j& p' A( x
    }! e' }0 L9 Z  z* u5 Z8 W
  }: I$ V/ ^6 Y* o3 j8 u+ f0 b6 V( h

6 f1 T+ p9 I) ~& ?* r. k/ o  //得到文档容器集
0 j3 r" ~/ }- y: y  CATIContainerOfDocument * pIContainerOfDocument = NULL;' a% E3 b% Y4 z. e+ [% d" n2 n
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);. Y) e# t4 U6 ^4 K; W3 Z" D/ G8 o
  if (FAILED(rc))
9 A) {  T1 I2 U3 {+ F  {. H/ z" t8 d6 d# P! {: e
    //pIContainerOfDocument->Release();
+ i3 u: L! ~7 z  g5 z1 O    pIContainerOfDocument = NULL ;
5 o& F2 O3 E% ^" K    return FALSE;5 a* E" E8 o' Y/ i/ m
  }, L! N  J  e3 P% Y* Z

! k3 @* g3 F+ E+ Q1 a8 x  //获得Document
  q3 @: l! T8 A( D  CATIContainer* _pContainer = NULL;        8 _3 s9 R# R! |
  //获得SpecContainer
) b( b" T+ o/ u! ]& `7 Q  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);( a3 ^/ v: h: T. \0 S5 A
       
  n) A  j: r7 K: I' v9 }  //GSM工厂
5 F$ ~& u, s! K  CATIGSMFactory_var spGSMFactory = NULL_var;% N; d- x! v4 K8 E* U* t
  //设置工厂               
; g1 \& t# z7 O/ Y: F  spGSMFactory = _pContainer;                                                                        5 l+ K/ x3 L9 t, d; N5 @

  x* P/ O/ ?$ K0 I! |# W  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);: {7 _0 R( n$ w
. \) c' ~; o0 U8 M: t) M9 s* c5 e
  spSpecPoint1= spPoint;                                       
8 p6 p+ ~6 U3 n( A5 _4 ^6 V' N1 v+ ]  R+ a
  CATIGSMProceduralView_var spSndPntObj = spSpecPoint1;
; V) ~5 M5 |& }& F$ ]
+ l, q5 _1 S* f2 H2 ?! H. i  //*将点显示在屏幕上9 ?. X0 l' `6 Q. F' U
  spSndPntObj->InsertInProceduralView();4 h9 x& V8 w0 ]3 A# X+ k: Y) Z

  l1 @1 `  B2 [4 k6 n( B  spSpecPoint1->Update();, ]0 J2 J0 D5 N% Q9 t5 ?  E

) {  [: X% W! L1 W( Q  return TRUE;
8 Q# J. R* _  S# B+ F$ l}
4 `+ Z3 |! o6 [; S. I' u4 x0 \
' ]; [2 G5 F. S* }% k//-------------------------------------------------------------------------
) _* H; z9 c; D% B3 B7 l// ActionTwo ()
4 F% R5 z) r1 O* L: ]- P//-------------------------------------------------------------------------7 q9 K& S1 Q7 a8 }! U
CATBoolean CAARCCreateLine::ActionTwo( void *data )% C2 q% t5 g3 [4 w6 E. m( T* v+ |
{
) K" F! S! A! n" y& r  // TODO: Define the action associated with the transition
7 ~) x1 x$ q5 f% `9 S  // ------------------------------------------------------
' |+ G1 M9 w8 k. m9 V( v  CATMathPoint2D point2D = _IndicationTwoPoint->GetValue();//获得一个2D的点, A+ I. v( @$ ]* k5 x. d
6 r  `* N3 k8 t! a' {* ^, X% U
  CATMathPoint Point3D;  E& [! H' `7 J6 b
  CATMathPlane Plane = _IndicationTwoPoint->GetMathPlane();
1 H+ Z! V4 @* g: ]) Q  c
( U9 w0 K; e7 M  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点& E' w9 b2 R" b) k( k2 w) b

+ c" a3 D  V2 ^& r' E  //设置Container(非根节点)- v3 j. Y% K7 C1 O5 M5 G' M" G
  //获得Editor& d7 K- f$ I, d# H2 W" U
  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
1 L  A5 j2 W- Z+ v9 d# I+ X' X
! R! T# C8 B; z# ~7 f0 y- R, n( b  //得到当前对象的文档
3 c+ f! K8 p0 c; [& W0 i9 a' Q  CATDocument * pDocument = NULL ;
. I- G7 v  U7 c1 n" Q7 I
! Z* z* C; a: I7 ~/ i9 f& f4 u  //取得当前活动对象
4 D- |; o" F* Z. E2 |# q3 q  CATPathElement activePath = pEditor->GetUIActiveObject();
6 p2 t/ U& {( E( {$ l+ M
9 Q. c* a7 a* v+ d: h9 t; {  F  //取得当前活动的product
( w1 m5 |9 v) Q' q' U8 q6 J  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());
# r9 B& d5 D3 g& Z: r& K& b
( I4 f& I! b% \" D, ?% e" k* p  //当前活动对象不存在8 E# I% h/ n" j
  if (pActiveProduct == NULL); j4 D1 B. B; Y' k
  {8 z* w: X4 z, c7 m4 H+ o
    pDocument = pEditor->GetDocument();
9 C0 b+ r" s% H5 K7 S# a' J, o  }
* ]1 ]+ L$ M5 Y% f+ I  else
$ U: y4 L* S5 F3 M: Y# C) h  |  {
$ Z. r$ ~, n! }1 \, {    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();6 \* m6 W3 N7 `8 ?5 I
    //当前对象的引用对象是否存在
9 }/ r# B* _! u    if ( NULL_var == spRef )
4 ~0 e6 M% ^5 I. P    {2 x( v: d$ A& M; q2 G- H! o
      return FALSE;7 g  [  a0 v9 ]6 K6 F; A
    }
! u* r; R. x& k' B: m0 n3 e
$ P7 ?% f& U9 [0 B" G: }9 y7 x    //当前对象的链接对象$ v  A$ j- W1 m+ v7 D% \3 k# m
    CATILinkableObject * piLinkableObject = NULL;' t1 u! [$ n( M1 ?
    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                            & n9 D4 i, ~& _7 `* @
    if ( FAILED(rc) )" X9 s& }$ ~6 r% c3 [. @
    {
% a- `6 f! t0 |  x7 l      piLinkableObject->Release();8 g6 z2 w4 J: T" T# c( B+ H4 q. w
      piLinkableObject = NULL ;& R, N# ~- c# z3 J( y0 j; }# x4 \
      return FALSE;
+ v  r3 d! Z/ F# f. U  ~: O    }
2 f2 I% A7 \7 u% w, f
& @+ @" g" d) P( D    //得到当前对象的文档! R6 {& I# f, z( Z
    pDocument = piLinkableObject->GetDocument();
! u" U+ L8 x3 H% V& O    piLinkableObject->Release();
6 r4 [  ?3 {6 d+ W3 P9 g    piLinkableObject = NULL ;$ n- ^$ k8 Z$ a" y9 `. N6 n* D

* Q# b% }. Q8 C- c/ Z. G' I2 R    if ( NULL == pDocument)
5 c4 `$ z3 \$ _+ I8 Z    {
2 j. s+ l6 z+ a$ T2 ]; g& B      return FALSE;* A# u# Q6 {, }# u# ?. s4 x4 U: y
    }
! T. |4 U9 G/ k' C8 E/ e( X  }) ~2 w: S% N% I# L6 f
* }/ ^) v  e* F( c, w5 o
  //得到文档容器集9 K: s+ U! u* i& ?. L
  CATIContainerOfDocument * pIContainerOfDocument = NULL;' \; y" j2 q* P+ X
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);
* R  m& a1 [% b' ^; n  if (FAILED(rc))
" V. c4 q) `' S/ x$ C* @0 ~0 ^% S; q  {
; B, ~/ T% J# z! [% M    //pIContainerOfDocument->Release();
( H' S0 ~! y/ m/ h* e    pIContainerOfDocument = NULL ;
9 B% @4 `$ k8 x* I8 g    return FALSE;
, I2 P3 G7 [  v2 L( ~  v5 T7 ~  }
8 w5 x/ p' m: i6 e$ a
. J' v+ Q% X! k$ p0 \+ k  //获得Document- `, {4 E; R3 z8 |: V: V% j
  CATIContainer* _pContainer = NULL;       
+ M1 x! h0 H1 z/ T7 y  //获得SpecContainer
* H9 V! S9 Z- f  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);; h  O2 C/ b5 F4 k8 v) J% g. f0 C3 H0 l
       
; o+ e4 ]5 o+ M6 R  //GSM工厂
- R* [7 V& X# \  CATIGSMFactory_var spGSMFactory = NULL_var;
4 I" d: a. u, @9 G  //设置工厂                9 ?# A0 ~/ P- k  d1 A
  spGSMFactory = _pContainer;                                                                        ( F& T/ P/ b* r1 K, n

! X: J$ `0 `( Q  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);
* s# n1 e3 I# H, R; f+ e: ^6 A3 O  K  ~7 i
  CATISpecObject_var spSpecPoint2= spPoint;                                       
2 Q  o1 w+ i$ {2 L# V- C' t2 Z) r: @5 `/ G* ?/ `8 B
  CATIGSMProceduralView_var spSndPntObj = spSpecPoint2;
; A& s2 h# Q( Q/ E1 O' @8 B6 J) B! \+ b
  //*将点显示在屏幕上
& @# u" r* L% S1 z" D, y  ]  spSndPntObj->InsertInProceduralView();
5 W4 J8 L2 T, f2 N# T
- u; Z9 [! r6 R# E/ a) f( a* O  spSpecPoint2->Update();% z) h! D' C+ U

& f8 N9 K' E; p$ p  //生成线
% m$ ?+ N) [9 ^1 ~  CATIGSMLinePtPt_var spLine = spGSMFactory->CreateLine(spSpecPoint1, spSpecPoint2, NULL_var);- i3 n2 l2 _& c, V4 i$ G9 J

- c4 @& i: b+ |  CATISpecObject_var spSpecLine= spLine;                                        ' D, |/ Y) m1 m
( a$ F) a4 y3 w6 X7 W" g
  CATIGSMProceduralView_var spSndPntObjLine = spSpecLine;+ B  o, n2 |+ I5 E. V) n
$ ]5 ~0 I0 u$ f8 o& g
  //*将线显示在屏幕上
+ U8 g( H' m9 P5 Y, R, ~  spSndPntObjLine->InsertInProceduralView();
- S; y3 a. x. O1 G
! i# W/ i  {& A- ^8 S" x  spSpecLine->Update();
" T# T$ p: J& b3 L* z+ ^6 P. s: T% H) \! e" b8 p
  return TRUE;! d! s; q$ E0 J
}
; U0 Z1 ^+ E2 ]& r5 d& S, T5 y6 r9 b" ]+ M* j

# G, ?( U" Z- V! g1 I, a" 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二次开发专题模块培训报名开始啦

    我知道了