QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
求:
7 q9 U6 |+ W+ x0 y. {  如附件图中所示:由line和arc绘制(非多段线)的多个随机单元格构成的复杂图形中,以已知顶点坐标为第一个点,用VB编程,按照逆时针方向顺序求出每个单元个各个顶点坐标,并求出每个单元个面积,结果写入EXCEL或VB的MSFlexGrid控件中,整个过程不要出现鼠标拾取单元格,要自用运行出结果。4 h) V& K' n" \; E6 U

4 i. {; O0 z7 o: j0 B9 G我的思路是:VB编程,用For……next将每个单元格用类似“BO”命令自动创建边界,形成多段线单元格,然后用以下代码获取多段线单元的顶点坐标和面积,输入到EXCEL或VB的MSFlexGrid控件中。
) j& F& w( s4 U, \! J! S4 }% ?3 t' R$ B. D$ w
For  顶点号- G* X! [! j% h0 Y
       1、创建多段线单元
% _) t9 z1 `6 p$ i2 y; U       2、提取多段线顶点坐标和面积信息
; g( |, @- H' m) J% O+ L       3、将数据填写进EXCEL或VB的MSFlexGrid控件中
' F5 {( B) _) |) d; h next 顶点号
5 V* Z- Z3 k! b! x2 ?& R6 ?% d. N6 I9 ^
/ D  b% t" @! f# j! M

6 b" S" h* f9 O, R# ^) q  hFor循环中第三部分代码大致如下:! B8 o( p7 W! @! Y, M8 o" Q
'MSFlexGrid1中能列出多段线的坐标(我从网上下载到的源代码)7 d/ j, Q; O1 I$ ?8 X
; _4 h" e6 \  q( R+ _& p
Private Sub cd多段线坐标查询_Click(); n! E, R& [: l6 f5 B8 P
'==========================================================
& y, i- V( a) x3 P& l) n4 b& n  Dim acadApp As AcadApplication
. ~; U1 {7 ~' h" b. C. u  Dim ssetObj As AcadSelectionSet- F: A  ]: {" m9 O; k6 g* g* O5 a
  On Error Resume Next. r4 _- S& n# I8 a
  Set acadApp = GetObject(, "autoCAD.Application")/ ^! i9 X' q: L2 c% M' @
  acadApp.ActiveDocument.SelectionSets("hights").Delete5 T7 b. o" H/ k
  Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("hights")8 i9 h% N2 O0 ?1 L! n7 z0 X
  AppActivate acadApp.Caption4 ]8 v2 u: a$ a; n# Z9 T9 @
  Dim FType(0) As Integer
; b& ~8 T) h, O" }) _, T( `  Dim FData(0) As Variant8 r, R6 }6 ~0 g2 R1 y- X
  FType(0) = 0  x$ a0 \+ F* z
  FData(0) = "line"$ ^: [( q$ F* o# z6 L$ |8 k
& e1 q; n, g" S! n8 I1 x# v0 E
  
6 d( p% m4 K. |* _  Dim filterType As Variant4 D. ?/ T  z% U% r$ P9 G' ]
  Dim filterData As Variant
9 R8 D0 K4 H4 x7 `6 _+ j$ c ' filterType = FType1 B$ `* F& ]3 H
' filterData = FData# s( F4 }8 M# n" A6 r6 V
' ssetObj.Select acSelectionSetAll, , , filterType, filterData/ d2 e2 e4 p* b3 d& f( ]) H
'                                                                                'AppActivate userform1.Caption) H; I- n2 Z$ A+ t: @
'
- \9 [% P- _) P0 l+ }" r$ z& h ' Dim pickedObjs As AcadEntity6 A" U! H& O; m) l9 e/ ?
' For Each pickedObjs In ssetObj
+ N, f& ~: u: E$ \4 J# Z '   pickedObjs.Highlight (True)
5 @0 U* w! v  i- H ' Next
; _0 R8 e1 F# O# s" s& z0 T ' ssetObj.Delete) X+ \7 G, O# |' R

' Q; q+ M, Z  b
' ], i3 L2 I: I! u. a4 @. K; T' Z( t- c6 P- x2 t  G6 `& Q4 U
'==========================================================================================================+ ]8 @/ h6 w( B
, `3 u$ t) ~5 @9 d) ?

