|
首先声明,由于对楼主所在行业一窍不通,只能通过楼主在帖中提供的信息来推测符合楼主要求的规则和方法,错误和遗漏在所难免,还望谅解,以下内容仅做为意见和建议供楼主参考:
3 s# I K% k' L; v一.由于楼主要求用EXCEL输出,所以用LISP是不合适的,这是VBA的长项;
n' d0 ]0 [9 Q1 f二.楼主在"2.jpg"中提供的数据样例,疑似来自B1K46+360,而不是B1K46+350(详见附图)
! W u4 K" p7 o/ ?1 w' ^' ^6 Z
/ {6 K- u3 Q5 |0 X/ J E; L4 E3 H% q; k: j& @7 |8 J
以下按此数据来自B1K46+360看待; L! Q3 p$ W. p+ v7 _
三.初步拟定规则和方法如下:' T' V) o7 J( {1 {4 B y: N# T
假定:$ n+ y: r1 ]) P H' R
1.所有需要处理的图形和注释都在已打开的当前DWG文件的当前布局,且所有图形和注释都在WCS的XY平面上,都是二维的;7 k, C6 w. Y$ ]/ Z( g
2.位于"zhix"图层的所有直线都是某个横断面唯一的"路面中心"线,且所有横断面都有一条"路面中心"线;
: n- H( m& i4 a2 X 3.每一条"路面中心"线都对应存在一个或多个Y座标小于"路面中心"线下端点Y座标的,位于"shuju"图层的单行文字,其中与"路面中心"线下端点几何距离最近者是该断面的"桩号",按其全部文字内容输出"桩号"数据;# m9 T0 l2 F; b O4 g$ L* U
4.每一条"路面中心"线都有一条且仅有一条代表横截面的位于"sjx"图层的二维多段线与其相交;& T8 S `7 ~/ d q6 L7 r
5.由于在图上测量得知"路面"部分最大斜度为1:0.03,所以,该多段线中角度为±0.05弧度,π/2±0.05弧度,π±0.05弧度和3π/2±0.05弧度的线段均不予理会,其它线段做为"边坡"看待,并按其与中心线的水平位置关系输出其"左右"数据,按其实测长度输出其"长度"数据,按其角度的余切值的绝对值输出"坡率"数据;1 K! U$ O, W: r
6.输出的"xls"文件的路径和文件名,除扩展名外其它都与"dwg"文档相同; j" x3 X( B, @/ \) \9 ^4 U) v
四.按以下规则编写的VBA代码如下:; j6 s b; c. ^ [. c4 g! a1 G& s
3 z2 j2 T( k' D- \5 s N- Sub HDM()
3 N7 ]& ^4 c' X3 E5 x1 W% ] - Dim Excel进程 As New Excel.Application, Excel文档 As Excel.WorkBook, Excel工作表 As Excel.Worksheet, Int行号 As Integer
+ ~: N: L: d) @. F; | - Dim Ss中心线 As AcadSelectionSet, Ss多段线 As AcadSelectionSet, Ss文字 As AcadSelectionSet, Ft(1) As Integer, Fd(1) As Variant: `/ X) C1 U- _" t8 C
- Dim Lin中心线 As AcadLine, Txt文字 As AcadText, Ent多段线 As AcadEntity
. O1 x, U3 N5 g - Dim Var中心线下端点 As Variant, Dbl文字与中心线最小距离 As Double, Dbl文字与中心线距离 As Double, Str桩号 As String
% s9 [9 I. u& {5 [. D# P - Dim Var中心线与多段线交点 As Variant, Var多段线顶点 As Variant, Dbl线段起点(2) As Double, Dbl线段端点(2) As Double, Dbl线段角度 As Double
/ s# |5 [4 \2 ~' I. [6 `* @1 f0 G - Dim Int循环变量 As Integer, Int循环步长 As Integer
" j. K- C+ Z# Q, h& @ - On Error Resume Next, u: g3 ^. P" M
- '创建三个选择集,分别选择中心线,横断面多段线和包含桩号的单行文字0 @3 p9 T7 W! b6 ], {" M2 ~4 r
- With ThisDrawing.SelectionSets5 |" K" H* ~' B- ?4 j6 B) _0 V
- Set Ss中心线 = .Add("中心线")! t# B. j3 I2 S/ K7 `9 L( S
- Set Ss文字 = .Add("文字")' W+ `4 @/ q8 a3 Q
- Set Ss多段线 = .Add("多段线")6 V& }& F8 ~, H2 @% ~/ |' L
- End With
1 Y2 s% `1 a6 h1 V0 @5 `! @- A - Ft(0) = 0
. O& l/ J. f! S& r* O. f - Fd(0) = "LINE"
* x9 d, o3 n- c4 T M - Ft(1) = 8, Z: r, w% {/ c. X
- Fd(1) = "zhix"
3 Z, O" M* I V6 Y - Ss中心线.Select acSelectionSetAll, , , Ft, Fd$ I# }$ G" H6 l; `) [
- Fd(0) = "TEXT"
% v% T! p2 F, Q5 N - Fd(1) = "shuju"
7 P7 ?. K) ]' e - Ss文字.Select acSelectionSetAll, , , Ft, Fd" v/ T9 w" |0 N* F3 h9 W. i
- Fd(0) = "POLYLINE,LWPOLYLINE"9 R7 q) k( o" _$ F6 p3 U
- Fd(1) = "sjx"
* A: `: G/ Y2 H& y1 ?1 r* k - Ss多段线.Select acSelectionSetAll, , , Ft, Fd9 O! u9 F0 \* N, ?
- '创建新EXCEL文档0 K/ K3 o- z" S& @( ]: A' X
- Set Excel文档 = Excel进程.Workbooks.Add
4 A4 }. G: j2 z! P7 l - Set Excel工作表 = Excel文档.ActiveSheet
5 `% D2 I) [7 K, G1 w. G* M - With Excel工作表
. O4 T9 m; s" E7 u! V! n7 l - '修改工作表名称,并在第一行写入表头文字
4 l5 J; z( F' i: ~& J F - .Name = "横断面数据"
/ o I% Q( z& T0 w - .Cells.Item(1, 1) = "桩号"
4 v# M* Z6 {% B - .Cells.Item(1, 2) = "位置") q$ Y* X6 ?3 `# F! O+ Y7 ]
- '合并单元格# {$ I3 z( A: ? [7 R: _/ [
- .Range("B1:C1").Merge
( k& Y4 e$ k3 t0 k. U - .Cells.Item(1, 4) = "长度"7 p" ~1 e7 I9 R% R' a
- .Cells.Item(1, 5) = "坡率"
, D; ]: i. Q7 d - '设置单元格对齐方式为水平中心对齐
* Y3 }% |/ u. S/ R: h5 D - .Columns("A:E").HorizontalAlignment = xlCenter) }7 S- o2 l1 x _2 ^& F7 _1 a" X& R
- Int行号 = 18 x% z) @8 A4 j* |7 K, a
- With .Cells: c$ b, Q8 h0 Z
- '遍历中心线* D* y3 O# Y! F0 ]
- For Each Lin中心线 In Ss中心线) d( ^4 y6 m5 g5 h1 }, G
- '提取中心线下端点
0 c/ e, S3 T4 Y9 c4 J8 T+ _# N# w - If Lin中心线.StartPoint(1) > Lin中心线.EndPoint(1) Then- W) s2 D! y2 @/ ]
- Var中心线下端点 = Lin中心线.EndPoint
7 Y" F, [3 v! o$ [% x8 B) ` - Else
2 H* r8 b- O0 A, \0 A+ ^2 U - Var中心线下端点 = Lin中心线.StartPoint9 z& T& K; C+ ?( B1 l
- End If
3 f8 v# M& E+ }% x" _" B% z. V Y, V7 h - '遍历单行文字,找出与中心线对应的桩号并记录
+ A* p* R' C' i. a5 `$ L - Dbl文字与中心线最小距离 = 0+ X& E6 w1 L6 q4 f) I" F2 y. o
- For Each Txt文字 In Ss文字3 h! l& O8 K1 E' i
- If Txt文字.InsertionPoint(1) < Var中心线下端点(1) Then9 v! D6 q8 J7 g
- Dbl文字与中心线距离 = Sqr((Var中心线下端点(0) - Txt文字.InsertionPoint(0)) ^ 2 + (Var中心线下端点(1) - Txt文字.InsertionPoint(1)) ^ 2); ^3 |" Y2 ]2 B! j
- If Dbl文字与中心线最小距离 = 0 Or Dbl文字与中心线距离 < Dbl文字与中心线最小距离 Then& e5 f; ^6 @: S) s; Y9 C; I; v
- Dbl文字与中心线最小距离 = Dbl文字与中心线距离
2 Y l2 d2 l' o( u* z: g4 K - Str桩号 = Txt文字.TextString6 @+ T: C% l! J8 h T G/ \
- End If7 K/ E+ R, J; L1 |% ~* e7 P
- End If
; u8 F( x' o, p) m4 {4 I5 E/ B/ j - Next1 P0 s) C3 Y' i6 R3 f
- '遍历横断面多段线
' ]: v% {3 s; b t4 j/ ?: ~2 f - For Each Ent多段线 In Ss多段线4 E3 v( ?+ s: I8 a; l5 o. e# ?
- '检查多段线与中心线是否存在交点,如存在交点则输出数据
0 n% G0 N( E4 C - Var中心线与多段线交点 = Lin中心线.IntersectWith(Ent多段线, acExtendNone)
) x3 U+ x' c5 D, C - If UBound(Var中心线与多段线交点) > 0 Then5 b( T1 T+ q6 P1 P
- '提取多段线顶点坐标* t3 ^% J+ _1 M8 W& }
- Var多段线顶点 = Ent多段线.Coordinates* J5 _% e2 u; K% P$ P: g- x
- '按多段线类型选择读取坐标的方式$ k5 `! J! Y! E: C: H
- If Ent多段线.ObjectName = "AcDb2dPolyline" Then1 V6 L. r) E* @! A" }, t6 E% k6 o
- Int循环步长 = 3
. s' R& e b1 ^- Z) D! D4 Y - Else. u3 b" M1 G/ {' k
- Int循环步长 = 2
8 l6 Y- M- [' B3 p* o - End If
$ V- O. {6 {9 |, ?+ y( ~, n - '从第一个顶点到倒数第二个顶点,逐点检查相邻顶点间线段的特性( G; U. w$ ?+ j5 i2 p7 s" R1 A+ ?
- For Int循环变量 = 0 To UBound(Var多段线顶点) - Int循环步长 * 2 + 1 Step Int循环步长
( O6 v! ]0 U' d - '提取线段的起,端点
! u' m# i; B1 n/ v J$ c* y - Dbl线段起点(0) = Var多段线顶点(Int循环变量)
}; q8 ^5 \: b5 T3 b5 s& r - Dbl线段起点(1) = Var多段线顶点(Int循环变量 + 1), X9 m$ J% ~) @
- Dbl线段端点(0) = Var多段线顶点(Int循环变量 + Int循环步长)
0 g2 J2 h7 D5 t) ^& J" o4 o - Dbl线段端点(1) = Var多段线顶点(Int循环变量 + Int循环步长 + 1)0 @# k1 C4 Q4 M4 `
- '提取线段角度
3 m, Q2 F* }8 l* ?. G - Dbl线段角度 = ThisDrawing.Utility.AngleFromXAxis(Dbl线段起点, Dbl线段端点)
' a) @ H V2 v- V - '检查角度是否为"边坡",如果是则输出数据
$ ]4 i& l8 z; F/ N- E" | - If Dbl线段角度 > 0.05 And Dbl线段角度 < ThisDrawing.Utility.AngleToReal(90, acDegrees) - 0.05 Or _
/ Z+ R1 d; O/ V4 n* L - Dbl线段角度 > ThisDrawing.Utility.AngleToReal(90, acDegrees) + 0.05 And _
2 `1 m% t# G5 S - Dbl线段角度 < ThisDrawing.Utility.AngleToReal(180, acDegrees) - 0.05 Or _! c- O1 P& b2 m+ T0 O; x0 ~- a
- Dbl线段角度 > ThisDrawing.Utility.AngleToReal(180, acDegrees) + 0.05 And _: H5 e: p$ G3 [1 g
- Dbl线段角度 < ThisDrawing.Utility.AngleToReal(270, acDegrees) - 0.05 Or _
. a" I6 `1 y9 F1 r9 K! D$ R - Dbl线段角度 > ThisDrawing.Utility.AngleToReal(270, acDegrees) + 0.05 And _8 A. \: ]# S" c1 `0 N5 T
- Dbl线段角度 < ThisDrawing.Utility.AngleToReal(180, acDegrees) * 2 - 0.05 Then
3 j) q1 }4 ]- [. ^0 x @9 b4 a - 'EXCEL工作表中行号递加
) S9 { ] |$ {+ t - Int行号 = Int行号 + 1
8 C. s( k I" m, Y - '写入前面记录的桩号0 n' l9 h3 Z" L: c6 e* L
- .Item(Int行号, 1) = Str桩号3 K8 R2 q( `6 l# m- ?9 Y- L
- '判断该线段与中心线水平位置关系,并写入"左右"4 t* b1 e$ X/ N' t; }) V
- If Dbl线段起点(0) < Var中心线下端点(0) Then
! u' W1 M; y; b C - .Item(Int行号, 2) = "左", ?% w! | s- `) Z$ ]5 Z) w- {' N
- Else) I, n( y$ v" C: i7 R& _( I8 c2 G
- .Item(Int行号, 3) = "右"; z g) F' X/ ]$ P b7 e
- End If
/ [, g* ?! E, [, ]/ T - '写入边坡长度8 W; A- h% b2 B* G; c
- .Item(Int行号, 4) = Sqr((Dbl线段起点(0) - Dbl线段端点(0)) ^ 2 + (Dbl线段起点(1) - Dbl线段端点(1)) ^ 2)
, ?( v& a1 s& W$ M1 t, b - '写入坡率
( x* o2 P7 o3 L8 e+ U - .Item(Int行号, 5) = Abs(1 / Tan(Dbl线段角度))# G4 w$ H: d2 j& g3 j( @
- End If
# K' J- L* E d+ h" P( w2 c" F1 \ - Next
3 _; k* I4 g1 }, C$ L - Exit For
' Z: p: e% S# T - End If1 J' S) k4 z* }, h
- Next% e7 Q6 n; a# \% X5 K# M5 `
- Next
, w- d) U# L" ^9 F! X- e7 `4 N - End With8 Z5 z8 S! z7 h) J) k
- End With
. _7 r, F6 O5 z; ^+ \4 W8 L - '删除用过的选择集: s* ?& j6 z4 { I
- Ss中心线.Delete
6 L2 Z2 }" z1 o- B% ] - Ss文字.Delete
1 V, ?3 s2 X, p0 V1 Z% _( n - Ss多段线.Delete
/ z( \& Z9 ^* h( O$ U! M+ ? - '保存EXCEL文档并退出: }9 p' k8 l2 k! \* }# O E% h
- Excel文档.SaveAs Left(ThisDrawing.FullName, InStrRev(ThisDrawing.FullName, ".") - 1) & ".xls"2 u7 |. P, m/ O+ ^2 t
- Excel进程.Quit7 [: S% L. Y- m D- k
- End Sub' _* {+ P' N8 K( Y
复制代码 B- n: Q9 E2 p0 |6 T. E% j$ G
在使用此代码之前,务请在VBAIDE界面的"工具"菜单下打开"引用"对话框,正确设置对EXCEL类库的引用. A# c. S2 c" Z' f) L5 n) t9 i7 Q
五.附件是包含上面代码和对EXCEL的引用的dvb文件,由于本人PC中安装的是EXCEL2003程序,如果使用者的EXCEL版本与本人不同,请自行修改引用.
( g# s- m+ J$ }# {' U/ e" b" S
[ 本帖最后由 woaishuijia 于 2010-2-27 06:05 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|