QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
求:0 a! u; w2 A+ f( m! j' V2 f
  如附件图中所示:由line和arc绘制(非多段线)的多个随机单元格构成的复杂图形中,以已知顶点坐标为第一个点,用VB编程,按照逆时针方向顺序求出每个单元个各个顶点坐标,并求出每个单元个面积,结果写入EXCEL或VB的MSFlexGrid控件中,整个过程不要出现鼠标拾取单元格,要自用运行出结果。0 _7 h3 ?: U) d% V

6 w& v+ C  s7 P8 O* o/ Y9 y我的思路是:VB编程,用For……next将每个单元格用类似“BO”命令自动创建边界,形成多段线单元格,然后用以下代码获取多段线单元的顶点坐标和面积,输入到EXCEL或VB的MSFlexGrid控件中。; s. t: ?1 P3 \) j$ [

2 h2 L& O6 ~& Q* a0 ?5 dFor  顶点号
- m, ]6 a6 Z/ @  ?# G6 I% W       1、创建多段线单元
; F# ~3 N6 L- r8 F3 n' T       2、提取多段线顶点坐标和面积信息
/ I& S! L, L* `5 I: x6 b       3、将数据填写进EXCEL或VB的MSFlexGrid控件中: O% D' h7 s+ F9 l
next 顶点号# C2 S$ i0 f6 {6 F  H# o7 e, j

, |4 U0 }1 E5 P: a" x- L' z; L. E' t* m: j8 j1 P1 Z  x

" K2 H- x5 A. }% q; E. E6 e4 OFor循环中第三部分代码大致如下:
9 O' p" Y# C; f1 b'MSFlexGrid1中能列出多段线的坐标(我从网上下载到的源代码)* I; W: D. I, z1 p7 v/ l
7 I1 h1 r; ]8 J2 u
Private Sub cd多段线坐标查询_Click()
; V# W( }4 y4 n0 D: _'==========================================================
) b) y+ w2 ^/ G8 A  y5 k  Dim acadApp As AcadApplication
& W3 K: O: w( N. X; G7 T) m& o  Dim ssetObj As AcadSelectionSet
6 f* f- `# x' X( H7 S  On Error Resume Next* B1 X2 t7 P+ W' F6 N% ]
  Set acadApp = GetObject(, "autoCAD.Application")
' W3 t( Z: B3 n3 X- [/ Q  acadApp.ActiveDocument.SelectionSets("hights").Delete
, o% i6 p3 [$ P+ \$ c% e  Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("hights")2 [+ ^: f: X3 l# C+ }) s
  AppActivate acadApp.Caption9 h) U5 f+ ?$ k: I
  Dim FType(0) As Integer
8 h. o& }( W7 ?  x+ d2 L/ D  Dim FData(0) As Variant
: ~" F7 L0 ~" F9 Z; i  FType(0) = 0
+ v% g1 Y3 z2 e  FData(0) = "line"
6 [6 [/ h6 V* I1 |1 [9 Z! b6 E8 D/ m1 N3 L0 W3 k
  
- ^; @3 s, A: Q, f* E5 F8 [  Dim filterType As Variant$ X* j6 G6 H' H2 }* _0 n
  Dim filterData As Variant
" C( E8 J; o# `8 H  G, ? ' filterType = FType
8 A& {% C) u: T! I! y ' filterData = FData0 I  N1 U& j6 m
' ssetObj.Select acSelectionSetAll, , , filterType, filterData
3 I3 j( b! h) T+ ~1 j5 H '                                                                                'AppActivate userform1.Caption5 U- m7 e6 N6 E' |7 b. ]; r
'
2 `$ y8 z' J6 t' l$ t# U$ B1 W; ~ ' Dim pickedObjs As AcadEntity
; ~; W; C# q& H7 v, P9 ]/ h  I ' For Each pickedObjs In ssetObj. B0 u6 y2 w) e
'   pickedObjs.Highlight (True)
9 I/ r8 s3 {1 b6 A/ v ' Next
3 m8 E( @+ B8 N% c ' ssetObj.Delete
3 L* i5 e2 k: w. S. q: y7 a, ^' m. Z3 x+ h; k. l) p

6 u( K" ]! G7 h9 C/ j# v9 l# w. h4 N1 n: n, Q" t; ~
'==========================================================================================================' ]3 `9 w1 c: E- g0 X

5 I9 Z9 B% _% ]9 X9 B) S9 }
: X* L# o3 M3 c' `: }9 L9 J( W/ q/ L; J* Y  x) S
" e" @5 k9 Z  V, V
    '安全创建选择集4 U4 b' ]9 h8 }- f3 S# a
    'Dim ssetObj As AcadSelectionSet/ \7 t6 L/ E2 w) {5 L
    If Not IsNull(acadApp.ActiveDocument.SelectionSets.Item("Test")) Then
$ E, Z* d$ x, O% R4 P. J+ W; v) v        Set ssetObj = acadApp.ActiveDocument.SelectionSets.Item("Test")
2 M& w7 {) U- W! `! L( \- m( z! f        ssetObj.Delete& P+ e, _1 X3 I. ~* e& t- B" q
    End If$ h9 g1 t/ f: p8 Q
    / a3 B( a0 X! N
    % T  \5 P2 A3 J; c
    '创建选择集
7 z1 q8 H  m4 b- {7 u    Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("Test")( U/ C( N2 ]: ^' f) m/ [% r
    # m$ v8 l$ r9 a9 i
    '激活CAD窗口
! `5 Z3 G. L+ i) |2 ~7 z    AppActivate acadApp.Caption
- o5 m6 ]9 t) \8 E/ k1 y    acadApp.WindowState = acMax; K" p# F' ?5 T0 G, y- k" h* _
    '提示用户从屏幕选择实体对象,并加入选择集1 y7 s# o" v! P! i
    ssetObj.SelectOnScreen
