找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4231|回复: 27

[求助] 希望大神帮忙修改下面这个lisp,谢谢!

[复制链接]
发表于 2014-11-10 21:56:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 eddy_dqiao 于 2014-11-10 21:59 编辑

下面这个lisp是搜集过来的一个有用程序,主要用于核对图纸工程量,一般市政排水管网中,会对管线平面上进行标注,标注格式为DN300(管径)-3(坡度)-30(管长)或者DN300(管径)-30(管长)-3(坡度),下面这个lisp程序可以一次多选图面中所有的平面管线标注,然后输入任意管径,可以给你统计出管长部分的总和,遗憾的是,这个程序只对“DN300(管径)-3(坡度)-30(管长)”的方式有效,当坡度和管长的位置互换时则无法统计总和;请大神帮忙修改下,使得程序能变成对“DN300(管径)-30(管长)-3(坡度)"的标注形式有效,能统计所有同管径的管长总和。谢谢!


源程序如下:
;本段程序帮你统计排水管道管长工程量。但前提是格式为“(DN***-**-***)
(Defun c:tps (/ sum sm sumst sc1 sc fil n e ed et j tzh tzh2 len ln)
(command "redraw")

(setq sum 0)
(setq sm 0)
(setq sumst 0)
(setq fil (ssget))
(setq sc1 (getstring "\n请输入需要统计的管径(以DN***表示):\n"))
(setq sc (strcase sc1))
(setq len (sslength fil))
(setq n 0)
(while (<= n (- len 1))                                        ;1
  (progn                                                        ;2
   (setq e (ssname fil n))
   (if (= "TEXT" (cdr (assoc 0 (setq ed (entget e)))))           ;3        过滤出文


     (progn                                                        ;4
  (setq et (cdr (assoc 1 (setq ed (entget e))))) ;********
  (setq ln (strlen et))
  (setq j 1)

  (while (< j ln)                                                 ;5
   (if (or (/= sc (substr et 1 j)) (= "0" (substr et (+ 1 j) 1)))        ;6
    (setq j (+ 1 j))
  (progn        ;7
  (setq i 1)                                                        
  (while (< i ln)                ;8 截取单管管长
    (setq tzh (substr et i 1))
     (if (= tzh "-")                 ;9
      (progn                         ;10
       (setq i (+ 1 i))
       (while (< i ln)                ;11
          (setq tzh2 (substr et i 1))
          (if (= tzh2 "-")        ;12
        (progn                        ;13
       (setq sm (substr et (+ i 1)))
      (setq sum (+ sum (atof sm)))
        ))                ;13,12
     (setq i (+ 1 i))
        )                        ;11
      )                                ;10
     (setq i (+ 1 i))
        )                        ;9 end if *        
   )                                ;接8
     (setq j (+ 1 j))
    )                                ;接7 progn
   )                                ;接6 if
   )                                ;接5 while

     )                        ;接4 progn
;    (setq n (+ 1 n))
    )                        ;接3 if
    (setq n (+ 1 n))
   )                        ;接2 progn
  )                        ;接1 while
(setq sumst (rtos sum 2))

(princ (strcat "\n\n\t\t totle 排水管径 " sc "= " sumst))

(princ)
)

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 11282个

财富等级: 富甲天下

发表于 2014-11-11 20:44:30 | 显示全部楼层
eddy_dqiao 发表于 2014-11-11 15:17
运行提示参数错误,无法得到结果!

6楼改了,再试试。

点评

大神,牛人,完全搞定了啊!  发表于 2014-11-11 21:22
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 1 反对 0

使用道具 举报

已领礼包: 264个

财富等级: 日进斗金

发表于 2014-11-10 22:44:59 来自手机 | 显示全部楼层
只要规则一样可以改成自动适应两种情况

点评

能帮忙改下吗?  详情 回复 发表于 2014-11-11 02:36
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-11 02:36:18 | 显示全部楼层
iLisp 发表于 2014-11-10 22:44
只要规则一样可以改成自动适应两种情况

能帮忙改下吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-11-11 08:23:42 | 显示全部楼层
本帖最后由 st788796 于 2014-11-11 08:30 编辑

