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

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

[复制链接]

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

2470

主题

1275

回帖

8万

积分

管理员

PLM之家站长

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

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

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

x

+ L3 t! C, D" }. Q: xCatia二次开发源码分享: 通过鼠标点击创建直线
& B4 N% L1 Z$ J) n3 N: Y1 t1 R" j) [/ O, Y  W3 f7 U+ h8 y& I$ Z/ K
. t9 D: a2 B. Q  R5 ?, t

4 E$ @) G8 {8 M8 B1 l#include "CAARCCreateLine.h"# e6 u  H$ S* S% ^/ L2 v4 m5 ]3 G
#include "CATIndicationAgent.h"
3 S# {0 S: [- R#include "CATMathPlane.h"7 Y+ C% e* j- U$ W$ M

, I) R5 I# f0 R- p7 R#include "CATCreateExternalObject.h", n% u9 W6 g$ x  s

% e* O4 Y6 X7 @! J$ N0 j: F2 o#include "CATMathPoint2D.h"
7 }$ u1 U. k* H9 @#include "CATMathPoint.h"
) H, G7 |' w' |( Z/ ~# Q1 l#include "CATMathPlane.h"
3 }1 o( K- H. M% b& Z* ]
& N7 @% h' h# v) n#include "CATIGSMPoint.h"
% c& a4 U+ V# {% g; v) Q1 q#include "CATIGSMLinePtPt.h"
# h, K* s% s% w: Y- L* N
8 d# K, y2 D% M: y# r  {#include "CATFrmEditor.h"
3 [2 {! t% k9 Y8 X4 ?1 c  G#include "CATPathElement.h"3 @, H4 s! q8 P3 d% l
% O* {1 `* T! {/ F& X6 P- t
#include "CATIProduct.h"/ H2 r1 V, b% P2 E/ H+ T! R8 h" p1 P0 \. O
#include "CATILinkableObject.h"* \$ V% z/ Q4 Q  Z& u+ i. {
#include "CATDocument.h"; w; F, z; [$ U, D: [" ^

) n$ l* b  @. D3 |  ~#include "CATIContainerOfDocument.h"- G6 Y2 W7 f& m  m2 r

- D) T8 D1 [4 h#include "CATIGSMProceduralView.h"* S" \9 A; @/ O

6 o( a6 z# K. l#include "CATIContainer.h"; C2 Y4 X7 G# [" i" q2 m5 N
#include "CATIGSMFactory.h"7 J" S7 d( r3 g3 C6 Y
& E0 ]& [8 o* q
#include "CATISpecObject.h"
. r% o: C8 }# x3 qCATCreateClass( CAARCCreateLine);
% t5 A. W) {' Q# t& E0 h- F3 X5 d7 o9 H7 D( A* w, D$ g7 s

, m. u, ^2 |' G  }6 L//-------------------------------------------------------------------------
4 M) I. r& ?" r, T) b6 q) }// Constructor' L- ~1 {' J* P7 a
//-------------------------------------------------------------------------1 C  j/ [& N* @6 g: ^
CAARCCreateLine::CAARCCreateLine() :
4 J$ g- }9 f/ Q5 t  CATStateCommand ("CAARCCreateLine", CATDlgEngOneShot, CATCommandModeExclusive) - y- @2 L5 x- E: T. r5 c& ]
//  Valid states are CATDlgEngOneShot and CATDlgEngRepeat  z7 q' w9 t1 R) ]) i' v' V
  ,_IndicationOnePoint(NULL),_IndicationTwoPoint(NULL)4 Q# J& C2 N% {; x; b1 K: }6 P
{
4 T5 z7 H2 O2 e' U% q. U}
4 \8 i+ G  X( B7 j0 t7 u+ m8 j/ R: @$ _' }7 d
//-------------------------------------------------------------------------
# Q( D/ n* p* w2 p7 ?8 ~// Destructor- `9 L2 b2 N- @. e
//-------------------------------------------------------------------------
7 N+ D2 @; U) P4 i% v9 GCAARCCreateLine::~CAARCCreateLine()& @, j9 M* s& I. M8 g% Q: |: \! @
{7 z  u# Z0 y7 @# v% x& y. J
   if (_IndicationOnePoint != NULL) % \$ ~+ X' K4 r( t* r- S# V" }
      _IndicationOnePoint->RequestDelayedDestruction();
+ g& N) |( Z( T& @* t* s   if (_IndicationTwoPoint != NULL) / C2 z* a$ Z4 F8 m/ h% j8 Y
     _IndicationTwoPoint->RequestDelayedDestruction();
9 \5 X" j! A. J}
; S3 o/ z+ l9 D5 U4 ?
3 \- \: ^" b4 l" P: C9 f2 B2 m. v
! V. T6 }4 M1 p( b4 n//-------------------------------------------------------------------------2 S0 L2 H2 P+ z" J
// BuildGraph()
" _. m: z3 D* d' T9 U//-------------------------------------------------------------------------8 g* Z$ C: O( Y4 |6 _  l2 M! L$ C
void CAARCCreateLine::BuildGraph(), E) x1 @8 ~: ?' z
{8 r; p7 U  x) k4 h9 S2 q3 R( R  Q% P
* d+ x" E" b3 p# G9 _! ^- L5 |2 s7 E
# j' ^3 A; `( y* d3 n+ k" U
  // TODO: Define the StateChart 9 q5 v6 m; g. w" b. O6 D
  // ---------------------------- l' q: Y0 Z7 Z5 g2 G
  _IndicationOnePoint = new CATIndicationAgent ("IndicationOnePoint");5 ?% |; W5 |6 S) |$ q6 g
  AddCSOClient(_IndicationOnePoint);( c! Y* ]7 \+ R3 I# v7 t7 T& j

+ _% b0 g: Z! p* Q' e. ^  _IndicationTwoPoint = new CATIndicationAgent ("IndicationTwoPoint");
/ H5 `' Q3 J# o. a* e  \8 F7 P3 v* B( ]
  CATMathPlane PlaneXY;+ R  b" ], t9 z# o2 B6 }# M
  _IndicationOnePoint -> SetMathPlane (PlaneXY);5 d2 a  ~9 t! c' R
  _IndicationTwoPoint -> SetMathPlane (PlaneXY);
4 U, E+ l) D* ?) V  W; D
( D4 J  Y3 \' [  CATDialogState * initialStateOne = GetInitialState("选择第一个点位置");8 v: J6 w. Z) [' Z
  initialStateOne -> AddDialogAgent (_IndicationOnePoint);6 i' j. R( H6 b4 f

9 U& _* Q* l+ ]. F9 x5 \  CATDialogState * initialStateTwo = AddDialogState("选择第二个点位置");
) d  f* q" y( T% `  initialStateTwo -> AddDialogAgent (_IndicationTwoPoint);5 N+ r' V/ M- S0 M2 L- p* ]

1 c% t; @0 b" ^  V  AddTransition( initialStateOne, ( G3 j& Y# B* \% ]; x
                 initialStateTwo,
  j& w, S( A5 z                 IsOutputSetCondition (_IndicationOnePoint),
) Q3 @( s+ a( }- i0 h# _- z                 Action ((ActionMethod) &CAARCCreateLine::ActionOne));
: d5 D$ [# X+ `4 l* d$ e% [! Y6 m, ~! ~% ~+ O
  AddTransition( initialStateTwo,
( _. E# }5 z% P  ?5 F0 @5 x                NULL, ; F, G0 g9 N8 D+ _$ }/ \. a
                IsOutputSetCondition (_IndicationTwoPoint),
. D8 C5 l( m, i1 {                Action ((ActionMethod) &CAARCCreateLine::ActionTwo));+ l: ?4 M) ~% d) R- K4 P
}# _2 a! G* s. }' Y
! s" \+ v  Y$ {4 s0 ~$ H

" A3 K9 [. E# D+ Q. r4 J3 C//-------------------------------------------------------------------------
3 `5 P* r$ I& \// ActionOne ()
1 j4 a  q3 n, N/ v# j# j//-------------------------------------------------------------------------5 ~* Y% j$ w9 U$ S) D
CATBoolean CAARCCreateLine::ActionOne( void *data )# T* ]3 r, K5 h) J0 _4 s
{; S- v7 k4 b/ \) i5 J3 u
  // TODO: Define the action associated with the transition 3 M3 w/ Y* H( p5 v9 }6 K9 `7 [6 [
  // ------------------------------------------------------' A" y8 }8 E% |2 _
  CATMathPoint2D point2D = _IndicationOnePoint->GetValue();//获得一个2D的点
* j$ [2 @3 U7 W8 O: C3 m+ e+ K/ p. n- T+ h& F. e7 [' X
  CATMathPoint Point3D;
6 k1 I" K: w, a4 Y9 j- c: T  CATMathPlane Plane = _IndicationOnePoint->GetMathPlane();
# ~' S* o9 E5 l5 G( \  K( ^) R( K( {0 X
  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点1 s! r4 b: |' X8 E2 d3 ?. E

. r( c9 C5 ~$ o9 g5 J2 Q. b  //设置Container(非根节点). H3 B3 x4 n# ]& f  S* G
  //获得Editor
7 o" r2 M( c; G/ ]' O# U  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();0 g/ t9 J' @1 p+ o
* \2 g  F  @# w9 S; Q9 Y5 ]
  //得到当前对象的文档5 t4 o( ~8 i: ?1 M! ?& F
  CATDocument * pDocument = NULL ;/ S! H% m) M' d1 }0 ?9 Q

5 R6 U: y% l5 [! O2 ?* O  //取得当前活动对象/ Q9 K# Y! y) A
  CATPathElement activePath = pEditor->GetUIActiveObject();$ D- \; x( q4 @2 t, }& ~
2 Q7 X+ @$ H: J" k7 a" Z
  //取得当前活动的product
1 U: u$ N0 r6 v3 ^6 T; s  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());. ~7 b$ n7 Z* P# {, [  L$ h

. x  W- w- q( @0 i# [2 @! S( e  //当前活动对象不存在  r7 m0 M, x% I; ~
  if (pActiveProduct == NULL)
4 ?: H9 J( ?' O9 _- l5 T! C5 j8 b  {$ @, A: M" V8 j3 y5 Z+ x5 x; W
    pDocument = pEditor->GetDocument();0 x  v+ ^+ u: z5 A
  }
* X/ o3 t- W) T8 l" x% C  else+ k4 ?; b2 a( r8 X# D$ v8 \
  {
& z$ T; [" x; G6 o1 Q    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
) ~" P# F( \" G    //当前对象的引用对象是否存在
- P5 V2 l" Z' P, \    if ( NULL_var == spRef )
6 ^( D  w7 q) F* E    {( {- Z+ p* r9 }$ D& F
      return FALSE;# y5 v0 g& b' d2 j7 y8 X! ^: R
    }8 k; l/ L( x  Y

& B1 q/ k, F8 g. e: m    //当前对象的链接对象- T+ a- J" Z9 x6 U- o& G
    CATILinkableObject * piLinkableObject = NULL;9 X5 P& E! ]) X5 n0 }# Y0 U
    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
9 W" A* ~6 |8 k- t, y0 q! w    if ( FAILED(rc) ). Q; V6 N! K6 [7 [/ L8 R
    {
4 @& |# \! [' j8 t' z4 Q. B      piLinkableObject->Release();
6 M) M3 ~: [( O5 E      piLinkableObject = NULL ;3 `9 M1 Z: X" c
      return FALSE;
+ H) l  p! q: j3 f    }
& D% y/ t, u" @& T+ I" W6 v4 C' H4 i; w5 k3 {
    //得到当前对象的文档8 l* @& G2 Z+ ?& m
    pDocument = piLinkableObject->GetDocument();9 ?! p8 l/ f' Q- _3 _
    piLinkableObject->Release();+ T+ u9 ]9 m( J; T  q
    piLinkableObject = NULL ;
3 E' H1 m8 `2 F4 h4 P5 Y
8 t! L) h: A( F* B! Z    if ( NULL == pDocument)( g- `3 w% r) Y' m/ b" _8 T$ b
    {
) C  C" W$ q& u$ N2 r- a4 K. x      return FALSE;8 u8 f0 ^8 _: _, B6 o# n* i
    }! u1 f' K6 J, s( n: b" P
  }# v' w! R$ K8 n( g- e; H5 i

1 U! R, ~2 U2 E  //得到文档容器集
7 x" G; z8 W4 V! m  CATIContainerOfDocument * pIContainerOfDocument = NULL;% {$ H9 y4 w7 V3 f; P: W' S0 D
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);
8 @4 ~5 M( }1 j( v+ k% ^  if (FAILED(rc))% [: t; j/ q6 B; v
  {" g# [$ z8 v4 O' r. ~  S0 V: O- H
    //pIContainerOfDocument->Release();) `/ p7 ^) |' R. y
    pIContainerOfDocument = NULL ;& d+ V; @4 j& t+ D6 }. L
    return FALSE;
' M3 K2 o& t8 Z: O  }
/ p7 u! w3 u1 a6 G' u" b
% H  K' j- q* N. n  //获得Document
. f. W% i* H( ~4 s2 i, ^) b  CATIContainer* _pContainer = NULL;        3 n0 w! |7 s% |& i1 |
  //获得SpecContainer
9 F  v8 l. ?. r0 i2 P  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);! f" Q6 N$ c; z) {0 }
       
1 o% g/ b+ J( w' @1 T9 |( y' E  //GSM工厂/ ?8 Z$ T, ^  Q
  CATIGSMFactory_var spGSMFactory = NULL_var;+ X5 u7 v4 r9 [- j9 K, }+ y2 I7 s
  //设置工厂                ' m1 t; g2 O% t0 A, i. P# E' ~
  spGSMFactory = _pContainer;                                                                       
% y) F2 R8 W5 ?1 Y
9 j! k! m8 l  {' x' a  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);3 |; H6 Y, Z% T$ ^0 t
# o8 X3 f" j- p# y9 {
  spSpecPoint1= spPoint;                                        2 u2 B0 @5 d, B# c7 w( x
7 w% t5 V$ ~  D1 M1 v
  CATIGSMProceduralView_var spSndPntObj = spSpecPoint1;1 E5 ^7 C5 }+ b! r; V/ a
6 P7 s- o% O9 h0 B
  //*将点显示在屏幕上
0 b% ^$ n) m) v3 }; i0 u. V  spSndPntObj->InsertInProceduralView();
0 q9 m0 n$ Q$ l6 m* h, N
! ^8 Y. q5 A3 t, r  spSpecPoint1->Update();, D# o) z2 K$ y9 b5 f
2 F. o9 C$ R* f
  return TRUE;
, ]# Q) F3 ]: X$ I% g* I$ G% i}
( l2 v; n: V* V* a- G( O
4 ^) y" x) G8 J3 R  G//-------------------------------------------------------------------------3 U5 T% d, D3 Q' t; D) P9 i6 n/ @
// ActionTwo (); s! n( Z! [1 v( M8 r1 @
//-------------------------------------------------------------------------8 k! \' C" r4 O  T
CATBoolean CAARCCreateLine::ActionTwo( void *data )
" @; ]; J. F  r* s( M{4 W+ L' y9 i' j7 D
  // TODO: Define the action associated with the transition " y' f2 E. f2 ~# j$ H% F+ @- a
  // ------------------------------------------------------' X( O7 y) ^5 X
  CATMathPoint2D point2D = _IndicationTwoPoint->GetValue();//获得一个2D的点8 \9 n/ r2 y, H% Z

  Z$ ~% |" ^9 r1 s8 B' C) U  i: V  CATMathPoint Point3D;0 _3 W+ A% ?- y% G# p
  CATMathPlane Plane = _IndicationTwoPoint->GetMathPlane();
9 c7 _* g1 w) }
5 z/ f7 c% v" |, c# T; Z  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点5 ]4 M3 s, x7 T- [$ R5 k/ l6 ^" @8 X# n

+ B% R- Q2 s# Z- W9 H0 G  //设置Container(非根节点)
+ s; l% @3 E0 X8 O( G2 I% N  //获得Editor
2 n9 q- o5 R% k9 a! ~' B/ M  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
! {4 x- _2 b- U* Z6 u+ J- ^1 J! j* g  M* N# a: m
  //得到当前对象的文档# g2 M# Z+ j8 I" C/ }
  CATDocument * pDocument = NULL ;
: n4 Z; z* m' z7 Z  F: [4 F- I' b* [/ k1 r( T: ?8 z2 o
  //取得当前活动对象
6 u; K4 {9 d& ~  CATPathElement activePath = pEditor->GetUIActiveObject();3 I7 Z& s5 g+ U/ I6 j' Q

: Q9 B- G! `+ J. V* {6 }* A- s  //取得当前活动的product
* d: O% @9 u, @' {  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());
& t/ D% f" W9 I8 n5 U( @% o
& _/ f& v" V  }7 l3 O1 a) j  //当前活动对象不存在
+ K7 t4 W4 E2 o7 x, R9 Z  if (pActiveProduct == NULL)% f6 S$ |& R2 P' f% z7 P! v
  {6 D- @* t2 v- K( H! k% N  _3 A
    pDocument = pEditor->GetDocument();1 u- j- }3 P1 l7 b9 h
  }0 ^- X$ e7 ~, N( p0 ~1 X
  else' ?4 |: x  i. E+ N6 p" P
  {7 T/ p% x1 u2 E4 H, k
    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
" ^' P* v$ }/ C- _- ]    //当前对象的引用对象是否存在
. @  V: p# e: Y* F) m* O    if ( NULL_var == spRef )
2 z$ t# L1 n; W, d5 V* \; @    {
  S1 Y" F' V- v3 {3 O. O      return FALSE;
, d) s+ \# g- Q: y) i5 t    }; n) b5 c2 v* w7 y" B3 ^

- J) H0 q- W* q/ y) |6 c    //当前对象的链接对象9 \1 }' O' \: w) {
    CATILinkableObject * piLinkableObject = NULL;! J) I- ~5 E, K7 {: @
    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                            - O: f+ O0 o7 s& f7 Q" [
    if ( FAILED(rc) )  f) t3 z  A3 U7 H) ~' ]' c
    {, c. H3 m1 f& M2 e- C6 q+ K% K/ X
      piLinkableObject->Release();  M9 U3 X* m, ]2 `. a9 G8 V
      piLinkableObject = NULL ;
! e- m; z/ s" _/ W, n* I% q      return FALSE;
/ k7 q  Z$ m3 e0 T% r$ \    }/ ^. Y/ u4 ]- r
6 e- z3 Z% I! w9 A$ J; r3 C- \
    //得到当前对象的文档
, i1 x% h# G1 _    pDocument = piLinkableObject->GetDocument();
7 M; v( \1 v7 e' d$ X; B! j    piLinkableObject->Release();( @; r. \0 C- e! z) y
    piLinkableObject = NULL ;( A, I6 y' A! D' a$ E8 d

! _9 d! S* Z- R6 {* N. H. a0 V    if ( NULL == pDocument)
: `* j" j9 y* N( _) a& a, P    {
) ^  d+ {$ z  r- R% b, z4 N      return FALSE;
. t1 m  ]# a8 C/ [% ^    }- k1 B6 y6 v% S5 i, @
  }$ x, E# D4 v, k+ D
  a6 @+ h- Y: g1 y
  //得到文档容器集
- d- L& o% j4 I+ e. ~' U  CATIContainerOfDocument * pIContainerOfDocument = NULL;) D1 B* U  ~) }# b) P0 v, c2 P
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);  G% h6 y" M  T+ L7 `7 [3 j3 c
  if (FAILED(rc))7 \  z, p4 _7 S5 H5 T3 d
  {
; S) U$ D% b7 h7 |+ Q9 T    //pIContainerOfDocument->Release();$ m/ b; H4 {9 u
    pIContainerOfDocument = NULL ;& H' C" @, d# ]/ @: @
    return FALSE;; J$ I" U# ^5 ?% M1 S( H; x
  }3 \8 b$ i4 v+ Q4 I

  O8 X  o) [, ]7 A: Q' X  //获得Document9 P6 Y- E# {$ e9 G( `! n5 ?. f1 ]! I
  CATIContainer* _pContainer = NULL;       
/ \: c" A  }7 D; q  //获得SpecContainer
+ K- E$ `$ U5 c6 S4 Q4 L  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);$ O: P4 r" Q' \' j
        4 _' P( [/ _) j* p
  //GSM工厂1 X$ i1 X& }7 J  B$ b6 ?
  CATIGSMFactory_var spGSMFactory = NULL_var;
, K. h/ L! r' a) v3 y/ @  //设置工厂               
# w5 B9 x8 a, e, @! ^; [  spGSMFactory = _pContainer;                                                                       
6 `( S: m% E( i& f9 D
4 X! o/ m( O: s  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);
9 X2 F3 a$ Q+ a# ~0 G
2 ?8 _  R! m3 K3 [3 B+ E  CATISpecObject_var spSpecPoint2= spPoint;                                       
" f5 J# [; l7 n8 D8 ^9 ^. }4 u- V/ o2 ~
  CATIGSMProceduralView_var spSndPntObj = spSpecPoint2;, V; `% m7 a) Y3 W3 e/ h, z: \

' N, W3 l$ W3 ?) D3 [( L% `$ A1 X! i" O  //*将点显示在屏幕上( ?  }. ^/ x% z4 h: @
  spSndPntObj->InsertInProceduralView();
- P0 D2 S* n2 `" [
6 I0 Q9 S+ [4 e" I' [  spSpecPoint2->Update();
! m+ i# j: H+ Z3 C+ K1 O6 ]2 Y. l4 T! z" ^; d% G  v2 W
  //生成线# @% |; w2 }/ o# F3 D9 V, D
  CATIGSMLinePtPt_var spLine = spGSMFactory->CreateLine(spSpecPoint1, spSpecPoint2, NULL_var);
# d. \5 s% V+ a& Y: }( F6 M. [
% I; L. O6 @6 j; r  CATISpecObject_var spSpecLine= spLine;                                        8 i1 X* W. f1 ~+ ?7 F

* C: S1 {0 u' V9 H% @5 h% _  CATIGSMProceduralView_var spSndPntObjLine = spSpecLine;
# K, m' M9 ^. i: O; B% J4 |' P6 W6 N% r, A
  //*将线显示在屏幕上" m/ c# Z8 p, j! W( }
  spSndPntObjLine->InsertInProceduralView();
8 q3 x2 |. u; z% T7 M6 g/ J1 ~! T2 _
3 s- K3 C' N0 ]9 O1 q: }& u2 n) t  spSpecLine->Update();
7 z9 r' q- N3 X& h: V" i- c  ~& d7 n+ f: k9 q
  return TRUE;
/ d  c7 h2 B$ z# l}9 F2 F+ S7 C, t: A
6 j% Z$ K- O- V! F2 j% h: g; G
; u7 p2 R3 U5 R8 q; u+ d0 ?
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了