PLM之家PLMHome-工业软件与AI结合践行者

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

[复制链接]

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

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

admin 楼主

2017-4-17 21:56:09

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

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

x
( m; i! \( l1 ^( O) N; W- `0 a
Catia二次开发源码分享: 通过鼠标点击创建直线8 W$ p' B" K5 N5 V) p; I
2 [# f" Y% y9 t9 [, K+ S4 S

1 H- E, e" f8 |# {& A, a$ ]# A- p/ W% {& U2 V
#include "CAARCCreateLine.h"' E+ x0 P* T1 s9 t  u  r6 k" B
#include "CATIndicationAgent.h"3 W" g: t% ]$ z0 e, W# g
#include "CATMathPlane.h"
6 C7 O* E. U* q: j3 ~. ^2 W( H8 a: f* i9 z4 W
#include "CATCreateExternalObject.h"
4 _% y6 k/ a; M0 g3 i* l& ^" W
3 V  l% m# ?& [  d#include "CATMathPoint2D.h"
" m+ A' u" E2 Y. M  \#include "CATMathPoint.h"8 d! o. d$ t7 M+ M$ H* @) N
#include "CATMathPlane.h"
# |$ O% t" D, C0 L
$ l0 R5 [) W, R#include "CATIGSMPoint.h"
5 B  t2 H' q( ]0 M& @- T  B/ N#include "CATIGSMLinePtPt.h"
8 I5 f, }6 u1 `, s
6 ^- z- F9 y. }' X1 l4 v3 y4 ^#include "CATFrmEditor.h"
" g! Q% P7 F6 Y" Y) ?3 [6 D! k: d#include "CATPathElement.h"/ s4 I1 i" ?( \+ `6 [
: l& B0 S0 o8 U, p3 O7 s; S" @
#include "CATIProduct.h"4 S- O& Z! Q3 c+ @) g% P+ d+ H
#include "CATILinkableObject.h"  {8 a! M: m5 R7 q; i- d5 h# w
#include "CATDocument.h"
1 `3 o  ~& d( Q) d* J4 S9 c1 j* ~4 r
#include "CATIContainerOfDocument.h"! d4 X) }: j$ M2 n+ h( t

% q1 W$ b  ]- s- @1 f7 j0 K#include "CATIGSMProceduralView.h"$ V6 [2 L8 _. _
1 h. Y! i4 c4 R2 m
#include "CATIContainer.h"
. V4 b* q' z1 }& |#include "CATIGSMFactory.h"! S3 y4 }* t' z

- E/ v* m3 L; B. j/ D6 w) c- [3 P#include "CATISpecObject.h"3 [, _. G/ C* e& P- U
CATCreateClass( CAARCCreateLine);
( }% T- K0 g/ q8 Q* a* m" Z: f; |; t3 P/ b+ C

* J( X) }+ g. S. F: v//-------------------------------------------------------------------------5 t! u! z  \# f. @" s* h, \5 k# D
// Constructor
' B. E$ a; j. d4 M# L1 u+ H% U. T  w//-------------------------------------------------------------------------
- w/ f6 j. f+ X. W7 ~CAARCCreateLine::CAARCCreateLine() :$ `6 w! y+ g* ~4 _5 f4 q2 [1 k* ?
  CATStateCommand ("CAARCCreateLine", CATDlgEngOneShot, CATCommandModeExclusive) ! c0 U+ U( C* W5 ?
//  Valid states are CATDlgEngOneShot and CATDlgEngRepeat
* H7 F" ^  R1 \/ i  ,_IndicationOnePoint(NULL),_IndicationTwoPoint(NULL)
; d* a, N' T1 O8 ]" X' I{* B. ?$ V  s2 Y  s3 ]
}  j$ I2 B0 p3 F  ~: |1 w3 d$ V. S/ R
$ m% U, g; [6 J& X/ Z! Q, `  y
//-------------------------------------------------------------------------8 s. }4 z. L+ }$ a4 @! o& V4 I
// Destructor
7 g; @6 E% W7 |//-------------------------------------------------------------------------
- G3 o. Z' O9 _8 U2 z" |0 sCAARCCreateLine::~CAARCCreateLine()9 c. h$ Y- x' X. X7 w# Q) g
{" v. Y# M# o  A# f4 _" C! S
   if (_IndicationOnePoint != NULL) + k3 \, p+ S4 W6 A# P5 o1 e
      _IndicationOnePoint->RequestDelayedDestruction();
$ L7 Z7 }9 o' e; A  P& p! E   if (_IndicationTwoPoint != NULL) . f$ {- T$ C( h& _
     _IndicationTwoPoint->RequestDelayedDestruction();: X- G# Y/ @( ~/ b& O# g% {8 |+ Q
}, w5 ^  L: n$ p( W

1 w% E9 j, M- V- V# L: D0 E, c- e$ f7 Y* c. @* T# |8 F
//-------------------------------------------------------------------------
. {  u0 N& U- [+ R0 l2 W// BuildGraph()
& _  o4 E! S+ w8 L' `. {$ ~# _//-------------------------------------------------------------------------
1 v+ n: B5 N* O( {void CAARCCreateLine::BuildGraph()
0 v; A: L0 E2 `* l" n! U- g{4 @4 B5 c& N+ r7 x  j) O

: O1 Y" ?: t6 J9 I" Y; j* \$ R
' y  U; p1 L1 e) |' J" T- r  // TODO: Define the StateChart
' Q# K5 V7 m" n  // ---------------------------
( [( \& c2 ~9 ^: p! E  _IndicationOnePoint = new CATIndicationAgent ("IndicationOnePoint");) @3 a0 ]4 k. }
  AddCSOClient(_IndicationOnePoint);' X; F7 n2 O$ B1 E& \; z4 P# W
/ F7 S' I/ j8 w; L
  _IndicationTwoPoint = new CATIndicationAgent ("IndicationTwoPoint");9 ]' a" [- g& t8 }. T

- N2 Y5 \" v3 `/ g* a' \9 {  CATMathPlane PlaneXY;
8 [. g7 B" R  w0 Y2 i4 s: h0 D  _IndicationOnePoint -> SetMathPlane (PlaneXY);4 C) X# H9 U1 T( {6 c
  _IndicationTwoPoint -> SetMathPlane (PlaneXY);3 t8 P# w, C: D/ L, R2 U
/ [7 C" o  S" @
  CATDialogState * initialStateOne = GetInitialState("选择第一个点位置");
6 t3 c, [' M+ D, z# O; Q1 A7 Y$ L! G  initialStateOne -> AddDialogAgent (_IndicationOnePoint);# L6 E8 [$ H4 Q' B4 X2 d* g
( c9 c+ z* P% I9 \0 T) e+ P
  CATDialogState * initialStateTwo = AddDialogState("选择第二个点位置");/ O. N9 \- n; }5 Y" u" z
  initialStateTwo -> AddDialogAgent (_IndicationTwoPoint);
7 v4 A! n0 n& h& t. \6 l8 n( J1 v5 J1 e- l
  AddTransition( initialStateOne, 6 a8 V6 o1 }* P& D7 i, n
                 initialStateTwo, 4 i/ L' N5 a/ ~  i4 E
                 IsOutputSetCondition (_IndicationOnePoint),
  o, Y$ y) ~  o                 Action ((ActionMethod) &CAARCCreateLine::ActionOne));
$ O  p  l, Y) ]5 M- L; `' [3 o' g- t: O, @; X
  AddTransition( initialStateTwo,
6 D8 b' h6 D9 C4 E" J2 t+ f, d                NULL,
; ^( Q' g( V0 w7 u/ I3 i                IsOutputSetCondition (_IndicationTwoPoint),
1 [2 n- h& X& D( r                Action ((ActionMethod) &CAARCCreateLine::ActionTwo));6 g: t( A  X- p  _
}
. r6 |  a# u. n- Z# [3 S
4 T& @5 d; c0 s. D6 p4 |# b. t9 E: ~
//-------------------------------------------------------------------------& J2 q5 Q" ^: K. Y% J" b6 `
// ActionOne ()# o9 F. p& \4 A$ b6 s% G
//-------------------------------------------------------------------------* \! V- x0 X" }
CATBoolean CAARCCreateLine::ActionOne( void *data )
' C) I( f2 @: B{
$ p0 X" @5 F5 y+ u$ p4 ?  // TODO: Define the action associated with the transition
/ t  E8 J3 V# D6 A  a' m  // ------------------------------------------------------$ K+ K4 ]- A- ]: I# J, B/ P2 {; P
  CATMathPoint2D point2D = _IndicationOnePoint->GetValue();//获得一个2D的点
8 D9 d& D+ [9 J. Q2 {
, T% Y* c# Q7 T0 A  CATMathPoint Point3D;
5 `- @. S/ }1 m  Y- ?6 E* @3 j  CATMathPlane Plane = _IndicationOnePoint->GetMathPlane();% ?' u' ]  o* \5 x; k$ I
" `! j7 a4 D) u2 y1 ^
  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点; Q9 P6 T% \- A! u% {

5 n) M" ~, T9 K4 u! V  //设置Container(非根节点)
( d9 ^: O( g& B1 T  //获得Editor
' ?$ {. x, x- s- l  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
$ ]1 [# B& _) B; g6 z' _. M6 z2 c; g9 m
  //得到当前对象的文档- X( }) H8 p) F0 ]$ o* s2 Y  P  Q  F
  CATDocument * pDocument = NULL ;) J8 O& e( B/ U
+ E3 c: g: b7 P% m5 k% n
  //取得当前活动对象
" P7 j& B  e+ N6 ^3 U# ^  CATPathElement activePath = pEditor->GetUIActiveObject();: M! [* R* w/ D& V! V

* x& `9 a2 j* Q  //取得当前活动的product
9 g. n- C% M/ W/ C  m2 Z  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());3 f* G1 U* }8 i' @) g" E( r( d
( M* _4 N, h: G; N# k' O" f8 h
  //当前活动对象不存在' ~  d+ Q, Q- d! I, V6 T' N
  if (pActiveProduct == NULL)( b+ l; q# q. c2 `
  {
: H) p% {! G7 a7 y" d# n    pDocument = pEditor->GetDocument();
5 ^9 C3 h1 K2 a" g1 A2 A9 ~. `& z  }
# K! D: ^% z7 m. e; g  else
/ u( Q0 C0 ]; R% J! ^. h- u; M  {
$ @7 J7 M% m! B  m8 T7 H0 \    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
* `- G' T/ S0 K8 [* X    //当前对象的引用对象是否存在
7 G3 j% p* ~2 }+ T; L    if ( NULL_var == spRef )
$ ?1 j/ u0 B6 [    {
2 P. v2 F4 a; e; V1 C! L$ s4 O      return FALSE;
" ^$ L- D/ Z# C, E, B; i! A& m; ?5 p    }
. l$ Q1 a: c4 _6 G5 q, q8 F1 Y
+ a" U3 |) d# a& N0 ^: y( c: Y    //当前对象的链接对象2 b) ~; M' l& G1 I9 N6 ^0 ^: Y
    CATILinkableObject * piLinkableObject = NULL;
2 g% y8 }# d3 Y5 m* S    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
- T! S# q6 K. Z0 _1 f  u! o) j    if ( FAILED(rc) )
2 ^1 ^4 @$ |+ c. \    {
( v  c, v: `# v, ^      piLinkableObject->Release();) D: E4 V$ D- z% F: h! p" U
      piLinkableObject = NULL ;
7 B# o' g0 r& \      return FALSE;- N1 s' `" I0 j1 B) |
    }
) p0 x4 f) @' S, m& H
, k+ h, R9 @. I( |" Z7 `; W2 B1 h6 @    //得到当前对象的文档! a) \" B- \# O" T) S
    pDocument = piLinkableObject->GetDocument();
" L& R! p2 b2 A  V0 X2 y( z    piLinkableObject->Release();* ~  c( w" q- u$ j/ [
    piLinkableObject = NULL ;+ a6 G& f1 z. k6 I1 K# m
7 t- e- y# _! L5 Y
    if ( NULL == pDocument)3 Y4 @# i: M( q. T0 V6 D+ p) L' A; h
    {6 R& M$ B6 M2 l2 x
      return FALSE;
6 g% z: a7 ]" }5 }0 x3 a' n    }
& J8 A; \" I7 S7 [7 a& L9 @  }7 f+ Q" l# P% |

4 f4 u" ^% L5 x  //得到文档容器集
! _. }- z2 f3 ?) `! V  T/ \( T  CATIContainerOfDocument * pIContainerOfDocument = NULL;
7 g2 y# e0 u1 M  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);& z9 _* s$ N2 L2 S5 Y
  if (FAILED(rc)); |% Y; Q0 I* X. s1 M
  {! H" N* F& o4 o" o5 P& @
    //pIContainerOfDocument->Release();, v5 l# Z9 s; S
    pIContainerOfDocument = NULL ;
; Y, e" m, K: w; R; H5 w; ~    return FALSE;3 ?5 Z' l: x* y1 H$ I8 X
  }& |3 B9 H6 f4 z2 i
4 U5 {3 l, ]0 ]0 A: I' r
  //获得Document: S8 B5 w6 D4 b1 K7 j1 Y
  CATIContainer* _pContainer = NULL;       
8 `$ k2 B( H; T4 f  //获得SpecContainer# b7 u& I# }8 e
  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
: Q1 \, b+ ~% H2 f       
8 g; r9 C1 \4 f" `  //GSM工厂8 t6 x( w* [" [4 N% f
  CATIGSMFactory_var spGSMFactory = NULL_var;
( \4 o( z! R. D' G5 G1 W  //设置工厂               
4 X& q' A: _8 p* F8 F3 O/ H  spGSMFactory = _pContainer;                                                                       
5 K2 U3 t5 z5 G" e+ r2 B
" r" b* R, R2 v. n( O' m/ v$ N  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);
- M  o6 S1 p) g$ C& [$ P/ K8 Y
  spSpecPoint1= spPoint;                                        1 Q$ T% x/ p* a# \# Y$ Y% @

: a! W3 m6 q; {1 c6 ?: W  CATIGSMProceduralView_var spSndPntObj = spSpecPoint1;( c. A2 c0 W$ O3 u2 O, K2 Y

- D# b* p  F0 B: z, S0 O  //*将点显示在屏幕上. H" [" y0 c$ P- t- X+ D4 j
  spSndPntObj->InsertInProceduralView();7 O& g) z% x1 \, s% `- n/ k* ~
, Z1 e5 d; L9 a7 m+ Q
  spSpecPoint1->Update();
. p+ ]# R7 k2 B& V# g( W
" _" ^! U0 I; v5 E  return TRUE;4 L& a% j  f( B9 M& Z5 D
}
) s" G  Z7 _2 A& h, L
/ n! P5 e# w5 ]: p2 e0 m( m//-------------------------------------------------------------------------
% m1 o' S4 @" Y+ W8 R// ActionTwo ()  Y+ d, _9 p# f+ v7 X
//-------------------------------------------------------------------------, {4 }2 h4 g" }) m; b$ Q4 S% U6 X5 [
CATBoolean CAARCCreateLine::ActionTwo( void *data )2 }0 n  H0 F8 S8 `: k6 K) {, Z
{* u5 Z6 |% q4 y$ Q
  // TODO: Define the action associated with the transition
/ r4 [, x2 Z$ w$ f( R' F  // ------------------------------------------------------; B4 C% }% }3 l( H% o
  CATMathPoint2D point2D = _IndicationTwoPoint->GetValue();//获得一个2D的点0 u" K7 u; i3 R" {1 ?7 T

4 w; a& {, M% u  CATMathPoint Point3D;) w) U8 j4 c" k4 N+ l" d& s' O
  CATMathPlane Plane = _IndicationTwoPoint->GetMathPlane();
4 s: Y5 N) {) A  c1 w1 O* U$ f
' g$ i* ~0 d5 X; `( M  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点- I% ?7 W: u+ N6 @5 p; }9 c0 m; e8 I4 F
5 |, W! ~; P- g$ E
  //设置Container(非根节点)
" ^3 a0 ]( d5 Z" U2 j  //获得Editor
' Q2 d' y& Q! M+ H* I: @5 O  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
. m) q0 E. @0 H
7 R0 t' ]- N5 k) r/ }5 \  //得到当前对象的文档- A. I3 u  J6 g+ N
  CATDocument * pDocument = NULL ;$ O; I. L9 ?+ j# \5 V
/ w+ P& j+ B. r' s' M6 y- r3 b
  //取得当前活动对象& n: f4 l8 D* }3 k6 e6 D) ^
  CATPathElement activePath = pEditor->GetUIActiveObject();
* F$ h+ P3 K* ]  Y. H2 H8 D* }; ]# j& }8 M( i0 E
  //取得当前活动的product* D. j) n$ S' s) @* c0 h
  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());
+ [# u0 A4 M7 O6 l) M' F$ Q
( M( p* L& W) K  //当前活动对象不存在
  p3 }& ~8 |2 N  L9 R! H  if (pActiveProduct == NULL)  J; M* B1 \1 W; p  n, N( q
  {
9 z3 [4 H5 A$ h" q  Y    pDocument = pEditor->GetDocument();
$ F1 \# s2 \7 _' W$ {" C  }7 ~9 n$ B4 F# I! H' N
  else- ~. Y' K- p* r# a; F
  {8 U5 B: L  p0 j- o) |) |
    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();) Q; B& t% ]' G% [; G# c% ?6 M
    //当前对象的引用对象是否存在
2 K4 w0 h( B0 _4 K8 o    if ( NULL_var == spRef )* N, F/ m2 w# T2 ]5 [8 |! a
    {: J3 d* m4 g# Q; L! T
      return FALSE;
$ o+ M* Z, {  i    }2 u+ w& F" T9 T' Z- N( g

9 |* o. {2 H' W* y5 J    //当前对象的链接对象0 S% g/ l# a7 V9 A" T  E5 F
    CATILinkableObject * piLinkableObject = NULL;
8 Q, ~) h+ Z3 ^7 S: c) k    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                            ) U, U* z9 ?" J
    if ( FAILED(rc) )
: |# ?, N+ X1 W. a7 D    {2 o/ l# I( i! [$ }, e; H$ p3 s
      piLinkableObject->Release();
2 M/ }6 o7 u) J( m+ b* m# a      piLinkableObject = NULL ;
5 c) J( ]- u1 A6 ^      return FALSE;2 {8 a: d& f# c  O3 d& t
    }1 i; s5 e( M1 {7 z0 U/ w! _
* \6 w* q* t: W$ }$ z; }5 d
    //得到当前对象的文档
0 k& v: T4 J# l. u    pDocument = piLinkableObject->GetDocument();9 H/ }, l$ V. \2 U. j+ j- C& F
    piLinkableObject->Release();
9 j9 ?$ ?" w# g) i    piLinkableObject = NULL ;
5 g' u4 a. U' X$ H1 ?- @
4 |7 ~9 v. D2 ?; o/ H4 ~1 u1 Q    if ( NULL == pDocument)
& n" }& _( `  x% h# R& l( x    {6 K3 [( a; ~; V# |6 I" P- s
      return FALSE;1 G: i, y6 \0 w) ^% C' X
    }
6 ~3 g9 K7 _4 X; N$ I6 E6 a  }
/ D5 f3 Y) P/ Q9 _! B4 @. {& Q" G- N: z( G
  //得到文档容器集
% H8 _* n8 F0 A" \6 t) J) V  CATIContainerOfDocument * pIContainerOfDocument = NULL;
1 i* i; P8 O5 r: A- u! M  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);/ [; B- o# f0 C4 o/ j
  if (FAILED(rc))
0 h5 ~* u5 Z9 c9 G2 Z: X: W  {
$ i! s6 w# T* y7 g" G* A4 N    //pIContainerOfDocument->Release();: m. Y! e' Y2 i( }( }
    pIContainerOfDocument = NULL ;
( y2 c% {, M6 _1 X    return FALSE;
: n% @! J$ A' \  }& d" }6 f. |$ c, K6 E' f+ E) n

  N/ G$ s' {# ]8 y3 ?  //获得Document
( U& T: B: u  ?5 i, X9 G! L  CATIContainer* _pContainer = NULL;        " m  u6 t) u- H( h
  //获得SpecContainer+ O6 s1 `$ \- l! f; v+ s
  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
" Y+ V, V) H7 E; V        : l5 n# g  K* C  Q7 b( [$ Q
  //GSM工厂
( r+ y6 u3 V; h& Z6 k5 s  CATIGSMFactory_var spGSMFactory = NULL_var;- \/ M. D0 k0 T: f
  //设置工厂                , Y0 i7 f5 i" q, s5 P. z- y! E! e
  spGSMFactory = _pContainer;                                                                       
2 ~7 C; N" y6 X2 K
1 ?5 \- X7 _# ^9 t2 L4 o$ K- q1 o: h  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);7 q' A* A' o  T
/ c7 {7 P; M! n1 b0 _  K; B
  CATISpecObject_var spSpecPoint2= spPoint;                                        + k" `/ X, F9 W. ^

0 e. l2 r, n) z5 N3 o& M/ V  CATIGSMProceduralView_var spSndPntObj = spSpecPoint2;
! p/ D; o( R' P) k9 b* h" p4 P2 Z) T# u, H
  //*将点显示在屏幕上2 l( ]/ l, N2 v% O
  spSndPntObj->InsertInProceduralView();
. l6 c8 E) M6 i! }; j2 ?
5 e, U2 F3 p4 M" [9 K  spSpecPoint2->Update();
5 i* y$ H; i; |- W% K7 T* O& X
* a1 a% z7 D$ q# T  //生成线' S4 B- y) I. T1 r+ _9 e1 v+ {
  CATIGSMLinePtPt_var spLine = spGSMFactory->CreateLine(spSpecPoint1, spSpecPoint2, NULL_var);
; F# K* u9 m/ N0 Q+ m4 h0 q3 a% n# S- c
  CATISpecObject_var spSpecLine= spLine;                                        " V, ^) U: a( W# Y( |7 a

7 P5 L1 C5 z) S8 g" S' Z' k  CATIGSMProceduralView_var spSndPntObjLine = spSpecLine;  i" p# @/ A, m

5 G! Y+ T% f! J$ i: p) W& H  //*将线显示在屏幕上
* [/ a0 Q! I8 l& J5 J  spSndPntObjLine->InsertInProceduralView();( N3 w: o# s$ ?5 p3 ^
% O/ B$ \0 v2 t% ~8 c' ~
  spSpecLine->Update();: s" l( D  X/ B* b/ F1 W

8 I" O0 n; u4 @4 h$ ]! M9 a  return TRUE;0 y0 x( e: T) l! J. i2 m+ n. |* n
}
. ?# f& V1 X7 K% z
: Z6 l& o, i; {
2 E3 o* _: j3 `% r& {8 X6 s
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了