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

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

[复制链接]

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

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

admin 楼主

2017-4-17 21:56:09

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

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

x
  W2 V# h& H# c, u1 V
Catia二次开发源码分享: 通过鼠标点击创建直线) l; W1 G- D$ s# \/ F0 E# D
8 v! ]0 _/ M$ h) a
( `& v) B  {0 J7 J; o6 L* b! v
$ o1 Y' i) f' T
#include "CAARCCreateLine.h"& b" G! c% @8 r) y& n6 N
#include "CATIndicationAgent.h"
! _% U! W) A' _1 e6 m#include "CATMathPlane.h"
" U" K3 x) O1 h6 E  `- i4 T# ^& q' n; `, y
#include "CATCreateExternalObject.h"
$ Z/ [4 t, \8 u1 S$ g# |& W
2 V4 B5 ?9 E6 s' g9 a3 T( j#include "CATMathPoint2D.h"* `4 C! b6 R* D
#include "CATMathPoint.h"
, M8 _+ i; Z% f( f#include "CATMathPlane.h"
7 G  _. w% c5 ]" m1 f& S: u$ w; X7 {& x1 c
#include "CATIGSMPoint.h"* y. M! u+ S6 g% V. g: L
#include "CATIGSMLinePtPt.h"
8 H( D$ g' Z( R, O% L3 O% T! K& j* [* ^5 g! f
#include "CATFrmEditor.h"
3 l' \4 r' s0 i" A6 f; f- g0 y#include "CATPathElement.h"
! r9 l0 n  V3 u
! L' F/ M0 a0 ]#include "CATIProduct.h"
& U' j' h. S# X  {0 `. L% w4 ?#include "CATILinkableObject.h"2 I: P! ]0 L/ j# c. w5 c9 |
#include "CATDocument.h", [3 U, e; i0 Z

+ h9 V' d8 E7 `" D& ?7 b#include "CATIContainerOfDocument.h"
& a/ h* L* X- e3 ?
2 j) I/ ]! g  s) a#include "CATIGSMProceduralView.h"
1 l& q' M, K% H7 b: k; M. ^& P
/ T/ X+ L  B3 H* y#include "CATIContainer.h"8 p- W  l& t5 O
#include "CATIGSMFactory.h"
# E$ ]1 I- Q6 y0 i) H  _5 c5 l/ I# c5 D  X; |% T/ z
#include "CATISpecObject.h"
! j4 a: v- T' ^, T* v" ^CATCreateClass( CAARCCreateLine);
/ _/ S) ]/ z: k! f1 Q7 e2 p) Q# P5 D  I. O6 f

