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

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

[复制链接]

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

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

admin 楼主

2017-4-17 21:56:09

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

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

x
9 {- j( h2 l4 o& G1 v/ W  c
Catia二次开发源码分享: 通过鼠标点击创建直线+ g6 f8 M0 Q* E7 J1 n0 ]+ m" R0 T

8 K7 i5 \# l8 t0 J  J! S
6 d8 a, v3 ?, J, @
( q" l- C6 X% @3 ]9 J7 `#include "CAARCCreateLine.h"
0 _5 }' K/ |0 K' _2 a  r#include "CATIndicationAgent.h"
0 D" t4 s& i$ n2 G2 e#include "CATMathPlane.h"
, Z, F# B" C  \$ S, \& Y3 i* ~2 Y# `2 ?3 h# {* @5 `
#include "CATCreateExternalObject.h"
9 g: n! T/ f6 u7 h: B6 K/ V8 g: W6 U* q: g2 |
#include "CATMathPoint2D.h"
- O0 ]8 F: D* _6 o; v3 o#include "CATMathPoint.h"
) S6 x6 T" s" l) q  C2 c% o; d#include "CATMathPlane.h"
  n2 D& i: p0 O1 F
8 k9 P  x; p; S* r7 @% v#include "CATIGSMPoint.h"
: s0 m+ t5 k* p; A4 |& Q3 ]#include "CATIGSMLinePtPt.h"; h9 O! }/ E, a1 E
6 _- {/ {4 J3 r# e
#include "CATFrmEditor.h"
% ^3 F+ A4 o! s5 @3 Q- o, \  U( T#include "CATPathElement.h"0 J2 O9 T6 y" w: P4 ?: U9 V5 N

  ^1 ^6 K6 V  [' g  s3 X" x8 n. \#include "CATIProduct.h"$ l! ]$ f* X3 n$ k
#include "CATILinkableObject.h"
; a. _$ `1 {! a- r1 |. u#include "CATDocument.h"
1 h' V: Q2 W$ [; U/ c" o3 t4 |8 L6 y6 }
#include "CATIContainerOfDocument.h"
6 ?$ G- q. n5 b" d2 n2 t
, W& @( l% Y7 @! I$ ?- u+ _' @$ r#include "CATIGSMProceduralView.h"
: q* V" b. s+ e1 Q) p6 [) K
) P' t% `/ W. N1 G#include "CATIContainer.h"
7 [+ F$ \/ K$ l6 b#include "CATIGSMFactory.h"1 p# r" z0 v( a- v5 A/ A# Q

7 w3 O$ H9 M9 z+ a$ b4 {6 n1 u# P#include "CATISpecObject.h"
% g2 d& ~- s2 F. I4 P+ F5 o, W- PCATCreateClass( CAARCCreateLine);. y; k3 L0 I  h" V
" u' A4 `7 ~3 ^# {
, l; y* u2 H2 F
//-------------------------------------------------------------------------6 n8 O5 x6 d+ u; q& w
// Constructor: U, C; o1 t: F& \2 V
//-------------------------------------------------------------------------
& A" l# t  S% z" FCAARCCreateLine::CAARCCreateLine() :
/ d, Z* ]) N% r6 R0 B9 M. u  CATStateCommand ("CAARCCreateLine", CATDlgEngOneShot, CATCommandModeExclusive) 7 Q, Q$ j( k* I7 |. Q, Z& X1 d( L
//  Valid states are CATDlgEngOneShot and CATDlgEngRepeat
7 [  f8 _+ N  Z+ a* L2 t- O  ,_IndicationOnePoint(NULL),_IndicationTwoPoint(NULL)
1 K0 b9 M' j7 E6 k6 i# K$ z# D{
. e' [) h; B$ X" V}9 L' N" f1 k- W' G1 s) `& K
  o( j, y- i' }
//-------------------------------------------------------------------------7 e9 j0 l$ z" b0 S
// Destructor
: @% A( V; k+ _  S//-------------------------------------------------------------------------% d/ e, n1 M) u
CAARCCreateLine::~CAARCCreateLine()
9 `; g. [; {3 U8 Q{6 d" ^/ L  @, u( ~4 Y
   if (_IndicationOnePoint != NULL) : t5 I! I1 g" l9 j5 s
      _IndicationOnePoint->RequestDelayedDestruction();
/ \1 M: l0 V, z1 B5 m   if (_IndicationTwoPoint != NULL)
4 }! O" k. T% m$ P, H     _IndicationTwoPoint->RequestDelayedDestruction();: o. @; D/ h1 Z7 Z3 n( p
}
& I8 Q5 C" K# g5 q9 K3 f8 z9 I& |; R) U; }8 F8 f
" _3 l! a% y. x( M; X
//-------------------------------------------------------------------------
( Z+ P5 R" r; d7 }// BuildGraph()
2 Q$ j( s1 K+ O' B( z9 |+ o//-------------------------------------------------------------------------. [1 ?& I! [: U$ {% |( u' K
void CAARCCreateLine::BuildGraph()- I$ U3 G' H5 f! w
{0 i1 n( R3 d3 Z. X
7 A, P, _3 m* `  q
# O& y/ X7 }% x' Z/ p+ b
  // TODO: Define the StateChart + X; j% f6 k3 u1 J4 y: D) D
  // ---------------------------% h3 r& `$ m" h( _: p
  _IndicationOnePoint = new CATIndicationAgent ("IndicationOnePoint");* U; P3 }8 I! _# q2 W" E& d. S
  AddCSOClient(_IndicationOnePoint);4 s: X# `+ ~/ }9 e- W4 ~, K
$ s5 T: C% N, U
  _IndicationTwoPoint = new CATIndicationAgent ("IndicationTwoPoint");/ m. t! T8 i! H4 k5 Y/ G

0 x, H' `3 B8 b6 E; N4 c: n  CATMathPlane PlaneXY;
4 e  Z& G/ }4 v7 K! c( T0 t  _IndicationOnePoint -> SetMathPlane (PlaneXY);
  j& f0 H4 \: L1 P3 s) I' e1 y  _IndicationTwoPoint -> SetMathPlane (PlaneXY);
5 B$ L4 q: F" @2 \. ^7 l/ T4 W9 H8 N8 v' i  \+ M* G- X" n, e
  CATDialogState * initialStateOne = GetInitialState("选择第一个点位置");
# A. O- x, h: R; P* n4 E* n  initialStateOne -> AddDialogAgent (_IndicationOnePoint);: s1 F6 o4 G6 Q5 {
) s3 q* ]2 y& H" F# N# m% S+ U4 w
  CATDialogState * initialStateTwo = AddDialogState("选择第二个点位置");
3 E9 J2 P, P/ q% W* S) T  initialStateTwo -> AddDialogAgent (_IndicationTwoPoint);
# Q: d) f0 D4 g+ y) |2 Q8 y( S" p- N! F* [1 R9 G" j6 l9 J
  AddTransition( initialStateOne, 3 W/ ~5 G4 ?. G( Y( ~' k
                 initialStateTwo,
: s2 Y9 l9 u9 H                 IsOutputSetCondition (_IndicationOnePoint),
& B4 u9 R- Q$ J: ~1 \                 Action ((ActionMethod) &CAARCCreateLine::ActionOne));
: G8 H! A1 C, g0 X
# l4 T+ R- g8 l# D, `* M  AddTransition( initialStateTwo, , D* s" k4 P4 R: F; [: a
                NULL,
% Z& c+ e" o1 ~" @! {! M0 b                IsOutputSetCondition (_IndicationTwoPoint),0 Q, |& `; w/ B/ {
                Action ((ActionMethod) &CAARCCreateLine::ActionTwo));& A) j5 h0 [/ O0 k2 n3 R+ Y* X
}, ]5 \; \. M' A) {- f
# M& W6 b+ q- P: x6 Z

% R" o( W& K+ ?0 Z, n1 F//-------------------------------------------------------------------------
& `+ \$ J+ \- R# }% x6 U- Y/ \0 U// ActionOne ()
, X0 w! {, E. t; w7 @# Z//-------------------------------------------------------------------------
  U9 S7 i! h' }5 V4 @CATBoolean CAARCCreateLine::ActionOne( void *data )
3 D4 |0 |( ^' @% x! o  B2 `, q! t0 A' k( }{* j5 s+ J/ `& ]# B/ j, T: V
  // TODO: Define the action associated with the transition
4 P; D7 {3 I  ?* i3 J& L  // ------------------------------------------------------
* j" M2 m' @; m  l2 L) p8 b! Q  CATMathPoint2D point2D = _IndicationOnePoint->GetValue();//获得一个2D的点. z4 G- k2 l4 r+ ~

: v' l% f( z+ L  CATMathPoint Point3D;, o; }6 J! `. @' T# R9 k
  CATMathPlane Plane = _IndicationOnePoint->GetMathPlane();1 C$ F" u: K$ |) B+ j0 D
' S0 r* n2 e7 b7 |: G1 e9 _
  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点
  k& `! v& h2 j' s8 e3 g: t& o2 P. Y
  //设置Container(非根节点)- u! b9 j1 F4 i- k" T; W& {
  //获得Editor
; j+ d5 U/ i2 N! X  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();# c9 D9 I) z$ _9 n% ?
* r: E4 @/ Z/ |: v7 y5 Q; S0 g
  //得到当前对象的文档8 `6 y" @# }3 d
  CATDocument * pDocument = NULL ;+ F/ t  T9 }2 o- K2 B$ {1 a+ W- ]

' l( |- S. v& q  //取得当前活动对象% c/ e$ C- M& ^0 R, S# j  a9 j
  CATPathElement activePath = pEditor->GetUIActiveObject();
5 b! m% o/ {6 @. \+ l0 J  D1 ~- v) s5 G7 P
  //取得当前活动的product1 ^; f! t* O# [, i$ @7 T
  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());# C- w  g# |  a4 e4 f7 o

  P: C# L5 }$ b  //当前活动对象不存在
0 n( n$ C" |5 W/ _( r  if (pActiveProduct == NULL)
) C& x+ t2 }. f2 s$ Q2 v) ?+ s) r  {+ |; p+ w: _4 b; p* Z6 [( c
    pDocument = pEditor->GetDocument();# F2 c+ t3 \$ V
  }
4 B5 Y" y0 g/ c* T' q/ q  else) Y% @% X% S: F# O5 [8 c3 K' H
  {; _3 q5 p8 X( j5 F' H
    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();8 `5 a1 K5 e( u( V; {
    //当前对象的引用对象是否存在
- e/ y7 |& i8 {4 q3 P: D    if ( NULL_var == spRef )
# o4 ^+ L2 t2 C( S9 y1 f  \    {
2 ^7 v- X  L+ ^* ?      return FALSE;
2 G* \% A" k; ~    }
( m6 f1 w9 r/ n5 C6 q) `7 [; ?* A
% [0 S- ^/ B2 m+ }    //当前对象的链接对象
. S; l3 V/ U9 z8 z4 m: S9 f% O, y    CATILinkableObject * piLinkableObject = NULL;4 ?' ?7 |0 M& t! J
    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
" ~* k0 e" W% n6 T    if ( FAILED(rc) )
$ Y/ |( T! p& e, r    {
8 a$ F) G/ X' e% ]* Q. s      piLinkableObject->Release();
- ~6 N5 S% o5 w5 |7 L  x9 ]* s  r- Q      piLinkableObject = NULL ;
/ N$ L  {6 b* R# s      return FALSE;1 h0 C3 u! e* {: z
    }# K5 W2 V  {' n! K3 G! {

1 Q4 P  }" O/ `( R7 |( d3 m    //得到当前对象的文档
0 ?( z/ r* h% ^% M    pDocument = piLinkableObject->GetDocument();
2 d' x% P1 @, p7 |    piLinkableObject->Release();
+ X/ J" C0 ^, u$ X0 `! c3 w    piLinkableObject = NULL ;) _3 H' I' h6 j' ^% E$ M

4 P5 o# @& Z# B% E& B; g; @) V0 R    if ( NULL == pDocument)
' p  h7 i: D3 u- C    {' e: A4 o5 D( k* I
      return FALSE;7 d7 q0 O- [( L) x7 y+ q5 w
    }
8 z8 T  d- Q: F$ K* Z  }2 Z9 Y2 \8 t; W; q; x

6 Y# k' d, R0 l- o/ H' W9 _  //得到文档容器集. A' R  c+ y5 l! B
  CATIContainerOfDocument * pIContainerOfDocument = NULL;4 N$ ?% b5 L1 ]- }" o6 R1 t
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);( H( j+ \& D6 H4 [7 ?' K1 |
  if (FAILED(rc))8 _$ J/ u8 e4 N* S$ t2 K- W
  {
" U. X, U$ U0 ]1 L" ~. R    //pIContainerOfDocument->Release();
0 e! O0 ]1 f# ?/ ~    pIContainerOfDocument = NULL ;
/ l3 E0 z# B5 X) e" Y# _9 Q    return FALSE;, k, e2 z1 r5 l5 F$ X
  }
) C" F! @$ m8 E6 o
% `" m1 t$ `' z5 }6 }- g0 N2 n  //获得Document
1 q7 ?; r- P( |8 q  CATIContainer* _pContainer = NULL;        9 F# z# R/ X, \2 J9 t
  //获得SpecContainer
3 t, O2 m  L3 G" d  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
% P5 o7 m2 L: `6 B7 N) i1 \) n+ b' w       
: E' A+ H7 o7 N! c& F* t  //GSM工厂2 J7 L3 L& ~# V; K$ z
  CATIGSMFactory_var spGSMFactory = NULL_var;
% S  `9 X7 ^) e$ ]7 q  //设置工厂                : h5 V" X1 o- g# g
  spGSMFactory = _pContainer;                                                                        5 C* z2 I9 ]! E7 z# U

& {- U5 v' V1 q, c  w- U  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);. J1 ?% \! ~9 @  w' o  k' K  e- o
7 m* U, W! {+ G" L; i9 D3 l! ^/ ^
  spSpecPoint1= spPoint;                                       
; V! h" j" U$ l1 w# H6 A9 Q  `; C3 u2 V- I4 F" M3 u& D6 u5 g! t8 W
  CATIGSMProceduralView_var spSndPntObj = spSpecPoint1;
  u% i( W+ L* v% B  p9 ^) S; b- \! I! g1 T" t
  //*将点显示在屏幕上: i9 k1 t9 x& O" p$ ^# R) d
  spSndPntObj->InsertInProceduralView();
7 I) j& K1 x8 k6 ]7 A
* T/ s; B3 Z( C7 s  e' R! M  spSpecPoint1->Update();5 H8 C+ o# v' ]. `  E& W$ W/ r

0 @6 B+ ~1 _2 O& c" P  [  return TRUE;
" J9 B- E; ?2 b% x/ r}; H+ `9 r1 s+ a
$ Z( o  N; P3 v3 ^% ^6 C1 I
//-------------------------------------------------------------------------0 t: U0 [7 {  i  W; f( A0 a! s7 x
// ActionTwo (), R1 e  U1 D$ r9 y3 ]4 g
//-------------------------------------------------------------------------2 G% [( Q( N! {( E/ ~
CATBoolean CAARCCreateLine::ActionTwo( void *data )! k6 F. q. f' R% E" ^3 B! k# U4 h
{
& D; L: e0 B/ z1 h% u# x  // TODO: Define the action associated with the transition $ E# ]4 ~( b4 f7 m9 U( n
  // ------------------------------------------------------
$ V8 F( P" A' {# \' y  CATMathPoint2D point2D = _IndicationTwoPoint->GetValue();//获得一个2D的点
' Z/ Q( A0 M- j8 \+ `( |: @1 n, Q
  CATMathPoint Point3D;
: K& p& u: O$ H, [. M  CATMathPlane Plane = _IndicationTwoPoint->GetMathPlane();" K5 f9 M0 K1 W3 [' s  r

2 R2 |' n8 S4 s  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点0 s  H; S. H5 c/ G$ q

3 r  j! T9 g! w" X7 H+ |. Q  //设置Container(非根节点)# _5 J, V( k) ~4 v0 J
  //获得Editor0 b5 m  P9 Z0 g0 }5 o
  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();) A4 F3 Z" V/ F5 j+ ]
6 A3 S- h+ C' t( A; q# ?
  //得到当前对象的文档
) z4 _+ H2 o( a( R# V  CATDocument * pDocument = NULL ;
' X; T, L( D7 f+ T# q
* z2 X) _5 k) F9 {) `1 ?  //取得当前活动对象
  B) j7 B% `: j- X% F8 u' O  CATPathElement activePath = pEditor->GetUIActiveObject();
# o- O9 u4 q! k8 s9 c
; t! n; B! p6 B1 S7 O  `  //取得当前活动的product( y, U% [' J8 [( O: W* b' j. Q
  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());/ t1 ^& M7 ]1 [6 Z8 e3 S3 A: m) q

, ~1 k( p0 T0 |) B9 \. |  //当前活动对象不存在) |) S$ u5 J% u8 t. h
  if (pActiveProduct == NULL)
7 k* b" B5 ?6 w2 b  {
* k. v- a8 L% x+ C    pDocument = pEditor->GetDocument();8 N8 p6 R8 B% t" g1 o
  }  ^9 [* M" i/ c, [4 {0 J& z4 y* |
  else4 {- m# |' P! J) N! g4 b& [1 E$ E
  {
8 U  |# ]* J' h! L9 b    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
7 k% L9 i9 q! ?3 h0 A    //当前对象的引用对象是否存在
9 H( M$ q4 }( J7 L& D    if ( NULL_var == spRef )6 F7 ?6 p4 y& w: q! s! o9 E
    {
" N, M# D0 Z& s9 `  A      return FALSE;) I% {$ W0 ~$ Q& e- j) A7 w& b
    }4 g- J2 O* s9 W( ~

( k: n5 J3 d+ G. y    //当前对象的链接对象
3 u3 `- E! i; A5 T    CATILinkableObject * piLinkableObject = NULL;
$ v: w# {5 r% M    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
% d9 ^/ E0 E1 b  |6 t. i' K    if ( FAILED(rc) )1 U7 b) j) I3 Y* O
    {6 }  r  i4 j$ Z3 K
      piLinkableObject->Release();8 h; L. s0 N5 E1 s1 G& D/ F: L
      piLinkableObject = NULL ;8 s  @) y/ e: g0 f$ L* h" B
      return FALSE;$ E# ]3 g: J9 p2 g& ~" P; m" c6 P4 @
    }/ B% f7 x( h" F; [
7 ^9 o+ e" T2 q  }
    //得到当前对象的文档% y+ e* [' j$ y+ F9 l" i& [, w
    pDocument = piLinkableObject->GetDocument();- W! f7 W+ Y$ U8 A
    piLinkableObject->Release();
$ Q. ~+ v) k5 z+ D- ]8 ^) [; L    piLinkableObject = NULL ;! a& R; l0 B: @# g0 p! a8 k2 W' A8 @
) G& Q; c. }4 Y; N
    if ( NULL == pDocument)! x& M' u+ U# B' e* |/ |2 s: q
    {
8 h. h: J) ~+ H8 `      return FALSE;
% S5 \. W$ ?# r1 |3 J/ {    }
1 o  _) J/ _1 H- F. X  }
7 S1 u8 e1 V! D& C
: ~) f1 M5 n) i& U3 Y  //得到文档容器集
3 C1 X7 N6 K7 K" J/ I  ~* R  CATIContainerOfDocument * pIContainerOfDocument = NULL;6 Z# [( b3 @; L
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);
- [4 g8 {6 Q# Y' m* {  if (FAILED(rc))* `/ [2 B3 E, \' v& R
  {
$ P+ I% ~/ r) m6 q4 U0 |9 d    //pIContainerOfDocument->Release();
3 g: g: G% X+ n! S: ~. C9 y  f0 d    pIContainerOfDocument = NULL ;" J8 V! ~  n" u2 n3 v8 f
    return FALSE;: d& a0 L4 {0 l8 s+ l
  }
! K$ h6 M' ]$ u5 v0 w
# z3 ?: A' i( w% y" _" ?, F  //获得Document
. S: ^3 r; p* \) Q! {  CATIContainer* _pContainer = NULL;        " R0 B8 @8 K3 P! o) A; h
  //获得SpecContainer$ |0 M' a) m6 ]  K- A2 z2 }# y
  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
- G  G/ {1 _; l7 O; R" ?# S       
, k2 x) D9 B  O/ n& d" ~0 m" Y1 U% R  //GSM工厂2 K: I4 x& d" n6 z5 S  P# b
  CATIGSMFactory_var spGSMFactory = NULL_var;
% n/ E+ b0 `3 k7 @' j4 w  //设置工厂               
6 X8 g/ \8 W* ?; E% c  spGSMFactory = _pContainer;                                                                        % G1 e3 v' K: H& [5 s# g! P: g) p4 C

; F/ K+ `2 M/ P' k8 W& ]  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);+ E" k, @6 }; X* J( N+ T2 V( S

6 ^5 N6 K' o, a+ C: u, r  CATISpecObject_var spSpecPoint2= spPoint;                                        % L, F# z1 j/ T' E7 K

$ ?8 h7 C$ m8 b: ^% E  CATIGSMProceduralView_var spSndPntObj = spSpecPoint2;
0 r1 @" }' g9 G" r( S+ j4 U* j
# X5 U. f/ `( v* p4 O- g  //*将点显示在屏幕上
9 J+ I9 H% D0 M  spSndPntObj->InsertInProceduralView();1 \- N9 Q6 L1 c/ s% [8 F7 ?

7 x& S: G+ p  z4 }  spSpecPoint2->Update();$ f5 j' J- p; _

) f: p; p$ a- ?  //生成线
0 B% E' [. I* M* L! n+ s2 ]) U4 ~  CATIGSMLinePtPt_var spLine = spGSMFactory->CreateLine(spSpecPoint1, spSpecPoint2, NULL_var);; J+ U9 ^! Y4 E; X3 k( H

6 P) b9 @3 V2 n& f0 B  CATISpecObject_var spSpecLine= spLine;                                       
6 @3 Q$ N+ \6 P' ?, T$ q
' b4 f" I: q: Q0 c, ]  CATIGSMProceduralView_var spSndPntObjLine = spSpecLine;
; I' b# C6 @% k0 `' N' Q( I+ O1 z+ }7 w. @
  //*将线显示在屏幕上
4 V0 N' y$ x6 m- ]& z# F. x  spSndPntObjLine->InsertInProceduralView();$ t* ?1 [& X. b

3 F, v6 ], O8 ]3 |; s5 n8 }  spSpecLine->Update();6 [( a$ V$ \0 }" X
4 y6 B% \1 y6 e, ]" G8 }
  return TRUE;! J% `+ Y) `+ e7 }. E; K
}
( y) Z1 E6 S2 Z0 a8 [; N" T. T
% Q! Z4 p" A) g0 \% |/ l" k! q; G; c4 C5 E' w" P9 h
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了