查看: 5098|回复: 0

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

[复制链接]

4

主题

4

回帖

52

积分

管理员

积分
52
发表于 2017-4-17 21:56:09 | 显示全部楼层 |阅读模式

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

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

×
* I; V6 R6 t' e* D
Catia二次开发源码分享: 通过鼠标点击创建直线
' d2 O- K+ l5 t8 H( F& V7 S
9 f. m1 a& f3 W8 _5 J$ u2 m1 @+ @2 Z# @

/ }$ k0 F% }- |8 O5 _' I#include "CAARCCreateLine.h"7 i" E3 l. g$ n
#include "CATIndicationAgent.h"2 {7 C: _- ~( z5 F3 b+ {
#include "CATMathPlane.h"  K2 @! H+ ^; R( \. {* [( Y

/ T' R) ?! Y* X. f  L#include "CATCreateExternalObject.h"' s# o# s' s/ t6 m0 j' Y

& @9 H( U7 K3 @2 u2 U: j#include "CATMathPoint2D.h"& }2 }* o+ r& J+ y$ \
#include "CATMathPoint.h"# I1 y& w( ?# C- G- B7 }$ ]
#include "CATMathPlane.h"6 e. k" h2 E. j3 d/ _* H$ L0 p8 I
: y, a. ]3 e! B7 r
#include "CATIGSMPoint.h": F$ v; K' K# M$ b% y! t- @
#include "CATIGSMLinePtPt.h"" H. P* C( G9 S; d
3 L2 H1 y1 s7 h, b. f7 g1 O5 v! G
#include "CATFrmEditor.h"
3 G0 p: M2 K" I( v#include "CATPathElement.h"9 U' e6 }" y1 j/ U3 [. }
3 I- J% L9 V9 Y; O( H  C5 |+ @
#include "CATIProduct.h"$ e- \+ X" B' ~
#include "CATILinkableObject.h"' U, d5 n8 Y) t9 S( d
#include "CATDocument.h"+ Y; Q: ~+ y% C" ]5 _! u
; O0 U2 a  G2 C  M0 D
#include "CATIContainerOfDocument.h"/ v. m1 I5 U* E4 A/ ]' E

: ?; F. s( n1 e% H#include "CATIGSMProceduralView.h"( D) ]+ b& f' q9 i+ _

' i* q2 k, X# ]# V7 w1 D* B#include "CATIContainer.h"
7 W  u5 b) ]0 x7 F, J& H7 K#include "CATIGSMFactory.h"# O  V  \* F& U( T

