QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
求:6 m- Z' g& [: K
  如附件图中所示:由line和arc绘制(非多段线)的多个随机单元格构成的复杂图形中,以已知顶点坐标为第一个点,用VB编程,按照逆时针方向顺序求出每个单元个各个顶点坐标,并求出每个单元个面积,结果写入EXCEL或VB的MSFlexGrid控件中,整个过程不要出现鼠标拾取单元格,要自用运行出结果。
0 q3 }$ E- P, l" B6 ^  N6 v. u" p* c
我的思路是:VB编程,用For……next将每个单元格用类似“BO”命令自动创建边界,形成多段线单元格,然后用以下代码获取多段线单元的顶点坐标和面积,输入到EXCEL或VB的MSFlexGrid控件中。
4 }% a  W- r" y" @! K4 l# ~( L* p
. I0 v; ^/ P6 A- k- {! u* s3 r9 ZFor  顶点号
8 k3 [: _+ e* J$ {( |       1、创建多段线单元) Y: F" _# U' k5 M5 f- J
       2、提取多段线顶点坐标和面积信息+ M% M% L# {6 R- T
       3、将数据填写进EXCEL或VB的MSFlexGrid控件中
8 z0 U: L) R5 s0 X  N next 顶点号
) b$ M4 H7 g; H$ P2 o" t2 K# L$ J4 O* D9 }8 _" J, B
' d0 v! {9 `+ o
* r" _/ ]: o( [: y+ ~' u
For循环中第三部分代码大致如下:
4 J9 H* q' t3 C'MSFlexGrid1中能列出多段线的坐标(我从网上下载到的源代码)
) I& P6 G9 u' a7 V7 y' H) |4 g
8 H- H" V8 ~2 \- WPrivate Sub cd多段线坐标查询_Click()
# m' O8 d: {. T, G'==========================================================) }9 u+ g' ~3 i9 i
  Dim acadApp As AcadApplication
+ M% O+ r7 i5 {% ^6 ?2 b  Dim ssetObj As AcadSelectionSet# W0 s2 z- G. Q# D/ }! `
  On Error Resume Next) m' H4 W0 E2 ]% s! d
  Set acadApp = GetObject(, "autoCAD.Application")
