QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
求:4 s7 d* e& K: W* o
  如附件图中所示:由line和arc绘制(非多段线)的多个随机单元格构成的复杂图形中,以已知顶点坐标为第一个点,用VB编程,按照逆时针方向顺序求出每个单元个各个顶点坐标,并求出每个单元个面积,结果写入EXCEL或VB的MSFlexGrid控件中,整个过程不要出现鼠标拾取单元格,要自用运行出结果。
: ?  S- o; Z$ `& A- q
- v) E# @4 r: U! l我的思路是:VB编程,用For……next将每个单元格用类似“BO”命令自动创建边界,形成多段线单元格,然后用以下代码获取多段线单元的顶点坐标和面积,输入到EXCEL或VB的MSFlexGrid控件中。2 \+ l+ }! z3 f- A% T  Y
; y" V! H- k& b% P
For  顶点号
! U" Y" U: V0 D. A- I4 @0 S# O" j2 ^       1、创建多段线单元( S% f; E6 Q. ?/ w
       2、提取多段线顶点坐标和面积信息* G- T) a, T# c
       3、将数据填写进EXCEL或VB的MSFlexGrid控件中7 n2 \7 \) r/ g% D' x7 V- a
next 顶点号
2 T9 D$ K! o, i' @* n* p- h. e1 N0 p5 \  I1 s
9 v! D4 r& ?* R) d" Z
4 Q& T  a- U  k/ I1 S6 t2 J
For循环中第三部分代码大致如下:% d3 i* u5 q6 [- o9 z$ Q
'MSFlexGrid1中能列出多段线的坐标(我从网上下载到的源代码)% F  `# j/ g9 W# n- v: v& |/ U( b
; l" A( X" X( [3 W2 c# s
Private Sub cd多段线坐标查询_Click(); p1 z- z& Q. J) ~
'==========================================================; O: p; j6 P) ?3 v( ~2 S
  Dim acadApp As AcadApplication
3 J. h! k2 k! I5 s# \  Dim ssetObj As AcadSelectionSet
5 w# k) H: i' E2 S8 b. H  On Error Resume Next
4 y0 o6 T7 L+ h1 o% D" a" k6 X' I0 w1 i( }  Set acadApp = GetObject(, "autoCAD.Application"), Y; M7 I6 E, P% ^
  acadApp.ActiveDocument.SelectionSets("hights").Delete8 q: c0 [- o/ H* I" q) \6 K/ F8 T* q
  Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("hights")
1 g* c) b$ M& a( U/ |. L' I+ P  AppActivate acadApp.Caption
, F" G$ A/ N3 i2 t8 Y' e9 S  Dim FType(0) As Integer6 |4 K( T9 s# W; ]- w) y
  Dim FData(0) As Variant
, v# ?6 L% ^! N" _  FType(0) = 0
  r+ O7 t9 a# T) u. e" a* z  n  FData(0) = "line"
, f! Q- _+ i" H
# v3 v+ X4 |5 b5 Z( `! o0 k  
7 f" e0 L- I' A% I; Q/ k  Dim filterType As Variant
( A7 x6 v, K, }: B. E  Dim filterData As Variant
5 ]" x8 h: ]1 K7 j0 f. D ' filterType = FType
9 r6 C' g1 p# Z ' filterData = FData
! y4 s, m  I* P% }0 ]+ q! F ' ssetObj.Select acSelectionSetAll, , , filterType, filterData! f) L( @; J1 ]7 _6 P6 I
'                                                                                'AppActivate userform1.Caption
2 n+ s3 Z6 D( V '  h% c' W& x4 N8 b
' Dim pickedObjs As AcadEntity3 a9 Z9 G8 n- f% v9 H. |% |
' For Each pickedObjs In ssetObj
  b' K. k3 |8 ]. T' Z1 @. G '   pickedObjs.Highlight (True)- m( s* m8 c4 F# q
' Next
/ g2 D# G* i7 k/ N ' ssetObj.Delete
" G6 x2 \- {7 N4 }$ S5 a* Y7 a. s! y9 y( |" I
4 j4 l# @8 c) A2 {

. _3 {( J* q: e* _'==========================================================================================================% f7 N1 ?; }% i( G/ ~4 V

; q* z" t- F2 l; ^6 l5 d/ {& o: J+ O% I

& S. a# Y8 h& d: o$ x. E' K, n1 o. ]2 H* R6 b7 \
    '安全创建选择集
9 ]8 n# c- S/ ?& Q2 Y    'Dim ssetObj As AcadSelectionSet
' z' ~- ]# X4 p* `. [' N    If Not IsNull(acadApp.ActiveDocument.SelectionSets.Item("Test")) Then# [: V% r  ?' f9 T
        Set ssetObj = acadApp.ActiveDocument.SelectionSets.Item("Test")
$ y3 w( y# }, l+ v/ {# D        ssetObj.Delete
% N7 r" p) @. d8 U" Z    End If7 `3 ^5 Y0 j% A% U; B4 Y/ k: {
    2 |/ [& q8 H4 R% m  J
    & G* g3 z2 d! l# M/ V2 f6 G
    '创建选择集5 ^9 i5 z2 Y0 l: B/ {
    Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("Test")3 E0 Y, p, ]5 m; }1 s# B
    % |; s8 S: H2 B! ~9 R
    '激活CAD窗口
% U: @0 |# q! D4 f- V) q    AppActivate acadApp.Caption+ V. u0 x9 v6 x3 A8 c- k
    acadApp.WindowState = acMax1 l  [; S% A0 |8 r: i5 J
    '提示用户从屏幕选择实体对象,并加入选择集
! H/ e  p% _2 @    ssetObj.SelectOnScreen
; A* r+ A) ?8 h, H    ssetObj.Select acSelectionSetAll  '选择所有曲线2 i( T/ W" ?0 ~) N5 a
    ) E+ `  J0 f" @$ ~
    '选择完毕后按回车键或单击右键
: U& l! L: P2 A0 `3 x+ X! C% t    'Dim pickedObjs As AcadEntity7 \6 D# W! S& C# M( n
    Dim retCoord As Variant' u& h) }6 p6 j- Z
    For Each pickedObjs In ssetObj
# o0 p& l: ]1 T/ ~0 d        retCoord = pickedObjs.Coordinates
2 U5 w2 d# Q% z% D: Q; A6 z/ i        AppActivate Me.Caption
4 w7 m  ]3 Y8 R" @        acadApp.WindowState = acMin& L/ ]$ p4 I' L
        If TypeOf pickedObjs Is AcadPolyline Or TypeOf pickedObjs Is Acad3DPolyline Then   '普通多义线或3维多段线
% Y: V- W7 B4 T# ^0 e" b% `) X/ h% B. u            j = (UBound(pickedObjs.Coordinates) + 1) / 3   '多义线的顶点数
# V' |# A5 v$ h            For i = 0 To j * 3 - 1 Step 3
/ V* z1 z; [8 X                    If retCoord(0) = retCoord(j * 3 - 3) And retCoord(1) = retCoord(j * 3 - 2) Then  '闭合时
& ?1 h/ D  Y+ y2 F                        MSFlexGrid1.Rows = j
: s: y2 B& c2 h  W                    Else   '非闭合时6 \8 U9 }, Y( D% W& X7 r# f
                        MSFlexGrid1.Rows = j + 1
) w  @# r! Q- [5 K. w                    End If& b* N% Y7 F+ Z) o& }/ }
                    MSFlexGrid1.TextMatrix(i / 3 + 1, 0) = i / 3 + 1. }' C3 D, }* w% r4 A0 |5 n
                    MSFlexGrid1.TextMatrix(i / 3 + 1, 2) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000")* _& s! q, P+ x1 ~; l
                    MSFlexGrid1.TextMatrix(i / 3 + 1, 1) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000")
