CAD设计论坛

 找回密码
 立即注册
论坛新手常用操作帮助系统等待验证的用户请看获取社区币方法的说明新注册会员必读(必修)
查看: 11618|回复: 28

[求助] 史上最全的lsp程序分享

[复制链接]
发表于 2010-2-17 02:23 | 显示全部楼层 |阅读模式
哈哈,问题已经解决,看来这里有高手哦^_^
! _; R! P0 @" A+ t9 U) {$ y. q6 r2 h3 M( }% |3 S# i
[ 本帖最后由 小书僮 于 2010-2-27 01:48 编辑 ]

本帖子中包含更多资源

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

x
发表于 2010-2-17 22:03 | 显示全部楼层
只看懂了 B1K46+380 序列+ T8 k5 X7 w+ D+ a  U- r5 p
其余未知从何而得
 楼主| 发表于 2010-2-18 12:22 | 显示全部楼层

回复 #2 Camello 的帖子

没懂……我的思路是:1.关闭除横断面以外的其他图层(即只显示横断面红线的长度,注释、原坡面线隐藏)2.编一个LSP程序,全选所有断面后,可以批量测量长度。3.打开桩号、坡率所在图层,用一个程序,把所有横断面的桩号、左右、长度、及坡率批量输入excel。但是编程太难了,我参考了网上许多lsp程序,一头雾水3 t2 i2 ~% c6 e! O( h
4 U8 ]6 S/ @& |; X( n; x
[ 本帖最后由 小书僮 于 2010-2-18 12:23 编辑 ]
 楼主| 发表于 2010-2-24 23:37 | 显示全部楼层
哪位高手帮一下忙嘛……不然太累了
发表于 2010-2-25 08:26 | 显示全部楼层
我看都没看懂
发表于 2010-2-25 09:30 | 显示全部楼层
怎么这里有那么多的好东西啊,真的要多来看看
发表于 2010-2-25 09:38 | 显示全部楼层
怎么这里有那么多的好东西啊,真的要多来看看
发表于 2010-2-25 11:19 | 显示全部楼层
首先声明,由于对楼主所在行业一窍不通,只能通过楼主在帖中提供的信息来推测符合楼主要求的规则和方法,错误和遗漏在所难免,还望谅解,以下内容仅做为意见和建议供楼主参考:
# s! r  A* a9 ~0 k一.由于楼主要求用EXCEL输出,所以用LISP是不合适的,这是VBA的长项;! b% I5 B. K: i2 p* X9 b
二.楼主在"2.jpg"中提供的数据样例,疑似来自B1K46+360,而不是B1K46+350(详见附图)
1 r8 M; X2 s- f5 \! \/ V0 D5 j
% U2 {7 j% ^# \6 @7 y9 z: y2 b, S. t, W4 T; j' C
    以下按此数据来自B1K46+360看待;9 x- O: s3 U* ^9 I; A
三.初步拟定规则和方法如下:  S+ J8 {' T$ a. @- ?  R+ C0 Y
    假定:/ R7 o( ?9 t! v+ X
    1.所有需要处理的图形和注释都在已打开的当前DWG文件的当前布局,且所有图形和注释都在WCS的XY平面上,都是二维的;
5 h  d3 U7 m5 \; H# K: I    2.位于"zhix"图层的所有直线都是某个横断面唯一的"路面中心"线,且所有横断面都有一条"路面中心"线;+ R; S" q, m! ^9 W0 g; L& r
    3.每一条"路面中心"线都对应存在一个或多个Y座标小于"路面中心"线下端点Y座标的,位于"shuju"图层的单行文字,其中与"路面中心"线下端点几何距离最近者是该断面的"桩号",按其全部文字内容输出"桩号"数据;
* H6 S- Q0 f' J% D    4.每一条"路面中心"线都有一条且仅有一条代表横截面的位于"sjx"图层的二维多段线与其相交;5 a3 j% y8 c/ m4 t0 \7 u
    5.由于在图上测量得知"路面"部分最大斜度为1:0.03,所以,该多段线中角度为±0.05弧度,π/2±0.05弧度,π±0.05弧度和3π/2±0.05弧度的线段均不予理会,其它线段做为"边坡"看待,并按其与中心线的水平位置关系输出其"左右"数据,按其实测长度输出其"长度"数据,按其角度的余切值的绝对值输出"坡率"数据;' L7 \; V2 |, f; ^2 c$ d- G
    6.输出的"xls"文件的路径和文件名,除扩展名外其它都与"dwg"文档相同
1 N4 _. M, Y) y  X* W3 w# M四.按以下规则编写的VBA代码如下:
$ e+ n& o# {/ E3 q" k

  1. & p& ?) j" N1 M' d
  2. Sub HDM()8 h+ [$ n7 D9 a; m& p3 a! P8 D
  3.     Dim Excel进程 As New Excel.Application, Excel文档 As Excel.WorkBook, Excel工作表 As Excel.Worksheet, Int行号 As Integer7 W. o  g9 B% D: ]( ]; `0 ]
  4.     Dim Ss中心线 As AcadSelectionSet, Ss多段线 As AcadSelectionSet, Ss文字 As AcadSelectionSet, Ft(1) As Integer, Fd(1) As Variant. P6 ]# _1 M+ d1 J- o/ Z$ z
  5.     Dim Lin中心线 As AcadLine, Txt文字 As AcadText, Ent多段线 As AcadEntity
    % q' f- {  |- |/ w2 O3 m# P8 m) A$ F
  6.     Dim Var中心线下端点 As Variant, Dbl文字与中心线最小距离 As Double, Dbl文字与中心线距离 As Double, Str桩号 As String6 U/ O+ D4 u7 d6 n* z6 J: M
  7.     Dim Var中心线与多段线交点 As Variant, Var多段线顶点 As Variant, Dbl线段起点(2) As Double, Dbl线段端点(2) As Double, Dbl线段角度 As Double# c& k7 N5 I8 o5 R
  8.     Dim Int循环变量 As Integer, Int循环步长 As Integer
    8 O8 M: z" S4 j2 _6 A
  9.     On Error Resume Next; N. _  O* `" O. _" V
  10.     '创建三个选择集,分别选择中心线,横断面多段线和包含桩号的单行文字; P3 z2 @. z7 H
  11.     With ThisDrawing.SelectionSets$ h9 X% V" f# d+ q" K; B) N
  12.         Set Ss中心线 = .Add("中心线")
    1 _+ F( g* C& z3 E" Z6 b: f
  13.         Set Ss文字 = .Add("文字")
    & h. ^5 P! q, u) f& X' L& u
  14.         Set Ss多段线 = .Add("多段线")2 @* k6 m( O) F* o2 Y) k2 @
  15.     End With
    4 a% e' Y- P# H' v1 S# g
  16.     Ft(0) = 05 F& U, I4 B" u9 v* [# y
  17.     Fd(0) = "LINE"' F+ q9 e1 Z, b2 v" N* h
  18.     Ft(1) = 8
    " Q; u8 a+ @6 ~6 q. P0 _5 c
  19.     Fd(1) = "zhix"( h. v9 @1 m2 U0 P- i1 R) @- K: ?
  20.     Ss中心线.Select acSelectionSetAll, , , Ft, Fd: Q2 }( f" M5 q- p
  21.     Fd(0) = "TEXT"
    2 D7 V3 Z+ u3 m( q- g& u* h
  22.     Fd(1) = "shuju". _% M4 D" @- p* u
  23.     Ss文字.Select acSelectionSetAll, , , Ft, Fd4 O# E2 P$ G, J6 q' n+ L5 j
  24.     Fd(0) = "POLYLINE,LWPOLYLINE"9 i% G- z5 {: o8 h5 y. w7 d" @
  25.     Fd(1) = "sjx": J: [6 {  {1 z; \  L, d/ W
  26.     Ss多段线.Select acSelectionSetAll, , , Ft, Fd% ~5 c' q5 y# {/ e8 f: f
  27.     '创建新EXCEL文档( E2 W; m# e' C& n* S$ W5 ~
  28.     Set Excel文档 = Excel进程.Workbooks.Add' v3 D( W  q* c
  29.     Set Excel工作表 = Excel文档.ActiveSheet
    / _' J% E% R, e8 H  n
  30.     With Excel工作表) K. E0 p0 ~% u6 `
  31.         '修改工作表名称,并在第一行写入表头文字
    / r' d0 m% U5 r5 ?9 Y+ ^% A
  32.         .Name = "横断面数据"
    6 S: Y! W7 P5 z# a
  33.         .Cells.Item(1, 1) = "桩号"
    ; g2 x- y, w' \6 ?# B
  34.         .Cells.Item(1, 2) = "位置"0 Q, S+ H5 _( ^9 l. W0 h* y$ Q
  35.         '合并单元格
    ; `- S" z; X3 J. U9 }0 Q/ g
  36.         .Range("B1:C1").Merge
    / z" s0 J, o# Y& j5 E% B3 x
  37.         .Cells.Item(1, 4) = "长度"; V' Z+ `+ u+ s+ o8 ?
  38.         .Cells.Item(1, 5) = "坡率"
    6 q+ @5 r4 P- m( w; G
  39.         '设置单元格对齐方式为水平中心对齐
    . F7 b% |$ N# [! z0 ]1 R
  40.         .Columns("A:E").HorizontalAlignment = xlCenter
    : B0 D) s3 L, ]7 J' U
  41.         Int行号 = 13 K3 S# e3 B8 K' Y9 v4 _
  42.         With .Cells4 h7 \+ J' P/ s8 M1 [% w" u# E
  43.             '遍历中心线( s# C2 T% k& A( F0 L; r6 J5 t3 N9 U
  44.             For Each Lin中心线 In Ss中心线
    0 g$ m' A4 Q+ E( H9 ?+ N
  45.                 '提取中心线下端点6 F- O' N0 _0 v" a2 a# N6 z
  46.                 If Lin中心线.StartPoint(1) > Lin中心线.EndPoint(1) Then
    # T0 T3 X1 {, W. N/ a8 {9 \
  47.                     Var中心线下端点 = Lin中心线.EndPoint
    ! U2 y" D! p6 u0 l
  48.                 Else
    ( M' O& S* h' |
  49.                     Var中心线下端点 = Lin中心线.StartPoint
    ( ~4 \/ v6 k3 ~% r
  50.                 End If2 y, w$ I4 x# K% u# B0 u* p! ]$ g0 i
  51.                 '遍历单行文字,找出与中心线对应的桩号并记录
    4 ~9 j% |% S( ?0 Y/ r# z- Y8 w
  52.                 Dbl文字与中心线最小距离 = 09 r& G( q" G9 l
  53.                 For Each Txt文字 In Ss文字) e  c! f1 i7 d3 g
  54.                     If Txt文字.InsertionPoint(1) < Var中心线下端点(1) Then+ c6 ?9 y" Z6 _* B
  55.                         Dbl文字与中心线距离 = Sqr((Var中心线下端点(0) - Txt文字.InsertionPoint(0)) ^ 2 + (Var中心线下端点(1) - Txt文字.InsertionPoint(1)) ^ 2)6 o7 _8 `6 i9 u# D, C- ^
  56.                         If Dbl文字与中心线最小距离 = 0 Or Dbl文字与中心线距离 < Dbl文字与中心线最小距离 Then5 \8 M; I$ [9 D, V; ?4 o) l
  57.                             Dbl文字与中心线最小距离 = Dbl文字与中心线距离/ N+ I% e$ R: N  X4 m6 C' q
  58.                             Str桩号 = Txt文字.TextString2 {) h% m6 \, J3 A0 j: s6 V# f
  59.                         End If* }+ E% j: ^7 i2 C! @
  60.                     End If: j6 j& c/ \; p7 `7 ?, H- e* V
  61.                 Next6 J' V9 B6 J4 G$ v+ {' J* z1 G
  62.                 '遍历横断面多段线
      r1 G% Q8 ^" S& k
  63.                 For Each Ent多段线 In Ss多段线9 w) l' k; e; D8 X( c6 Z8 @
  64.                     '检查多段线与中心线是否存在交点,如存在交点则输出数据+ Z3 |: M' k  G8 {9 t- [
  65.                     Var中心线与多段线交点 = Lin中心线.IntersectWith(Ent多段线, acExtendNone)
    . j, [$ k' D2 L6 ]
  66.                     If UBound(Var中心线与多段线交点) > 0 Then& F+ p+ _0 ^+ D1 r
  67.                         '提取多段线顶点坐标
    * f) {( @) r* ?
  68.                         Var多段线顶点 = Ent多段线.Coordinates
    3 y. b; L9 w, ^
  69.                         '按多段线类型选择读取坐标的方式
    , |' {" ]/ C: X# I9 a, o
  70.                         If Ent多段线.ObjectName = "AcDb2dPolyline" Then" X7 {9 C7 A. T( {# C
  71.                             Int循环步长 = 3. i* z* v  t8 g* x5 J
  72.                         Else8 O/ q# D* H1 I) v1 j+ x( a
  73.                             Int循环步长 = 2
    ( D3 I5 i/ F+ ]) }& d
  74.                         End If
    3 ?, ~. \7 {5 \# `
  75.                         '从第一个顶点到倒数第二个顶点,逐点检查相邻顶点间线段的特性
    8 A6 G7 u4 r5 w! U  e
  76.                         For Int循环变量 = 0 To UBound(Var多段线顶点) - Int循环步长 * 2 + 1 Step Int循环步长
    + ^5 H" F# i7 S5 Y* T
  77.                             '提取线段的起,端点6 ?" A& T' v5 k4 f* W9 O% G
  78.                             Dbl线段起点(0) = Var多段线顶点(Int循环变量)- R8 u8 A$ v2 ~( F( W
  79.                             Dbl线段起点(1) = Var多段线顶点(Int循环变量 + 1)/ |& V6 M6 e& f1 n- |) z9 E
  80.                             Dbl线段端点(0) = Var多段线顶点(Int循环变量 + Int循环步长)
    - b8 E: a$ ?5 ~. \5 F
  81.                             Dbl线段端点(1) = Var多段线顶点(Int循环变量 + Int循环步长 + 1)8 N4 P, K' s$ N$ t4 N% `0 m
  82.                             '提取线段角度
    * C# y' p: N: O
  83.                             Dbl线段角度 = ThisDrawing.Utility.AngleFromXAxis(Dbl线段起点, Dbl线段端点)
    + l1 c* J$ ]. T$ h5 y% C+ [  j
  84.                             '检查角度是否为"边坡",如果是则输出数据% }9 e' j) O4 ]4 y" U  b! z
  85.                             If Dbl线段角度 > 0.05 And Dbl线段角度 < ThisDrawing.Utility.AngleToReal(90, acDegrees) - 0.05 Or _
    % k; X5 N% i, \. U& k9 \( g
  86.                             Dbl线段角度 > ThisDrawing.Utility.AngleToReal(90, acDegrees) + 0.05 And _
    + E0 N( E- O6 ]
  87.                             Dbl线段角度 < ThisDrawing.Utility.AngleToReal(180, acDegrees) - 0.05 Or _
    : @, H  B' O' {$ R$ o$ y8 k5 m
  88.                             Dbl线段角度 > ThisDrawing.Utility.AngleToReal(180, acDegrees) + 0.05 And _
    8 U& R# e& N% V2 o/ R$ I5 [
  89.                             Dbl线段角度 < ThisDrawing.Utility.AngleToReal(270, acDegrees) - 0.05 Or _
    ! f' [+ y; {( A/ }  c7 P
  90.                             Dbl线段角度 > ThisDrawing.Utility.AngleToReal(270, acDegrees) + 0.05 And _: V7 P1 b' K, r! h$ ~3 q& l4 M9 Q
  91.                             Dbl线段角度 < ThisDrawing.Utility.AngleToReal(180, acDegrees) * 2 - 0.05 Then, _; a) r7 i, r, k
  92.                                 'EXCEL工作表中行号递加4 r. d# n8 }; N' F4 O4 T- u
  93.                                 Int行号 = Int行号 + 17 j, U$ p3 Z( `! n2 H+ @. }% ~  D
  94.                                 '写入前面记录的桩号
    . Q: n, k+ y% E$ E7 O; T4 T1 D
  95.                                 .Item(Int行号, 1) = Str桩号- F3 U7 ]6 l! R& y" t
  96.                                 '判断该线段与中心线水平位置关系,并写入"左右"
    . }/ e! g* w! ?2 |/ B$ [% [
  97.                                 If Dbl线段起点(0) < Var中心线下端点(0) Then" V7 S" L. r5 z& E% E
  98.                                     .Item(Int行号, 2) = "左"6 P( \6 Y( T) e  y  E
  99.                                 Else8 x) m( h" i* |% }4 R
  100.                                     .Item(Int行号, 3) = "右"
    9 A/ r/ [+ h& i; E  T
  101.                                 End If6 E* j: i% ^( H! \7 e* L" y; T4 a
  102.                                 '写入边坡长度! a7 B: U. J0 \# V% O0 D3 _
  103.                                 .Item(Int行号, 4) = Sqr((Dbl线段起点(0) - Dbl线段端点(0)) ^ 2 + (Dbl线段起点(1) - Dbl线段端点(1)) ^ 2)9 I' Y: c! ]; F: Z$ s
  104.                                 '写入坡率
    , E) u8 G0 P) w" k
  105.                                 .Item(Int行号, 5) = Abs(1 / Tan(Dbl线段角度))
    6 K: U" g! I- y
  106.                             End If, V1 S. L0 a" h& R6 A& N
  107.                         Next
    4 I7 _9 s3 g0 R8 y3 t
  108.                         Exit For5 b8 }6 L% ]9 V% t9 E( B7 }
  109.                     End If1 J  _) Z% G2 ?9 ~9 H+ {
  110.                 Next
    3 y, `. s% N& Q; B4 U  u# `! a$ `
  111.             Next
    $ ~: |1 Z; K& y# a, m7 ?* H) @
  112.         End With
    : u: J& r! A  ^+ z4 o% {& E$ \# i  h- m3 r
  113.     End With5 `& K( S: ?) E. }! U$ T9 H
  114.     '删除用过的选择集
    + C. k* N9 _: U4 Y/ q  u
  115.     Ss中心线.Delete
    $ d8 C, o; y$ a% x
  116.     Ss文字.Delete
    ; d0 ?9 q8 R: ]* o5 m6 B6 Y, `' m
  117.     Ss多段线.Delete
    7 z) G- O1 Q3 ~9 Y) T: u3 Z
  118.     '保存EXCEL文档并退出* O1 z/ r% z2 ]: f
  119.     Excel文档.SaveAs Left(ThisDrawing.FullName, InStrRev(ThisDrawing.FullName, ".") - 1) & ".xls"
    ( W+ J: k5 Z6 Y' Z! W) I* ?3 W- `
  120.     Excel进程.Quit
    * G: e; c% I* \* _
  121. End Sub" n4 l% o: }6 d" ]' G
复制代码
) R$ z$ h5 v' L: k- q( C( p
    在使用此代码之前,务请在VBAIDE界面的"工具"菜单下打开"引用"对话框,正确设置对EXCEL类库的引用.5 B0 g+ q) j8 o: b* R
五.附件是包含上面代码和对EXCEL的引用的dvb文件,由于本人PC中安装的是EXCEL2003程序,如果使用者的EXCEL版本与本人不同,请自行修改引用.; N+ b+ y8 ?4 ^
7 J* r" O) o$ T: e: L" I
[ 本帖最后由 woaishuijia 于 2010-2-27 06:05 编辑 ]

本帖子中包含更多资源

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

x
发表于 2010-3-7 17:18 | 显示全部楼层

回复 #1 小书僮 的帖子

好东西 谢谢
发表于 2010-3-7 21:22 | 显示全部楼层

回复 #1 小书僮 的帖子

非常好的,谢谢分享!
发表于 2010-3-10 14:33 | 显示全部楼层
应该搞个文件列表说明lsp文件各个功能才好呀,楼主。
发表于 2010-3-10 14:52 | 显示全部楼层
多谢楼主分享,下来学习
发表于 2010-3-10 17:03 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2010-3-10 17:15 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2010-3-10 17:38 | 显示全部楼层
昏,怎么一点都看不懂啊,看似为河道疏浚的断面?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于|免责|隐私|版权|广告|联系|手机版|CAD设计论坛

GMT+8, 2024-12-27 15:25

CAD设计论坛,为工程师增加动力。

© 2005-2024 askcad.com. All rights reserved.

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