QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
10天前
查看: 3268|回复: 4
收起左侧

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

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

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

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

x
求:
! p$ ~+ M5 `1 Z3 C& H! M4 F  如附件图中所示:由line和arc绘制(非多段线)的多个随机单元格构成的复杂图形中,以已知顶点坐标为第一个点,用VB编程,按照逆时针方向顺序求出每个单元个各个顶点坐标,并求出每个单元个面积,结果写入EXCEL或VB的MSFlexGrid控件中,整个过程不要出现鼠标拾取单元格,要自用运行出结果。
6 @9 E; R$ w8 o# X: ]( {
5 R! c% r8 o" e: G% v9 j/ N. @我的思路是:VB编程,用For……next将每个单元格用类似“BO”命令自动创建边界,形成多段线单元格,然后用以下代码获取多段线单元的顶点坐标和面积,输入到EXCEL或VB的MSFlexGrid控件中。
/ f: o( w) X1 i( {* h
! }+ b, L7 V% p, w- t9 R) X) e: NFor  顶点号
2 X/ m  x1 u& T& y9 d       1、创建多段线单元
/ ]5 z/ D! \  T. H; v/ M       2、提取多段线顶点坐标和面积信息7 F- N8 s$ I/ F/ Z9 x
       3、将数据填写进EXCEL或VB的MSFlexGrid控件中  u+ O- _& C. \' q$ r' V8 a! H/ p
next 顶点号
8 F! s% D* a) \! L* q0 `$ k% j0 H/ X. o, R7 o
; k/ Y! f  X1 U# k
6 ^1 t  E! N$ t3 y, E1 ~
For循环中第三部分代码大致如下:& e+ T, E- t% ?7 G, n
'MSFlexGrid1中能列出多段线的坐标(我从网上下载到的源代码)5 i+ W3 ~4 [$ |; g5 T- x& w
/ k2 r8 B1 y" N( `9 B. Z: \$ [
Private Sub cd多段线坐标查询_Click()2 @% b3 T) y( x( F
'==========================================================8 }" ^; m4 S9 x7 h8 e
  Dim acadApp As AcadApplication
. E" i% C! V; A0 P0 I0 ?  U: o. V  Dim ssetObj As AcadSelectionSet, D! [  i: h0 ~  A. o4 J
  On Error Resume Next
  J0 p7 _# g, M! M; m" M  Set acadApp = GetObject(, "autoCAD.Application")
4 H. }1 g  F" f0 S2 F) `9 z- W4 h1 E  acadApp.ActiveDocument.SelectionSets("hights").Delete5 [  E! x2 {, x8 H
  Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("hights")7 H: `! w$ b. |; _, m! G
  AppActivate acadApp.Caption
2 m' D9 S" E7 B3 b  Dim FType(0) As Integer
: j  W9 e8 @+ ]* Q  Dim FData(0) As Variant6 ?6 W7 D" V- z+ z/ d# q  U5 _
  FType(0) = 0
0 Z8 K( r' [- V' W% p  FData(0) = "line"
) L/ X! `0 F( x: z+ g- w5 z5 {8 k- M( |. l  s, s% y
  
# D0 j% W& B1 [, E8 b  Dim filterType As Variant5 L8 P' y  g/ t  H1 Q
  Dim filterData As Variant
2 O8 X2 G: d* K+ n$ e" ~; ]# j% W ' filterType = FType
: n" i' ]) L& X, w ' filterData = FData
8 d4 P& `8 `/ n2 v5 W ' ssetObj.Select acSelectionSetAll, , , filterType, filterData
, e7 Y7 j0 B, Y. q/ u7 N '                                                                                'AppActivate userform1.Caption
2 Y3 o/ S& o' D! W, e '
: x2 P. F% {- N) w+ i- `" J ' Dim pickedObjs As AcadEntity1 B- r. V- `% L' V5 s) n
' For Each pickedObjs In ssetObj; b+ I( o" ^( C( _( j9 w/ D+ n
'   pickedObjs.Highlight (True)
! p+ Y" b2 e, N1 @& J6 H9 f  } ' Next6 `( S" g1 \1 \& \1 D
' ssetObj.Delete
- \* L, h& H: X6 b' v
2 z4 R3 x" Q( F8 ^( ~( _1 J/ ?4 q/ d6 n7 o5 ~
; u* M* a# r7 |4 K0 b
'==========================================================================================================$ |' B- p$ }3 x' |8 C1 i- j  C; r
4 \' m3 {! j8 K4 W( o+ E
% m1 j) d) b0 F$ r7 v- G# I

4 d! A; _, B! T2 z
9 c" y7 k7 |; u2 e" z3 T    '安全创建选择集& U) t+ L& I5 j' v7 Y
    'Dim ssetObj As AcadSelectionSet
/ a  y% Y4 a, {    If Not IsNull(acadApp.ActiveDocument.SelectionSets.Item("Test")) Then
" h/ r" H2 f2 I& z9 ^, u( r. h2 l        Set ssetObj = acadApp.ActiveDocument.SelectionSets.Item("Test")* S3 Q  X  x$ K7 K
        ssetObj.Delete! h+ Y% c9 a2 J0 G( U( p' u
    End If
$ H5 V# \: f9 P) s    # \" f) U  E2 u2 p, }3 f9 s  p
   
* b# I) [0 g! r6 Z3 f    '创建选择集# `" F4 x5 R: s0 I
    Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("Test")& h/ j, ?; f5 `7 ?- U
   
  c- `! D& R, J    '激活CAD窗口! y! [! N$ r% }+ l# ~! b0 x
    AppActivate acadApp.Caption& Y- E' U* r  `1 _$ S6 z" d
    acadApp.WindowState = acMax+ q( h% @2 b+ C1 t; ~& s& S
    '提示用户从屏幕选择实体对象,并加入选择集
; |0 u6 u6 k; g! n    ssetObj.SelectOnScreen  e; {" N3 `. A) J; X7 r
    ssetObj.Select acSelectionSetAll  '选择所有曲线
2 h) e3 p% E% \1 V. w& X   
1 B7 _- K5 w9 M' c" E4 v; F    '选择完毕后按回车键或单击右键
6 e% m4 D1 D8 @; w- ?2 n    'Dim pickedObjs As AcadEntity  `& F- D" K+ K+ A# y. F3 A. @: P
    Dim retCoord As Variant
2 q) c; `2 F6 V. O' f4 f7 I    For Each pickedObjs In ssetObj
4 v' ?( T+ Y) o8 r5 P        retCoord = pickedObjs.Coordinates
8 d( b* C$ _- h( K        AppActivate Me.Caption
* c) C8 b5 E+ ^/ I% q9 D; \1 y        acadApp.WindowState = acMin
9 i. F, k4 ?8 }' \; a* X* f& r        If TypeOf pickedObjs Is AcadPolyline Or TypeOf pickedObjs Is Acad3DPolyline Then   '普通多义线或3维多段线9 p0 `! {# A6 \/ q
            j = (UBound(pickedObjs.Coordinates) + 1) / 3   '多义线的顶点数2 G4 `) w' V9 K6 ~3 G5 M1 Q1 t) _
            For i = 0 To j * 3 - 1 Step 3
9 X7 j# y" Y) }9 D4 N; a                    If retCoord(0) = retCoord(j * 3 - 3) And retCoord(1) = retCoord(j * 3 - 2) Then  '闭合时
  y/ e4 U( r+ Q7 K: I. y                        MSFlexGrid1.Rows = j9 Z2 b0 s( n1 q! Q% c0 f
                    Else   '非闭合时! ^4 k5 o' a/ |. m. b( ~
                        MSFlexGrid1.Rows = j + 1# {: [  v1 H' `! x3 m5 O2 O
                    End If
' D' @" g7 G" z/ {' E                    MSFlexGrid1.TextMatrix(i / 3 + 1, 0) = i / 3 + 1* s# E2 n' F9 h8 i4 k) @
                    MSFlexGrid1.TextMatrix(i / 3 + 1, 2) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000")% {3 ]2 k0 j/ t' \  d8 Z
                    MSFlexGrid1.TextMatrix(i / 3 + 1, 1) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000")  ?& u! l8 g2 V, ]* ]9 d2 R

4 N* h- l7 q9 ^0 J  V            Next i
  H& q/ M: J) F        ElseIf TypeOf pickedObjs Is AcadLWPolyline Then   '轻便多义线/ k! t/ S6 ]1 n( v. C( z) C' R' }# P
            j = (UBound(pickedObjs.Coordinates) + 1) / 2   '多义线的顶点数# O  e1 k3 _+ Z; Q: S- w8 |
            For i = 0 To j * 2 - 1 Step 27 R- ~2 n6 r' }
                    If retCoord(0) = retCoord(j * 2 - 2) And retCoord(1) = retCoord(j * 2 - 1) Then '闭合时9 G  Z! S: X; X% E. u  v
                        MSFlexGrid1.Rows = j
( ?' L+ A6 J7 a0 x. \                    Else   '非闭合时
. V. |. v$ ]% {. f. v, A                        MSFlexGrid1.Rows = j + 1
5 s3 g/ c# N8 L                    End If
6 Y' h1 m/ E8 }  l* S                    '******MSFlexGrid1中只能列出多段线的坐标******
; r  z  [; e$ x: }3 F                    '不支持面域
# R. \& [  ~% L: f9 j8 r                    MSFlexGrid1.TextMatrix(i / 2 + 1, 0) = i / 2 + 1& t' T5 z' ~6 M9 ?
                    'X坐标
) r3 y! L% l2 b2 e                    MSFlexGrid1.TextMatrix(i / 2 + 1, 1) = Format(retCoord(i) / 1000 * Val(Text比例.Text), "0.000")         'X/ s( K! G* E. _8 r
                    'Y坐标
( t; y4 \: {8 o+ C* S                    MSFlexGrid1.TextMatrix(i / 2 + 1, 2) = Format(retCoord(i + 1) / 1000 * Val(Text比例.Text), "0.000")     'Y
$ e6 s  u2 ^$ }                    '面积
% _, b8 v: h8 a+ J                    MSFlexGrid1.TextMatrix(i / 2 + 1, 3) = Format(pickedObjs.Area, "0.000") '面积
) Y* i9 v  }; b' ?0 ?! m  w                    MSFlexGrid1.Refresh0 R6 B% z& Z$ t/ C$ @
            Next i
" Z! G& Z8 R  Y2 G  u        Else
$ k1 C8 f7 M( c! N! ^! G             MsgBox "您选择的不是多段线!", 64 + vbOKOnly, "地质测量"! g% M# E4 P  h3 ?$ z9 q7 C
             ssetObj.Delete
, X8 Y# l, |  {5 W& u6 I; S        End If
' w. Q' R+ H$ H2 G+ V& `( ]& ?9 Y        Exit For3 b- w! A$ N2 d6 @5 C
    Next& B8 j; C4 |8 g0 i7 S% ?( F4 b  _
    '删除选择集$ x% p* c0 Q. ^; N4 \9 F
    ssetObj.Delete
2 |% b. L9 p7 l# S* s2 @- nEnd Sub) }; s% L% d0 P5 p
' o* s) |' ]1 q
'==========================================================, M) E5 N' V  b( A& h3 y, @, d, e
0 s# e3 W7 p$ e' n& a- O; 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 )

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