QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
求:0 k! U" c+ I0 W" y/ F& _+ N
  如附件图中所示:由line和arc绘制(非多段线)的多个随机单元格构成的复杂图形中,以已知顶点坐标为第一个点,用VB编程,按照逆时针方向顺序求出每个单元个各个顶点坐标,并求出每个单元个面积,结果写入EXCEL或VB的MSFlexGrid控件中,整个过程不要出现鼠标拾取单元格,要自用运行出结果。8 ^3 S' [! I. {% h. p
  w) E  I0 u/ X$ f9 D% F9 H
我的思路是:VB编程,用For……next将每个单元格用类似“BO”命令自动创建边界,形成多段线单元格,然后用以下代码获取多段线单元的顶点坐标和面积,输入到EXCEL或VB的MSFlexGrid控件中。* Z4 X- i4 a4 m: r* W) H# B* q7 S* z

) D6 Z4 p$ F+ p; o, FFor  顶点号- x7 w8 n* a8 l. X
       1、创建多段线单元) @' o# t+ p; P- B: [
       2、提取多段线顶点坐标和面积信息: T0 ~1 o: A1 }1 K" N
       3、将数据填写进EXCEL或VB的MSFlexGrid控件中
" a7 y* x" b" p5 B next 顶点号
$ U3 n9 m  o( L; G( P- C# \: A4 t4 G4 f& S3 W
6 h. ~/ F$ o( m- s  `
0 L2 U6 h8 d1 b6 }/ _
For循环中第三部分代码大致如下:
) h8 ^8 U% ^3 \! ?; }'MSFlexGrid1中能列出多段线的坐标(我从网上下载到的源代码)* e, `1 l0 m. ^3 E2 a' U$ v& a

& @# w( ], X: I7 [% M+ xPrivate Sub cd多段线坐标查询_Click()# n2 R( m4 H4 |9 [: Q; |8 ]
'==========================================================
$ n; i6 l9 a0 P5 Q2 U- u* |, u, ?  Dim acadApp As AcadApplication- h% Z6 x7 {1 {
  Dim ssetObj As AcadSelectionSet( j8 t' |. _& h4 N$ E8 J; P  `
  On Error Resume Next/ c  }9 C0 }7 t) M4 [; Z2 S8 F3 J
  Set acadApp = GetObject(, "autoCAD.Application")
8 R7 m8 O6 m3 _  acadApp.ActiveDocument.SelectionSets("hights").Delete
4 }8 @$ z+ K: ^; T5 k; C  Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("hights")
2 u3 f* g, l3 _$ \7 Y2 E  AppActivate acadApp.Caption
+ k8 i" g1 o% ?4 v! L; Z  O# b  Dim FType(0) As Integer% i- t" b: F- F/ O
  Dim FData(0) As Variant
$ B! p% i- T  G5 |+ n( v  Q7 Z  FType(0) = 0& d1 F( k. B! _
  FData(0) = "line"
' u2 u( R4 p) u: l( g1 V
: K) \9 B# |4 s! ]" R  
: a9 V1 x* a' @; U+ Q3 Q, o& z  Dim filterType As Variant7 d, w& |/ o8 F" U* j
  Dim filterData As Variant6 G/ g% X1 |, ]& w" {, x2 @7 u
' filterType = FType% R; S0 S5 B* R! j& g' d. ]' x
' filterData = FData0 z2 o; |/ r# C; [1 J3 y5 n
' ssetObj.Select acSelectionSetAll, , , filterType, filterData
* A$ V; I5 L/ X. L) H '                                                                                'AppActivate userform1.Caption# o$ n9 I) Q5 |4 u9 N7 [) {
'
# y! O8 c+ y5 R# x( M ' Dim pickedObjs As AcadEntity; V0 k* k: S4 l* _2 o5 ?
' For Each pickedObjs In ssetObj9 B- P& O7 s  _) N. v1 J$ p3 `) A9 p
'   pickedObjs.Highlight (True)
6 N9 S# X: `" [  t! M0 Z( F ' Next
! x% f. p9 J/ U4 e ' ssetObj.Delete
3 h9 F, |0 m1 T& [+ M2 i0 ^: ~5 O0 ?1 N+ o+ _0 ?
# H8 H' T  {1 q
- u8 w. E0 I2 N& \, f
'==========================================================================================================
0 S1 u4 I0 |: E6 h- L( M' S3 e
. l1 B% m: j( b8 M
% R1 ?6 e4 S7 U, N4 J& U2 X# ^3 |) `, F# R& W2 w6 ^
+ x& ^; x" ]7 T0 i; A* Y
    '安全创建选择集/ l( H+ f, ~9 c) y
    'Dim ssetObj As AcadSelectionSet
+ Q  F% y( r1 {    If Not IsNull(acadApp.ActiveDocument.SelectionSets.Item("Test")) Then
# o) C9 F, p: V; ~. G5 C( G3 W        Set ssetObj = acadApp.ActiveDocument.SelectionSets.Item("Test")
  y: t' g2 g% X, }2 A4 }        ssetObj.Delete
, O( ?( M9 r, D' H6 q    End If  t0 r1 q8 Z2 ]; h
    , V) ?- r* D+ _* t  a
   
4 c1 R, H* X# y4 L; t    '创建选择集
( x7 T# h( Y! E8 r8 H& `; W& S/ g" l    Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("Test")
. ~3 B  Z2 s& q+ V) |    ; c. R0 k& {1 X3 A  A
    '激活CAD窗口. m6 g9 J) K+ n% z" F' g
    AppActivate acadApp.Caption0 ?* A4 {$ ?" L6 Q& E3 i( S
    acadApp.WindowState = acMax
/ Y5 ~' J+ b4 i% x  K    '提示用户从屏幕选择实体对象,并加入选择集* X/ J7 q; k8 _3 d. I
    ssetObj.SelectOnScreen+ z$ d0 m' |6 _( v& S, t
    ssetObj.Select acSelectionSetAll  '选择所有曲线* ?) o/ V0 w" s) h+ J! P
   
1 J2 M" V+ c5 q; A. F1 v! A    '选择完毕后按回车键或单击右键2 T( N$ W3 ^) F
    'Dim pickedObjs As AcadEntity% W, I, g" b1 g* D( O
    Dim retCoord As Variant
2 f- X. z' X2 ]% g: k    For Each pickedObjs In ssetObj' |$ X7 N' {* K1 r2 Z/ P
        retCoord = pickedObjs.Coordinates0 o0 G/ q9 c2 ^7 I* K
        AppActivate Me.Caption1 c, y$ A/ M. K6 R6 \1 {. ]
        acadApp.WindowState = acMin: L) T5 o$ e2 b& z8 v2 _% o+ ]: B9 F" }
        If TypeOf pickedObjs Is AcadPolyline Or TypeOf pickedObjs Is Acad3DPolyline Then   '普通多义线或3维多段线3 v2 v" E5 B$ U7 ?' C5 d, K. b+ C/ g
            j = (UBound(pickedObjs.Coordinates) + 1) / 3   '多义线的顶点数) S6 J; x: o! k, ]
            For i = 0 To j * 3 - 1 Step 32 e2 n) _2 U, u) P
                    If retCoord(0) = retCoord(j * 3 - 3) And retCoord(1) = retCoord(j * 3 - 2) Then  '闭合时
8 h8 }6 f' f# ]1 i# B+ m1 G                        MSFlexGrid1.Rows = j7 e# A% N" z0 E3 q
                    Else   '非闭合时  T( W) N- g# f* Y$ j
                        MSFlexGrid1.Rows = j + 1& D7 Q/ V# K7 M$ |) Z
                    End If0 y3 S' e# s5 w# p3 h
                    MSFlexGrid1.TextMatrix(i / 3 + 1, 0) = i / 3 + 1
$ ^* S5 G$ Z2 Q% T5 q- ?                    MSFlexGrid1.TextMatrix(i / 3 + 1, 2) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000"), {! r3 {/ w# D0 `8 U
                    MSFlexGrid1.TextMatrix(i / 3 + 1, 1) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000")
! l1 F  x- J0 q2 q
* t4 e2 A' U4 y! r3 n3 B! w' ^+ }# Z            Next i+ }8 N  `# B' W" M( A  M% c1 i
        ElseIf TypeOf pickedObjs Is AcadLWPolyline Then   '轻便多义线# O, W. y% Z1 t1 E: d
            j = (UBound(pickedObjs.Coordinates) + 1) / 2   '多义线的顶点数6 ]2 I1 W; ]8 b  g/ \: R* Z- Q
            For i = 0 To j * 2 - 1 Step 2
. w' l6 @) L8 k" i- x$ N8 n  r                    If retCoord(0) = retCoord(j * 2 - 2) And retCoord(1) = retCoord(j * 2 - 1) Then '闭合时' U, x( k. @9 `  Y, c) C( }3 m
                        MSFlexGrid1.Rows = j+ B3 F9 B+ D( p+ O- W% |( p0 T9 J
                    Else   '非闭合时
9 f" N8 N8 r% Y: X, _                        MSFlexGrid1.Rows = j + 1
- c+ s/ n6 e! {/ s& W8 b' U4 H                    End If4 [1 N" x6 e# i0 E9 s
                    '******MSFlexGrid1中只能列出多段线的坐标******
( r. e0 D" R5 Y; s. {" i                    '不支持面域/ x3 t" l- o. k3 T
                    MSFlexGrid1.TextMatrix(i / 2 + 1, 0) = i / 2 + 1
8 Z9 j6 {. z2 n5 F: O                    'X坐标
: I7 X0 d% @* d; U+ R& w                    MSFlexGrid1.TextMatrix(i / 2 + 1, 1) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000")         'X
* c' l. \- }4 p9 A2 G# z                    'Y坐标
, Y) T% z! Y8 Z' u4 B5 B                    MSFlexGrid1.TextMatrix(i / 2 + 1, 2) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000")     'Y" `0 k7 L. \. a  Z7 F* @
                    '面积
% s8 O3 m; l( o9 O3 t2 S& M                    MSFlexGrid1.TextMatrix(i / 2 + 1, 3) = Format(pickedObjs.Area, "0.000") '面积
7 n- ]1 C$ E* S% L0 }6 Q  g* @3 O                    MSFlexGrid1.Refresh( N, R' O& L4 j* q
            Next i$ o2 ^2 @! d+ i( t
        Else
$ C/ _$ B& r" f3 T. J" N8 E4 Y             MsgBox "您选择的不是多段线!", 64 + vbOKOnly, "地质测量"
% j4 W, \7 W' s8 ?             ssetObj.Delete. l. w+ H2 R% K  ]3 K' ?% w
        End If
) j& z: t# |# T        Exit For, H& S/ y# k# h( m& P# [% x$ I
    Next
! \9 V6 D, Z3 C+ O    '删除选择集
5 m9 u1 e0 C- M* N2 O    ssetObj.Delete
0 |" K2 h, g( {( v- J1 O0 sEnd Sub
3 s( i0 l7 j7 ?6 G! p4 @0 P0 o( o4 Y5 D) V- z
'==========================================================
/ q+ y& d. a3 e  z0 i
0 R: {( {" \: r# p( W[ 本帖最后由 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 )

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