查看: 5249|回复: 0

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

[复制链接]

2477

主题

1280

回帖

8万

积分

管理员

PLM之家站长

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

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

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

×
% S: G' _; ?9 |. w5 I
Catia二次开发源码分享: 通过鼠标点击创建直线
3 f/ Z6 E  X4 p1 {1 {+ c- q6 t) W( `, P9 W

, V- _+ L; _0 L. ]2 v7 @4 z6 v; W0 `9 f- G
#include "CAARCCreateLine.h"/ v! N6 W7 H5 d* X" \) {
#include "CATIndicationAgent.h") g# b4 b4 e' Y2 Q  I: l
#include "CATMathPlane.h"
. q2 }: a. L! |2 w0 j& X
% S" s8 W( ^$ E3 d; o#include "CATCreateExternalObject.h"
7 x  i6 i1 I0 M" ~; k+ T# E2 k% y( z& T6 Y  B
#include "CATMathPoint2D.h", s6 i% u' [  L+ q% h* y8 f
#include "CATMathPoint.h"% y- C' t( g! _2 w. X2 E6 q. p
#include "CATMathPlane.h"
8 l" R/ C( _9 X8 f, b
" S' Y- e% r& `1 y$ i. ~3 M#include "CATIGSMPoint.h"& c5 |% g4 `! ]# D
#include "CATIGSMLinePtPt.h"# j7 U7 W. H1 L( U+ a- B
& R$ `( i5 u( o8 k
#include "CATFrmEditor.h"* O% }* y- [% e! m% j
#include "CATPathElement.h"( s' v& e, b+ [3 y
" F% t( e. v3 q4 V
#include "CATIProduct.h"  S1 `) R* D- X  _- T: \8 i
#include "CATILinkableObject.h"
0 l$ Y- `6 `% U#include "CATDocument.h"
! M9 b4 x" }5 ^  g4 u
6 ]9 I8 `2 r. f7 d1 p  G#include "CATIContainerOfDocument.h"
$ U4 W; \, ^7 u1 a) [6 E& a
1 Q  d4 o/ p9 P. S8 i# V#include "CATIGSMProceduralView.h"2 h) b  K# R- h/ x+ j. e

, n0 l* d9 J; r) O, G+ E8 ], U& M#include "CATIContainer.h"
( d. ]' z. k, d) P6 H2 u+ _0 ]#include "CATIGSMFactory.h"
$ p6 e0 u2 r3 _4 x% j6 c# v  F% L3 L' l( V$ D
#include "CATISpecObject.h". x; o+ T9 }6 {, @- m) K/ J! ]
CATCreateClass( CAARCCreateLine);
& P5 E- ~3 z, j' w; m
  W4 d! u0 C) e; {/ P2 ]
/ W' V4 s. @9 o# s( Q  L" ~+ w//-------------------------------------------------------------------------, O( |+ |' @8 E/ u
// Constructor
  i0 O0 ]. Y% H8 |* j0 q//-------------------------------------------------------------------------
& i. V0 i5 j0 L6 Y- v( ]1 OCAARCCreateLine::CAARCCreateLine() :& l* S5 ]: x' D8 K; K
  CATStateCommand ("CAARCCreateLine", CATDlgEngOneShot, CATCommandModeExclusive) 9 _! a0 C/ ?  T9 x! F, g/ e8 P
//  Valid states are CATDlgEngOneShot and CATDlgEngRepeat
4 Y( k& c, Y9 }* E( X  ,_IndicationOnePoint(NULL),_IndicationTwoPoint(NULL)
1 X$ C3 m% n% u5 i. L8 S$ ?{- \" m* ?: ~9 o+ P
}1 E2 h0 E+ T3 \
# G- L# x6 n# j8 O
//-------------------------------------------------------------------------
6 l: x4 M! e/ ?& ~6 Q  F( P// Destructor; X/ ^7 M3 R1 }% k4 K
//-------------------------------------------------------------------------8 o) L- z( |5 X4 w# k' G+ b( A- h6 c
CAARCCreateLine::~CAARCCreateLine()9 e0 M2 G$ N0 g
{
: J6 }0 ~4 ?2 q6 p/ ]   if (_IndicationOnePoint != NULL) & S0 J5 i* Z, [; Q! f5 ]. i
      _IndicationOnePoint->RequestDelayedDestruction();2 e0 Y; G$ Q( B- W
   if (_IndicationTwoPoint != NULL) 2 }1 Y1 u  U3 Q3 e1 C& B7 {( I
     _IndicationTwoPoint->RequestDelayedDestruction();) }  D" E' n5 v1 ~' m
}8 G. e+ j) |- j+ @+ w( |6 M
+ @# [8 P8 \& h7 q& R3 q# b
" D/ @: b" F2 S
//-------------------------------------------------------------------------9 [& u( _* d! I8 D" B  I% q
// BuildGraph()
, m* `2 b/ J% Q+ B//-------------------------------------------------------------------------
) I4 x) w8 _" D& i" c8 p5 v% J6 ivoid CAARCCreateLine::BuildGraph()
3 M+ Q9 Y+ ]- S# g9 z4 L{
6 j$ G( i+ [& \" b" A+ K# R
1 D3 _  A( I9 y5 e9 k4 R# T; p' ]4 F/ ]3 V' B
  // TODO: Define the StateChart
+ W, J: `& k' _9 K" |6 {  // ---------------------------
6 X7 ^, q% a4 x9 C2 F, a0 Z  _IndicationOnePoint = new CATIndicationAgent ("IndicationOnePoint");* x7 X' `1 `" \' i% c
  AddCSOClient(_IndicationOnePoint);3 R* q  L, U6 K* N
: j+ {6 q5 T4 f
  _IndicationTwoPoint = new CATIndicationAgent ("IndicationTwoPoint");7 T" h: t2 G- k! W' g8 o8 D8 Q0 s

3 F; e6 A6 e: n  CATMathPlane PlaneXY;4 c) w, h" g  @; `
  _IndicationOnePoint -> SetMathPlane (PlaneXY);
0 J: S! m1 j" q% g' ?! B& H$ r+ X* q  _IndicationTwoPoint -> SetMathPlane (PlaneXY);
6 G5 K1 r+ J; Q" h7 u! ^7 m5 o: g3 I5 U8 ~; E3 B( Q8 b* e
  CATDialogState * initialStateOne = GetInitialState("选择第一个点位置");
% K1 c1 w5 O% _3 j- |+ a4 z  initialStateOne -> AddDialogAgent (_IndicationOnePoint);( I% F' q: H9 Z1 }) H& _/ n

3 N& h' d8 Y0 H$ ?7 W  CATDialogState * initialStateTwo = AddDialogState("选择第二个点位置");
" s$ Z+ P) a2 ]) I2 t! G0 h  initialStateTwo -> AddDialogAgent (_IndicationTwoPoint);6 j2 N# w# E3 |0 f7 f

6 V4 R3 M/ a# z0 o! r2 ?% {  AddTransition( initialStateOne,
/ g; ]" t! Y) p! r% }                 initialStateTwo, 0 x: ?- _: w; W, n, a" [) H
                 IsOutputSetCondition (_IndicationOnePoint),+ [4 V. r- x* l: z
                 Action ((ActionMethod) &CAARCCreateLine::ActionOne));
6 J& O0 `& b# r  c! G# n+ P
/ V9 z- n% m8 R$ H, B% k  AddTransition( initialStateTwo,
7 q; B5 }7 b# ~6 K& K6 P7 t/ B* E                NULL, # p5 ]4 X0 m# E" }2 L
                IsOutputSetCondition (_IndicationTwoPoint),0 ]4 r+ ]$ z9 r. g
                Action ((ActionMethod) &CAARCCreateLine::ActionTwo));
, d) j2 S9 ^' R1 e0 b6 J}
8 a3 J* U# g! b! d7 R
3 ^7 y- b, V2 e' F; \' x5 L
( i: |0 @& i2 L//-------------------------------------------------------------------------
: L: a" [# `5 `; R// ActionOne ()% E& ^& y8 `; L" O
//-------------------------------------------------------------------------
4 B; c' h$ A* P4 T7 `CATBoolean CAARCCreateLine::ActionOne( void *data )
  j0 S6 A: |  S{
1 ^/ I( s0 \& x0 W  V/ r/ ^" d3 Y  // TODO: Define the action associated with the transition
2 ^6 O4 J9 `/ O# W" G! Y  // ------------------------------------------------------4 c% J3 F' \+ G* I3 B" @
  CATMathPoint2D point2D = _IndicationOnePoint->GetValue();//获得一个2D的点7 R; K; ?4 R% s& G# N4 j) E# ^
& E) o, P, l$ d* b& ?( [
  CATMathPoint Point3D;4 z' E+ x! w$ V' T9 R, N$ C* g
  CATMathPlane Plane = _IndicationOnePoint->GetMathPlane();' ], [% l0 f* B( {5 |% b6 ]

3 o. K( ?6 ]) [, W$ G2 z  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点; |( t: {- M3 i) P# X# v2 v
) z1 ]4 Y5 i! d+ n* B( N3 C0 x: M
  //设置Container(非根节点)
: R. g7 C" y" \. E  //获得Editor: O, [4 W7 k: I! P) F
  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
# `. `+ C' ~5 O5 ~6 ^1 Z; f' e2 f3 k5 W" |7 N
  //得到当前对象的文档
0 x% c9 D' L* O/ M* l8 R1 Y  CATDocument * pDocument = NULL ;
$ e4 t3 {8 K& E2 q+ g* V6 _5 x0 g  n5 R' l* _. L. I4 e
  //取得当前活动对象+ l' }$ l) a  @0 s, @0 Y. g
  CATPathElement activePath = pEditor->GetUIActiveObject();4 B$ S* x: s+ z) i& r

; F' G5 v4 B& M& w" G6 l  //取得当前活动的product
+ T4 G3 U3 n5 T' }1 e% I  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());# m! P" j, y+ u' c1 X
1 x8 {# L) }, _+ P
  //当前活动对象不存在
+ m# _3 U4 i' H$ F5 k. ^  if (pActiveProduct == NULL)- A  V& j, j, \8 a% [% x% Q! q# P
  {
2 ^. p, D3 k7 i/ S+ Y; Z  C& |0 Y    pDocument = pEditor->GetDocument();6 `/ Y6 e5 m, Y. }0 O9 C
  }
5 b" r9 {6 p, o. o( G. w  else% i, ?- `! R0 O! m2 ]
  {
" c" }, T0 @* f! O2 ^# b/ r    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();& g; L6 I# C. F
    //当前对象的引用对象是否存在
3 m: C1 F0 Y+ R5 a/ I( U    if ( NULL_var == spRef )
) R' H3 f  y* b    {
$ _' K, d! O4 Y+ r4 B, ^; f      return FALSE;- O4 D! Q, M( _+ y6 p3 a
    }8 C, m, r/ w$ m3 W9 P
7 f  ]& n5 z/ b6 _1 p7 e9 C
    //当前对象的链接对象: _6 J- J  h7 Q  h3 }1 |% ]
    CATILinkableObject * piLinkableObject = NULL;
/ \: ~+ `. c/ N8 w    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                            8 P. |% C+ Z, X$ T8 [
    if ( FAILED(rc) )5 `  R  f& ^/ `/ }3 {6 B: g" i
    {4 K+ h7 y9 m) }% C, y. Z" p
      piLinkableObject->Release();
- s" j1 _  ]0 E      piLinkableObject = NULL ;
0 t- i  {4 ]1 n      return FALSE;
6 {3 A. `0 f+ p7 H! i7 I    }4 M: F1 ~+ `( B
: z. v& h& Q6 S5 R" m2 q! s
    //得到当前对象的文档
( x; D; {" ~' H6 n    pDocument = piLinkableObject->GetDocument();0 ]. U! j* k+ K0 ?# t! v$ Z6 w
    piLinkableObject->Release();
2 V7 e0 U4 g- J% q7 C5 \- W    piLinkableObject = NULL ;
  c! p' m( H1 y" d) V  B$ T( [
    if ( NULL == pDocument)
8 p* p5 Y* f/ n& D    {
- M, r9 R4 L5 e, b      return FALSE;
. H9 g; @/ u' J- q) |. F1 g    }" k0 n6 N3 V: w& h
  }3 u  I5 C, y6 i: Z: B
5 U+ Y' H0 F1 [' k, h
  //得到文档容器集
, a/ t/ Q2 r- m* Z: f" I9 z2 ^. `  CATIContainerOfDocument * pIContainerOfDocument = NULL;& C( @& M9 ?# d
  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);