& j6 j. P) h0 W* C+ X1 K, p( |8 [+ W1 K* k7 |$ J) Y7 ^
4 V2 A% [9 d0 ?& {+ S
    '安全创建选择集
, r+ i9 |5 p: U9 u8 F    'Dim ssetObj As AcadSelectionSet4 K# S# J/ [' r3 Q( w
    If Not IsNull(acadApp.ActiveDocument.SelectionSets.Item("Test")) Then0 }  ^# i9 g) o
        Set ssetObj = acadApp.ActiveDocument.SelectionSets.Item("Test")5 S3 h) J: F" c/ u* I" j! {
        ssetObj.Delete
5 e/ C3 _: X" w& f( f8 N. |    End If
2 S; B2 ~+ J" G6 T6 |    7 |/ `7 Y; Z7 R* B! k9 ^
    6 j" M7 E; w7 e$ s
    '创建选择集
% |* g; P: ~% d9 A) I$ G    Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("Test")
/ P5 L, ~3 x# c+ D   
3 S0 L6 n0 F: {6 s9 F0 b' M    '激活CAD窗口8 b# h3 m1 ?5 g) R" g2 p
    AppActivate acadApp.Caption2 [  w% V9 R' r' E- F8 }
    acadApp.WindowState = acMax
- c' D& U( i  i  y    '提示用户从屏幕选择实体对象,并加入选择集
: L( H; Y4 O$ [    ssetObj.SelectOnScreen* C5 @- w- E7 u5 ]( j
    ssetObj.Select acSelectionSetAll  '选择所有曲线* q+ G) J+ @. o6 \
   
3 J4 @* ^3 E4 t& d4 a    '选择完毕后按回车键或单击右键
, m$ Q" N$ H- e* c. Z; |$ N    'Dim pickedObjs As AcadEntity$ t9 f. S$ r9 d# J
    Dim retCoord As Variant
0 E/ N8 [& g! D+ U- n# ~; i    For Each pickedObjs In ssetObj% h3 f/ o* W- ?
        retCoord = pickedObjs.Coordinates
4 z/ l6 r' y: E0 O" _- l8 o% o        AppActivate Me.Caption( h: y1 b4 o6 |* ]/ W5 e
        acadApp.WindowState = acMin
: p0 a$ T) |4 @5 p/ W5 @        If TypeOf pickedObjs Is AcadPolyline Or TypeOf pickedObjs Is Acad3DPolyline Then   '普通多义线或3维多段线
* _* U+ J5 s) y' Y( o& r            j = (UBound(pickedObjs.Coordinates) + 1) / 3   '多义线的顶点数5 h# l: ^! r9 N# O( b$ v  Z! @
            For i = 0 To j * 3 - 1 Step 3/ T- S/ ^7 f  T- Z) G% z' {
                    If retCoord(0) = retCoord(j * 3 - 3) And retCoord(1) = retCoord(j * 3 - 2) Then  '闭合时: i2 l$ ?! E. b% y% L& x
                        MSFlexGrid1.Rows = j
( w5 s$ |- G& c; W8 t                    Else   '非闭合时/ j: K/ A  N* a/ P" Z& W
                        MSFlexGrid1.Rows = j + 14 d! N; I8 H# y* O  c
                    End If' @* b8 n  F. c( \
                    MSFlexGrid1.TextMatrix(i / 3 + 1, 0) = i / 3 + 1  @2 g+ p1 a& S, K* K" _+ f" Z9 i2 N
                    MSFlexGrid1.TextMatrix(i / 3 + 1, 2) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000")
4 `3 R+ M; w* F8 }                    MSFlexGrid1.TextMatrix(i / 3 + 1, 1) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000"); C$ M9 m' x1 m% c) }* n
! G" m' ?1 J- w. X0 g
            Next i
& K2 ]; W( M9 K8 c- y3 c: P        ElseIf TypeOf pickedObjs Is AcadLWPolyline Then   '轻便多义线
% M5 \. C2 o/ Q! V9 u/ R7 l            j = (UBound(pickedObjs.Coordinates) + 1) / 2   '多义线的顶点数
6 B% m0 W3 h6 @' C9 c! D& x; A' b            For i = 0 To j * 2 - 1 Step 2: _  }0 S5 z! \9 T7 J$ I
                    If retCoord(0) = retCoord(j * 2 - 2) And retCoord(1) = retCoord(j * 2 - 1) Then '闭合时1 x! b+ p2 ?) f
                        MSFlexGrid1.Rows = j
# f$ G! X* G( @* I# S. F                    Else   '非闭合时
7 {) r8 m7 @( I                        MSFlexGrid1.Rows = j + 1& |* D2 ?- b9 F3 s& `- n
                    End If
  y$ S2 {$ S- T( W3 y% Y2 N% u                    '******MSFlexGrid1中只能列出多段线的坐标******
6 \9 Q( p' _' M                    '不支持面域4 ~5 c/ |* L) \
                    MSFlexGrid1.TextMatrix(i / 2 + 1, 0) = i / 2 + 1" p& {1 x0 J  |. Q- l5 [" I
                    'X坐标$ @2 f& F8 Z; H4 {
                    MSFlexGrid1.TextMatrix(i / 2 + 1, 1) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000")         'X! k& \$ ]  R: j( W$ Z
                    'Y坐标5 Q" g$ W3 s8 G% n% r# N1 Q
                    MSFlexGrid1.TextMatrix(i / 2 + 1, 2) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000")     'Y# @  F" z; ?: N6 j
                    '面积
: K. J0 ~6 k- @8 x" s                    MSFlexGrid1.TextMatrix(i / 2 + 1, 3) = Format(pickedObjs.Area, "0.000") '面积7 ^" b: g4 E9 ^9 \5 n0 F( a# [
                    MSFlexGrid1.Refresh
' C# y6 \  {2 e$ s9 @; L) b4 D            Next i
7 v: R  G5 r2 F* T. U- V4 C        Else
( Y9 E0 I; J5 J, Q             MsgBox "您选择的不是多段线!", 64 + vbOKOnly, "地质测量"
) b  d0 n: O$ S1 F& m7 k: v& }- {             ssetObj.Delete
) v% B4 i5 x# e3 R* y- D        End If
6 s. {6 Z- t6 l1 Y- V( N5 O        Exit For
; |3 {! y' H$ G2 K. t5 G1 J    Next# V( v" J& W5 p
    '删除选择集
+ Q) m' o2 b) @  Q3 a$ j    ssetObj.Delete# z- V0 P0 w! E
End Sub' g) T' ?3 P; l: k# y' ]
) e  u: x) `6 {. p0 P, |( Q3 Y
'==========================================================
1 b. N- g6 O$ A, z& _" v# j; R+ U# y, G
[ 本帖最后由 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 )

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