QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
9天前
查看: 3306|回复: 4
收起左侧

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

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

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

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

x
求:
1 _8 A  \; w3 E# w. Z) `9 p, y  如附件图中所示:由line和arc绘制(非多段线)的多个随机单元格构成的复杂图形中,以已知顶点坐标为第一个点,用VB编程,按照逆时针方向顺序求出每个单元个各个顶点坐标,并求出每个单元个面积,结果写入EXCEL或VB的MSFlexGrid控件中,整个过程不要出现鼠标拾取单元格,要自用运行出结果。
9 J# l- f4 ]9 m+ ^, l- M% v+ d2 I2 ]8 |
我的思路是:VB编程,用For……next将每个单元格用类似“BO”命令自动创建边界,形成多段线单元格,然后用以下代码获取多段线单元的顶点坐标和面积,输入到EXCEL或VB的MSFlexGrid控件中。
1 T" k, A; [. }+ t4 g' `) m. U1 v
For  顶点号8 t; R9 x! w8 S5 `( G0 p' C
       1、创建多段线单元4 X% ~& b$ \5 b  y) g
       2、提取多段线顶点坐标和面积信息  \4 s+ s& R" H# k8 u
       3、将数据填写进EXCEL或VB的MSFlexGrid控件中$ r0 t# g" f( e' t  C  k
next 顶点号, P+ K5 T* `0 x: m! b

8 E1 M' O% F. P! K, C3 d% p
- i  p: M, B% ~2 R
% a! o5 p# g* W6 h, @& P  _6 IFor循环中第三部分代码大致如下:$ l% C% W: j* [/ }# a) c8 l
'MSFlexGrid1中能列出多段线的坐标(我从网上下载到的源代码)  m+ n1 f; M. q% r& U( k0 u; l* X

8 @) [7 [5 R2 B# fPrivate Sub cd多段线坐标查询_Click()6 \( e& {  B4 K
'==========================================================3 T8 o* X8 ^4 C, n! F% y
  Dim acadApp As AcadApplication7 y% R' S3 n, I9 z& `% N! r- {5 _2 T4 `
  Dim ssetObj As AcadSelectionSet- P+ M0 m3 ]8 u/ ]+ e" c% ]+ x
  On Error Resume Next
3 e9 l1 P9 J/ |  Set acadApp = GetObject(, "autoCAD.Application")7 w: M' Z6 V6 h" s
  acadApp.ActiveDocument.SelectionSets("hights").Delete& K& F+ k& U/ D( {, h( E
  Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("hights")
  |. B! l) v2 T  v3 L  AppActivate acadApp.Caption
# e0 Z% ~. h( }/ A% [  Dim FType(0) As Integer" K% O* A1 @/ O& q" ~4 m! }- X
  Dim FData(0) As Variant' c! `: U; V- f2 j7 k7 _% W
  FType(0) = 0
1 @# A: r7 I" l% j% M/ N/ s* s9 h% c  FData(0) = "line"
; p: [: Z# R6 Z3 n" k% j" E& M, Y/ I( M) ^( K
  
0 @2 J, K: K9 U6 m0 @* e% h: f% w  Dim filterType As Variant
. t+ ]0 I1 [8 d2 F: }) C% g  Dim filterData As Variant
4 u) H5 m- s% \: o8 {0 @! S ' filterType = FType& e$ J- l& k; {+ t# }9 _" t
' filterData = FData
8 w. i- Q' {4 T& d ' ssetObj.Select acSelectionSetAll, , , filterType, filterData) M: B8 B. B3 E# z2 e+ |8 k
'                                                                                'AppActivate userform1.Caption
6 F# U  r# }4 ?1 d1 a '
$ W8 m  ^$ B+ ?, k% ~4 v ' Dim pickedObjs As AcadEntity! z  |9 \1 R/ R: @- y3 }7 s$ G* r8 g
' For Each pickedObjs In ssetObj: l$ O7 A& C* t7 _$ Q2 }: A" \
'   pickedObjs.Highlight (True)- T3 `4 W: a: p
' Next5 A6 ^, J4 E; A3 L2 n% v% ~* U" q
' ssetObj.Delete4 \' j& Q8 p- H0 p
; `# {, i& d/ ?* b* x
& c6 `1 r, A, Z+ w8 e

4 p3 @' _& G! B% v'==========================================================================================================/ f4 y% L8 T; j# g% W: _" U1 {

9 c3 k9 X6 Y3 d! n& k- p/ `" r9 B; R) c3 f# \4 P: l: F+ C5 p
2 n$ O8 b1 x( B/ S4 ~: O

8 [) I5 q4 _+ V    '安全创建选择集7 ?$ g* A3 g6 [; Q0 J/ ^
    'Dim ssetObj As AcadSelectionSet
, U) y* N" `, L) _    If Not IsNull(acadApp.ActiveDocument.SelectionSets.Item("Test")) Then) D4 i5 ?1 C6 Y5 M$ Z  I% j3 D5 G
        Set ssetObj = acadApp.ActiveDocument.SelectionSets.Item("Test")
% S# T( v2 L/ Z- E' ~; s        ssetObj.Delete' `7 q  N9 \) [% _7 G- H& g3 i
    End If+ C" ^& p$ l6 [: Y+ g2 ]5 }/ u9 }' c
   
. Q% i" J, g  M* P! M" o    - ]" Q; y6 |! F0 b) R. u
    '创建选择集: S3 P2 }- j' v! h1 s* g7 s% T4 U
    Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("Test")
1 I" b5 w1 h  Y5 E: A: o# n$ o    # o5 @( @: m' U. b: s! D  t+ X
    '激活CAD窗口
