|
|
马上注册,结识高手,享用更多资源,轻松玩转三维网社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
求:
" L" U c- h6 _; H' E, c  如附件图中所示:由line和arc绘制(非多段线)的多个随机单元格构成的复杂图形中,以已知顶点坐标为第一个点,用VB编程,按照逆时针方向顺序求出每个单元个各个顶点坐标,并求出每个单元个面积,结果写入EXCEL或VB的MSFlexGrid控件中,整个过程不要出现鼠标拾取单元格,要自用运行出结果。; ]0 N9 f# N7 Y7 j/ S7 ]
3 O6 } M* a0 z* Z& m# H1 ^" V我的思路是:VB编程,用For……next将每个单元格用类似“BO”命令自动创建边界,形成多段线单元格,然后用以下代码获取多段线单元的顶点坐标和面积,输入到EXCEL或VB的MSFlexGrid控件中。
" f. `9 p* c" [9 W, s
; ~2 a8 X" d2 D2 t! VFor 顶点号
6 B/ i: Q. r. O" [6 q+ G* V 1、创建多段线单元
' Y: ^$ K- |6 E5 h) `# t4 q 2、提取多段线顶点坐标和面积信息
- C/ e9 j- g* B3 @- X5 ]: |* i 3、将数据填写进EXCEL或VB的MSFlexGrid控件中
5 u" J2 V8 ]1 i: p. P3 ^ next 顶点号6 T: U2 |3 _( D6 v4 n
7 z0 j6 a" ?& I7 h
2 V# c0 ^/ ]8 r) S
{+ O7 Q# f2 X( b& Z4 f, PFor循环中第三部分代码大致如下:
5 ~4 n* P2 u) p9 m'MSFlexGrid1中能列出多段线的坐标(我从网上下载到的源代码)7 B- Y2 |; y) R7 l
+ B% T+ E7 s1 N; | g
Private Sub cd多段线坐标查询_Click()
: R# y D& x) q5 J2 y'==========================================================
1 g8 E# Y& Z# p" g6 C. b- a" w8 D Dim acadApp As AcadApplication3 d( n9 v2 T8 X; A( q
Dim ssetObj As AcadSelectionSet+ t, H/ }( f! _" y1 z
On Error Resume Next8 T! `" ^; K3 R. c( J
Set acadApp = GetObject(, "autoCAD.Application")' v/ u/ w. ?1 x. m
acadApp.ActiveDocument.SelectionSets("hights").Delete
2 [( ^# C) Z2 f& O7 G Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("hights")4 [" {; P$ ?+ ~0 F& e
AppActivate acadApp.Caption
+ }1 {& C v d- Z. J! ~ Dim FType(0) As Integer2 J+ {% q+ ^1 r% n0 I0 H
Dim FData(0) As Variant
. r; l1 @8 }) G) b- _; N FType(0) = 0
1 T. y% U5 [# Q: w9 E FData(0) = "line"
r% b+ j6 r. T) M6 L: p2 A/ k& l6 d
0 D$ [; H, S2 j/ o5 y$ K9 B
Dim filterType As Variant7 e7 N( e3 z: F/ ]; b+ b0 Y
Dim filterData As Variant
% y' p8 M' V- ]6 I+ g: ~# B ' filterType = FType; \8 Z" q6 u0 O% ]; P- o1 F* }5 \
' filterData = FData* J# P! b* b2 i! ^, e
' ssetObj.Select acSelectionSetAll, , , filterType, filterData
+ R. s. Z7 P/ W3 M4 b( l: j1 ] ' 'AppActivate userform1.Caption
3 A' v6 |# k& A5 [5 z '
$ z; a) a# W5 s8 N$ b ' Dim pickedObjs As AcadEntity
6 L9 z* B# e; x ' For Each pickedObjs In ssetObj
* x: |( Y1 d! p1 K; Z$ P n ' pickedObjs.Highlight (True) v5 s: p p) |6 A0 l8 q( c, ^- n: N
' Next. M2 a% x0 W' ?& R' w
' ssetObj.Delete ]/ B# L' y5 N" x
# { E* Q n: \' U
/ I/ V8 t2 k* b6 P( d/ l' S: C3 O$ o# h0 E- E
'==========================================================================================================
; j% ~4 s! q. K# O k" u
# g1 h0 v2 s, l3 F3 |0 ]+ E. J1 e/ X3 s3 I& ?3 F/ u1 a2 F9 w
5 |4 k) B$ P. P: n0 t9 c0 p
4 B* f( v$ W8 @# r9 _7 i& H '安全创建选择集
: V* E2 k0 m V4 F! G 'Dim ssetObj As AcadSelectionSet
4 X9 r/ q( r$ s4 Q4 t% J6 s: i1 v If Not IsNull(acadApp.ActiveDocument.SelectionSets.Item("Test")) Then
* a/ V7 D$ C% u& u; k0 ^ Set ssetObj = acadApp.ActiveDocument.SelectionSets.Item("Test")+ _: }8 Q9 G' p% V! x
ssetObj.Delete
+ y& P7 n6 o/ o$ ], |" Y End If
* L* `% {% ?% V. Y2 e% @ A$ i) ^
+ J8 t) ^5 W& d6 W) [) \! U
p# r& a4 T4 }8 Y '创建选择集. u1 M# ~( Z3 X
Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("Test")
& h/ f ?! V7 J- m2 i+ k# h
- l; u7 r, P P. ]( @ '激活CAD窗口) M/ P& K8 S8 u
AppActivate acadApp.Caption
" J, _/ `) ?& i% R0 ] acadApp.WindowState = acMax: V# R, e5 U( Q( V2 q1 a5 G
'提示用户从屏幕选择实体对象,并加入选择集0 x6 w- ]+ m E6 I4 A* r) h$ K
ssetObj.SelectOnScreen+ B- t( f& f" n( I* _: K/ t
ssetObj.Select acSelectionSetAll '选择所有曲线
# @: n( _" j, O
$ W& Y- D# [7 ^' E2 s c '选择完毕后按回车键或单击右键9 b6 n0 H& I- e, f
'Dim pickedObjs As AcadEntity$ d$ H, ^% K; t5 R
Dim retCoord As Variant
7 c# u3 O, n$ f" r. o6 [3 Z. V. e For Each pickedObjs In ssetObj& K' U' O+ a# O; f% E' L5 M7 {
retCoord = pickedObjs.Coordinates: C7 H O0 }: }1 e" o( H3 o
AppActivate Me.Caption
7 a9 ]2 x3 m( L W& Z acadApp.WindowState = acMin5 O' Z+ m; |1 h2 Y! |& c
If TypeOf pickedObjs Is AcadPolyline Or TypeOf pickedObjs Is Acad3DPolyline Then '普通多义线或3维多段线2 |* ~9 x4 {9 h0 o: o0 v
j = (UBound(pickedObjs.Coordinates) + 1) / 3 '多义线的顶点数4 C4 \, _9 O$ B. C6 R
For i = 0 To j * 3 - 1 Step 3& m! j: G% I1 ? V k: |+ n; O) N" p* d
If retCoord(0) = retCoord(j * 3 - 3) And retCoord(1) = retCoord(j * 3 - 2) Then '闭合时" U/ v. P+ u) @/ o8 M3 }: M1 I% P
MSFlexGrid1.Rows = j
0 L& L* l/ q, n& d* e Else '非闭合时; r, k4 k) L8 F4 u
MSFlexGrid1.Rows = j + 1( d/ B$ ^9 W2 C
End If
) Q& y- t9 p! R' j8 F MSFlexGrid1.TextMatrix(i / 3 + 1, 0) = i / 3 + 1% N \, G0 c8 ?" N& u" e7 ]9 l) u
MSFlexGrid1.TextMatrix(i / 3 + 1, 2) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000")9 b9 c: `+ ?' [ F% i5 g
MSFlexGrid1.TextMatrix(i / 3 + 1, 1) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000")9 J9 f+ d" x& o/ q
; h0 V9 ]# }* e2 Y) C( J5 q
Next i
6 @6 e; P) q; l( U ElseIf TypeOf pickedObjs Is AcadLWPolyline Then '轻便多义线# f% v: }; R8 R4 W
j = (UBound(pickedObjs.Coordinates) + 1) / 2 '多义线的顶点数) q0 r0 k, w% C2 S7 d7 ]# L" ?
For i = 0 To j * 2 - 1 Step 2
+ Y7 T: P _9 w+ O% |! ` If retCoord(0) = retCoord(j * 2 - 2) And retCoord(1) = retCoord(j * 2 - 1) Then '闭合时
8 K6 t4 ] g/ I2 h: K( N MSFlexGrid1.Rows = j
. O+ |; ~) Q% n0 |* O( l; p; L& w9 x Else '非闭合时, Z7 B; V* F3 i0 z0 Q/ R7 O
MSFlexGrid1.Rows = j + 17 H4 }0 m( u7 H9 {2 {/ s6 t5 |+ _( ~
End If( [: I( J$ H0 n
'******MSFlexGrid1中只能列出多段线的坐标******$ x1 l$ M3 Z' K5 Y2 J* E
'不支持面域
8 t3 N# _: \: I MSFlexGrid1.TextMatrix(i / 2 + 1, 0) = i / 2 + 1
* q. i& I1 E) i5 d# o4 ~6 | 'X坐标
8 o, N5 @5 N/ l# S/ N3 y MSFlexGrid1.TextMatrix(i / 2 + 1, 1) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000") 'X
& |0 {' Y6 z8 J& ^9 n1 B! e 'Y坐标* U9 A$ u- E: }% P3 p
MSFlexGrid1.TextMatrix(i / 2 + 1, 2) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000") 'Y
/ M% d+ E3 h+ Y6 _8 S: C6 j6 ^' c '面积3 {2 @( P9 w/ h0 Z7 R4 Q! s- C+ {
MSFlexGrid1.TextMatrix(i / 2 + 1, 3) = Format(pickedObjs.Area, "0.000") '面积
7 e# ]6 P" o I' P2 H" p" M# N MSFlexGrid1.Refresh2 @( ]) m1 H: v+ z% k
Next i2 L$ _$ {/ Z" g) Y/ A. J
Else8 D! T' l% S4 d7 X: b# T
MsgBox "您选择的不是多段线!", 64 + vbOKOnly, "地质测量"4 z+ x: o- @+ V8 S8 f4 u4 U6 r
ssetObj.Delete
7 Q- j* g* F/ d# |* l0 ?2 p End If3 R- I z( l0 m' G4 A/ `$ [
Exit For
* f/ [% m4 M) e Next
) p5 s: t: \5 {8 B% w* ] '删除选择集
6 _2 H7 a# ^( ] @' ]: q ssetObj.Delete
3 l) E+ P; H& m8 nEnd Sub5 e' r0 J4 ?4 O6 k, _$ k6 d
; q; D2 U1 M% L: M' F- d'==========================================================
7 N" C/ y7 \! _' m/ g% R( ^- S% R( C5 Q4 S5 D6 ]3 j
[ 本帖最后由 dreamci 于 2009-5-21 21:58 编辑 ] |
|