, P  C* a# C" F* m# y//-------------------------------------------------------------------------% v/ [* d+ H% Y5 J# p" K
// Constructor
8 e+ j8 I6 u& a' f' c//-------------------------------------------------------------------------' N4 c( b# j  M. w
CAARCCreateLine::CAARCCreateLine() :
9 }+ V6 W& W8 X  CATStateCommand ("CAARCCreateLine", CATDlgEngOneShot, CATCommandModeExclusive) 6 c1 Z, e4 L) r$ X2 q' N
//  Valid states are CATDlgEngOneShot and CATDlgEngRepeat
, g6 t0 `2 ~$ E% ^+ T2 X: \$ ]  ,_IndicationOnePoint(NULL),_IndicationTwoPoint(NULL)* C* O: _5 K& h; `* P% B, j$ f
{5 K! B2 ]* _* h) W7 n
}
, h+ s+ g. b* V7 B! V. \- U& }7 |8 S* O
//-------------------------------------------------------------------------
8 w$ X1 n5 C  k. E$ ^) M// Destructor
% e% C+ |1 T1 J, v//-------------------------------------------------------------------------: J2 q! q! |9 S( `. o+ K$ o  g
CAARCCreateLine::~CAARCCreateLine()3 _- {8 _5 z! M- ~
{( u: U$ O' j' ^. D9 X& k3 \
   if (_IndicationOnePoint != NULL)
; c* e/ v) n6 {, e, \+ s9 g+ e. X* H      _IndicationOnePoint->RequestDelayedDestruction();; v% N6 }6 W7 [& R1 _3 Y0 F4 W
   if (_IndicationTwoPoint != NULL)
1 r, f  k. f# J' z4 k* `     _IndicationTwoPoint->RequestDelayedDestruction();
3 c4 j! G& \3 `. i* F; S}
' i+ M) _1 @9 l8 x2 K4 U7 s4 t; y3 H: _

% E* @; d$ x- z: }% r8 E! |//-------------------------------------------------------------------------
. E1 h  X( y; I3 P" R// BuildGraph()8 F' c' K* F) F, @/ i
//-------------------------------------------------------------------------
) N' p2 `( \$ F" nvoid CAARCCreateLine::BuildGraph()
8 Z1 o) m( Z  W! e2 p6 M{: e( c; C! r9 w, ~& \6 h

+ t, c: y3 b0 u6 u9 `7 X; s8 m8 x+ s! w- Q0 Q% ?1 a4 i7 j' o
  // TODO: Define the StateChart % F$ p; V! c+ x; y6 a' i* M; F: T
  // ---------------------------; n! U: ^% P0 R% Z7 o
  _IndicationOnePoint = new CATIndicationAgent ("IndicationOnePoint");. N1 t" R! e2 C4 V$ i
  AddCSOClient(_IndicationOnePoint);
, v1 m; W: I) w9 B* l. f# C( \+ n$ r* _  h) R$ L2 F8 f' q
  _IndicationTwoPoint = new CATIndicationAgent ("IndicationTwoPoint");4 y' v* v  d: n, t$ R) t
/ G/ a' x5 Y: w' U9 m
  CATMathPlane PlaneXY;
0 Y$ P* n1 d) T  _IndicationOnePoint -> SetMathPlane (PlaneXY);
  V  D: n* ]0 }/ E- [  _IndicationTwoPoint -> SetMathPlane (PlaneXY);
* D! [/ B: B9 J
" u0 [1 @6 q! P, L( X" E% N! d  C- f  CATDialogState * initialStateOne = GetInitialState("选择第一个点位置");* u$ u/ i8 I" h, }/ h' A
  initialStateOne -> AddDialogAgent (_IndicationOnePoint);4 a3 ^4 Z- m' @- r/ u: S5 o
7 p" `; M* q, m3 H* |2 \% q
  CATDialogState * initialStateTwo = AddDialogState("选择第二个点位置");  T: U7 O2 }0 w: l* |2 w  A
  initialStateTwo -> AddDialogAgent (_IndicationTwoPoint);
- N% Y) [  ~; l+ T' }+ T" z9 G$ k/ c3 G) Y( c& ~
  AddTransition( initialStateOne, 0 `% j) O3 h/ c- m4 {8 ?; `
                 initialStateTwo, ' _8 z9 K0 [8 C8 E& Y
                 IsOutputSetCondition (_IndicationOnePoint),
  x  E* _* v/ i2 i$ s; ]1 @                 Action ((ActionMethod) &CAARCCreateLine::ActionOne));
5 N3 U, j$ ?7 d  @/ S7 C
# Y+ }5 L8 u) r4 [- I5 q8 M& B  M  AddTransition( initialStateTwo,
& t; s- y/ u$ X8 u4 I# m& a                NULL, & |4 Y- f2 T8 Q8 U8 ~  A# t# |" W% w
                IsOutputSetCondition (_IndicationTwoPoint),0 a- L. a- G# J3 [- t2 x
                Action ((ActionMethod) &CAARCCreateLine::ActionTwo));! h; Q1 T$ H, J6 {" g! E5 i
}+ r* I4 Y1 D6 {* p4 t

; `  m8 n$ W# m- W3 y' c, X; P9 p# K
//-------------------------------------------------------------------------9 i, h6 ~! P& o' l. L) E
// ActionOne (): E* ^' i3 M/ |3 A
//-------------------------------------------------------------------------7 J1 X6 l  ?3 P" D9 i6 E
CATBoolean CAARCCreateLine::ActionOne( void *data )# ~- k4 y% @) E, }
{
2 N8 t5 R- A# K% }8 ^& @, f! @& |  // TODO: Define the action associated with the transition 2 ^( C9 n$ Y) }" C2 y( k4 U6 h* P  u
  // ------------------------------------------------------
! w; q2 b; K; D$ Z6 \2 a$ ~  CATMathPoint2D point2D = _IndicationOnePoint->GetValue();//获得一个2D的点! q& a7 ^  l  F7 n  d. g

6 I& w& k( H' r' r3 ]# K; @  CATMathPoint Point3D;( h. o  q5 N3 v$ p
  CATMathPlane Plane = _IndicationOnePoint->GetMathPlane();2 v/ Z9 [' w: Q$ I" D0 X6 S

- k8 R  W' `) S  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点
# q4 b: Q( ~* \4 }6 [7 A; ~
) `8 `8 @) |% a/ k; {  q  //设置Container(非根节点)4 j# v8 e& j- }# v8 {5 [* P. P
  //获得Editor
! H4 a& Q8 @  Q  q) ^  U  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();9 j' @5 t1 {7 Z
% I/ A$ W0 |* K6 j! D1 e
  //得到当前对象的文档0 N2 w: i& W# R6 I% i" S9 K' h
  CATDocument * pDocument = NULL ;
' }: p/ V  O" ^! X9 x: `$ _
1 H5 t+ P* P8 ~( n, C  //取得当前活动对象0 d$ j! v5 B: K, e7 Q
  CATPathElement activePath = pEditor->GetUIActiveObject();
. ?2 O7 j3 c+ _. }
4 W5 B, A2 A& `7 K, i  //取得当前活动的product
$ r/ q# s! g- N  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());
  C. g5 k+ t% H  t2 v. s" @, n1 R
  //当前活动对象不存在" [' ]% ]8 D$ k/ @
  if (pActiveProduct == NULL)+ ^) h4 l7 S* Q9 ?% b! C5 s9 O
  {( l' {+ m/ N" e# W# Y% S7 X; L7 j
    pDocument = pEditor->GetDocument();
6 x* c1 N5 e* d" i' z& u  }
1 d: @4 h. T- F/ X: B  else
  C0 V7 F9 T" X/ c1 _7 o+ Q1 h2 D  {
0 N$ s/ \4 E( ^, T/ B    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();, R0 A5 O& h+ d7 e$ u* O2 S
    //当前对象的引用对象是否存在
; e6 y7 ]: d, a, S    if ( NULL_var == spRef )
3 x$ `5 A) I/ A" o    {
) y7 Y2 ^9 Q% ], ~. L/ @: N' ~      return FALSE;$ }; X3 S, s9 }9 i. [# a& P' d) K
    }7 ~3 X% D0 J/ l$ ~) I

