QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
9天前
查看: 3264|回复: 4
收起左侧

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

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

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

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

x
求:% j2 m8 g/ \8 \- E& A. v( y
  如附件图中所示:由line和arc绘制(非多段线)的多个随机单元格构成的复杂图形中,以已知顶点坐标为第一个点,用VB编程,按照逆时针方向顺序求出每个单元个各个顶点坐标,并求出每个单元个面积,结果写入EXCEL或VB的MSFlexGrid控件中,整个过程不要出现鼠标拾取单元格,要自用运行出结果。
1 P& s: i% s4 w* d7 z" C4 ?0 e; V, P5 v, k6 y7 G
我的思路是:VB编程,用For……next将每个单元格用类似“BO”命令自动创建边界,形成多段线单元格,然后用以下代码获取多段线单元的顶点坐标和面积,输入到EXCEL或VB的MSFlexGrid控件中。6 d) T8 c8 x$ T. D0 H, R
# q9 y7 }9 a# H5 W1 v6 ?, h
For  顶点号( J* M* |! K- M: f( J- \4 Q5 h
       1、创建多段线单元
& Z! e; ^0 a( n5 c$ k  \1 _4 ~       2、提取多段线顶点坐标和面积信息( ?) L9 J& d7 I1 j' J' w7 r0 @
       3、将数据填写进EXCEL或VB的MSFlexGrid控件中
% M3 ~3 P2 V1 Z. d5 H+ D+ n next 顶点号4 Q+ f5 c) t7 {( h5 V7 i7 e

+ C) j  z5 ]* P" e: ^2 o3 q* N" N* E5 i

3 K) x6 n  O$ i& f/ r8 S" a7 WFor循环中第三部分代码大致如下:
5 @; p* [: _3 f. h" P# I" l% k'MSFlexGrid1中能列出多段线的坐标(我从网上下载到的源代码)
4 o3 q) Z. N3 r2 y
1 D' ?4 K$ f% O  ?6 G# Z  a% \Private Sub cd多段线坐标查询_Click()! N8 h, U; T2 }, B! T5 N' K
'==========================================================
, e& u* C" b8 t* j  Dim acadApp As AcadApplication6 c: I9 Q/ q4 b7 v
  Dim ssetObj As AcadSelectionSet
/ F) Q2 N! ^) i( e2 j# C  On Error Resume Next
6 l* ~1 l% i% p  Set acadApp = GetObject(, "autoCAD.Application")) B$ C1 r. P$ C$ f9 Q
  acadApp.ActiveDocument.SelectionSets("hights").Delete
9 X! D. _& Q: r8 o  Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("hights")
5 E8 e/ l* @) r  AppActivate acadApp.Caption
/ n* d9 V, \; d/ v9 |  Dim FType(0) As Integer1 ~' [1 @! z4 g% K5 x9 T( i2 A
  Dim FData(0) As Variant
' a5 `0 L, M4 N  FType(0) = 05 c# X3 {9 R& L% ^. o6 P. Q# b/ t
  FData(0) = "line"