; m$ |* f) B. |3 C$ g! I7 w; ~    AppActivate acadApp.Caption
( Q% W/ x- r( R( N9 T; l" w0 r# y    acadApp.WindowState = acMax# `2 O" X. I1 ?8 m; U' z6 K
    '提示用户从屏幕选择实体对象,并加入选择集" A; N* F4 i& h. e0 K" P
    ssetObj.SelectOnScreen- w9 w$ H/ K" K2 e8 Z& S3 F# Q5 [
    ssetObj.Select acSelectionSetAll  '选择所有曲线  y: }0 M- ^1 r' L9 E: @' O* g
      e- S' c7 ?6 ~( t( A
    '选择完毕后按回车键或单击右键
( C6 q1 l; b9 h9 \+ h    'Dim pickedObjs As AcadEntity  d9 T- E0 R* y' m
    Dim retCoord As Variant
8 D' `# Z6 B( i' V    For Each pickedObjs In ssetObj
& G+ P6 L. P1 m        retCoord = pickedObjs.Coordinates
+ J& r. X- K5 O        AppActivate Me.Caption
- p" m8 O$ @& M' N- {. r4 U        acadApp.WindowState = acMin9 Q% v# ~" c7 M7 h
        If TypeOf pickedObjs Is AcadPolyline Or TypeOf pickedObjs Is Acad3DPolyline Then   '普通多义线或3维多段线; T6 z, e( \: p7 o1 Y
            j = (UBound(pickedObjs.Coordinates) + 1) / 3   '多义线的顶点数7 @  v* \: \0 a& H9 ^, F- `- b% r
            For i = 0 To j * 3 - 1 Step 3* v" z, A% W1 {/ |- X" \/ e
                    If retCoord(0) = retCoord(j * 3 - 3) And retCoord(1) = retCoord(j * 3 - 2) Then  '闭合时/ H3 U: C; Q) J/ E+ A( V# G* M
                        MSFlexGrid1.Rows = j
) \. k4 h* a+ z/ T# r* |5 T                    Else   '非闭合时
1 s- x0 ]. N* J! O! j& _                        MSFlexGrid1.Rows = j + 1
' f0 G( M) L, l0 Q0 u7 ^                    End If* S) K8 @0 d* l  U8 p. j4 E
                    MSFlexGrid1.TextMatrix(i / 3 + 1, 0) = i / 3 + 12 u" h2 e4 b7 U( z4 U( _) v
                    MSFlexGrid1.TextMatrix(i / 3 + 1, 2) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000")" y* b- @5 k, w. Z, O# f0 z- ?
                    MSFlexGrid1.TextMatrix(i / 3 + 1, 1) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000"): b# r, @6 Q+ i7 K" C& {! P

4 c( t) Z  l$ t            Next i: R3 D" t/ y8 a0 p# m, e- O
        ElseIf TypeOf pickedObjs Is AcadLWPolyline Then   '轻便多义线
9 z5 a8 ^) m: ?$ w( m% I            j = (UBound(pickedObjs.Coordinates) + 1) / 2   '多义线的顶点数
7 J1 l/ u6 c- B  l1 Y6 |9 [+ E" @            For i = 0 To j * 2 - 1 Step 2
* f/ w& B4 L+ A2 M9 A8 ?                    If retCoord(0) = retCoord(j * 2 - 2) And retCoord(1) = retCoord(j * 2 - 1) Then '闭合时7 B* M7 @- _# M- P5 |( A( o
                        MSFlexGrid1.Rows = j7 b( T) ]" ^4 L6 i# f% u
                    Else   '非闭合时
6 f6 @) W7 R! \/ e1 C+ j% L                        MSFlexGrid1.Rows = j + 1. [4 }0 y- k* B3 X! w* ]  ?. m
                    End If
  g2 V( H" Q* v6 D- a$ a4 t                    '******MSFlexGrid1中只能列出多段线的坐标******
! h: _# @4 J7 S; {                    '不支持面域7 S5 c$ ~) K( r& B
                    MSFlexGrid1.TextMatrix(i / 2 + 1, 0) = i / 2 + 1
, X; \0 e9 R0 S1 w; E                    'X坐标
% J% o$ j1 B, k3 G, y! ^# V1 z2 H                    MSFlexGrid1.TextMatrix(i / 2 + 1, 1) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000")         'X
, g9 D3 S' a+ d" y5 P. f2 P" [                    'Y坐标* c( m' n6 ]9 A
                    MSFlexGrid1.TextMatrix(i / 2 + 1, 2) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000")     'Y
, m- a/ X# A; k, x                    '面积
: l- @$ L7 a# o; s0 e# B' S/ I1 {                    MSFlexGrid1.TextMatrix(i / 2 + 1, 3) = Format(pickedObjs.Area, "0.000") '面积
6 e: E0 `3 H( T$ n, b  e5 b                    MSFlexGrid1.Refresh
! C; U: r5 I' C/ s: l            Next i0 k+ V! p& J# r: q4 L8 p8 _
        Else7 A) A' W0 _( r# T' d& w/ X
             MsgBox "您选择的不是多段线!", 64 + vbOKOnly, "地质测量"
/ G" s( S  P1 M# I             ssetObj.Delete% b9 W6 ~" J) f8 Z! m& q) @
        End If
7 W) `4 x& N% s7 W7 `1 P* y2 R        Exit For5 y: k0 D0 G- n  l+ C4 {
    Next8 T( ~1 r5 l& j9 j: s
    '删除选择集
  N+ Y! s2 Y! i  L    ssetObj.Delete
/ W4 m8 n  k+ i- t' Y8 q3 MEnd Sub0 q; Z* [4 x( L

, Z) T& N. l6 s# i6 O( ^. {'==========================================================
% i0 t' ]9 S1 ^# |+ |  ]5 m/ U; }# o
[ 本帖最后由 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 )

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