QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
6天前
查看: 3298|回复: 4
收起左侧

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

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

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

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

x
求:2 j1 [) y& d, Z) t2 u
  如附件图中所示:由line和arc绘制(非多段线)的多个随机单元格构成的复杂图形中,以已知顶点坐标为第一个点,用VB编程,按照逆时针方向顺序求出每个单元个各个顶点坐标,并求出每个单元个面积,结果写入EXCEL或VB的MSFlexGrid控件中,整个过程不要出现鼠标拾取单元格,要自用运行出结果。' c+ g0 Y7 m  E( Q! i
% e4 V' A) T4 q- n9 A5 h: ?
我的思路是:VB编程,用For……next将每个单元格用类似“BO”命令自动创建边界,形成多段线单元格,然后用以下代码获取多段线单元的顶点坐标和面积,输入到EXCEL或VB的MSFlexGrid控件中。
7 S2 o0 Q2 B3 p: i1 F- q
1 w3 ]  U) u7 LFor  顶点号
* y. f, P7 R6 m& S) [       1、创建多段线单元/ T) C3 J0 s. H
       2、提取多段线顶点坐标和面积信息, y  B- [, n) U0 [
       3、将数据填写进EXCEL或VB的MSFlexGrid控件中
+ I& K0 w1 A* J9 ^/ D next 顶点号
9 ~" U" U2 ~: L0 F
% j& `  x$ i' E! w& O% B, D3 f- i( J* U

% X3 S2 u' P! d$ V/ ^+ B' oFor循环中第三部分代码大致如下:
- j% G5 t$ G% |  s1 J- N'MSFlexGrid1中能列出多段线的坐标(我从网上下载到的源代码)
% C$ D. g" `7 B# F' v! E6 s" b5 V
5 b8 t; o$ ^8 _3 oPrivate Sub cd多段线坐标查询_Click()4 m- j2 m: I0 @9 \/ l
'==========================================================- \1 S7 a* E% k0 c
  Dim acadApp As AcadApplication! n% m+ f' C3 F" z5 p2 z7 v3 m- f
  Dim ssetObj As AcadSelectionSet
7 K! W6 U( N0 E1 ?$ K2 I- m  On Error Resume Next
& H9 t" _0 N& j$ O3 F) e3 p  Set acadApp = GetObject(, "autoCAD.Application")
2 h+ c1 ]) ]- w; M  U  acadApp.ActiveDocument.SelectionSets("hights").Delete; ^% \  I9 J7 a: e8 X
  Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("hights")0 X+ O" ]. p; B& a3 P, I
  AppActivate acadApp.Caption
$ W* B3 y) L5 C1 ?, o  Dim FType(0) As Integer
+ J1 i0 z% M6 V3 @1 i; _" k  Dim FData(0) As Variant
3 s. X' n$ n" k6 b5 e1 l* X$ @  FType(0) = 02 z1 q, G& v+ W& A
  FData(0) = "line"2 Z+ P' z" u% i) W1 ]! o

( [8 }: v# \9 ~- b2 W7 I) i5 d  
" C+ B+ _0 T0 s; e) e2 j  Dim filterType As Variant3 S0 G) x' h/ x& X' W4 [4 C6 T4 ]
  Dim filterData As Variant
! `# B. r2 Z4 U4 e, |1 t ' filterType = FType
4 F8 [* P" j! [6 [' ~ ' filterData = FData; C# r3 u  W# ?: f  [5 g
' ssetObj.Select acSelectionSetAll, , , filterType, filterData3 E: p) [3 K/ V3 G, ?1 N8 M
'                                                                                'AppActivate userform1.Caption  L/ m$ N0 c* c, |- A$ }
'
) a/ P, e) \4 y ' Dim pickedObjs As AcadEntity. }! u* h1 W, H' C
' For Each pickedObjs In ssetObj
+ q' L) E) x8 H4 Y. C2 _ '   pickedObjs.Highlight (True)" q8 ]! @3 U1 o
' Next
$ g3 _: k$ q/ o! M8 V ' ssetObj.Delete/ ^% d7 j3 g# S
% b; w- ~- G# j( d

8 H) }0 J/ r  W% R$ A5 U. I7 ~+ @2 g/ x& m; h! i) O3 s
'==========================================================================================================
1 y# u3 m1 O8 h# w9 V6 c1 X/ v! g& V7 J. ^

$ _" t4 C- j% l; ~8 h/ n
& N; X$ w. c6 G
5 C( v6 D& t- k$ K6 ^* I    '安全创建选择集
0 v" K) l: C; ?& k% L    'Dim ssetObj As AcadSelectionSet
; }2 Q8 ~1 f4 K, r( p: f    If Not IsNull(acadApp.ActiveDocument.SelectionSets.Item("Test")) Then
6 k4 V( P7 |; B% X- U2 s) F1 a        Set ssetObj = acadApp.ActiveDocument.SelectionSets.Item("Test")
4 \  F+ a. m! e- O& H* d( u9 ?        ssetObj.Delete
: c& x# J8 j1 X$ M( `% A9 P. {    End If* Q8 _' a, E: n; {  H( w
   
* A% a+ h9 Z  R    8 \& P- W% L+ m+ U$ B
    '创建选择集
; \( ^' E; V. w! r+ b    Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("Test")# V1 S+ R' y' y1 A
    : _, L8 b3 d. g) n! b% m/ K
    '激活CAD窗口
. M6 V7 U* N& Q9 C- c) p    AppActivate acadApp.Caption/ B7 E# s7 t7 f7 v/ A- H4 x/ }4 S
    acadApp.WindowState = acMax$ H" K3 r' I2 C; H9 r, z; J; n+ L
    '提示用户从屏幕选择实体对象,并加入选择集
" r" a5 L) J2 w+ L    ssetObj.SelectOnScreen* @! p0 Y  @# q
    ssetObj.Select acSelectionSetAll  '选择所有曲线  L/ H( _3 e. Y
    * z, R+ i% k- f9 m' H! T- W
    '选择完毕后按回车键或单击右键2 ]) l# @! \5 ^! [0 D
    'Dim pickedObjs As AcadEntity
