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

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

[复制链接]

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

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

admin 楼主

2017-4-17 21:56:09

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

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

x
# t# c8 f" f9 y6 z
Catia二次开发源码分享: 通过鼠标点击创建直线
. W0 @1 s" J+ \0 t- K9 I( S
, U$ D& @. N' u
0 L: I- |7 L! W! T; L' v! S* m/ H# ]* B* f! @, f8 N7 b/ T. r' W: U
#include "CAARCCreateLine.h": V% N+ D1 x' d1 j1 `$ m
#include "CATIndicationAgent.h"
" \; v) }& |4 Y1 w  ]5 N% ]#include "CATMathPlane.h"
, O1 h- x+ k1 }6 O: q! M
! O# e: {" C+ A4 \! q* d  L+ {#include "CATCreateExternalObject.h"
  f; k" K0 a. {) U5 C' k  C1 p, ?% ]+ H7 H# ^  y, D; n8 S
#include "CATMathPoint2D.h"# w7 j* c8 {0 s3 i
#include "CATMathPoint.h"
5 }% X: P2 U# J9 g#include "CATMathPlane.h"
: n; P! q. G& p1 ?; I# t4 t7 D' L& L) k9 o
#include "CATIGSMPoint.h"+ P& P& E* N* E, b
#include "CATIGSMLinePtPt.h"" M# Z" a0 I+ C2 `8 g

; u* p" r( E% t1 l7 f#include "CATFrmEditor.h"# p/ |( ~8 p- \6 x
#include "CATPathElement.h"4 g) H* D  x' y( A, {* U
. {6 Z* N- z/ u2 W2 D5 n; @- G/ t
#include "CATIProduct.h"
$ a" X% V. R) f5 K#include "CATILinkableObject.h") v" c0 d/ u# K, P
#include "CATDocument.h"  `& @9 q  y2 w6 D8 T4 u: O/ T
9 I! t9 O- ]4 d1 C
#include "CATIContainerOfDocument.h"" `. T3 B6 \7 z# C: I) E) \

+ g/ d# V' U- n2 i# `( E#include "CATIGSMProceduralView.h"( i5 |; G6 T# N7 D6 s, ^  J

