QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
7天前
查看: 3303|回复: 4
收起左侧

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

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

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

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

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 编辑 ]

Drawing1.dwg

55.84 KB, 下载次数: 16

单元格图形说明

 楼主| 发表于 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 )

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