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

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

[复制链接]

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

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

admin 楼主

2017-4-17 21:56:09

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

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

x

! H- }" |! ^" x$ S. C, cCatia二次开发源码分享: 通过鼠标点击创建直线4 s: k6 f- J- T$ A5 y7 a. S
& R; Q; v" r7 p( s3 [2 o: Z% x

! F- w* l% \; D+ Q( N& n2 t2 q! o; K9 n7 A6 L5 a
#include "CAARCCreateLine.h"+ M8 Q( D8 r6 a  l
#include "CATIndicationAgent.h"; m) b# d! W+ L! {. a( N' d$ k
#include "CATMathPlane.h"# P0 d: p# a1 n  _* V9 [+ h

( V  t- h* Q' i- C#include "CATCreateExternalObject.h"
( g1 c: [  n* S& ~4 \; v& Z1 k: {0 r% a! R8 u6 I8 W% B/ d
#include "CATMathPoint2D.h"5 a! i& _; V8 ^. F: a1 B
#include "CATMathPoint.h"
0 P9 \% q0 ]9 Q% E$ ^' s2 P4 T& `#include "CATMathPlane.h") ~# N- e& b: a1 p  _5 f% v

- d8 U( e$ k" n  Z#include "CATIGSMPoint.h"
: Q+ e$ N# [1 T* c$ O& U#include "CATIGSMLinePtPt.h"7 o: N3 w! F: X! g

. _4 t' q2 r4 C. T7 j7 G! L#include "CATFrmEditor.h", M. b3 {3 A5 s8 ]! o1 {, |! ^4 ?
#include "CATPathElement.h"' A% \' }* B+ ~% f9 T) m

$ N+ f& t* ^& K1 \9 D#include "CATIProduct.h". ]. n5 ]& x7 c- q- K% F* O
#include "CATILinkableObject.h"
$ K$ H( o/ E! w# Z* b1 x#include "CATDocument.h"
, i6 N4 }5 l, G2 S) T6 M% d" ?: y' H4 L# p; S
#include "CATIContainerOfDocument.h"& N3 w1 F0 |' k5 ^' a$ {

, ]0 c3 H. v/ a#include "CATIGSMProceduralView.h"
" M- G8 G1 @" ~% ~+ G% j, M2 R4 m
#include "CATIContainer.h". e% E# r3 a: s& r: o; K
#include "CATIGSMFactory.h"
0 _* `3 f" T7 E5 s! o, S+ S! y: t. ^$ n' S
#include "CATISpecObject.h", m% y8 e" Y( S8 S
CATCreateClass( CAARCCreateLine);$ M/ y- r, {9 M% A4 e
7 z) O* q+ r+ N& y
" O+ D  ^: f% m4 q4 v
//-------------------------------------------------------------------------, x9 B4 A( i: p. H6 R1 r
// Constructor3 u4 u3 d7 ~# ^, Y4 X7 q) U, T
//-------------------------------------------------------------------------  ~& h' c( _+ T2 X
CAARCCreateLine::CAARCCreateLine() :
5 V: S6 @0 q" J, Q2 x  CATStateCommand ("CAARCCreateLine", CATDlgEngOneShot, CATCommandModeExclusive) # q7 K4 t/ l/ A) r, F3 D/ d" t
//  Valid states are CATDlgEngOneShot and CATDlgEngRepeat
' e3 a8 n( I/ b8 ]2 z1 t  ,_IndicationOnePoint(NULL),_IndicationTwoPoint(NULL)
' |4 m- B: Q5 z0 V% B* c& T( |. h{
- `& V- K# r; v" x8 s' E3 a}
' u: ~2 n& b# l* |1 z/ f; }' D$ ?% T
//-------------------------------------------------------------------------' \9 G+ a# r1 p5 o
// Destructor) _% {6 H# G2 f0 J
//-------------------------------------------------------------------------; G2 s# H- b8 H7 Y# D. [* b( Z
CAARCCreateLine::~CAARCCreateLine()
4 s# X0 w' l& Z. M/ V' J$ t{) Q7 ]6 Q/ _( l0 R: \( E
   if (_IndicationOnePoint != NULL)
% p) |' ^  E. S* R8 }  y      _IndicationOnePoint->RequestDelayedDestruction();
7 V, J$ O4 m" q7 n$ _; v  `2 V+ T   if (_IndicationTwoPoint != NULL) + l5 w2 v. n# U! g4 _2 R4 M
     _IndicationTwoPoint->RequestDelayedDestruction();5 k* N1 v4 o( Y: s7 E
}% V9 S2 y( n# f0 K7 @

# Y9 ^3 V* K6 G# D3 L
2 |, k. f' S3 a3 i8 d6 O//-------------------------------------------------------------------------
* c# h  ?0 \! H3 g// BuildGraph()' P3 ]( [8 a+ {7 P' N6 ]. g
//-------------------------------------------------------------------------
; [) F0 ~. Y) \* c6 kvoid CAARCCreateLine::BuildGraph()! Z3 j5 y$ _/ N+ J! X
{
0 }: h5 J# P( f& F/ W8 H$ l: d" k; c  T* `0 c$ z- }6 u$ N

0 F) ^0 c4 X1 ~; o4 K# s  v7 U  // TODO: Define the StateChart
8 E) w# ~& q5 P  // ---------------------------' I5 Y8 q& p8 G  z
  _IndicationOnePoint = new CATIndicationAgent ("IndicationOnePoint");0 H1 c1 d3 d  v( M' K
  AddCSOClient(_IndicationOnePoint);
  n% i9 x% x; e( u1 Z
+ _3 w+ T/ ?) S, z5 D% V6 \  _IndicationTwoPoint = new CATIndicationAgent ("IndicationTwoPoint");
! J# Q8 s1 U# N: ~/ \
+ Y( R& T- X: [, }  P  CATMathPlane PlaneXY;% W" k' {0 L, w/ G+ y1 M
  _IndicationOnePoint -> SetMathPlane (PlaneXY);
7 h, I) ?4 _3 f! h  _IndicationTwoPoint -> SetMathPlane (PlaneXY);
5 S/ c  P: `/ G2 y
2 w/ z: p3 ?/ x, R  CATDialogState * initialStateOne = GetInitialState("选择第一个点位置");
& N* _& T) s/ i  initialStateOne -> AddDialogAgent (_IndicationOnePoint);6 P" e5 l# J" J; O3 u

2 t" I" V/ O$ v- h8 z) C. j3 A  CATDialogState * initialStateTwo = AddDialogState("选择第二个点位置");
1 I0 Y5 I# A) _1 e% Z# D8 `. ~  initialStateTwo -> AddDialogAgent (_IndicationTwoPoint);" o3 ]! S. z# y" @% h3 `7 ^: s

- Z  ^6 U5 S5 t+ i  AddTransition( initialStateOne,
8 I$ ^$ b$ q' H; s8 C1 k8 J6 o                 initialStateTwo,
$ ]$ c1 _( C7 j                 IsOutputSetCondition (_IndicationOnePoint),, b% \% k/ Z  J: a* {
                 Action ((ActionMethod) &CAARCCreateLine::ActionOne));' I; y1 w* n: f7 z# N

  T1 s" ^: e* v/ _2 d: S  AddTransition( initialStateTwo,
, p% ~; K6 t7 y8 F( t; O( U                NULL, 7 C  A! f& s. a% C9 B) W
                IsOutputSetCondition (_IndicationTwoPoint),
. N4 w4 L) L- @- r& e                Action ((ActionMethod) &CAARCCreateLine::ActionTwo));
3 s' o2 N6 D' z) p' B5 _}! n: ~5 v, Y9 r( {6 t

" O- u( W! R1 n' e7 Q/ H% K9 o- W( M. D
//-------------------------------------------------------------------------
$ r; e$ v# z  f) x- W. l// ActionOne ()1 R. L* F2 H, [% e" Y; I$ a# w/ j
//-------------------------------------------------------------------------& p4 R" v3 [3 \7 ~( V" z; U
CATBoolean CAARCCreateLine::ActionOne( void *data )
9 Y1 U& G! i" z& V% D+ |+ F{& Q, M8 N: S8 B- S2 _% r
  // TODO: Define the action associated with the transition
0 y- ]: z1 P3 r0 e% o" a* E  // ------------------------------------------------------
' L% ^5 `" K/ l) {  CATMathPoint2D point2D = _IndicationOnePoint->GetValue();//获得一个2D的点
5 i$ e( ]- W: J4 K- h) ~
! n% Z4 y$ c2 Q& U" K1 t  CATMathPoint Point3D;/ J) W: ^# a- u( H
  CATMathPlane Plane = _IndicationOnePoint->GetMathPlane();
