查看: 5088|回复: 0

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

[复制链接]

4

主题

3

回帖

48

积分

管理员

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

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

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

×

" z( F0 w. |- D8 A' ^Catia二次开发源码分享: 通过鼠标点击创建直线$ i4 o; O- \5 _; Y. @* j9 ]' A. o

. H7 U. [- R: A. @' F" z
& T! [* v- {1 R  z8 X& C- C/ A
7 f: s5 ^1 m3 P#include "CAARCCreateLine.h"
* g; v6 T+ y* y8 E' v. s0 f#include "CATIndicationAgent.h"
% _/ g2 `! m0 w: l" O9 I* ^& |#include "CATMathPlane.h") R$ Y" F# `: L5 o) V

% G6 _1 Z( z1 j$ K$ g#include "CATCreateExternalObject.h"+ _$ b' H. h! Q- @4 F! V/ K
' b0 N5 V8 b) n; G8 s
#include "CATMathPoint2D.h"
) Q* {% W' C$ V+ y5 @, o$ S. a#include "CATMathPoint.h"
# i( P: L1 N1 f7 o#include "CATMathPlane.h", h) w, c" l, W- I3 y' B" T

3 q+ I3 x; h; {& X2 U. |" a# I2 @# e" a#include "CATIGSMPoint.h"" n7 ~2 C$ H0 S; E- A  a8 D
#include "CATIGSMLinePtPt.h") }2 N% |+ G1 Q: C6 E, }. N
& M& b2 {- l4 `
#include "CATFrmEditor.h"" U1 c; W- K4 e" ]/ V( w' E( k
#include "CATPathElement.h"
1 a- _( I3 e# P8 w# M- i" S, b' ]! ^! j
#include "CATIProduct.h"
) b0 O1 c9 @4 k$ x& H#include "CATILinkableObject.h"6 H* I/ g3 C8 V- S+ o
#include "CATDocument.h"
- C/ n0 H8 h8 _4 I0 ^2 I+ c) c
, ^8 Z$ u5 U* _/ t" Y& }#include "CATIContainerOfDocument.h"1 k3 a/ w/ I* G
+ C- p% t5 h. T) R/ K& \5 U
#include "CATIGSMProceduralView.h"! V/ p" C  @9 ~2 B
2 N- _. F4 ?' H7 }; e
#include "CATIContainer.h", _1 l5 ]! i( Z  Z) t$ s
#include "CATIGSMFactory.h"8 j$ T, E* a' T" k4 _

2 @! B* F* L# g#include "CATISpecObject.h"$ \7 ^8 V; m) o# F& C
CATCreateClass( CAARCCreateLine);
3 ]" m, V0 Z" U5 F& u: Q0 ~* f
0 G$ V/ b0 K  Y9 I  C: Q4 M1 s$ X
//-------------------------------------------------------------------------; I/ B6 ]+ x+ t- W/ n/ M
// Constructor* E1 U. j1 m8 e+ K" i
//-------------------------------------------------------------------------' E" X0 v. w9 |% b( Q. E) ~
CAARCCreateLine::CAARCCreateLine() :2 Q& y4 Q3 u+ u& s, m5 ^5 Q# g# K7 d
  CATStateCommand ("CAARCCreateLine", CATDlgEngOneShot, CATCommandModeExclusive)   j0 i! ?1 o) _6 ^+ D0 q1 G' y
//  Valid states are CATDlgEngOneShot and CATDlgEngRepeat- k( R; c( M* u# p) V; j
  ,_IndicationOnePoint(NULL),_IndicationTwoPoint(NULL)3 b' ]2 ^, H% N" D9 q/ M% ~3 s
{0 t' A$ p* q$ Q* Y1 s( Z% I1 E
}6 b) Y- G4 t: W3 j& Z
5 g4 C( y( b7 P# R2 _
//-------------------------------------------------------------------------6 P! r8 @% B8 `/ N5 @5 c$ I6 O
// Destructor1 y; w; v8 H1 ~/ @' M
//-------------------------------------------------------------------------
! [; _6 d( O4 |" }6 ~CAARCCreateLine::~CAARCCreateLine()! k3 n: K  O4 O: E
{# A% J+ U; {& ~/ t8 o! J
   if (_IndicationOnePoint != NULL) : z. i, X1 @* C7 D
      _IndicationOnePoint->RequestDelayedDestruction();
# U- B# D: p+ \7 J5 N- z& y   if (_IndicationTwoPoint != NULL) 1 M( _5 O0 K9 b9 H: F9 \. M
     _IndicationTwoPoint->RequestDelayedDestruction();
' l0 _. t/ j8 D/ _; Z" _5 `}
0 A% N8 w; A2 d: d7 V( {
$ S& t/ @; g3 Z0 k; s* y0 u$ y3 d3 x* f
//-------------------------------------------------------------------------+ W! e1 }' W, ~  d, x4 L
// BuildGraph()
$ a/ |3 n9 C8 v7 U' }7 c//-------------------------------------------------------------------------
, S2 d" t6 @4 H" C" Cvoid CAARCCreateLine::BuildGraph()
9 M. L7 i7 y. _{* h" p' k( h& g9 T) |  o

7 d' X4 C$ E( ~7 e5 s: V) }6 [; B3 \8 L3 X) L, ~! R! a* l
  // TODO: Define the StateChart
. v* Z' J5 n) w1 E& l% W5 b  // ---------------------------
! H, N/ b5 o* V# Y( z7 {: ?  _IndicationOnePoint = new CATIndicationAgent ("IndicationOnePoint");9 S8 H  _. X" K+ N4 f. }, D
  AddCSOClient(_IndicationOnePoint);% t7 j, ?  y0 E" I6 I7 L# w- V; O$ H
* @! Y! F/ x6 f  b. O9 K( D
  _IndicationTwoPoint = new CATIndicationAgent ("IndicationTwoPoint");
) N: b- b) c9 h9 J
$ C1 Y3 N" v0 o+ \$ I  CATMathPlane PlaneXY;
  }8 x7 A2 ~+ U& l; l6 q  _IndicationOnePoint -> SetMathPlane (PlaneXY);
6 B) u" W7 t; @: ]% G4 j. t  _IndicationTwoPoint -> SetMathPlane (PlaneXY);& @4 k, |5 S# W
& h$ i' V, ]/ K3 |) ^
  CATDialogState * initialStateOne = GetInitialState("选择第一个点位置");
2 C- i1 {/ S$ X  initialStateOne -> AddDialogAgent (_IndicationOnePoint);. D2 i2 j* k- U* P$ n9 A
, g9 `* b+ ^/ }$ N7 e3 {1 t
  CATDialogState * initialStateTwo = AddDialogState("选择第二个点位置");
0 h; N  |- m# o. N  initialStateTwo -> AddDialogAgent (_IndicationTwoPoint);1 v3 _( m+ Q' R
+ [9 {1 i$ f4 p7 p; f- d% V
  AddTransition( initialStateOne,
# b4 s! R0 t" a2 I. _) m                 initialStateTwo,
; V7 |8 f! s5 k6 R3 }. S" H                 IsOutputSetCondition (_IndicationOnePoint),, N: F% q% R0 b/ R. e5 p6 l
                 Action ((ActionMethod) &CAARCCreateLine::ActionOne));
% R2 G6 h. h6 `( P- y" ~8 F( @. r; n. l' G5 x+ U- L( U2 Q- ]2 l$ g
  AddTransition( initialStateTwo,
" a; T) u+ M7 F                NULL, & {6 I+ P9 T) y. w& S4 w' u; c% {6 r0 k
                IsOutputSetCondition (_IndicationTwoPoint),4 d6 v8 q: I$ G# g2 q
                Action ((ActionMethod) &CAARCCreateLine::ActionTwo));
  g# y$ \! m( h: v- ?}
1 w- G( e/ @& ?1 T0 B, Q; F3 c' d
- p4 q0 Q7 U' N
' M% k" H2 r- s# D" N' B1 ^/ U//-------------------------------------------------------------------------
% j6 d8 I# w3 E. r( ~6 I& `// ActionOne (), g# c6 U* @3 x& K7 f
//-------------------------------------------------------------------------
1 f* w0 X+ o! Y; q* zCATBoolean CAARCCreateLine::ActionOne( void *data )% q% Z( [1 N( p3 d$ t- J9 Y9 q
{
- _+ ]- g4 ?2 C6 b# K' J/ K  // TODO: Define the action associated with the transition
4 n+ q0 v( t. m/ s# G; N  // ------------------------------------------------------
& V9 _# g, D  `% N0 M$ s  CATMathPoint2D point2D = _IndicationOnePoint->GetValue();//获得一个2D的点
! @0 N  r7 k6 e6 \$ `1 {0 y, N1 ], l+ L4 w
  CATMathPoint Point3D;4 X+ N8 {$ x3 }9 ?2 m2 t5 T
  CATMathPlane Plane = _IndicationOnePoint->GetMathPlane();2 I$ A$ J2 I) C" r1 X1 H# Z

( M# F' ^, ~* k4 A. @  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点( k- N1 n& ?* b8 X$ w  O0 f$ ~  @

. S6 U; f# s) |  //设置Container(非根节点)
2 {7 {% s  m+ a& S/ o. Q  //获得Editor
* P# i# f; h/ `) x. X( [  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
8 @. S* e: c+ ^# R! Y; Y* t% S5 e0 i0 L. _
  //得到当前对象的文档
# c# ~0 J9 r; {! T; r+ J4 S  CATDocument * pDocument = NULL ;
- \. T. r* c: O9 c$ N4 m* X  i$ n* ]" v! p! e
  //取得当前活动对象4 E5 O6 {$ c- v4 L
  CATPathElement activePath = pEditor->GetUIActiveObject();
% f9 G* P) U/ _7 ~
' C; {9 v) x& a4 ]% _6 L( K  //取得当前活动的product
2 i2 F6 w" l% }& g# B& \& {  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());
* Q' b6 y  W7 O+ Q6 ]  |% ^3 \, ?! U6 H- t1 I6 i' K
  //当前活动对象不存在
8 v% y" @& M3 Y! t& \* c" `  ]  if (pActiveProduct == NULL)
+ h6 Y0 Y, X! k7 u( M3 Z  {7 U* Q8 x! A6 `4 g+ T# M
    pDocument = pEditor->GetDocument();
. a: r: b- K) S1 H# S  }- \2 G" X7 s4 d$ A9 `4 @% ^7 P
  else) A3 W1 E! J. n% u1 ?. j* h9 d6 i( L
  {8 c; _* J3 v4 D7 k
    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();) ^7 h, x$ W9 i& I. E; ]! r5 e6 o
    //当前对象的引用对象是否存在0 g- ?8 Q  x2 v% ^2 R+ c) Q
    if ( NULL_var == spRef )
7 i" n/ P5 Q  C& G$ X    {
( B# a# Q5 `; @8 t' ?: L$ R      return FALSE;' G$ p, {/ V% g: }6 \$ W9 U
    }, I: }9 w5 x3 z7 g! e9 L

( Q8 ?' ^8 f% K9 o" C+ [    //当前对象的链接对象
: X0 Q! v% R$ \# I) u. M1 v. F% j3 P1 e5 ~    CATILinkableObject * piLinkableObject = NULL;
5 E) j( x5 A& v2 J    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                            $ c. h5 l5 i2 P7 K) l% L5 c9 J' f& c
    if ( FAILED(rc) )
+ `4 k( ~4 i, k    {1 d/ Y/ H, J! O, _7 `3 T/ Q
      piLinkableObject->Release();2 y# {3 V8 r& O7 c9 I
      piLinkableObject = NULL ;
- ~& x$ p2 \) n' s/ K. @' g% ^. k      return FALSE;
/ Z+ a9 F- f; @' C" ^    }
8 l- F: E' L2 F! S8 b+ l7 l. I2 a# E; c1 ~2 p
    //得到当前对象的文档+ g3 q- a5 ^8 t5 C0 i5 n( T
    pDocument = piLinkableObject->GetDocument();
7 N* @6 u3 f8 n2 N3 ?) g    piLinkableObject->Release();. P- x& i& H- S# i3 F
    piLinkableObject = NULL ;
& e6 b, _0 \! w7 N9 g2 g9 I
3 ~) C9 k" l! T4 E4 Q    if ( NULL == pDocument)+ I6 J8 d) o3 F% E1 _
    {0 s& Z; i) j( q8 K% G0 h0 ?
      return FALSE;6 p. }# ~2 Y* [, Z
    }
2 @( E, M# M+ s* }  }4 Q1 r4 g. z2 C6 M+ {; R+ r/ S

  I4 P. E* i' [8 P+ J  K  v9 }  //得到文档容器集( C9 [4 M% j6 n% j
  CATIContainerOfDocument * pIContainerOfDocument = NULL;0 A% F7 p8 z1 C
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);
' u1 M. Q4 Z+ l$ o1 Y  if (FAILED(rc))
* H+ O  X% c0 u7 U2 a, u( ~1 X6 r# X  {
  M; }, X4 l4 t, G+ Z) ?    //pIContainerOfDocument->Release();6 {1 w" Z1 i1 H4 T8 H; a
    pIContainerOfDocument = NULL ;1 t8 R' g& V( ]. X! [) S( u5 k* c
    return FALSE;* B) ^, P& j9 ^1 E% t
  }: e7 j$ v* _$ I% w

, ?, k# c- k4 c# j% g+ `/ A5 f  //获得Document, }% ^: a+ f- V  R7 Z" v0 Q
  CATIContainer* _pContainer = NULL;       
" J: o3 K" z0 r: b  P; @1 J  s& Z  //获得SpecContainer, h7 X! {! N3 y: ^
  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
2 A' Y- i4 S0 U5 V0 S6 Q1 ?/ }/ O       
3 X3 P* |$ n. _5 j  //GSM工厂& Q0 m2 z% z; O# Q' t6 Y6 p5 H
  CATIGSMFactory_var spGSMFactory = NULL_var;  Z! Z6 f  f% Y, m
  //设置工厂                3 ]( I* [" g+ ^3 ]/ s
  spGSMFactory = _pContainer;                                                                        - f' d6 u3 S2 Y- m( B( H( V
: a& T3 F# L9 ~* d- O3 H6 R6 S$ q
  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);
, r5 D; z9 a6 Q6 e0 c* Y6 O$ r; X; t
  spSpecPoint1= spPoint;                                       
* x7 u1 v2 H# E* }1 n$ j$ N, w: O; ^+ o; O5 N+ c
  CATIGSMProceduralView_var spSndPntObj = spSpecPoint1;
# J5 r: m) n  U$ U" t2 ?  I
* _3 j" X$ z: l- m  //*将点显示在屏幕上
5 F5 e2 q* _$ M. T% z* x  spSndPntObj->InsertInProceduralView();
2 n, c! p! m6 o
; o4 g3 i: U8 G) L: A  spSpecPoint1->Update();5 G+ W. K2 ~# \9 f) c- F
, \/ g* m6 }" z% y% x
  return TRUE;
7 w; r8 C7 j3 a  W7 N}
  B# Q) U; d" g5 b! i: G3 w2 I; O( D9 J
