PLM之家PLMHome-工业软件与AI结合践行者

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

[复制链接]

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

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

admin 楼主

2017-4-17 21:56:09

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

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

x

# d/ Q9 `7 x0 i7 F! Z( ]  VCatia二次开发源码分享: 通过鼠标点击创建直线
4 k3 C( Z: k8 [( V+ q; g; u# Q1 y  u9 h

7 y3 g- ~7 A1 |  m/ M: X# \) K
- {( A/ G$ W& u2 U, e3 k#include "CAARCCreateLine.h"
# z, l" E0 i1 C) c7 M( o#include "CATIndicationAgent.h"3 K( h7 ~) v8 s- n, ?6 W- W5 `
#include "CATMathPlane.h"
2 @! j' n' X8 _
2 R* g, W, q( Z2 w& D5 F7 Y#include "CATCreateExternalObject.h"
! `! l7 Z6 b% _: ^; f  [& E9 ?0 D
& y( m$ d3 q8 f! g* H- p#include "CATMathPoint2D.h"
+ k8 J+ \8 S& d# N; B0 T- K#include "CATMathPoint.h"6 r4 o+ T% x8 B2 Q/ e; R
#include "CATMathPlane.h": i: {& e$ R: I$ Z' c+ X

$ U! {( n. c+ \( k- Y+ T3 ]#include "CATIGSMPoint.h"$ Y! e: I/ [0 a0 S6 Z+ M
#include "CATIGSMLinePtPt.h". ^1 u& v' ?5 L+ e  h7 L7 C8 Q

8 \6 O6 w1 e9 }& Y+ C' q9 C#include "CATFrmEditor.h"6 S. D& [+ S8 t+ a' Z6 `$ ^2 C
#include "CATPathElement.h"5 C! Z; w* Y; n& d! Q9 h
1 X2 s. ?9 @5 u! o# b3 q  `9 U) e
#include "CATIProduct.h"0 X% s* ~! N4 @, _& l0 o1 |0 g) X
#include "CATILinkableObject.h"7 I+ ], h5 H; N9 v; E& k
#include "CATDocument.h"
4 T. u: G( \/ X1 W  o* H
8 m0 T& v6 Q8 b# f/ t#include "CATIContainerOfDocument.h"- m& K/ w# I6 Z4 O6 G4 _4 Z

" B9 E" @+ X* ^; M, b3 e#include "CATIGSMProceduralView.h"
! N9 ?! m  I- t, _. C7 c! Q; F- J3 w# d
2 T# T4 ]0 I5 J! X9 j#include "CATIContainer.h"
: Z% w' h; I- d1 o# S4 c#include "CATIGSMFactory.h"
( [- T6 i. {0 Y9 @0 m* }4 F( o' h/ I- V
#include "CATISpecObject.h"
, g3 l/ s1 \3 e; I1 y4 Y4 J" BCATCreateClass( CAARCCreateLine);
" i' ?# ?. `. v: v
- Y& v6 k1 s4 Z0 N
4 X$ ~6 E3 u# s5 [. E1 v7 G//-------------------------------------------------------------------------
5 A, }: ]9 ~' F5 H// Constructor$ R- p: L- F7 x
//-------------------------------------------------------------------------
' ~6 Q$ F+ y5 [/ H- z' iCAARCCreateLine::CAARCCreateLine() :
7 v& G/ g: m: D! }5 O6 c5 U  CATStateCommand ("CAARCCreateLine", CATDlgEngOneShot, CATCommandModeExclusive) ; J8 M: l2 |) ]( u
//  Valid states are CATDlgEngOneShot and CATDlgEngRepeat) t2 [: V  w1 h/ k9 a& Z
  ,_IndicationOnePoint(NULL),_IndicationTwoPoint(NULL)
; w, K: V/ `: c{
: A8 j( d& e, x& M8 y4 @& _: [5 x}
5 G# ^4 {2 A+ |) O  C- x
# ?" V5 M* [4 G$ z6 l% d//-------------------------------------------------------------------------9 ]# ^4 C  e% u" y" c
// Destructor8 y* `7 D3 a& ^& \5 J( w5 W" U
//-------------------------------------------------------------------------! g$ H+ ]1 i; Z$ |, ~1 e
CAARCCreateLine::~CAARCCreateLine()! T% p# _& ?% H  a
{
" k9 H- I* b# L8 V" E1 X) x; D   if (_IndicationOnePoint != NULL)   x9 F& J% e( A& C- _
      _IndicationOnePoint->RequestDelayedDestruction();0 L1 G; o8 n! ^4 P+ X' e
   if (_IndicationTwoPoint != NULL) % @3 x4 M1 m8 f# j. P
     _IndicationTwoPoint->RequestDelayedDestruction();/ P1 B1 R/ u1 V' |: @- T
}
# R$ W. }" m: \! B: b" F6 g' F. o

. }9 R' t+ r: y//-------------------------------------------------------------------------
; p# Z/ ~# ~1 e# K) u# H// BuildGraph()
/ R. }  G6 V1 Q9 O//-------------------------------------------------------------------------
1 E2 _4 j. H. P* Z4 m- Evoid CAARCCreateLine::BuildGraph()% r9 U; }$ I! i+ N( d3 O
{
0 m! l0 S% A6 Q( D: ^9 N4 P6 R# f1 V9 H  g+ l, K
% D) t3 ~8 s* ^0 M
  // TODO: Define the StateChart , C9 r0 p1 R+ x5 g# p
  // ---------------------------, H/ h% X9 [! n7 S9 a! m2 u
  _IndicationOnePoint = new CATIndicationAgent ("IndicationOnePoint");7 G" o! q. v; b! G) A/ p; _' K) v
  AddCSOClient(_IndicationOnePoint);
6 W7 M! P& M+ ?& r3 I, K; B8 Z* S8 x; Z1 D. k- ?
  _IndicationTwoPoint = new CATIndicationAgent ("IndicationTwoPoint");, ]1 \% l; Q; S5 T3 ]
" F, Z9 W* u! D. f& }/ A
  CATMathPlane PlaneXY;  z7 [$ U# M3 g; R, B
  _IndicationOnePoint -> SetMathPlane (PlaneXY);6 I7 N) Y  n7 S; ~6 @5 o( w1 {
  _IndicationTwoPoint -> SetMathPlane (PlaneXY);
  G, H9 y) y( E2 `+ A$ X3 c- _
  m7 A2 E8 L) `* d% V0 h2 o  CATDialogState * initialStateOne = GetInitialState("选择第一个点位置");
1 \9 }, _& }3 }  initialStateOne -> AddDialogAgent (_IndicationOnePoint);; {8 ?! ]  d' I' N" g
6 g5 \7 K1 v7 [3 q3 Q( z
  CATDialogState * initialStateTwo = AddDialogState("选择第二个点位置");
$ ?$ V+ v' _* P2 t4 K& d  initialStateTwo -> AddDialogAgent (_IndicationTwoPoint);
3 V$ Y7 F* q5 ?/ U: V
  u& @! y/ w& Q; ~: @& @- d! i( k  AddTransition( initialStateOne, & n& W- O1 M, q& X: C/ o, H
                 initialStateTwo, ; f" `+ O- b2 w; e; \1 [
                 IsOutputSetCondition (_IndicationOnePoint),, T" f) ~" ^' V! L
                 Action ((ActionMethod) &CAARCCreateLine::ActionOne));1 N! b& e, k# V) Y7 L/ D

8 S5 ?1 i$ S9 e& {$ {  AddTransition( initialStateTwo,
: I$ w5 ^* |$ L2 d. \                NULL, " y5 g+ \3 g. C2 W6 b, y
                IsOutputSetCondition (_IndicationTwoPoint),0 L! K) g; Z4 v# Y
                Action ((ActionMethod) &CAARCCreateLine::ActionTwo));
0 e. u9 @0 G  R% W6 H6 P2 F  H}2 u) B! z, c9 N0 L; [

  x0 [! p5 e# H& n. v7 ~% R; ?9 K7 m/ G+ L% o4 n' ^
//-------------------------------------------------------------------------
" U6 N6 F6 k4 H// ActionOne ()9 }$ V8 v% Q: A* {- j, Y6 ^- c
//-------------------------------------------------------------------------
# l4 ]; Y" y& I5 F' |. ^# pCATBoolean CAARCCreateLine::ActionOne( void *data )
; y+ v) D/ ~  ^5 Y{: i! b0 j0 z" |
  // TODO: Define the action associated with the transition
" ?7 `: X5 U) V  // ------------------------------------------------------
3 F& V6 M1 ^) U/ c# n9 }  CATMathPoint2D point2D = _IndicationOnePoint->GetValue();//获得一个2D的点( k# t- b- R" I
# ~  z4 A" A& ?# b
  CATMathPoint Point3D;
8 z- V" F/ @/ [4 }3 G! j9 Z- m+ l2 ~  CATMathPlane Plane = _IndicationOnePoint->GetMathPlane();
, O7 B' v4 @" d2 ?$ E) K6 j  T6 |. _% [' L6 N3 |
  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点  B1 S. W0 d5 @

: v) o  `  C1 H  _  //设置Container(非根节点). u/ M0 E9 B( O9 j+ D* |. y
  //获得Editor
/ ^0 y( q! V' W6 K' S4 n/ K  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();: a# \9 ]9 D- i7 N- ]2 Z6 g" o
9 Z2 p+ ]+ i& Q# N% k
  //得到当前对象的文档
/ U5 z  q) n4 y$ F  CATDocument * pDocument = NULL ;
% T  [& L) ]% `3 C* F
+ Z' u) {. ]. E; {  //取得当前活动对象+ ?& ?, o8 l$ [4 F9 K
  CATPathElement activePath = pEditor->GetUIActiveObject();
* M; h& W6 X* Z* w$ E  J5 q  p4 v; |6 R
  //取得当前活动的product
6 {2 s* ?0 r+ S  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());' O: h" `7 C+ J  u6 ]8 ~
& I6 L' V" E! J: |! J, `3 D
  //当前活动对象不存在
2 ]8 n& x; T4 K7 n  if (pActiveProduct == NULL)
7 O8 ]: g; s* }' s+ u7 `  {0 ^9 v9 r3 K' n1 b  X/ [% y
    pDocument = pEditor->GetDocument();0 I- V% _- Z2 ^6 [# r
  }7 Q; |! P, q4 U% ~% D  ^6 u0 `. k  e
  else/ i9 G) ~: i5 x$ q, G
  {7 `5 {: {- E; E6 ~3 ~, [
    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();; `3 O+ L' u0 B1 @$ M+ O. [
    //当前对象的引用对象是否存在1 A5 N: H+ ^8 ]
    if ( NULL_var == spRef )
# j# O/ E9 g, H0 _    {3 r9 Y' M: j' s1 ]' d
      return FALSE;
; A. B' t% g6 p6 J) ?& {    }! P$ H) r: S  s- N
  E9 w  `+ H2 p/ W) p- h$ r
    //当前对象的链接对象
* x* A* A+ @6 [" v    CATILinkableObject * piLinkableObject = NULL;7 B  y/ j6 q  c# {
    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                            8 h% ]2 C3 F3 I8 f
    if ( FAILED(rc) )/ x  d; h, f2 I
    {
, X4 y2 K  S$ W1 h1 |. z6 Q      piLinkableObject->Release();* ]5 v& @, v/ k! k) f' b
      piLinkableObject = NULL ;
: f! L0 {+ H# y& s      return FALSE;& Z) e2 q  P8 C- X- Y4 u" `/ z
    }
' ~, V1 p* ^' u8 ?
# s9 d- P. x  c( z    //得到当前对象的文档
. @9 y3 Q! k! L. O7 l( o    pDocument = piLinkableObject->GetDocument();- V( @* Z+ D3 C8 }
    piLinkableObject->Release();2 A& Z, l& l+ W! ^6 Y1 X+ w8 i3 k
    piLinkableObject = NULL ;* M# S6 C6 e( c2 H
; s3 T& k" `: `+ y5 Y* B
    if ( NULL == pDocument)' h0 U  _% G/ d- B4 v
    {* s. ~* r$ |: ?$ S% U1 k
      return FALSE;
$ ]% G  ~$ f. B: V6 H    }# ^1 n- i, Z9 w5 u8 m/ y
  }
9 e  K$ {& F9 W3 s; {+ {  V, ?2 h
  //得到文档容器集9 `& ^7 p2 o" j% c2 H+ j3 M4 j+ C
  CATIContainerOfDocument * pIContainerOfDocument = NULL;9 E9 s: `4 d! }0 B+ i
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);# n. ^) G- E& H1 j, M7 h
  if (FAILED(rc))
& x8 d1 D3 D" ]. y4 j  {+ w3 a* }, Y; [! v9 V/ ]; k
    //pIContainerOfDocument->Release();/ ?" a# k6 x1 l4 p2 x( ]; P
    pIContainerOfDocument = NULL ;
" T& @6 p+ G+ S) o7 {    return FALSE;
- m3 x. r# ~6 j. s% B0 G% |  }% {2 g7 T5 M  O" M/ E; G
4 p9 i0 z, g1 X3 I! [# u
  //获得Document
; M. ]" k5 C/ ~" W- V2 J  CATIContainer* _pContainer = NULL;       
. b, a0 d, W) R: C: Z& r  //获得SpecContainer
9 v* }4 _. D/ k% M6 \2 }) W  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
5 u4 K1 f% i7 }       
3 W* |4 ~/ W: d3 W6 ?  A. \  //GSM工厂) N+ x4 q9 F; C0 s
  CATIGSMFactory_var spGSMFactory = NULL_var;
- J% }2 M5 H# T- g& s  //设置工厂               
1 v# |8 P, |+ m% `  spGSMFactory = _pContainer;                                                                       
% @3 c( K/ v% o  h+ B9 o9 \
3 O4 n: O% [" x7 ]9 a+ d  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);
! E- r6 Z4 D6 |- ]% G7 y& b" C* K/ D9 s, [; z6 h# D: y
  spSpecPoint1= spPoint;                                       
6 K& h- o! u0 c6 Y5 {9 d8 ~! H8 q3 U# ~
  CATIGSMProceduralView_var spSndPntObj = spSpecPoint1;
4 F. @4 I+ Q) |1 ~$ Y
% ~3 \5 M7 d! Y$ j9 X3 \  //*将点显示在屏幕上& s+ ]& i3 M& t7 f. Y
  spSndPntObj->InsertInProceduralView();
2 [2 O7 Y; Y* h  K- e: G2 u* {! s/ W8 t
  spSpecPoint1->Update();
. \. t/ H) }. g$ y& i7 K7 e3 Q0 C. T- Y2 e" y/ |
  return TRUE;7 i# O& {+ ^2 W
}; F6 p7 L# U6 R' Z8 i/ k
8 n$ m( s, W7 h8 A  h/ t
//-------------------------------------------------------------------------
- ~: P+ L. `9 B! J6 d: ~// ActionTwo ()! K( l1 w8 D+ G9 Z
//-------------------------------------------------------------------------/ o+ ?9 [* C7 A7 Z
CATBoolean CAARCCreateLine::ActionTwo( void *data )
+ ?7 s3 f# S, Y$ M8 l1 g; z( r{1 b" N5 @8 X' J" c
  // TODO: Define the action associated with the transition 3 _; y: p* |; \& ^/ W
  // ------------------------------------------------------5 b, M) ]; o; i, l
  CATMathPoint2D point2D = _IndicationTwoPoint->GetValue();//获得一个2D的点7 E! A# U1 |% m6 i( B
4 I2 d# c; F2 `4 \1 S4 p; Z
  CATMathPoint Point3D;
  h" S# V0 U- j$ S7 K! `7 F  CATMathPlane Plane = _IndicationTwoPoint->GetMathPlane();8 X" `4 X: H& p; ]
7 J! D% @. y: I, `, t: w" c- U
  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点
" X/ A3 l9 i' Y5 V* h" r- p! W* g
  //设置Container(非根节点)% M* `! \5 o, g- [: U
  //获得Editor
9 w9 B* y1 m- b& y  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();+ ]: F8 y: m9 H: b
; |) n0 ?( ~% a* v) c
  //得到当前对象的文档
4 E. e: h6 a2 |3 ^6 D  a; W  CATDocument * pDocument = NULL ;' f/ U# U; p  B: M
7 j0 T4 |7 D7 M! U( K% X
  //取得当前活动对象
! }. J3 g9 N+ w3 H8 b/ u. S0 s  CATPathElement activePath = pEditor->GetUIActiveObject();. F1 g; z+ O" Z
% S, s. V$ v: x* a% x8 M6 O; B
  //取得当前活动的product2 F: l& d9 X$ d; ^
  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());
1 `5 {% u* e  F' Q/ L  W" c
7 h. T0 B, \5 s* {$ S+ Z2 s  //当前活动对象不存在
7 v: [( E* }+ l; I/ n- |. B) b  if (pActiveProduct == NULL)7 k/ n) `3 U# J6 J5 i/ z' A
  {
& H# U# z- @- u8 e5 Q  n    pDocument = pEditor->GetDocument();
- X' K- N. r7 R2 G1 x  }, c  r2 B4 y9 X4 A# X$ I; h/ h
  else) F- A6 O" ~% ~6 K
  {' c! `( u- W# R/ {( j+ W2 a3 @6 f
    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
, s  g2 i& l. j. R* }' c3 e' h    //当前对象的引用对象是否存在: F8 F/ H! P$ _0 j0 ]% n, \
    if ( NULL_var == spRef )
, z2 V9 {7 T8 j3 w, J5 ]  l    {: T' P0 o  \( O2 w4 I  R0 z1 _5 v8 t
      return FALSE;
& F- J6 g! [, [: m1 r% T9 f    }7 Y  s# m% Q' e/ r  t6 I- K
8 N7 o: @' K5 A7 S
    //当前对象的链接对象6 b, A8 Z1 D0 {$ h
    CATILinkableObject * piLinkableObject = NULL;  W+ _  W  h5 x
    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
% z: M1 |3 n4 R" R+ ?. b    if ( FAILED(rc) ); s, c, ^; ]* _8 ~
    {& J; S( [# m. d. ^5 J+ n4 ~2 y
      piLinkableObject->Release();3 T) l7 i8 B6 O6 K; \  J7 t; _
      piLinkableObject = NULL ;+ H9 j- b! b7 j
      return FALSE;
* m. T" i% v* Q, W! D$ S8 k    }/ z5 ~. G4 U* u# q3 i
4 o/ b& ?5 |/ O; m
    //得到当前对象的文档$ h- R# c  p5 d  i' p& ?& o8 G
    pDocument = piLinkableObject->GetDocument();8 U, l- f7 i) g9 \8 C$ u3 o( m
    piLinkableObject->Release();: f. o1 S6 T6 v5 M8 d- m
    piLinkableObject = NULL ;8 t4 K6 _3 _9 N4 p% p" x7 [

; b" u0 F, e# K7 O6 o, x    if ( NULL == pDocument)# H8 v* k0 u( X. ?2 O
    {
, _% L3 \$ L) o& _7 M& |- S; h8 }5 T* W      return FALSE;! |7 d# h9 n# \# z( d  U
    }& N8 v- [: k" M& Q% c# @( N
  }
& Z) z5 u2 o- V  g, o( R) b$ h+ v) ?' ?4 w% ^3 n  h& c0 U* c
  //得到文档容器集
% k+ d" V- q' y9 U8 _  CATIContainerOfDocument * pIContainerOfDocument = NULL;
+ c: G$ v, `: \, j& A  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);
$ [+ S+ @2 r7 ?3 R4 C7 |7 x- q/ n  if (FAILED(rc)): N; U' c6 W5 q  O5 M
  {
9 j3 C2 w# c6 e7 K/ A/ P/ F    //pIContainerOfDocument->Release();8 C0 S5 W& i: d% {* T
    pIContainerOfDocument = NULL ;
  {7 P$ ~) G( g; U    return FALSE;# |/ K, _- ~. D. z5 R% F
  }" K" R, p/ w1 u3 [$ }# @

; e; M9 v$ b$ Z% R& H6 _# j9 V# c& N( q  //获得Document6 o0 `, c$ Z  H& ^
  CATIContainer* _pContainer = NULL;       
3 L' I' `% q6 O/ [$ A6 [6 P  //获得SpecContainer( {: ^* N0 u1 v0 I: y. O
  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
- ~$ g, s/ Y% ]/ k$ f2 _3 r        + [6 M; K% G! o5 g2 n' S
  //GSM工厂# v, B8 N" H3 B- k. {; u
  CATIGSMFactory_var spGSMFactory = NULL_var;& i; B+ e) ~) ?$ j2 o9 u- \8 W* N- Z
  //设置工厂                8 X9 `6 j. D; @' h3 j
  spGSMFactory = _pContainer;                                                                       
, W  h, r6 C8 N: G8 f: L
2 U# }# ~0 @2 ^. F# M( y  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);
+ n' a4 a4 O  y, {5 y! y. E
8 A$ P" ^/ ^& m7 Q8 C  CATISpecObject_var spSpecPoint2= spPoint;                                       
2 T; h; a1 `8 j* j
& I0 W7 T9 T2 D- Q  CATIGSMProceduralView_var spSndPntObj = spSpecPoint2;# C* r: _2 Q) `1 [2 v

9 J/ ]6 |2 ]! z/ G  T. A. J2 x) r  //*将点显示在屏幕上
5 }  Z4 Q3 Q! E  spSndPntObj->InsertInProceduralView();
. W$ m. O8 n- F- W7 E  c6 M) J# ?; c
  spSpecPoint2->Update();
  y1 t1 N+ h+ G7 _1 {1 m0 u6 I9 f
+ F; _* }2 e; M1 ~  //生成线
7 [$ M9 M- R2 A& s- ^3 N' I  CATIGSMLinePtPt_var spLine = spGSMFactory->CreateLine(spSpecPoint1, spSpecPoint2, NULL_var);. ~% c/ }3 ?1 E
8 a: d  q2 K5 \8 U5 W/ a. C( J
  CATISpecObject_var spSpecLine= spLine;                                       
/ O+ |; i: `0 j$ D) C+ p
: L6 ?) `% z2 N+ J  CATIGSMProceduralView_var spSndPntObjLine = spSpecLine;+ x9 Q( z& L( ?
$ j' a; D& _# J/ |) }7 q. m
  //*将线显示在屏幕上
/ y& e( S2 q- ?1 ^  spSndPntObjLine->InsertInProceduralView();* j  }9 k4 b3 m
0 w3 J5 k- x; k. t% t" G# U
  spSpecLine->Update();
7 S" y! N( _& Z3 {' H9 I0 C  ?; X" O  u
  return TRUE;
( R4 H$ h4 a: `& r- f, o8 A}* F1 w) f. l' n5 ]1 y- q
0 E2 e% q/ F! U6 Z; G" o

1 T/ m- L0 z1 N! s. z, m/ d
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了