2 I7 T2 R4 e' L& G+ G: A4 w' q. _" X/ i3 S1 C; s
            Next i2 k6 [  F: r3 i+ o
        ElseIf TypeOf pickedObjs Is AcadLWPolyline Then   '轻便多义线1 Q% ^. k. f6 t7 J+ `# S1 W
            j = (UBound(pickedObjs.Coordinates) + 1) / 2   '多义线的顶点数2 s! b# \4 s, R$ _- @- R
            For i = 0 To j * 2 - 1 Step 2
0 u4 o+ U3 W  l3 a$ y                    If retCoord(0) = retCoord(j * 2 - 2) And retCoord(1) = retCoord(j * 2 - 1) Then '闭合时$ z' M% \7 d8 W2 ~% [  K! B6 W& q
                        MSFlexGrid1.Rows = j
- M3 _# F* l' Q5 K2 W  v% ~* {                    Else   '非闭合时+ @  ^! m! g1 s' D% t
                        MSFlexGrid1.Rows = j + 1# a9 u4 w. q- o6 a
                    End If
" [  e7 n  s/ }. Z                    '******MSFlexGrid1中只能列出多段线的坐标******) v/ @. _8 U! S! t# X  f
                    '不支持面域
6 \& z, |6 k- Z6 z                    MSFlexGrid1.TextMatrix(i / 2 + 1, 0) = i / 2 + 1
9 _/ s: h2 P5 |0 C  A5 S" A% x9 n                    'X坐标: M2 s+ a& V, W% l4 J3 t# X
                    MSFlexGrid1.TextMatrix(i / 2 + 1, 1) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000")         'X  N5 n5 ]$ k3 e6 T
                    'Y坐标
5 H+ e( p+ I: g, [. j% _                    MSFlexGrid1.TextMatrix(i / 2 + 1, 2) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000")     'Y
5 E3 g$ ?! E* m5 b4 G$ o                    '面积) `  [- x* T+ z6 O& H; o1 ~
                    MSFlexGrid1.TextMatrix(i / 2 + 1, 3) = Format(pickedObjs.Area, "0.000") '面积
& ?( J( D% P! \9 q0 O                    MSFlexGrid1.Refresh8 b; n5 J  M" Y% J
            Next i8 r7 z0 R* z  w) d
        Else
; ?0 w; @9 f  _) O             MsgBox "您选择的不是多段线!", 64 + vbOKOnly, "地质测量"( J% z3 `( U& b9 x8 c/ I# ?
             ssetObj.Delete
: ~! t3 B; e' ?* b7 p        End If
1 q2 H$ O% V& b0 |7 ]9 {/ r+ c) p        Exit For0 C4 B# V! M2 M2 n; w1 k
    Next7 s) a2 q2 T8 k$ [/ {
    '删除选择集
0 J) ?5 H- a* e& m, b- P5 d. q1 }7 a3 s    ssetObj.Delete
& Y5 z7 W; K6 M0 B' W0 e7 EEnd Sub- u0 G. @0 _0 A7 i: D" B  R0 M+ L
% o4 k' q4 c, f7 J$ u
'==========================================================
/ B. _" T% J( ^  C% s7 q  d% q' F# \6 h  l3 `$ [1 f8 c9 ~$ T8 e
[ 本帖最后由 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 )

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