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

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

[复制链接]

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

2470

主题

1275

回帖

8万

积分

管理员

PLM之家站长

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

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

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

x

4 T4 w( X, E1 X/ y- zCatia二次开发源码分享: 通过鼠标点击创建直线
+ q9 \0 T- t5 s3 D9 n6 W& f1 O' F; s5 g& G: b# [

. o6 v8 ~9 z3 L
3 v- h9 m5 x5 b3 J0 x0 W#include "CAARCCreateLine.h"9 Z  Z" g( S! w, @" \, @
#include "CATIndicationAgent.h"# d" ?  x2 U8 ^: p9 {8 J
#include "CATMathPlane.h"9 v3 [5 t+ r: z

% U0 p- K7 ?6 `) u; p#include "CATCreateExternalObject.h"
' l! E2 K( i: P1 y  {/ W  `5 I% S2 U5 D
#include "CATMathPoint2D.h"9 x$ ?! M1 ], k) t" p. j
#include "CATMathPoint.h"- ?+ J( ~& D6 @. U
#include "CATMathPlane.h", _, R7 N' \. F6 `) X2 N) G

1 a' {# T1 H2 }0 ]" F  @( H3 z#include "CATIGSMPoint.h"
8 Z( H; L8 \* g; [#include "CATIGSMLinePtPt.h"
; {$ o( m$ y! Y) j: r4 m. }+ r; s; S  @: P
#include "CATFrmEditor.h"( W, z+ V1 z% b
#include "CATPathElement.h"
! p+ d' i' W: L2 X/ v4 k9 I) U. j; t' q% `6 I& g
#include "CATIProduct.h"
8 a5 H8 \4 s7 E3 a8 N7 K#include "CATILinkableObject.h"* f2 F/ i/ ~4 v6 v7 V3 u  F
#include "CATDocument.h"
6 b1 z: v* U0 l, ?, v0 T
, @# T: f) t$ G1 v* K$ w$ z#include "CATIContainerOfDocument.h"
% c& J8 i2 ~* N* {
1 \; U- [" E: K#include "CATIGSMProceduralView.h"# K% H1 g; v8 K* D3 U, s* e2 V
. v- L5 \0 B3 t. o( T1 W* I
#include "CATIContainer.h"
/ V. k5 B: s. u1 j; b#include "CATIGSMFactory.h"
$ r- M3 V( n  V' ]3 @8 h6 A$ U
7 G0 C/ d0 p9 ?2 s% G# @#include "CATISpecObject.h"* @* F# F# S3 K- |  A- F! H
CATCreateClass( CAARCCreateLine);
" g5 J6 ^/ S* Q) v6 Q  O+ S9 }8 k7 Q% r
/ a3 b7 n- v! }+ P
//-------------------------------------------------------------------------
# T/ ]: C! k- [+ C2 Q) U* t// Constructor) A. H% M4 Z( N: w$ T1 B- o4 L
//-------------------------------------------------------------------------
) z* f7 u2 k4 E+ cCAARCCreateLine::CAARCCreateLine() :) q: _1 p' Z' ^
  CATStateCommand ("CAARCCreateLine", CATDlgEngOneShot, CATCommandModeExclusive) 6 A# s, X7 E  ?
//  Valid states are CATDlgEngOneShot and CATDlgEngRepeat
3 W8 j1 j& d! V/ {, n. R  ,_IndicationOnePoint(NULL),_IndicationTwoPoint(NULL)
# j  ?( B5 q# E# W; v{! O' ~. O" \7 h( v9 O/ f4 L" x
}& Y" r+ F$ @& @$ C4 K

0 H5 P+ x  i, q8 }' b. O6 o//-------------------------------------------------------------------------/ o  i* `' X8 n' S# g
// Destructor
* i% z' v, V" a6 B( J0 R//-------------------------------------------------------------------------
' J9 ^. `3 @; xCAARCCreateLine::~CAARCCreateLine()
& P6 N" ]0 b6 [{, M# c6 B% h0 H$ S
   if (_IndicationOnePoint != NULL) ; z* j  Z0 P2 t$ |  D& Z* b
      _IndicationOnePoint->RequestDelayedDestruction();8 C; m! |8 R4 }' N0 N
   if (_IndicationTwoPoint != NULL)
4 ^7 G. L% j( n     _IndicationTwoPoint->RequestDelayedDestruction();) L: {7 m0 m, \! d
}
) v; a& Z; W% E' _+ T' {% `
1 y. C; B% \. C6 I3 y, ^- q" O, j* _0 o) E0 l+ O) c) R+ x
//-------------------------------------------------------------------------
6 S  J$ t5 l3 v/ S: t8 p* Q// BuildGraph()
  ?6 b; b& {5 \' J6 \//-------------------------------------------------------------------------
$ E1 X$ j' A  W0 ^3 `& v6 C3 w& f9 l  Q7 Fvoid CAARCCreateLine::BuildGraph()
. `& ?7 D6 y  k$ R* y{, ?+ \0 H7 Y' C6 |/ v! t. p3 W
7 G5 S8 o, j+ J7 J) k; _- G

0 ^  p/ W; A, c% k  C0 _1 {# S  // TODO: Define the StateChart 0 j. i5 j/ a- a6 n( U
  // ---------------------------
6 y* U  y( X: J& w1 t$ s. e  _IndicationOnePoint = new CATIndicationAgent ("IndicationOnePoint");  i! U# f! S2 S3 k" t5 u% O
  AddCSOClient(_IndicationOnePoint);
& ~* v9 |0 n( x9 G- [3 k  |; n6 z9 r( T* Z2 o) z
  _IndicationTwoPoint = new CATIndicationAgent ("IndicationTwoPoint");2 O  M  T' }" M4 Z% o( T( _/ g

( q  z/ J- `- d! \% Z2 }7 ?, T4 o  CATMathPlane PlaneXY;
* R5 j# Y" w7 v# c. X  _IndicationOnePoint -> SetMathPlane (PlaneXY);& m- h2 ~, j% f1 ?% g
  _IndicationTwoPoint -> SetMathPlane (PlaneXY);8 u( C. P1 \6 E/ N$ D1 K  `

. ^9 p5 O, }0 N1 C% Q  CATDialogState * initialStateOne = GetInitialState("选择第一个点位置");4 o+ [1 m, p7 b0 c
  initialStateOne -> AddDialogAgent (_IndicationOnePoint);& {3 N& K# ~" U, Q- O

8 @7 q, p9 s0 U9 l8 q$ [7 D4 a7 g9 u  CATDialogState * initialStateTwo = AddDialogState("选择第二个点位置");7 u8 T; q  Q1 \6 J/ n' _
  initialStateTwo -> AddDialogAgent (_IndicationTwoPoint);
- w/ x/ y3 r' m; T' T" ]4 A* y' M+ X  j3 ^
  AddTransition( initialStateOne,
9 I# w5 Z9 k) Z                 initialStateTwo,
7 d  l( |* `: I- r* S                 IsOutputSetCondition (_IndicationOnePoint),* }4 D& `8 n; {$ d! ~( v- u
                 Action ((ActionMethod) &CAARCCreateLine::ActionOne));. ~1 q: A  R% w7 m& Z# R

; v: x1 f: k) p- ~  AddTransition( initialStateTwo, 1 o4 d/ }0 N" Y) m! a8 [& D% w
                NULL,
7 \1 w$ D, r$ ^9 O  J% \% F* g# K% j                IsOutputSetCondition (_IndicationTwoPoint),
4 o: t( n& L# q4 _( \' ^4 L, f                Action ((ActionMethod) &CAARCCreateLine::ActionTwo));
/ {4 k: n" Z  m) Q3 h' G' H1 [}8 l, ^; q8 T' a/ g; S6 B  L: W% z
" c0 R1 X2 O1 K; O4 S. y

- U9 ^$ K6 D  B" E//-------------------------------------------------------------------------
0 h8 b. _: G% [6 M& {// ActionOne ()
7 K3 s. ]2 R. Y  {) w, W//-------------------------------------------------------------------------! e- q2 m7 l7 g' G, t$ C* S9 o
CATBoolean CAARCCreateLine::ActionOne( void *data )& j0 O! u- x7 J( \% V
{
1 h1 U: o* O) t) P2 ]( g8 s& r  // TODO: Define the action associated with the transition - y! ]8 T% s+ a$ R; v/ `: O7 }$ a6 n
  // ------------------------------------------------------