0 ]# b- H" Z+ [4 J9 [#include "CATISpecObject.h"
9 ?* R$ p2 a) F7 r4 s3 [, W- OCATCreateClass( CAARCCreateLine);
6 n9 W7 l' O  O' D) a
2 x5 n9 f& G- f+ o* ?5 O1 C
) i9 f. q" v4 ?//-------------------------------------------------------------------------! a+ Q! C6 q9 I. N% N( Y
// Constructor, r. O6 }( u/ ^  X% }2 A8 E
//-------------------------------------------------------------------------0 s4 ~% X% `4 V8 C- Y' n
CAARCCreateLine::CAARCCreateLine() :
! h0 A0 D9 r, F; Z5 [  CATStateCommand ("CAARCCreateLine", CATDlgEngOneShot, CATCommandModeExclusive)
- c9 a5 p) Y1 W+ p4 j* p//  Valid states are CATDlgEngOneShot and CATDlgEngRepeat
5 l; o4 A; Y: i$ P' i: u7 y2 `  ,_IndicationOnePoint(NULL),_IndicationTwoPoint(NULL)) E# Q4 K7 H, n1 X! w% c
{
5 E* w/ E* H6 e# ?0 B, l}
8 \/ d$ q: o: z  M2 H" j8 Q; k& N6 P6 y8 f# \* `' H* O4 a
//-------------------------------------------------------------------------
+ l, N% a  s5 M5 }7 k% o" O// Destructor
) j6 m- }# [- S- E" ~6 Y. q" k  D//-------------------------------------------------------------------------
# S2 {' Q% H8 u" nCAARCCreateLine::~CAARCCreateLine()" K+ u! l8 X) g  T7 C
{2 P* ?3 ?0 ^( z* n# P
   if (_IndicationOnePoint != NULL) 8 |( \6 D+ Z, v0 Y& ~# @, ?; J# e
      _IndicationOnePoint->RequestDelayedDestruction();
8 \  ~; t- G1 F# f5 m   if (_IndicationTwoPoint != NULL) ' h+ e$ e7 j5 [, C9 ]. p  r
     _IndicationTwoPoint->RequestDelayedDestruction();
4 E) O# `! U, |}& P2 K0 A# Z6 }* I3 m& D

0 h' \5 |, g" ^4 \- _* r1 J
" d) e  x; G3 S3 t' z7 g) K1 _: ~//-------------------------------------------------------------------------4 r2 R1 U% x% Z
// BuildGraph()3 F) w1 {4 S( w  n9 q3 q
//-------------------------------------------------------------------------
& Y+ X7 g8 E" }0 I' D0 W  n8 t9 lvoid CAARCCreateLine::BuildGraph()( i" O2 h+ j& w
{8 n  N, j! L7 ~* _* A6 a! y

; d, {2 h  s; {% v2 u
' i: o. u$ S2 a- ]# _1 l& B& U  // TODO: Define the StateChart
6 C2 q8 O6 Y0 V2 M/ `  // ---------------------------! c$ }; I$ X6 J* q$ W/ @. e
  _IndicationOnePoint = new CATIndicationAgent ("IndicationOnePoint");- x9 l6 F* g3 m. }, ?& o7 P2 x
  AddCSOClient(_IndicationOnePoint);3 u7 \+ l# c9 b* `
  N  ~3 b; }- i
  _IndicationTwoPoint = new CATIndicationAgent ("IndicationTwoPoint");/ X) d- q3 H" a$ h- p2 Q2 `3 T: R
+ {* R4 W- l( g# d0 n2 g
  CATMathPlane PlaneXY;" p4 F& W) m2 q0 C& d, e
  _IndicationOnePoint -> SetMathPlane (PlaneXY);/ d6 b, j& |, m# ?5 Z$ J
  _IndicationTwoPoint -> SetMathPlane (PlaneXY);
/ z7 x; o/ X$ O5 L4 f& M
# i% M4 N& Q  c/ Y  CATDialogState * initialStateOne = GetInitialState("选择第一个点位置");" s, |" g: E' a8 m( k, [  M
  initialStateOne -> AddDialogAgent (_IndicationOnePoint);% _3 W0 V: z/ c

) O$ k6 d" W; x; r, }3 K3 X" m  CATDialogState * initialStateTwo = AddDialogState("选择第二个点位置");+ \0 E! H  j1 p4 K" \2 k: `4 W  ]
  initialStateTwo -> AddDialogAgent (_IndicationTwoPoint);; ]0 G( @$ @; _: X# \+ x, C5 r
, q$ k( K0 d+ G9 o" s& q
  AddTransition( initialStateOne, ' ]# \5 H' q% I9 r- A, J# X0 Z
                 initialStateTwo,
8 ^5 k4 K. T; e                 IsOutputSetCondition (_IndicationOnePoint),+ q) q0 D% l; q% q7 v
                 Action ((ActionMethod) &CAARCCreateLine::ActionOne));" [, m5 B; C& X- R

# {! u; H! \0 B3 ^  AddTransition( initialStateTwo,
2 h7 J& L. c& ?                NULL,
& X0 _7 T8 y) Y                IsOutputSetCondition (_IndicationTwoPoint),8 G6 c' W/ p( i
                Action ((ActionMethod) &CAARCCreateLine::ActionTwo));* {/ r  o7 E( R5 N+ Q2 e0 x3 T( _
}, Q  t6 m1 n) K% u- `3 ]1 Q

9 a+ C' j% [% a& ]2 h0 H$ Z8 F2 s
//-------------------------------------------------------------------------) i6 D) @2 V* F( R3 K
// ActionOne ()5 ]1 E( S$ Z+ [/ s& w) U# y/ O$ P
//-------------------------------------------------------------------------0 }+ A9 O% ?0 c! \3 {
CATBoolean CAARCCreateLine::ActionOne( void *data )
- z" Z" H) g5 A2 K% x8 o, }{1 b; R' j" E8 s% b$ F4 M+ r
  // TODO: Define the action associated with the transition
, w2 x1 b1 h% u$ N7 S  // ------------------------------------------------------7 j' F+ O2 G7 s1 v& r9 @
  CATMathPoint2D point2D = _IndicationOnePoint->GetValue();//获得一个2D的点0 a0 v2 a5 Z3 z4 I$ Z& H' `) L

9 @2 [, M  M2 O) ]/ A( [  CATMathPoint Point3D;8 p- r9 x( V% ^4 q2 d
  CATMathPlane Plane = _IndicationOnePoint->GetMathPlane();  r; h' C  o1 z/ ?* j3 t& `% ]$ @5 ]8 n

+ B+ N* o4 y6 B0 T8 o) Y  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点
: i9 |+ Z  Z8 r  y1 P: D6 x! r( N4 Z$ M' ^; j
  //设置Container(非根节点)7 k  ]0 D/ z; c  e/ t
  //获得Editor1 H+ Z4 O) g7 w% e$ W/ Q& G# e; F
  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
) u  c  \9 Y. D1 e& T3 p! D, v" l, v( N' g3 m
  //得到当前对象的文档# Q! H1 o, h' |
  CATDocument * pDocument = NULL ;
: C  _0 z8 S( a' B
5 w6 V9 g9 D+ x+ ~  //取得当前活动对象, r; {6 _: {- t" Q( R" K
  CATPathElement activePath = pEditor->GetUIActiveObject();& l' n& b( |8 d+ k' w" e

' ]$ c9 T4 F: w8 r: |* j# @4 ?  //取得当前活动的product- W: B% f& E: {8 I7 `
  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());
, q8 L4 J. T/ s, J5 V% i/ _  d9 o6 W$ U
  //当前活动对象不存在
; F+ ?3 D% w3 a$ Q9 E) K$ D  if (pActiveProduct == NULL)& d, h3 {3 p4 q6 h
  {
  q! r+ G' l. f5 t7 X    pDocument = pEditor->GetDocument();
! l' X5 \/ d7 p6 H/ c, M4 ?  }& Z- E1 h$ Z) l% K1 w2 c& I
  else
2 E9 `& @& E; M8 u0 L) e& C  {/ G5 Q- e: C3 l) [. j' t, r
    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();& J. G( s0 S$ M7 Z3 [3 \+ D* s
    //当前对象的引用对象是否存在
; P* ~; a% l3 g" v    if ( NULL_var == spRef )
6 J; X( Q' h" X4 \* L    {
) I2 A, O& O% Q# K/ Z% a! p. l      return FALSE;
7 Y; d: n. K6 y* Q# p# W    }! v! W1 ~' y7 l; t9 B+ G. U& N

4 g4 V# x" k; f) b    //当前对象的链接对象! ]- y1 E4 }/ p
    CATILinkableObject * piLinkableObject = NULL;6 d: K0 c) O) c7 K# R- Y
    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
% _# J+ N. A" h2 }9 R& h! Z    if ( FAILED(rc) )3 y' o! y' O: X
    {  z% ?6 U* e( W' S- c7 I! X9 Z
      piLinkableObject->Release();6 [: z+ o" ]- @* \1 X, ]$ r
      piLinkableObject = NULL ;. W' N+ W% Y) \  ]( m$ `
      return FALSE;
' n* N0 G/ X2 Z9 m  f5 v- \    }/ ~) Y, S  ]/ R; ?; b! p9 q( [
6 ?: V0 L5 J: P/ D
    //得到当前对象的文档) c) `7 N5 Q4 {$ c# k
    pDocument = piLinkableObject->GetDocument();
7 [. |2 U' H4 }$ {    piLinkableObject->Release();5 S1 z- O! ]# H+ z/ k) i
    piLinkableObject = NULL ;
: r$ S: |4 K9 U; c! B' w( S0 O* U( e7 g0 l
    if ( NULL == pDocument)# q$ C5 J! K8 V7 w
    {
% f2 g* v4 v6 M4 i; W      return FALSE;6 S& i! R; F6 R9 m. a. a( }
    }. J& @. z# L5 l' W
  }
1 i( p6 |4 M5 C5 I. E' F9 ~4 a" p$ O2 g* J( c
  //得到文档容器集6 f  Y6 ^. e( D% J+ V
  CATIContainerOfDocument * pIContainerOfDocument = NULL;
6 }* U* i1 T) Z8 L! k  E6 m  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);
9 A4 d/ J6 @9 V+ [6 Z9 `  if (FAILED(rc))% H% i0 j4 m7 u2 v! k' ^) h
  {, ^7 ^1 i3 y9 ~% b
    //pIContainerOfDocument->Release();5 i- M" B- k7 ]6 P# s
    pIContainerOfDocument = NULL ;1 r4 [/ P, o; K0 h! a. Y/ R
    return FALSE;! F  L/ q- b: i' e3 K! _2 w
  }9 Y! ^0 o) o1 |5 o

" Z' N9 _1 a* c8 @  //获得Document
: N# p" {% N5 m7 r  CATIContainer* _pContainer = NULL;        & d8 ?& }  c" v/ m+ D+ {
  //获得SpecContainer
5 j1 S+ Q2 Z' ]$ o* {: s$ X  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
3 J# M$ g( i& |% U        7 s! ~7 s& @' L8 a# G& u- F
  //GSM工厂: Z9 b8 x! M' v5 R; D  m% c
  CATIGSMFactory_var spGSMFactory = NULL_var;
$ L' [0 r: |; [  p5 `) J' B  //设置工厂               
! j" J& ^9 w2 R) }- x: f  spGSMFactory = _pContainer;                                                                       
" S0 U6 |( X6 N4 X
# ^& ]4 ?& w4 z- {, {9 t0 w* B1 I  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);2 w8 Z7 w. L2 t0 C1 G- ~1 O

7 |' H/ F6 D8 b  spSpecPoint1= spPoint;                                       
8 a* }/ V/ X; S5 g- w* n- C1 `
* T1 @- P4 h' [& F, F) l! ^  CATIGSMProceduralView_var spSndPntObj = spSpecPoint1;
, w. t" Q/ l6 `" z
$ T8 u7 l) s$ R& D  //*将点显示在屏幕上# Q+ @) _. K3 j% m. X! P
  spSndPntObj->InsertInProceduralView();