( F. Y. I1 V$ b    //当前对象的链接对象0 G# a1 Z& T5 m  O5 t! ]3 c4 B2 }2 n
    CATILinkableObject * piLinkableObject = NULL;
" |/ z! H! ~8 X( S- M. o    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
4 x# P" i- g# \3 @    if ( FAILED(rc) )& V) U0 g) r' F8 s6 i) a
    {6 |5 w; t: i) V  j0 _$ [
      piLinkableObject->Release();% N2 h& L8 y$ n
      piLinkableObject = NULL ;
$ X, j) U1 d0 N+ v3 g6 Y      return FALSE;
6 v1 B/ l( Z0 x6 j* \( ~    }; j; k' t9 e, X; D8 h% |

. i& y1 @) S, V. p- y, O  k  A' Q    //得到当前对象的文档& r/ _: d! _) D9 P5 f
    pDocument = piLinkableObject->GetDocument();
( G5 h8 q6 Q+ e) [, b  e    piLinkableObject->Release();
' H+ W% G+ V9 [8 S8 s1 [* |0 v/ |    piLinkableObject = NULL ;: M/ _+ O. N# Y7 }

& Z7 ]# m1 s2 ~/ c8 V2 L    if ( NULL == pDocument)
. z2 x; V, k) j8 J    {
! J  \/ |! G+ o7 ~      return FALSE;2 h" _- k+ \7 ]. M/ s1 j+ a
    }
