QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 3347|回复: 4
收起左侧

[讨论] 一道VB+CAD的图形难题

[复制链接]
发表于 2009-5-21 21:42:13 | 显示全部楼层 |阅读模式 来自: 中国河南郑州

马上注册,结识高手,享用更多资源,轻松玩转三维网社区。

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

x
求:  N3 n9 z  Q# Q. u; S# K' D$ Q$ t' v
  如附件图中所示:由line和arc绘制(非多段线)的多个随机单元格构成的复杂图形中,以已知顶点坐标为第一个点,用VB编程,按照逆时针方向顺序求出每个单元个各个顶点坐标,并求出每个单元个面积,结果写入EXCEL或VB的MSFlexGrid控件中,整个过程不要出现鼠标拾取单元格,要自用运行出结果。
& U7 x4 M: [. O+ k- Q; x: ~) N/ t4 _$ l8 H0 j2 h$ G& N
我的思路是:VB编程,用For……next将每个单元格用类似“BO”命令自动创建边界,形成多段线单元格,然后用以下代码获取多段线单元的顶点坐标和面积,输入到EXCEL或VB的MSFlexGrid控件中。# G$ F9 \% s) T: D9 j) o
- p4 ]5 E% `& P: |; G6 u9 u' H
For  顶点号  L) \* n: O) T7 g! q
       1、创建多段线单元2 \1 b  p+ s  @
       2、提取多段线顶点坐标和面积信息
8 S0 K& [: ~: ^4 H0 ^: X5 g2 R       3、将数据填写进EXCEL或VB的MSFlexGrid控件中& o* z5 e4 G) I
next 顶点号. d6 r1 A0 ]$ Y4 C2 J

3 Z5 Y  a! E7 K/ _& X8 [6 H( [  ]4 s. J2 K" {& x1 B) v

5 Q4 j5 w9 U5 @+ A. A% g/ p2 n8 t; l0 gFor循环中第三部分代码大致如下:
! m% i; e8 x0 r; \* r'MSFlexGrid1中能列出多段线的坐标(我从网上下载到的源代码)+ ?! h6 D  ?+ Y% r) w

0 O) r% n4 b9 q: l+ DPrivate Sub cd多段线坐标查询_Click()$ T4 M! ^" Q8 K6 E2 C; h
'==========================================================
; c& ~, ]1 C0 A: s  x  Dim acadApp As AcadApplication4 C7 Y; G0 G3 b  e
  Dim ssetObj As AcadSelectionSet6 Z: I6 ?  G8 A0 Z. }
  On Error Resume Next
& ?- ^- @) E3 h  Set acadApp = GetObject(, "autoCAD.Application")0 E% q) f; R) F0 s0 G: @) d: K+ _( b
  acadApp.ActiveDocument.SelectionSets("hights").Delete3 v4 L* X4 |4 G
  Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("hights")
, R0 q8 a- H* ^0 G1 m) \  AppActivate acadApp.Caption" U+ `% s- T4 T6 ^/ B
  Dim FType(0) As Integer
+ L! w* q( m9 r+ {" H  Dim FData(0) As Variant
- F. g! h2 B' t2 J# g% y, g  FType(0) = 0
0 _! v7 T" S4 ]0 Y3 u( G# H& G0 [! R& r  FData(0) = "line"
8 F) g. W6 H# Q& ^6 a- q
/ M% U8 l: e/ g  }; G  
) |( h1 _& I6 }  Dim filterType As Variant
1 [9 x+ N4 N6 K( c7 v0 K* L  Dim filterData As Variant2 \" b, Z1 m1 |' ?
' filterType = FType
. B, _5 ]2 w) z ' filterData = FData
& d! D1 \9 d0 f! q. d ' ssetObj.Select acSelectionSetAll, , , filterType, filterData9 _4 g  [& r6 ~1 N. }
'                                                                                'AppActivate userform1.Caption/ }, \  t3 ]; I7 [. V2 j7 M: j
'
/ W$ ]# t0 C- l7 c3 O$ X ' Dim pickedObjs As AcadEntity
# Q8 \8 \% H  ^4 _# ~+ r ' For Each pickedObjs In ssetObj/ {1 R0 h$ Q- w+ R
'   pickedObjs.Highlight (True)
$ O$ N9 ?* E! V; X3 j' ~ ' Next
) l8 A+ V/ Q1 E1 L* ?7 ^ ' ssetObj.Delete
5 Q9 q+ T# o: s8 {' Q$ l  Q$ s/ x
$ J  ^, f6 A6 T  c& ]; s" X2 O4 L3 H9 V4 j/ T! Z* c# c' W