* \5 t# J- q1 }6 C  W#include "CATIContainer.h"* K, G: W- ?$ v8 G9 R$ ?
#include "CATIGSMFactory.h"2 B) V' I  T* V  H* v' O
* _) g* M# n& Q3 U  ^: G
#include "CATISpecObject.h"
9 B/ u/ Q0 Y8 J  E! \CATCreateClass( CAARCCreateLine);% F- M# Q0 |1 D& l; }+ B9 R
% ~& D4 ?" h- E: ]
5 y7 t* [: d6 `4 Y) @& [- [# J
//-------------------------------------------------------------------------' b$ p# x( q. e4 V8 ?9 l
// Constructor- Q' X: D9 g  C5 d2 Q" c, ~
//-------------------------------------------------------------------------' z: n$ R* q6 {+ p& ^! ]/ s1 _* z
CAARCCreateLine::CAARCCreateLine() :
+ {+ e' q& r3 q1 ?/ ?, L  `9 K- ?- Z  CATStateCommand ("CAARCCreateLine", CATDlgEngOneShot, CATCommandModeExclusive) 1 d9 D6 C9 J* O+ U1 K! j" z3 r
//  Valid states are CATDlgEngOneShot and CATDlgEngRepeat
1 J0 Z+ d% w$ K$ U  ,_IndicationOnePoint(NULL),_IndicationTwoPoint(NULL)
  r" V) A3 I- t2 c{
! I; M5 B$ |; @$ w0 A3 u% s6 }2 D; ]}
( L/ Y1 c1 _" o0 A" n
0 x# ?8 |4 }" X( D' O& q1 h//-------------------------------------------------------------------------
" I9 j6 B  ~% a, X2 X/ U& N// Destructor
1 L* S1 y* l8 @2 n3 e/ k! j( ?//-------------------------------------------------------------------------! d7 O! d7 K0 ^$ \
CAARCCreateLine::~CAARCCreateLine()0 {& Y( H2 B$ Q1 m% L
{
- C- u/ _1 J  K* w& R' [   if (_IndicationOnePoint != NULL) ' H; w) W8 z1 D  [* X3 |
      _IndicationOnePoint->RequestDelayedDestruction();
9 _4 o0 m" ~$ z3 O  T' m5 @& o6 v% ^9 o   if (_IndicationTwoPoint != NULL)
. u+ b0 u- P0 G  m9 Y. J     _IndicationTwoPoint->RequestDelayedDestruction();
* W$ ^: o0 J* b/ F: m}9 c/ w+ C9 G1 W- D" b
7 J0 ?% F4 K- J9 v1 E. \. f' r4 N

9 V% `; p& Q3 }6 |* A' `, {//-------------------------------------------------------------------------+ E- q9 W7 j2 E: P0 [8 I, Y
// BuildGraph()
' X3 @+ c4 r9 e5 S//-------------------------------------------------------------------------
: g  d7 [! A6 L. e4 ^void CAARCCreateLine::BuildGraph()
/ C$ j: I. f6 N# Q( {{
! `+ y7 X' S. m1 |7 B! R/ u6 h  y5 ~* J# a

2 T: n6 Z1 {: {! x6 y, c  // TODO: Define the StateChart
( T6 }8 A7 _0 f2 y8 i5 y  // ---------------------------
1 n' E: Y% j! E3 u2 L* T  _IndicationOnePoint = new CATIndicationAgent ("IndicationOnePoint");; i& g3 _1 \" |2 x& b& X) ?
  AddCSOClient(_IndicationOnePoint);
% G; q1 ~$ t* O2 }
: r& P9 H4 n: I% v6 o5 Y  _IndicationTwoPoint = new CATIndicationAgent ("IndicationTwoPoint");4 v" Z1 t) S4 ^9 ^8 `# l/ l+ r
- b( C4 S( t! L. k6 d- D% @9 f5 O
  CATMathPlane PlaneXY;
. U) Z  o' Y; P. Y  _IndicationOnePoint -> SetMathPlane (PlaneXY);
, I- B" {. j* i2 M  _IndicationTwoPoint -> SetMathPlane (PlaneXY);6 u8 X# p! H  C" @! `) [- K

7 m5 m' ~: K  d' c$ W0 y3 D  CATDialogState * initialStateOne = GetInitialState("选择第一个点位置");
6 J6 Y# n5 X* E6 F6 O; @8 E: Z  initialStateOne -> AddDialogAgent (_IndicationOnePoint);/ }1 W$ x; h7 A9 p$ M. G3 ?
1 p4 ~4 `+ X, T" N* @/ c* }* H3 C
  CATDialogState * initialStateTwo = AddDialogState("选择第二个点位置");
2 }5 U1 R4 K* D/ D1 F  initialStateTwo -> AddDialogAgent (_IndicationTwoPoint);
0 U$ v7 V5 g& h- I% M! J; L5 P
8 |) R0 o& ^* J- \  AddTransition( initialStateOne, 2 [. t% @8 E' w
                 initialStateTwo, * e9 H' g( Y8 ?# I
                 IsOutputSetCondition (_IndicationOnePoint),' m6 U( s+ I# W+ S
                 Action ((ActionMethod) &CAARCCreateLine::ActionOne));5 A$ G# Y2 m0 U  |5 J

6 S% Y* R, g3 `  AddTransition( initialStateTwo,
9 D7 h' ~, s+ l                NULL,
$ x  g0 j: T& {, o( q8 n                IsOutputSetCondition (_IndicationTwoPoint),
' _0 `& H$ m1 k5 z' D1 Q3 Q. h" K- A2 J                Action ((ActionMethod) &CAARCCreateLine::ActionTwo));6 y  n- D0 Q! }9 |2 |' g: l4 Z" Q' d
}) r8 p" l! r, O2 U9 Y% M
1 G  k% P+ r; G9 C8 G" _2 k

/ O! P2 [2 z. B8 W//-------------------------------------------------------------------------2 ]4 `' v( _4 o8 {8 B/ K
// ActionOne ()
  p/ z2 J2 [, P/ ^8 O$ x0 ~! }//-------------------------------------------------------------------------
* {) V/ b! q3 G# V( Q% E# Z7 F$ kCATBoolean CAARCCreateLine::ActionOne( void *data )
3 p: T, U/ N8 t( Y$ u! W" G( p{
: p; |- u& u- }( U  // TODO: Define the action associated with the transition : M! B5 b+ C1 K0 g1 K. {$ S
  // ------------------------------------------------------7 m. i3 A2 F( d1 B
  CATMathPoint2D point2D = _IndicationOnePoint->GetValue();//获得一个2D的点
$ Y/ ]% ^, M0 x# d. Q5 r9 q
& V' r# `2 y) P5 X0 S+ G- P- |  CATMathPoint Point3D;$ v0 G$ T$ j* l9 u& F( q% T( X
  CATMathPlane Plane = _IndicationOnePoint->GetMathPlane();4 d( m1 `6 w" O. i# a1 @. X' h6 P
; l& K' X, ~8 C3 J6 |+ W, B' n
  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点8 l. c  k' l3 J6 j

& k& i  v0 G9 x1 {  //设置Container(非根节点)
! \" t& S0 u6 \' u7 v* q& n3 `  //获得Editor
2 l  K6 Y0 q7 ], `; `) Q  V6 c, J  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
6 K- ]: w8 Z/ a6 _( ^) g. N( x1 {. [( t2 l) V1 p4 s& J+ @% A- B9 d. z
  //得到当前对象的文档
: P. L4 I$ O9 |7 t" _  CATDocument * pDocument = NULL ;
  n/ e+ |* P1 j4 Y# x
( A0 B/ I' B. E* Q$ X3 z  //取得当前活动对象( ]( \1 T  Y, j! x, a
  CATPathElement activePath = pEditor->GetUIActiveObject();
$ ?6 v: T- K/ r9 ^4 @6 C" g6 J1 _# f7 L% @* H2 E
  //取得当前活动的product
7 @( A! r2 D% `3 `+ L; n  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());' x- S* {* r" x/ f; ~; C: U9 r

+ v7 Q1 o2 W7 x1 ~  //当前活动对象不存在
1 {5 Z) x) V3 ~1 N/ _5 z  if (pActiveProduct == NULL)
; m) ~% i3 `# C- t  F/ }  {
! W. O, E, x9 U$ k  d    pDocument = pEditor->GetDocument();$ l4 c# A/ Y, M+ {; ~, z5 f
  }/ H, D' R- L) s* N* ^; [
  else' @8 W2 N; d% P' c
  {
* \. `5 O2 I6 m" c    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
6 q( p, J. l- h6 T" J( a    //当前对象的引用对象是否存在
+ M) F1 m; L1 T6 v    if ( NULL_var == spRef )- X5 C5 P+ y: {- f7 L  `7 j6 t
    {
  E' n5 u2 _" }* V% p( ?      return FALSE;
5 p- z$ P" Z( a: X    }2 X& Z0 E' P8 T7 _( _) R" M
' w; g$ U( F0 l# e7 e2 g
    //当前对象的链接对象
2 H; E" y* C  L9 |    CATILinkableObject * piLinkableObject = NULL;5 T/ i/ T% E, E7 h: V8 U
    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
) o7 f% ^+ C7 w4 H; l* x; X    if ( FAILED(rc) )2 q1 K% z" L4 j$ Z( [8 f; z
    {
' Q% D  F7 k% U# v6 o      piLinkableObject->Release();
; U6 Z5 b0 y% g! O" Q      piLinkableObject = NULL ;1 W  l4 [) h# ]: y
      return FALSE;
  A; s4 `/ {/ }" n6 ^# ?    }
2 n( g/ A# T' w! r2 [4 s) q: H) [6 s7 H" l; s( C4 q/ \
    //得到当前对象的文档# S6 k0 H: R' d" q. R1 Q- g% N
    pDocument = piLinkableObject->GetDocument();
1 Y" a6 c! V/ A1 n& b% k    piLinkableObject->Release();9 L6 O" e4 ~6 H1 h- A
    piLinkableObject = NULL ;
' z% [$ v/ |/ {/ y7 A2 ]' j# S8 Z! h( L8 \
    if ( NULL == pDocument)/ ~3 D* I3 m- n, ]0 l$ @( A
    {6 ~8 U  a; N+ s; V
      return FALSE;
& v/ T, Z1 ^4 i( u' l, k    }4 P: m, p2 \( r
  }9 X  U; t; l9 K% T* f7 u4 F& I

; B5 O; ]4 E) X4 E5 Q  //得到文档容器集8 a5 A, v) B0 {: H0 C
  CATIContainerOfDocument * pIContainerOfDocument = NULL;
3 {+ u  w; o9 V$ U2 x7 E  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);6 {, }7 e! z% _" }7 V; B& {: X
  if (FAILED(rc))
! N. l5 X/ w) V. \+ f8 o3 X- i  {8 f! T$ r; B/ \- h+ H
    //pIContainerOfDocument->Release();
3 z1 j  T  g% O( |    pIContainerOfDocument = NULL ;
5 r0 C5 O- d1 \: h3 `    return FALSE;$ O' h& {( L$ M% q5 y# ^, M
  }
* p) e( d$ q( ^9 d6 K. |5 S0 Q! e0 K7 L6 N
  //获得Document( O  {! E9 N+ A) j8 ?8 `- g
  CATIContainer* _pContainer = NULL;       
4 M$ b0 I% t% [1 x8 |( w# f# p  //获得SpecContainer2 B& D9 B3 q' w$ q* t4 Q
  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);# _2 r2 @# d- T# n2 H& q
          L6 S9 z$ c% {/ O
  //GSM工厂2 x$ M0 q! h& F
  CATIGSMFactory_var spGSMFactory = NULL_var;
* \# |) S: f4 m  //设置工厂                3 X- c! H: x9 Z; ~5 ?
  spGSMFactory = _pContainer;                                                                       
& L8 U  F% H+ u; F- I1 ~$ `8 ^
2 Z) E- M; Q9 _8 Z( _, O- N! h  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);9 ]+ Q% t8 [6 w3 J# `$ h
8 l9 [5 I4 b! k3 K, }: r
  spSpecPoint1= spPoint;                                       
" M% t* ^" \3 d
5 t2 v/ ^) \9 K+ f# e  CATIGSMProceduralView_var spSndPntObj = spSpecPoint1;
+ Z2 j# e0 P* K2 K7 o" o* v3 }3 T6 o( j! N7 _5 p1 z2 j
  //*将点显示在屏幕上1 v8 s- c* O6 l* Y- q- z1 ], N
  spSndPntObj->InsertInProceduralView();
2 L: Q- G: E& [; o7 N
4 j) f, \* j4 n; w5 e$ l  spSpecPoint1->Update();
7 j8 x6 c4 {. r
) }/ J( E3 p8 u2 f: d  return TRUE;, g- i# V" B/ h& b0 |3 J& l
}
. z1 p) v( A) p7 Y: B
1 Z0 \* q7 [! y9 }7 l" s: t//-------------------------------------------------------------------------
# A  @( t3 Q* P- h7 h// ActionTwo ()
5 J, R# m& t$ k2 ?: v//-------------------------------------------------------------------------: \* T" E% R" D, z
CATBoolean CAARCCreateLine::ActionTwo( void *data )& e* |2 v* N2 ]2 Z: Z+ d; M
{3 P' K. `* q: F' R0 r' \0 U- v
  // TODO: Define the action associated with the transition
( |& D5 B9 [& N" h* S: l  // ------------------------------------------------------: ^3 ]8 ~. ]" g1 A  }
  CATMathPoint2D point2D = _IndicationTwoPoint->GetValue();//获得一个2D的点/ G% c4 W& r; Z% ~& ]4 c
8 ?3 w$ y' \0 d# ~0 \- I7 \
  CATMathPoint Point3D;; C- p. M: ~; C8 O! }% h, d
  CATMathPlane Plane = _IndicationTwoPoint->GetMathPlane();' X" _& X3 u" y% v) ]1 L
- U2 x  K" w$ T" `# q
  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点
% i) o. ^; i  i8 a6 F8 [9 q6 g
, Y; _2 K% W  f7 m: e" y9 Y! X  //设置Container(非根节点)5 v, {; E: T* v( c
  //获得Editor& d. M5 c8 \4 c! ]
  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
9 ?- m  L4 ^+ w  O
3 T' |, F1 L8 E( R  U0 W  //得到当前对象的文档
6 _/ L; x6 W: m, ~& A( y  CATDocument * pDocument = NULL ;
7 c( J$ B! U. `) a& Z; A, x
7 Q  d0 J3 A5 _( {3 U. K3 m0 \. w  //取得当前活动对象8 O0 j) o* H& o. D
  CATPathElement activePath = pEditor->GetUIActiveObject();& q% H6 t! x- C  M
/ c, _2 C! @, [  P6 V' D
  //取得当前活动的product! }+ d# O* J- U" p8 S
  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());5 p7 x  C& j1 |3 V- Y
9 ]1 t; v4 r& }! }
  //当前活动对象不存在
" ~( @" t- Z' {6 A: L/ k3 g  if (pActiveProduct == NULL)4 j: d* l5 ?$ H4 F  R
  {" I3 O8 Q3 h) X* W5 ~, l' o% r
    pDocument = pEditor->GetDocument();
! O9 r! I( @2 L( d  }
5 H: W0 n3 L: g2 q! P9 ]  else
- O" c: d& y( X5 d- W* u  {3 x2 q$ l# \, X; R/ L7 @' I
    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
1 l9 U: J# U+ b$ L) D, N- O- ?    //当前对象的引用对象是否存在
2 x' D, [8 y8 O# f1 N  k    if ( NULL_var == spRef )
2 u  H- S1 J' D! t( J+ I    {2 _4 X+ u: Y8 S$ \6 D3 N9 E
      return FALSE;, s, ^9 @) u% K( C
    }( A3 u, ~3 A: W" X
) s( e% j  }+ J, r
    //当前对象的链接对象! p+ w+ d2 e$ z+ y2 ~
    CATILinkableObject * piLinkableObject = NULL;
( o( L9 I+ [# T    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                            2 g& P/ C& k1 ?$ y! H% I5 n& [; d( ~
    if ( FAILED(rc) )% ^# x# x' d1 K1 y; @3 r' d% x+ d
    {$ j( \+ |/ D7 P
      piLinkableObject->Release();5 S  h& X0 |9 Y( u
      piLinkableObject = NULL ;
! i  ?+ p. W2 M0 v. W      return FALSE;
  C6 d4 ~& _% N7 h3 ~    }) \! J1 i7 i6 p4 u- m  @3 M3 \

  x9 Z+ H2 O3 |( @3 _    //得到当前对象的文档* J0 S' ~+ B5 b* x
    pDocument = piLinkableObject->GetDocument();
( d' J, i8 Q1 ?  M5 Y' c. l9 C    piLinkableObject->Release();6 H3 G, |2 N3 e$ B* v
    piLinkableObject = NULL ;3 a' M% v! W7 H
3 y7 r$ L6 o9 Z4 p' ~- f
    if ( NULL == pDocument)
6 o4 N# Q% ^+ `# A+ }4 d+ a' L    {
  k1 g2 Q4 ?5 A: |; ]% n9 P2 `( N      return FALSE;+ G! u. m( ?: U- D
    }
" V% D6 {; T' N  X2 @( p2 e; d7 {  }
- k# S+ T; x: J. f3 I! k0 }
9 C* Q' ~1 f& H" g) t9 z  //得到文档容器集+ K- l8 @5 r3 N! c  q4 m
  CATIContainerOfDocument * pIContainerOfDocument = NULL;% p4 \0 d2 j! S* [
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);
3 v7 \' c- o4 t5 x; v) v7 M  if (FAILED(rc))
7 T+ q( O4 W6 {* w) T" G  {
' \6 \% p5 {2 s( ^4 D( e# @    //pIContainerOfDocument->Release();
5 z7 O7 z( X8 S+ U( h7 R4 `    pIContainerOfDocument = NULL ;; L  C# K# S0 V/ O+ r
    return FALSE;3 w) Z1 b3 W+ K) m
  }7 B& X1 {7 m. P8 K2 u! ?% h  A

# g& N( \0 ]6 C  //获得Document$ r2 Q) u- Z! A2 b% j. `
  CATIContainer* _pContainer = NULL;        + y7 ~$ ^% u, w+ b+ R
  //获得SpecContainer
6 A  e$ _% Y% q% ~; v9 }  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);: x3 P6 y0 v# G; O6 x  U6 y, z
        8 D0 n: e: e3 X8 M6 L
  //GSM工厂* p* A6 h' ?! \" Q
  CATIGSMFactory_var spGSMFactory = NULL_var;! h' ^- d, @% r2 A) f
  //设置工厂                ' J! j- O: L& E" B+ ]. F
  spGSMFactory = _pContainer;                                                                       
9 r4 t& X8 }% B3 v. {" Q
6 L4 L3 Q; o4 J; I  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);
' X" Z7 [8 [: C+ s" q$ b) v9 U, {  ]. r. `5 H" L/ A# ?1 `5 v& s' W
  CATISpecObject_var spSpecPoint2= spPoint;                                       
# T$ r& j4 }5 n1 R) E* E1 g* V. Y4 |3 i& Q4 \
  CATIGSMProceduralView_var spSndPntObj = spSpecPoint2;. I' ]* g; `  L$ q5 `7 P" f

' K0 W+ N5 W9 v  //*将点显示在屏幕上
) C# ]6 e" g! L0 u2 m8 ~" C  spSndPntObj->InsertInProceduralView();' |) |; V2 ]' I8 i5 c) X$ d

1 Q1 R% A' C( s! _  spSpecPoint2->Update();
$ V: a$ o& o' u: ?% P, @" T: ~$ d, K/ c) p
  //生成线
. o0 J1 F; \" T! m& p6 _  CATIGSMLinePtPt_var spLine = spGSMFactory->CreateLine(spSpecPoint1, spSpecPoint2, NULL_var);" {! w$ S) u, B1 }

- J) Y) O' p. \1 w/ H  CATISpecObject_var spSpecLine= spLine;                                       
5 t9 Y1 N6 a* E4 x" Q+ t  n( v) G
  CATIGSMProceduralView_var spSndPntObjLine = spSpecLine;
1 ?& U% I5 ~# g9 @- j- R
# H% d6 A% s# {; m  //*将线显示在屏幕上
, A) T4 n) m% _  ^# M( l4 O  spSndPntObjLine->InsertInProceduralView();6 x' Y6 w& l9 I- C
5 }* V# P% s$ f! `( S6 ^- l
  spSpecLine->Update();) [; K+ H: p& `0 x6 Z
# J# b: `3 X- ^; _! D
  return TRUE;
9 ]; R( r+ U0 u2 ~( K}
; j+ [1 l4 n& s
. t4 d" }+ c" d
; k1 F# R6 Q" V' C# v$ @
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了