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

[二次开发源码] NX二次开发源码分享:报告装配加载状态,设置装配加载

[复制链接]

2019-9-15 08:32:35 1628 0

admin 发表于 2019-9-15 08:32:35 |阅读模式

admin 楼主

2019-9-15 08:32:35

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

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

x

+ C& X1 b$ t4 s7 u/ s4 @NX二次开发源码分享:报告装配加载状态,设置装配加载
' a' f. `; R9 U2 a4 ^3 Q$ ]* a; C5 ], y% T
获取Load Options 并进行处理!
. T- f4 j2 d- E* p; _* Y' c2 F7 I
4 u3 L5 |" z. W3 P[mw_shl_code=c,true]#include <stdio.h>
) ], F; v9 [, u: e4 m/ r#include <string.h>5 u/ Z0 q7 K: @, Y. _9 a: k  e+ Z
#include <uf.h>
# x! {# @: ]8 m) i#include <uf_ui.h>
! X3 B# E' m/ W/ s#include <uf_assem.h>
. F5 F8 [, P: o( f; \) I# Q
. P& G: x; Q& E1 y0 w#include <stdarg.h>
$ n* g4 Q1 B6 t' r( u3 d; C- ]0 x% D! V! D1 A2 E3 ?
static void ECHO(char *format, ...)& u& r4 T3 c4 H$ W; {& b
{. Y# x3 i/ ]$ o6 O3 ?
    char msg[UF_UI_MAX_STRING_LEN+1];
6 F4 q& G0 D. R4 u    va_list args;9 x' S* e; @4 I8 A9 \
    va_start(args, format);3 C4 [( ]' j$ ]
    vsprintf(msg, format, args);
5 e! Y. m0 h! j/ }1 t    va_end(args);
* ^/ S& W& k0 S! ]8 _* q    UF_UI_open_listing_window();
" E' j- q- m" f/ y' E; `& P    UF_UI_write_listing_window(msg);
, {" v  e$ ]. }1 D. W' \    UF_print_syslog(msg, FALSE);, n* J( V1 k" ?% c+ n
}
9 l% s+ B3 ^* r/ i: a& r, x, h. i. P) O- u
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
8 l8 N6 R; B! A+ ^9 n  A
! f1 E( F, u& `. S7 Cstatic int report_error( char *file, int line, char *call, int irc)
( V8 O" k  L$ g/ A" h8 d+ B: j{0 D6 l: j1 k4 h
    if (irc)- z% x, D& g3 p; P
    {
; m: `" d' @* H$ Q% k* g        char err[133];
( w+ f; E, p7 X- j: d' e) D  Z5 S. T( E/ u  m5 c
        UF_get_fail_message(irc, err);& X) d/ E) v* Y# ?4 c4 a2 v
        ECHO("*** ERROR code %d at line %d in %s:\n",
2 J& y7 n- A# f& E            irc, line, file);9 K8 \4 M4 j8 P, i1 W% s: m
        ECHO("+++ %s\n", err);
* v, e: J* d4 v' `/ ~+ G' L+ k; w, q        ECHO("%s;\n", call);
7 _5 m) K- d" `( s; {    }
5 V  B( m+ l' ]: ]- ?
+ ?* @; S$ @. w: l    return(irc);0 l& p& g" ~2 @2 C: T; ?& {: e" R! Z
}6 S; q1 F7 k+ s$ N  q1 k

% y0 l# z# x4 y; cstatic void report_assem_search_directories(void)- A9 J& O! p8 A! W# j; i
{' E- d4 p8 r5 N8 J, R/ D# K
    char
! u: J" c; G$ N/ }        **dir_list;8 s5 H$ Z: W6 T2 ~4 ^5 @  ^
    int
8 C& i# p6 d! ?* x- J        ii,) N4 k$ k2 [; C1 }4 S
        num_dir = 0;4 n% Q2 S5 R- Y  U9 U9 ~
    logical4 b" X5 x6 E+ a1 e
        *subs;
' ^4 `) x/ W+ H! ~. Y" O
; ~, ]. s4 B7 _1 r" t    UF_CALL(UF_ASSEM_ask_search_directories(&num_dir, &dir_list, &subs));4 {+ ^* Z! ~4 M3 ?; Y3 N: a" A. ^
    for (ii = 0; ii < num_dir; ii++)