是这样标 DN300(管径)-30(管长)-3(坡度)
还是  DN300-30-3
仅对没有括号内容的标注
  1. (defun c:tt (/ e dn lst ss x1 x2 tf)
  2.   (if
  3.     (and (setq e (car (xdrx_entsel "\n拾取统计管径文字: " '((1 . "DN###*")))))
  4.          (progn
  5.            (setq dn (car (xdrx_string_split
  6.                            (xdrx_getpropertyvalue e "textstring")
  7.                            "-"
  8.                          )
  9.                     )
  10.            )
  11.            (princ "\n选择统计范围<回车全选>...")
  12.            (if (setq ss (ssget (list (cons 1 (strcat dn "`*")))))
  13.              ss
  14.              (setq ss (ssget "x" (list (cons 1 (strcat dn "`*")))))
  15.            )
  16.          )
  17.     )
  18.      (progn
  19.        (setq
  20.          lst (mapcar '(lambda (x)
  21.                         (cdr (xdrx_string_split
  22.                                (xdrx_getpropertyvalue x "textstring")
  23.                                "-"
  24.                              )
  25.                         )
  26.                       )
  27.                      (xdrx_pickset->ents ss)
  28.              )
  29.          x1  (mapcar 'car lst)
  30.          x2  (mapcar 'cadr lst)
  31.          tf  (vl-some '> x1 x2)
  32.        )
  33.        (if tf
  34.          (setq len (apply '+ (mapcar 'distof x1)))
  35.          (setq len (apply '+ (mapcar 'distof x2)))
  36.        )
  37.        (princ
  38.          (strcat "\n\n\t\t Totle 排水管径 " dn " = " (rtos len))
  39.        )
  40.      )
  41.   )
  42.   (princ)
  43. )

点评

程序运行 提示——错误: no function definition: XDRX_PICKSET->ENTS  详情 回复 发表于 2014-11-11 15:20
DN300-30-3,,管长和坡度还有可能带小数,谢谢!  详情 回复 发表于 2014-11-11 08:30
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-11 08:30:34 | 显示全部楼层
st788796 发表于 2014-11-11 08:23
是这样标 DN300(管径)-30(管长)-3(坡度)
还是  DN300-30-3

DN300-30-3,,管长和坡度还有可能带小数,谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 11282个

财富等级: 富甲天下

发表于 2014-11-11 09:11:25 | 显示全部楼层
本帖最后由 zxq0220 于 2014-11-11 20:43 编辑

  1. (defun c:tps (/ dat datlst dnlst fil ed et)
  2. (setvar "CMDECHO" 0)
  3. (setq datlst (list))
  4. (setq fil (ssget '((0 . "TEXT")(1 . "DN#*-#*-#*"))));取文本中符合DN***-**-***字串
  5. (repeat (setq i (sslength fil))
  6.   (setq ed (entget(ssname fil (setq i (1- i)))))
  7.   (setq et (cdr (assoc 1 ed)))
  8.   (setq dat (read(strcat "(" (vl-string-translate "-" " " et) ")"))) ;(DN*** ** **)
  9.   (setq datlst (cons dat datlst))
  10. )
  11. (setq datlst (vl-sort datlst
  12. '(lambda (a b) (< (vl-princ-to-string (car a)) (vl-princ-to-string (car b))))));排序
  13. (setq dnlst (list))
  14. (foreach x datlst
  15.   (if (not(member (car x) dnlst)) (progn
  16.    (setq dnlst (cons (car x) dnlst));(DN*** ...)
  17.    (set (car x) 0.0)
  18.   ))
  19.   (set (car x) (+ (apply 'max (cdr x)) (eval(car x))));取大值加入DN***
  20. )
  21. (foreach x (reverse dnlst)
  22.   (write-line (strcat "\n\n\t\t totle 排水管径 " (vl-princ-to-string x) " = " (rtos(eval x))))
  23. )
  24. (setvar "CMDECHO" 1)
  25. (princ)
  26. )

点评

运行提示参数错误,无法得到结果!  详情 回复 发表于 2014-11-11 15:17
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-11 15:17:10 | 显示全部楼层

运行提示参数错误,无法得到结果!

点评

6楼改了,再试试。  详情 回复 发表于 2014-11-11 20:44
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-11 15:20:15 | 显示全部楼层
st788796 发表于 2014-11-11 08:23
是这样标 DN300(管径)-30(管长)-3(坡度)
还是  DN300-30-3
仅对没有括号内容的标注

程序运行 提示——错误: no function definition: XDRX_PICKSET->ENTS

点评

这是 XDRXAPI 中定义函数,置顶帖子下载,然后 appload  详情 回复 发表于 2014-11-11 15:27
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-11-11 15:27:10 | 显示全部楼层
eddy_dqiao 发表于 2014-11-11 15:20
程序运行 提示——错误: no function definition: XDRX_PICKSET->ENTS

这是 XDRXAPI 中定义函数,置顶帖子下载,然后 appload

点评

还是不行,不能使用,选择也很困难,请大神打开附件里面的那张cad图会比较清楚,附件里面的lsp是我原来贴的代码文件,那个是可以正常运行的!  详情 回复 发表于 2014-11-11 15:40
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-11 15:40:44 | 显示全部楼层
csharp 发表于 2014-11-11 15:27
这是 XDRXAPI 中定义函数,置顶帖子下载,然后 appload

还是不行,不能使用,选择也很困难,请大神打开附件里面的那张cad图会比较清楚,附件里面的lsp是我原来贴的代码文件,那个是可以正常运行的!

lisp样图.zip

7.89 KB, 下载次数: 5, 下载积分: D豆 -1 , 活跃度 1

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-11-11 16:18:22 | 显示全部楼层
eddy_dqiao 发表于 2014-11-11 15:40
还是不行,不能使用,选择也很困难,请大神打开附件里面的那张cad图会比较清楚,附件里面的lsp是我原来贴 ...

  1. (defun c:tt (/ e lst ss el)
  2.   (if
  3.     (and
  4.       (setq
  5.         e (car (xdrx_entsel "\n拾取管径标注: " '((1 . "DN*"))))
  6.       )
  7.       (progn
  8.         (princ "\n选择统计范围<回车全选>...")
  9.         (setq el (entget e))
  10.         (if (setq
  11.               ss (ssget (list '(0 . "text") (assoc 8 el) '(1 . "DN*")))
  12.             )
  13.           ss
  14.           (setq        ss
  15.                  (ssget "x" (list '(0 . "text") (assoc 8 el) '(1 . "DN*")))
  16.           )
  17.         )
  18.       )
  19.     )
  20.      (progn
  21.        (setq
  22.          lst (mapcar '(lambda (x)
  23.                         (xdrx_string_split
  24.                           (xdrx_getpropertyvalue x "textstring")
  25.                           "-"
  26.                         )
  27.                       )
  28.                      (xdrx_pickset->ents ss)
  29.              )
  30.          lst (xd::list:groupbyindex lst 0)
  31.        )
  32.        (mapcar
  33.          '(lambda (x / x1 x2 len tf dn)
  34.             (setq dn (car x)
  35.                   x1 (mapcar 'distof (mapcar 'car (cdr x)))
  36.                   x2 (mapcar 'distof (mapcar 'cadr (cdr x)))
  37.                   tf (vl-some '(lambda (a b) (> a b))
  38.                               x1
  39.                               x2
  40.                      );_管长数字大于管径数字
  41.             )
  42.             (if        tf
  43.               (setq len (apply '+ x1))
  44.               (setq len (apply '+ x2))
  45.             )
  46.             (princ
  47.               (strcat "\n\n\t\t Totle 排水管径 " dn " = " (rtos len))
  48.             )
  49.           )
  50.          lst
  51.        )
  52.      )
  53.   )
  54.   (princ)
  55. )


命令: tt
拾取管径标注:
选择统计范围<回车全选>...
选择对象: 指定对角点: 找到 7 个
选择对象:
    Totle 排水管径 DN500 = 20
    Totle 排水管径 DN400 = 90
    Totle 排水管径 DN300 = 60

命令: tt
拾取管径标注:
选择统计范围<回车全选>...
选择对象:
    Totle 排水管径 DN400 = 154
    Totle 排水管径 DN300 = 296



点评

不知道怎么回事,cad2004开图,先加载XDRx2004.arx,再加载tt.lsp,运行,最后全选标注文字后,显示“错误: no function definition: XD:IST:GROUPBYINDEX”  详情 回复 发表于 2014-11-11 17:35
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-11 17:35:29 | 显示全部楼层
本帖最后由 eddy_dqiao 于 2014-11-11 17:56 编辑
st788796 发表于 2014-11-11 16:18
命令: tt
拾取管径标注:
选择统计范围...

不知道怎么回事,cad2004开图,先加载XDRx2004.arx,再加载tt.lsp,运行,最后全选标注文字后,显示“错误: no function definition: XD::LIST:GROUPBYINDEX”
不知道是不是晓东函数加载有问题,加载后F2显示“欢迎来到晓东家园!!自启动LISP请在XDRx.lsp中定制.; 错误: LOAD 失败:
"C:\\Users\\Administrator\\Desktop\\XDsoft\\XDRx.18\\xd-lisp-lib.vlx"貌似没有下载晓东的函数库,我现在权限不够,下载不了,这个lisp能单独使用不依赖晓东函数吗?{:soso_e183:}

点评

你还需要加载 XD LISP函数库,论坛上的大部分程序,你只要加载了这两个基础的库,基本都能用了。  详情 回复 发表于 2014-11-11 17:57
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2014-11-11 17:57:20 | 显示全部楼层
eddy_dqiao 发表于 2014-11-11 17:35
不知道怎么回事,cad2004开图,先加载XDRx2004.arx,再加载tt.lsp,运行,最后全选标注文字后,显示“错误: ...

你还需要加载 XD LISP函数库,论坛上的大部分程序,你只要加载了这两个基础的库,基本都能用了。

点评

版主,函数库我的权限不够,下载不了啊!有什么办法吗?  详情 回复 发表于 2014-11-11 18:02
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-11 18:02:06 | 显示全部楼层
XDSoft 发表于 2014-11-11 17:57
你还需要加载 XD LISP函数库,论坛上的大部分程序,你只要加载了这两个基础的库,基本都能用了。

版主,函数库我的权限不够,下载不了啊!有什么办法吗?

点评

50个积分,快了。 如果你有什么好的资料发上来,给你加分,你就更快了。  详情 回复 发表于 2014-11-11 18:10
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2014-11-11 18:10:37 | 显示全部楼层
eddy_dqiao 发表于 2014-11-11 18:02
版主,函数库我的权限不够,下载不了啊!有什么办法吗?

50个积分,快了。
如果你有什么好的资料发上来,给你加分,你就更快了。

另外,函数库所有的源码,都在开源函数库论坛,你可以去搜索下程序里面需要的XD::开头的函数,拷贝回去用。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-20 06:05 , Processed in 0.510493 second(s), 79 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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