//-------------------------------------------------------------------------& q. |1 G5 g# v& k0 L7 ?) \2 d
// ActionTwo ()# q* x* S2 b, R2 Q
//-------------------------------------------------------------------------
% ~! p2 b# E6 XCATBoolean CAARCCreateLine::ActionTwo( void *data )
' D4 n6 E+ N1 ]1 @{7 E& t  v; u- F; S5 }" C, S: _; N  N
  // TODO: Define the action associated with the transition
9 H6 ]( X! j) g- c5 u" `  // ------------------------------------------------------4 M1 H/ l; l& q  v9 D
  CATMathPoint2D point2D = _IndicationTwoPoint->GetValue();//获得一个2D的点
8 }5 T4 F. h) J# ]& k2 X1 ?+ N, `; B' h8 `6 b
  CATMathPoint Point3D;
, `) f" N7 g9 j  CATMathPlane Plane = _IndicationTwoPoint->GetMathPlane();: t& i3 B+ e$ n
- F- ]# _; H6 Y! w, @3 U, k
  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点
7 G$ H( z, W4 c7 ?+ K
. g# ?6 T2 B; o- i) _( q1 ]; _; \  //设置Container(非根节点)
- ]+ `/ [( j2 [7 C+ n4 @  //获得Editor
: p2 S$ @* d: }; N, A  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
4 l, v+ B* q  x1 Q# o0 H9 P9 L' R$ E8 d8 o) Q4 x
  //得到当前对象的文档, d4 @" V) {8 R7 |, L
  CATDocument * pDocument = NULL ;! \! v9 q4 W8 C) c$ ]3 j