7 D, i% k7 X0 Y+ g- u, i  acadApp.ActiveDocument.SelectionSets("hights").Delete
: k3 P9 I, Z2 F9 f  Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("hights")
6 a. C9 e3 _. t) E& h$ y  AppActivate acadApp.Caption
* W/ ^/ |  D/ ?$ O  Dim FType(0) As Integer
, a! W5 _6 w; u  l5 H8 f1 K! j+ a2 E  Dim FData(0) As Variant
2 o9 w% ]3 z1 \/ S  FType(0) = 0
4 Q' R+ B; K; J& I  FData(0) = "line"& P, p+ |* Q* U+ p
  Z$ r' X& e$ m
  8 q# ]1 d3 [" \8 k! r! \( O
  Dim filterType As Variant( f/ V" K2 D' s" ~$ X
  Dim filterData As Variant
1 d% Z' N5 c9 ? ' filterType = FType
1 X- C  e( O. l5 q! o* H" B( Z ' filterData = FData
: A  L  Z2 g+ Y$ p& { ' ssetObj.Select acSelectionSetAll, , , filterType, filterData
5 V- o0 F8 l' h2 ?/ e% W9 M( @/ E$ ? '                                                                                'AppActivate userform1.Caption3 U# I" @: [, J
'+ y5 i1 B  w8 ~
' Dim pickedObjs As AcadEntity
$ v* R2 z7 @; U3 p% F0 x$ [- N' d8 l ' For Each pickedObjs In ssetObj6 ^5 V$ X( z  h
'   pickedObjs.Highlight (True)) }  U5 H$ e7 N  P, T) B# z
' Next- X4 v' G7 ^' O' D
' ssetObj.Delete
" n- t! k0 t* t! E/ U
/ k0 F9 B, }" ~9 {, Z5 |, ~
0 s" S& V% l; T) `* I- J2 t) r6 v
+ X( M5 o8 N1 ~0 @# X'==========================================================================================================
2 w# v$ X4 X* r
9 [: X- B+ n/ F; ?0 M/ E- }! d1 i! u/ A( _5 f: A

* F! I3 G5 S0 z! M. r6 h: k% ^( N9 i; ?, Z+ y; d
    '安全创建选择集& T$ s( ~% r/ c. N5 O$ M& S: ^
    'Dim ssetObj As AcadSelectionSet4 G9 r& r8 c* h. X* I& B) P/ m
    If Not IsNull(acadApp.ActiveDocument.SelectionSets.Item("Test")) Then2 Y+ v9 Y4 c3 D  Y+ I
        Set ssetObj = acadApp.ActiveDocument.SelectionSets.Item("Test")
6 z4 z0 C. D4 t1 t        ssetObj.Delete
2 q/ ~) l$ a$ D/ M8 A  r  k& b0 u$ \    End If8 Y) {' }; x: G" `6 G3 g: I% N
   
5 v. \. O* E7 ?+ w    & |$ Z* m- ]" c1 C% _0 J) X( Y9 c7 T
    '创建选择集* T8 R+ N' _8 b' o- M* q1 g  s
    Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("Test")2 K  _6 n# W' O! M2 b3 D
    ' R0 M- z  `% P! h! H2 h* [2 ]( w: a
    '激活CAD窗口/ ]$ [" u( d8 g" R. p
    AppActivate acadApp.Caption
" j/ d- Z' L, L) d+ C6 E. y" l    acadApp.WindowState = acMax% T1 d4 O9 {9 ?$ G% ~) J  I2 _
    '提示用户从屏幕选择实体对象,并加入选择集
4 @1 q' i2 |! N    ssetObj.SelectOnScreen8 ]$ Y- K) H3 E5 \* v
    ssetObj.Select acSelectionSetAll  '选择所有曲线
' q7 O: y& s1 v/ o7 B. w* l   
" p( ?8 K' H5 \* i( K    '选择完毕后按回车键或单击右键
( z2 u0 A1 o) k: w* n: t/ J    'Dim pickedObjs As AcadEntity0 j6 `& U. d$ d( o5 h( }4 Q
    Dim retCoord As Variant
, s2 Q) F; a* J# Z; ^5 q& O2 v  V    For Each pickedObjs In ssetObj
) b8 g# R. z2 m: B        retCoord = pickedObjs.Coordinates) C# [- h4 q# n& F) E- K, P+ G$ P
        AppActivate Me.Caption" C* Q4 ]3 T; I4 d: T( {3 O' Z0 s% u( T
        acadApp.WindowState = acMin9 l2 B" }* p2 z6 C
        If TypeOf pickedObjs Is AcadPolyline Or TypeOf pickedObjs Is Acad3DPolyline Then   '普通多义线或3维多段线
- t) O1 z( F' c' u# b            j = (UBound(pickedObjs.Coordinates) + 1) / 3   '多义线的顶点数& L# R6 Z. c8 d- `' w( A% E
            For i = 0 To j * 3 - 1 Step 3
* S+ Z# V5 \; W1 Q# h                    If retCoord(0) = retCoord(j * 3 - 3) And retCoord(1) = retCoord(j * 3 - 2) Then  '闭合时
; s) _  q3 B* `% n                        MSFlexGrid1.Rows = j
1 O, e; N3 o  w1 C% E                    Else   '非闭合时2 T% [# v3 j/ d; S: h
                        MSFlexGrid1.Rows = j + 1% R  I& `- n$ A4 e: ?1 F
                    End If
1 {" Y3 d3 _; `% ]                    MSFlexGrid1.TextMatrix(i / 3 + 1, 0) = i / 3 + 1% d( H$ w$ J. n( v
                    MSFlexGrid1.TextMatrix(i / 3 + 1, 2) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000")0 B. X5 [# {3 E/ c
                    MSFlexGrid1.TextMatrix(i / 3 + 1, 1) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000")
8 z8 i, A8 @! E7 R& u; {# P  E9 u6 N( h7 T' y; g
            Next i
. Y) e1 F& |2 I. q" Y6 N, }; ^        ElseIf TypeOf pickedObjs Is AcadLWPolyline Then   '轻便多义线7 \. E+ h( M7 H- q& w  E
            j = (UBound(pickedObjs.Coordinates) + 1) / 2   '多义线的顶点数8 v6 o3 Z* F8 q
            For i = 0 To j * 2 - 1 Step 2
) m$ X2 N5 ~( G/ Z; G                    If retCoord(0) = retCoord(j * 2 - 2) And retCoord(1) = retCoord(j * 2 - 1) Then '闭合时
. D9 r3 C8 v+ U                        MSFlexGrid1.Rows = j
3 F' `9 g/ p- P5 c% l8 b, q# W                    Else   '非闭合时4 |8 @* E! n5 B# R4 a7 @7 _' {
                        MSFlexGrid1.Rows = j + 1
3 R  E4 s$ Q# K& X; \/ w                    End If9 j6 }! ]6 e+ u, i" X& O8 v' E+ _( B  z
                    '******MSFlexGrid1中只能列出多段线的坐标******
8 k) c# d1 q4 V+ R                    '不支持面域5 r: f. n8 `9 D& t4 ^( C
                    MSFlexGrid1.TextMatrix(i / 2 + 1, 0) = i / 2 + 12 L. \2 ~/ N4 g1 o; ^1 ^0 S
                    'X坐标. A$ r2 P: D# w0 |. X
                    MSFlexGrid1.TextMatrix(i / 2 + 1, 1) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000")         'X- m+ i/ H; j) [8 Q, J' q
                    'Y坐标
! l' y* H' p, T8 |                    MSFlexGrid1.TextMatrix(i / 2 + 1, 2) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000")     'Y
$ E; L7 \5 v: H% z7 `                    '面积+ V: L- j, P. m2 C+ A
                    MSFlexGrid1.TextMatrix(i / 2 + 1, 3) = Format(pickedObjs.Area, "0.000") '面积! z) O- p1 i7 }" L$ b
                    MSFlexGrid1.Refresh' D# D$ W; g' T; V* G7 A, m6 i! G
            Next i
: z- F; V7 _& S        Else
% u$ y  y# Z9 {/ w             MsgBox "您选择的不是多段线!", 64 + vbOKOnly, "地质测量"
% }8 M4 d1 x' c6 o4 N1 q             ssetObj.Delete
7 n( V1 T! ?2 ?8 n1 O        End If6 I9 S+ z& z+ X( f8 t
        Exit For$ t$ h% X5 A! G4 j. Q
    Next' _: d: |+ b% y, f- M
    '删除选择集
% A! U. y3 E* M* ~9 r2 e3 n6 o- h    ssetObj.Delete1 h; y$ G$ z4 u6 u4 g& V- l6 B
End Sub1 v2 R/ {1 O0 J- G7 ~  n

( t. ]" s3 U! o- e3 F'==========================================================
* b% A$ b( S% t3 V* I, B
) h3 H: P; _0 P  i[ 本帖最后由 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 )

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