QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
求:
, o# J7 [6 n" ]  如附件图中所示:由line和arc绘制(非多段线)的多个随机单元格构成的复杂图形中,以已知顶点坐标为第一个点,用VB编程,按照逆时针方向顺序求出每个单元个各个顶点坐标,并求出每个单元个面积,结果写入EXCEL或VB的MSFlexGrid控件中,整个过程不要出现鼠标拾取单元格,要自用运行出结果。
7 w% b- m9 z& @# T3 e2 A
5 S( o( r/ v0 a0 Z+ x0 _% l我的思路是:VB编程,用For……next将每个单元格用类似“BO”命令自动创建边界,形成多段线单元格,然后用以下代码获取多段线单元的顶点坐标和面积,输入到EXCEL或VB的MSFlexGrid控件中。
$ \& `$ E5 ]; i" e2 y" I# L5 d0 d2 y" Z' ]3 W5 N$ h
For  顶点号# G( i  o0 f9 [' }( u+ N' Y( A( k4 z
       1、创建多段线单元8 x; G/ c# N" _0 b
       2、提取多段线顶点坐标和面积信息* x0 O( W' J1 }- r4 k& ]" C1 {
       3、将数据填写进EXCEL或VB的MSFlexGrid控件中
: I) M8 a) c2 s4 f4 T7 Y7 K next 顶点号" ]4 Y, b8 {& [) \
6 j: X8 o2 I0 [

% `. v) W$ A- ^! F5 w6 w$ q% a7 {6 I/ W+ v) J+ M* U
For循环中第三部分代码大致如下:
( u0 K. X/ i! V: r0 e! o$ e2 X- F- W+ j'MSFlexGrid1中能列出多段线的坐标(我从网上下载到的源代码)
9 G8 c. u3 g& W8 |0 r7 g- \& B  \6 w/ Q, K
Private Sub cd多段线坐标查询_Click()  A; k: i, i* h1 o0 r5 j) M' ^: @
'==========================================================6 U" Y2 i9 x8 t  Z( ~9 J6 j* i' _) p
  Dim acadApp As AcadApplication) f7 n' I0 g2 d, x& Y4 I. c) e3 F
  Dim ssetObj As AcadSelectionSet
