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

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

[复制链接]

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

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

admin 楼主

2017-4-17 21:56:09

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

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

x
0 w0 ]: q" m/ [* X* w1 M9 ], q
Catia二次开发源码分享: 通过鼠标点击创建直线9 ~2 T! |7 I& U7 ]
& C1 U; C) `, e/ j8 u1 G( z

0 V- V0 K4 P* X6 o6 v' z) V3 s
0 H+ ^% X+ V  ~$ P#include "CAARCCreateLine.h"  f1 I" \5 B1 \7 F( D
#include "CATIndicationAgent.h"* R+ n* m' T4 c' {: f
#include "CATMathPlane.h"
. M8 ?- @: r# L( t, v( w; {. N0 h/ N& I: d) v5 e& f4 Z
#include "CATCreateExternalObject.h"
' N1 u% i) A) a: x- z: i# S$ K9 p- W% g/ c# x
#include "CATMathPoint2D.h"6 I" d8 g% m& [
#include "CATMathPoint.h"
. T* w2 {/ s# w% d( `. ]; _#include "CATMathPlane.h"
& o2 }! Y* |. Z& R" M# s" P" v; v( R! b3 S2 J
#include "CATIGSMPoint.h"
) S1 E9 K; w5 a: E9 s2 s% _# V3 A, j#include "CATIGSMLinePtPt.h"
+ J$ H( E4 W( y5 q& p5 A  a. A: d9 V3 M1 u& |1 C
#include "CATFrmEditor.h"
0 O# I* |9 E5 W: R9 c1 ?#include "CATPathElement.h"7 I2 ?0 g2 N+ A; E2 F
( v2 E8 R% w% T/ }; C" O( Z
#include "CATIProduct.h"
+ J- x+ o4 a% [# M#include "CATILinkableObject.h"7 g5 v: e! W  F
#include "CATDocument.h"
  t$ i' w! ^- M3 i2 {+ g0 w4 ?; k6 a: R  W; o  s& u  d6 T  L
#include "CATIContainerOfDocument.h"
% M8 U+ E8 s# l) A. w& R4 T3 B6 i  |+ u0 Q  U+ Z
#include "CATIGSMProceduralView.h"
  w, ]* Q( l0 C( ?* b- c2 R' f3 j4 C+ n7 N. W) c/ @7 j# {0 V+ s
#include "CATIContainer.h"
5 m4 N  ]" _1 X( u2 u* d5 Z#include "CATIGSMFactory.h"3 N  k1 j. ?/ M7 ?' Y) p  O
+ i( c# O1 @" x# z* O
#include "CATISpecObject.h"
" K7 P2 b+ `: VCATCreateClass( CAARCCreateLine);! l5 Z8 G8 c2 k0 C: B

- C0 M2 f+ y1 u4 q: q
7 `: F- }' |9 i) M//-------------------------------------------------------------------------
7 a$ j( u. }8 L/ ?. W$ z// Constructor' L9 E1 W$ Z9 o/ N% B+ O/ n' a" s
//-------------------------------------------------------------------------
) p# K$ K6 I. [5 }CAARCCreateLine::CAARCCreateLine() :, \- _$ h0 m0 H- S  t( t$ M
  CATStateCommand ("CAARCCreateLine", CATDlgEngOneShot, CATCommandModeExclusive) 6 Z3 U! j/ v8 d* N1 v( j/ F8 l0 z! t
//  Valid states are CATDlgEngOneShot and CATDlgEngRepeat- @& w# L: v% I4 N( W
  ,_IndicationOnePoint(NULL),_IndicationTwoPoint(NULL)
% t# s0 B: g1 H' l& Z{$ B) |( ^" a8 R: P7 k6 E3 e# C
}9 \( Z+ N' Y4 X9 s1 ]. X! {" G* p

* F% [7 A( m$ Y# w: a( s- C//-------------------------------------------------------------------------; W. m# J0 a  s8 ?1 M; Y
// Destructor
& N; ~0 R5 |; @5 y' {$ J+ u//-------------------------------------------------------------------------
, `3 a( e; d/ @' i2 LCAARCCreateLine::~CAARCCreateLine()# D: `( S& I- q5 @2 z) A' ?- K
{
5 j9 ?1 j7 s' j; L) ?3 P3 H   if (_IndicationOnePoint != NULL) ! i8 F- V% A4 L' Y$ t1 z
      _IndicationOnePoint->RequestDelayedDestruction();
: X$ \; h0 _/ A9 O* D8 r. k) _   if (_IndicationTwoPoint != NULL) - K+ f8 I* J" b7 z: b) p
     _IndicationTwoPoint->RequestDelayedDestruction();
4 y) j8 w: h$ @8 F3 H, k/ c}( v0 d8 M. L1 ~/ M
2 m1 a" f+ ?. R- `4 i( a
8 N& _" A: i0 N  x; t' Z$ @+ M
//-------------------------------------------------------------------------: t; `6 N4 `, N/ T1 F+ m2 K& @
// BuildGraph()9 U9 h4 A' K) V! x  L4 g: B
//-------------------------------------------------------------------------1 a- @' k$ I; w; v
void CAARCCreateLine::BuildGraph()9 J% G% x* ]$ \; L* n! w! W; \% v
{
: Y2 z3 x3 ]! ^+ z3 x0 c6 P) H9 K* q) k  s7 x% I
5 t2 m; u4 Y- w. S7 u* Q/ X( m* I
  // TODO: Define the StateChart
/ [- p( C/ K# c6 _6 m+ O) q  // ---------------------------
- `: e9 l8 o" y# o  c  _IndicationOnePoint = new CATIndicationAgent ("IndicationOnePoint");
3 f: O' k/ C# ]& ]8 v' H, K% J  AddCSOClient(_IndicationOnePoint);
9 d# J! m- _# f: W+ }8 o! D9 c9 p6 k
1 O; J2 Z; w* Z  }) B  _IndicationTwoPoint = new CATIndicationAgent ("IndicationTwoPoint");
$ l  d! y" N7 L& m1 c
0 f/ L, j2 J& n; ~  CATMathPlane PlaneXY;3 m& @& N& P4 o' @1 H# V
  _IndicationOnePoint -> SetMathPlane (PlaneXY);
% B* h8 R# z# H6 u* L6 Q4 d  _IndicationTwoPoint -> SetMathPlane (PlaneXY);
$ x, v0 Y/ z+ ^4 q- Y2 j
/ V- w% X- x$ {6 ]2 T- o0 l  CATDialogState * initialStateOne = GetInitialState("选择第一个点位置");
6 F6 A, @" O/ Q$ N  initialStateOne -> AddDialogAgent (_IndicationOnePoint);% d- [1 {; t2 P+ K2 ~5 r

4 A# K: h' ]9 i7 [: T  u  CATDialogState * initialStateTwo = AddDialogState("选择第二个点位置");' T. m5 E1 T" `. _% b5 e1 z* \
  initialStateTwo -> AddDialogAgent (_IndicationTwoPoint);
+ s: j2 T$ {( y5 e- x0 P6 p- N7 a
; p4 |7 Z  p% i. D$ G8 s! A- b0 E  AddTransition( initialStateOne, 4 S  R2 {- m% f5 ?
                 initialStateTwo,
- Z8 w7 z$ W2 P0 U5 K) b3 P+ ~                 IsOutputSetCondition (_IndicationOnePoint),4 ?: M- n, X7 ?
                 Action ((ActionMethod) &CAARCCreateLine::ActionOne));  w/ t- U+ g! }) ?' j0 I
4 X9 }' {( g: p3 M
  AddTransition( initialStateTwo,
3 E* p5 i$ c( S( r7 Z                NULL, 9 o4 J' C: B2 l# h; g4 i; F
                IsOutputSetCondition (_IndicationTwoPoint),
2 p8 F1 S! s4 j! u; L" y                Action ((ActionMethod) &CAARCCreateLine::ActionTwo));
# R8 n9 N3 O3 i( O: c, _6 @  ?7 ?}
! r: R+ R% Q& r8 ^  p/ n2 G7 g9 E  q

& J) v8 Y' X& E) Q, T//-------------------------------------------------------------------------6 c' z' s# c& s# A" C2 A/ L: v/ _
// ActionOne ()# i4 ~: z  ~; ^. H! _4 s% H
//-------------------------------------------------------------------------
# Z  u+ |& s/ ?" I: b  |CATBoolean CAARCCreateLine::ActionOne( void *data )3 U3 x+ i! I7 X$ J/ Y
{$ z1 h7 J1 x' L2 q
  // TODO: Define the action associated with the transition
$ G6 ^1 D; q8 y: v. ]2 _& ?" `  // ------------------------------------------------------) h: ~5 a+ D$ O5 J* f" }7 q
  CATMathPoint2D point2D = _IndicationOnePoint->GetValue();//获得一个2D的点
! S' m. r  w. k+ u- A6 j3 w$ q% O) h& g0 m
  CATMathPoint Point3D;
; a. s  Z2 Z" }' R  CATMathPlane Plane = _IndicationOnePoint->GetMathPlane();$ t+ i2 E' C* o0 v; T" P  _& R
4 ]8 W4 R4 r# z, j) v3 u
  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点
3 D* |2 C* N; L0 U; V' C, h
9 M9 k; T8 Z& v6 {' c! S  //设置Container(非根节点)' ?5 |" t6 _: F& J3 i1 Y* z
  //获得Editor
" P9 r0 V0 r4 b+ f! ]: O3 g  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
9 n, U  L2 o- H# K$ Y* _8 w
, i5 y5 M. [4 Y7 W& A  //得到当前对象的文档
" P8 H8 }. w! _  CATDocument * pDocument = NULL ;
' u- W6 s0 g: g/ X5 ~+ f& `/ C' N% _7 N, B: z
  //取得当前活动对象
! Z( ?& v  b: y+ }: L/ G  CATPathElement activePath = pEditor->GetUIActiveObject();! ]& U1 E+ O. x9 l% x% n' p: ]

7 O6 A% M" W. x( F  //取得当前活动的product
1 M0 r; ~2 }; Y' |2 v4 s5 h  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());& V. m$ x. W8 M) p7 G9 K* |
) _! q  r: f& c
  //当前活动对象不存在
+ u/ z# N: |& M; j  h4 W; h$ B  if (pActiveProduct == NULL)
4 I, }0 P1 _: q  {
: z9 A8 ~# E5 N    pDocument = pEditor->GetDocument();
: v! Q1 m# n' \0 z+ k" C! U/ ^  }0 L; Y( t  t0 k- W
  else
0 i  M! \2 p. j( c  {! `" x0 p, o* S! j! R9 \1 W/ D$ h
    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
$ D, ]( X7 s' H; `! E. V+ `    //当前对象的引用对象是否存在1 Y$ E- k2 |6 }4 f% \4 W1 H
    if ( NULL_var == spRef )
9 v, p4 z2 e, H    {
! g8 U; O' q+ U4 |) `( m( {$ l  \      return FALSE;
5 p3 M7 ?& v" ^/ Y# |0 z7 `9 L    }2 j4 x2 R: s0 R' U6 `
  p5 V0 O2 Y! k, `7 t
    //当前对象的链接对象
0 l% @" v7 B0 @- V% T, ?: Q+ t" _    CATILinkableObject * piLinkableObject = NULL;4 q: L  _/ x& e0 \5 E6 d
    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
" b( E. \0 g# k$ M' n& k$ N    if ( FAILED(rc) )
1 ]$ c& N! n1 |9 Q' ~, U) C    {3 j8 K7 q5 G5 K( n. ~
      piLinkableObject->Release();+ W5 @; M0 e  i
      piLinkableObject = NULL ;% R4 B6 k  D% u- D8 R" M
      return FALSE;
9 }6 t  [) a/ q& [+ E    }
+ a" c" g  T* M  x" @" F. \5 x
% R9 c; E) f2 y6 i3 W- R% N$ y    //得到当前对象的文档
# I* u6 x! V1 v& q$ `    pDocument = piLinkableObject->GetDocument();
" v5 |" F9 r0 \4 t; W2 |' `) I+ _    piLinkableObject->Release();
6 }5 U$ }1 f: o  b    piLinkableObject = NULL ;4 C% |& `8 M) h4 {7 P2 a0 B6 {2 p. e

, q+ X! q5 u. O: f    if ( NULL == pDocument)
3 u/ V0 ]3 F/ |5 O& Z) w. C/ o; d1 ]! X  P    {
% ^- p* O' J& T# T      return FALSE;9 i$ Y2 |" P+ r+ p) ^8 u* {9 z
    }
) y5 t) X& j$ n& _% v' G" F( \  }
& y: }3 [' w! m  X% x
) R/ Q/ ]2 e  A; b' c, m! N8 p+ K8 A  //得到文档容器集4 x3 m' w1 q; x4 l: K* ^
  CATIContainerOfDocument * pIContainerOfDocument = NULL;8 I# }! `" s* ~% |
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);. c& ]7 b% I5 E$ `5 E
  if (FAILED(rc))
+ ]" p" |! I7 J# k  {* q- a" [- |6 T' r6 U
    //pIContainerOfDocument->Release();& U2 Y+ H3 g( u% r- b2 r" p
    pIContainerOfDocument = NULL ;; d- I  Y3 f  R5 ^4 f
    return FALSE;
: a; o" p: L1 x  }8 T; R% u- r7 {( A6 F  b& X

( H/ }: o# h. a' n  //获得Document2 W6 q5 }; H5 @1 n3 @
  CATIContainer* _pContainer = NULL;        $ n8 P2 R; r: R+ V2 [7 w
  //获得SpecContainer
* [+ n/ m6 [# Q  e4 Z4 ?$ w  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
# q: h# [; B$ S' h* I( S        : G4 U4 @8 p" G# J% X! M0 p3 b4 n
  //GSM工厂
: J5 F% m5 V9 q; [- o- D  CATIGSMFactory_var spGSMFactory = NULL_var;
% N% ?: R" l+ |* I* J/ I: U  //设置工厂                ! e3 R3 E0 r1 A) A% A# i
  spGSMFactory = _pContainer;                                                                       
. E1 X0 g7 P+ \! Q2 `, D3 }- \% ^' Y" {6 y8 j9 X1 L
  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);
2 {2 L" J  w/ A% [' {. Y  u
- ?- u( t5 t9 g* b( W+ e7 J8 J  spSpecPoint1= spPoint;                                        3 N9 t% [0 a* ^# n

7 L- c. z6 j3 C5 w: D  CATIGSMProceduralView_var spSndPntObj = spSpecPoint1;+ t( t) J3 d- c9 g6 j' S
; Z$ [) j8 j) M  n5 y
  //*将点显示在屏幕上
7 t( [* o; B) Z$ P1 G  spSndPntObj->InsertInProceduralView();" [% N* d7 x! A
% k0 S# }: D& }6 J- Z( C
  spSpecPoint1->Update();
  d" U4 J# Q  d, O! h2 q- f7 B1 v+ S( d4 [7 `
  return TRUE;
1 N$ L- v! ?9 k( f7 l}
- }  ~" D( W& R% Y( n" K1 G1 n( A
2 ?5 Y5 Z4 d" J9 B4 F8 f//-------------------------------------------------------------------------" N0 P& S) e6 x$ v7 Q+ {
// ActionTwo ()6 _+ i9 h& ]( D( ], X: B  ?
//-------------------------------------------------------------------------& J; H! D' `( d5 D0 t. q
CATBoolean CAARCCreateLine::ActionTwo( void *data )" h9 G+ X, G) V% w# b! O
{, [4 V& D; v  p6 U  C$ f, H7 g
  // TODO: Define the action associated with the transition * f+ ^; |. t2 E! h; @
  // ------------------------------------------------------: E, Q) D4 \( t& s) N8 N
  CATMathPoint2D point2D = _IndicationTwoPoint->GetValue();//获得一个2D的点
  C, J- R5 F. Y0 }' O, Q
7 k  {8 q+ Q$ B, r9 H" O  CATMathPoint Point3D;8 S8 ^" T: u: T& U2 [1 k) E
  CATMathPlane Plane = _IndicationTwoPoint->GetMathPlane();- K# d% r1 b: ^

1 o6 i1 m: L# Q# z$ |  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点$ X. A9 j" |; d
) n# p# ~- o, D) l3 Z) G, D& i$ A
  //设置Container(非根节点)/ g- f+ R- J* I' q5 H4 T( k* h% h
  //获得Editor, _: A* V. c% B" F% o8 i
  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
9 n9 y7 _. P; D4 s- z0 G. {3 M3 N" h$ K# r
  //得到当前对象的文档$ v2 c5 @5 M" w" O! q; e: i
  CATDocument * pDocument = NULL ;; t( }6 c- C4 m. Y
+ m3 x9 ]4 q# l# c9 C
  //取得当前活动对象
9 |- h( F7 ]- F. f% @  m% `  CATPathElement activePath = pEditor->GetUIActiveObject();' V  S2 j* [) B4 ?8 r: r( q' A! {

  w$ ^7 r: g- |3 l  //取得当前活动的product. Z& C" ^0 |9 l5 e  M, B, |
  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());
7 I8 Y/ _3 a" L2 D
0 g5 [" a! u+ u" U) K. j0 s  //当前活动对象不存在
# z8 J8 W1 i/ ~) g  H  if (pActiveProduct == NULL)2 S8 p, c9 f! I) z7 d* k% z. i" n9 N7 t
  {
- f7 l& t, y: c    pDocument = pEditor->GetDocument();
3 a! W: E" [- i3 F' h  }) s; P) u& ?+ K% Y
  else6 I, U5 ~0 I1 L3 B# [
  {- o! N" w6 [+ d' d  F
    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();, |, r% z" h6 c2 l
    //当前对象的引用对象是否存在8 t1 i5 S  ~, F3 D8 Z7 M2 [
    if ( NULL_var == spRef )9 P( x  p2 G6 G9 j3 y
    {
" h4 [. x9 [$ K3 a      return FALSE;4 u# u! n# C  R0 e; k) `( a
    }
) |5 Y* f' V6 c5 y& v1 {  M3 h' v6 W9 n/ p5 u
    //当前对象的链接对象
) V2 E: D: N: c/ Y    CATILinkableObject * piLinkableObject = NULL;
2 _8 g) R5 R" H( K( q  E+ E    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
) K( ?6 l- {$ e$ }    if ( FAILED(rc) )
/ W- }$ C- V8 a; P( j3 P/ \* ^' ?    {
/ W2 D3 j7 b* S. m      piLinkableObject->Release();( E% r7 D! r1 ~6 ?8 h' ?. ~
      piLinkableObject = NULL ;, v/ @4 n. X5 R4 ^: ^& B
      return FALSE;
1 c7 c9 F, c5 p8 G* n& m, H  z! [    }4 o, _9 }0 }7 u1 G5 S8 O; ?# _

' l7 H3 N) [8 ]  _0 f0 x  N    //得到当前对象的文档, v  a2 B& }7 g9 H
    pDocument = piLinkableObject->GetDocument();
* r; k: B/ f* u* J/ V    piLinkableObject->Release();1 G) H$ j. |+ s# {# I& M; n% N" B" b
    piLinkableObject = NULL ;' I" z  A0 h/ t7 I, w
, I' z1 `, o- B
    if ( NULL == pDocument)6 R3 [2 Z# o7 b5 m; _
    {# Y+ W" h8 S* U; e
      return FALSE;8 w8 o9 H) S. f9 K
    }. I% L, ~$ |5 r, P
  }
