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

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

[复制链接]

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

2470

主题

1275

回帖

8万

积分

管理员

PLM之家站长

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

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

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

x
  h- _9 B, O. W0 ^% q* \" Z
Catia二次开发源码分享: 通过鼠标点击创建直线- Q1 T3 \- c7 _  d* F
0 I% ^( }  H# C& s% C7 B2 v

8 ]7 i# I. \# ?* s" a. A3 l) l
1 t& v' G! g7 q: h#include "CAARCCreateLine.h"' d2 H/ t: K3 s
#include "CATIndicationAgent.h"
( o: U2 q: p# t& c  t; N7 V5 Y#include "CATMathPlane.h") L: _+ E* X  k% M/ t  e

( ?" _) O- e* d$ L6 }#include "CATCreateExternalObject.h"
8 J) O( T+ J2 n# q+ v. U8 P- L+ A9 Y: ~: B+ k- P; N
#include "CATMathPoint2D.h"
* P( V. e6 ]' l. x) B#include "CATMathPoint.h"
4 Y9 T* S1 G7 q2 r, I& h#include "CATMathPlane.h"
$ u( a& l1 t1 O& @- O0 K; K9 u+ H$ |7 {
#include "CATIGSMPoint.h"
/ ~/ n9 Z% N2 c0 x#include "CATIGSMLinePtPt.h"* ]6 L. J& P2 M! P$ Z" z

& z2 I' l% `4 @6 g#include "CATFrmEditor.h": _1 S$ R( M+ v
#include "CATPathElement.h"
# k) H. B0 b/ Q: l+ [, k3 q3 c/ ~8 `* e5 S+ P
#include "CATIProduct.h", c* M2 h1 Y  O' y) Q
#include "CATILinkableObject.h"
5 F, R1 ?3 b% s1 R6 W# [#include "CATDocument.h"
' ]5 a6 {( a- J$ V. F! o1 `  R4 T" r' Z* b4 Q
#include "CATIContainerOfDocument.h"
' i) V) `- D$ F& G! P+ K8 o
. q/ [1 L$ m0 S1 K( y0 Z1 K! H9 d#include "CATIGSMProceduralView.h"
$ B8 J" Y: H# {0 d3 z2 Q) `; K3 }; @+ k4 o* h
#include "CATIContainer.h"% W- u! g6 J" Z' {2 \% {6 H1 R
#include "CATIGSMFactory.h"
0 p& C3 ?6 g7 ^5 ]2 {; v4 R! E# M! s& M6 x9 P$ V+ m
#include "CATISpecObject.h"! X* \3 r/ @" C# u! X
CATCreateClass( CAARCCreateLine);& {; k$ I6 r* J# y+ a

% r# y/ o! Z" a% R, T
2 j1 ?% d* @2 J3 X1 z& M2 C//-------------------------------------------------------------------------
6 {: M$ V  M' E// Constructor% F! r( E3 S0 e$ g
//-------------------------------------------------------------------------" X# b6 ]; C- g0 ~- d9 D
CAARCCreateLine::CAARCCreateLine() :7 R/ k3 S9 I2 V6 B( @; ^! \
  CATStateCommand ("CAARCCreateLine", CATDlgEngOneShot, CATCommandModeExclusive)
7 V  C  K- n6 n6 r//  Valid states are CATDlgEngOneShot and CATDlgEngRepeat7 |2 F- J# g6 G$ N. A+ [$ v- @' J3 ^
  ,_IndicationOnePoint(NULL),_IndicationTwoPoint(NULL)7 U7 a) }, H4 ]& M4 l0 O
{
. t) G" T. S7 n; g. B/ y}) X  K( G9 t1 b- D
% M9 g. \8 P9 a" C- S# ]9 [
//-------------------------------------------------------------------------! U1 y# F' g( M1 o* V9 ^0 l
// Destructor+ x+ X% f  |& }, D
//-------------------------------------------------------------------------
1 q! p1 G7 K) {6 j2 ~/ ZCAARCCreateLine::~CAARCCreateLine()% |: w5 M& r: A" L5 B1 i
{. j+ |4 P' U/ G: J
   if (_IndicationOnePoint != NULL) 7 B$ ?/ S5 D9 ^4 `* @: ^. s
      _IndicationOnePoint->RequestDelayedDestruction();
% G, w0 F* s; F# d, I" X   if (_IndicationTwoPoint != NULL) * b. f/ V! T( O) ?4 P7 O& g
     _IndicationTwoPoint->RequestDelayedDestruction();" Z8 z7 ?+ w1 b  Y
}% A4 i# R4 f& U/ E
7 m4 y4 Q: s  X& [! `
3 T3 ~- s3 V+ D7 _3 f9 P& ^4 ]
//-------------------------------------------------------------------------
+ b- R. s4 u5 |! E+ m+ X// BuildGraph()
0 {% [; m! [2 h4 k//-------------------------------------------------------------------------
, j0 s% A( [. k. i- \4 Lvoid CAARCCreateLine::BuildGraph()  {2 a6 }. M2 r2 C  Z, f
{
* b* @; Q% p( l
' P6 j9 C0 Z3 {, Z0 P% F( c4 i0 ^; N
7 k9 x) R* f' P+ i9 S5 Z7 D; s# q  // TODO: Define the StateChart * q7 {  j" R+ c3 W% Z. s- d
  // ---------------------------
. e# ]7 S6 C$ {) Q: q  _IndicationOnePoint = new CATIndicationAgent ("IndicationOnePoint");
' Y; \8 t0 _2 P3 ^4 G  AddCSOClient(_IndicationOnePoint);3 Y4 R1 |5 D# P

8 D' M. q' s- i; ?7 O  _IndicationTwoPoint = new CATIndicationAgent ("IndicationTwoPoint");0 P& [( f: b/ U4 B) N

, a6 G( [8 V& K  CATMathPlane PlaneXY;0 W; k+ r* s: [- }. l  m
  _IndicationOnePoint -> SetMathPlane (PlaneXY);( E. o' J6 T- R" E
  _IndicationTwoPoint -> SetMathPlane (PlaneXY);4 q- I, H9 F7 g. W

4 x. p$ ]6 }9 W1 }; |  y& \  CATDialogState * initialStateOne = GetInitialState("选择第一个点位置");
1 w' F) {; t2 l/ q( j4 e  initialStateOne -> AddDialogAgent (_IndicationOnePoint);' F6 ^: l8 w3 o9 m& N$ ^

: I8 n6 G) s2 _, g7 ?  CATDialogState * initialStateTwo = AddDialogState("选择第二个点位置");1 k4 _+ O0 `& I+ {7 w0 c
  initialStateTwo -> AddDialogAgent (_IndicationTwoPoint);
. b# j# I( R- {1 `7 d+ o% N; C
' v5 U0 ^0 C" a  AddTransition( initialStateOne,
- j6 Z0 U1 H  W* n$ `                 initialStateTwo,
4 u: f- i, e) `0 s& B* G1 N& H, {                 IsOutputSetCondition (_IndicationOnePoint),
. d5 k" p. B0 V2 }/ R5 V                 Action ((ActionMethod) &CAARCCreateLine::ActionOne));' ?: f7 _' b  A( v$ F! d
8 D/ ^8 I, x5 G5 h
  AddTransition( initialStateTwo, / {. [3 \% [# `  f' W- a) s
                NULL,
$ o: t2 B. ]# F0 L+ Q; t. b                IsOutputSetCondition (_IndicationTwoPoint),% u2 a  i1 X* I3 F; W
                Action ((ActionMethod) &CAARCCreateLine::ActionTwo));
* |1 C3 h* a5 Q  l( I}
* K9 {& Z5 M+ X, p( W& E) K1 N, D% e  s( p4 J# T5 l, F6 v

+ v% \0 I  d  L% ^' u: q//-------------------------------------------------------------------------- v9 U9 ?3 T5 v# a8 m  z
// ActionOne ()' g6 r  s* e( F
//-------------------------------------------------------------------------, M/ y* V& u" w' R: ^* l& J) [
CATBoolean CAARCCreateLine::ActionOne( void *data )
* B6 w" r5 e6 t{) i. J; m" F9 M0 K
  // TODO: Define the action associated with the transition - e1 X9 C) v0 |& @0 l4 h3 L, W
  // ------------------------------------------------------3 I9 A7 g$ B3 U+ e! f
  CATMathPoint2D point2D = _IndicationOnePoint->GetValue();//获得一个2D的点
. o  |- ~% `$ ?) P/ J9 x& p' c7 |1 I* ~
  CATMathPoint Point3D;; O' |1 F9 Q3 w( h3 n% O
  CATMathPlane Plane = _IndicationOnePoint->GetMathPlane();( S/ g& X$ I5 T+ l  N' o
/ x* a( r+ W9 `
  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点' k3 c3 X6 @( d# m0 j& E: W

8 @' v5 F* e" r# i& X9 r  //设置Container(非根节点)
/ f. P. u6 |+ q, g* ~$ U  //获得Editor
6 V( U& W2 N* ]: U- }/ B  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();7 k; }. V, E: O, n

, }4 D4 a, y* l+ [, q3 ?2 ]  //得到当前对象的文档. b! ]; ^8 w/ a7 V/ K
  CATDocument * pDocument = NULL ;: d  G( ~, G  g% M) y4 X8 ?
  i# s8 g0 \0 H' s! E
  //取得当前活动对象
3 n; B  p5 B1 U4 |: J0 ^- @' b  CATPathElement activePath = pEditor->GetUIActiveObject();
/ S, J6 Y% G/ w3 U& i3 |0 ^8 u
: Z  v7 s: _$ [  J; t4 Q/ a, d; }9 Z  //取得当前活动的product
8 I: s3 A" i8 V( K4 `  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());# q) ~! ], M" h8 Q
& x7 f9 s& \: [. z; d
  //当前活动对象不存在
' S. g* e3 T' t6 E/ w  if (pActiveProduct == NULL)
# E" x- e: x" B0 V& A4 ]  {9 ?) L1 f2 A8 f/ z7 m
    pDocument = pEditor->GetDocument();2 a: N( o8 o" R+ V2 o  R* V
  }
& ~) m! Q8 h- c! _! `0 {- e  else" @+ P8 G! Z: m/ P' y
  {
  I2 [6 U% Y; ~8 M  z; V    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
2 D" {/ R( s$ X1 Z    //当前对象的引用对象是否存在
: q1 E( ?  a  v- g* P2 n    if ( NULL_var == spRef )
8 D# _! o& w; s* ?5 C    {/ o! x0 R9 z' M8 H2 u
      return FALSE;
  _$ ]! P* j4 s0 x1 b    }
+ {$ G( i! `( Q, r
. g: ~" [( K* L; D' w& P    //当前对象的链接对象
; Y7 E2 G  u' \& p' ?    CATILinkableObject * piLinkableObject = NULL;
" \3 o# R0 N+ u1 @: ?( D- K# u    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
, ]' {9 K' W/ F  v% L5 X0 D    if ( FAILED(rc) )& A& J7 ^7 \! \& ^" P& R  T$ O$ [: Y
    {
! l/ V6 E' z0 R6 E& c      piLinkableObject->Release();0 h1 u/ j, \; O/ l
      piLinkableObject = NULL ;
" ~) o5 Q8 l2 E      return FALSE;
# @5 e; o# \9 Y1 s  Z    }
! }/ R8 X4 f  X
- E; j/ Z& `, ~' E3 z    //得到当前对象的文档. G3 {0 p% ~7 x; C2 P% l% F
    pDocument = piLinkableObject->GetDocument();
0 a3 A% c# N9 e7 g3 [" X0 {) y6 J4 [& `    piLinkableObject->Release();* o$ V* o6 ?4 ?
    piLinkableObject = NULL ;
# d! J6 V, T# ~/ Z; n% K
9 X1 n1 \+ \' z9 x" O8 A2 D! U: B    if ( NULL == pDocument)8 b8 y7 [; o4 N: L/ _
    {
3 @7 X5 N( _0 }; |5 o      return FALSE;5 m$ ^' U2 [* E" h7 }& ~# p
    }3 ~( G* N9 A6 e- \# R; `# N, u
  }
0 I6 o* y" d" R% j4 s
/ Q# }# d* Y7 m1 J% _, N  //得到文档容器集, b, u# ^% s0 L; A2 Q' N8 w
  CATIContainerOfDocument * pIContainerOfDocument = NULL;' x" E2 S7 B; \; @- D3 N
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);
1 M* i8 c& h# m$ r  M  q  if (FAILED(rc))
5 M0 K& V+ D8 X3 {! e) \$ {  {$ [, `/ w+ d6 L5 a8 s" w& f1 _3 P
    //pIContainerOfDocument->Release();
3 s* \/ E7 u+ Q    pIContainerOfDocument = NULL ;
0 F4 v; ]% M4 H8 l" p    return FALSE;
0 I% I; ~. b! D8 \, z  }0 k+ N  z0 ^, m7 Q% \+ a

9 F7 M( k& Q6 x8 a; r4 [+ c  //获得Document
. C' t# D* j+ d' T- C  CATIContainer* _pContainer = NULL;       
! [$ P1 k4 ^1 Z; J/ B  //获得SpecContainer
/ }' _# O. A/ G6 h  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);+ I& r& A8 I: Y. ~* W
       
5 Q  X/ E$ C  H& o  //GSM工厂
+ v0 N9 u. Y& `$ h& _' l  CATIGSMFactory_var spGSMFactory = NULL_var;
% g2 x$ ?+ D' C* n1 a  //设置工厂                ! G9 z9 x6 S& r# C2 A1 [
  spGSMFactory = _pContainer;                                                                       
. E( y$ H; F3 }2 y3 B. z* Y$ \
& a" O" h' `" N& q' Y0 }  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);
9 R5 j8 a5 T' Y! r
6 {; y" D9 u0 s: ~/ c7 @  spSpecPoint1= spPoint;                                       
. E& u& X* d; u* ?  ~2 n$ f4 I+ Z% u8 S9 S. F
  CATIGSMProceduralView_var spSndPntObj = spSpecPoint1;) d' [. {# v5 E6 q
+ [$ t; i+ O# t$ _  T. d, v, R
  //*将点显示在屏幕上
/ H% Z, W7 W+ r; @- G  spSndPntObj->InsertInProceduralView();7 S9 h/ r- L; L7 p; _5 W

3 g7 e' i( [7 t7 X# J  spSpecPoint1->Update();0 g: X: ^+ O! \; I# D; j0 N" y" ~, Q

9 F2 t3 a# x) @  return TRUE;* C4 a; W# y; W
}1 x; h. |  X7 u* K
/ G+ x. Q$ K! ?* R, n
//-------------------------------------------------------------------------
$ t' U; d5 ^6 X) O( h& D// ActionTwo ()4 ^/ _3 U8 r+ h8 C  B0 S
//-------------------------------------------------------------------------' P$ W6 m) b. s& [- q( R7 _
CATBoolean CAARCCreateLine::ActionTwo( void *data )
* {/ h- ~, E% p- ]2 ?, z{
/ w1 {$ M% O  n- L9 T! J  // TODO: Define the action associated with the transition
5 f$ {! P# }6 W+ e7 Z  // ------------------------------------------------------
1 v) P) G$ l+ G+ m  CATMathPoint2D point2D = _IndicationTwoPoint->GetValue();//获得一个2D的点
9 P- a2 Y# S2 }+ t4 `) k! Y
! n/ `+ t1 Z; K" |6 ?, r* Q  CATMathPoint Point3D;' d: Y  u% Y1 s( _7 G
  CATMathPlane Plane = _IndicationTwoPoint->GetMathPlane();0 ^! q" K8 ?* H/ w7 J
4 v0 X9 \& }0 f, W; q
  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点' b2 h3 ~' ]% ^, a; R

2 z4 ~% ^4 ?+ h; p' h  //设置Container(非根节点)0 Y  ~+ ~' |; v# P" L0 A  X
  //获得Editor
4 P: x! f- c+ y, D( a: b& h  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
1 s9 x  k( j- c7 A4 h  F6 k0 n; H, i3 P# C4 o; o! b/ e
  //得到当前对象的文档7 `/ I2 p. Y! s: W
  CATDocument * pDocument = NULL ;
2 ~- s, r; D3 ^- r- T
5 j% Y3 E% z0 B/ i% _3 A1 s( _  //取得当前活动对象1 d; y' ?" c8 c5 ?% d
  CATPathElement activePath = pEditor->GetUIActiveObject();
" V4 j! w( E  ^" H; o' H9 s/ i4 ?: {4 r; _8 D% L8 k( `$ p* ~
  //取得当前活动的product& H  F+ A1 c4 S; a9 b; ^
  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());, K! \9 Y  B6 y) \; n
/ g/ S4 Q2 n. g
  //当前活动对象不存在$ V# E0 a5 `6 l: I3 |* h
  if (pActiveProduct == NULL)
6 g. @' ]7 w+ N- k$ a+ |& C; U; P  {
3 S" _9 r; `* X7 a1 M% ?; y) m    pDocument = pEditor->GetDocument();
7 D) S. y8 F' T4 \7 W8 V  }' c( c% d! A$ E" O( @- g
  else
0 g/ n% M8 A/ b9 a* w  a* c  {
+ G% n8 f* }6 Z7 J" ~) g6 f    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();8 g- F; a$ n2 L( N: m. y
    //当前对象的引用对象是否存在: i3 J, c; b. \9 |
    if ( NULL_var == spRef )  L. f4 r; r( h. e4 g4 _" O. `+ L
    {
5 l! r% W% G9 r# w' S! R      return FALSE;/ l# `! q% l6 F  q: B# O" \
    }
, P4 D1 D0 I- O: B' Q6 y& Y7 V7 y& b7 S6 j4 L& R3 i
    //当前对象的链接对象
% U. A' |" A. S, R0 g5 ?    CATILinkableObject * piLinkableObject = NULL;
6 U8 T+ K' q0 n3 u) t% e    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
: s! E# U/ J' Z& ]+ |0 S5 {* Q" Q    if ( FAILED(rc) )
# D/ O. a0 C8 o& n1 m4 k9 o    {
' j/ c5 x7 n( {, ]. h9 U, y1 h      piLinkableObject->Release();
0 _+ w9 u9 d3 y. x0 d      piLinkableObject = NULL ;
1 C0 l0 }/ N4 ?) d+ ~) R: Z      return FALSE;
  f! T# ?0 R# s" g3 u! W/ F    }
0 y% Z. e) R# y4 Y3 ?2 t3 e
# `  K' K+ I+ ~4 C1 {( q8 [    //得到当前对象的文档: I0 P$ \( o4 d3 Q1 v8 z4 P
    pDocument = piLinkableObject->GetDocument();
; v( Z; ^$ l3 G, m    piLinkableObject->Release();5 r1 ?, `, F8 r% j
    piLinkableObject = NULL ;5 K) x: k. I+ t2 d$ m2 u3 L. ?
* H: x4 M% {6 Z- U- C. [% h
    if ( NULL == pDocument)$ o! d- N+ C! N" u) ?' O" ~
    {" f/ \" g! S5 R5 x
      return FALSE;
4 l( ^/ Y/ p$ ^3 f    }' G' R' w/ u- ?) C3 B
  }
6 s/ f! L9 ]0 z
& s! S% J- E; `) z3 o  //得到文档容器集9 `2 X7 I( v$ \  Q
  CATIContainerOfDocument * pIContainerOfDocument = NULL;4 [" ~0 u5 R! n* V. S
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);* o  R3 \& Q0 G1 ~% J- {4 ~. q
  if (FAILED(rc))* |4 c; }- t4 o9 W9 A  m% m% ?
  {7 |9 K3 R9 J5 t' G9 [
    //pIContainerOfDocument->Release();
- `5 ]$ n; \2 y2 W    pIContainerOfDocument = NULL ;
6 _% }! e9 S% ^( h    return FALSE;
. p  q7 [) T, I7 M0 K  }9 P9 a6 X" T, Z6 P8 ]9 J
9 {+ S2 J, T! F( C9 |5 A
  //获得Document; O: I% d8 |( r" R- N
  CATIContainer* _pContainer = NULL;        ) r+ H: T0 K2 d. q  R" _8 V$ C
  //获得SpecContainer
8 X9 d: F- Q  Y, ?  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);3 W* @8 b. J% N1 C/ U5 L
        6 r1 F; X% `. I' o" o
  //GSM工厂; `" I- M/ r/ w
  CATIGSMFactory_var spGSMFactory = NULL_var;% q* A( l' g0 \3 j6 F4 i2 e9 Y
  //设置工厂               
( |, ~* @+ w9 B9 \; y# N1 w  spGSMFactory = _pContainer;                                                                       
/ Z6 M* z4 Z- i$ m+ a
& v, j0 V% j- P' b5 @  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);
; @2 u) M* v+ k& g2 p% d. d# E" c8 a' A  H4 _. a
  CATISpecObject_var spSpecPoint2= spPoint;                                       
+ d) L' j$ h4 z# A2 t. x2 s$ N( z5 A2 d7 [0 J
  CATIGSMProceduralView_var spSndPntObj = spSpecPoint2;
9 B. F  @6 q) @! J' D) P: l  p, ^7 o# ^' j( l
  //*将点显示在屏幕上
: ^, N, E; t8 \8 _2 Q9 i; ~  spSndPntObj->InsertInProceduralView();; U$ p. ?- N) k4 R* ]* N

+ q! m8 g! G8 J" L  v; m( k$ e  spSpecPoint2->Update();! l6 t' j! e* P1 a! P: J
) I7 C% j) E6 I4 r# t
  //生成线4 ~. b1 H* n/ e' W' @
  CATIGSMLinePtPt_var spLine = spGSMFactory->CreateLine(spSpecPoint1, spSpecPoint2, NULL_var);
% _! L+ O5 ]  C0 ]4 `4 ^( v  T6 q: b
  CATISpecObject_var spSpecLine= spLine;                                        ) O: z, _( N9 c

" h5 ?# A8 g$ ]1 c2 m4 U: C! n3 `/ y( n  CATIGSMProceduralView_var spSndPntObjLine = spSpecLine;) D7 a0 E% n; N: C9 }& ^! @5 o

' v7 \. J, b9 R' W8 V, @, k) @% @# ?  //*将线显示在屏幕上% d. t) n, ?: q" \! X
  spSndPntObjLine->InsertInProceduralView();
* B6 P7 O4 M- z1 Z+ a1 f: F
+ \1 F+ i6 S4 a8 v! D, |  spSpecLine->Update();9 \7 [! H& I- j  B( X

. t  f( s) _* ~  return TRUE;/ G+ y3 \2 _+ Z  O( z- q
}" k" e" |; v8 ]
' B3 U% H4 k% T) o0 k: j

+ ?2 g7 r1 n2 U- C# i' J1 |  z$ c
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了