QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
求:7 t- ]! X& ~6 d
  如附件图中所示:由line和arc绘制(非多段线)的多个随机单元格构成的复杂图形中,以已知顶点坐标为第一个点,用VB编程,按照逆时针方向顺序求出每个单元个各个顶点坐标,并求出每个单元个面积,结果写入EXCEL或VB的MSFlexGrid控件中,整个过程不要出现鼠标拾取单元格,要自用运行出结果。$ O) m  W0 R4 h0 N' j* M8 t

6 }8 O. ~' g! F; W  N" T4 D我的思路是:VB编程,用For……next将每个单元格用类似“BO”命令自动创建边界,形成多段线单元格,然后用以下代码获取多段线单元的顶点坐标和面积,输入到EXCEL或VB的MSFlexGrid控件中。8 q8 x+ a2 _' g2 ]
$ s! x( b1 k! ~% M/ O' B/ {
For  顶点号* z/ ~: K- N4 _6 a* r7 t
       1、创建多段线单元
6 A  h+ G3 }. q1 C       2、提取多段线顶点坐标和面积信息
+ M$ J' a( b) K2 w* h1 B$ f3 V       3、将数据填写进EXCEL或VB的MSFlexGrid控件中
$ l/ d, Q9 o% E next 顶点号
6 n6 r. n, t- m, A
+ D! Z8 S- C5 E1 r/ U& S. Q$ K4 @. i/ T$ j2 q& J

0 w: k5 o( l- kFor循环中第三部分代码大致如下:* |1 @  v& b8 ?) y
'MSFlexGrid1中能列出多段线的坐标(我从网上下载到的源代码)
8 s# n' S5 j# ]; _! s3 i, d4 G# `, ~+ @8 D2 S% Y7 U. P+ X8 o
Private Sub cd多段线坐标查询_Click()
* a6 C/ h3 e( d'==========================================================% X' m9 l" J7 r1 a  ^+ u! O& u% Z
  Dim acadApp As AcadApplication, Z, S, M0 f, {" b5 U7 R# q+ T
  Dim ssetObj As AcadSelectionSet
# z: n, O  ~8 }( [$ j# r& V3 q  On Error Resume Next1 w8 u2 F( |% h9 T  K8 _
  Set acadApp = GetObject(, "autoCAD.Application")
$ W! l# g, l$ A7 T( n  acadApp.ActiveDocument.SelectionSets("hights").Delete) Z7 n- b3 C2 ^: m3 A) D
  Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("hights"): m9 ]" [6 r2 f9 D
  AppActivate acadApp.Caption' p( l& c  \/ i' F, \
  Dim FType(0) As Integer
5 ^& Z" ?- ?6 s7 e, L5 W6 F  Dim FData(0) As Variant. r) J3 F. y, y+ Y
  FType(0) = 0- M& o) b& T  K' ]
  FData(0) = "line"/ ^! I( ~, C# D. i) l
1 z% c1 L8 v) t7 i. p4 N; m
  
2 s4 {* o6 S& C7 e" [/ w  Dim filterType As Variant% w4 P# U) G% Y% C
  Dim filterData As Variant' i3 p, a3 x. g) U- N' R
' filterType = FType" B% M$ F7 C: B5 a
' filterData = FData
; O, K6 Y% b) I) a/ U! i ' ssetObj.Select acSelectionSetAll, , , filterType, filterData
: G: `1 E. p/ Z+ P# n '                                                                                'AppActivate userform1.Caption
9 L; b$ t; N* E& U  Y& c '
* m" n8 N/ P0 n' j) s ' Dim pickedObjs As AcadEntity0 h+ [& L1 a& g+ g( h, V* m: m
' For Each pickedObjs In ssetObj3 z" v; D. o, X! }5 Y( ?' K  l
'   pickedObjs.Highlight (True)6 I7 u! M0 e) c: ~4 T8 Q
' Next
6 V; {2 j; j4 ~5 i( z ' ssetObj.Delete
+ n; G' Z# d6 P* @# G; S5 N
7 Z0 S! N/ E$ M' x' T* ^5 h8 X9 K$ C% ~7 ~6 S/ i8 V

4 u" }4 M$ V9 P- r: M5 ]'==========================================================================================================/ o, _6 ]/ K" O% C4 L$ E! D
& j2 |) `& q" W/ V# g
" Z# A8 W) {) d3 q$ c! r$ C2 v

# f% r: Y7 D' f  b  n& h
* _$ e- a5 T; f    '安全创建选择集/ u: o* Z$ Y- ^) z% }
    'Dim ssetObj As AcadSelectionSet
