eddydqiao 发表于 2014-11-11 03:01:16

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

下面这个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)
)

ZZXXQQ 发表于 2014-11-11 09:09:09

本帖最后由 ZZXXQQ 于 2014-11-11 20:57 编辑

(defun c:tps (/ dat datlst dnlst fil ed et)
(setvar "CMDECHO" 0)
(setq datlst (list))
(setq fil (ssget '((0 . "TEXT")(1 . "DN#*-#*-#*"))));取文本中符合DN***-**-***字串
(repeat (setq i (sslength fil))
(setq ed (entget(ssname fil (setq i (1- i)))))
(setq et (cdr (assoc 1 ed)))
(setq dat (read(strcat "(" (vl-string-translate "-" " " et) ")"))) ;(DN*** ** **)
(setq datlst (cons dat datlst))
)
(setq datlst (vl-sort datlst
'(lambda (a b) (< (vl-princ-to-string (car a)) (vl-princ-to-string (car b))))));排序
(setq dnlst (list))
(foreach x datlst
(if (not(member (car x) dnlst)) (progn
   (setq dnlst (cons (car x) dnlst));(DN*** ...)
   (set (car x) 0.0)
))
(set (car x) (+ (apply 'max (cdr x)) (eval(car x))));取大值加入DN***
)
(foreach x (reverse dnlst)
(write-line (strcat "\n\n\t\t totle 排水管径 " (vl-princ-to-string x) " = " (rtos(eval x))))
)
(setvar "CMDECHO" 1)
(princ)
)

eddydqiao 发表于 2014-11-11 15:11:16

不行啊,大神,你看下我附近里面的例图,用原来的tps程序,右边的可以统计,左边的不能统计管长。左边的用你帖子里面修改后的代码程序,运行后显示参数错误!

ZZXXQQ 发表于 2014-11-11 20:58:06

eddydqiao 发表于 2014-11-11 15:11 static/image/common/back.gif
不行啊,大神,你看下我附近里面的例图,用原来的tps程序,右边的可以统计,左边的不能统计管长。左边的用你 ...

程序改了,再试试。

eddydqiao 发表于 2014-11-13 17:03:28

ZZXXQQ 发表于 2014-11-11 20:58 static/image/common/back.gif
程序改了,再试试。

多谢大神,牛!

知行ooo李肖坪 发表于 2015-12-26 21:18:02

谢谢,同步学习
页: [1]
查看完整版本: 希望大神帮忙修改下面这个lisp,谢谢!