" F$ Q9 z% m" a& v  On Error Resume Next; c4 ~8 O% R1 P0 h# F5 N0 k
  Set acadApp = GetObject(, "autoCAD.Application")
  s- x2 m. G& P  acadApp.ActiveDocument.SelectionSets("hights").Delete; ~% O6 y9 s+ v) l0 L% B* y
  Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("hights")( ^* W7 X3 h" j* P9 o: q
  AppActivate acadApp.Caption
0 {& L" O) Q! d  Dim FType(0) As Integer
$ M7 @& P9 _- O! C! a5 K  [4 I+ z8 Q  Dim FData(0) As Variant# x. H* K/ j; Q0 C% P$ v
  FType(0) = 05 O2 T$ [  L/ ]* R" `$ E+ U
  FData(0) = "line", \$ T1 j/ m. l8 z3 I4 P, _+ q  ?- I
5 G5 ]7 u( v( |% A9 h1 h
  1 X3 `) q7 J, K& b0 T) g
  Dim filterType As Variant' @% k5 ?- @- p
  Dim filterData As Variant
0 k% [% ?3 t/ M3 ~. e ' filterType = FType+ Y# w1 S1 q# g) }, s3 S" v
' filterData = FData% V7 _0 i( Z/ L' H
' ssetObj.Select acSelectionSetAll, , , filterType, filterData
' w3 `& ^6 h7 s: Y% W$ Z '                                                                                'AppActivate userform1.Caption
2 Y6 ^0 w+ ~$ S# A '7 z) U7 z) |' S
' Dim pickedObjs As AcadEntity8 q. h. k% D. q( A7 S# E9 J- n( H% |1 a
' For Each pickedObjs In ssetObj( ~) Z: o. k) \( L8 O! A) l( k6 D
'   pickedObjs.Highlight (True)0 |0 _, `1 v7 y, R( R
' Next
* H  [) m- f% s ' ssetObj.Delete
4 q5 {4 k2 w2 \3 I& F4 I+ ]
( q5 ], U! ^# V7 G: |; R  A4 [- N6 @8 K& n: r

  b8 A* j4 K- s2 I- h& i'==========================================================================================================( f6 o% Q; c1 n, Y6 g
' k! U( O) e% w$ G( }! O8 c' H! b

0 R! N& l: M% Y; Y2 y4 i% V
) n/ y) p/ i0 z' g! |8 ^  |! Y& d- h. W3 ^
    '安全创建选择集
8 Z) P( w+ o/ ]# y    'Dim ssetObj As AcadSelectionSet
+ g* S1 g$ c2 [. u- M, n. ?5 ~' f    If Not IsNull(acadApp.ActiveDocument.SelectionSets.Item("Test")) Then
8 D! p  n7 e5 z- ]        Set ssetObj = acadApp.ActiveDocument.SelectionSets.Item("Test")
' ~5 D, I" u: I! r2 _" K+ i& i        ssetObj.Delete2 K  B7 g: X# X5 g3 N9 c
    End If4 @7 u. W/ P3 E/ [5 P" k+ L, |: G
   
8 @( X. K5 i- H8 f$ p0 J   
5 r' r9 Z+ V4 S8 V+ g# k) ^    '创建选择集' O! ^3 x# y3 E# k9 G6 j1 u
    Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("Test")
7 F4 G+ |) q* x$ t' ?    2 O1 E% ]  I8 ?, u- f
    '激活CAD窗口8 N' U# n: M) F1 @+ f( L
    AppActivate acadApp.Caption; Z! I2 W3 {2 O" i$ k+ D" u
    acadApp.WindowState = acMax9 F6 B/ o, G( U
    '提示用户从屏幕选择实体对象,并加入选择集) I: G  S" a- a- z" p
    ssetObj.SelectOnScreen
& r* s0 ^! U1 D5 J  _1 N1 U& g9 I    ssetObj.Select acSelectionSetAll  '选择所有曲线
( [5 L( O! z; L+ s, ?( n   
- E! T5 Y6 a' c' d+ D' R    '选择完毕后按回车键或单击右键1 f  P4 K/ A* F8 w# m; q0 a
    'Dim pickedObjs As AcadEntity7 d, h  I5 l; g! E5 {) C
    Dim retCoord As Variant
1 {6 i5 {. V) A: E    For Each pickedObjs In ssetObj, {3 z/ Z2 N7 q9 F
        retCoord = pickedObjs.Coordinates: l$ F9 I: u* K% ^0 P, G) d& x/ k
        AppActivate Me.Caption
* {) P( \8 T! V- e$ ~        acadApp.WindowState = acMin
" t- E0 n) n$ Q$ u  f: ]        If TypeOf pickedObjs Is AcadPolyline Or TypeOf pickedObjs Is Acad3DPolyline Then   '普通多义线或3维多段线2 `7 K* ^4 N* O. n8 x, L. y
            j = (UBound(pickedObjs.Coordinates) + 1) / 3   '多义线的顶点数2 `9 X- }. m( u
            For i = 0 To j * 3 - 1 Step 3
) O" t, Z, @& S* O, Y4 p                    If retCoord(0) = retCoord(j * 3 - 3) And retCoord(1) = retCoord(j * 3 - 2) Then  '闭合时& I2 v0 C5 J( b+ h' p; F9 ]
                        MSFlexGrid1.Rows = j" V$ S) E2 F9 e! D
                    Else   '非闭合时
) D, Y% B$ }$ v2 E% x                        MSFlexGrid1.Rows = j + 1
; t: p: h& K+ s6 I& O                    End If
, m& k% L% O# a                    MSFlexGrid1.TextMatrix(i / 3 + 1, 0) = i / 3 + 1" c% F+ f  L0 V2 H
                    MSFlexGrid1.TextMatrix(i / 3 + 1, 2) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000")! c1 x; I. e2 |% D/ k4 h
                    MSFlexGrid1.TextMatrix(i / 3 + 1, 1) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000")& _3 y* y, X% w$ K2 a

4 H; I! A' K" F: ?8 k            Next i# M3 a/ M- m: l/ z4 U
        ElseIf TypeOf pickedObjs Is AcadLWPolyline Then   '轻便多义线
2 I+ U4 @; p7 o7 D, e            j = (UBound(pickedObjs.Coordinates) + 1) / 2   '多义线的顶点数2 M/ P4 P# c( b5 @
            For i = 0 To j * 2 - 1 Step 2
. `* g6 r4 J! u' X                    If retCoord(0) = retCoord(j * 2 - 2) And retCoord(1) = retCoord(j * 2 - 1) Then '闭合时
' c+ f6 d  i0 v& {                        MSFlexGrid1.Rows = j
; o/ C) g$ f8 Z                    Else   '非闭合时  N7 {; w7 ]1 y
                        MSFlexGrid1.Rows = j + 1
+ t# A$ T2 l6 t5 m                    End If. `% W5 J+ Z  f
                    '******MSFlexGrid1中只能列出多段线的坐标******
  Q( B1 n4 b  v$ f2 X                    '不支持面域
9 \/ H- f3 G( L* o# @) S                    MSFlexGrid1.TextMatrix(i / 2 + 1, 0) = i / 2 + 1
+ U$ @5 Z, J; W0 r' D4 x( ~                    'X坐标- u1 _) R" L$ Y! O& t
                    MSFlexGrid1.TextMatrix(i / 2 + 1, 1) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000")         'X
9 d3 M" t0 k, I' i  v3 l                    'Y坐标; Z* P- f$ o* O$ d6 }( c7 h. P; W) z
                    MSFlexGrid1.TextMatrix(i / 2 + 1, 2) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000")     'Y/ _1 I( D# |* b7 o3 A6 |! J; \. r
                    '面积
' w, g, x! B" {8 \3 _                    MSFlexGrid1.TextMatrix(i / 2 + 1, 3) = Format(pickedObjs.Area, "0.000") '面积
. E% ?1 \! z6 Q+ o6 h$ B                    MSFlexGrid1.Refresh& u" ~0 I5 Q; X) P% Y/ R: a
            Next i
4 i( O  Q4 a% F$ ^# z        Else
& f5 B: }9 K4 a             MsgBox "您选择的不是多段线!", 64 + vbOKOnly, "地质测量"
+ l0 @, F8 _& Y) D             ssetObj.Delete! @6 L+ `1 K+ N0 J+ |" y
        End If* ^7 K5 L* v/ |, h7 z
        Exit For) H$ K) |2 V; ]. n
    Next; o- b! H2 C3 _+ |2 G8 F
    '删除选择集
( x. _* r' ]2 ]" Z8 P6 a    ssetObj.Delete
  ]. u* }2 n/ T6 uEnd Sub. D/ K4 m6 Q- c

6 U3 l/ ^' r( y. q$ w5 Y'==========================================================6 x/ k4 n+ U2 x+ d7 w6 ~
0 c  V$ T' g4 B$ H# U
[ 本帖最后由 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 )

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