PLM之家精品课程培训

PLM之家精品课程培训

联系电话:18301858168   |   QQ咨询:939801026
NX二次开发培训

NX二次开发培训

UFUN/NXOpen C++和实战案例

适合初级入门或想深入了解二次开发的工程师,本培训结合ufun,NXOpen C++,大量的实例及官方内部的开发技术。
公众号二维码

关注公众号

点击扫描二维码免费在线高清教程

课程详情
Catia二次开发培训

Catia二次开发培训

市场需求大,掌握核心技术前景广阔

Catia二次开发的市场需求大,人才稀缺。掌握开发技能潜力巨大,随着经验积累将在汽车、航空等领域有所作为。
B站二维码

在线原创B站视频

点击关注工业软件传道士主页

课程详情
Teamcenter培训

Teamcenter培训

全方位培训,从基础应用到高级开发全覆盖

涵盖用户应用基础培训、管理员基础培训、管理员高级培训及二次开发培训等全方位内容,由多年经验讲师打造。
QQ群二维码

加入同行交流

点击扫描二维码加入QQ群

课程详情
×

PLM之家plmhome公众号

课程涵盖: PLM之家所有原创视频

×

关注B站视频

所有高清视频一览无余,全部在线播放学习

×

加入PLM之家QQ群

同行交流,疑问解答,更多互助

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

[二次开发源码] UG二次开发源码分享:UG NX CAM加工开发简单实例

  [复制链接]

2017-12-11 15:49:09 8307 5

admin 发表于 2014-6-7 10:50:25 |阅读模式

admin 楼主

2014-6-7 10:50:25

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

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