( z2 h, e( ~9 f1 P. W
  //取得当前活动对象% t$ J+ D0 _/ l- x7 m& J7 s2 K
  CATPathElement activePath = pEditor->GetUIActiveObject();
, J* X; \( S6 I* G% C, {, q7 g: v: r# Y6 d8 t: W
  //取得当前活动的product
$ Y3 c* P  V& F  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());
8 C; P2 _0 X9 z1 H5 g' `5 H/ L' T/ Z! W8 b
  //当前活动对象不存在3 G- I6 q' f# X
  if (pActiveProduct == NULL)0 y* f6 v* f; Z
  {
8 L+ c! u. f% H0 a: N; y( @    pDocument = pEditor->GetDocument();
) `- J7 S8 f0 }, h, u# T( A& t6 P  }
; Q; y4 r( ^  _4 V8 R4 j& @  else7 \+ M0 M4 ~  q: N; k  w7 }) B) k
  {
0 i6 s* W! @4 l/ S- d) u    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();
! F2 t7 G' V( q& U3 _( ~    //当前对象的引用对象是否存在' a. A" X/ j1 G! |; N4 w, d
    if ( NULL_var == spRef )
- |7 w% k9 h$ Y2 O! z4 e" Q+ H    {5 J0 ]' Y- p  ~# n: J" r
      return FALSE;7 G8 ]" ~2 _. n0 h9 W5 ^( f3 g
    }
$ U3 f% J7 h4 u$ Z+ L; t$ }( @: S% ?/ \& O/ B. G& _
    //当前对象的链接对象
1 W$ ^8 F3 V1 G    CATILinkableObject * piLinkableObject = NULL;
: z: C6 \  A; T; K  [0 {6 h/ G    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                            4 L4 L6 c( }7 C' D
    if ( FAILED(rc) )+ {# W. e% c( n% h5 f
    {" S& C; N. r; Y" Q1 a* A. {
      piLinkableObject->Release();
& K" U6 h; S1 {  o      piLinkableObject = NULL ;
! a+ G* G1 J  l3 F) [      return FALSE;
" e2 k4 t- n" p  p$ U    }$ |4 W$ j2 U$ U; A$ E' O2 A
# [# V* @# O" E, x
    //得到当前对象的文档
4 u( ?+ O' m2 E# Q    pDocument = piLinkableObject->GetDocument();
( ~5 L% \, Z* R    piLinkableObject->Release();
# y6 ]0 C% ~( R. j    piLinkableObject = NULL ;
9 ?4 `3 a  B5 [0 {1 F4 U, s" y  \- f6 E+ c1 \
    if ( NULL == pDocument)
: Z3 E; B: f- x6 R    {' [3 Z" O1 z0 E5 |1 v
      return FALSE;
3 F! I, O( `6 W$ \& i+ U3 D+ P0 w    }1 E3 e0 h0 i/ \7 R. O0 Z1 ^4 x- W
  }
' ~8 ?. C3 g7 ^( r  m2 I
* R6 [5 z' s. o/ r; L  //得到文档容器集: x2 H, @* i' _" K. e4 S% O
  CATIContainerOfDocument * pIContainerOfDocument = NULL;" J$ [; ~* d, u% s8 j0 e
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);- b) p7 B! U$ R7 b) w
  if (FAILED(rc))6 }% w+ L+ P4 A' A' a
  {# M% U* ]' |! A4 Q0 I, X% Y: o
    //pIContainerOfDocument->Release();1 f. a  e5 M. I& S/ [
    pIContainerOfDocument = NULL ;
$ |' o5 D# N1 ^% i6 F$ m9 m    return FALSE;
$ h! z; Y& z* z- A  }1 {& a" u9 _. Z

9 g, y1 L- p! @8 G$ J1 p% m1 O  //获得Document
; Z4 U! H* Q: w  CATIContainer* _pContainer = NULL;       
1 `9 Y5 @2 D3 O. A  //获得SpecContainer
6 F% p3 P' I: F% A  x' z- a  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);% s* D) o! K# _5 V2 O8 {
        2 O" o5 f6 w4 r; ?; L
  //GSM工厂
& g/ v7 G+ I1 K  CATIGSMFactory_var spGSMFactory = NULL_var;
; Y! e4 z* Y3 q% t% Y# l  A7 S  //设置工厂                ' u: z3 r0 U3 J
  spGSMFactory = _pContainer;                                                                        ) S# W2 Z0 j) P2 H! b
0 Z! J* A6 e0 B  K1 K6 s3 w) D; t
  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);
1 G+ E! B; A4 u; K3 [* e/ o
- A9 D/ R* H" N, v1 y: y- D  CATISpecObject_var spSpecPoint2= spPoint;                                       
, `+ ^: Y* b2 I, G1 y
' }: z6 b" m4 V  CATIGSMProceduralView_var spSndPntObj = spSpecPoint2;
5 }( l; N) n7 H4 C. l& a# `1 w* b# i& f( {
  //*将点显示在屏幕上
; W; B/ q" r; _! a+ p. f  spSndPntObj->InsertInProceduralView();
+ n/ b6 b& P5 h4 Z
  v! r$ r( J4 ]" Z( r7 i  spSpecPoint2->Update();- _/ V- @& z. j0 B! ~
& ?0 J5 p6 z3 i
  //生成线
1 {+ b; p; [( _! V6 J  CATIGSMLinePtPt_var spLine = spGSMFactory->CreateLine(spSpecPoint1, spSpecPoint2, NULL_var);+ W% s! N7 N! A( E" X& ]; u
- J$ v" P+ v7 x/ v5 a7 m3 R
  CATISpecObject_var spSpecLine= spLine;                                        6 T1 y9 L0 [+ b+ }% C; n) D

$ u( x" @# R) R  CATIGSMProceduralView_var spSndPntObjLine = spSpecLine;
4 v1 B7 y9 j! X0 O, X# s5 G& u
3 W( X1 a8 F3 J& s9 L, E  //*将线显示在屏幕上9 C" d8 Q/ J" V# C6 a- c
  spSndPntObjLine->InsertInProceduralView();
- N5 Z/ j+ p8 E; S/ r8 V7 I$ R- S$ s# A% I9 a& `  Y
  spSpecLine->Update();
9 F) L. I) K. p1 S/ W+ j
! y5 i) P6 v6 p) D  return TRUE;+ o% ^$ R8 h% [, c4 X( |) ^* {
}
( ^: G3 }" u  G9 g) i8 S+ U$ F* {# P
' e  W3 d* n7 ?0 L
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复

使用道具 举报

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

本版积分规则

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