- _2 \! E- y3 W8 n$ l! }/ I    ssetObj.Select acSelectionSetAll  '选择所有曲线7 N; D6 I2 D7 l  n+ a
   
0 A& ~: G, P9 |    '选择完毕后按回车键或单击右键1 a8 o, [8 c  G4 C& T5 |' x6 V
    'Dim pickedObjs As AcadEntity
( l. O6 c( ]; F. v    Dim retCoord As Variant
# x& g* Y( r, O$ }6 o( m    For Each pickedObjs In ssetObj
( m5 m, v4 R5 R        retCoord = pickedObjs.Coordinates
9 |( T4 {, r1 @        AppActivate Me.Caption1 V5 _& N) }  ~$ Q2 J5 w- q
        acadApp.WindowState = acMin
* U* C6 z% s9 D# o( I. o0 K  Y        If TypeOf pickedObjs Is AcadPolyline Or TypeOf pickedObjs Is Acad3DPolyline Then   '普通多义线或3维多段线
# k3 M2 Z  p1 z4 _0 [            j = (UBound(pickedObjs.Coordinates) + 1) / 3   '多义线的顶点数. G& Z& k; a& r& a' s) I
            For i = 0 To j * 3 - 1 Step 3
& a* C+ H7 G2 P4 B3 V2 Y! R9 Z6 J- A* F                    If retCoord(0) = retCoord(j * 3 - 3) And retCoord(1) = retCoord(j * 3 - 2) Then  '闭合时
8 t) [) h% E* q! d2 }! y                        MSFlexGrid1.Rows = j
' h! Z5 B8 \. j3 c- ^                    Else   '非闭合时
+ G/ |1 z5 P* w7 E) f; J                        MSFlexGrid1.Rows = j + 1! V( g4 ^; R" Q9 |( y/ c  U2 ?/ A
                    End If
9 |$ Y- t7 P8 N/ C2 p3 |                    MSFlexGrid1.TextMatrix(i / 3 + 1, 0) = i / 3 + 1
. d6 ]8 }6 T3 G; \% ~- v                    MSFlexGrid1.TextMatrix(i / 3 + 1, 2) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000")
/ o  t# g/ z, }  P: x) T$ [                    MSFlexGrid1.TextMatrix(i / 3 + 1, 1) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000")
- w6 j( u" H' j9 k; u* A
; ?  n5 E$ x7 t, s( ~$ H6 U            Next i
2 n1 ?* ~$ _% J( n8 y3 n, @1 w+ a        ElseIf TypeOf pickedObjs Is AcadLWPolyline Then   '轻便多义线
* B/ R( b( p; T4 T% H            j = (UBound(pickedObjs.Coordinates) + 1) / 2   '多义线的顶点数% a7 D" C; x2 o* L5 @) ~
            For i = 0 To j * 2 - 1 Step 2; O. Y0 O' N9 X% d& a, ~
                    If retCoord(0) = retCoord(j * 2 - 2) And retCoord(1) = retCoord(j * 2 - 1) Then '闭合时
% i1 |1 H6 y! F1 {; H# K                        MSFlexGrid1.Rows = j( N' e1 e' h4 N( w. H; o
                    Else   '非闭合时  t3 \7 p) V  [1 }  C' e4 {
                        MSFlexGrid1.Rows = j + 1: ?3 q# m7 O3 P1 h2 B3 L
                    End If8 o; O  J. ^- N+ s% u( W
                    '******MSFlexGrid1中只能列出多段线的坐标******
# j. Z5 F4 `+ k  f5 U9 m4 s. R                    '不支持面域
: M7 e7 X3 c* Y2 h( {( Q) a: E                    MSFlexGrid1.TextMatrix(i / 2 + 1, 0) = i / 2 + 1
! y/ v; V, c: x; b$ @                    'X坐标+ x2 a- D' ^6 r1 z1 O0 s
                    MSFlexGrid1.TextMatrix(i / 2 + 1, 1) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000")         'X
7 b, b% G. u) D# d3 Q! }( y* X                    'Y坐标% |2 z8 ~" a7 ]
                    MSFlexGrid1.TextMatrix(i / 2 + 1, 2) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000")     'Y
8 ]3 k* M- s3 U& d7 a0 a/ b                    '面积
6 h7 m1 _# ^& |+ x5 `                    MSFlexGrid1.TextMatrix(i / 2 + 1, 3) = Format(pickedObjs.Area, "0.000") '面积9 U% a7 Z% Y1 c7 o
                    MSFlexGrid1.Refresh6 c9 s% `9 b- w( s; _
            Next i
6 Z2 j! w5 ?2 c( }% U8 c        Else
- G$ I. o+ [/ L) X1 J             MsgBox "您选择的不是多段线!", 64 + vbOKOnly, "地质测量"+ h( q8 \- O+ R( y
             ssetObj.Delete7 i- n) W# ?' ~" |5 c
        End If. e/ P0 D0 L4 R
        Exit For
; {$ [% F- d- i) a/ D    Next
7 y# v: {4 v: z# u5 o/ \0 b    '删除选择集& T* w5 [; a* D6 v1 c
    ssetObj.Delete
' e. Z9 f- L% N' H: NEnd Sub. Z6 A6 W2 [5 s! E6 L  p7 r- i1 A

7 ^' C* d- R! q- v" ['==========================================================
  o4 V: V$ T# R5 Z2 e3 s  a2 a" H; P+ i1 C" T+ a
[ 本帖最后由 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 )

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