9 M) m0 E5 f% v! J'==========================================================================================================2 C  P0 {5 C" [! T8 q- V
# s, s1 \! H3 U7 d
5 E2 r, _: p7 V# \  ]3 Y9 e6 N

; c  G3 O& [; |  _1 p; J& E# M! a, C4 F( ]; v& O4 r
    '安全创建选择集3 }  a: E: D9 ^
    'Dim ssetObj As AcadSelectionSet
8 Y' N( e3 s' ^. u, k# A8 u* v( }    If Not IsNull(acadApp.ActiveDocument.SelectionSets.Item("Test")) Then
% i5 A+ O) M" o* d        Set ssetObj = acadApp.ActiveDocument.SelectionSets.Item("Test")
" Y& Z, }2 _" |/ h* r: u' e        ssetObj.Delete
$ z+ S9 p& v9 n7 E% h; `    End If. d4 m' W  K1 }. K9 G5 I1 ~4 H6 \
   
3 `) G7 l  b9 x7 _- n6 S    ) a( I( q9 J4 r# d+ e* R% P
    '创建选择集. Z4 E9 c% |& l  C* e  f0 B
    Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("Test")8 w1 t. m; N/ L3 q( t  P
   
" A" \9 n9 i* `; I9 r    '激活CAD窗口
) G' e4 N$ x3 C! \6 F    AppActivate acadApp.Caption
7 W. Q- [3 b6 Q( U6 }, r    acadApp.WindowState = acMax
* N3 q* Z- y$ {: O; Z" k    '提示用户从屏幕选择实体对象,并加入选择集+ M  `: `" Z" z; m5 f7 P% _
    ssetObj.SelectOnScreen
5 M, _- a; F- g: m9 l, o* W4 Z+ `    ssetObj.Select acSelectionSetAll  '选择所有曲线/ G- `' w5 I; V0 }
   
( V% `5 i% J. B1 e. z* v( @8 p7 y! Y; e1 g$ y    '选择完毕后按回车键或单击右键3 v4 _4 v  l0 q
    'Dim pickedObjs As AcadEntity1 U: l7 v: O3 y: ]& g" N8 b3 d
    Dim retCoord As Variant6 ?4 N. l+ [$ Y: N) l
    For Each pickedObjs In ssetObj
( D- F* w$ q% L5 ?- D, N& V1 E( b        retCoord = pickedObjs.Coordinates
* w, K; s& h) `' G- `; i        AppActivate Me.Caption
' B. |8 z+ M8 `        acadApp.WindowState = acMin
6 S* f* }3 o* k$ {        If TypeOf pickedObjs Is AcadPolyline Or TypeOf pickedObjs Is Acad3DPolyline Then   '普通多义线或3维多段线& Z- d2 j* G3 n& |
            j = (UBound(pickedObjs.Coordinates) + 1) / 3   '多义线的顶点数$ r  v4 F/ z9 ~$ ]
            For i = 0 To j * 3 - 1 Step 3
2 U6 m9 Z+ K% H; n$ B, A: L                    If retCoord(0) = retCoord(j * 3 - 3) And retCoord(1) = retCoord(j * 3 - 2) Then  '闭合时
6 E& i' V5 @' O8 X4 {                        MSFlexGrid1.Rows = j
/ @  ]3 K8 j$ z                    Else   '非闭合时
+ `2 a6 ?6 a. Z. h: E- B                        MSFlexGrid1.Rows = j + 1" Z, Y; X: S! }6 R: g
                    End If
/ s$ ~4 I) H" m                    MSFlexGrid1.TextMatrix(i / 3 + 1, 0) = i / 3 + 1- U1 ?& U. d# h. O9 n- B+ Y
                    MSFlexGrid1.TextMatrix(i / 3 + 1, 2) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000")8 q5 r) Q' F( G2 X
                    MSFlexGrid1.TextMatrix(i / 3 + 1, 1) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000")
4 i  O5 _- ?( X" X' p0 h+ j8 J( [/ m1 @7 O- P- D5 F
            Next i  q* t/ c% g; d
        ElseIf TypeOf pickedObjs Is AcadLWPolyline Then   '轻便多义线  b( c7 N2 n- D! T
            j = (UBound(pickedObjs.Coordinates) + 1) / 2   '多义线的顶点数
4 r, Q- {& o+ n8 p+ V( {3 H. s            For i = 0 To j * 2 - 1 Step 2
# `) g/ m9 K% ]" s; K                    If retCoord(0) = retCoord(j * 2 - 2) And retCoord(1) = retCoord(j * 2 - 1) Then '闭合时
3 b$ _6 j6 Z9 L; f$ z& C( @                        MSFlexGrid1.Rows = j
3 d0 R1 h) {5 o( O5 l/ y( _8 p                    Else   '非闭合时% K5 Z8 e; ^" b7 ~0 ~& g: o
                        MSFlexGrid1.Rows = j + 1% h' M+ ]; e& Z0 k# u/ x
                    End If$ K, [! d' M5 I
                    '******MSFlexGrid1中只能列出多段线的坐标******( {+ B* c, F1 K* @8 n
                    '不支持面域( M* `) Z8 M2 L8 e' N7 A7 H
                    MSFlexGrid1.TextMatrix(i / 2 + 1, 0) = i / 2 + 1# ~$ P7 d) D' Y. \9 |5 U) P7 x
                    'X坐标
# ]2 r; I" Z4 a                    MSFlexGrid1.TextMatrix(i / 2 + 1, 1) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000")         'X* Z) x0 U$ P5 T- M2 w9 ?
                    'Y坐标
* S/ }# u0 F+ Z5 Q5 L6 i+ z                    MSFlexGrid1.TextMatrix(i / 2 + 1, 2) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000")     'Y
& o+ ?9 m& W% X                    '面积; ]1 i7 _1 p1 }/ i! a: }
                    MSFlexGrid1.TextMatrix(i / 2 + 1, 3) = Format(pickedObjs.Area, "0.000") '面积! e6 b/ m5 `# L" m' y
                    MSFlexGrid1.Refresh8 |4 g- v$ x0 d* q
            Next i
. ]' e% w( d7 S% f' u        Else
& S, w6 i4 x) O' x. ], r             MsgBox "您选择的不是多段线!", 64 + vbOKOnly, "地质测量"; v& e+ F- U" e& Z; t' D3 Y
             ssetObj.Delete
, U+ d8 @" ?, }) ]        End If/ L- Q3 B; A/ `4 d4 S- ?  s7 B
        Exit For+ K6 J( T* f, ~; x
    Next
7 U4 t; @0 x& K' o: d: |# d- {7 v    '删除选择集# ], C; ?0 j* Y7 T% N& y# a
    ssetObj.Delete
! i1 v6 Z2 u8 m$ w6 l1 r" ]End Sub& ^4 M# k9 D/ C1 g
* J" A0 Z9 D) ]; Q( t2 }' h/ \
'==========================================================# q. E8 W  h6 J3 \  ?1 B6 C
  v. m: V' r" [2 W3 p  @  g
[ 本帖最后由 dreamci 于 2009-5-21 21:58 编辑 ]

Drawing1.dwg

55.84 KB, 下载次数: 17

单元格图形说明

 楼主| 发表于 2009-5-25 19:25:27 | 显示全部楼层 来自: 中国河南郑州
没有人能解吗?
发表于 2009-6-7 19:27:14 | 显示全部楼层 来自: 中国北京
注释,需要
发表于 2009-6-10 17:47:18 | 显示全部楼层 来自: 中国辽宁沈阳
一点都没明白
发表于 2009-7-8 10:34:41 | 显示全部楼层 来自: 中国北京
不是说不要那个选择吗?怎么程序里还是有选择的代码?另外我觉得有图例说明才行,不然不知道是什么情况
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


Licensed Copyright © 2016-2020 http://www.3dportal.cn/ All Rights Reserved 京 ICP备13008828号

小黑屋|手机版|Archiver|三维网 ( 京ICP备2023026364号-1 )

快速回复 返回顶部 返回列表