8 Q/ B0 @* }* V+ {8 e( B3 T/ t9 W1 C( p: B7 ^
  //得到文档容器集
0 l+ \, R* q. r4 d3 h8 ]6 i  CATIContainerOfDocument * pIContainerOfDocument = NULL;+ \1 e: W' e! d
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);
% L, \$ n7 l6 D5 S( H  if (FAILED(rc))5 F- r8 r% z" d  f/ k, M8 w% T
  {+ s2 ]# w$ A+ c
    //pIContainerOfDocument->Release();
2 k) M' d( t# {8 x. }    pIContainerOfDocument = NULL ;
. @2 v: A' p! y0 _3 D    return FALSE;2 M) T% r# |/ U% R% y
  }5 L# m, h/ J6 M1 [2 O0 H
: k* c6 o! g) ]# |; N: d( u/ u
  //获得Document+ s% y) h4 A3 {! n+ Z
  CATIContainer* _pContainer = NULL;       
7 G8 Z) ?8 @4 }, B3 ?  //获得SpecContainer
5 y0 G( i  K& h  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);5 o5 N; ~  [2 q7 {3 v
       
  x' W7 M  Y! n3 Q) w1 N  //GSM工厂8 {, y* \  t; H* I
  CATIGSMFactory_var spGSMFactory = NULL_var;
5 ?: j( h1 G& C  //设置工厂                3 I! g3 I2 H  Z8 l- z% ^- L
  spGSMFactory = _pContainer;                                                                        + |2 n7 L( d# }; S" P, ^: D
7 C3 S; q5 u7 j) b
  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);; t0 A5 P7 N/ t! b6 B3 m7 Z# ^

" T" ?0 `. z' h/ j/ C4 M  CATISpecObject_var spSpecPoint2= spPoint;                                       
: }& w9 L3 f, N% p# x4 B' m
' b) f3 h- v$ I  X5 B$ ~* y  CATIGSMProceduralView_var spSndPntObj = spSpecPoint2;
( G% \& e, f) {0 y
4 d  d  e2 A7 w  //*将点显示在屏幕上$ g% G8 A# B9 o/ L. z5 ~* E& g
  spSndPntObj->InsertInProceduralView();
% j) P6 |: {  P/ `4 F7 V$ [% ^6 y* E, S+ Z' i9 T. Y
  spSpecPoint2->Update();
* V+ ~( ?% Z4 l& [3 I. ^, ]' }( L) R0 L% ?
  //生成线
9 ]. O# z. Y7 d, l  CATIGSMLinePtPt_var spLine = spGSMFactory->CreateLine(spSpecPoint1, spSpecPoint2, NULL_var);
0 ]& i( d1 T3 h" |" Z
) w; H9 B* h. i  O, `0 {  CATISpecObject_var spSpecLine= spLine;                                        % c' a/ ?1 h7 H3 H

  w# ~7 F9 A1 t  V% v# I: e/ N  CATIGSMProceduralView_var spSndPntObjLine = spSpecLine;
* {5 o: J3 u/ _+ B  D& l' Z
! _4 S4 {! d& Z7 S. [* y2 Q0 O$ p  //*将线显示在屏幕上7 H: b1 ?3 ]7 Z; [( S
  spSndPntObjLine->InsertInProceduralView();
% n( ~/ F- @# [6 U0 r: J; q% n+ H8 W( E
  spSpecLine->Update();6 X9 V2 L" P1 r

- \9 `$ I; S; _0 V+ O; r  return TRUE;" r7 e' b/ x. I$ F. U
}. Q* F( p- e0 k/ R5 Q
: ~. N; ?9 `% v+ \
  B# I5 x7 O( `
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了