- x( O. E3 _) E  CATMathPoint2D point2D = _IndicationOnePoint->GetValue();//获得一个2D的点7 B5 d6 q" W8 J4 _9 @+ P  d/ Z

! R$ ]( O- _2 b  CATMathPoint Point3D;9 `% h, V2 {- l5 W! [
  CATMathPlane Plane = _IndicationOnePoint->GetMathPlane();
7 i- ]/ Q1 w, ^" ^. A0 Y9 K' w9 c' v- a4 j
  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点
) T. \6 ]- Z% b  Z8 i$ J& u5 ]) e  J! H
  //设置Container(非根节点)
  S4 n6 Z2 ~- x  ]* _% ^. I1 g  //获得Editor- {) }! K+ l1 Q9 L3 C/ W! b  b
  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
5 \( B0 ^8 i/ U2 c8 w$ p( |; K6 e1 v5 q& g) [
  //得到当前对象的文档* w' F3 z1 a1 X8 x" ~$ F7 i1 X
  CATDocument * pDocument = NULL ;
6 Q& z4 F% p# W4 ?8 _* }) Z, A) ?% h* L6 H
  //取得当前活动对象
' H4 d  Y5 n4 D  CATPathElement activePath = pEditor->GetUIActiveObject();
, m' o( P) g0 m) o5 g; c9 e, ?9 v
) j# P8 |! w7 l5 ]9 {* P  //取得当前活动的product( n8 ]* G9 l: ]/ V7 k
  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());# u+ m: {- O, z4 E

. W: P/ y1 x$ C2 i; g/ o$ r) H, U  //当前活动对象不存在
& k# a3 k7 {) _5 U  if (pActiveProduct == NULL)
0 I% b, x7 k0 `9 s* ]+ h  {
. L- D- u) r4 L8 J' H; o    pDocument = pEditor->GetDocument();
; n+ T. C5 W& G1 x# T: u! T8 Y  }
; A$ }2 H7 G8 e2 z0 i% y( E' S  else$ S" Y' H% L5 o9 R* }" {+ b
  {
8 D9 x9 @# w. g' ~' z5 z" I    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
/ Q1 w& {1 _: L    //当前对象的引用对象是否存在. h# _9 Q# w% {  d- H$ b! f# Z
    if ( NULL_var == spRef ): @( N8 I8 `$ v, ^1 N6 U( z
    {
: v' G+ R( _4 i% W0 i      return FALSE;# U# @) @, u* I( i/ U, {
    }% ^/ m0 `! K8 y+ e# z* m+ w  D
1 _4 d: F8 l* `
    //当前对象的链接对象
8 S# i7 \  Q4 U    CATILinkableObject * piLinkableObject = NULL;
* T) f' q0 B( [( s    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
3 S0 x& B  d" B( Z$ ]5 B& a. |: j    if ( FAILED(rc) ). D' w* L/ c% G! h9 o
    {& m7 e+ X8 m& Q
      piLinkableObject->Release();7 D8 {  H) p$ x0 ~( T- b
      piLinkableObject = NULL ;
2 N; r' l# d0 c, A      return FALSE;
  l" p" j& f; e6 o( j    }
& Q. ]6 {4 b3 G# A" u, I3 L# @( a7 t2 S. J
    //得到当前对象的文档
3 n7 G5 z5 R" c+ P/ J& N    pDocument = piLinkableObject->GetDocument();
! m2 m* B4 ^. u8 j6 z    piLinkableObject->Release();, I* ^8 Y7 w- u: h6 J
    piLinkableObject = NULL ;% t6 c1 {8 X0 k% D7 L4 B2 Q5 G

* G( B* l1 D3 b0 {& f( Y2 k$ O8 o    if ( NULL == pDocument)
& m; Z; {" i7 e. ^  T& ^0 E( d, F    {
% L& m' H2 U1 K      return FALSE;9 G" C8 ]. p9 G9 k/ |$ g! l
    }) h7 K% n( I5 l4 m: @
  }
! F) l1 W* S; x5 p& ~9 p! k/ l2 M# k1 {0 m0 r7 t# V
  //得到文档容器集6 o9 a% s0 X4 j- s
  CATIContainerOfDocument * pIContainerOfDocument = NULL;) R2 I* k5 }& }" J6 m! y
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);
: H: R4 d9 {6 k  J! q% W  if (FAILED(rc))
5 I% h0 `6 m/ E, g  i  {
$ A/ ?: M0 d/ N$ E; y    //pIContainerOfDocument->Release();5 ^! r% A, k. O# K8 i! F/ Q4 R
    pIContainerOfDocument = NULL ;
6 X5 s' I2 |% u! c2 f    return FALSE;. ?! Q6 s6 V! S6 a
  }
: b, I$ S9 z5 @- ~% d+ j: S  E  H2 m6 P5 N' u- ?/ _
  //获得Document
8 M1 w/ `5 \7 M4 F  CATIContainer* _pContainer = NULL;        6 t, F) G; N6 g& h1 d4 U
  //获得SpecContainer
1 i$ l# m9 l, ^% D  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);2 ^' u* j) A/ P+ e, g5 {
        2 K" B+ i% J1 i+ j
  //GSM工厂  [& Y# ?! w7 j! t# c
  CATIGSMFactory_var spGSMFactory = NULL_var;. \! z, P4 ~- `7 V+ n
  //设置工厂               
5 h$ h( u, y& }* c  spGSMFactory = _pContainer;                                                                        - ~  A. V+ M/ Q: v9 F

- N: M5 B" r  e9 f- a6 z  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);/ F9 A$ Y8 V4 p* M
$ p* w1 e/ ]& K: b! Y: r
  spSpecPoint1= spPoint;                                        # {$ d3 j3 ]9 m1 X% h6 ?$ q- _

3 r% P& U. [! R8 v! n7 U  CATIGSMProceduralView_var spSndPntObj = spSpecPoint1;* t7 f  }$ |% y3 S

7 H* G- [, ~8 Y  //*将点显示在屏幕上
, X' b$ u3 |' v1 A% }5 u5 p4 C4 [  spSndPntObj->InsertInProceduralView();9 T' {. R1 k; w2 h# t$ N

; A0 {5 K0 g1 s5 M( `4 G  spSpecPoint1->Update();
$ c# b$ [' C6 h0 e: U. v7 s' F; t2 q% v5 \/ ]# D/ ]! ]& }
  return TRUE;1 h( j- `( ]2 n* ^7 @& h
}" W6 D% Y  E/ E) \, h( Q
  R3 r6 i1 W, P( [" ^# s( o$ J4 x
//-------------------------------------------------------------------------. i2 M- k2 {5 K) K) I9 E
// ActionTwo ()& C& g& W6 N( }( H9 x% L
//-------------------------------------------------------------------------
. K( l" s8 M- l* TCATBoolean CAARCCreateLine::ActionTwo( void *data )- K! s  X  ^; ]7 c; o
{
/ y7 r2 M1 d- @: G0 I9 b* |  // TODO: Define the action associated with the transition
) ~3 c  N+ l( F% b1 x1 E2 N* c. \  // ------------------------------------------------------
! b  q# j; m" Y, E" S. w9 X+ G7 l6 J  CATMathPoint2D point2D = _IndicationTwoPoint->GetValue();//获得一个2D的点- M9 y) o5 s" [: a8 g* s; R5 R$ j( [
* ~* y: x( ]" N$ x0 A
  CATMathPoint Point3D;
  G& U: i" C# \# F3 E: T9 [  CATMathPlane Plane = _IndicationTwoPoint->GetMathPlane();3 k4 W0 \) y9 D8 t6 I) P

  w' H' F5 ]# t; v; ~# u. C1 R: V  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点
' ^5 s2 A5 K; H  Z& ]2 {" D7 w8 `/ C' E; m3 f* l; y+ K
  //设置Container(非根节点)* \6 n* a6 F$ m- T  n
  //获得Editor6 x7 X1 k. p% ]. A6 S# p, H
  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();7 v" F* c$ Q, [: |4 W6 V0 \
0 T- u) ?3 b" t9 G4 K$ G. `
  //得到当前对象的文档
3 U$ ]  ~5 K- g8 n! y, v  CATDocument * pDocument = NULL ;
1 X8 H7 @8 X4 x" `. U/ W
. R- a& x4 `, a5 A4 `: M, |  //取得当前活动对象
2 ^# k2 c6 ^* n: e  CATPathElement activePath = pEditor->GetUIActiveObject();
: \$ x7 {4 _. a; m* F3 I+ |5 o. C" T$ j; q: b* q
  //取得当前活动的product
" @9 G2 K0 m# |  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());
* d$ }1 ]3 G# H3 Z% J. W3 M' Y7 ?% b0 q; k1 v8 \8 }5 q( _
  //当前活动对象不存在
; e8 c7 g" \& q& d+ G, G7 h  if (pActiveProduct == NULL)
2 z9 w. q' A" o$ b' S% Q  {
4 g1 W- ]8 ]4 e    pDocument = pEditor->GetDocument();7 J+ l# V( F# r2 {
  }0 ?4 Y( V. u( L& A5 e* W+ `, n% Z
  else
; r9 u5 M7 L. E  {
) n) x/ _; A$ x. g( o    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();* u: t0 p- `% h" \& K
    //当前对象的引用对象是否存在
3 W2 ^. W3 Q' @( [( F    if ( NULL_var == spRef )! s! n  a( u& K" Z
    {( e8 u4 W8 Q+ D7 K9 J8 M( l7 k
      return FALSE;; n& C5 Y6 r( R  I- f
    }
4 u5 V1 H6 ^! x( y4 p$ F, v9 T2 n1 C
% x1 F; Q3 x: }1 R% f1 r1 ?    //当前对象的链接对象
; Q  C! O$ @  f    CATILinkableObject * piLinkableObject = NULL;
! N( c/ u( s/ i* T+ F4 t% b% M    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                            5 [& s3 d5 Q+ h, K8 M
    if ( FAILED(rc) )
2 Z9 m4 N' `" E2 u6 x. N    {6 {/ \0 d: i1 {( l
      piLinkableObject->Release();
4 K0 g) ?3 V+ K# u' Z" i      piLinkableObject = NULL ;
/ M' k% \6 G) E* \- a- q' ~      return FALSE;
" s2 q9 l8 T' r* A    }: h( T! Y8 K- @) o: P
# c, w3 p5 y. J6 J8 \
    //得到当前对象的文档
) c% a4 y; x2 c" h' q    pDocument = piLinkableObject->GetDocument();* C+ {0 U; Y0 M  T: M5 f# b6 Z$ }
    piLinkableObject->Release();
9 a. }: c, x( p8 z; ?7 x    piLinkableObject = NULL ;8 @0 {  H8 Y) n
- G, M9 x- l' x" I. u$ u3 U
    if ( NULL == pDocument)
& _! q8 q* o8 J/ C& R6 Z    {; y9 A" Y8 T/ j2 H% ?
      return FALSE;) A  C" Q9 S' i4 e+ i
    }3 ]8 l8 I. h  D, ~+ }
  }
* |" Z- p5 X% |$ s# K
# |+ w: n: Y) L9 z6 ^  //得到文档容器集
7 [: M- N; N. R8 K  CATIContainerOfDocument * pIContainerOfDocument = NULL;
% R2 q& x8 O+ u# C' U, |0 ?6 l  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);0 s* R% w* L+ r3 e9 P( Y
  if (FAILED(rc)), K4 O, g& s) x# j/ G
  {
3 ?) J( V5 }% l% L; ?( `* f9 B    //pIContainerOfDocument->Release();
2 S- B: b8 `$ I5 m1 F! W    pIContainerOfDocument = NULL ;) }. g: t) v6 y# x0 `
    return FALSE;# p; @3 w0 {5 h3 ]1 K3 k6 K
  }$ i& _! h7 {% k$ e8 }; I, w
6 t$ v9 K7 [" S  s* Y+ O) g, n2 y
  //获得Document
0 A0 X7 I* l$ w4 x$ {4 T  CATIContainer* _pContainer = NULL;        + n6 ]# T) P8 D; N
  //获得SpecContainer
! l& R/ H3 d0 M& x6 D  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);  W# f( x; M2 p- ^0 Q
        " O7 r- H% X; x# b: o- x5 G
  //GSM工厂' A# M* _6 J9 b
  CATIGSMFactory_var spGSMFactory = NULL_var;1 m9 x" v5 [% S/ `" b- S
  //设置工厂                3 x" t0 g2 d5 ~/ Y' P
  spGSMFactory = _pContainer;                                                                       
! C% F' L+ ]& I4 [4 y
! t2 n* F4 O6 _7 ]  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);
5 l: T2 F/ j( O$ k/ a
: j" _/ `" |. g  E. w  CATISpecObject_var spSpecPoint2= spPoint;                                        7 @. S) r. s! Z0 |/ t

: C4 N  B7 X$ U9 D  CATIGSMProceduralView_var spSndPntObj = spSpecPoint2;" R: c% _1 }6 G) o/ ~. A

% P! {0 B3 ^6 S6 }- z  //*将点显示在屏幕上; u3 }- s6 |7 S8 l  g+ o1 G
  spSndPntObj->InsertInProceduralView();
9 D" u! h% V0 n2 {, N; l
! Q8 w/ W: X" q% V* ]5 `  spSpecPoint2->Update();
; S) m4 o7 I9 ^  o; r# o' S
8 [! l: ^! \- J5 d5 x  //生成线
/ w' P/ b9 c/ K2 c7 z  CATIGSMLinePtPt_var spLine = spGSMFactory->CreateLine(spSpecPoint1, spSpecPoint2, NULL_var);1 h9 T6 h; b6 [0 G
3 A, t# ?7 E4 A( u
  CATISpecObject_var spSpecLine= spLine;                                       
, B) ~- x# {) I- X1 e) b5 q7 s; ]. C( D. w  V# ?1 p6 u
  CATIGSMProceduralView_var spSndPntObjLine = spSpecLine;4 d  A% k& W" {- r" S+ L
! y: J) X( t; g5 }) K  D" v" w
  //*将线显示在屏幕上
* g. ]+ l* `# R! c' E1 C/ `0 {9 l$ B  spSndPntObjLine->InsertInProceduralView();, i2 j4 H4 Y% a- [6 f; u- I

' ], u2 b' j/ o* y  spSpecLine->Update();
3 ~! z- r; h5 Z2 R2 F
) d0 G+ @& A0 G" x  return TRUE;
+ t4 ]) _- e( m0 B% j3 ]2 I) z5 n}
5 t0 K& D$ N* `0 Y1 \& F
( Z/ d: m+ b. S3 Z2 G
" M. {) a0 c1 ?8 X& J
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了