PLM之家PLMHome

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

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

[复制链接]
使用UFUN进行UG NX二次开发: 装配设计技巧及步骤
$ v( n2 i/ C9 [6 l9 M3 I' E7 ]0 f8 D' [# c
  a4 g+ b5 z0 E* g$ R6 P+ e. A# n
1、装入部件! q- w: P/ g) L2 k: f' c7 L
通过函数UF_ASSEM_add_part_to_assembly()指定部件装入的位置 、姿态等信息,实现在装配体中装入一个部件功能;8 V1 ]2 F0 D3 S8 c5 ^

/ q+ \6 B8 r9 `7 m9 G) u2、创建配合关系8 P8 u$ ^9 V* E' J3 j! C
a.通过函数UF_ASSEM_init_mc()初始化约束;! v# U* {5 t; o& e! A. o4 c6 }" z1 _
b.定义约束关系,即填写结构UF_ASSEM_constraint_s中信息;
. w0 a9 l5 [/ w% l! a( f装配中各部件间的配合关系是通过装配约束关系来实现的。装配约束是指一个部件到另一个部件的约束,将部件A配合到部件B上,则部件A称为主动件(from),部件B称为被动件(to),在约束求解过程中,被动件在装配空间中的位置固定,而主动件将变换姿态到满足装配约束位置上。组成配合关系的约束之间不能存在几何关系上的矛盾,也不能形成循环定义。
0 o# H3 W' [+ pc.通过函数UF_ASSEM_solve_mc()求解约束;4 ~3 ^) s( p3 E! h$ U3 s; f# M; ]. z  l
d.通过函数UF_ASSEM_apply_mc_data将约束应用到装配体上;: E& h+ v% i: h( y$ `6 R* X
e.通过函数UF_MODL_update更新模型。8 d1 i+ t+ i6 ~# _+ W$ h

# j' V7 `9 L" V1 C3 \' ^
  1. #include <stdio.h>
    2 M1 f% R+ V( _+ v4 K: k- ^

  2. # l- c" ]! o% C, L% O" f$ ~# K
  3. #include <uf.h>
      I8 ^: k4 J8 [, Q% ]9 P  c; h
  4. #include <uf_ui.h>- V3 R) k1 A+ x8 A2 Z4 L
  5. #include <uf_obj.h>
    * r2 {; J7 N" H) l; H
  6. #include <uf_disp.h>
      V9 W+ l: \; s% i8 y8 u
  7. #include <uf_modl.h>
    - [) K& ~1 A# j* Y1 P6 z, `
  8. #include <uf_part.h>% O# B( E! a2 E( N7 C
  9. #include <uf_assem.h>
    $ `8 U+ p% q$ f1 d0 c1 T+ P

  10. " T; f( k5 v* k* d" M
  11. #define UF_CALL( X ) ( report( __FILE__, __LINE__, #X, ( X ) ) )
    9 q( t6 S. L9 {1 Y

  12. 7 g$ U5 k7 j6 ], k. N
  13. int report( char *file, int line, char *call, int irc );
    * i  s6 ]7 ~' k, ^& o! h
  14. void DoAssembly( void );: S; a1 K* N1 x; T% Y$ G* T+ _
  15. , I% q9 q; C  I1 c8 n
  16. int report( char *file, int line, char *call, int irc )8 m  g2 E* V. y9 d# O
  17. {4 a" E' ?2 t1 G9 S) \$ n& p2 a
  18.     if ( irc )- ^/ I' B' T* J
  19.     {
    % O( y" N% }' i' X" Y
  20.         char err_msg[ UF_UI_MAX_STRING_LEN + 1 ];9 E/ N+ W  z  L
  21.         char msg[ 133 ];
    + s, ^3 L$ H  Q! ?) y
  22.         char fail_message[ 133 ];2 ~6 E9 V- t+ n# c8 V2 @0 n
  23.         int  len;
    9 v8 @7 J3 I( M  @1 d; ^. q/ H/ y

  24. 6 K/ b7 L9 V. {9 c
  25.         UF_get_fail_message( irc, fail_message );
    , K% \/ x/ |" J' o

  26. , _( m. C" K: {- G- P, M
  27.         sprintf( err_msg, "%s, line %d: error %d: %s", file, line, irc, fail_message );' [* P% \5 Y, A3 Y4 q' c
  28. % r. p& E) B: E! M* s4 A
  29.         len = strlen( err_msg );6 f- R- L4 k% D
  30.         len = ( len < 131 ) ? len : 131;0 P1 h. Z. y! |) [
  31.         strncpy ( msg, err_msg, len );6 V4 {  E9 B' H  G0 v
  32.         msg[ len + 1 ] = '\000';
    2 `7 R7 s5 H# i5 G. W

  33. 2 c* F* g3 h0 \5 V: r8 t# B) F& M+ H- _
  34.         uc1601( err_msg, TRUE );
    % U7 v2 l2 o4 S$ B+ D) m
  35.     }
    ! D# X" h8 k& S+ o9 H& S! A! |; L' x  ^: C
  36.     return( irc );5 d- j% T4 q/ O  W7 N1 ]
  37. }+ U" x( X" e4 H; j: ]- S( \1 z! A
  38. 1 {/ @; b* ?- G
  39. extern DllExport void ufusr( char *parm, int *returnCode, int rlen )
    1 l( {; F) E# F: ?+ i  w
  40. {( m5 D9 T% Z% }8 G
  41.     if ( UF_initialize() ) return;# b. S* ]2 R: B9 {: o! \1 x
  42.         DoAssembly();
    7 r' b# b' b0 n8 ~+ t
  43.         UF_terminate();
    ( z. f' Y1 g- h
  44. }
    ) K8 ?" P- v+ a" c
  45. 5 l/ l! v" r0 M/ H4 f2 D& I
  46. void DoAssembly( void )- P& E5 }! S% m3 [: W8 X- `  Q- \
  47. {
    ! _0 [* `/ W2 J6 {4 j) d% }
  48.         if ( NULL_TAG == UF_PART_ask_display_part() )
    6 d* t) b! G$ k! ^7 c) t9 U
  49.         {
    . V( a$ h; B9 f5 R) T' `6 z% @
  50.                 uc1601( "请新建一个文件再进行本操作!", 1 );6 ~( c6 h* e! h1 f5 O% c- E0 |3 t
  51.                 return;4 C% H# _8 A3 \. a; r; O
  52.         }
    . ]( e) q" O) L8 R! `; i7 d
  53. 9 f9 d5 U- I+ S# i4 o/ S5 X4 a
  54.         tag_t tagInsCyl        = NULL_TAG;
    * |/ [  x. ^* S* ?0 S
  55.         tag_t tagInsVBlk= NULL_TAG;5 Q- S) ], R) P6 X1 m% A
  56.         tag_t tagOccCyl        = NULL_TAG;6 D' K2 O5 c$ H8 E
  57.         tag_t tagOccVBlk= NULL_TAG;' d% O$ B$ B& G9 c$ A. l
  58.         UF_PART_load_status_t ErrorStatus;$ ]8 ?8 `6 d% b  W  c. {! d

  59. * N9 t' o# P# A3 C0 f' u3 C
  60.         double dblzOrigin[ 3 ] = { 0, 0, 0 };
    $ k0 q" f' q: d! Q! g
  61.         double dblzCsysMatrix[ 6 ] = { 1, 0, 0, 0, 1, 0 };5 v2 G' V% I1 ]* q) u: i4 {

  62. 5 v( Z9 `& b& I4 G; B) i
  63.         /* 装入部件GB2208_80_Vblock.prt */
    8 I+ G/ B" R: X" C; k! k. H
  64.         UF_ASSEM_add_part_to_assembly(  y: ?% v! C# ~' b. |% `: I$ p
  65.                 UF_PART_ask_display_part(),
      ?! o% A: ]; F' C4 X
  66.                 "f:\\ug\\chapter4_1\\GB2208_80_Vblock.prt",, D8 O: L3 L* Y0 R, P' u' J+ j
  67.                 NULL,; ]: l+ B! M0 _" G4 o
  68.                 "VBLOCK",7 U% \  i9 Q% y4 Q" X! i! I
  69.                 dblzOrigin,7 E9 d6 f1 q! E7 e4 |
  70.                 dblzCsysMatrix,; p! Y' b  m1 q
  71.                 -1,
    * r/ X: l! _$ t
  72.                 &tagInsVBlk,
    ; Q6 ?' Z- a- o5 p: s1 o- c
  73.                 &ErrorStatus );3 ~0 N' i% I2 E4 ?9 ?+ H& g; y
  74.         /* 装入部件Cylinder.prt */& Z! C& P( f: ^  M; C3 a$ C7 l( W
  75.         dblzOrigin[ 1 ] = 50;+ n" c- r9 V7 s$ a/ F1 B8 U+ H( f
  76.         UF_ASSEM_add_part_to_assembly(& c1 D/ r! ~  P* n
  77.                 UF_PART_ask_display_part(),! p6 m( W! d# }# X, R' X+ e! q
  78.                 "f:\\ug\\chapter4_1\\Cylinder.prt",
    1 z( N0 x# ^  I* s8 \5 r1 d
  79.                 NULL,5 r. Z- Y- Z1 \% S
  80.                 "CYLINDER",
    3 F! |7 d' z6 p: n2 R* c, x
  81.                 dblzOrigin,
      Y# q7 I* `6 u( D7 L) V
  82.                 dblzCsysMatrix,( T4 l6 F' `9 P, j6 @; D
  83.                 -1,& l4 N: i7 L9 p7 l
  84.                 &tagInsCyl,
    : g% T( B/ h/ p1 @, Q! P
  85.                 &ErrorStatus );
    2 D3 E$ e( i: o: D
  86.         tagOccCyl = UF_ASSEM_ask_part_occ_of_inst( NULL_TAG, tagInsCyl );
    7 Q) O7 S2 H( W/ z/ G
  87.         tagOccVBlk= UF_ASSEM_ask_part_occ_of_inst( NULL_TAG, tagInsVBlk );' n3 w4 [, I& h  @% x8 s
  88. % m. i  r8 K  R2 Z
  89.         /* 创建配合关系 */7 B* D) H) Z0 k) G& S% t" Z
  90.         UF_ASSEM_mating_condition_t McData;  F' K2 d- d9 L3 B6 X1 k
  91.         tag_t tagObjectFrom                = NULL_TAG;
    , _# S# x2 C' g( ^+ z3 Y. X
  92.         tag_t tagObjectTo                = NULL_TAG;
    9 D" P5 {% [  r* g( y
  93.         tag_t tagPrototypeFrom        = NULL_TAG;
    * ~; i9 i( u7 O4 y1 ?" E
  94.         tag_t tagPrototypeTo        = NULL_TAG;
    4 ]9 X! @' a! T( c& B
  95.        
    3 p1 H3 U+ A: B2 f4 G
  96.         /* 初始化约束*/( h, o( y! a% |
  97.         UF_ASSEM_init_mc( &McData );
    9 |( V: ?4 v, d

  98. ! \- u# U$ ]8 a9 c! W
  99.     /* 定义约束,构造配合关系*/
    2 \, J% q  I9 W( \
  100.         McData.mated_object = tagInsCyl;3 Z8 y2 n' |" B% R. o
  101.         , V- @9 a" B' |$ G
  102.         McData.num_constraints = 3;' X" Q, i3 g5 {  j0 \
  103.         McData.name = NULL;
    3 @' v( M3 `. M
  104.         McData.user_name = false;
    ( N2 u6 f. u4 N; n: ^" }5 x( \
  105.         McData.override = false;$ n& y. {7 T# Z) o3 ?
  106.         McData.suppressed = false;7 \7 u! z5 z5 i+ O
  107.         McData.implicit = false;* W4 y2 u% f# L5 e$ [& ~: r7 ]

  108. 6 v3 E0 w0 Z- i1 @
  109.         tagObjectFrom        = NULL_TAG;  h5 ?, Z1 |- v9 o5 @
  110.         tagObjectTo                = NULL_TAG;
    - V/ F2 `- _) B% g
  111.         UF_OBJ_cycle_by_name( "CYL_FACE_3",        &tagObjectFrom );0 c! e  A. A" t0 T
  112.         UF_OBJ_cycle_by_name( "P1",                        &tagObjectTo );5 Q( J( o  E! p1 b( x
  113.         tagPrototypeFrom= UF_ASSEM_ask_prototype_of_occ( tagObjectFrom );" x* O) A5 q: G
  114.         tagPrototypeTo        = UF_ASSEM_ask_prototype_of_occ( tagObjectTo );, S) p1 @. L- Z/ i# A
  115.         McData.constraints[ 0 ].from                        = tagPrototypeFrom;4 y; `- r2 U4 k8 ~: @0 b3 k* X/ @
  116.         McData.constraints[ 0 ].from_part_occ        = tagOccCyl;
    % b4 @2 h+ |" S! Q
  117.         McData.constraints[ 0 ].from_status                = UF_ASSEM_ok;" d7 @" v: j' E. r- q
  118.         McData.constraints[ 0 ].from_type                = UF_ASSEM_cylindrical_face;
    " p1 ^6 s& E, h5 y0 j
  119.         McData.constraints[ 0 ].to                                = tagPrototypeTo;% P4 Y1 T! R, r# @6 v: l6 x. D; D
  120.         McData.constraints[ 0 ].to_part_occ                = tagOccVBlk;, s( ]  c7 _* C. N
  121.         McData.constraints[ 0 ].to_status                = UF_ASSEM_ok;# [; g( Y6 U/ x; h6 q! h7 q
  122.         McData.constraints[ 0 ].to_type                        = UF_ASSEM_planar_face;
    5 ?, k3 i$ n* I5 z4 W4 s/ w
  123.         McData.constraints[ 0 ].mate_type                = UF_ASSEM_tangent;8 q5 A# K6 |, a; J; V4 }0 [- z" T
  124.         McData.constraints[ 0 ].offset                        = NULL_TAG;
    5 w7 O8 k" ?; t% {, Z
  125.         McData.constraints[ 0 ].name                        = NULL;
    # }( X# o* z& Z5 |* E
  126.         McData.constraints[ 0 ].user_name                = false;8 j5 C1 a8 v# {( g/ ]  p
  127.         McData.constraints[ 0 ].inherited                = false;! C+ r; ?6 [* m: P! v6 t
  128.         McData.constraints[ 0 ].suppressed                = false;
    . E& K# a+ B' S0 H  ~7 H* `( l# }; R
  129.         McData.constraints[ 0 ].has_help_point        = false;
    / d  p' {, k( _" ]2 A2 L
  130.         UF_DISP_set_highlight( tagObjectFrom,        1 );
    # }& N# [9 M' W. V3 }
  131.         UF_DISP_set_highlight( tagObjectTo,                1 );$ r0 j8 s. w' t8 F8 z2 F& q/ M7 f
  132.         uc1601( "这两个面进行相切操作", 1 );3 N' L5 g. Q6 q/ k8 F  ?
  133.         UF_DISP_set_highlight( tagObjectFrom,        0 );: A; L  A$ S) Q" R( f
  134.         UF_DISP_set_highlight( tagObjectTo,        0 );9 {! N) }+ y' `7 P
  135. : L' U) y# G; @4 ^: y
  136.         tagObjectFrom        = NULL_TAG;
    ! J; L; b9 V- H* k2 K0 S3 ?
  137.         tagObjectTo                = NULL_TAG;+ B  e& _) X9 V' ]. [
  138.         UF_OBJ_cycle_by_name( "CYL_FACE_3",        &tagObjectFrom );! t8 E& T+ n1 k& H6 c
  139.         UF_OBJ_cycle_by_name( "P2",                        &tagObjectTo );" H. V0 I+ I5 v/ K) B& n" W0 ]
  140.         tagPrototypeFrom= UF_ASSEM_ask_prototype_of_occ( tagObjectFrom );3 P; c( J8 o, p/ I0 V- ]
  141.         tagPrototypeTo        = UF_ASSEM_ask_prototype_of_occ( tagObjectTo );
    6 J* T1 f' c+ l6 P( [  k0 c
  142.         McData.constraints[ 1 ].from                        = tagPrototypeFrom;
    ' Q/ b' d9 h( C4 A8 |, }
  143.         McData.constraints[ 1 ].from_part_occ        = tagOccCyl;4 F3 D9 ~+ a" H$ ^( v5 y+ E
  144.         McData.constraints[ 1 ].from_status                = UF_ASSEM_ok;# @. J) G+ J0 ]
  145.         McData.constraints[ 1 ].from_type                = UF_ASSEM_cylindrical_face;
    4 b9 ~; Q' y3 x- G# _) R# W/ G1 R& u
  146.         McData.constraints[ 1 ].to                                = tagPrototypeTo;
    ! `1 {3 G8 j4 f
  147.         McData.constraints[ 1 ].to_part_occ                = tagOccVBlk;
    ; b$ Q0 c$ w1 h- x5 D* ~
  148.         McData.constraints[ 1 ].to_status                = UF_ASSEM_ok;. y( n! Q/ R* `8 ^
  149.         McData.constraints[ 1 ].to_type                        = UF_ASSEM_planar_face;# P9 B4 i. O5 O( t3 {& U4 X1 g5 S
  150.         McData.constraints[ 1 ].mate_type                = UF_ASSEM_tangent;8 S" R* h. G2 V) O3 B1 ~  p8 b
  151.         McData.constraints[ 1 ].offset                        = NULL_TAG;0 M# ]- K" Q$ M8 }6 R% x
  152.         McData.constraints[ 1 ].name                        = NULL;# @0 P% a5 B0 O" k2 i9 T4 r% q% q
  153.         McData.constraints[ 1 ].user_name                = false;
    5 \! t$ B2 F4 U4 m: X1 D0 q
  154.         McData.constraints[ 1 ].inherited                = false;+ p0 j; u6 d0 O5 C: T5 m
  155.         McData.constraints[ 1 ].suppressed                = false;
    8 r; J, \, p2 M2 H: q) j! @" x, V
  156.         McData.constraints[ 1 ].has_help_point        = false;) ]* A2 \! w( h8 B. w/ c" g
  157.         UF_DISP_set_highlight( tagObjectFrom,        1 );
    * S# ]( d- ]: Z' p0 Z& s* x
  158.         UF_DISP_set_highlight( tagObjectTo,                1 );
    % U, h" I) d$ ~* s9 A1 c
  159.         uc1601( "这两个面进行相切操作", 1 );1 L0 `* @! F% Z( L* {7 Y3 B$ J
  160.         UF_DISP_set_highlight( tagObjectFrom,        0 );
    ; I3 W8 t+ n2 V8 K/ f! ?
  161.         UF_DISP_set_highlight( tagObjectTo,        0 );: f8 d5 O. z& D3 t
  162. 7 F/ p3 }0 c- H# `9 ?$ b, D% T; u
  163.         tagObjectFrom        = NULL_TAG;5 D0 y  ]9 N6 b+ M- ~: g
  164.         tagObjectTo                = NULL_TAG;1 h6 O7 \6 v/ i9 r
  165.         UF_OBJ_cycle_by_name( "CYL_FACE_1",        &tagObjectFrom );
    - n% J8 n; R, }# R! f6 w. u0 M
  166.         UF_OBJ_cycle_by_name( "P3",                        &tagObjectTo );
    ' n# z! V. ?6 }$ y  u) A
  167.         tagPrototypeFrom= UF_ASSEM_ask_prototype_of_occ( tagObjectFrom );
    0 D' x  Z, C; g; h. S9 K  ?
  168.         tagPrototypeTo        = UF_ASSEM_ask_prototype_of_occ( tagObjectTo );
    1 \! r. B! _2 L# {
  169.         McData.constraints[ 2 ].from                        = tagPrototypeFrom;
    1 o& Q9 H# T* ?- g/ U3 E/ l, s6 {1 S
  170.         McData.constraints[ 2 ].from_part_occ        = tagOccCyl;
    $ R) D$ F: f& S# G9 X: M/ w5 \$ A
  171.         McData.constraints[ 2 ].from_status                = UF_ASSEM_ok;; a: X9 N4 T' U. t" }
  172.         McData.constraints[ 2 ].from_type                = UF_ASSEM_planar_face;
    , B6 Q& R% f1 N! [
  173.         McData.constraints[ 2 ].to                                = tagPrototypeTo;* U/ X  R7 c4 v3 o
  174.         McData.constraints[ 2 ].to_part_occ                = tagOccVBlk;# Q6 o$ |% f' {# T6 {+ x2 A
  175.         McData.constraints[ 2 ].to_status                = UF_ASSEM_ok;0 C& i3 U, \$ Z) k% W' c
  176.         McData.constraints[ 2 ].to_type                        = UF_ASSEM_planar_face;
    - ~! s. j6 b! H( O7 k
  177.         McData.constraints[ 2 ].mate_type                = UF_ASSEM_align;1 d" v/ w1 y8 a- d
  178.         McData.constraints[ 2 ].offset                        = NULL_TAG;
    - J% a- y: L- V
  179.         McData.constraints[ 2 ].name                        = NULL;
    + B& s& p/ G1 S( X. g
  180.         McData.constraints[ 2 ].user_name                = false;7 `: X# i" G- _
  181.         McData.constraints[ 2 ].inherited                = false;& I2 s4 [3 d5 F' w  d( [
  182.         McData.constraints[ 2 ].suppressed                = false;0 _/ _( {6 C8 r9 z  n6 [4 _( E
  183.         McData.constraints[ 2 ].has_help_point        = false;* @& d( K3 i$ D2 |
  184.         UF_DISP_set_highlight( tagObjectFrom,        1 );
    $ S# k. |8 w3 G
  185.         UF_DISP_set_highlight( tagObjectTo,                1 );) S( S! q1 D! I1 S" i7 d
  186.         uc1601( "这两个面进行对齐操作", 1 );
    ; V% L4 i- T+ D
  187.         UF_DISP_set_highlight( tagObjectFrom,        0 );+ M# I/ Z( x; G) v$ P- J* e3 A
  188.         UF_DISP_set_highlight( tagObjectTo,        0 );" M0 {" P6 e9 y8 w- Z
  189. : w- q( f) ?( U+ R
  190.         double dblzTransform[ 4 ][ 4 ];
    , I6 W+ Z$ {8 R4 R& a  g* b
  191.         UF_ASSEM_dof_t Dof;- }2 y! I/ {' v! j
  192.         UF_ASSEM_mc_status_t Status;
    1 R6 F" E8 O8 F

  193. % @& q) |$ A) v5 T; x/ |

  194. . D, F1 ]& @, f/ G; v5 @
  195.         /* 求解约束*/' v+ A  H. R* }/ A3 D
  196.         UF_CALL( UF_ASSEM_solve_mc( &McData, &Status, &Dof, dblzTransform ) );( L* A& L: L  N7 M& H4 h& K7 h
  197.         if ( UF_ASSEM_mc_solved == Status )7 S. @* L: d% }: ?: l6 [9 Y. j
  198.         {& M: `3 [8 G  v: u) [7 s6 g: d
  199.                 uc1601( "求解约束成功!", 1 );: {8 t6 Z5 d7 b( Q
  200.                 UF_ASSEM_mc_structure_state_t StructStatus;" u& _. K6 d+ U$ U5 U3 E

  201. 8 `( M, t- A. e4 t. s
  202.                 /* 将约束应用到装配体上*/
    0 k# n& q0 L0 P) `6 w8 W
  203.                 UF_CALL( UF_ASSEM_apply_mc_data( &McData, &StructStatus, &Status ) );
    1 o4 J4 V8 m* u4 `5 T" d& i
  204.                 if ( UF_ASSEM_structure_ok == StructStatus ) 4 `/ X: N/ ^$ R: E/ ?9 ^
  205.                 {
    9 S6 p/ S" g* R
  206.                         uc1601( "应用装配成功!", 1 );
    " k; s% X6 k( ?9 e6 G1 Y2 w
  207.                           ?' A$ j2 P1 K6 J- U
  208.                         /* 更新模型*/
    . q( L7 }. j( m9 H
  209.                         UF_MODL_update();1 ^6 }9 w9 b, o% u- e4 j6 H2 Z
  210.             UF_DISP_refresh();
    ' e0 ?. k% p. _2 t. G
  211.                 }
    0 g$ X' V9 A2 R7 _3 a# B. f
  212.                 else uc1601( "应用装配失败!", 1 );
    9 w2 ^5 l% n9 e
  213.         }
    2 M# a, l- t$ B4 \, f* O# E
  214.         else uc1601( "求解约束失败!", 1 );
    8 ~8 ~( N/ L8 r) e& y/ e. {
  215.         }; i' T" o2 M* S5 F0 [
  216. }
    % u0 j' S. H! R
复制代码
2 c& O- S8 U0 r$ E, B  E

' V% O+ `$ p  `$ b1 o" ?" b+ h! l% A4 _" U
7 b3 }4 s2 U' F0 X5 T# O

) r" z3 O. H+ g4 r" |: e; r1 a8 s; H; D$ k6 b

# n' Z8 M- n6 n( ~- q3 _
没人顶啊

GMT,

Powered by Discuz!

Copyright © 2001-2021, Tencent Cloud.

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