0 ]7 Q5 O, i6 q/ q8 m& J9 u& Q: L; E( e7 f# f( t; ^
  & s4 A7 I5 C4 k1 L
  Dim filterType As Variant
1 u+ O2 y# i9 @1 D, Q+ ~) Y6 p  Dim filterData As Variant  F% k9 d3 y/ d
' filterType = FType
/ j4 Y+ T* z4 g% o9 Q ' filterData = FData" d& w& ~8 R1 v; I
' ssetObj.Select acSelectionSetAll, , , filterType, filterData$ R, A. J, Q4 D! t
'                                                                                'AppActivate userform1.Caption; F' G* ~: e0 X2 W
'
" D  r0 I6 Y# G0 s ' Dim pickedObjs As AcadEntity% `" M: N8 P( Z1 G! i+ i& G
' For Each pickedObjs In ssetObj
, x6 T4 G! b3 g# L+ e '   pickedObjs.Highlight (True), r! l- N9 O8 W  \
' Next1 s1 _& c+ i6 x2 H
' ssetObj.Delete) H( z. E3 j, `* l; W, ^

0 `* w+ Q; V& l$ Z. U
) Z# `* u; {, Q  a6 \
% J/ `/ j3 v; }$ g' S3 H" X* m'==========================================================================================================
! A- a+ p3 e4 I, ?% H3 s; N3 W: {! R: p! t8 m
7 [) Y$ x8 M8 _
) E9 H. L! O; b- ~

+ W8 I7 K: n! t! P! N6 q    '安全创建选择集+ O) o; z6 |; z# `8 @
    'Dim ssetObj As AcadSelectionSet5 K+ ?* t1 e4 c0 C4 B+ Y  ~
    If Not IsNull(acadApp.ActiveDocument.SelectionSets.Item("Test")) Then8 Q- l5 ?! q: v1 ]3 _, `, c5 Y2 f/ x
        Set ssetObj = acadApp.ActiveDocument.SelectionSets.Item("Test")- U1 K* u6 N( x. b" m; x
        ssetObj.Delete1 s# k' z8 _& s/ u
    End If* X3 g$ W9 r$ z9 a
    * p" ~6 O1 p- z  s5 H
    9 H/ C2 l) j( |/ G! A; n; F
    '创建选择集
0 i# z+ z( U# A: ]7 h- b0 U) ?    Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("Test")9 c6 U: {& p( u; y; G0 _' m
   
& _1 c$ M' L% w" H4 f    '激活CAD窗口1 M& E2 g) C# C' b
    AppActivate acadApp.Caption
/ ~- ], o5 |6 O/ d' B7 N    acadApp.WindowState = acMax
5 E8 i& m4 G: R' k9 E    '提示用户从屏幕选择实体对象,并加入选择集) S7 T* ^; V. U1 Q6 j
    ssetObj.SelectOnScreen
+ ]8 u2 W! S5 D    ssetObj.Select acSelectionSetAll  '选择所有曲线1 x* P3 N1 Y5 B1 U' ^
   
% a; O2 t5 `+ I9 T: H/ V4 R, C  A4 P    '选择完毕后按回车键或单击右键
1 T5 ]+ S) R" z# i3 s  d- a- c    'Dim pickedObjs As AcadEntity+ W0 Y# y+ ?6 y+ q
    Dim retCoord As Variant6 C& R  [( G5 f+ p+ N" K
    For Each pickedObjs In ssetObj
! Z7 @. N% I$ l* N) y- j# ^6 w        retCoord = pickedObjs.Coordinates
( g9 M5 R) y5 x' Q! f3 c        AppActivate Me.Caption
  {# _4 j! D& U        acadApp.WindowState = acMin
3 q* y( v, Y1 O6 |4 F9 W: {        If TypeOf pickedObjs Is AcadPolyline Or TypeOf pickedObjs Is Acad3DPolyline Then   '普通多义线或3维多段线& U3 s  o0 G9 l
            j = (UBound(pickedObjs.Coordinates) + 1) / 3   '多义线的顶点数
$ r0 N. X- s: V, i3 V            For i = 0 To j * 3 - 1 Step 3& [# H+ n  n+ z) R6 }* ~. D1 S$ f
                    If retCoord(0) = retCoord(j * 3 - 3) And retCoord(1) = retCoord(j * 3 - 2) Then  '闭合时" B: u" H* _# ?+ C0 l9 H9 ]
                        MSFlexGrid1.Rows = j
  E! i5 n& U7 T' \7 ]                    Else   '非闭合时
9 q/ D; A) K) t9 p( `: V                        MSFlexGrid1.Rows = j + 1* I7 b0 O! b8 m9 A
                    End If
! D3 I" F* [8 F5 O                    MSFlexGrid1.TextMatrix(i / 3 + 1, 0) = i / 3 + 11 E7 i0 y0 d. L" D/ g$ r
                    MSFlexGrid1.TextMatrix(i / 3 + 1, 2) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000")
  ?0 p( S8 o& n' f2 a2 \                    MSFlexGrid1.TextMatrix(i / 3 + 1, 1) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000")
( U7 y% p* r% @: v
) _6 \6 D0 f( T) v/ g% B            Next i
3 p) U" v0 w- @% B" R# \9 [, \% j        ElseIf TypeOf pickedObjs Is AcadLWPolyline Then   '轻便多义线
+ N$ l! S4 ]& o# M/ D: H0 I            j = (UBound(pickedObjs.Coordinates) + 1) / 2   '多义线的顶点数, s( g: _& c7 O! K
            For i = 0 To j * 2 - 1 Step 2: g2 u' j1 d) @6 B: k$ L
                    If retCoord(0) = retCoord(j * 2 - 2) And retCoord(1) = retCoord(j * 2 - 1) Then '闭合时
$ I3 a8 z' d+ v/ b                        MSFlexGrid1.Rows = j/ o4 ~) d8 w; Q
                    Else   '非闭合时8 o4 e& N1 ]! N1 M$ A3 P% {
                        MSFlexGrid1.Rows = j + 1; A2 G$ @- w! L4 b2 M
                    End If
4 e' S' _' J: N5 b" Z" F9 D                    '******MSFlexGrid1中只能列出多段线的坐标******
$ I8 K+ d4 @% b0 W* a/ Q# ~# s                    '不支持面域
) |$ U2 }% S- b- W7 W! x& {) `                    MSFlexGrid1.TextMatrix(i / 2 + 1, 0) = i / 2 + 15 W8 y* k! C! b* S" u2 K/ E
                    'X坐标/ y& t2 G- W( {) k" D" I
                    MSFlexGrid1.TextMatrix(i / 2 + 1, 1) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000")         'X
6 Q' W1 o0 k3 k- i8 w) v                    'Y坐标
  }& s* i! ?( h$ W  Q, D3 j; l, u+ d                    MSFlexGrid1.TextMatrix(i / 2 + 1, 2) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000")     'Y
: J  r3 ^; A2 A7 B5 l                    '面积
  i7 s7 E: U# Y1 s1 ]                    MSFlexGrid1.TextMatrix(i / 2 + 1, 3) = Format(pickedObjs.Area, "0.000") '面积
7 O$ d3 @! B7 F$ S( G0 ^- u                    MSFlexGrid1.Refresh; `1 O% e' W9 X! |# c1 B2 d$ E& _
            Next i
5 j9 ?, Z) c: S6 a% o8 S4 X        Else* i# ~' M) j1 N4 N! T
             MsgBox "您选择的不是多段线!", 64 + vbOKOnly, "地质测量"8 D7 t5 |3 B: u) V6 E2 r
             ssetObj.Delete* ]$ L3 M. ?6 ?4 O0 g$ @
        End If& L" D1 Y4 [* B" O! E# L
        Exit For3 }# a; y1 }6 s8 W3 T
    Next
& J8 X7 k6 A# n; a    '删除选择集9 |4 V5 S, g% ~% e! e
    ssetObj.Delete
/ W1 w1 m; K* c! g0 p$ vEnd Sub
/ u5 f0 U2 F* x  U& M! \& J$ K5 h  y
/ {& b& m, C' W4 e'==========================================================
3 ]/ d! `6 S3 d2 c: G9 S8 F: E" w4 Q' E: L6 M
[ 本帖最后由 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 )

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