明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5300|回复: 13

请教各位,如何求得一个图层里面所有PLINE线的长度总和

  [复制链接]
发表于 2003-10-15 19:52:00 | 显示全部楼层 |阅读模式
请教各位,如何求得一个图层里面所有PLINE线的长度总和,(用LIST,然后一个一个的累加,工作量太大,我的一个图层有800多条线段,)
谢谢!谢谢!谢谢!+
[em00]
发表于 2003-10-15 22:48:00 | 显示全部楼层
编程基本思路:建立一个选择集,包含该层的所有pline线,遍历选择集中的每一个图元,查询其长度,进行累加即可。
发表于 2003-10-16 08:24:00 | 显示全部楼层
程序返回PLINE总长度

  1. (vl-load-com)
  2. (defun c:addpline( / ss sum ent i)
  3.   (setq ss (ssget '((0 . "lwpolyline,polyline"))))
  4.   (setq sum 0)
  5.   (setq i 0)
  6.   (repeat (sslength ss)
  7.     (setq ent (ssname ss i))
  8.     (setq ent (vlax-ename->vla-object ent))
  9.     (setq sum (+ sum (vlax-curve-getDistAtPoint ent (vlax-curve-getEndPoint ent))))
  10.     (setq i (1+ i))
  11.   )
  12.   sum
  13. )
 楼主| 发表于 2003-10-19 16:24:00 | 显示全部楼层
对各位高手表示最诚挚的感谢,终于不用花今天时间来统计了,谢谢
发表于 2003-10-21 12:19:00 | 显示全部楼层
;;FOR R14
;;Total length of selected lines

;;LL sums the length of all objects on selected layers.
;;OBL sums the length of selected objects.

;;Both print the output to the command line giving the lengths for different
;;layers as well as a total.

(defun CL (/)
  (LL:OUTPUT "X" "\nSelect objects on layers to total...")
  (princ)
)

(defun C:OBL (/)
  (LL:OUTPUT "" "\nSelect objects to total...")
  (princ)
)

(defun LL:OUTPUT (LL:SSTYPE         LL:PROMPT        /
                  LL:SS                 I                LL:ENAME
                  LL:ELIST         LLAYER        LLAYERLIST
                  LL:TOTALLENGTH LLAYERLENGTH        LL:ARCDELTA
                  LL:OBJLENGTH         LL:SPACE
                 )
  (prompt
    "\nLayer Lengths by Jaysen D. Long\nCopyright 1998-1999. All Rights Reserved."
  )
  (setq LLAYERLIST NIL)
  (prompt LL:PROMPT)
  (if (setq LL:SS
             (ssget
               '((0 . "ARC,CIRCLE,ELLIPSE,LINE,*POLYLINE,REGION,SPLINE"))
             )
      )
    (progn
      (repeat (setq I (sslength LL:SS))
        (setq LL:ELIST (entget (ssname LL:SS (setq I (1- I)))))
        (if (not (member (setq LLAYER (cdr (assoc 8 LL:ELIST)))
                         LLAYERLIST
                 )
            )
          (setq LLAYERLIST (append LLAYERLIST (list LLAYER)))
        )
      )
      (setq LL:TOTALLENGTH 0.0)
      (foreach X LLAYERLIST
        (setq LLAYERLENGTH 0.0)
        (command "._select" LL:SS "")
        (setq LL:SS
               (ssget
                 LL:SSTYPE
                 (list
                   (cons 0 "ARC,CIRCLE,ELLIPSE,LINE,*POLYLINE,REGION,SPLINE")
                   (cons 8 X)
                 )
               )
        )
        (repeat        (setq I (sslength LL:SS))
          (setq LL:ENAME (ssname LL:SS (setq I (1- I))))
          (setq LL:ELIST (entget LL:ENAME))
          (cond
            ((eq (cdr (assoc 0 LL:ELIST)) "ARC")
             (if
               (> (cdr (assoc 50 LL:ELIST)) (cdr (assoc 51 LL:ELIST)))
                (setq LL:ARCDELTA
                       (+ (abs (- (cdr (assoc 50 LL:ELIST))
                                  (* 2.0 pi)
                               )
                          )
                          (cdr (assoc 51 LL:ELIST))
                       )
                )
                (setq LL:ARCDELTA
                       (- (cdr (assoc 51 LL:ELIST))
                          (cdr (assoc 50 LL:ELIST))
                       )
                )
             )
             (setq LL:OBJLENGTH
                    (* (cdr (assoc 40 LL:ELIST)) LL:ARCDELTA)
             )
            )
            ((eq (cdr (assoc 0 LL:ELIST)) "LINE")
             (setq LL:OBJLENGTH
                    (distance (cdr (assoc 10 LL:ELIST))
                              (cdr (assoc 11 LL:ELIST))
                    )
             )
            )
            ((wcmatch (cdr (assoc 0 LL:ELIST))
                      "*POLYLINE,CIRCLE,ELLIPSE,REGION,SPLINE"
             )
             (command "._area" "_obj" LL:ENAME)
             (setq LL:OBJLENGTH (getvar "perimeter"))
            )
          )
          (setq LLAYERLENGTH (+ LLAYERLENGTH LL:OBJLENGTH))
        )
        (setq LL:SPACE        ""
              LL:PROMPT        (strcat        X
                                ": "
                                (rtos LLAYERLENGTH 2 2)
                                " LF"
                        )
        )
        (prompt        (strcat        "\n"
                        X
                        ": "
                        (repeat        (- 52 (strlen LL:PROMPT))
                          (setq
                            LL:SPACE (strcat LL:SPACE " ")
                          )
                        )
                        (rtos LLAYERLENGTH 2 2)
                        " LF"
                )
        )
        (setq LL:TOTALLENGTH (+ LL:TOTALLENGTH LLAYERLENGTH))
      )
      (setq LL:SPACE  ""
            LL:PROMPT (strcat "Total: "
                              (rtos LL:TOTALLENGTH
                                    2
                                    2
                              )
                              " LF"
                      )
      )
      (prompt (strcat "\nTotal: "
                      (repeat (- 52 (strlen LL:PROMPT))
                        (setq
                          LL:SPACE (strcat LL:SPACE " ")
                        )
                      )
                      (rtos LL:TOTALLENGTH 2 2)
                      " LF"
              )
      )
    )
  )
)
发表于 2003-10-24 01:38:00 | 显示全部楼层
哗!
好古董!
发表于 2003-10-24 07:58:00 | 显示全部楼层
人老了,收集的東西成便古董!哈哈!
发表于 2003-10-24 09:08:00 | 显示全部楼层
飞哥,你的这个程序有个小问题:
当PLINE线重合时有问题。如两条水平的长均为100的PLINE线,它计算的结果是100,而不是200。
你试一下。
发表于 2003-10-24 12:06:00 | 显示全部楼层
不可能,我看了程序,不会有这样的结果,而且我试了,结果也是正确的。
可能是你的操作有误,选择时,如果两条线重合,你必须窗交或窗围来选,而不能点取,你可以试试用删除,如果用点的话,你永远只能选中一条直线
发表于 2005-10-28 16:28:00 | 显示全部楼层
谢谢龙龙仔,正在找这个东西呢.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-10-1 23:49 , Processed in 0.197364 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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