, x) X" p: m: }: y% Y# ~  }; m$ J, q0 M0 _1 [2 K

/ A+ P, ~) M- O: U" M  //得到文档容器集, h- r( k. |) F2 C( \4 l
  CATIContainerOfDocument * pIContainerOfDocument = NULL;
9 c" L& c  g% A6 Z; q) j  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);; S8 D3 X2 ]' Q, Z' v/ C
  if (FAILED(rc))$ U) ]; k2 N) c0 A, F8 g1 z
  {1 |+ I- @* _) g9 C9 @; H
    //pIContainerOfDocument->Release();
4 R, t. I5 P0 S( a2 [8 M( f! G    pIContainerOfDocument = NULL ;1 r1 x' _- ?- a$ {: Q; V4 _8 h
    return FALSE;  F* _; N4 ]2 E6 J
  }* j* U' M( t* x: m/ l
+ g5 ?) u/ L( h, v8 `5 J
  //获得Document
3 U: I- t, o) M/ Z* ^) P# Z  CATIContainer* _pContainer = NULL;       
3 i/ n1 J# o% s, m1 M& s& z/ z  //获得SpecContainer
+ h) o, P  X! m1 Y+ m7 y: n1 r  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
0 @% S: P& \( h" G1 Y       
/ a: V4 I# C5 R8 ]% h/ _/ M  //GSM工厂
) T; F% o" R" c0 m8 a  CATIGSMFactory_var spGSMFactory = NULL_var;
7 ~# i' _: Z. a# {2 e9 w! `  //设置工厂               
/ N7 `9 a& F7 o: r  spGSMFactory = _pContainer;                                                                       
0 x* b: ?8 N* ~) z+ u: P) g9 O* Q; F' s. R2 B& y( a2 R" ~; B' A+ {
  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);  }" E1 M& V& }! ?  \

( F, b# l& E( q3 [9 ~1 |) o0 K, Q1 c3 ~  spSpecPoint1= spPoint;                                       
: B( F9 `7 J6 L8 Y7 Q" {" Z  {# V: o( }: ~6 f
  CATIGSMProceduralView_var spSndPntObj = spSpecPoint1;
; E; L. F5 w8 `: S5 N, t4 C
# B- k- J2 I! \! ~. S( w, A# L% f  //*将点显示在屏幕上9 v2 K7 {4 {/ }# P) b
  spSndPntObj->InsertInProceduralView();
' h: j! a( e& }" X
' K. a& V& F) I4 p8 T$ L0 G9 v  spSpecPoint1->Update();
( f0 I  T$ I, d* K3 m
+ q2 R! r; j7 Y$ ^4 B' i  return TRUE;
8 M% O1 ]0 y% @3 C! ~}
* v: ?1 z5 U+ P* V/ o
5 R, y& J+ o; W) U' A* G# b. N//-------------------------------------------------------------------------# _. Q4 O/ z1 w+ n7 x
// ActionTwo ()3 t" ?0 }( s1 B
//-------------------------------------------------------------------------) G3 q7 i# E  h& Z
CATBoolean CAARCCreateLine::ActionTwo( void *data )) f1 K6 j! [- P  \& L6 m; Z( p$ c! ]
{& V0 I0 r$ o5 g; C0 K# F
  // TODO: Define the action associated with the transition
3 O+ z! N# l6 @  a, p( e( m& J  // ------------------------------------------------------
8 s/ {+ {: d) u( v# w+ d, F  CATMathPoint2D point2D = _IndicationTwoPoint->GetValue();//获得一个2D的点& b/ N3 |2 B+ x0 R/ @
" m: w3 d9 o& \4 A
  CATMathPoint Point3D;
! c8 K6 a4 @. P/ s6 \6 \  CATMathPlane Plane = _IndicationTwoPoint->GetMathPlane();: Y3 S9 b' c: d, e
$ ~& p) Q6 R8 X& M
  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点
! {& D& M  }6 A) B6 o7 g0 q
& A5 J7 _- |. R  //设置Container(非根节点): Y6 \! R  Z* J! B7 c
  //获得Editor
+ T1 \: s8 e; _  Y  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
% V1 Y; j3 V) D  E' E% H
- a; Z5 m- `. F; F+ }5 h$ H  //得到当前对象的文档' B' N) P/ m' t$ \  S% Y, P" N. r1 `
  CATDocument * pDocument = NULL ;8 e4 T5 l1 i: ~3 l, J8 G& h6 y9 N
' v) T5 w1 {+ @; H( F% o0 d
  //取得当前活动对象
& C+ x/ _4 b1 O" r  CATPathElement activePath = pEditor->GetUIActiveObject();3 K7 [( ?% |  m8 X

3 }) {+ [* e6 _5 k5 g  //取得当前活动的product
2 b+ |1 C+ u: M+ b/ R5 W; g  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());! s% z) W) v1 }1 y5 B% `0 U
* |4 Y) _  b5 `" l" O+ ?
  //当前活动对象不存在
