|
|
马上注册,结识高手,享用更多资源,轻松玩转三维网社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
求:
7 q9 U6 |+ W+ x0 y. {  如附件图中所示:由line和arc绘制(非多段线)的多个随机单元格构成的复杂图形中,以已知顶点坐标为第一个点,用VB编程,按照逆时针方向顺序求出每个单元个各个顶点坐标,并求出每个单元个面积,结果写入EXCEL或VB的MSFlexGrid控件中,整个过程不要出现鼠标拾取单元格,要自用运行出结果。4 h) V& K' n" \; E6 U
4 i. {; O0 z7 o: j0 B9 G我的思路是:VB编程,用For……next将每个单元格用类似“BO”命令自动创建边界,形成多段线单元格,然后用以下代码获取多段线单元的顶点坐标和面积,输入到EXCEL或VB的MSFlexGrid控件中。
) j& F& w( s4 U, \! J! S4 }% ?3 t' R$ B. D$ w
For 顶点号- G* X! [! j% h0 Y
1、创建多段线单元
% _) t9 z1 `6 p$ i2 y; U 2、提取多段线顶点坐标和面积信息
; g( |, @- H' m) J% O+ L 3、将数据填写进EXCEL或VB的MSFlexGrid控件中
' F5 {( B) _) |) d; h next 顶点号
5 V* Z- Z3 k! b! x2 ?& R6 ?% d. N6 I9 ^
/ D b% t" @! f# j! M
6 b" S" h* f9 O, R# ^) q hFor循环中第三部分代码大致如下:! B8 o( p7 W! @! Y, M8 o" Q
'MSFlexGrid1中能列出多段线的坐标(我从网上下载到的源代码)7 d/ j, Q; O1 I$ ?8 X
; _4 h" e6 \ q( R+ _& p
Private Sub cd多段线坐标查询_Click(); n! E, R& [: l6 f5 B8 P
'==========================================================
& y, i- V( a) x3 P& l) n4 b& n Dim acadApp As AcadApplication
. ~; U1 {7 ~' h" b. C. u Dim ssetObj As AcadSelectionSet- F: A ]: {" m9 O; k6 g* g* O5 a
On Error Resume Next. r4 _- S& n# I8 a
Set acadApp = GetObject(, "autoCAD.Application")/ ^! i9 X' q: L2 c% M' @
acadApp.ActiveDocument.SelectionSets("hights").Delete5 T7 b. o" H/ k
Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("hights")8 i9 h% N2 O0 ?1 L! n7 z0 X
AppActivate acadApp.Caption4 ]8 v2 u: a$ a; n# Z9 T9 @
Dim FType(0) As Integer
; b& ~8 T) h, O" }) _, T( ` Dim FData(0) As Variant8 r, R6 }6 ~0 g2 R1 y- X
FType(0) = 0 x$ a0 \+ F* z
FData(0) = "line"$ ^: [( q$ F* o# z6 L$ |8 k
& e1 q; n, g" S! n8 I1 x# v0 E
6 d( p% m4 K. |* _ Dim filterType As Variant4 D. ?/ T z% U% r$ P9 G' ]
Dim filterData As Variant
9 R8 D0 K4 H4 x7 `6 _+ j$ c ' filterType = FType1 B$ `* F& ]3 H
' filterData = FData# s( F4 }8 M# n" A6 r6 V
' ssetObj.Select acSelectionSetAll, , , filterType, filterData/ d2 e2 e4 p* b3 d& f( ]) H
' 'AppActivate userform1.Caption) H; I- n2 Z$ A+ t: @
'
- \9 [% P- _) P0 l+ }" r$ z& h ' Dim pickedObjs As AcadEntity6 A" U! H& O; m) l9 e/ ?
' For Each pickedObjs In ssetObj
+ N, f& ~: u: E$ \4 J# Z ' pickedObjs.Highlight (True)
5 @0 U* w! v i- H ' Next
; _0 R8 e1 F# O# s" s& z0 T ' ssetObj.Delete) X+ \7 G, O# |' R
' Q; q+ M, Z b
' ], i3 L2 I: I! u. a4 @. K; T' Z( t- c6 P- x2 t G6 `& Q4 U
'==========================================================================================================+ ]8 @/ h6 w( B
, `3 u$ t) ~5 @9 d) ?
& j6 j. P) h0 W* C+ X1 K, p( |8 [+ W1 K* k7 |$ J) Y7 ^
4 V2 A% [9 d0 ?& {+ S
'安全创建选择集
, r+ i9 |5 p: U9 u8 F 'Dim ssetObj As AcadSelectionSet4 K# S# J/ [' r3 Q( w
If Not IsNull(acadApp.ActiveDocument.SelectionSets.Item("Test")) Then0 } ^# i9 g) o
Set ssetObj = acadApp.ActiveDocument.SelectionSets.Item("Test")5 S3 h) J: F" c/ u* I" j! {
ssetObj.Delete
5 e/ C3 _: X" w& f( f8 N. | End If
2 S; B2 ~+ J" G6 T6 | 7 |/ `7 Y; Z7 R* B! k9 ^
6 j" M7 E; w7 e$ s
'创建选择集
% |* g; P: ~% d9 A) I$ G Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("Test")
/ P5 L, ~3 x# c+ D
3 S0 L6 n0 F: {6 s9 F0 b' M '激活CAD窗口8 b# h3 m1 ?5 g) R" g2 p
AppActivate acadApp.Caption2 [ w% V9 R' r' E- F8 }
acadApp.WindowState = acMax
- c' D& U( i i y '提示用户从屏幕选择实体对象,并加入选择集
: L( H; Y4 O$ [ ssetObj.SelectOnScreen* C5 @- w- E7 u5 ]( j
ssetObj.Select acSelectionSetAll '选择所有曲线* q+ G) J+ @. o6 \
3 J4 @* ^3 E4 t& d4 a '选择完毕后按回车键或单击右键
, m$ Q" N$ H- e* c. Z; |$ N 'Dim pickedObjs As AcadEntity$ t9 f. S$ r9 d# J
Dim retCoord As Variant
0 E/ N8 [& g! D+ U- n# ~; i For Each pickedObjs In ssetObj% h3 f/ o* W- ?
retCoord = pickedObjs.Coordinates
4 z/ l6 r' y: E0 O" _- l8 o% o AppActivate Me.Caption( h: y1 b4 o6 |* ]/ W5 e
acadApp.WindowState = acMin
: p0 a$ T) |4 @5 p/ W5 @ If TypeOf pickedObjs Is AcadPolyline Or TypeOf pickedObjs Is Acad3DPolyline Then '普通多义线或3维多段线
* _* U+ J5 s) y' Y( o& r j = (UBound(pickedObjs.Coordinates) + 1) / 3 '多义线的顶点数5 h# l: ^! r9 N# O( b$ v Z! @
For i = 0 To j * 3 - 1 Step 3/ T- S/ ^7 f T- Z) G% z' {
If retCoord(0) = retCoord(j * 3 - 3) And retCoord(1) = retCoord(j * 3 - 2) Then '闭合时: i2 l$ ?! E. b% y% L& x
MSFlexGrid1.Rows = j
( w5 s$ |- G& c; W8 t Else '非闭合时/ j: K/ A N* a/ P" Z& W
MSFlexGrid1.Rows = j + 14 d! N; I8 H# y* O c
End If' @* b8 n F. c( \
MSFlexGrid1.TextMatrix(i / 3 + 1, 0) = i / 3 + 1 @2 g+ p1 a& S, K* K" _+ f" Z9 i2 N
MSFlexGrid1.TextMatrix(i / 3 + 1, 2) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000")
4 `3 R+ M; w* F8 } MSFlexGrid1.TextMatrix(i / 3 + 1, 1) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000"); C$ M9 m' x1 m% c) }* n
! G" m' ?1 J- w. X0 g
Next i
& K2 ]; W( M9 K8 c- y3 c: P ElseIf TypeOf pickedObjs Is AcadLWPolyline Then '轻便多义线
% M5 \. C2 o/ Q! V9 u/ R7 l j = (UBound(pickedObjs.Coordinates) + 1) / 2 '多义线的顶点数
6 B% m0 W3 h6 @' C9 c! D& x; A' b For i = 0 To j * 2 - 1 Step 2: _ }0 S5 z! \9 T7 J$ I
If retCoord(0) = retCoord(j * 2 - 2) And retCoord(1) = retCoord(j * 2 - 1) Then '闭合时1 x! b+ p2 ?) f
MSFlexGrid1.Rows = j
# f$ G! X* G( @* I# S. F Else '非闭合时
7 {) r8 m7 @( I MSFlexGrid1.Rows = j + 1& |* D2 ?- b9 F3 s& `- n
End If
y$ S2 {$ S- T( W3 y% Y2 N% u '******MSFlexGrid1中只能列出多段线的坐标******
6 \9 Q( p' _' M '不支持面域4 ~5 c/ |* L) \
MSFlexGrid1.TextMatrix(i / 2 + 1, 0) = i / 2 + 1" p& {1 x0 J |. Q- l5 [" I
'X坐标$ @2 f& F8 Z; H4 {
MSFlexGrid1.TextMatrix(i / 2 + 1, 1) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000") 'X! k& \$ ] R: j( W$ Z
'Y坐标5 Q" g$ W3 s8 G% n% r# N1 Q
MSFlexGrid1.TextMatrix(i / 2 + 1, 2) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000") 'Y# @ F" z; ?: N6 j
'面积
: K. J0 ~6 k- @8 x" s MSFlexGrid1.TextMatrix(i / 2 + 1, 3) = Format(pickedObjs.Area, "0.000") '面积7 ^" b: g4 E9 ^9 \5 n0 F( a# [
MSFlexGrid1.Refresh
' C# y6 \ {2 e$ s9 @; L) b4 D Next i
7 v: R G5 r2 F* T. U- V4 C Else
( Y9 E0 I; J5 J, Q MsgBox "您选择的不是多段线!", 64 + vbOKOnly, "地质测量"
) b d0 n: O$ S1 F& m7 k: v& }- { ssetObj.Delete
) v% B4 i5 x# e3 R* y- D End If
6 s. {6 Z- t6 l1 Y- V( N5 O Exit For
; |3 {! y' H$ G2 K. t5 G1 J Next# V( v" J& W5 p
'删除选择集
+ Q) m' o2 b) @ Q3 a$ j ssetObj.Delete# z- V0 P0 w! E
End Sub' g) T' ?3 P; l: k# y' ]
) e u: x) `6 {. p0 P, |( Q3 Y
'==========================================================
1 b. N- g6 O$ A, z& _" v# j; R+ U# y, G
[ 本帖最后由 dreamci 于 2009-5-21 21:58 编辑 ] |
|