PLM之家PLMHome

 找回密码
 
查看: 2931|回复: 1

[资料] 使用UFUN进行UG NX二次开发: 装配设计技巧及步骤

[复制链接]
使用UFUN进行UG NX二次开发: 装配设计技巧及步骤3 K# H# _+ r- L9 l! |' `% O6 f

7 Q6 Z* Z; `/ L& J$ w
$ x: P* D9 h, m2 c( c0 y' Z
1、装入部件& }- j) L- S* m. ~. f
通过函数UF_ASSEM_add_part_to_assembly()指定部件装入的位置 、姿态等信息,实现在装配体中装入一个部件功能;8 x6 P1 R8 Y! i9 `3 b' g

! ~) b& N& n# m* B2、创建配合关系
1 k7 p- F' R: S* ^1 j9 sa.通过函数UF_ASSEM_init_mc()初始化约束;
. Z$ _8 _* R" B2 o1 `$ gb.定义约束关系,即填写结构UF_ASSEM_constraint_s中信息;
" a1 u; C. v0 |. ^) @. s# N- I. q装配中各部件间的配合关系是通过装配约束关系来实现的。装配约束是指一个部件到另一个部件的约束,将部件A配合到部件B上,则部件A称为主动件(from),部件B称为被动件(to),在约束求解过程中,被动件在装配空间中的位置固定,而主动件将变换姿态到满足装配约束位置上。组成配合关系的约束之间不能存在几何关系上的矛盾,也不能形成循环定义。
0 R9 _* [) a, A# Nc.通过函数UF_ASSEM_solve_mc()求解约束;9 E; v( L. m  S0 O
d.通过函数UF_ASSEM_apply_mc_data将约束应用到装配体上;6 J9 ~6 `; e2 }
e.通过函数UF_MODL_update更新模型。
4 w. z0 u( d/ B. p( u- R; i) h1 E9 c" a: Y. F1 j* b9 \0 G
  1. #include <stdio.h>
    ; T  X$ K4 }8 W# `" z' q. c
  2. ! t; U6 s1 M5 I; ~, S6 U
  3. #include <uf.h>
    4 d# p' U: W# C0 |+ O
  4. #include <uf_ui.h>2 N  A5 v9 X+ [2 X8 I
  5. #include <uf_obj.h>
    8 v  Y9 W9 @7 [% m
  6. #include <uf_disp.h>) b' I/ l3 P( U% f- [
  7. #include <uf_modl.h>
    6 [: j- E( |4 ?; y$ ]6 H
  8. #include <uf_part.h>7 u; |. @' l( x1 Z' ]( |
  9. #include <uf_assem.h>
    6 B5 l; I: Y+ @8 f9 n

  10. 1 c0 g% a' S: U/ W( @. S! ~: M
  11. #define UF_CALL( X ) ( report( __FILE__, __LINE__, #X, ( X ) ) )
    ; H: B2 Z$ h# u9 d# r
  12. " r) d' X5 r$ ~2 S1 q/ ]. ~
  13. int report( char *file, int line, char *call, int irc );
      Y* `5 x0 t0 c8 v, K
  14. void DoAssembly( void );
    3 w& d9 ]- z- o3 J  _9 h

  15. . x3 Z, I0 `5 M2 V; B0 z1 T
  16. int report( char *file, int line, char *call, int irc )2 _# r7 \3 d5 q# M
  17. {
    4 o5 I& c: [& @) y$ m9 F* X! F
  18.     if ( irc )% o; _/ `* }: o2 b
  19.     {5 m% o' j' S" }6 @( W
  20.         char err_msg[ UF_UI_MAX_STRING_LEN + 1 ];6 Y+ s+ _2 [6 m0 J8 D
  21.         char msg[ 133 ];
    2 w/ O6 X* E7 D2 m3 v
  22.         char fail_message[ 133 ];
    1 l7 @0 L" ]/ L) Y5 ^5 W
  23.         int  len;, m" s* p! h2 D/ N. D- x: }( C

  24. 6 Y4 h# i0 I7 c& {3 \8 Z
  25.         UF_get_fail_message( irc, fail_message );
    * {/ w- [" G% B

  26.   o7 q5 W& z* ?5 Z6 F# p: A
  27.         sprintf( err_msg, "%s, line %d: error %d: %s", file, line, irc, fail_message );
    7 b+ s% W$ i$ O8 L

  28. , h9 I- P; l7 _
  29.         len = strlen( err_msg );
    * Y5 \9 M# v: Q  l! s: K- A9 P% [
  30.         len = ( len < 131 ) ? len : 131;
    ! e; l* ]9 h* O6 }) Q: c$ _
  31.         strncpy ( msg, err_msg, len );
    6 [* x* Y# I/ ~1 L9 Z  L4 \( O
  32.         msg[ len + 1 ] = '\000';
    " G6 Z: r$ w) `% P1 v9 w/ a" L0 k; o7 Q

  33. % }0 L) h  B3 c4 X' r7 x- u
  34.         uc1601( err_msg, TRUE );
    7 t6 I" h! y- `0 n* X9 Q) |
  35.     }5 B; m- p6 d3 P2 w: |" N( d
  36.     return( irc );
    3 V  h7 |! o. `. s) ^! {
  37. }
    # W' ~! M% R7 h/ h: a
  38. ' X. `, |2 I8 g1 d% v
  39. extern DllExport void ufusr( char *parm, int *returnCode, int rlen )
    ; _! Y6 A+ i# E  B3 z1 a
  40. {7 O( m% D$ }1 A, Y: Q$ c& c" D8 R- z
  41.     if ( UF_initialize() ) return;
    / W8 Z# Q+ g* s- L7 Y$ [1 A) j
  42.         DoAssembly();/ ~8 R) n$ V+ {- m# R, u
  43.         UF_terminate();1 x# `, a( @6 E) Q% U4 i
  44. }
    ' l" b! l: E" H- v2 o
  45. 1 @, g/ @" i" C, K
  46. void DoAssembly( void )* v8 Z7 [1 B! e! i
  47. {' q& S: \9 u& U
  48.         if ( NULL_TAG == UF_PART_ask_display_part() )' x. w) h9 G! W8 G; k+ `
  49.         {
    9 R; H/ H' M3 v$ M; I
  50.                 uc1601( "请新建一个文件再进行本操作!", 1 );- W' H" a$ |2 F: t4 M3 ~
  51.                 return;
      K9 a$ g0 J& V0 H& h' Q$ G
  52.         }
    7 A# |8 n/ x6 m
  53. 8 }& T4 l* d$ H% v
  54.         tag_t tagInsCyl        = NULL_TAG;/ n& ^" @: U% u" i3 l, V
  55.         tag_t tagInsVBlk= NULL_TAG;
    # u7 E0 n9 e& M: P! B
  56.         tag_t tagOccCyl        = NULL_TAG;: |; \, F( B1 I, n) s
  57.         tag_t tagOccVBlk= NULL_TAG;
    & ?9 O& A0 ^7 Q9 h  g/ ~
  58.         UF_PART_load_status_t ErrorStatus;
    ; P0 `# ?5 A* k9 r; u+ ^

  59. 6 t! V# M3 Q# |8 z- H9 S+ n" w! x
  60.         double dblzOrigin[ 3 ] = { 0, 0, 0 };
    : ^5 L# `* }6 M6 f+ D+ }
  61.         double dblzCsysMatrix[ 6 ] = { 1, 0, 0, 0, 1, 0 };
    9 e% w# y! m$ c; e

  62. / J1 [  s- ]7 e% |4 Z3 s
  63.         /* 装入部件GB2208_80_Vblock.prt */6 b6 R0 }& R& z: i* X. B
  64.         UF_ASSEM_add_part_to_assembly(; P7 _& W$ e) S
  65.                 UF_PART_ask_display_part(),
    . f$ f' U6 s* s( i5 q! r
  66.                 "f:\\ug\\chapter4_1\\GB2208_80_Vblock.prt",. k. K+ m$ C0 X, I
  67.                 NULL,9 r7 \6 N, R! Q8 y! G& L/ n
  68.                 "VBLOCK",5 L; ^- u- @6 b& Z: t
  69.                 dblzOrigin,$ h2 t- p& `2 ~- z4 _+ d4 m' d  d
  70.                 dblzCsysMatrix,
    - m% U- N3 j9 W$ H/ h) z; O2 H
  71.                 -1,
    7 ~# o1 ~. I' ?$ y3 Z
  72.                 &tagInsVBlk,: n2 [" N& z# g$ r! _$ C
  73.                 &ErrorStatus );+ O, a7 `. k  _) @  b
  74.         /* 装入部件Cylinder.prt */
    / g5 `+ |$ [9 J% e
  75.         dblzOrigin[ 1 ] = 50;- r: G- B! `1 j! g, C
  76.         UF_ASSEM_add_part_to_assembly(
    " U8 T4 E) V6 }* O3 R* Z+ A3 |/ n
  77.                 UF_PART_ask_display_part(),
    . Q1 ~" C" w# [! O- u3 p$ Q; u
  78.                 "f:\\ug\\chapter4_1\\Cylinder.prt",) u6 U  v# Z/ ?  j
  79.                 NULL,9 O+ @/ Q9 b0 K7 i2 L
  80.                 "CYLINDER",
    ( J! E9 B3 M# R4 Y3 p
  81.                 dblzOrigin,) Z. e" l2 q; {0 F5 x, G
  82.                 dblzCsysMatrix,
    9 ]9 c; V+ f; g3 \- c* k
  83.                 -1,) U" E. n3 g" f
  84.                 &tagInsCyl,7 X1 t* z9 q9 M" X3 j/ q7 k
  85.                 &ErrorStatus );0 A0 f2 G+ B; e! b! `% X) n
  86.         tagOccCyl = UF_ASSEM_ask_part_occ_of_inst( NULL_TAG, tagInsCyl );
    , i( R4 I4 T7 Q- S! `+ L+ q
  87.         tagOccVBlk= UF_ASSEM_ask_part_occ_of_inst( NULL_TAG, tagInsVBlk );, \) \2 _" H+ m6 Y
  88. 9 k8 m2 G' I* x' y. l2 z- @" z
  89.         /* 创建配合关系 */3 y& f2 ?) c' ^) A
  90.         UF_ASSEM_mating_condition_t McData;1 y0 n0 {* H% R/ |0 y
  91.         tag_t tagObjectFrom                = NULL_TAG;( v/ ?4 ]& y3 T$ N$ F& `* @; q* ?: Z
  92.         tag_t tagObjectTo                = NULL_TAG;7 S& I- H2 I2 f4 e! _: q
  93.         tag_t tagPrototypeFrom        = NULL_TAG;5 V% F+ T$ q1 d, ~' _) M
  94.         tag_t tagPrototypeTo        = NULL_TAG;
    ; |: u- j/ r3 ?% T3 R
  95.        
    ! t7 o, I! H$ l. Z) v- p; a0 b
  96.         /* 初始化约束*/
    ) e; ^' F! F. O' D
  97.         UF_ASSEM_init_mc( &McData );: g" b. @5 X6 ^; g6 g/ q- b5 c

  98. : x8 V7 V8 h% ^# a0 a
  99.     /* 定义约束,构造配合关系*/9 v" V$ u- V6 n
  100.         McData.mated_object = tagInsCyl;
    6 h5 D4 O  [  ~: w1 c2 R& J
  101.         $ b, }1 t9 z6 m( W5 S8 |
  102.         McData.num_constraints = 3;
    # W1 P! d; V- |) B1 k- f
  103.         McData.name = NULL;
    ; b/ W7 H# p3 @3 Q0 T7 t
  104.         McData.user_name = false;
    $ w0 ~: Y: L5 [& }0 `
  105.         McData.override = false;
    ; g! l; e) S8 t0 s, C+ `
  106.         McData.suppressed = false;
    3 T9 U, w, u: ?: L' \6 u
  107.         McData.implicit = false;3 d4 }. `5 O: d/ U) U- {
  108. 2 G9 I" k; D: O( L  h& c& E
  109.         tagObjectFrom        = NULL_TAG;
    " \. }+ T' Z9 @& g$ |! [5 w
  110.         tagObjectTo                = NULL_TAG;
    . y  @) Y6 v: I3 P$ c
  111.         UF_OBJ_cycle_by_name( "CYL_FACE_3",        &tagObjectFrom );
    2 ~) H: g- q# \# q
  112.         UF_OBJ_cycle_by_name( "P1",                        &tagObjectTo );* x2 I  ^& M, D3 ~: U) n# y
  113.         tagPrototypeFrom= UF_ASSEM_ask_prototype_of_occ( tagObjectFrom );
    3 n  j2 Y- |) d0 [: ^, Q
  114.         tagPrototypeTo        = UF_ASSEM_ask_prototype_of_occ( tagObjectTo );
    4 [7 Q/ s: |8 O- B4 J' {
  115.         McData.constraints[ 0 ].from                        = tagPrototypeFrom;7 F- @  `! t. L7 i( R' c
  116.         McData.constraints[ 0 ].from_part_occ        = tagOccCyl;
    ) w9 S- I$ J6 I. Q( d- u
  117.         McData.constraints[ 0 ].from_status                = UF_ASSEM_ok;* O$ k. j% _' h! `, G# l
  118.         McData.constraints[ 0 ].from_type                = UF_ASSEM_cylindrical_face;
    6 x9 a: S5 ]; u$ s$ `/ q1 S4 Z
  119.         McData.constraints[ 0 ].to                                = tagPrototypeTo;2 S4 ]3 }9 ], F. C. [) ~6 e% O
  120.         McData.constraints[ 0 ].to_part_occ                = tagOccVBlk;& [5 a5 C3 f. D8 t
  121.         McData.constraints[ 0 ].to_status                = UF_ASSEM_ok;
    8 c4 Y' C: C# E# s( L* b$ ^
  122.         McData.constraints[ 0 ].to_type                        = UF_ASSEM_planar_face;, \% Y" [  k" {' I0 ^
  123.         McData.constraints[ 0 ].mate_type                = UF_ASSEM_tangent;
    ' b- a( Z; i" O# u+ ]
  124.         McData.constraints[ 0 ].offset                        = NULL_TAG;( b3 ^9 y+ `) u5 X* \  Z
  125.         McData.constraints[ 0 ].name                        = NULL;# B( [* ]8 I. q3 n$ O# e7 ^" S
  126.         McData.constraints[ 0 ].user_name                = false;% J& Q6 `8 V* @/ d: a- M
  127.         McData.constraints[ 0 ].inherited                = false;0 [' D- C8 Y: k
  128.         McData.constraints[ 0 ].suppressed                = false;
    ; ^8 y' L0 i9 u( }% D
  129.         McData.constraints[ 0 ].has_help_point        = false;
    ; u: K: S  D  s
  130.         UF_DISP_set_highlight( tagObjectFrom,        1 );
    2 d- u  F; P& n: q" o/ k& X
  131.         UF_DISP_set_highlight( tagObjectTo,                1 );
    ' J8 d( R. ^) u" F7 p, C
  132.         uc1601( "这两个面进行相切操作", 1 );# [- d: K) }) s* m
  133.         UF_DISP_set_highlight( tagObjectFrom,        0 );
    ( E; c% ?# ^  z- a: w6 ~
  134.         UF_DISP_set_highlight( tagObjectTo,        0 );8 F, U- }1 Q6 t$ {9 e3 D0 K7 H

  135. % h4 M$ K$ V% V0 Q  w- V2 c; K
  136.         tagObjectFrom        = NULL_TAG;3 L+ o. q7 `& i6 Y
  137.         tagObjectTo                = NULL_TAG;
    & i5 q3 b' m8 |& ^& N
  138.         UF_OBJ_cycle_by_name( "CYL_FACE_3",        &tagObjectFrom );
    # O( H- K: s- D
  139.         UF_OBJ_cycle_by_name( "P2",                        &tagObjectTo );
    - e9 J$ t& e  P4 C
  140.         tagPrototypeFrom= UF_ASSEM_ask_prototype_of_occ( tagObjectFrom );
    ' ~$ ]' {0 x1 f% X  P1 `/ L
  141.         tagPrototypeTo        = UF_ASSEM_ask_prototype_of_occ( tagObjectTo );  B, W/ v) j, h5 [+ K5 w
  142.         McData.constraints[ 1 ].from                        = tagPrototypeFrom;& _! o$ W) l/ m. H+ R5 c1 f6 y9 q
  143.         McData.constraints[ 1 ].from_part_occ        = tagOccCyl;
    - a& u" s9 c- Q, [
  144.         McData.constraints[ 1 ].from_status                = UF_ASSEM_ok;5 d/ b7 P3 h+ Z" j# T5 }( N
  145.         McData.constraints[ 1 ].from_type                = UF_ASSEM_cylindrical_face;0 u$ F$ o" {. i1 s& ^( |
  146.         McData.constraints[ 1 ].to                                = tagPrototypeTo;5 v3 ~! i- X' w: W
  147.         McData.constraints[ 1 ].to_part_occ                = tagOccVBlk;
    / f/ j% W' y; d
  148.         McData.constraints[ 1 ].to_status                = UF_ASSEM_ok;; j. S  r3 t% o5 K
  149.         McData.constraints[ 1 ].to_type                        = UF_ASSEM_planar_face;
    # Y0 z5 L( x, W9 }) C7 E) j
  150.         McData.constraints[ 1 ].mate_type                = UF_ASSEM_tangent;
    : j7 X3 @6 }/ D6 ?7 e; }9 v# _
  151.         McData.constraints[ 1 ].offset                        = NULL_TAG;
    + s, n0 w) e; l& I
  152.         McData.constraints[ 1 ].name                        = NULL;
    ! S7 D" P0 r0 X" J, N1 L# {  h- u
  153.         McData.constraints[ 1 ].user_name                = false;( e: i9 i" D  @6 |, [# f
  154.         McData.constraints[ 1 ].inherited                = false;" I" i2 Q6 C5 P" V) ^7 ]0 N0 P9 Q
  155.         McData.constraints[ 1 ].suppressed                = false;
    4 d3 N7 ^- O1 Y! C' K
  156.         McData.constraints[ 1 ].has_help_point        = false;0 n5 Z, w2 }% N' K; c( g8 W
  157.         UF_DISP_set_highlight( tagObjectFrom,        1 );: g8 O8 |3 A. o; }0 i. N6 x5 u* N+ v
  158.         UF_DISP_set_highlight( tagObjectTo,                1 );8 b1 K' t% z& z" }
  159.         uc1601( "这两个面进行相切操作", 1 );
    . A# S$ i! i  m
  160.         UF_DISP_set_highlight( tagObjectFrom,        0 );+ p$ y: t* K$ L
  161.         UF_DISP_set_highlight( tagObjectTo,        0 );- l3 a7 I1 K) v- P8 ^4 j

  162. ' k1 u$ Y. Y4 D9 O4 y$ F
  163.         tagObjectFrom        = NULL_TAG;2 X1 S/ ^, f7 d( T( W9 E! P2 T
  164.         tagObjectTo                = NULL_TAG;7 {  W! w" |' O: ?
  165.         UF_OBJ_cycle_by_name( "CYL_FACE_1",        &tagObjectFrom );- K" s1 N, C8 q) ?
  166.         UF_OBJ_cycle_by_name( "P3",                        &tagObjectTo );9 d/ m% o, ^! W9 _7 o+ R# a; c$ G
  167.         tagPrototypeFrom= UF_ASSEM_ask_prototype_of_occ( tagObjectFrom );7 {9 Y4 A6 |7 n% t( t
  168.         tagPrototypeTo        = UF_ASSEM_ask_prototype_of_occ( tagObjectTo );
    ! o% Y6 \. P, t2 y% q  L
  169.         McData.constraints[ 2 ].from                        = tagPrototypeFrom;  V7 s& H1 m* Z) T
  170.         McData.constraints[ 2 ].from_part_occ        = tagOccCyl;
    - ?, N' X0 f$ |* B& b1 z
  171.         McData.constraints[ 2 ].from_status                = UF_ASSEM_ok;
    % m" u, ^$ K# g! `" I. ]" z; H
  172.         McData.constraints[ 2 ].from_type                = UF_ASSEM_planar_face;+ }) |/ x* M! S4 w
  173.         McData.constraints[ 2 ].to                                = tagPrototypeTo;
    0 J1 |; K8 l2 r* Z6 `9 t. K; }
  174.         McData.constraints[ 2 ].to_part_occ                = tagOccVBlk;
    ! a* G7 J1 z. b# u& a
  175.         McData.constraints[ 2 ].to_status                = UF_ASSEM_ok;
    # D: V+ e& c1 j- D, P
  176.         McData.constraints[ 2 ].to_type                        = UF_ASSEM_planar_face;
    8 A  W  W! u2 _+ _4 `3 j
  177.         McData.constraints[ 2 ].mate_type                = UF_ASSEM_align;; y; M6 D% g* K% s; ~
  178.         McData.constraints[ 2 ].offset                        = NULL_TAG;
    , ^+ `1 l, K2 j
  179.         McData.constraints[ 2 ].name                        = NULL;
    4 C/ V' E  S  r0 l
  180.         McData.constraints[ 2 ].user_name                = false;% P! g# `3 U- U/ H# M
  181.         McData.constraints[ 2 ].inherited                = false;
    8 G0 m, D" n: X
  182.         McData.constraints[ 2 ].suppressed                = false;. Q8 P% u, N' ^8 b: Z
  183.         McData.constraints[ 2 ].has_help_point        = false;
    - s& ^; P% l  t, W; n; ~
  184.         UF_DISP_set_highlight( tagObjectFrom,        1 );
    7 U: O; t1 g- Z7 S9 k
  185.         UF_DISP_set_highlight( tagObjectTo,                1 );
    ( B6 p+ F: a! X
  186.         uc1601( "这两个面进行对齐操作", 1 );7 }' [+ {1 }7 C) x
  187.         UF_DISP_set_highlight( tagObjectFrom,        0 );9 ^5 J& e6 A. H! f
  188.         UF_DISP_set_highlight( tagObjectTo,        0 );" s7 C9 y* W0 ]+ }4 Y

  189. * p7 b6 }) ~, b. D
  190.         double dblzTransform[ 4 ][ 4 ];% O" P) Z" r( K, j
  191.         UF_ASSEM_dof_t Dof;% V8 T  E, r4 {9 N1 B8 r8 e; x
  192.         UF_ASSEM_mc_status_t Status;+ K+ a) r) r' [  o/ M, ]- H) @$ u+ M
  193. / V/ e) g* @: t; K. `, |

  194. 1 Q8 \' p: t, i* [2 x+ w0 a
  195.         /* 求解约束*/
    + y; z6 e2 w, O( g. S5 e( Y' ^1 `1 t
  196.         UF_CALL( UF_ASSEM_solve_mc( &McData, &Status, &Dof, dblzTransform ) );7 W4 ^6 _6 `8 p5 u$ d1 k6 @
  197.         if ( UF_ASSEM_mc_solved == Status )$ i7 _4 }/ Y9 }$ b; Z; t
  198.         {
    + t# r8 y( h8 L/ r1 {
  199.                 uc1601( "求解约束成功!", 1 );
    ' \+ x: E5 o. D  e
  200.                 UF_ASSEM_mc_structure_state_t StructStatus;, V0 h7 l) H# I4 n  P
  201. 9 o; s7 ~, k. x  Z% l7 b6 A( J: g9 ]
  202.                 /* 将约束应用到装配体上*/! Q; q$ ]7 B9 i6 n
  203.                 UF_CALL( UF_ASSEM_apply_mc_data( &McData, &StructStatus, &Status ) );
    . ?% ]" H2 t8 S, E
  204.                 if ( UF_ASSEM_structure_ok == StructStatus ) - ~/ C! y3 k9 V/ b' u
  205.                 {, x3 M' U4 b2 V7 S- _- o; U
  206.                         uc1601( "应用装配成功!", 1 );
    9 j) P* w" ?' y' L4 P4 J
  207.                         , K/ b. f7 c6 Y2 e5 N' p9 t5 p7 T
  208.                         /* 更新模型*/
    3 R* g$ K$ N+ d0 S8 k/ _
  209.                         UF_MODL_update();
    9 R* G) ?/ }' s- w2 v4 G9 q# T
  210.             UF_DISP_refresh();( X+ M. {" N% T" Q
  211.                 }7 r2 ?+ `1 }+ w; g
  212.                 else uc1601( "应用装配失败!", 1 );
    " t4 Z9 y6 u* \  u0 Y
  213.         }
    ) w! `; \% w, W; J. h
  214.         else uc1601( "求解约束失败!", 1 );2 x4 ~) g+ F* }) Z' p
  215.         }, j0 Q  Z/ b4 F
  216. }
    / ~) _+ Z9 q( O, Z/ J8 C
复制代码

: B/ d( [1 V0 m8 X9 g9 @- Z/ y2 u: c9 A$ X
7 ]% [. b9 p0 `) [/ k0 ^# K
. Y4 z5 w  c( b

2 U0 I' Q! Y% J6 b% D
2 R5 c- S! F, j/ d% w
7 F, V/ J/ y$ C
没人顶啊

GMT,

Powered by Discuz!

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表