x

) U; S9 z2 [$ d. L- f5 U  Q
" c2 h* X; g2 ^4 S' q# O. r* l9 d
; D. q5 A) ~( C# o; ~6 W+ j3 _3 T4 h

#include <stdlib.h>
8 V& m% j# B- a8 D) h5 f# j: B- O#include <stdio.h>

#include <uf.h>
  S6 i$ Q' ^( \#include <uf_object_types.h>  o, y7 f7 p8 h# L) i- \. H! ]
#include <uf_ui.h>
. D9 i3 N5 c% l/ p5 j4 O#include <uf_disp.h>
$ E: Y7 \. Y0 b0 e9 u; Z0 F#include <uf_obj.h>
  Y6 c( U' Y7 K+ B- F0 Q1 x# i#include <uf_cam.h>7 }& V' k% W7 E
#include <uf_camgeom.h>

#include <ufd_camgeom_UGroup.h>

#define MAX_CAMGEOM 20
! {1 ^) e4 f# h3 i3 L#define EXIT_SUCCESS 0

/*#define DEBUG*/

static char *title1 = "Select an API routine...";

static int geoption;
6 q2 b: D$ Q/ Jstatic char *title3 = "Select Geometry Type(s) for operation then Selection Complete";//创建几何
5 G+ R3 @8 m5 @! l  [; q6 f6 Lstatic char menu3[][38] = { "1) Part Geometry",: N: E; ?3 T1 V
"2) Blank Geometry",
+ c/ h( X3 l/ s2 u/ K9 D. O% h"3) Drive Geometry",
5 u0 t0 K7 X1 @9 c: v- {"4) Cut Area Geometry",
4 ?& ^; d' a4 m8 C) j) P2 h. B, ]"5) Trim Geometry",& P7 Y4 h1 b4 L; y# N
"6) Selection Complete"};

static int init_proc(UF_UI_selection_p_t select, void *user_data);//初始化程序

static void init_camgeom_app_data(UF_CAMGEOM_app_data_p_t app_data);

int ufd_camgeom_ugroup( tag_t objTag, int obj_count )

{# E1 Y4 K& f3 ?
UF_CAMGEOM_app_data_p_t app_data_list[MAX_CAMGEOM];
- \; w- Y) ^4 Z6 vtag_t *objects, entity_list[MAX_CAMGEOM];
$ _  ^8 I3 H9 y) T: i2 Eint i, entity_count, object_count, err_code, type, subtype;

char atitle[] = "Geometry Selection.";
8 @5 I* L# L  U! v! hchar *cue = "Identify Geometry - Wait for the Filter!";
  g- Y; f  r4 M! uchar errorstrg[133];
. U; `8 i/ Q4 b& I; N. j4 f7 V0 ~" ]4 Hint response, irc;( c* {& a$ A# r
tag_t eid, view;
  w  Z7 h& J5 X. n; H( R/ R# Ddouble cursor[3];

#ifdef DEBUG' l( s- @  p. B9 m: `
printf( "Object tag passed into camgeom_ugroup is %d \n", objTag );) p: f* q' l) b  O0 Z: z. a
#endif

geoption = 0;

while ( geoption < 10 )//为什么是10呢????
1 F% i( Z1 w+ a4 I: Z  P1 c{" N8 ^1 h3 t2 u- [2 f0 W+ k, W
/* Statements go here for each geometry selection type. 声明起作用 对于选择类型的每个几何体*/

geoption = uc1603(title3, 1, menu3, 6);

if (geoption == 1 || geoption == 2 || geoption == 10 )9 ~+ f0 h/ k- X- X5 K# K
{+ |$ F1 X- J8 ~9 A% i. n, f
break;$ A3 U; q8 Q5 ?4 F! t& i9 b% u4 v/ k
}
7 J6 b6 K! b, h* E: G& `( N# J#ifdef DEBUG9 l- Q3 W' Q: n1 [& y$ [
printf("\n Geometry option returns %d\n", geoption);' s! R2 q! |7 f  ^8 G: i8 x5 W
#endif( K9 J3 Q+ d9 p
/* Allow the user to select faces or bodies. 选取面和实体*/

/* Pass in this function the object to be assigned geometry 通过函数,对象被分配到几何体 */

if (obj_count > 0 )  h) w7 P% A0 _2 @% P
{
; `& n0 R0 y$ N$ l0 yentity_count = 0;

while (TRUE)

{

UF_UI_select_with_single_dialog(cue,atitle,! O* X  b0 W, d
UF_UI_SEL_SCOPE_NO_CHANGE, init_proc, NULL,/ \' Q( t$ d- X
&response, &eid, cursor, &view);//选择单个对象,可输名也可打进去。选择范围在UF_UI中定义
9 a( C* I* @6 O1 Z6 z//cue 提示显示的信息,atitle 对话框头标题,UF选取范围,init初始化程序,NULL初始化程序,cursor光标位置坐标

if (response == UF_UI_OBJECT_SELECTED)
6 }$ D7 M, ^' a{
. s5 ?/ h& L% O* Ventity_list[entity_count] = eid;
7 V7 E9 z& D" M: M#ifdef DEBUG
* K) r5 t3 |3 _! u: L! Rprintf(" EID number returns %d\n", eid );' j/ N' v  ^& Y/ L
#endif

/* Allocate the memory for the application data of an item. 为当前的应用数据分配内存*/

app_data_list[entity_count] = (UF_CAMGEOM_app_data_p_t)UF_allocate_memory(sizeof(UF_CAMGEOM_app_data_t),
; @8 e7 d2 T: s( f&err_code);

/* Initialize the application data.初始化应用数据 */

init_camgeom_app_data(app_data_list[entity_count]);

entity_count++;1 L" O) Y+ \& ]
}
6 h9 I. A. ]3 ?1 |9 T& n% Z! belse if (response == UF_UI_OK || UF_UI_BACK || UF_UI_CANCEL )7 d+ |6 V$ {( \2 Z$ K# e
{* F# g* e2 G, I5 z2 e2 O( A
/* Geometry selection is finished.几何体选取完成 */
7 p5 |+ }9 ^" v5 x5 L8 `' F8 dbreak;3 w" _1 E+ E2 O  y. U
}  d' D5 |* V& ]
}! o: H9 B. X, f" ~) E6 w) b6 V
#ifdef DEBUG) W6 D  y5 @$ }  @
printf(" Entity count this selection is %d\n",entity_count);/ `: q# T6 B. F0 h
#endif

if (entity_count > 0)
- h7 m+ X( |9 w. `/ e1 ^% c! L{
  ^7 B4 A* r6 X! `# J9 X/* UF_CAMGEOM_item_t *items;
# Z6 u2 h( s7 @1 w3 m4 Dint item_count;*/

for( i = 0; i < obj_count; i++ )5 W* J  L4 K+ ]2 o6 t
{
/ E2 z; f, S3 B! T( ?5 xirc = UF_OBJ_ask_type_and_subtype( objTag, &type, &subtype );//返回对象类型与子类型TAG值

if( type == UF_machining_operation_type ||, _  \8 K9 ]! F4 N9 b6 t
type == UF_machining_geometry_grp_type)

#ifdef DEBUG, y8 L0 d6 {0 s, h3 M7 T
printf("\n Current entity count is %d", entity_count);
5 c( b2 U  [( m0 ?printf("\n Current object count is %d", obj_count);" Y) j' ^- b- ?
printf("\n Geometry option is %d \n", geoption );
: g5 w' K4 y7 T+ ?  J; i#endif

/* Above prints to help in debugging if "DEBUG" defined. */

{
$ U1 c" `( w* H( NswiTCh (geoption)
* @' t9 g2 T  S! l" Z" R{) M4 Q+ F7 x  @" o6 j* P* s
case 1:* b- s3 h3 p& i) e" W% R6 G0 F
case 2:
% |7 x  W& n) F$ L  xcase 3:* q/ ?- w1 Q; x; z% a
case 4:  s4 {0 x. Y7 e2 J0 d
case 5: /* Part Geometry 部件几何体*/, {7 m( ?* P' G' V
{7 _& J  H' G! O8 `  i
#ifdef DEBUG
  G% }1 K2 p6 X4 S" Eprintf("\n Type returned is %d", type);+ l  p  _* {! c  _' [
printf("\n Subtype returned is %d", subtype);& I2 f( j( q6 R1 y
#endif
4 Y4 P0 ]$ `' V  p{2 w/ ]7 r7 I# j) s( `' J
irc = UF_CAMGEOM_append_items( objTag, UF_CAM_part, entity_count,5 U# s9 Z& B" U" h) b2 q
entity_list, app_data_list );
& [* t' {3 A+ I2 O//附加一个几何实体链表给对象 几何体包括实体等 切削区域仅薄壁实体和面 修剪的几何体不允许。
7 Y% h4 H. \0 M6 m% N/ H; q//objtag几何体父级组,UF几何体类型,en_list链表指针,app_data_list链表数据。
# c  |1 o$ q4 S4 e& r4 a" f  Q}
4 h: q( }: n" ^- c# u& l+ Uif ( irc != 0 )
" G5 q: x; C0 I: e- N{
) [, K. R& J6 \$ r3 SUF_get_fail_message( irc, errorstrg );! V" Z. ^$ M2 T# U+ g1 s5 y3 |
printf("\n The return code is %d\n", irc);
2 o7 e$ ?4 l  g# Vprintf("\n Error code translates to %s\n", errorstrg);# @+ c0 Q7 q) X6 X5 ^2 W
return objTag;) @* g/ ]+ q( L- h" s
}
% e0 e/ N- v1 Fbreak;
, C0 ^* i# b7 }7 N4 m) k# S5 d6 N  V}

case 6: /* Blank Geometry 空白几何体*/3 C* ^& f- j/ n3 ~
{
2 c) J' Q" L* e#ifdef DEBUG
, V- p% o6 _# h# e, wprintf("\n Type returned is %d", type);
0 V( j' |; L: p1 Rprintf("\n Subtype returned is %d", subtype);2 b. Q# E$ r) W6 s
#endif7 h! L& f1 q5 V, {
{( d( Y6 \! R& w7 q  U
irc = UF_CAMGEOM_append_items( objTag, UF_CAM_blank, entity_count,, j7 h* H6 M! i0 Y; P5 k
entity_list, app_data_list );
8 G% n$ z5 _/ S0 e& N6 h9 X}
9 G  X3 w$ W& {8 Y+ A* Vif ( irc != 0 )
" Z- j1 C! W# B8 T  v" {6 A{- o0 |) Y" w  i; _4 M9 ~* S7 x
UF_get_fail_message( irc, errorstrg );' @2 ?, W! z4 v' h2 y9 W
printf("\n The return code is %d\n", irc);6 N  w1 A3 B3 q
printf("\n Error code translates to %s\n", errorstrg);
0 d1 Z" B. Q2 z. n" r* i& |return objTag;0 s7 C  r$ M3 v( j. i6 h: [7 u. [
}. j; ?# s/ u, e6 N9 M8 G6 f
break;

}

case 7: /* Check Geometry 检查几何体 驱动*/
* \- x6 A: t! k7 D1 x/ n; A{
9 h2 ]- O5 H0 ^" _* S# [1 Q  V#ifdef DEBUG
% H* t9 E. z( a( F  |printf("\n Type returned is %d", type);3 U/ F. [% @: Y, ^$ `% Q
printf("\n Subtype returned is %d", subtype);
# u2 j: j* }3 V5 A- ]#endif
# c1 V5 V# q% x{
, ~5 w3 l& i) d/ U: X; I, e! Rirc=UF_CAMGEOM_append_items(objTag,UF_CAM_drive,entity_count,4 @- ?* {# |6 k" k# \9 M
entity_list,app_data_list);
; [- J! }$ T7 B! J" N}
" `. x; a1 s% Yif ( irc != 0 )
( O8 R9 P# `  k1 v{6 t1 z" K; P5 M6 N+ d
UF_get_fail_message( irc, errorstrg );3 n6 C3 J# V7 r
printf("\n The return code is %d\n", irc);/ U1 Y+ s+ {7 H+ p, G' p
printf("\n Error code translates to %s\n", errorstrg);
6 I9 F9 _8 s+ Y' R7 greturn objTag;
+ \( U8 {; A0 m5 z- `& Z}" D4 X" \9 V$ ~5 A9 n! p. \
break;

}

case 8: /* Cut Area Geometry 切削区域几何体*/
/ z  }9 U; k9 R  j{
, l9 k1 c) r% B" z$ }1 P#ifdef DEBUG
/ `+ J& B, O# a3 Aprintf("\n Type returned is %d", type);
' E7 e( h4 B8 e  P2 Cprintf("\n Subtype returned is %d", subtype);: }; Y2 t. o" b' }
#endif+ F3 i& u1 H& Q( z* ~8 V; G
{
' {; `  E8 v0 {: birc = UF_CAMGEOM_append_items( objTag, UF_CAM_cut_area, entity_count,
. ~# T7 n& Z/ Z2 B; ?; ]1 U+ @entity_list, app_data_list );
& A5 S5 @9 ^- K& ?& [" z}5 ]; d$ [$ U' G. _2 l
if ( irc != 0 )
0 M! j, y4 @. b: x- f{
' @* d$ z  g1 _3 D- ~UF_get_fail_message( irc, errorstrg );7 ~) c5 S" K3 K2 X4 M# ~3 m# s1 G
printf("\n The return code is %d\n", irc);
7 Q% M, Y; M5 Y) T3 s$ K* xprintf("\n Error code translates to %s\n", errorstrg);; _4 ?" }6 l" e  O- A' p  O# z1 s
return objTag;% w" n6 R2 L* j; o9 b
}
5 c6 A9 [. q1 O  Lbreak;
5 u  q3 R* |; h5 b1 W- h}2 Y; N# c& ^% g3 T9 Z- P. ~
case 9: /* Trim Geometry 修剪几何体 */
- r) W. O, {8 P/ r7 ~) O$ u% {{' l+ @6 C) y$ S3 t! L. E3 I
printf("This case not implemented.\n");
  U  c4 T3 q3 _) T% V, O- m& a5 Y  gbreak;, P- k* `) m# |3 e2 k1 n; r* G! M
}0 J, @+ C6 D5 [6 _/ }$ G) F7 ]
/*Drive Geometry 驱动几何体*/

default: /* Selection Complete 完成选取 表达式没有相应的则走这条语句*/, h. g' n6 B: T% t9 q
{  D! v9 [; _- Z. H, p' o
break;) `5 K) X: ]- U1 ?- F% n
}
# P- x# M, s, y}
: i( P. {: |, [. j7 }}9 a8 m& M" u3 F- o3 S
}
: V) Z- h+ m( I; }4 x, o/ t  q3 _}6 Z- S2 Y8 d' N
}
; v. S) ^- f% t}
2 |. J1 ?8 O! F" \4 P% j/* Free the Allocated Memory. 释放内存*/
5 h+ ^" B- ]! R- G1 Gfor (i=0; i<entity_count; i++)
/ l$ Z9 Q. t3 _* z{
8 ~0 L3 v! C4 \7 j$ ^, Y! o8 NUF_free (app_data_list);3 y; k' Q, Y% L
}

/* UF_free (objects);*/

return(0);
( \% K" a9 a: p& X2 S}
3 d- Q9 z. Y) i; V; H! E8 ?9 y1 b/* Selection initialization procedure 选择初始化程序*// Q: a- u3 _' v
static int init_proc! \- e8 b1 d( D2 B/ }" D4 f- g
(  ]( y" [1 D& G/ w9 O! k+ C
UF_UI_selection_p_t select,//指针 pointer4 R) E- V8 x7 _" M) c2 Z6 ]$ u+ M& t
void* user_data% t: ~2 A6 l9 M9 S+ L0 V' L6 i
)% a/ t6 x9 [  g/ }! p5 n! |
{3 ]0 ^& ~& U7 l* `
int num_triples = 3;
- T; ~0 `/ \0 w+ x$ q  r' z+ k//最终指定的特征类型
, g, M0 J; H0 _  S4 H5 g& fUF_UI_mask_t mask_triples[] = {6 X% Z1 {; y2 l- L! N
UF_line_type, 0, 0,1 S, Q  T: t& ]4 L" t
UF_solid_type, 0, UF_UI_SEL_FEATURE_ANY_FACE,. x6 I/ K: C% v% V6 p4 g  G) ]
UF_solid_type, 0, UF_UI_SEL_FEATURE_BODY};

/* Enable Faces and Solid Bodies允许选取面和实体 */

if((UF_UI_set_sel_mask(select,
* t# y6 L+ z3 e5 ^5 {8 {2 E) EUF_UI_SEL_MASK_CLEAR_AND_ENABLE_SPECIFIC,
5 S/ O- S7 k* f. t% vnum_triples, mask_triples)) == 0)//3倍 3*3=9

{  a2 `( r. o9 X# S8 w- c
return (UF_UI_SEL_SUCCESS);  I  \: k+ {+ S/ C
}: r! g' J0 x3 o  r. I# @
else) [5 v) K6 L2 v0 Y9 i
{
7 Q7 X, A2 f. n: @return (UF_UI_SEL_FAILURE);
6 P: o# v9 O" F; l. S  v- a}
8 U' e  [. ], `" t& k3 c}7 D: n- w7 L  l! N4 I! V0 N! O% @
static void init_camgeom_app_data' {4 K% W3 j4 }2 `$ s; R9 _! O
(
/ m% R$ a! p  ~+ D) R8 uUF_CAMGEOM_app_data_p_t app_data
- h8 j/ N! {8 s& J4 M! c/ E)9 r! t4 f* L! p, s8 ~; r6 w( G
{6 d5 \- J6 q" y4 \3 s
if (app_data)
* P$ H$ R0 x5 ]. A{6 N9 O) o' j4 T9 k6 ^+ m
/* Set flags. 设置标识*/

app_data->has_stock = 0; /* Used 1 - Else 0 *// `) g) w; x5 \: A+ H1 }, W
app_data->has_cut_stock = 0; /* Used 1 - Else 0 */
8 j5 V$ g4 D0 {) v7 T0 B$ capp_data->has_tolerances = 0 ; /* Used 1 - Else 0 */
+ Z( A$ X; H: a" P+ m+ B; W9 Gapp_data->has_feedrate = 0 ; /* Used 1 - Else 0 */7 o2 ~2 Z* C- e8 w5 `) j
app_data->has_offset = 0; /* Used 1 - Else 0 */2 |: E$ A2 O+ `, ^% R' W+ G
app_data->has_avoidance_type = 0 ; /* Used 1 - Else 0 */

/* Set values.设置参数值 */
) G' ~3 ~- R+ y+ O% r: e9 f9 Napp_data->stock = 0.033 ;
3 y/ s/ `& P/ _) h$ k' R3 S3 Sapp_data->cut_stock[0] = 0.2 ;0 G, t: W! W, Z5 d7 p
app_data->cut_stock[1] = 0.1 ;
/ k& `5 n1 E4 d, M# z3 [, g8 aapp_data->cut_stock[2] = 0.5 ;
4 R6 z" Q, D6 P* j. r, Y& Bapp_data->tolerances[0] = 0.003 ;4 o! C+ M3 {; D6 k
app_data->tolerances[1] = 0.003 ;
+ F; t& I+ {: v( Z3 S* R; O7 u$ ~% Eapp_data->feedrate_unit = UF_CAM_feedrate_unit_per_minute ;
1 k, M7 ~" L/ t# Q" w0 F5 m. rapp_data->feedrate_value = 33.0 ;  U2 K+ _/ n, _2 P
app_data->offset = 0.055 ;; ~3 f9 f0 ~6 e* f& _. ^
app_data->avoidance_type = UF_CAM_avoidance_type_warning;
8 P9 L5 `8 x- }/ _- _# A; i}
  P6 o- B4 `  A2 v4 U5 \  j}


6 j# }: X9 n7 ?' o
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.diantuankj.com/ doTeam.tech
回复

使用道具 举报

全部回复5

wskgumnm 发表于 2014-8-5 00:57:44 PLM之家手机频道

wskgumnm 沙发

2014-8-5 00:57:44

很好好好学习
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.diantuankj.com/ doTeam.tech
回复 支持 反对

使用道具 举报

Jocelyn 发表于 2017-7-18 21:43:08

Jocelyn 板凳

2017-7-18 21:43:08

UF_CAMGEOM_append_items
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.diantuankj.com/ doTeam.tech
回复 支持 反对

使用道具 举报

Jocelyn 发表于 2017-7-18 21:44:34

Jocelyn 地板

2017-7-18 21:44:34

UF_CAMGEOM_append_items我是用C#写的,用这个函数总是报‘Method not found’错误。
- A+ _1 w  G9 z& ^5 O$ [有了解可能的原因的吗?
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.diantuankj.com/ doTeam.tech
回复 支持 反对

使用道具 举报

至简天成 发表于 2017-12-11 15:36:10

至简天成 5#

2017-12-11 15:36:10

不错不错,正需要的东西
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.diantuankj.com/ doTeam.tech
回复 支持 反对

使用道具 举报

至简天成 发表于 2017-12-11 15:49:09

至简天成 6#

2017-12-11 15:49:09

7 N9 }) x1 M* C2 z4 X9 B5 A% x
不错不错,正需要的东西
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.diantuankj.com/ doTeam.tech
回复 支持 反对

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 注册

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

    本网站(plmhome.com)为PLM之家工业软件学习官网站

    展示的视频材料全部免费,需要高清和特殊技术支持请联系 QQ: 939801026

    PLM之家NX CAM二次开发专题模块培训报名开始啦

    我知道了