+ N/ b; `% ?4 B( A    Dim retCoord As Variant; y0 r) |  ]/ X3 W! `& m
    For Each pickedObjs In ssetObj* g7 f0 |: K/ d
        retCoord = pickedObjs.Coordinates
  d1 t2 s0 X! L* T        AppActivate Me.Caption
; w: k! Z5 n" Y2 Z8 D        acadApp.WindowState = acMin
4 f9 u- D  c1 |        If TypeOf pickedObjs Is AcadPolyline Or TypeOf pickedObjs Is Acad3DPolyline Then   '普通多义线或3维多段线! m7 n! |( T* d/ ?- X3 D( ~8 Q# d
            j = (UBound(pickedObjs.Coordinates) + 1) / 3   '多义线的顶点数
4 T' b( Z7 I% W# _2 Q$ U# Q8 A            For i = 0 To j * 3 - 1 Step 3$ s+ m% v; X$ q$ N5 f, T
                    If retCoord(0) = retCoord(j * 3 - 3) And retCoord(1) = retCoord(j * 3 - 2) Then  '闭合时. H$ D- n0 ]+ I1 i
                        MSFlexGrid1.Rows = j3 J  d2 a1 M( ]6 b- o
                    Else   '非闭合时$ A3 ], d) n( C/ Q# b
                        MSFlexGrid1.Rows = j + 1
- H% A$ B' \  u* \$ q                    End If
% I) L6 b1 s  q1 J& _# ^1 ^                    MSFlexGrid1.TextMatrix(i / 3 + 1, 0) = i / 3 + 1& P1 j3 r3 M: G" b7 L. \+ X
                    MSFlexGrid1.TextMatrix(i / 3 + 1, 2) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000")
2 B' E  s$ x7 F6 F                    MSFlexGrid1.TextMatrix(i / 3 + 1, 1) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000")
6 Y% g# t# B4 m$ `+ o
) ~4 I' x( `) l- c$ ?            Next i
6 N2 Z$ [, v: j( M, {; D1 x        ElseIf TypeOf pickedObjs Is AcadLWPolyline Then   '轻便多义线$ ?8 E, j! A2 i1 i$ O5 R, o, n% w
            j = (UBound(pickedObjs.Coordinates) + 1) / 2   '多义线的顶点数
) g0 {. G# n+ B            For i = 0 To j * 2 - 1 Step 2/ z; Y6 O9 K' O+ v6 p
                    If retCoord(0) = retCoord(j * 2 - 2) And retCoord(1) = retCoord(j * 2 - 1) Then '闭合时
9 B# I1 ^) W/ Y7 b' U  z; p                        MSFlexGrid1.Rows = j
; }: |/ U9 a$ W& S' j8 n6 {; {                    Else   '非闭合时
: ~. L: j$ z9 m8 m% N                        MSFlexGrid1.Rows = j + 1
- y$ L, ^* M/ Q5 w- r                    End If
% R5 n. K2 }, y  M. Y" l                    '******MSFlexGrid1中只能列出多段线的坐标******
& e' M3 Q, P6 h% K! H                    '不支持面域7 H1 c1 @, h- v: K+ V+ u0 O
                    MSFlexGrid1.TextMatrix(i / 2 + 1, 0) = i / 2 + 1
6 W9 A# e) k0 K8 ~                    'X坐标
9 C. R2 a6 b; k2 L6 |                    MSFlexGrid1.TextMatrix(i / 2 + 1, 1) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000")         'X
; a& A; v) X+ P% w/ v" a                    'Y坐标
& i1 m# m7 U* h2 @6 D  R                    MSFlexGrid1.TextMatrix(i / 2 + 1, 2) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000")     'Y8 G5 ]6 V8 u; ^* {* w* I4 _8 Y3 @
                    '面积1 q" t" k" @9 A6 m
                    MSFlexGrid1.TextMatrix(i / 2 + 1, 3) = Format(pickedObjs.Area, "0.000") '面积% K3 Q9 }8 t0 w- Q* o* V5 Z. ~
                    MSFlexGrid1.Refresh
9 T1 c& F! |' H6 T' ]6 s4 P            Next i
2 F0 w+ _# y( q' M        Else; w9 @- b- ?: }5 |1 b
             MsgBox "您选择的不是多段线!", 64 + vbOKOnly, "地质测量"# H0 w9 Y. R8 r( ^# g
             ssetObj.Delete
: }; I+ o1 {8 e! D" L: D) K        End If% N7 H- m5 t* T* _7 y9 a1 \9 R+ ]
        Exit For& n' Y6 [- t( A$ h6 M& E9 E* l
    Next" Q9 o+ d+ Q* p0 a6 H& f6 p
    '删除选择集& S! |( r! ^) E8 R- V6 j# s+ O& O
    ssetObj.Delete0 F0 {  T7 P6 `
End Sub+ y" _& S) h" |- E& g+ d( {9 l
  `+ [- i* I; L$ s
'==========================================================7 k  K  ]0 D8 z! E
9 O; l. J, |  ~5 F' m8 b
[ 本帖最后由 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 )

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