+ Q- w; C4 s* l  R! P    If Not IsNull(acadApp.ActiveDocument.SelectionSets.Item("Test")) Then
( J# P& ?! ~: G* \  e. L$ q. l        Set ssetObj = acadApp.ActiveDocument.SelectionSets.Item("Test")$ b4 Y7 W# o2 t. c9 ~
        ssetObj.Delete
( U3 p+ F( T+ i' q8 W! r( b    End If5 |( k8 v4 M* g' D! a
   
& c4 D+ Z, n/ Z9 a   
' `" c& B7 p4 `9 X: ~1 d    '创建选择集" s+ c5 G7 e8 _$ V
    Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("Test")
7 P- j: G. j8 _2 L, W+ b   
5 N& |/ P3 y% X2 z& M  H    '激活CAD窗口/ N" Y$ X# I; U: L2 C4 x
    AppActivate acadApp.Caption
3 k+ S9 E. ^+ Q" f, Z1 U+ v    acadApp.WindowState = acMax" D2 B4 {/ F, z
    '提示用户从屏幕选择实体对象,并加入选择集+ o% e9 ^3 l' M  g, `
    ssetObj.SelectOnScreen
8 s+ U& f% r2 Y) k4 @; @6 \& }6 }    ssetObj.Select acSelectionSetAll  '选择所有曲线
" z( w2 V. m9 u8 g* V# u$ E8 F    4 p- S# u5 l0 L2 p
    '选择完毕后按回车键或单击右键
9 D2 b$ P5 A2 B# o6 e    'Dim pickedObjs As AcadEntity
& |0 v' D( E& Y* H# U# t0 Z3 E    Dim retCoord As Variant" f1 o# X. v3 d
    For Each pickedObjs In ssetObj0 b& n  C3 t+ Y. ~2 \4 Q
        retCoord = pickedObjs.Coordinates9 z5 X% l. P, @8 m' q
        AppActivate Me.Caption
! x% B9 i# W' r+ U$ W        acadApp.WindowState = acMin
2 E4 L+ G1 P( D% f5 p- y0 S5 J        If TypeOf pickedObjs Is AcadPolyline Or TypeOf pickedObjs Is Acad3DPolyline Then   '普通多义线或3维多段线
3 A8 f1 P) F4 n6 [0 V            j = (UBound(pickedObjs.Coordinates) + 1) / 3   '多义线的顶点数
# b  \+ a, ^* s6 e  g% k+ m            For i = 0 To j * 3 - 1 Step 3! Q& p; j# A1 B7 P* R) f! W6 ?$ ~
                    If retCoord(0) = retCoord(j * 3 - 3) And retCoord(1) = retCoord(j * 3 - 2) Then  '闭合时& m$ I! J2 }2 @3 N- [% c7 s
                        MSFlexGrid1.Rows = j
) U8 j. N! u* N# |" B                    Else   '非闭合时. I2 v* o4 p1 V2 w, `! {& T4 ~
                        MSFlexGrid1.Rows = j + 1
& l9 j7 J  v) k, x- c                    End If
' t0 h  o& ]6 w9 Y7 s                    MSFlexGrid1.TextMatrix(i / 3 + 1, 0) = i / 3 + 1
: @* W  L/ g: }/ u" \: R+ I& \                    MSFlexGrid1.TextMatrix(i / 3 + 1, 2) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000")7 C2 j3 i+ m8 p5 h
                    MSFlexGrid1.TextMatrix(i / 3 + 1, 1) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000")
9 I; l( u' d: ^$ Q
/ U# C! \0 d5 ^            Next i
9 Y( [6 h8 X; A- J' n' c# q        ElseIf TypeOf pickedObjs Is AcadLWPolyline Then   '轻便多义线
5 |$ _7 \, G( \  K4 v, Z            j = (UBound(pickedObjs.Coordinates) + 1) / 2   '多义线的顶点数
4 R& ]/ s2 n, J+ {- b5 P% Y7 `            For i = 0 To j * 2 - 1 Step 2$ _/ ?1 ^. r1 a
                    If retCoord(0) = retCoord(j * 2 - 2) And retCoord(1) = retCoord(j * 2 - 1) Then '闭合时
$ ^& h& G' l: a3 q2 G3 W( i$ f( Q                        MSFlexGrid1.Rows = j. v( T5 {3 B5 g3 ?8 [% ^% [% D
                    Else   '非闭合时2 p. L1 H' D% B
                        MSFlexGrid1.Rows = j + 15 D. J3 O9 G  R4 m4 `
                    End If
: ~- B/ y1 _/ X4 j4 C; |+ ^, }                    '******MSFlexGrid1中只能列出多段线的坐标******0 x* d- F6 }% X7 I, |/ ?4 f
                    '不支持面域
& O5 ^* i: O. q5 ~2 i7 ]                    MSFlexGrid1.TextMatrix(i / 2 + 1, 0) = i / 2 + 1
, A/ V0 n' R' u1 }2 K                    'X坐标8 D* ?) p7 s' E. c/ X
                    MSFlexGrid1.TextMatrix(i / 2 + 1, 1) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000")         'X( g/ L0 I; v7 v' N
                    'Y坐标
! v) d" b, O, l5 J; c* s  `/ p                    MSFlexGrid1.TextMatrix(i / 2 + 1, 2) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000")     'Y
# ]# l; \& }+ r" P: c, Q                    '面积4 L. p$ ?. c5 M# x
                    MSFlexGrid1.TextMatrix(i / 2 + 1, 3) = Format(pickedObjs.Area, "0.000") '面积
1 b5 f2 L- F7 K/ r                    MSFlexGrid1.Refresh- K. o& i& j$ y
            Next i
0 r  N8 i% z3 p, P) H1 R/ ?        Else. X# _2 h3 I0 z1 v9 H
             MsgBox "您选择的不是多段线!", 64 + vbOKOnly, "地质测量"
; P! w" F/ D2 c, {2 U             ssetObj.Delete
5 j' H7 [9 p- H/ [/ ^        End If/ M* L, \: Z4 d& a, P' Y* B  ^
        Exit For' Y6 L& O& q( o$ t% v7 X
    Next8 M( x9 p: m) s/ M
    '删除选择集# p  S; Z& A! Z9 P9 @
    ssetObj.Delete
# ^- L: l% X4 B4 zEnd Sub8 X4 @2 [$ j0 k4 @$ l' K/ c; \! Z0 C

; W- a2 \' P# r3 }- `'==========================================================; c* U0 Z: v  L/ f7 L+ {

9 c) T$ ~, J4 T5 b4 S[ 本帖最后由 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 )

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