QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
求:
$ r' r) P: @5 ]7 E; G& j7 e  如附件图中所示:由line和arc绘制(非多段线)的多个随机单元格构成的复杂图形中,以已知顶点坐标为第一个点,用VB编程,按照逆时针方向顺序求出每个单元个各个顶点坐标,并求出每个单元个面积,结果写入EXCEL或VB的MSFlexGrid控件中,整个过程不要出现鼠标拾取单元格,要自用运行出结果。
# k0 B1 J/ E  G# B( ~4 _. z0 m
9 j3 @6 m. [  j# @- H! M& |我的思路是:VB编程,用For……next将每个单元格用类似“BO”命令自动创建边界,形成多段线单元格,然后用以下代码获取多段线单元的顶点坐标和面积,输入到EXCEL或VB的MSFlexGrid控件中。
# y, f, ^% f( k$ k  O* U% J* a- N( c3 t4 o
For  顶点号( S+ B6 t. s2 e
       1、创建多段线单元
/ `' j" m$ r( Z  P; B       2、提取多段线顶点坐标和面积信息
8 c3 p3 c2 i- Y4 t; O/ V' U       3、将数据填写进EXCEL或VB的MSFlexGrid控件中
0 ~) P2 X8 H( _2 F next 顶点号
# Y+ Y, [2 [% g
* M; B  r8 M# F; ]0 ^" {. r% A0 L$ n+ y5 k: f% |
0 a4 a. P; s) ~' `( H" o
For循环中第三部分代码大致如下:+ H* @5 ?5 m& A3 q
'MSFlexGrid1中能列出多段线的坐标(我从网上下载到的源代码)* H8 m0 I8 B& P# Z

; H: E; H8 e! G/ c5 t9 ePrivate Sub cd多段线坐标查询_Click()
  G% Q, F% [3 F. P0 I* \9 f1 w'==========================================================
# A5 o0 q0 e+ E- l  Dim acadApp As AcadApplication7 S: Y' U- \. w2 k; j; O+ G
  Dim ssetObj As AcadSelectionSet. I+ W6 r3 M6 Y( Q) L4 X- k% w: V
  On Error Resume Next4 l- y: s) x' r# u
  Set acadApp = GetObject(, "autoCAD.Application")
' j9 H$ r  G# S  acadApp.ActiveDocument.SelectionSets("hights").Delete
5 _! x2 f* G5 z) b. r4 S" x  Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("hights")
, {1 F( C/ t" i- Y' ]7 D$ B  AppActivate acadApp.Caption/ h2 I/ Y' j/ F
  Dim FType(0) As Integer
* v6 J* v3 y% W) G! g; d$ t  Dim FData(0) As Variant
5 h) R, }& a& G6 N7 w* J  FType(0) = 0
) e8 l* `4 v8 w. ^/ I& e; ^  FData(0) = "line", n" t3 b! O" s/ z

2 X5 }1 v9 w0 t# d+ z. L  
. z4 j; Y  v3 e  Dim filterType As Variant
3 M; D* W! P2 f4 V4 j/ ]  Dim filterData As Variant4 l3 Z4 }' ^6 ^5 O! |3 Y5 j
' filterType = FType
' r' S* `# z9 z6 L6 U7 a ' filterData = FData/ M9 J' D/ d) _7 s- _+ a( k
' ssetObj.Select acSelectionSetAll, , , filterType, filterData
7 _# I4 J/ F9 r: j% d1 _ '                                                                                'AppActivate userform1.Caption
4 x6 m3 _2 p: ]3 b' z3 z '8 u1 @% X: M2 \
' Dim pickedObjs As AcadEntity. ]3 @5 u$ B& {: y2 s/ ?
' For Each pickedObjs In ssetObj& S9 A5 \# L( E% P" |, Q" Z2 r
'   pickedObjs.Highlight (True)3 @% w. ]& h3 C4 c" t8 D; n; e
' Next& A# V3 {* I- C  G& P2 @
' ssetObj.Delete0 p* Z& a, \6 J' U
) G( W& {' V( G( h

4 b1 \4 E/ M( C* S
- @% W6 ~4 X& F  S( F& K! |+ S$ D" h6 S'==========================================================================================================
+ {8 n8 T- u+ k) C- X
. m2 q" Q: {1 q/ S5 a2 S7 E1 o  B
! L( I! L$ F; {. }# d# |( w
  x+ N3 A, x6 m) w! F! T: u' y6 k% b1 y& g- P( M5 v/ N& b0 C3 L
    '安全创建选择集! Z3 C7 O0 M0 B+ \% k
    'Dim ssetObj As AcadSelectionSet& r4 Z; J3 O. ^4 I4 S( p
    If Not IsNull(acadApp.ActiveDocument.SelectionSets.Item("Test")) Then
( E& M2 x5 ^0 n: J* R! P! w/ x        Set ssetObj = acadApp.ActiveDocument.SelectionSets.Item("Test")/ X5 u4 v% C  p- s! ~
        ssetObj.Delete9 |9 Q3 t$ H7 z
    End If
* U# U$ d, t3 m! t( ~   
3 z, g( {9 ]9 h" Y8 x' d    9 v2 a2 e% s: W. X9 @3 t- W" D
    '创建选择集
# E% [) x! Q$ p) P    Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("Test")' J8 h) V: @7 Z3 u+ C; z9 Y
   
# _7 S! L% n8 L1 V9 X; Y2 p$ D2 |) a    '激活CAD窗口. x  `9 G2 v2 h: H" s! r) m
    AppActivate acadApp.Caption
" k% A* \7 {  m. K  n    acadApp.WindowState = acMax  z- T+ ^5 S+ D/ m! E
    '提示用户从屏幕选择实体对象,并加入选择集( b* U" t( |; ]* \. S, H
    ssetObj.SelectOnScreen
  c% z; I5 i  A, y    ssetObj.Select acSelectionSetAll  '选择所有曲线) h( t# |0 }. V' D  ~3 r8 f
   
9 v0 B" C" [! L% t& h" r4 p    '选择完毕后按回车键或单击右键' S- ^/ F' A" g7 {' Y
    'Dim pickedObjs As AcadEntity
" Z+ k2 @# V) ]- ]* I" o7 W    Dim retCoord As Variant
4 z! z) I' j. w+ y7 z: z; X    For Each pickedObjs In ssetObj
7 F5 o9 R6 W" L1 e$ {" o' S        retCoord = pickedObjs.Coordinates9 S3 u5 n$ M/ L& W
        AppActivate Me.Caption
7 N/ u/ l. {2 o) P        acadApp.WindowState = acMin
3 m3 f* x5 E! T$ w$ m        If TypeOf pickedObjs Is AcadPolyline Or TypeOf pickedObjs Is Acad3DPolyline Then   '普通多义线或3维多段线
6 H$ }4 A5 A: }5 ~; t" [% q2 Y            j = (UBound(pickedObjs.Coordinates) + 1) / 3   '多义线的顶点数8 Z# U8 r6 h, a# z$ {" |
            For i = 0 To j * 3 - 1 Step 3: I+ Z8 o/ h: o6 H" B# Y5 m
                    If retCoord(0) = retCoord(j * 3 - 3) And retCoord(1) = retCoord(j * 3 - 2) Then  '闭合时
& N* u3 K4 Z3 X$ ]                        MSFlexGrid1.Rows = j
( E$ m3 a8 Z3 v  l                    Else   '非闭合时* S& I/ N6 j2 S" Z- N0 p
                        MSFlexGrid1.Rows = j + 1* J1 n3 I$ e' h# t* z( Y* i
                    End If, z" q/ F' l, D
                    MSFlexGrid1.TextMatrix(i / 3 + 1, 0) = i / 3 + 1
! e/ X2 _7 O7 Y: A( i                    MSFlexGrid1.TextMatrix(i / 3 + 1, 2) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000")
8 o" }  H; ^. c7 Y+ @4 b' h: q                    MSFlexGrid1.TextMatrix(i / 3 + 1, 1) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000")
  y" ^! Y- s7 U; K, a2 x
: e/ R( B4 R# ^9 j' b# O8 F            Next i
9 G# W& K# i8 F( I! o! Z        ElseIf TypeOf pickedObjs Is AcadLWPolyline Then   '轻便多义线
1 d$ d" [9 P6 @5 C3 c7 e            j = (UBound(pickedObjs.Coordinates) + 1) / 2   '多义线的顶点数: x' C, s$ i4 p& v1 R- H* c. B0 V
            For i = 0 To j * 2 - 1 Step 2
& x& {- N! i( `  S1 b" l- G                    If retCoord(0) = retCoord(j * 2 - 2) And retCoord(1) = retCoord(j * 2 - 1) Then '闭合时
  a8 B+ a" u3 R7 r$ b6 ]" C                        MSFlexGrid1.Rows = j
4 c  j* j/ V' _8 j2 B1 f! ]                    Else   '非闭合时/ l% K9 ^# }/ z2 m' `" u$ @; r3 L, I
                        MSFlexGrid1.Rows = j + 1
) y9 s$ j8 d6 N5 P; s5 i                    End If5 Q4 c: F) W+ G: F* w1 I+ u
                    '******MSFlexGrid1中只能列出多段线的坐标******
( I# k/ I7 ]" V! c+ w3 v! B$ z                    '不支持面域
( O# [/ V& d- l                    MSFlexGrid1.TextMatrix(i / 2 + 1, 0) = i / 2 + 18 V* H. U# s) J1 [# F0 _
                    'X坐标
7 v% T! B2 C4 S4 p$ X/ J0 m                    MSFlexGrid1.TextMatrix(i / 2 + 1, 1) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000")         'X+ _! W6 H* n8 n: ]- R- H
                    'Y坐标" J4 o8 Q" d" W2 A
                    MSFlexGrid1.TextMatrix(i / 2 + 1, 2) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000")     'Y1 h: |, M+ h8 U: c7 p% I; n
                    '面积
/ O9 Y( E0 G' p* u9 P5 _, R% N/ C                    MSFlexGrid1.TextMatrix(i / 2 + 1, 3) = Format(pickedObjs.Area, "0.000") '面积
9 P* N/ x9 M* p4 J8 d                    MSFlexGrid1.Refresh
. \7 ~. U7 y. t6 I& F; v. l            Next i
9 D! u! w" R, _, A* n! _        Else" t: Q5 G$ x0 I& O
             MsgBox "您选择的不是多段线!", 64 + vbOKOnly, "地质测量"0 N3 \* C* I( f7 s3 c; P
             ssetObj.Delete; z" `) n0 l4 g
        End If
- w9 C; T6 P. M) s; Z5 P$ Q        Exit For
5 S/ U4 O# a9 g9 m    Next
# [8 C5 o+ _/ ]* _; D    '删除选择集5 z! ], ^1 |7 `' S: p
    ssetObj.Delete: t" w3 g0 g. r' p5 a" B" I8 ]
End Sub& N1 t+ y7 w" p7 c
& `' Q6 ~9 y; k( a$ }9 G
'==========================================================
% M  r7 ^! ^; k
7 j5 L6 Y1 h, W. j7 d# b$ J[ 本帖最后由 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 )

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