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

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

[复制链接]

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

2470

主题

1275

回帖

8万

积分

管理员

PLM之家站长

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

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

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

x
0 O' T: ~1 v6 q1 G3 H2 k
Catia二次开发源码分享: 通过鼠标点击创建直线4 j- `) a  \; y( Q
, @/ e5 x! W" {2 b& q6 X! Y

9 k; Z/ S, r2 b  q7 i6 G5 Z% i  h8 a2 v" N
#include "CAARCCreateLine.h"
" V! U! Y0 O. z# [#include "CATIndicationAgent.h"- P' C" o# A9 V( Q
#include "CATMathPlane.h"
2 V# _, ^# |, o, M3 n) O( h, B3 Q3 j, J1 s
#include "CATCreateExternalObject.h"/ ^" j+ k% X, H
  ]% t' {* }6 @% V6 X, U
#include "CATMathPoint2D.h"; J4 {1 D4 u, q9 o: n1 P+ r$ y8 ^
#include "CATMathPoint.h"* L# L* `* `8 p- V" `: \- `
#include "CATMathPlane.h"$ R  |5 z7 y% a2 h# {& O
% S. ]0 Q' q0 {3 [, |
#include "CATIGSMPoint.h"
9 U% L9 \6 p: Q  a7 L2 X; ^#include "CATIGSMLinePtPt.h"
" _( c6 _; ]: ~3 ~  M# V9 C0 b3 X# S7 m8 }1 h4 M- @+ p
#include "CATFrmEditor.h"
9 Y% T6 X# t3 n% U#include "CATPathElement.h"+ Q5 I7 N  T% E+ U6 E
  X/ H7 {0 A, g4 w+ o
#include "CATIProduct.h"
( \! e/ h" X! Q6 Q' ^8 N) Z#include "CATILinkableObject.h"5 K( j) ^$ }. F0 B' P* i
#include "CATDocument.h"
  ]0 ]: d( U* M" w- u
8 d6 L9 X: a3 Y+ h1 t8 F/ U9 _#include "CATIContainerOfDocument.h"4 f8 u5 ^9 d& f( [6 Q* W5 S

. k' o4 [9 ~' c' E4 [#include "CATIGSMProceduralView.h"
) s9 d- V5 I$ i! ?7 Y) e4 U. v
; V; L( H( G4 r: X( b: N#include "CATIContainer.h"
" E- J9 i, Q! M+ N7 _) S& I#include "CATIGSMFactory.h"
2 h( T% s( H, k4 X4 B; |$ x, [1 a$ W% I, ~& A# b
#include "CATISpecObject.h"1 u* M1 E' w. M
CATCreateClass( CAARCCreateLine);
: q! x+ k7 U9 j5 i% {8 D
9 a6 g# C  O; [( g3 u( g
/ a5 y3 [$ {! {* Q# y0 ?: E//-------------------------------------------------------------------------$ C& a1 b- H, {
// Constructor
& \3 ?9 M1 B+ V/ l//-------------------------------------------------------------------------/ u5 |1 @* X* j9 H- }" R
CAARCCreateLine::CAARCCreateLine() :
' w* P* [" A7 H" v  CATStateCommand ("CAARCCreateLine", CATDlgEngOneShot, CATCommandModeExclusive) / ~( M( u7 Q: g0 m, q8 c
//  Valid states are CATDlgEngOneShot and CATDlgEngRepeat' Z3 U. i2 o6 ~) Y; v& A* w1 E
  ,_IndicationOnePoint(NULL),_IndicationTwoPoint(NULL)
' `6 ~; I6 L! D, R% {{
6 I" e) ^) J, h6 a1 H0 e9 \: x}6 Q; ]. }5 G0 I" _4 q( q3 F& |

" F3 |/ Z: R" O" B) }//-------------------------------------------------------------------------
2 I; m$ X5 U* P; H* D' `+ S+ Y// Destructor: u% [: I  u4 D0 b$ O
//-------------------------------------------------------------------------5 s* o# G: h: N* t, T8 j: A
CAARCCreateLine::~CAARCCreateLine()0 m* O  k; \$ h$ L# M
{' r7 [* p' ~, p2 I: g
   if (_IndicationOnePoint != NULL) : q2 z8 U6 C7 k
      _IndicationOnePoint->RequestDelayedDestruction();/ V( `8 X. g# s/ X0 J7 {
   if (_IndicationTwoPoint != NULL)
* j$ B1 ~% T; h1 a! ^" Z     _IndicationTwoPoint->RequestDelayedDestruction();+ S. {" ]6 \4 U6 u* d
}
) C% \1 H. [8 F6 a+ X- g) F0 ^, o2 I# ]6 N; b% ~8 D
: L' J( X0 O7 |! h  [. e
//-------------------------------------------------------------------------% s, M+ ?2 o$ C) `: d
// BuildGraph()
  y) {& b  |9 T' u% P0 J: q: z; K* n* b//-------------------------------------------------------------------------; O, y( }5 E1 d
void CAARCCreateLine::BuildGraph()' b. r9 E; y- w
{
/ O- F7 \3 C. n( p2 t
+ i* g7 ~% ~/ L6 E& k* \
  q! X: @& f9 t; E3 S3 I  // TODO: Define the StateChart
+ `; p7 a/ j1 A, L6 l/ U% n  // ---------------------------1 ]6 c& ^* f8 y7 }: r5 ]0 _
  _IndicationOnePoint = new CATIndicationAgent ("IndicationOnePoint");
% C5 T$ y2 Y" d8 z. \! E  AddCSOClient(_IndicationOnePoint);
3 R. {" }0 q1 Y, Z& L! ?
% e: {& {0 J6 i* Q" U- G( f% j  _IndicationTwoPoint = new CATIndicationAgent ("IndicationTwoPoint");- Y. d  V9 R- e* h# B; b) a
6 S3 E3 R1 d. [$ G
  CATMathPlane PlaneXY;$ D- w* V4 U1 z3 a
  _IndicationOnePoint -> SetMathPlane (PlaneXY);3 ?/ a0 W+ h6 }) Y" t8 E$ d( o
  _IndicationTwoPoint -> SetMathPlane (PlaneXY);- M  r; w' _) O4 w3 l

  F7 o1 m/ D! @- V) o  CATDialogState * initialStateOne = GetInitialState("选择第一个点位置");
2 |* J- s8 l, r, l  initialStateOne -> AddDialogAgent (_IndicationOnePoint);
; Q7 [5 r4 O. d* Z9 b
7 s$ {/ D/ t% z  CATDialogState * initialStateTwo = AddDialogState("选择第二个点位置");
2 _* X6 c/ I2 M) k' q  initialStateTwo -> AddDialogAgent (_IndicationTwoPoint);
. }$ s% z% }0 f& Q, [
8 B6 W8 O3 o8 r  AddTransition( initialStateOne, , Q5 O1 M- h( S; _2 _3 K
                 initialStateTwo, 0 q1 q9 V* X3 k2 R: K
                 IsOutputSetCondition (_IndicationOnePoint),) S8 c5 e0 z5 B& v% O9 W
                 Action ((ActionMethod) &CAARCCreateLine::ActionOne));
' E7 D% Z+ k: r7 x1 k9 [; }  w' d( y
  AddTransition( initialStateTwo,
% b, q( S: l& r/ b3 \& o; m  {                NULL, " f; d+ i! H9 j+ G; A5 A. r
                IsOutputSetCondition (_IndicationTwoPoint),8 l* y4 i- i, l; T& D
                Action ((ActionMethod) &CAARCCreateLine::ActionTwo));( p; n( y0 ^  j; x+ _0 U$ M$ B: U
}, j, M' M: A) X6 u% Y" J0 t; R

+ Y0 R& u' t3 A! A' j- Y& G7 ]% Z; g
! i3 f! D0 v# X5 P7 i//-------------------------------------------------------------------------$ r6 r& I7 @* g
// ActionOne ()
3 H5 }2 }9 x# V8 O5 t8 J//-------------------------------------------------------------------------
( i$ Z! D. i& s" S: Y8 V0 ]CATBoolean CAARCCreateLine::ActionOne( void *data )0 o% A+ i4 J0 V1 }0 K
{- d# t. U" |, z, K
  // TODO: Define the action associated with the transition # W0 p" e! x5 Y
  // ------------------------------------------------------9 v' `4 N6 j" l
  CATMathPoint2D point2D = _IndicationOnePoint->GetValue();//获得一个2D的点5 `2 I7 n/ W! c8 T0 C1 e5 }. B5 Y
7 _/ I: ]4 d* q% H; P: X
  CATMathPoint Point3D;7 _" a4 D3 N  l9 q! k% q* Z
  CATMathPlane Plane = _IndicationOnePoint->GetMathPlane();" {7 u$ s  C" W; p6 g0 ]

0 T/ |3 R( t+ J3 ^+ D& w  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点
! D, k5 k6 |, M" d9 Z/ i5 f' J8 R( _8 ^1 {- u& G; U' c
  //设置Container(非根节点). q! R% g9 @% T/ T. v( @
  //获得Editor4 X9 a) w1 A& l: l( V
  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();7 f. }2 S$ H- Q6 l6 s( f' \& K  A

/ m- q3 L4 C8 y6 ?1 g! X  //得到当前对象的文档
( B& Z$ v! {4 ?( k  CATDocument * pDocument = NULL ;# C8 q% |( _* |* X4 f: D9 a

9 \: [9 Q0 p3 @- \6 g1 r  //取得当前活动对象! S5 Z' @5 g( h* s
  CATPathElement activePath = pEditor->GetUIActiveObject();2 k1 L1 l! e% J9 d

5 C/ J6 [" p2 a3 V: o  //取得当前活动的product7 O* D  R- l7 o" Q, e5 N0 U
  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());3 W+ d: n- d4 A( k
. I# \, n. w, a, ?
  //当前活动对象不存在0 A7 O2 E+ A2 H( C8 }5 X; O" ]
  if (pActiveProduct == NULL)
9 A) _9 P' D; N/ k" M2 H4 u: L  {" S! b9 y3 B, k( P4 d3 {/ G+ y
    pDocument = pEditor->GetDocument();
; u: F  G2 V; v# ]( p  }9 s$ b0 k" ^- ~
  else
6 _, ?4 _3 l+ M9 O  {
) _% R! L- U1 z# z  r9 [    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
+ B* O- b& p8 L" {% ]9 f7 l    //当前对象的引用对象是否存在
% T* W# m7 Q4 W% u% u, S7 t4 r    if ( NULL_var == spRef )7 E& L( T4 H9 g* A+ O! d3 P
    {. O4 r& _- i) M  [" N) m
      return FALSE;. l, n# P9 \% ]& v: n; Q: d- ?
    }& h8 [# `+ F! j! J8 L
3 V+ j+ U! J& g. Z& w
    //当前对象的链接对象
9 A2 n* E/ s2 G0 @( Y    CATILinkableObject * piLinkableObject = NULL;2 Y, @. s/ c+ b- u; c& ~6 k
    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
; c9 N% P8 p5 F* u    if ( FAILED(rc) ), d/ ~0 g. c; F+ h' w5 I0 |/ ^
    {0 n1 n+ ?" e) }8 S6 Z
      piLinkableObject->Release();( U2 W" Q. ?! f  @
      piLinkableObject = NULL ;& l! J* L2 o+ b3 N4 \# E
      return FALSE;8 A) W: X; q$ j
    }
. K7 `* o& [& t8 k7 G1 I# [8 h6 Q7 z, c
    //得到当前对象的文档2 P" u; n2 q2 q% ]3 t7 Q
    pDocument = piLinkableObject->GetDocument();
6 P( ~* p+ l" w' z: l    piLinkableObject->Release();
9 b; U+ b5 Q# f5 P& ]# R. X& Z    piLinkableObject = NULL ;, q& u% c# y* P  @2 \
# n8 U8 N  n# V. s- ~* S
    if ( NULL == pDocument)
1 e7 z5 v0 H: i! W# g3 h$ {    {
: r4 f  S! Z( X& _- S: q      return FALSE;
2 V5 {+ A/ |& J7 }* ]0 s+ o    }8 H) @4 n+ T) k
  }# \7 J/ @7 |' Z+ g3 Q7 m
" `1 k$ x! A  `+ L) p3 r% C; Q
  //得到文档容器集9 m$ B# P$ [8 x4 D7 z
  CATIContainerOfDocument * pIContainerOfDocument = NULL;. r0 `" |) A& J' e( |; o
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);6 e1 a0 L+ R% Q! G
  if (FAILED(rc)), T3 Z, u8 D( v" s7 l
  {* ?; w. g0 p& l8 b: T
    //pIContainerOfDocument->Release();
6 {. z" ^* t" w  h7 T! ~    pIContainerOfDocument = NULL ;
- ~. s9 @* [2 X, R& ^+ `3 U4 K    return FALSE;
) M! G/ q6 _8 y  A' G  }
* Z; e- u: f* [8 Y
/ [! s  B- V. X% T: R, ~0 R- m  //获得Document
4 g6 ?* U+ s/ k0 T: |9 y1 w1 }  CATIContainer* _pContainer = NULL;       
+ R  l6 E5 `7 }9 e% O6 w  S  //获得SpecContainer
7 z. s  f; K6 c; @) U+ {" |4 G  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
4 y" ]1 _$ ^5 i$ c7 t       
' i. z. z9 K" @$ I  //GSM工厂
; v+ E' F& ^1 L5 ^1 d" A  CATIGSMFactory_var spGSMFactory = NULL_var;4 ], w% s2 y0 l0 \
  //设置工厂                ) ]; e' Y2 _0 w; P1 K% f: e/ d
  spGSMFactory = _pContainer;                                                                        * o0 x$ l2 W0 |- i
! V2 X. k: v; o- B  @2 W! G9 \
  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);
' b. v2 g1 g+ g# V: }! K
( ]" C6 L+ L  D2 h/ m  spSpecPoint1= spPoint;                                       
' P+ T% E2 d: F. F: e  q. Q
: u3 C! i! Z! L  CATIGSMProceduralView_var spSndPntObj = spSpecPoint1;" H4 U3 b* ?* E- n
$ L1 ?6 N, y( k, V) m3 e% _! R  }! `
  //*将点显示在屏幕上# c0 U% _1 i, O" t) a: e7 X: J
  spSndPntObj->InsertInProceduralView();
7 S0 T% T. R( A4 F) f7 G" x# s- H9 e& R$ i4 @* N" {# P
  spSpecPoint1->Update();/ i9 @6 H  J6 X: G' I: @

- ^+ v8 y' D1 o) R& f$ V  return TRUE;
8 l" f& i% ^3 o. d}# s2 z8 I. S9 u6 Z+ d$ E7 C3 M# r
" _6 s) Y1 n* O- i$ y) s
//-------------------------------------------------------------------------
1 M- x7 k* [# P* N) L6 ~// ActionTwo ()3 s9 _) r- _. @5 G0 t3 g' v
//-------------------------------------------------------------------------, t. b1 X. q8 @8 o3 w/ Y1 M
CATBoolean CAARCCreateLine::ActionTwo( void *data )
$ }2 a7 w0 J( X) I5 t8 M{
% D4 M$ P7 D; @0 B  A. H) d  // TODO: Define the action associated with the transition ) W- m7 K6 c+ h9 ^: B# T* c
  // ------------------------------------------------------
* u0 r" N3 i# \. P' s  CATMathPoint2D point2D = _IndicationTwoPoint->GetValue();//获得一个2D的点  D# @9 Z) |# g6 V6 z8 R: n( a

4 p, x4 d2 x7 `1 P  l  CATMathPoint Point3D;
( E( Q( u  @& I, @! p6 w  CATMathPlane Plane = _IndicationTwoPoint->GetMathPlane();
  q# ]# v( m8 {$ N& @1 z
* T  [% z& o  v9 U, J% l. m7 L: J/ C  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点6 S0 ]. u" D% p
2 M" l" C2 l  k4 u" ?7 f
  //设置Container(非根节点)
3 N% f* K$ \4 O8 c, g% g* A  //获得Editor! F$ V" s$ J; S( L# E5 _+ N% W$ p
  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();+ A# l# q: l* `' o5 ~7 A( W
" E8 M  \' V4 P. V3 T
  //得到当前对象的文档
) l% x/ b8 |% ~+ i0 i& x# u  CATDocument * pDocument = NULL ;
5 y- _/ F. [! {# v/ v! U$ y+ A8 S& n: a, A2 M; P  ~
  //取得当前活动对象
+ Q2 r5 o6 J. P1 m7 a3 X' w  CATPathElement activePath = pEditor->GetUIActiveObject();$ E7 b! f( z  o5 z8 Q$ Y

4 T& @; F4 A- o5 R# K8 L5 F5 m4 d  //取得当前活动的product
  I; E. F  T% Z% D+ O* o7 R  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());
; @) e& K7 b; b! c0 m2 Y# w0 s( ?8 H" Q( C: M* _) i2 ?. w6 H6 l7 A7 c
  //当前活动对象不存在0 _: X1 d& D9 H# g
  if (pActiveProduct == NULL)- Q- t  K! a, e0 y
  {
) z$ o6 ]0 L8 J/ v% B    pDocument = pEditor->GetDocument();
6 u9 b8 t: Q0 [+ y5 h8 a5 s9 D# k( k  }
# _1 g& e6 T% ]1 H$ y- z+ {% g& p4 i  else
* @/ H8 C: f2 R4 c" ]  {% D7 P3 j$ o9 B; R
    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
. I- b! ]* m/ m" d9 F: s    //当前对象的引用对象是否存在
6 W9 E7 v% H2 v( x+ Z+ |    if ( NULL_var == spRef )$ v; A6 E! x1 k# D
    {
) }6 m* i) r1 r7 b      return FALSE;
7 T, H3 {0 ^5 _  u5 d    }# U4 f2 R4 Q- T# ^
0 b# {7 A: @" X0 o
    //当前对象的链接对象8 V6 |- v( Y1 C: v
    CATILinkableObject * piLinkableObject = NULL;3 u( L) v* e, k
    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
7 p  g* L8 y$ W) n  [    if ( FAILED(rc) )' V$ [6 \& a) C, g
    {
" ?& d# B' T* j, j4 j      piLinkableObject->Release();
) z0 {# u: x9 m4 a! @      piLinkableObject = NULL ;; w- t; k* R6 N/ b& b- r/ o1 Q+ K
      return FALSE;
9 \1 d$ _* g. Q6 T    }
, u0 t+ w6 z( L# L/ _$ b) K
0 j2 `! Z% Y% C    //得到当前对象的文档
( K  d8 R; T/ o6 V* d, Q    pDocument = piLinkableObject->GetDocument();) ^' Z9 C0 n  D/ n+ M
    piLinkableObject->Release();  D& K# r( {" N8 l( V$ g
    piLinkableObject = NULL ;. d! \  B0 F0 W! q

# w  H: D) b% K! N    if ( NULL == pDocument)) E# _4 `7 F( e3 X6 L, C
    {* V: a* X2 k* M& x
      return FALSE;& Z3 B1 k3 A' T. U9 O! _2 S! O
    }
8 o* t' f3 [) ?" n5 {5 Y4 T  }
0 V) N  l* _' c6 K) G, o! x* {/ W% P, @1 {
  //得到文档容器集
6 X3 k2 m/ w" W) t) S  CATIContainerOfDocument * pIContainerOfDocument = NULL;2 U: f, \+ J  u) p
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);' I& D9 h3 D! H3 {2 W' X
  if (FAILED(rc))1 {# @. N: a) y0 L
  {/ m" _, a# U: q. ^5 Q
    //pIContainerOfDocument->Release();* R0 g; Z* N' N, ^) D; {
    pIContainerOfDocument = NULL ;$ c- C  l' P% b8 u+ ?+ L  c5 j
    return FALSE;
& _; i% P  m, D  }9 s3 H( E! ^" r: W/ |& B

. m# Q  _3 S* r0 O$ ~6 g0 s' W  //获得Document
# f; U" @5 {8 t7 s/ @  V  CATIContainer* _pContainer = NULL;       
( X2 s8 D  H/ c. g, W7 W  //获得SpecContainer
8 g! t  w: Z* ^# l8 K( I  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);6 f5 D/ t' ?! b" p: o5 D' p- Y
        " u$ |  N. M4 j$ X( x* M' A& y
  //GSM工厂' i. D, W. w8 A2 \
  CATIGSMFactory_var spGSMFactory = NULL_var;! }  J$ A: U& P0 v& _. z
  //设置工厂                # c1 U4 ]8 V* y
  spGSMFactory = _pContainer;                                                                        + X8 r7 [" ?/ o9 e# a) Z9 b
8 b% m" y1 a  _2 b
  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);0 \; n3 e! m0 G5 \8 M

3 O2 F" B7 p! h) w! }  CATISpecObject_var spSpecPoint2= spPoint;                                        / ^  E/ v! A1 S; ^. s; t4 L
+ @" D; u1 A1 k
  CATIGSMProceduralView_var spSndPntObj = spSpecPoint2;& q) ?  X4 _2 u, M' m

4 P' q% L! @- Z# r- H9 |# C  //*将点显示在屏幕上
+ R; T6 f) u: e  spSndPntObj->InsertInProceduralView();. }+ n) f# I7 L6 h- z

- w# z( ]3 w! I' S. S  F  spSpecPoint2->Update();
$ n2 [- t2 Y$ ]1 O) Y1 S" `! X6 E& t  I! @  N- c0 B+ r
  //生成线
! {" {. m8 P/ |, e) t1 ?. f: T. }$ G  CATIGSMLinePtPt_var spLine = spGSMFactory->CreateLine(spSpecPoint1, spSpecPoint2, NULL_var);
1 N3 y# G. T) e7 q$ v  X( s( i& N- M( v& M2 u
  CATISpecObject_var spSpecLine= spLine;                                       
9 l' n1 @4 ]: o6 N# v
/ e' I( t2 ]- }9 d3 I: D# O  CATIGSMProceduralView_var spSndPntObjLine = spSpecLine;
+ Y* s7 F; O/ l3 D) {% ]# |6 q
' I! G$ }; F: G$ H7 G  //*将线显示在屏幕上2 I" M) J6 s( F5 n: N: U# ?( H
  spSndPntObjLine->InsertInProceduralView();" ^' O5 y" f# @* w8 a" p
9 S* z1 J. E- M. N& _( {
  spSpecLine->Update();
: p% I7 k1 J; ^8 Z6 C! o% F# Y% b/ W+ {/ x. L
  return TRUE;/ }! Z( w4 B( u" [3 R5 ~, X
}
  U+ f7 @) o$ p  w" T$ l
& o. q6 M- Z4 Y. f
, a# z' t' e/ L* E
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了