- M, K6 U7 X( d/ j. I/ Z    {5 M+ I) @: i9 a& O+ m
        ECHO("%s", dir_list[ii]);+ t8 O2 r2 d9 q5 m- f
        if (subs[ii]) ECHO("...");
4 ~! o  M0 c+ G. e0 g) u3 {        ECHO("\n");
. p3 J$ z' A- f( t& O  P! n    }5 w* d$ B- b$ B+ m
    UF_free_string_array(num_dir, dir_list);
& d: g, i1 i, M  b# R% o5 I    UF_free(subs);. ?0 A3 `- L8 i, Q
}
  u9 C6 P8 u2 F! F# \  w* w& T4 i
static void report_assem_options(void)1 y0 Z& }. U% d, x4 x
{6 T& A, {, t2 z6 q: T
    UF_ASSEM_options_t
/ x, u. A" c2 V7 g9 U* c        assem_opts;
% C; O8 C3 u, F7 F/ w5 Y" V! }2 h  t9 D# L" v
    UF_CALL(UF_ASSEM_ask_assem_options(&assem_opts));
# h1 \5 P; t) s; i* u  U/ V
( k* X: K- e1 M/ Z2 O) g5 t    ECHO("Part Versions\n");
3 k$ h5 A" M  o8 n$ h5 \    swiTCh (assem_opts.load_options)& {# w, d) L; @
    {* l1 J1 x: K" v  B: z& q
        case UF_ASSEM_load_from_directory:+ F! ^* U" C% ]! d# Q
            ECHO(" Load = From Folder\n");1 q, o+ E/ l7 ]. `  Z
            break;- `( l( b! T& v4 S2 [; `
        case UF_ASSEM_load_from_search_dirs:/ a5 ^" \( |5 _2 w  m
            ECHO(" Load = From Search Folders\n");
8 `! Z0 k6 j5 G6 {            break;; `  W" i+ e: P6 o& H4 O
        case UF_ASSEM_load_as_saved:
$ P' t. E3 N4 e) ]+ K            ECHO(" Load = As Saved\n");
& K) o4 P# d7 \* \7 K            break;
8 U4 q4 z$ j! O$ M: e        default:
# b, L; W: `$ p( w* H; a6 z            ECHO(" assem_opts.load_options = unknown value (%d)",
% p' E! j  _! E$ f* x. E                assem_opts.load_options);
. z" i8 B- ?' ]% R            break;0 M$ e  T% d9 e# r& N1 |
    }
  g, a* ^7 o4 d0 B- o! d$ W
& X  I9 j* N& j/ T4 t. e  G    switch (assem_opts.load_latest)
; `$ a: D5 v! d# a    {
6 ~) s( l9 R! w+ Q$ W        case UF_ASSEM_load_exact_version:
" w5 g1 P" T3 z. g- v# @            ECHO(" Load Latest = Off\n");9 |, x4 B% |6 [8 i5 a
            break;, u$ z, _! O; Z! f$ E
        case UF_ASSEM_load_latest_version:
' E: T3 ~$ h% T$ s- H            ECHO(" Load Latest = On\n");5 Q% \7 O& u5 W- U2 o, O; A3 y
            break;2 B# d- v7 e& r0 k, ~
        default:
0 K# i% D1 f( B( g6 g0 r, h            ECHO(" assem_opts.load_latest = unknown value (%d)",
/ f7 h9 x) H0 j$ s  i2 @3 b                assem_opts.load_latest);# r  o/ G" H; K  m
            break;& b4 I6 w' T. z* b" R) S6 w) |
    }; Z! D+ G+ Y9 j" l4 Y& C

, C! T& N4 c0 g) d    if (assem_opts.load_options == UF_ASSEM_load_from_search_dirs)
4 R! _3 j! q- a  ]" G$ E. D( d        report_assem_search_directories();: ]. W/ _) m/ o: V% a3 q
; v- t% u; c" r) }( A4 \
    ECHO("Scope\n");3 h! f' o* e0 g
    switch(assem_opts.load_components)  L* j( W$ [7 L2 R
    {5 r) a8 p: {) \$ h1 H
        case UF_ASSEM_dont_load_components:
  U  D. d/ [+ ]6 w            ECHO(" Load = Structure Only\n");
8 ]$ l) ^! c8 G! @            break;
4 V, a; G3 i3 P& ?3 C        case UF_ASSEM_do_load_components:
% s6 N( _$ b7 B, _# o            ECHO(" Load = All Components\n");, ~8 k- ?! R8 t/ {
            break;  m5 A. ]3 c  l3 \  ~# n: V
        case UF_ASSEM_use_last_component_set:, g. q5 }! M! `8 a( H7 e
            ECHO(" Load = As Saved\n");3 X# {6 w; W  s: a& e
            break;
. Z8 u3 }  r+ e8 H* h2 V! {& r        case UF_ASSEM_use_last_filter:
- o' d" a! p/ i  w5 s* I            ECHO(" Load = Re-evaluate Last Component Group\n");" O: C" {, P2 e. ?! T4 ~
            break;
& b; p6 n5 M9 r0 Y" u' M        case UF_ASSEM_specify_filter:* J; d9 U3 A& n( _
            ECHO(" Load = Specify Component Group\n");9 F5 }$ }7 L! Q, D
            break;
" V! F! A& P# l( ]- ?3 z& @& ]        default:( W$ S, K- s1 k) @% g% |& X( {! x
            ECHO(" assem_opts.load_components = unknown value (%d)",5 e4 G, E1 e5 p. O. F+ O* }, @: K# g8 s
                assem_opts.load_components);
" Q+ E0 Q  T3 I            break;
. m1 e2 f6 q$ U0 r& m! e' ?    }
+ }/ Y+ k0 a# C5 k
0 \* K6 T  t, @! c% s: e& Q; R1 w    switch(assem_opts.load_fully)
  {4 u' J0 s- L, [5 s    {
/ T4 o' z3 `( _6 F& R        case UF_ASSEM_load_components_partially:; i: p: y1 u' X+ w+ L  D
            ECHO(" Use Partial Loading = On\n");) B; p( k/ y/ I4 R: E
            break;
( Z6 |4 V7 k! w+ t# o9 l6 H        case UF_ASSEM_load_components_fully:
* @$ @8 a' K- U% o; }            ECHO(" Use Partial Loading = Off\n");% ]& y8 T. @2 ~- ?0 H
            break;
: ?& J0 J! i7 T, Q' x2 @. t        default:% W$ v: _2 N- w3 @
            ECHO(" assem_opts.load_fully = unknown value (%d)",
1 v: e; A% |4 K                assem_opts.load_fully);% {" m/ I! a5 z% K
            break;" h, x2 O. b5 ~. E
    }( U; c8 V4 P* i# i
+ `* w& W9 ~, R) m! b8 U$ M
    switch (assem_opts.load_wave_data)5 o; }$ S3 e+ r* x1 o- a! ~7 B* h8 F# A
    {
& F7 ?9 U7 {, u5 i9 o4 t5 ]        case UF_ASSEM_load_wave_data:
+ ]" f1 {6 ^( F# Q; a: [            ECHO(" Load Interpart Data = On\n");* V8 X( I& U  w0 p  C  P
            break;# C$ ?' ^% j6 W) t$ Z
        case UF_ASSEM_default_load_behaviour:
/ Y* t' ?( |# F5 P: x            ECHO(" Load Interpart Data = Off\n");7 p* N" V1 }& E8 c' _
            break;$ f4 Z# c: F# Z. l( V% H$ s% b
        default:, q+ ]% \+ W1 M( A
            ECHO(" assem_opts.load_wave_data = unknown value (%d)",2 w( ]6 i# l2 V' t
                assem_opts.load_wave_data);) r3 C. G$ r4 z0 x
            break;; w' f& E# m. f3 X) q. g, [1 @
    }" G1 T  `9 i( Y

  X( J' P# D8 o% r' U    switch (assem_opts.load_wave_parents)
  z# X* h' s0 Y    {
# c9 F4 M7 s% C$ M0 _8 w- l        case UF_ASSEM_none:
" Q! v* F/ Z/ I, t            ECHO(" Load Parents = None\n");
# z$ O) X: p, T: j6 e            break;9 K" P! P* U8 o* q
        case UF_ASSEM_immediate:) n" S  _$ w- E
            ECHO(" Load Parents = Immediate Level Only\n");
$ J: G# X# r* I& l8 k            break;
; P$ Z( x3 X# v0 f. l& d5 \) J        case UF_ASSEM_all:
* b; L! h$ f0 U  h6 L) p            ECHO(" Load Parents = All Levels\n");0 o& }" ~$ P+ d
            break;
# g" P4 I# T- `% ?& D9 D        default:
, ]6 c# M, I' O# }; x, {- o" W            ECHO(" assem_opts.load_wave_parents = unknown value (%d)",
8 U- {0 \$ Q6 ]- x1 r% f- _                assem_opts.load_wave_parents);; b2 u$ Q& B8 B4 D/ v, e4 O1 \3 A
            break;; _, I# V- V- X( k0 `0 C
    }/ @! V( u1 Z. r- ~: H

/ B# X: ?6 T1 I' `$ a    ECHO("Load Behavior\n");
7 S0 F3 Z' u+ Q$ h/ M) J9 U' Z. W: V    switch (assem_opts.load_substitution)) T! l. F) e2 b: s* I$ B  h3 Y7 R
    {! {/ m9 a4 F% g) p
        case UF_ASSEM_do_allow_substitution:3 j5 L# Y" `, Q$ y( @
            ECHO(" Allow Replacement = On\n");
& d/ w4 ]: x$ n, W+ R$ J            break;
4 a! P9 a$ w1 H! R& X8 R        case UF_ASSEM_dont_allow_substitution:9 k! n# \: o1 o5 |' k8 k
            ECHO(" Allow Replacement = Off\n");% _( F! w# L) l( C
            break;
4 T, i2 l5 S8 m1 [* ~; x% ?        default:$ [, v. P7 H  J1 r8 X: R
            ECHO(" assem_opts.load_substitution = unknown value (%d)",# r) C! X# C; M, L- O( p; l
                assem_opts.load_substitution);
* j1 _" V. S. q            break;$ `+ ?* N3 U+ I3 S2 f3 `+ j5 _! v
    }
* a4 K% {7 a  g
4 Q7 x: L' `. P% M    switch (assem_opts.auto_regen_pfm_option)! _( p1 h, U6 H; R
    {
1 M; j; m7 ~; L* _        case UF_ASSEM_auto_generate_pfm:
8 b( \& l+ h+ R, [( U# b            ECHO(" Generate Missing Part Family Members = On\n");% I: B% K, ^( c9 O3 v: C' V. d+ n
            break;' ?5 S; J* Z3 }+ @/ N
        case UF_ASSEM_dont_auto_generate_pfm:
6 N( Y' E6 h- q$ g: U) ~            ECHO(" Generate Missing Part Family Members = Off\n");5 l1 h8 V6 `9 b( d# P5 ]. }6 W
            break;
; e& A8 A) w6 F6 A) t        default:9 N& |% @- v. m
            ECHO(" assem_opts.auto_regen_pfm_option = unknown value (%d)",, z0 [- N) R$ g; i1 }5 }/ J
                assem_opts.auto_regen_pfm_option);
0 d7 S$ f) }; k1 D# P, W$ b            break;$ f8 N% j* R2 d* s9 p
    }% n: i; \* k9 u+ I9 H

3 i$ e" M/ U" O. H7 t) n1 v    switch (assem_opts.failure_action)" K1 s" |( S) H: w$ N. V
    {7 [* C7 o6 H: @1 Y
        case UF_ASSEM_do_abort_on_failure:
" `2 K5 I. h' N: ]            ECHO(" Cancel Load on Failure = On\n");& k8 b8 z" Q! ]  L- o. N% U
            break;
. v: Z8 s) V8 j        case UF_ASSEM_dont_abort_on_failure:
# ~0 y) X: t  X* l  U' B            ECHO(" Cancel Load on Failure = Off\n");
2 ^+ c1 ^1 m1 A" K7 B  p0 @            break;
/ I4 P# m7 L7 j# L# x        default:; ]) S2 E  l, R' j% {% J) b
            ECHO(" assem_opts.failure_action = unknown value (%d)",
$ P1 Y0 j8 }) S4 w5 f/ F                assem_opts.failure_action);: q7 w# M7 w: C) i$ Y$ ]
            break;
, g# s7 c* u) K6 o- k  @    }" e- W& |7 k+ [

( w2 \( D  S+ q+ O8 \; C( g* x    ECHO("Reference Sets\n");
8 ?7 G7 r# U2 R0 k8 Z    switch (assem_opts.apply_to_all_levels)9 S7 r0 Q4 b8 b& }/ G9 }
    {
1 f+ \( E9 g8 S4 N        case UF_ASSEM_do_apply_to_all_levels:
* n2 b; a) {0 l6 {            ECHO(" Apply to All Assembly Levels = On\n");( ^  m% k' w% }. F- Q* k9 g/ O: w
            break;
. U" F. H7 Q7 f        case UF_ASSEM_dont_apply_to_all_levels:
0 i; U, |' u! s) X! ?- J7 O1 b" m            ECHO(" Apply to All Assembly Levels = Off\n");
7 W+ t: S# ^8 A. E4 ?7 ]* V' N            break;
- V: {5 u' k% s$ W        default:; l! H1 i6 l9 o, p$ J/ P$ e
            ECHO(" assem_opts.apply_to_all_levels = unknown value (%d)",
7 x. |) Z" F9 [! u                assem_opts.apply_to_all_levels);" Z; V/ V! _# {3 q& R; H7 K. Q
            break;$ U, y) F  J* f; \0 I! n0 K6 b
    }: D3 u9 ]: s& n& r" B. o

7 e! d0 o- G- g0 w' f    ECHO("Preferences-> Assembly (misc)\n");
1 i9 I0 H- f4 @+ k    switch(assem_opts.emphasize)
; r% `) ?3 V& n; F+ w3 F( F    {3 n3 N6 w9 B4 m1 z9 i) V3 F  \7 N
        case UF_ASSEM_do_not_emphasize_wp:
9 Q! C$ s! p+ ^, d            ECHO(" Work Part-> Emphasize = Off\n");1 R+ m1 @1 e4 }5 Q5 w) X0 C- t4 i
            break;9 d% L; m1 F2 U
        case UF_ASSEM_emphasize_wp:
) T' ]4 ~( U8 Y' n            ECHO(" Work Part-> Emphasize = On\n");# |0 q2 n6 N# d
            break;+ z! O1 X4 d8 @( k: O
        default:4 t4 I8 P& w+ @7 D$ m4 T& o
            ECHO(" assem_opts.emphasize = unknown value (%d)",- K# c/ o0 p$ v9 \, N( ?
                assem_opts.emphasize);0 C' Y& @) P8 l- z, W
            break;, P) I9 M* h) x! Z. k- o
    }! b3 g2 I3 i- @7 u* A6 M( N

8 Z$ }8 w$ o4 d) m# T( A) d2 f    switch(assem_opts.maintain_work_part)6 v  Q: q: r2 X* ?) V/ |
    {
2 S! Y3 B6 x; _- [- o, @        case UF_ASSEM_do_maintain_work_part:+ [% S+ L# j" \% ~
            ECHO(" Work Part-> Maintain = On\n");% p. Q- J1 ^- U/ f1 V* P, D
            break;
& @1 m" ?) c, H  g$ J        case UF_ASSEM_dont_maintain_work_part:" P3 V- {4 q  V7 d, a6 G2 d& t( a. N
            ECHO(" Work Part-> Maintain = Off\n");1 H# H& X: O0 b
            break;
7 Y( m. a' r9 l, l! S7 l5 N        default:
; l9 |; m) A. D            ECHO("assem_opts.maintain_work_part = unknown value (%d)",5 s+ J( L$ b5 j. b5 b
                assem_opts.maintain_work_part);7 n+ Z0 @9 c( N) ?! G+ `
            break;
3 O* E- \- F! Q& w8 U8 L0 I! E    }% L) n! z1 l# L6 B
    switch(assem_opts.update)% z! ~, N  m! v( ?# r5 K3 B3 K
    {
9 H. X; X% w9 {- d* d& l        case UF_ASSEM_no_update_report:4 M1 g9 e8 u' W) D. k7 C
            ECHO(" Display Update Report = Off\n");% ?7 q/ l  @0 J9 W+ }
            break;' r% b. ?" p# ~+ t4 A  ?! g; F
        case UF_ASSEM_update_report:
& z% m# h3 H# g1 Y' y: c            ECHO(" Do Not Display Update Report = On\n");
8 |! V8 [; o: r            break;
+ J4 F' b/ F: Z0 h        default:4 q  o- h! P3 B+ |
            ECHO(" assem_opts.update = unknown value (%d)",1 |4 \# ]/ V: r4 y: v" |, ~( N; g
                assem_opts.update);% V' s! G. m0 z4 c2 ]
            break;
6 ^1 j6 d- V2 X1 W    }
# G! }$ r( L8 j$ G}
( A: c0 V2 s- W% a3 h
, W* C3 L1 n! ^9 W: e4 R; Ystatic void load_specified_load_options_def_file(void): `7 z0 w+ m) y. T' ]* q
{
/ F9 |, W+ }- w    int
8 U' J. {& g3 X5 }) }        resp;
, W4 k0 S( _8 f4 Y" b- O( u- R    char) J, e8 e. d% Y" X$ _% J' s
        filter[MAX_FSPEC_SIZE+1] = { "*.def" },6 [- X& A6 n1 i0 x9 @
        fspec[MAX_FSPEC_SIZE+1] = { "" };$ F( g5 H" F* K
, S& t3 a# @# R9 s
    if (!UF_CALL(UF_UI_create_filebox("Enter load options file to restore",
# c, ?' Q: z) Z1 A' u- v- R$ J        "Restore Load Options File", filter, "", fspec, &resp)) &&% s, l8 G8 Z7 e/ u* Y
        (resp == UF_UI_OK))5 k+ w/ z  N6 Q
        UF_CALL(UF_ASSEM_restore_load_options(fspec));
. n" U" d6 f. a; D}& O1 H) ~: Q7 }9 Z

0 E6 U, r' a# D6 `/ g# i; ]static void do_it(void)% K- T. r& x" j4 D, Z
{
  x+ W+ e" p, a! B9 v/ a    ECHO("Current load options:\n");
. T0 v/ p5 \4 q% C    report_assem_options();* }0 K+ ]; f  E  k5 ~/ i/ ~/ L$ ~
) A4 ~- W: P5 U# A( Q. G6 s% c
    load_specified_load_options_def_file();- E) O, }7 b% Y
. M4 [; r1 m3 w9 |
    ECHO("\nNewly restored load options:\n");
; b6 I% l2 W7 |5 ]. r8 R    report_assem_options();
! j+ J: W! f6 J" u7 M, ^}5 n& o! `+ ~8 h0 G0 }  N4 a
& S$ f" C9 _, }( [6 f
/*ARGSUSED*/' X8 K$ d2 ^6 n( I2 D: l6 b  l; N
void ufusr(char *param, int *retcode, int paramLen)
% {5 Y" K4 W+ e. d{+ y( N, [" ^8 C; z& s
    if (UF_CALL(UF_initialize())) return;
; @8 X: e. Y3 E+ S2 H    do_it();$ ]8 g# L* R' m+ z
    UF_terminate();/ l. ~3 X) r' u) u2 c
}
+ I* `, ~9 D- Y! f: _
4 F0 Z# v/ v4 X+ ?6 e* k! Oint ufusr_ask_unload(void): X% o' C/ N  n# S. I5 T: v+ {
{
2 m" A6 ?$ F% K: r( F    return (UF_UNLOAD_IMMEDIATELY);
; S. q$ A* o5 w( N1 r$ M- [}[/mw_shl_code]
  Z% @' y! Y3 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二次开发专题模块培训报名开始啦

    我知道了