找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 869|回复: 13

[LISP函数]:线长统计及总长统计

[复制链接]
发表于 2008-12-22 11:07:29 | 显示全部楼层 |阅读模式

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

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

×
我想咨询您一个问题,我们这边搞坝身坝基处理,有很多直线,有没有一个程序一次性把单根直线的长度和总长度都统计出来的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 6644个

财富等级: 富甲天下

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

使用道具 举报

 楼主| 发表于 2008-12-22 16:39:06 | 显示全部楼层
我的要求是要把每根线的长度全部量测出来,最后可以直接导入EXCEL里边的那种,不知道可以实现,上面发的程序我看一下,好像不行呢,
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-12-22 17:13:18 | 显示全部楼层
  1. (defun c:TEST (/ ssmap getarea getlen alist lenlist)
  2.   (defun getarea (e)
  3.     (if        (vlax-property-available-p (vlax-ename->vla-object e) "area")
  4.       (vla-get-area (vlax-ename->vla-object e))
  5.       0
  6.     )
  7.   )
  8.   (defun getlen        (e)
  9.     (if        (vlax-property-available-p (vlax-ename->vla-object e) "length")
  10.       (vla-get-length (vlax-ename->vla-object e))
  11.       0
  12.     )
  13.   )
  14.   (defun SSMAP (func ss / n)
  15.     (if        (eq 'PICKSET (type ss))
  16.       (repeat (setq n (fix (sslength ss))) ; fixed
  17.         (apply func (list (ssname ss (setq n (1- n)))))
  18.       )
  19.     )
  20.   )
  21.   ;; main
  22.   (ssmap '(lambda (e)
  23.             (setq alist (cons (getarea e) alist))
  24.             (setq lenlist (cons (getlen e) lenlist))
  25.           )
  26.          (ssget
  27.            '((0 . "CIRCLE,POLYLINE,LWPOLYLINE,ARC,SPLINE,REGION,ELLIPSE,LINE")
  28.             )
  29.          )
  30.   )
  31.   (princ "\n总面积:")
  32.   (princ (apply '+ alist))
  33.   (princ "\n总长度:")
  34.   (princ (apply '+ lenlist))
  35.   (princ)
  36. )

  37. (princ "\n长度统计求和程序  秋枫,二〇〇八年十二月二十二日")
  38. (princ)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-12-22 17:19:04 | 显示全部楼层
选择对象:  ; 错误: no function definition: VLAX-ENAME->VLA-OBJECT
不晓得什么原因
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6644个

财富等级: 富甲天下

发表于 2008-12-22 17:42:05 | 显示全部楼层
先跑这个:
command: (vl-load-com)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-12-24 00:49:38 | 显示全部楼层
[PHP](DEFUN c:tt (/ ss loop num len)
   (SETVAR "CMDECHO" 0)
   (PROMPT "\n选择需要计算长度的直线或多段线:")
   (SETQ ss  (SSGET '((0 . "*LINE,ARC,CIRCLE,ELLIPSE")))
   loop (IF (NULL ss)
       0
       (SSLENGTH ss)
     )
   num  -1
   len  0
   )
   (REPEAT loop
  (COMMAND "._LENGTHEN" (SSNAME ss (SETQ num (1+ num))) "")
  (SETQ len (+ len (GETVAR "PERIMETER")))
   )
   (PRINC (STRCAT "\n" (ITOA loop) "个对象总长 = " (RTOS len 2 5)))
   (PRINC)
)[/PHP]
可测LINE,POLYLINE,3DPOLYLINE,SPLINE,ELLIPSE,CIRCLE,ARC
方法简单些,但通用性强些
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-12-24 08:52:16 | 显示全部楼层
Other method

  1. ;;;练习1: 曲线的长度及面积的总和
  2. ;;;writenn by carrot1983 2008-12-24 REV
  3. ;;;测试环境: CAD2006
  4. (defun C:TT1 (/ E I LEN LENLIST SS AREA AREALIST SSLEN)
  5.   (princ "\n练习: 曲线的长度及曲线的总和")
  6.   (setq        SS (ssget
  7.              '((0 . "SPLINE,POLYLINE,LWPOLYLINE,ARC,CIRCLE,ELLIPSE"))
  8.            )
  9.   )
  10.   (setq SSLEN (sslength SS))
  11.   (repeat (setq I SSLEN)
  12.     (setq E (ssname SS (setq I (1- I))))
  13.     (setq LENLIST (cons        (vlax-curve-getdistatparam
  14.                           E
  15.                           (vlax-curve-getendparam E)
  16.                         )
  17.                         LENLIST
  18.                   )
  19.     )
  20.     (setq AREALIST (cons (vlax-curve-getarea E)
  21.                          AREALIST
  22.                    )
  23.     )
  24.   )
  25.   (setq LEN (apply '+ LENLIST))
  26.   (setq AREA (apply '+ AREALIST))
  27.   (princ
  28.     (strcat "\n"
  29.             "总长 = "
  30.             (rtos LEN 2 5)
  31.             " 总面积 = "
  32.             (rtos AREA 2 5)
  33.     )
  34.   )
  35.   (princ)
  36. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2008-12-24 09:13:44 | 显示全部楼层
最初由 秋枫 发布
[B][code](defun c:TEST (/ ssmap getarea getlen alist lenlist)
  (defun getarea (e)
    (if        (vlax-property-available-p (vlax-ename->vla-object e) "area")
      (vla-get-area (vlax-ename->vla-object e))... [/B]


对region,长度返回0。用个原始的:

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

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

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

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2008-12-24 10:03:51 | 显示全部楼层
最初由 eachy 发布
[B]用 vlax-curve-getarea 和 vlax-curve-getdistatparam [/B]


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

使用道具 举报

 楼主| 发表于 2008-12-24 10:10:24 | 显示全部楼层
非常感谢各位的支持与捧场,特别感谢7楼的朋友,感觉可以了,谢谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-12-24 10:34:39 | 显示全部楼层
(defun getlen (sname / l)
(command "._area" "_o" sname)
(setq l (getvar "perimeter"))
)
(defun getarea (sname / ar)
(command "._area" "_o" sname)
(setq ar (getvar "area"))
)

最早学习的时候就用这个。。。
绕了那么大的圈,还是回到了原来的地方
呵呵。。。发现自已没长进啊。。。


  1.   [FONT=courier new]
  2. ;;;= = = = = = = Begin = = = = = = =
  3. ;;;练习1: 曲线的长度总和
  4. ;;;writenn by carrot1983 2008-12-24
  5. ;;;测试环境: CAD2006
  6. (defun C:TT1 (/ E I LEN LENLIST SS SSLEN)
  7.   (princ "\n练习: 曲线的长度总和")
  8.   (setq        SS
  9.          (ssget
  10.            '((0
  11.               .
  12.               "LINE,SPLINE,POLYLINE,LWPOLYLINE,ARC,CIRCLE,ELLIPSE"
  13.              )
  14.             )
  15.          )
  16.   )
  17.   (setq SSLEN (sslength SS))
  18.   (repeat (setq I SSLEN)
  19.     (setq E (ssname SS (setq I (1- I))))
  20.     (setq LENLIST (cons        (vlax-curve-getdistatparam
  21.                           E
  22.                           (vlax-curve-getendparam E)
  23.                         )
  24.                         LENLIST
  25.                   )
  26.     )
  27.   )
  28.   (setq LEN (apply '+ LENLIST))
  29.   (princ
  30.     (strcat "\n"
  31.             "总长 = "
  32.             (rtos LEN 2 5)
  33.     )
  34.   )
  35.   (princ)
  36. )
  37. ;;;TT1的缺点:没办法求出HATCH,REGION的长度


  38. ;;;= = = = = = = I am separator = = = = = = =
  39. ;;;练习2: 曲线的面积总和
  40. ;;;writenn by carrot1983 2008-12-24
  41. ;;;测试环境: CAD2006
  42. (defun C:TT2 (/ AREA AREALIST E I SS SSLEN)
  43.   (princ "\n练习: 曲线的面积总和")
  44.   (setq        SS
  45.          (ssget
  46.            '((0
  47.               .
  48.               "SPLINE,POLYLINE,LWPOLYLINE,ARC,CIRCLE,ELLIPSE"
  49.              )
  50.             )
  51.          )
  52.   )
  53.   (setq SSLEN (sslength SS))
  54.   (repeat (setq I SSLEN)
  55.     (setq E (ssname SS (setq I (1- I))))
  56.     (setq AREALIST (cons (vlax-curve-getarea E)
  57.                          AREALIST
  58.                    )
  59.     )
  60.   )
  61.   (setq AREA (apply '+ AREALIST))
  62.   (princ
  63.     (strcat "\n"
  64.             " 总面积 = "
  65.             (rtos AREA 2 5)
  66.     )
  67.   )
  68.   (princ)
  69. )
  70. ;;;TT2的缺点:没办法求出HATCH,REGION的面积
  71. ;;;为什么面积跟长度分开,就是因为LINE是没有面积属性。
  72. ;;;当然可以在循环里面加个判断。


  73. ;;;= = = = = = = I am separator = = = = = = =
  74. ;;;这次写个完整版的
  75. ;;;这个command的版本较简单,又能适用于填充和面域。
  76. ;;;练习3: 长度及面积的总和
  77. ;;;writenn by carrot1983 2008-12-24
  78. ;;;测试环境: CAD2006
  79. (defun C:TT3 (/ AREA AREALIST E I LEN LENLIST SS SSLEN V0)
  80.   (setvar "cmdecho" 0)
  81.   (princ "\n统计长度及面积的总和 carrot1983 2008-12-24")
  82.   (setq
  83.     SS
  84.      (ssget
  85.        '((0
  86.           .
  87.           "LINE,SPLINE,POLYLINE,LWPOLYLINE,ARC,CIRCLE,ELLIPSE,HATCH,REGION"
  88.          )
  89.         )
  90.      )
  91.   )
  92.   (setq SSLEN (sslength SS))
  93.   (repeat (setq I SSLEN)
  94.     (setq E (ssname SS (setq I (1- I))))
  95.     (setq V0 (cdr (assoc 0 (entget E))))
  96.     (cond ((= V0 "LINE")
  97.            (command "._LENGTHEN" E "")
  98.            (setq LENLIST (cons (getvar "PERIMETER") LENLIST))
  99.           )
  100.           ((/= V0 "LINE")
  101.            (command "._AREA" "O" E)
  102.            (setq LENLIST (cons (getvar "PERIMETER") LENLIST))
  103.            (setq AREALIST (cons (getvar "AREA") AREALIST))
  104.           )
  105.     )
  106.   )
  107.   (setq LEN (apply '+ LENLIST))
  108.   (setq AREA (apply '+ AREALIST))
  109.   (princ
  110.     (strcat "\n"
  111.             "总长 = "
  112.             (rtos LEN 2 5)
  113.             " 总面积 = "
  114.             (rtos AREA 2 5)
  115.     )
  116.   )
  117.   (setvar "cmdecho" 1)
  118.   (princ)
  119. )
  120. ;;;= = = = = = = End = = = = = = =
  121.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 19:16 , Processed in 0.219117 second(s), 57 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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