QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
8天前
查看: 3305|回复: 4
收起左侧

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

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

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

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

x
求:9 `5 t) v' U: d+ K
  如附件图中所示:由line和arc绘制(非多段线)的多个随机单元格构成的复杂图形中,以已知顶点坐标为第一个点,用VB编程,按照逆时针方向顺序求出每个单元个各个顶点坐标,并求出每个单元个面积,结果写入EXCEL或VB的MSFlexGrid控件中,整个过程不要出现鼠标拾取单元格,要自用运行出结果。% N- n9 @& ^- g( }# o0 l; {) e

% c' |- R/ \% S& h$ i' F' a我的思路是:VB编程,用For……next将每个单元格用类似“BO”命令自动创建边界,形成多段线单元格,然后用以下代码获取多段线单元的顶点坐标和面积,输入到EXCEL或VB的MSFlexGrid控件中。8 `: M6 V; Y4 W; E& d% _
8 V1 m: Y0 p5 ^+ G! {
For  顶点号
3 x) ?! J+ i/ y; I       1、创建多段线单元
( X7 P; e4 }, j8 l       2、提取多段线顶点坐标和面积信息
& n7 D5 K% L1 h# p( H( y: z       3、将数据填写进EXCEL或VB的MSFlexGrid控件中
$ s( C/ m! c! y+ D: y4 o6 j next 顶点号* q/ B2 R1 t: r! K9 h1 @- _; ]- T* T

- \0 k; D/ G; ]. M+ C
  k* R2 D* I$ U+ Q: J3 g7 ?; Z; `4 z* k0 e
For循环中第三部分代码大致如下:4 J. B6 m3 e. _
'MSFlexGrid1中能列出多段线的坐标(我从网上下载到的源代码)
+ _- G% C, W8 x1 c1 V
! Z+ Z* l) t; F7 C! |1 r+ h0 {Private Sub cd多段线坐标查询_Click()0 [2 h3 ~( Z7 D3 P7 ^2 i
'==========================================================
! v) q; I7 y& q' ?5 Z; K8 C+ q2 w  Dim acadApp As AcadApplication
% Q$ F; t' [  b  Dim ssetObj As AcadSelectionSet& T! _/ j0 b5 V: i7 E- `
  On Error Resume Next