. Z/ B& |+ |( m  M) [# N  if (FAILED(rc))
; b: s4 ]- K  L; k. \4 D  {4 n0 q3 j7 l) e, }2 T2 K# q1 O) M
    //pIContainerOfDocument->Release();( P4 `1 }& Y2 o  w+ o* z; g
    pIContainerOfDocument = NULL ;3 M9 d+ |1 f$ K
    return FALSE;
! r$ k" E, b2 I( J4 j/ X0 o  }
- c5 C8 C( z" [6 m0 }4 m
/ i) m1 D/ x7 p" `- E! a: }6 |  //获得Document/ B2 o5 J) V* u! d1 z) G4 ^
  CATIContainer* _pContainer = NULL;       
2 c% [1 }7 ]% c/ ^  r$ e: G! ?  //获得SpecContainer4 K" l. g, J  M; ?
  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);  P; K+ B; }/ Y% R$ [0 r
        * u% U4 |" N1 e+ u& q6 |, T
  //GSM工厂0 f3 l: W) O  S$ Z1 @* n
  CATIGSMFactory_var spGSMFactory = NULL_var;
0 m  e2 ~. |. \( e4 ]( e  //设置工厂                9 P0 G6 Y" g- O# d# ]4 P
  spGSMFactory = _pContainer;                                                                        , b1 ?( M- d$ Z7 c& e

! W' j4 y* z. Q5 r) x) ]8 y  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);6 Z+ A' N7 Z: Y' A% Y7 r0 i; H  A# c
% u+ f" e8 A$ S8 @
  spSpecPoint1= spPoint;                                        5 f1 U; R; |, P0 y0 F

4 c" y) a) k6 ]2 |2 I0 i7 |- c; {  CATIGSMProceduralView_var spSndPntObj = spSpecPoint1;
- v( x2 k% _3 Z
: T6 Y% G, v1 \! Y7 a4 l( j! K7 I  //*将点显示在屏幕上/ [& M$ o0 t3 O) \( C
  spSndPntObj->InsertInProceduralView();8 I9 N7 i2 S9 C( f, r5 C1 s

1 D" M; T1 S6 R5 k0 o  spSpecPoint1->Update();
( r4 b, V1 k, s5 x
% i- R8 |6 s  r3 j. H/ U  return TRUE;' h- K* v3 j. C
}
' U; R, v! n" _: D% M8 E' {: X5 O( S% i+ p: B; ~4 m6 ?
//-------------------------------------------------------------------------
0 s! ~! u9 e0 p& w// ActionTwo ()
% p" [$ Z) C& i5 l& M. T//-------------------------------------------------------------------------
0 I+ B$ f5 ]! t9 b6 Q( A5 VCATBoolean CAARCCreateLine::ActionTwo( void *data )" {$ ]$ u* b* I; d* i% `, |
{; l# P$ W! R) f. C( @8 ]
  // TODO: Define the action associated with the transition
% k6 k4 _7 F7 o  X6 E: V. s# m  // ------------------------------------------------------
$ q0 I* F) b( @% U5 s: j  CATMathPoint2D point2D = _IndicationTwoPoint->GetValue();//获得一个2D的点
; X/ p+ o2 G4 z- n
( @$ k* e$ E3 n$ h$ Q7 R0 Q# T  CATMathPoint Point3D;
' N. q! b" B$ i- o! W2 f) W  CATMathPlane Plane = _IndicationTwoPoint->GetMathPlane();- g* E- r% h) K' z$ i4 D. b
& `# }5 @. |& c" p8 d
  Plane.EvalPoint(point2D.GetX(),point2D.GetY(),Point3D);                //将2D点转换为3D点
& J* s7 m. S. |$ R3 P- L% S1 ~0 C4 h, s) j6 q7 ^
  //设置Container(非根节点)
: u2 [) a1 s9 P8 }  //获得Editor
( n! T1 Y. Z7 [3 P9 u- F( y  CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();6 R; d: E2 O1 a, P  K

7 i: P# q/ T4 D! |* k! u# k  //得到当前对象的文档/ O! d3 B  P5 U
  CATDocument * pDocument = NULL ;
" t$ k6 }+ n6 @# H% }; k
7 V0 b' X, y2 U0 A' p4 N  //取得当前活动对象
) S- v3 q( h0 |- m5 C, l$ c  CATPathElement activePath = pEditor->GetUIActiveObject();: e# P2 ~$ t" v$ h1 q# \
& z) b# t0 \  U6 O- l% i
  //取得当前活动的product' R% i4 R; U8 ~$ z7 g  p0 o
  CATIProduct *pActiveProduct = (CATIProduct *)activePath.SearchObject(CATIProduct::ClassName());* |6 ], [8 m' ~, f, }5 r

& F9 q) g$ C- W2 E  [# T/ A1 f  //当前活动对象不存在! k* v3 Z4 x, r: d7 j2 u$ l
  if (pActiveProduct == NULL)
0 M* c$ U7 w+ K1 p* i  {! v, |3 t% `$ y8 O. k
    pDocument = pEditor->GetDocument();% p# u- }# l$ Y- m+ |7 Q% _) V
  }
5 p6 P8 o! C1 W  else
. F# P* ^: y! W! k4 o  {; k% c3 Z8 w4 @' s  \- j
    CATIProduct_var spRef = pActiveProduct->GetReferenceProduct();6 A! s2 c, h5 Z8 y; Y3 b7 l
    //当前对象的引用对象是否存在
: l2 {; r) ?' o% \7 \    if ( NULL_var == spRef )1 m, u* I6 k+ q1 t% `
    {
& I3 ?8 z- w% V" |; S8 W  T      return FALSE;
& s  v# x, q9 ^: P    }
7 i# G% i& V6 K9 ~% m
- ?% y0 g( K' e( a    //当前对象的链接对象2 b% b: Y+ j& u2 c0 T; r; U0 X* c
    CATILinkableObject * piLinkableObject = NULL;& m5 g, v: [9 j% F7 k; ^- c
    HRESULT rc = spRef->QueryInterface( IID_CATILinkableObject, (void**)& piLinkableObject );                           
7 d0 T3 i7 f; \    if ( FAILED(rc) )9 M5 o) K% u4 q% I0 f# V% t
    {0 _+ F2 C  R' W" B; Y  u& B, K3 d
      piLinkableObject->Release();# m  S4 Q$ |1 m. c( z2 R' @
      piLinkableObject = NULL ;
& t% g, K& V' I      return FALSE;0 F5 `2 x; W$ e8 D9 ?2 R
    }/ t! |6 R: L4 t3 c& g" x

! {1 n& T, [2 s/ s    //得到当前对象的文档
2 t1 {8 n, L! M  c1 A    pDocument = piLinkableObject->GetDocument();* u) Q0 q8 ?% h/ J
    piLinkableObject->Release();$ [" h2 U% \/ d
    piLinkableObject = NULL ;: `  _! I  M0 o
0 x! v4 Q* C: {- f4 C
    if ( NULL == pDocument)
& p. R% Q7 z1 P$ c4 m3 G    {
8 S4 U/ z2 Z# n* c      return FALSE;+ i" P, ]7 W+ p; G
    }( X2 o" ]& z, B4 k/ g
  }
  f. \. i1 `; k3 V- i
  ^, ]5 g# J5 @: `  //得到文档容器集% t0 M. n% b5 \* f
  CATIContainerOfDocument * pIContainerOfDocument = NULL;
/ z5 l# h  P! c& Z  HRESULT rc = pDocument->QueryInterface(IID_CATIContainerOfDocument, (void**)&pIContainerOfDocument);9 O9 j- J: V/ Z- f5 I# o( F% T
  if (FAILED(rc))$ [6 g, w4 o+ I
  {
1 F+ e6 G3 k/ a) O6 J7 y1 }    //pIContainerOfDocument->Release();
( t2 \, x$ R# f0 V    pIContainerOfDocument = NULL ;, F4 Z; n3 {; l6 ]* E' {) V' b9 k
    return FALSE;" n, ?7 J- Q( v* i, K
  }, l0 h: p3 |# T3 ~8 w: s' h
( H# A5 X( B* F' ^
  //获得Document  k2 Q9 c2 f. G* D: ~0 u! a
  CATIContainer* _pContainer = NULL;        ( z! i2 H! m; p# \% Q; ]7 k
  //获得SpecContainer
2 [6 k* v3 [5 z. W! t  HRESULT hr = pIContainerOfDocument->GetSpecContainer(_pContainer);
8 W8 [2 O5 {8 m4 c1 R& s! e) ]        , P- K8 R) s. @5 l$ H
  //GSM工厂
3 Z  k3 ^5 a  x/ `% e% N  CATIGSMFactory_var spGSMFactory = NULL_var;5 D7 `# {" @! }% M  K% Z% X
  //设置工厂               
& G' c2 s. v" e/ D7 g  spGSMFactory = _pContainer;                                                                        9 r& f" P3 j; v: Y- G: {. B; W

: d3 H5 X/ B! L6 o( X  CATIGSMPoint_var spPoint = spGSMFactory->CreatePoint(Point3D);; ~. v/ q8 z- t0 S
/ V. n0 v6 g  ~0 Y) ^/ r" ~- p
  CATISpecObject_var spSpecPoint2= spPoint;                                       
: ^! h7 L+ Y' c/ M. c/ F
6 G1 E, r7 S9 ?9 x2 ^+ [! V  CATIGSMProceduralView_var spSndPntObj = spSpecPoint2;
2 G! ]) K8 B0 k2 [: U/ Q, E4 c2 W* k! ~3 P0 ~2 B
  //*将点显示在屏幕上4 j6 b3 q: d, z  @: {: h' p& d
  spSndPntObj->InsertInProceduralView();2 V4 m1 H+ w) N! F/ v, ?5 \* X
0 n, X9 {9 `; N* P4 O- J
  spSpecPoint2->Update();
, b( M' B% V3 _  P! x, ?2 S
$ \. V+ Q- H  |1 c3 i  //生成线' a; i+ G% f  A9 q; `0 m: ^- p% y: j
  CATIGSMLinePtPt_var spLine = spGSMFactory->CreateLine(spSpecPoint1, spSpecPoint2, NULL_var);$ a% q7 U) W3 [! I: U9 M
2 i& }/ _" P2 G/ n
  CATISpecObject_var spSpecLine= spLine;                                        & y1 n3 C6 J1 `0 H4 Z# R

& e" j8 R! \: K4 i9 C3 [  CATIGSMProceduralView_var spSndPntObjLine = spSpecLine;
; Y( `% Y! P" U0 d$ S, q6 ~
% P- \. F$ ^3 @; ^' ?8 D- z( R  //*将线显示在屏幕上7 E* L' t5 B2 [2 J3 Y
  spSndPntObjLine->InsertInProceduralView();
, u$ ~. E0 V, d1 ]
& Z! c' `& L1 m& |6 a  spSpecLine->Update();
' ?+ r. M1 v+ A. A/ a' m' `5 W
3 R, K) `, g+ Y: b" T  return TRUE;
# E+ V. h' d& r9 |! d8 L/ B$ y}
* J! {) ?4 I3 N  C% M5 w5 N# r7 _/ \) J  [4 _. o) g: E

1 _0 a+ w. [8 q* G& f- r
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 doTeam.tech
回复

使用道具 举报

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

本版积分规则

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