0 [- O. d& y( n# N7 J+ o  if (pActiveProduct == NULL)! \9 g% j" `) w. y: D' m% R$ j
  {9 k5 ~  t4 f) u% h* U- I3 A5 v3 }
    pDocument = pEditor->GetDocument();
2 I! N4 l2 E, h* Z  }; j8 ~8 N* w; x# y8 j
  else
" ^- J1 [' j3 {" s4 G" A4 P' f  {
3 Q7 k4 ^* E4 Z2 `4 S) i    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();' p9 _1 [/ I  L2 ]& n
    //当前对象的引用对象是否存在
" e2 ]6 f# y3 u    if ( NULL_var == spRef )& P- [- V0 s, T: t9 a8 x
    {$ B+ `  U* q( ?* P7 O( B' N
      return FALSE;
3 m( c0 x' X3 f' d/ Y- \7 K' n    }1 t% A" D8 t  k0 W& v

# s! F' O5 [) z+ I$ ^. t    //当前对象的链接对象
7 F7 P' w, U8 Z% @* g7 G    CATILinkableObject * piLinkableObject = NULL;3 H, I; h" P# f% x: P6 D
    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
8 l: z1 Y7 K$ G0 w* X    if ( FAILED(rc) )
' j( w+ R  S0 [' ~8 `. u: V    {( a4 |8 h# j3 P: A, ~
      piLinkableObject->Release();, F% F- Z4 u: W
      piLinkableObject = NULL ;$ [8 a: V, H1 F0 X, ~% C
      return FALSE;7 J) i& _' E, b! Q$ H& L7 b
    }
  F& z/ ~' x, K4 c2 t0 B# p
* G& S  F$ m2 B& D: _' ?8 e    //得到当前对象的文档7 b# P. M" P& W0 z& [& D% u3 `) z
    pDocument = piLinkableObject->GetDocument();% Y/ s! f, b1 y: p* g" v5 U6 z: W5 y
    piLinkableObject->Release();% g' A3 [2 `( Y6 q. p. |
    piLinkableObject = NULL ;. a8 K5 ^: n0 \# N1 G2 M
$ `4 A1 w7 \( K
    if ( NULL == pDocument)' G) K) @# t8 V# Z: p9 \0 b# Z
    {
0 p  O( z5 u8 C$ R7 A9 f      return FALSE;/ i0 Z, v. N" a3 H% Y
    }& S6 O# ]; B" L3 K6 ]) n
  }5 Q. Y: V$ [( [& V5 D1 s. `  Z& g

; i0 T- {9 P% Z! y9 t  //得到文档容器集
5 j( ?+ S6 v! y* a0 K4 ]9 m  CATIContainerOfDocument * pIContainerOfDocument = NULL;; j- B6 D. ?4 X6 M6 A, n1 a
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);+ R5 v: C: B4 D' \. ^" B
  if (FAILED(rc))6 \$ X: {) Z( R) L" Q
  {
8 S; {' J5 l- d1 z    //pIContainerOfDocument->Release();# Q3 s) W4 d) n  p( g
    pIContainerOfDocument = NULL ;) u1 ]3 r+ X# I+ f  M! i4 S
    return FALSE;+ a2 \( k; Z2 Z
  }
2 F# Y2 M9 r4 F9 F% f) g1 M, v- T. u# [3 P5 X
  //获得Document
9 X" q* C( x6 R+ m  CATIContainer* _pContainer = NULL;       
' F6 E9 A1 f& [  //获得SpecContainer  x, z" e% i# |, _- r: g: _# j# z
  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
4 {/ ^! d$ i) k+ E7 L( F0 _       
" V/ f0 q: p' O) n+ H7 R) C$ B  //GSM工厂4 e9 B2 S; `$ U% n
  CATIGSMFactory_var spGSMFactory = NULL_var;# A( A; L' Z# c  B5 E
  //设置工厂                  A9 n8 a& Q; L& r4 l! r- O% l
  spGSMFactory = _pContainer;                                                                       
& P1 Y& Q/ J) Y6 X5 O
8 E: _& o: m3 M# \. z& P  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);
9 \5 W; i" k  |* f6 R) E" Q. p: J$ t) w. e: e+ t7 p/ p
  CATISpecObject_var spSpecPoint2= spPoint;                                        ! T4 }" s/ A% g+ {8 k( e6 T9 m& J

