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

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

[复制链接]

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

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

admin 楼主

2017-4-17 21:56:09

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

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

x
3 o& E2 d& F# b, E
Catia二次开发源码分享: 通过鼠标点击创建直线$ f) _8 z$ ]4 J& ]9 R" p7 J
! o* v. {/ v6 `) |$ c0 H* Q
# G  b; K& s) N: c/ J# y
: z1 T1 _% f* D' }- ~* \0 X
#include "CAARCCreateLine.h"
6 a+ J7 G  s' J1 r6 f( W  U# o& j#include "CATIndicationAgent.h"
6 B9 E% ?3 H' y3 |0 Y8 q: {( ?4 _#include "CATMathPlane.h"
) ?8 c) U' z6 _3 u# B5 @0 `$ v9 v' w
) f) s$ E% A% m- V" O: f1 S! O; h#include "CATCreateExternalObject.h"& b+ N( b& M: X( K3 L! Z! F$ W& j

8 y6 d3 S( f5 e6 A' Z) B#include "CATMathPoint2D.h", z  p* g) {- S  `6 Q/ w
#include "CATMathPoint.h"
% Q( b' [' j1 Z4 F# `+ ?& U#include "CATMathPlane.h"
2 n) v  R" N1 ?, t- K( p# H6 E! ^9 Y5 {9 \
#include "CATIGSMPoint.h"
- I, \' w& x6 [0 b$ D8 P#include "CATIGSMLinePtPt.h"
, b. J$ ?& P% K. N; `9 L7 E  F7 X6 l
1 z; w7 x! b  P2 Q2 |#include "CATFrmEditor.h"
" b' D# B) ~- L8 ]2 b+ K#include "CATPathElement.h"
: M' f& b1 y% G" d- Y
8 A# ?) Z8 |) [( Q' @#include "CATIProduct.h"' E- p6 {7 Z" W9 J7 g$ t6 t+ ~8 z
#include "CATILinkableObject.h"
" q4 |" Z  n% C/ k#include "CATDocument.h"
( f6 {4 G4 u" B
5 V2 F! c- U7 Y2 i#include "CATIContainerOfDocument.h"/ K% B9 @( _/ h- j9 h
9 x+ y, J- q+ _/ V9 ?& Z. v
#include "CATIGSMProceduralView.h"9 w6 G, {; u5 R" }" G1 I5 W
9 H% K( z& j; g9 I( j8 V
#include "CATIContainer.h"
4 I# R9 w9 o# ^- n, i; @#include "CATIGSMFactory.h"9 N" t' |- Y) d0 Z
0 k" I2 l' J" ]; {+ H  b  R
#include "CATISpecObject.h"3 M- a! @8 V, v, x, x8 W0 X0 `( |
CATCreateClass( CAARCCreateLine);
0 R- ?8 ^2 B% Y4 e: y$ k- h) A, {8 F; A/ x

' `2 g, V- ~" ~0 |. r  F//-------------------------------------------------------------------------' v# S8 r3 t' e' I
// Constructor2 n3 b0 D! ]9 |/ \0 X6 O& B
//-------------------------------------------------------------------------7 t. l. g/ {4 ]
CAARCCreateLine::CAARCCreateLine() :" \9 g0 B: p+ C( l) C2 g, E
  CATStateCommand ("CAARCCreateLine", CATDlgEngOneShot, CATCommandModeExclusive)
9 i  ^% ~8 x7 H) O" p: P//  Valid states are CATDlgEngOneShot and CATDlgEngRepeat
' F9 m/ z0 }  B% t8 _8 R  ,_IndicationOnePoint(NULL),_IndicationTwoPoint(NULL)
) W- u8 K5 T4 y; w{
: l4 L; c6 c  \7 X- F- N2 w5 e}& y2 k+ S  V3 H2 c2 N& [
( k, ]' }. Q, i2 j
//-------------------------------------------------------------------------
6 _8 a% k& N3 \6 g+ c/ D  _// Destructor
3 U8 [; C& G% ^" y) k5 y//-------------------------------------------------------------------------
$ g* x7 A% h1 M7 K  L; |CAARCCreateLine::~CAARCCreateLine()
# g$ |8 P6 b( T0 C4 T{  o: p7 s* x; Z5 S
   if (_IndicationOnePoint != NULL) 0 `5 i: \7 q" y9 K% ~1 G8 k
      _IndicationOnePoint->RequestDelayedDestruction();
, Z6 p" i8 O. e1 T" d0 V   if (_IndicationTwoPoint != NULL)
/ I: b) f8 M$ [     _IndicationTwoPoint->RequestDelayedDestruction();  |/ _8 w  C5 u
}1 M: L  t1 `  e7 W0 M

0 B6 P- W' c& A1 v8 o- M! r, R* B3 V3 g% M+ X/ y* X7 e# X/ C+ z5 d+ b- ?! Y# b
//-------------------------------------------------------------------------
& o6 L3 v' q+ |4 ?// BuildGraph()* ?3 F. |7 E$ Y. R$ {
//-------------------------------------------------------------------------
; P- w$ [/ y) O4 y" {( K" R) tvoid CAARCCreateLine::BuildGraph()
) e4 n% x- e( t8 t{( N, v/ n0 U2 q& b) K1 W

# O/ Z; f* A+ T/ m# A$ K% ]% i; @
  // TODO: Define the StateChart
7 ?+ ?0 \4 G: f& d  // ---------------------------8 U4 L% e" Z% k) N0 @9 ^1 b" U
  _IndicationOnePoint = new CATIndicationAgent ("IndicationOnePoint");
8 ?+ m( s/ o' P, l  AddCSOClient(_IndicationOnePoint);
6 R5 `% q' b6 S% p9 a# ?0 [/ E
  _IndicationTwoPoint = new CATIndicationAgent ("IndicationTwoPoint");. s5 Q/ f7 x0 O( d" T8 \/ n

3 i: C6 I8 Z/ g5 N  CATMathPlane PlaneXY;  W2 @) F, e4 n
  _IndicationOnePoint -> SetMathPlane (PlaneXY);
3 M1 i  F! C/ W4 J% i7 x! `) A  _IndicationTwoPoint -> SetMathPlane (PlaneXY);. w4 G' ~+ U) N( E9 l
' s/ w# Z: i5 `( R0 R
  CATDialogState * initialStateOne = GetInitialState("选择第一个点位置");+ e& S" W: Q) y/ x5 x
  initialStateOne -> AddDialogAgent (_IndicationOnePoint);" g6 h$ `: `1 G# A/ }* [& J5 H
$ I  a! G/ |4 W3 g
  CATDialogState * initialStateTwo = AddDialogState("选择第二个点位置");
$ X3 M& B6 c* i5 i& r: G* j  initialStateTwo -> AddDialogAgent (_IndicationTwoPoint);' ~/ G- ~; t$ R- Y4 _0 g/ m* D

/ t& T! g2 j; }  v8 k  AddTransition( initialStateOne,
" C% y# `9 ^1 K5 r- z- `) _* O                 initialStateTwo, & I& d$ X0 q$ a( i
                 IsOutputSetCondition (_IndicationOnePoint),
9 t* D$ Y( F* M4 U8 J# G                 Action ((ActionMethod) &CAARCCreateLine::ActionOne));8 l0 L+ a! [: r% {0 Z
( y( o* _* d# A& D) p0 i
  AddTransition( initialStateTwo, : i  ?1 B- b$ s0 r' c6 \
                NULL, 6 g* E5 N6 P+ C5 ]( Y( l9 _: h
                IsOutputSetCondition (_IndicationTwoPoint),
0 b/ u+ G) N6 S  k                Action ((ActionMethod) &CAARCCreateLine::ActionTwo));
" {" t! ]# D3 A1 V3 ^$ C' \}2 h5 n7 Q$ k+ s" I

  r3 {7 L* Y7 K7 H2 Z" N5 ?3 p9 d% G. S& z
//-------------------------------------------------------------------------5 w5 m2 `: b$ q7 q
// ActionOne ()
$ B- z5 F2 \" y" \5 F//-------------------------------------------------------------------------4 K$ v) l6 n; N2 h
CATBoolean CAARCCreateLine::ActionOne( void *data )8 p% l4 [: w( |
{
$ O3 Z+ i* }; j1 z6 r- }  // TODO: Define the action associated with the transition * X- P' \' X- I4 Z
  // ------------------------------------------------------. v' ]1 z! e, `
  CATMathPoint2D point2D = _IndicationOnePoint->GetValue();//获得一个2D的点
7 e, S% Y( P6 n! E# h8 c. q  e
2 z0 I; @" Z7 t* }0 P2 U  CATMathPoint Point3D;, u8 e+ Y# C8 ^" V
  CATMathPlane Plane = _IndicationOnePoint->GetMathPlane();
2 Q( ]: H3 Z. l* H9 D" K# S5 `3 O: v4 r4 S0 p; {. D9 _7 T/ [5 k
  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点
- R& Q9 B+ r- B" U' D1 C/ A: k: ~, x! Q& P
  //设置Container(非根节点)
3 c; p7 J5 O/ a* g  //获得Editor
* R7 l9 U' _+ q) R; Q- }9 r, ]+ E# Z: N  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
& j* k3 \; m) S" Y, Q( A1 J; |* W. M# d# M2 K: U( Y
  //得到当前对象的文档
0 O: }* E- b3 k0 [  I, O: q  CATDocument * pDocument = NULL ;
- s! u4 }2 v- e4 _1 F4 O/ j8 P6 m  ^$ _3 N- u6 r" m1 q) F
  //取得当前活动对象7 H! U7 y. ?& {# ^# \9 e: A4 V* E
  CATPathElement activePath = pEditor->GetUIActiveObject();
( m& m, V6 E  ?) R. W
8 w& P, v: x0 o- c, n/ G  //取得当前活动的product
, c$ G3 _# H$ e" s( p  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());
' @: x* a4 A, l0 \) I/ j- D1 S# z5 X1 M' T6 D4 B
  //当前活动对象不存在  R% r7 b& h) @" K! L) f
  if (pActiveProduct == NULL)* v5 R% Y" L" _% |' {
  {7 y( W* B+ l8 q4 o* M: x
    pDocument = pEditor->GetDocument();
: V* v# Y! R% |9 C4 f6 p  }
: M" y0 Z& |9 T0 Q: e% c  else) ~/ B, I+ w+ s& b
  {
9 R0 |" H  l5 V( b6 G0 Z% X    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
7 [" }- a& n# h7 Y. F; i1 P* O    //当前对象的引用对象是否存在  T$ p8 a/ I1 V* x7 W, B9 ]
    if ( NULL_var == spRef )
0 L# m+ D  @8 B% a# t    {2 ^  G( m! E( k: @( A
      return FALSE;/ A7 F/ j! H$ l0 \  a" b! t
    }+ k, o* P. x( N' M% C
2 P9 a, b- n+ h9 ?7 ^% B
    //当前对象的链接对象
- ^3 _2 H6 u" J$ T! F    CATILinkableObject * piLinkableObject = NULL;
0 E6 V( ~" I3 ?* X8 U    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
% u1 Q( c1 T+ I" |  ?    if ( FAILED(rc) )! t( E1 G! v4 d6 V' b
    {/ s  D* k1 E. R
      piLinkableObject->Release();. B3 T" B- P# ?
      piLinkableObject = NULL ;, Z$ h$ l- g8 |# i6 n7 w
      return FALSE;
8 R% W1 P1 e- b7 M    }8 X: ]0 Q# |& U! }. q) Y) |

* f1 v, Y" \( |    //得到当前对象的文档4 z( Q+ k- z. U
    pDocument = piLinkableObject->GetDocument();. C$ B8 F) ?: U& e3 c( Q
    piLinkableObject->Release();
" }5 U  u. g! w1 |    piLinkableObject = NULL ;8 u4 i/ I/ l. y7 }1 y3 I
6 h+ Z" r/ x) R+ Y9 z( `0 h. u/ o3 L" ?
    if ( NULL == pDocument)$ h- K+ S8 v/ \8 D7 \8 x2 ~
    {% }+ i! U" R- G
      return FALSE;
$ G/ W9 f/ A' J2 ~2 q" u4 Z$ e# K; q    }
5 }/ E" Y2 H  Z. y  }& ?9 H5 t6 |. P' s0 t6 u" d
4 R* d! g5 e( ?) a/ R3 O: w
  //得到文档容器集
: I! }4 l8 t7 m  CATIContainerOfDocument * pIContainerOfDocument = NULL;
' z8 p# @0 H& `4 q6 q3 x  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);
( h7 J! n* @2 [& w: u+ V6 o  if (FAILED(rc))
+ U7 v2 q# u* T. E# c0 N  {; n* g! h4 f5 I+ R: _
    //pIContainerOfDocument->Release();8 ?9 Y& P: V/ r9 D: m1 I- \; i
    pIContainerOfDocument = NULL ;
6 b% _8 _, f$ }6 t3 _* {    return FALSE;
/ l6 h! b% D( S* C  r+ g, L- o9 W  }
8 q6 J; k5 y4 G$ z% [2 n! b$ b6 l
$ c* {* J! D- o! J" z  //获得Document
" \  ?+ W" Q: B. E' X3 C  CATIContainer* _pContainer = NULL;        2 F; |, Q8 k( e. N7 v  V' ]3 l" T% G2 X
  //获得SpecContainer
! b3 L3 z! D3 M0 q5 q/ v2 V3 Q* K  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);5 c, [" h5 |% s4 C8 C
        7 U/ C( p, G8 ^2 }8 @8 L3 F1 @
  //GSM工厂
; l% E( c; I# x! f  CATIGSMFactory_var spGSMFactory = NULL_var;
( F: C" i( o" k4 q  //设置工厂                2 B6 a* y9 n/ q
  spGSMFactory = _pContainer;                                                                        % V2 {- D9 K8 m7 q$ s: v! B. R2 \
' J7 r( A/ @7 T4 T. K- a
  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);  j0 ~# G: Y: h: l: x) y, M
2 q1 k# Q( b% a  g; B
  spSpecPoint1= spPoint;                                       
) U) B8 _$ _# n2 v( B# a
9 ]% m# O/ P: ^  CATIGSMProceduralView_var spSndPntObj = spSpecPoint1;9 Z  u) D( R& n8 [
' N1 Q" C9 h; l) V& |
  //*将点显示在屏幕上1 L8 w. L! r$ ~# i. S3 S
  spSndPntObj->InsertInProceduralView();1 r$ s2 r/ |8 e& |$ l
% v  m$ ~) Z6 V& x9 ]4 A
  spSpecPoint1->Update();/ j, ?% G" d+ \' B* P/ G, _

4 g9 s8 [; g: K  return TRUE;9 B  e8 f6 M, c* ]0 y3 r! p
}
: x( V" J/ f* m5 t. a- H
; N! s# T" v/ Q& u//-------------------------------------------------------------------------
$ r& O6 k7 M% N/ w4 C4 z, R/ M// ActionTwo ()9 s" j1 r" }& d" p
//-------------------------------------------------------------------------
6 C( w6 U$ B+ e" @CATBoolean CAARCCreateLine::ActionTwo( void *data )
& a& W, y% _% E" b" w{: }+ R6 Q. {4 E; v+ }
  // TODO: Define the action associated with the transition ( f" j3 y! u. B& J$ J2 i
  // ------------------------------------------------------3 o* p# [3 C4 D9 R+ I5 ]
  CATMathPoint2D point2D = _IndicationTwoPoint->GetValue();//获得一个2D的点- L  I, {& ]0 J2 s8 D/ p: Y2 [+ l
2 g: b0 E3 }- L- v* j, v
  CATMathPoint Point3D;4 u) {/ ]: |8 j2 g/ D8 ~2 m' e' {; o: v9 i
  CATMathPlane Plane = _IndicationTwoPoint->GetMathPlane();- ~" ~) o  Z  k' h8 S" O" S) M. h# w

6 [) ~* G' S9 F) G7 k3 }  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点5 m3 H4 k: |9 d) n* n

! L3 q6 }1 K- @* `5 T. W7 @) i+ r0 {2 ~  //设置Container(非根节点)
& ~2 [* I$ j0 }( R0 E  //获得Editor
) g( [; p2 R+ @1 Z3 W8 L8 @( p6 c- k  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();3 |1 j& q) D) ~& n& n' B
+ \, I) l; G- [9 V3 `* ^
  //得到当前对象的文档4 p) f+ O- n; f
  CATDocument * pDocument = NULL ;
/ t4 y$ ]8 `1 E8 U% \- G. K: T' h: D' e1 c" u0 J/ r1 K3 b
  //取得当前活动对象0 D6 g& t: T1 @5 W5 w# @
  CATPathElement activePath = pEditor->GetUIActiveObject();
* w# `$ V& g" L1 O" L9 _
! y5 s, j4 t  D, _  //取得当前活动的product
$ i. V" j* N% j9 b: H8 i  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());
0 d7 x* ^9 H2 x# L* M# h5 ~% G7 e
- V/ F% i( {0 L2 i2 F  //当前活动对象不存在+ L1 E+ \( d* l- B* z2 W
  if (pActiveProduct == NULL): i' r5 ?) S0 B4 d: E( _
  {$ |5 j6 ~8 x9 ?' ^
    pDocument = pEditor->GetDocument();% y/ S9 ^. T8 h- s
  }4 ]% [- _* c  g" P& ]
  else
0 n' g. ]1 [8 Q& g9 T9 o  {& @+ ?: z5 t. C3 E, m
    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
3 j) l( c4 n& n  C  h" I4 H    //当前对象的引用对象是否存在; Q$ u* \! ]* H$ t; N
    if ( NULL_var == spRef )
  b2 U9 @$ v9 P7 |    {
7 b4 G( W, E# X& ]) \6 N) P" [      return FALSE;- ]/ B: @' Z: C: S$ c; ]
    }
3 [+ N- G3 e' X  j6 }. l3 ]7 O0 t- P4 S
    //当前对象的链接对象. F5 P+ ^6 ^8 X6 e0 @) Q! b
    CATILinkableObject * piLinkableObject = NULL;  x) v8 B' f3 i- j$ n- \
    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
4 J3 [6 x- R- X& V- r/ a' s6 O    if ( FAILED(rc) )
# ?8 C; Z- U9 f    {
  O, S* @- |+ v, O0 f      piLinkableObject->Release();
' A$ {8 _: _5 l" B# P2 ~      piLinkableObject = NULL ;* ~- i1 _- {4 q' w$ N% S
      return FALSE;4 }2 w& J, q. I# m# X  p- F
    }
. J' r2 }: w$ r6 p& O; D4 z* n  w+ {) J6 z- O& ~# {1 W
    //得到当前对象的文档
; N% }' D- d4 s; N    pDocument = piLinkableObject->GetDocument();( j6 E( Z0 m& u' K) U+ c
    piLinkableObject->Release();  V; n7 K" L/ a9 q( a3 V
    piLinkableObject = NULL ;
8 d3 c# R6 J+ m% ?3 c, u' I) h
: x! Y; d" |( t    if ( NULL == pDocument)' {+ A. e) v9 i4 {  ?8 p
    {! m/ V7 B( ~3 X" r
      return FALSE;
- P3 P# y0 X* o7 Y& X) j  z$ X    }2 _' o0 D& h& ]" v7 S( C
  }+ O% R0 K& B* b, Q& a  z! H* ~

0 _' N# A( U* S) |! |  //得到文档容器集
' D) V7 c1 |7 s% U' S$ @4 s# r0 [  CATIContainerOfDocument * pIContainerOfDocument = NULL;
; x* `8 x) h1 p: i$ ?7 ~  U2 n  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);$ F; q8 u" m+ `% C* U" ~
  if (FAILED(rc))
. ~0 b; `7 L% E  E! R8 j4 P  {
: d2 z( v6 ?% ?  Q, A    //pIContainerOfDocument->Release();& \. L2 I0 T2 b4 q7 v* |
    pIContainerOfDocument = NULL ;, v/ S  F- X4 k
    return FALSE;0 ?- D+ @. C- l7 Q9 D  ^
  }" B# v' Q, ~: d, @2 o) u

: f2 W. w# `" n  //获得Document$ S" v7 L4 [9 }, S
  CATIContainer* _pContainer = NULL;        8 @0 n% t: \- l, h4 {( ^
  //获得SpecContainer* R  \/ x7 X& h+ ~4 i. f  a
  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);1 O; h8 K% }2 G0 A2 F
       
" G' g# K  d) k1 O8 m  //GSM工厂
5 u1 B9 w4 I& {! N6 @$ K0 X) R- B2 [  CATIGSMFactory_var spGSMFactory = NULL_var;2 n: a3 s8 k% Y0 i9 @* F- z4 N9 S
  //设置工厂                6 c  C! ~5 M2 f1 ^7 }4 D
  spGSMFactory = _pContainer;                                                                          Q7 F+ {* `5 a. t
- R" f: x2 R. t
  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);
# S  S) D5 N- E  N- d( S
' M2 _# W  w- k, Y$ X8 L' e7 j  CATISpecObject_var spSpecPoint2= spPoint;                                        * f4 c% K* \7 I: J
4 y. e/ O. |$ b0 }
  CATIGSMProceduralView_var spSndPntObj = spSpecPoint2;4 T& R2 a' |+ N5 p

3 O" |7 z% l5 y' n  //*将点显示在屏幕上. I8 k% f" }9 u, U  a
  spSndPntObj->InsertInProceduralView();. g, Q- M& R! @# o% D

5 N. i/ J* {( D5 K  spSpecPoint2->Update();6 Y! x3 z3 j5 x/ m: Q* Q

8 l. a+ C  j7 f/ _. i, A  //生成线, ]$ i/ W) V, q
  CATIGSMLinePtPt_var spLine = spGSMFactory->CreateLine(spSpecPoint1, spSpecPoint2, NULL_var);2 b- P% F+ w: g) T* }

# M3 J5 }* C5 {& D' v0 b  CATISpecObject_var spSpecLine= spLine;                                       
1 ?2 S+ b4 i3 i# f  F, ^5 }. `% b  t% P+ u
  CATIGSMProceduralView_var spSndPntObjLine = spSpecLine;
6 }2 d% [' c/ r# u
/ k6 t6 J8 M% F+ _. K7 s  //*将线显示在屏幕上" H4 \. g0 [9 b
  spSndPntObjLine->InsertInProceduralView();  H, d# u8 N& O7 L1 l. b! [

. n! P5 j' G) N7 u" r" n2 \2 r  spSpecLine->Update();
/ B9 C3 X2 p) `9 D/ u; w2 R
! G8 t. M8 T$ c7 M' r  return TRUE;: Q+ R* a0 ~9 V9 J
}
2 J" p# n( V0 h2 D1 I/ o4 D: m+ G8 h' }) D* q9 [" @3 c, W
$ U; j, n, }# x6 W3 c
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了