( A; m1 h$ b2 L) V# |( {& d3 Y
9 a9 [- U/ Z$ T! W/ k# R2 g( J  spSpecPoint1->Update();2 r. k9 d6 s5 D1 K3 j: ~4 |
4 R- o2 J' [3 J2 K; F
  return TRUE;
- W: |+ ~& y) _9 y* ]- q. D1 Z}
! {! @3 C. a  b( P+ m: v6 Y) C1 i
( k9 r1 f# J" v. N//-------------------------------------------------------------------------
6 r7 j4 D7 b  o. [1 X/ `: ~// ActionTwo ()$ L4 {, u! c" g: Q* l" F7 v; G. y
//-------------------------------------------------------------------------- j! |: O9 v- h2 _7 H
CATBoolean CAARCCreateLine::ActionTwo( void *data ); A- o: i! V9 R9 D9 G
{
3 W5 H) o- l7 Y" n  // TODO: Define the action associated with the transition
; V, O, v/ X0 @: V7 u% U3 r  // ------------------------------------------------------( p+ N0 z" D" p2 I/ E1 o
  CATMathPoint2D point2D = _IndicationTwoPoint->GetValue();//获得一个2D的点$ ]4 M: z4 K# k2 W

9 o* c& t% j* g; u0 s! c  CATMathPoint Point3D;# |8 q: _; m; }8 _( v) A
  CATMathPlane Plane = _IndicationTwoPoint->GetMathPlane();
0 B  r  j+ }; v# s4 T4 o+ |' ]1 ?$ D6 d$ Z3 |3 C
  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点
3 {6 t1 V- U6 b' d7 Q3 a. V+ I! I
5 ~: H% v0 }3 I  //设置Container(非根节点)
- b; S( C7 e! @  \; q1 s9 M2 D; O  //获得Editor
/ h, e% ^* e! }  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();6 @& H3 n7 m+ m0 J; [2 K

2 k- t$ ]9 S5 w  //得到当前对象的文档/ T$ {" C. d4 B# s
  CATDocument * pDocument = NULL ;
+ B, A. D0 x6 O; I, ~
  S; Q0 I3 R3 y! U% _% d) p! B  //取得当前活动对象
3 {! N- t% d& n) j9 ]/ d" [  CATPathElement activePath = pEditor->GetUIActiveObject();! Q8 n# F$ U8 H& h
1 M3 c0 D4 e( i3 Z7 T
  //取得当前活动的product
$ D9 {: g& z3 a  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());/ T4 `. M, k9 q  u7 D0 q: K6 u
0 C! n! w( U# y0 A- z0 Z, \
  //当前活动对象不存在. `, G) B" a$ G
  if (pActiveProduct == NULL)
4 Y( J- X( o; a  {& O, b0 N- }2 K( O+ k( N
    pDocument = pEditor->GetDocument();
# l7 v1 E0 F# O5 |  }" Z+ w1 O7 l6 N& c2 L: R1 t, I7 v' w
  else
, S8 X( v1 e/ B; ^, W2 q  {1 Y, H& c. D1 @9 v3 M8 I
    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();: Y) K7 [' |  G0 Y/ m* K
    //当前对象的引用对象是否存在
' ]4 B( S% ^$ O1 X) S. Z    if ( NULL_var == spRef )
/ l! i" i  v9 g$ }* a    {3 @0 s9 W8 f( i3 ?0 f7 C6 s  _8 Q) y" h
      return FALSE;. [: ?* S4 V! x% ]* n' M
    }* W; v" ^. W: d- f- D6 Y& h

1 T, E0 i' \8 B0 V6 m& N    //当前对象的链接对象3 M; k0 c! E3 t! m0 L- E
    CATILinkableObject * piLinkableObject = NULL;/ d/ p  `# o0 J0 N" K& J
    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
: ]% a( c! T- f) m+ u6 K$ y    if ( FAILED(rc) )( d# u$ m, Y6 W; f" f+ T
    {
1 J$ |, O( N/ x7 I8 R6 W/ ?      piLinkableObject->Release();
* W- e2 B: M" l4 Z      piLinkableObject = NULL ;
  A* ~  [$ D/ k8 G* C/ v      return FALSE;' c3 R# W9 a; a1 y& j8 _2 Z
    }( z9 G7 O$ F  J; n( X# @

) Q4 \8 {: K0 Y4 n    //得到当前对象的文档+ z6 J& w2 |3 h# `9 ~' W# T0 a
    pDocument = piLinkableObject->GetDocument();
: V5 t& {3 f' J: a' r+ B    piLinkableObject->Release();" S7 v+ ~; V6 y; m- R8 K
    piLinkableObject = NULL ;
( |6 E7 G$ u. B* G
; V: a: T8 ?: B: Q    if ( NULL == pDocument)
! h; I( w. D# N- ~7 r& S4 F    {
/ {' F) U+ _, w$ I4 N( s2 U      return FALSE;7 T4 @' g) y4 C
    }3 b, ]* }2 \6 l1 K) Q
  }% D" p3 h0 g' B  P+ O5 s
+ a& ?( G6 B/ x5 o; h# j5 N' y* K
  //得到文档容器集2 A; g  w! L% L, r2 N! W5 C; Z
  CATIContainerOfDocument * pIContainerOfDocument = NULL;
1 I' G( l, z& f+ |$ F2 V  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);
8 \& |2 D. R* A. @) d( }1 H  if (FAILED(rc))
/ Q+ F9 q: R9 p- }  {
; \  k7 Z2 \5 p9 S# L    //pIContainerOfDocument->Release();
3 S  L8 s1 @  @6 H    pIContainerOfDocument = NULL ;
0 C2 y3 N0 p1 S6 [. E    return FALSE;
* G, T* w- ]; E& [) |, f  }& v' ^7 S( t( ^* R) R1 A% y
  s3 s( _" s: l3 R
  //获得Document# r1 _$ A0 L9 Z& \  @+ ~- L9 z  D
  CATIContainer* _pContainer = NULL;       
( o8 t6 m# _+ w1 o2 r' @  //获得SpecContainer" y1 P/ I: H4 |' r
  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);. v0 G/ ]. C* d$ z' |" b" e
        + K4 \4 y# n4 @* j$ s
  //GSM工厂, e/ V4 r# _+ k+ v) y/ S
  CATIGSMFactory_var spGSMFactory = NULL_var;
% t* s7 k; ], c3 N  //设置工厂                3 r4 X1 H( d8 ]. B4 \# j
  spGSMFactory = _pContainer;                                                                        + ?+ c8 g- _, q! o: b& U* B

" w! k1 v# k* x* T5 M  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);* `+ T/ h. `2 L  z+ L# ]

5 X9 K. S  y. I2 j  CATISpecObject_var spSpecPoint2= spPoint;                                       
0 \8 {& ^. c8 v6 G1 v5 l
. R6 o  y/ k( H( h/ j2 |! p  CATIGSMProceduralView_var spSndPntObj = spSpecPoint2;- m0 D$ c" b+ B1 ^/ p' [

4 B" f1 Q9 Y2 W' B; h6 ^1 R  //*将点显示在屏幕上0 L1 T$ E% Y, R8 a: s3 d. T2 D6 Q
  spSndPntObj->InsertInProceduralView();
+ Q* y/ [" G! t2 w$ B9 ?
8 T8 f3 h& \8 e, V* K9 {  spSpecPoint2->Update();1 K$ }  j& T* `6 l# f
, P, x* }: r/ E) O6 V3 U# l
  //生成线
9 g+ c& ^* q0 E5 D5 p5 k  CATIGSMLinePtPt_var spLine = spGSMFactory->CreateLine(spSpecPoint1, spSpecPoint2, NULL_var);
3 I! P! G* _% G5 \( [, t  f& ~3 G( ^% L+ {9 C! U6 I# ?
  CATISpecObject_var spSpecLine= spLine;                                        # w3 z' ]9 S" S' _& L& q  _

. t6 ?. W, C  Q8 m" _/ O: a  CATIGSMProceduralView_var spSndPntObjLine = spSpecLine;
6 x) B7 w! {) g( I! O
; J( f. ~$ P  B* B# D1 C& f* U" ~# [  //*将线显示在屏幕上' B. N+ I+ B, ]1 }* ~5 I
  spSndPntObjLine->InsertInProceduralView();
0 J( B( B5 B: J9 k! y* n" [4 C! S6 u4 N$ V8 z5 Q; j
  spSpecLine->Update();; u. B& B, e' M& z# q. R

3 p! j# [6 D1 i5 M  return TRUE;5 Y) U: M9 ]& u: V: e, @: Z; D
}) k" x9 Y) t4 r1 p: H

" H- q* l$ ^$ ]9 Y. ?% v- o0 L5 A& I1 |( P! Q9 u8 w
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复

使用道具 举报

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

本版积分规则

在本版发帖
关注公众号
QQ客服返回顶部