" ^/ d4 i8 a8 s+ j1 S& H) g
5 k0 R. x5 y; |9 \" |  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点
: G: Y3 W0 L5 r9 x' y" _5 M5 \# P, F4 H, {8 R
  //设置Container(非根节点)* W6 |% D1 s0 k6 a! G6 d
  //获得Editor
- Z8 U$ G4 V4 v# J- j: R  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
8 G- o. d! B  e$ ]7 Y& F& [; s
  ]5 F2 z5 K8 v# v6 u  //得到当前对象的文档
  @1 {5 C! Z- u. |" {  CATDocument * pDocument = NULL ;
  m/ k- B9 Y& W$ T0 b( W& w" _/ I+ A8 r+ c
  //取得当前活动对象6 _0 X2 H" O3 [' r3 M! V* f7 K% \  {
  CATPathElement activePath = pEditor->GetUIActiveObject();
  P1 Z6 Z1 Q! A+ j4 G0 C$ d4 C4 Z3 |9 c0 E
  //取得当前活动的product
  N1 u$ T" J% [4 }1 d  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());
2 ]! d, e, ?  A* r; E3 K# J" d, @& m. q  [; B: l" u
  //当前活动对象不存在
, O% c" P1 U2 ?' @: P  if (pActiveProduct == NULL)' s% Q, ~8 S: Z
  {! G2 ?# R' Z% s" K. w# M  z" o0 a
    pDocument = pEditor->GetDocument();
$ x) y) [5 b( X- N$ B# [  }5 X6 z/ R5 o- |
  else
/ ?% S0 E8 Z9 \) }0 k  {
% e& Z9 D3 w1 ~5 z6 S( @4 G    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();& Q; A/ |' z+ f% F  H- t4 M; Q% a
    //当前对象的引用对象是否存在$ G$ J0 L" a2 k
    if ( NULL_var == spRef )
% x. h$ E% l( r* K; R    {
/ a5 T; C! c+ m' I      return FALSE;! K! a1 ?  V  E; J' K) W5 J0 L
    }( i( n: m% D# z. N( {/ {3 L. I# r4 g

$ ?$ x1 V9 V! v$ o+ h    //当前对象的链接对象
8 W$ ]/ J/ w6 G7 {% _, U/ K    CATILinkableObject * piLinkableObject = NULL;/ v5 n) w" \. o8 T3 @3 a
    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
8 b7 E6 k* I- v0 n7 z4 [+ F& l    if ( FAILED(rc) )4 [( g; n( W% y' R
    {
' U6 _2 N# }8 @# j# _      piLinkableObject->Release();
7 u5 }, F* P* e: B4 s8 P      piLinkableObject = NULL ;; f, l$ I, L  ?6 X2 g
      return FALSE;
; P4 T( j* g* \. a# H! g* c, E6 N    }0 O+ ^5 `8 U/ W; ]* w
- D) k$ \! z# C" t
    //得到当前对象的文档
$ V- u: x7 P8 t8 T  L) Z0 E    pDocument = piLinkableObject->GetDocument();+ x1 @' [+ r: z* D; ?/ w. m
    piLinkableObject->Release();3 `9 g  W5 C" q2 H
    piLinkableObject = NULL ;
+ ]- i# `- s$ D+ R% F
3 j3 s8 D/ P1 u* Q+ t: {2 t    if ( NULL == pDocument)- I# E6 X+ U1 E6 f5 b
    {" O- R+ ~( `9 P+ [
      return FALSE;
' \. N' H: S0 J    }
1 `9 d. ~! t' O9 L! G  }
' S9 h* s7 a3 p8 d4 S; M# X: L: v9 e6 j. h: y' V
  //得到文档容器集
9 x4 o! Y% {8 j. _" V& G, _5 x$ f  CATIContainerOfDocument * pIContainerOfDocument = NULL;9 B& O. o: L8 d3 v2 i8 a
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);6 \* I  N3 c* F# Z- ]; ~& w
  if (FAILED(rc))# S, q3 i# K9 C  M  V0 Q1 P8 U
  {' x; m& i8 c' d: ^7 q8 Z
    //pIContainerOfDocument->Release();5 V: ]6 j! }# V$ ]$ k0 I
    pIContainerOfDocument = NULL ;& t5 [: m; E6 w3 Z& E3 z
    return FALSE;
* e1 E+ m! z! h" _1 U8 Y3 R1 @6 z6 O  }9 L& \: @4 T! m' c
. z* q: i% I+ @2 G, Q% _3 p
  //获得Document
  x1 n  Y3 r% b3 e- |5 h  CATIContainer* _pContainer = NULL;        6 Q8 {: P; @8 b5 c4 E. r3 d
  //获得SpecContainer3 s+ d( q; r0 S/ O
  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
& Z1 ]3 @( f2 L0 H4 M1 q" i        ' r' R8 _' }5 k$ }% V
  //GSM工厂
+ Y; `  a/ w9 F! b. N$ e  CATIGSMFactory_var spGSMFactory = NULL_var;
" d8 x0 c1 z) o% {  //设置工厂                9 a$ F1 \1 Q# T5 i, m7 ~
  spGSMFactory = _pContainer;                                                                        5 C5 i" r7 Z& h: g8 v' n

8 B6 `# n7 W7 C0 G) G; A  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);
6 ~$ i, [% r6 z0 a
: \3 M6 K  g" y  spSpecPoint1= spPoint;                                        9 ?+ N8 e  N3 a% `" e3 y/ D; y
# X7 S; w: D( ]9 g# h. I
  CATIGSMProceduralView_var spSndPntObj = spSpecPoint1;8 T" C  u/ _1 k: L8 i: m

. _9 n6 R3 C# g- S' l  //*将点显示在屏幕上
* t$ Z4 z8 i" u+ c8 {( |  spSndPntObj->InsertInProceduralView();
- X" Y7 X; Y- N. |' `  L4 L, i  Y6 z# O& k" [  M% T/ p
  spSpecPoint1->Update();' [( A0 W/ c3 n# d" H/ Y9 S  V- ?

8 U% ^( R0 ^7 }( \4 x0 _4 r  return TRUE;
6 H) B: m* T) U3 H3 {, Y. d}
% k' o1 ~1 l6 U7 d5 e4 ^3 L. N! }8 L3 g( g$ s( Z! t! c6 u
//-------------------------------------------------------------------------' Q, G4 S( }9 W$ Z
// ActionTwo ()) S9 s- {% y, z. j6 e0 U6 S5 W
//-------------------------------------------------------------------------
5 x0 ~" Z5 `, l* k& rCATBoolean CAARCCreateLine::ActionTwo( void *data )
6 t  \: ^3 q% [% c4 R{
5 C8 s5 J& n4 x% c; N& Q+ M" p, {$ z  // TODO: Define the action associated with the transition 8 m% v6 ?* J) \' P, u
  // ------------------------------------------------------
7 u5 `9 Y  B7 h$ U& w- W9 T  CATMathPoint2D point2D = _IndicationTwoPoint->GetValue();//获得一个2D的点  R1 @' Y) c4 u! e# L3 N" X
, G+ z, l9 V1 Y
  CATMathPoint Point3D;
1 g' c" |" S0 c  CATMathPlane Plane = _IndicationTwoPoint->GetMathPlane();. |" ^$ H! O  U3 ]$ T9 ^8 l

2 d# V, s4 S( K* a+ T6 j  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点
$ {2 N% G- E9 d( {5 z  ^
+ x) S) J) t4 X  `; @  //设置Container(非根节点)  A% ?  N& j- q5 G
  //获得Editor
! u& q7 l4 ^# k3 t5 G* E  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();- J, X- G, {8 m# ?3 ^

+ {6 f$ w+ p3 [2 f  //得到当前对象的文档, l7 u1 O- k) ]+ g) M& |) c1 f
  CATDocument * pDocument = NULL ;2 q6 A1 b( m, P6 ^4 u
) D6 N3 W& g6 [* a; _$ T
  //取得当前活动对象; Z2 a1 x, E# n  o2 u* y0 a
  CATPathElement activePath = pEditor->GetUIActiveObject();
4 _: N0 z* o7 X) p; ^* Z' v5 c4 j! D) D, c' n6 D' ~  a
  //取得当前活动的product
, D6 O: l# \( p5 b  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());: N; Z, i- h7 n* i( O8 n

( C" h. ]+ }# R, h+ D  //当前活动对象不存在
# W" {4 F+ u' _, j  if (pActiveProduct == NULL)
* J  V  ]' k/ C+ C. Q  {& }0 q% p6 X. W- y6 V
    pDocument = pEditor->GetDocument();
$ S$ A7 s  [" v' E  }$ ?0 E- }$ g8 L' a7 F6 b" ^  C5 o
  else
3 z- w9 O  P4 i% S  {
/ u! p0 \/ J! T" k$ U) w    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
$ L( P7 X6 w3 `& G" q- c' v, r    //当前对象的引用对象是否存在
0 M6 C* j1 [6 V) O. v3 q    if ( NULL_var == spRef )
  {$ d, I( t; g# C# }  v* K. P    {% H7 Y, m3 A; F4 t7 I+ {
      return FALSE;
2 r% r# a1 G3 V  m/ ~1 o1 a0 C- j    }
9 f# s  I6 [6 p& E8 S7 ]5 l6 R1 @: M7 ?! r: U( P+ E- l
    //当前对象的链接对象
+ Y" F& j4 C  t" T, ^! K    CATILinkableObject * piLinkableObject = NULL;
6 A" v5 y; e9 J. B    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
( [* y& K  r9 j' l% G3 u, m% ^/ k    if ( FAILED(rc) )1 o9 y9 l1 n4 t5 a
    {% z$ y; h8 \2 u' J5 c2 }
      piLinkableObject->Release();
0 T5 \8 ]( j8 ?  a: @" \      piLinkableObject = NULL ;
, X0 ~* g; K! q: |. c* [5 l      return FALSE;
, P) w2 H. _# R! k  H5 f  d    }
* I" w" k9 j/ o- l) T2 F: |9 i& t  R4 b( E+ m! S
    //得到当前对象的文档! y! B$ ?6 q7 e2 v7 Q3 m8 T
    pDocument = piLinkableObject->GetDocument();
8 e/ s7 s9 j2 F- J( d0 m' Y) X    piLinkableObject->Release();
/ M! K* T) p8 n    piLinkableObject = NULL ;' {- {* [% @. {

3 T* Y! P" P; w: W  T9 p    if ( NULL == pDocument)# ^/ b/ ^" @- ?2 c, U
    {4 @& [% t5 C, X% ?
      return FALSE;0 G9 `* h9 U3 J2 |% k
    }+ p' ]0 e; w3 O. V5 [
  }: x4 m4 Q5 _3 D! L

* l& c& @# x' m% o6 ?8 `6 r  //得到文档容器集
2 d4 a! u( e) y2 {, j( f& j. T  CATIContainerOfDocument * pIContainerOfDocument = NULL;. S/ A* U; T6 l: h  B6 p' s1 T
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);5 o  l6 |. e6 v. n3 w
  if (FAILED(rc))
1 [2 r2 X0 r0 q  c' k+ I  {
9 u4 E. b# ?6 E: g/ g: d  G    //pIContainerOfDocument->Release();# R, w9 L9 z! K
    pIContainerOfDocument = NULL ;, p3 |+ e2 h4 ]5 u
    return FALSE;
; P: c/ J- |! v( y% @- M2 H5 q  }- P: e! i. b( y7 d

, Q7 K! J  [+ k8 `6 E7 B+ Y  //获得Document, t+ n5 I% x* J/ b8 J
  CATIContainer* _pContainer = NULL;       
1 \8 n1 Z3 c, h' \/ {) Q  //获得SpecContainer( M1 w3 H" F; z# Q
  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);- f0 V+ N0 D* `9 ~: ~4 @
        ! P9 q9 n1 R( e% R+ h- z8 \
  //GSM工厂
* T* p. n. x' w; W* _  CATIGSMFactory_var spGSMFactory = NULL_var;& N  }4 e" n2 V/ X  a6 v
  //设置工厂                9 B0 A9 L; L5 T# t) C4 S1 d/ z, z
  spGSMFactory = _pContainer;                                                                       
$ ?0 r/ H- P) F4 j- y, V( T; Z, V& [+ W
" {! M1 ]5 c  o/ L3 P  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);
$ X; V! \' K! |# S; @* d* Y
- l+ V; b" \3 H% w$ C  CATISpecObject_var spSpecPoint2= spPoint;                                       
  l, @- e" b* N' V' D! h$ Q8 b  H2 N+ e$ L4 ^; t+ N- m* `
  CATIGSMProceduralView_var spSndPntObj = spSpecPoint2;
4 i. R, J9 ], o. o7 j% K6 n' m9 q' P) Y& f' p
  //*将点显示在屏幕上
! B3 b4 R2 b( j7 e3 v  P, o8 Y* h  spSndPntObj->InsertInProceduralView();9 x  s" N4 |/ X

- g7 H- e4 h, J7 ?  f  spSpecPoint2->Update();+ y* }0 _& H/ r
) G$ [# O: c* I& N5 a( Y: H
  //生成线
7 B% o# \/ M% y9 _  CATIGSMLinePtPt_var spLine = spGSMFactory->CreateLine(spSpecPoint1, spSpecPoint2, NULL_var);6 r  }) _' O0 p7 p; p1 n; T

, U; v! c, F, p- D8 p  T  CATISpecObject_var spSpecLine= spLine;                                       
( `8 w( d1 F5 [9 [7 _8 W$ q6 p& b, Z9 q9 q
  CATIGSMProceduralView_var spSndPntObjLine = spSpecLine;
5 ?& m  S! l  c6 ~' j; a2 y, R
9 Y( V  o1 o  w: L2 h1 O) a6 q6 X  //*将线显示在屏幕上
+ e* N% D0 V5 v  spSndPntObjLine->InsertInProceduralView();0 v  ^% v) c1 X

9 ?$ Z; q/ Q0 D( c# x  \  S- \  spSpecLine->Update();
+ k  B6 H  K* k& O) m& J
6 j6 J# p8 ?; Q. N9 I9 z( h  return TRUE;- f. S% f; K( P' E" @
}
; t1 i- G' h* I" J
. o$ n* I: x! N" D; S7 g
! z7 T4 e) p4 S" I& A0 K6 E, 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二次开发专题模块培训报名开始啦

    我知道了