4 b& ?8 ~8 j5 r; l1 y: e  Set acadApp = GetObject(, "autoCAD.Application"), R5 z; Y: W+ h: ]5 {# M$ i
  acadApp.ActiveDocument.SelectionSets("hights").Delete
: j# k- {8 M! H  Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("hights")& I1 V% p- J, B( M! V
  AppActivate acadApp.Caption
$ V5 V0 p+ `0 ]2 ~  Dim FType(0) As Integer. q4 n# K% |7 {/ O9 |% _3 |2 e
  Dim FData(0) As Variant
/ W- T0 t3 K+ T1 W  FType(0) = 0% S4 ]/ q# K/ E$ a- [# ?2 |
  FData(0) = "line"6 l9 j5 A$ f$ v8 T  {% _( \
* _$ g8 v! m" _& l# s$ U
  
8 l/ R0 Y% I1 l5 x5 n$ V  Dim filterType As Variant$ p2 L: i1 _  O5 p
  Dim filterData As Variant
+ o3 T, P& p) O7 U' z4 m+ c1 Z/ v ' filterType = FType
  L. s$ J( D* X, \ ' filterData = FData; G* r. |) s6 b
' ssetObj.Select acSelectionSetAll, , , filterType, filterData4 V& ?( X: ]& L' `; N
'                                                                                'AppActivate userform1.Caption# V! \7 s8 x) x9 Y
'
# n: h  F0 Y& d ' Dim pickedObjs As AcadEntity. `5 ?" O/ C9 A5 |' ?- Y. U% p
' For Each pickedObjs In ssetObj0 |; L" o3 G6 S
'   pickedObjs.Highlight (True)
5 X. B. v" a  J$ c, h ' Next( \; J% i" G0 e2 h& [# \
' ssetObj.Delete
8 E( B9 M9 b! }6 z# {
& X; X8 G; a2 U
$ C) ~* J; O! |' O7 }1 E+ I& w+ A/ m% ^) s8 y
'==========================================================================================================1 @8 h( ^$ B# W. T4 K

7 h% C$ E( a1 ?! J2 \1 z' I) S$ Y3 P% E7 z# `

  a& f. ^& C( e' O* v& P0 T  i
/ ^4 d+ Z6 v2 T    '安全创建选择集
% s. f/ y' \: ]3 V    'Dim ssetObj As AcadSelectionSet+ s- O- u1 m% z3 C0 d* @, t' O" D
    If Not IsNull(acadApp.ActiveDocument.SelectionSets.Item("Test")) Then
, j* B8 `& u6 X3 @$ c        Set ssetObj = acadApp.ActiveDocument.SelectionSets.Item("Test")3 U" Z# L7 ]+ _# y0 D8 x. _# {
        ssetObj.Delete
" P8 O- |' e. X% z" F- X, O    End If3 X5 |, J1 z, |# V+ o- S
   
, D4 Y; l0 O" C" q: y2 v' g    % _1 `! i& @6 G9 k9 s$ h$ K
    '创建选择集) X3 \! z3 G% l! V! G
    Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("Test")
& c: x& s4 g* Z" `8 G    9 |: q+ Z8 h# [6 ^
    '激活CAD窗口2 @5 q. w) @* Z7 @9 _# G
    AppActivate acadApp.Caption
& \* O5 a) {: n" N4 s! p    acadApp.WindowState = acMax1 u6 R0 m3 H3 S  l& O. k
    '提示用户从屏幕选择实体对象,并加入选择集5 p: w: Z' I3 a/ v, S6 }+ b
    ssetObj.SelectOnScreen5 Q$ Z# O7 ^: s- W% k
    ssetObj.Select acSelectionSetAll  '选择所有曲线- v$ H& w# Y+ x1 t
    $ \0 M! h* a# Q; B! w, O
    '选择完毕后按回车键或单击右键
: ]  u7 y* d. N$ `$ @% [% x) J    'Dim pickedObjs As AcadEntity
7 e+ J6 [$ s9 H" I6 r7 W! j    Dim retCoord As Variant
4 t# T/ O6 b% W    For Each pickedObjs In ssetObj
  F$ ^' v0 j. e/ p- Z3 K8 n        retCoord = pickedObjs.Coordinates4 H/ k& \; i7 [* s" k, _9 K
        AppActivate Me.Caption9 ^3 |7 o7 {  D5 v4 I
        acadApp.WindowState = acMin
& s5 j4 F% e7 ~0 e; @' W( R        If TypeOf pickedObjs Is AcadPolyline Or TypeOf pickedObjs Is Acad3DPolyline Then   '普通多义线或3维多段线
  z% i& K* @( K! q5 I8 j4 B            j = (UBound(pickedObjs.Coordinates) + 1) / 3   '多义线的顶点数
( ~% C  S" p( Q% P4 J            For i = 0 To j * 3 - 1 Step 3
/ ~" X& |) w+ y0 `6 e                    If retCoord(0) = retCoord(j * 3 - 3) And retCoord(1) = retCoord(j * 3 - 2) Then  '闭合时6 x- L: y8 i. s' a  E. B
                        MSFlexGrid1.Rows = j
; N5 W; v" y8 K% R$ Q* R, v# M% |- E                    Else   '非闭合时% J5 t  B. E8 E' N  L1 t- R
                        MSFlexGrid1.Rows = j + 1* U  I, {" ?" x( k+ O$ ^
                    End If
: r8 ~) f$ Z: A' M" E                    MSFlexGrid1.TextMatrix(i / 3 + 1, 0) = i / 3 + 1
. `8 d6 N" }; N/ u' ]( P                    MSFlexGrid1.TextMatrix(i / 3 + 1, 2) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000")
1 A; T2 z8 y& u2 O                    MSFlexGrid1.TextMatrix(i / 3 + 1, 1) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000")
5 A; t  }- f7 h9 \# Y, \  N# @
# p0 ?% G' b* k            Next i
6 ?/ r, o( ]" l        ElseIf TypeOf pickedObjs Is AcadLWPolyline Then   '轻便多义线
1 H  u, @- o' d( S, V            j = (UBound(pickedObjs.Coordinates) + 1) / 2   '多义线的顶点数% {2 v' x8 e4 v& w
            For i = 0 To j * 2 - 1 Step 2* i+ e+ m) }- q* t# B" z2 \: ?
                    If retCoord(0) = retCoord(j * 2 - 2) And retCoord(1) = retCoord(j * 2 - 1) Then '闭合时+ o  ]- l. M+ |$ x: W. c. p0 e/ b
                        MSFlexGrid1.Rows = j
# l# W* a( g% H) f& h8 a! f                    Else   '非闭合时
0 u+ j+ E' A) a2 `. f# u, t3 J9 d                        MSFlexGrid1.Rows = j + 1
" c# C; v, c4 r; ?$ I  r) D                    End If* J: P) K* Z+ n) {7 i" g0 `
                    '******MSFlexGrid1中只能列出多段线的坐标******
2 j$ g' w! }9 F6 b# T                    '不支持面域  @: W. ]8 h0 y& D
                    MSFlexGrid1.TextMatrix(i / 2 + 1, 0) = i / 2 + 1! J$ b+ z  v( R( l# F
                    'X坐标" L. G+ A/ ^! h' ?9 e- l5 ~- y) s
                    MSFlexGrid1.TextMatrix(i / 2 + 1, 1) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000")         'X( t- z3 D! z) `
                    'Y坐标: K4 `0 E" V4 _
                    MSFlexGrid1.TextMatrix(i / 2 + 1, 2) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000")     'Y( S% o6 t& k3 o  G
                    '面积! t7 g+ Q8 p! t& |1 M
                    MSFlexGrid1.TextMatrix(i / 2 + 1, 3) = Format(pickedObjs.Area, "0.000") '面积
$ k4 H: |: E6 ?6 y4 T8 l                    MSFlexGrid1.Refresh
+ c2 Z1 x% }+ `0 p            Next i, o$ ?( r: f9 _; P% F  q% P1 P' n
        Else
% t( I& k8 f3 s/ G2 B2 W5 D             MsgBox "您选择的不是多段线!", 64 + vbOKOnly, "地质测量"
7 l: V: u1 _7 \# @6 C             ssetObj.Delete
6 H( X: b1 S: M        End If* z0 }1 t' y% w
        Exit For5 [' ^; }) C' j6 P$ C) _# G
    Next5 i4 l3 X( T" j- m
    '删除选择集4 A4 O9 x' u6 ~5 h5 I
    ssetObj.Delete
; G7 r" P( v. ~8 L" ^End Sub
! e6 \- }8 G* E' C% C
, W$ N& L$ o# Z9 v1 [* l% b+ W'==========================================================7 |  n/ N4 O2 O8 G( y% d

7 V* G2 ]1 L7 y( d7 z  G8 c% U0 h& @[ 本帖最后由 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 )

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