' [8 n" t5 {! C* ~( e' u  CATIGSMProceduralView_var spSndPntObj = spSpecPoint2;
( b, ^, u1 B6 \
' k/ Q0 w9 i. x6 w- F9 |  //*将点显示在屏幕上
" X0 a9 o  }' c; i: C; P9 C( G6 m  spSndPntObj->InsertInProceduralView();
' D0 ]: ?7 J4 T1 s/ w8 A7 T! t8 {9 A$ q8 v4 G3 k
  spSpecPoint2->Update();1 ~2 W3 p8 A/ W) Z  S# ^
3 _2 T$ U5 h( p  w/ f" r4 J
  //生成线
0 L. e0 ^7 [1 C; W, z  CATIGSMLinePtPt_var spLine = spGSMFactory->CreateLine(spSpecPoint1, spSpecPoint2, NULL_var);+ x  a+ C+ |0 ?; v) R
. U1 Z8 Y& c) K2 l1 [* h3 H
  CATISpecObject_var spSpecLine= spLine;                                        & `6 p0 |( e" Z
2 k0 U8 x* ?! [# Q5 X, p
  CATIGSMProceduralView_var spSndPntObjLine = spSpecLine;. A, S; g. p$ R5 H# E
, a# m0 V3 D( c4 x4 G2 J1 V8 |
  //*将线显示在屏幕上
9 V; p* o5 ?7 R! I4 ]1 t1 W  spSndPntObjLine->InsertInProceduralView();
. {- L' \1 E' S* B' g. u; P( j3 [; J" W6 x& ?1 ~1 ~0 x5 P
  spSpecLine->Update();# Y3 O+ d' y; l2 R8 b. o

% `! g, P, S# L/ m& S( `- Q& R: e( N  return TRUE;
% Y2 y1 `5 i: h1 w- l( c0 c1 A. @$ ?( W}
- B6 c, H. z" q( K. @
: F# _4 X3 h! i1 `' ?2 b+ E6 H+ o: F/ _+ m& _2 y
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了