找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2515|回复: 21

[LISP程序]:计算选定对象的"总面积"和"总长度"

[复制链接]
发表于 2003-12-4 17:34:26 | 显示全部楼层 |阅读模式

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

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

×
;;; AREAM.LSP
;;; Function: Calculates the total area of selected objects
;;; By Jimmy Bergmark
;;; Copyright (C) 1997-2002 JTB World, All Rights Reserved
;;; Website: www.jtbworld.com / http://jtbworld.vze.com
;;; E-mail: info@jtbworld.com / jtbworld@hotmail.com
;;; Tested on AutoCAD 2000

(defun c:aream (/ olderr oldcmdecho errexit undox restore ss1 nr en tot_area)
  (defun errexit (s)
    (restore)
  )

  (defun undox ()
    (command "._undo" "_E")
    (setvar "cmdecho" oldcmdecho)
    (setq *error* olderr)
    (princ)
  )

  (setq olderr  *error*
        restore undox
        *error* errexit
  )
  (setq oldcmdecho (getvar "cmdecho"))
  (setvar "cmdecho" 0)
  (command "._UNDO" "_BE")
  (if (setq ss1 (ssget '((-4 . "<OR")
                         (0 . "POLYLINE")
                         (0 . "LWPOLYLINE")
                         (0 . "CIRCLE")
                         (0 . "ELLIPSE")
                         (0 . "SPLINE")
                         (0 . "REGION")
                         (-4 . "OR>")
                        )
                )
      )
    (progn
      (setq nr 0)
      (setq tot_area 0.0)
      (setq en (ssname ss1 nr))
      (while en
        (command "._area" "_O" en)
        (setq tot_area (+ tot_area (getvar "area")))
        (setq nr (1+ nr))
        (setq en (ssname ss1 nr))
      )
      (princ "\nTotal Area = ")
      (princ tot_area)
    )
  )
  (restore)
)

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

(DEFUN c:aream (/ num1 ss1 tot_area)
    (SETVAR "useri1" (GETVAR "cmdecho"))
    (SETVAR "cmdecho" 0)
    (IF (SETQ tot_area 0.0
              num1     -1
              ss1      (SSGET '((0 . "POLYLINE,LWPOLYLINE,CIRCLE,ELLIPSE,SPLINE,SPLINE,REGION")))
        )
        (PROGN (COMMAND "area" "a" "o")
               (REPEAT (SSLENGTH ss1) (COMMAND (SSNAME ss1 (SETQ num1 (1+ num1)))))
               (COMMAND "" "")
               (PRINC (STRCAT "\nTotal Area = " (RTOS (GETVAR "area") 2)))
        )
    )
    (SETVAR "cmdecho" (GETVAR "useri1"))
    (PRINC)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-5 03:57:57 | 显示全部楼层
我也来一个:

(defun c:test ()
  (vl-load-com)
  (setq ss (ssget))
  (setq sum 0 n 0)
  (while (< n (sslength ss))
    (setq obj (vlax-ename->vla-object (ssname ss n)))
    (if (vlax-property-available-p obj "area")
      (setq sum (+ sum (vla-get-area obj)))
    )
    (setq n (1+ n))
  )
  sum
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-9 22:30:20 | 显示全部楼层

  1. [FONT=courier new]
  2. (defun c:TOTALAREA (/ ss e alist)
  3.   (vl-load-com)
  4.   (ssmap '(lambda (e)
  5.             (setq alist (cons (vla-get-area (vlax-ename->vla-object e)) alist))
  6.           )
  7.          (ssget '((0 . "POLYLINE,LWPOLYLINE,CIRCLE,ELLIPSE,SPLINE,SPLINE,REGION")))
  8.   )
  9.   (princ "\n总面积:")
  10.   (apply '+ alist)
  11. )
  12. [/FONT]


其中ssmap是通用函数:

  1. [FONT=courier new]
  2. ;;; Apply a function to each ent in ss, in reversed order
  3. ;;; Faster than with std-sslist, but not so easy to understand.
  4. ;;; Ex: (ssmap 'entupd (ssget))   ; regenerate only some entities
  5. (defun SSMAP (func ss / n)
  6.   (if (eq 'PICKSET (type ss))
  7.     (repeat (setq n (fix (sslength ss))) ; fixed
  8.       (apply func (list (ssname ss (setq n (1- n)))))
  9.     )
  10.   )
  11. )[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-12-9 22:55:34 | 显示全部楼层
r14还是用第一贴吧.

总面积:

  1. (defun c:totalarea( / ss all j)
  2. (if(setq all 0 j -1 ss(ssget '((0 . "*POLYLINE,CIRCLE,ELLIPSE,SPLINE,REGION,ARC"))))
  3.    (repeat(sslength ss)
  4.        (setq all(+ all(vla-get-area (vlax-ename->vla-object (ssname ss(setq j(1+ j)))) )))
  5.   ))
  6. (princ (strcat "\n总面积:"(rtos all 2 3)))
  7. (princ)
  8. )


总长度:

  1.   (defun c:totallen( / ss all j)
  2. (if(setq all 0 j -1 ss(ssget '((0 . "*LINE,CIRCLE,ELLIPSE,ARC,REGION"))))
  3.    (repeat(sslength ss)
  4.        (setq all(+ all(vlax-curve-getDistAtParam
  5.                         (setq e(vlax-ename->vla-object(ssname ss(setq j(1+ j)))))
  6.                           (vlax-curve-getEndParam e)
  7.                       )
  8.                        
  9.         ))
  10.   ))
  11. (princ (strcat "\n总长度:"(rtos all 2 3)))
  12. (princ)
  13. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-9 23:09:19 | 显示全部楼层
1.為何版主只對4樓樓主獎勵?只因該程序看起來較有水準?
2.lwpolyline,spline,arc在非閉合的情況下也能求得面積,但其真正的含意?
3.程序中能將同性質分別統計更佳
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-12-9 23:15:15 | 显示全部楼层
这种东东网上找找一大把:-)

2.没面积就为0。(自动闭合后的面积)

我加分是秋枫提供了另一种对付选集的方法,虽然他也不是原创,但我希望大家用之.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-9 23:43:18 | 显示全部楼层
最初由 aeo 发布
[B]2.没面积就为0。(自动闭合后的面积)[/B]


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

使用道具 举报

发表于 2003-12-10 12:39:24 | 显示全部楼层
最初由 f5612140 发布
[B]

個人以為,以實務考量,在非閉合的情形下,應將該面積剔除 [/B]

有个这样的例子, 一个农夫修了几个羊圈, 暂时还没有装门(也就是说不封闭), 那么这时要问这几个羊圈占地面积是多少? 你能说这些面积应剔除吗?
--不要只从纯数学的角度来理解, CAD就是那么规定的...
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-10 15:57:38 | 显示全部楼层
最初由 lsjjm 发布
[B]
有个这样的例子, 一个农夫修了几个羊圈, 暂时还没有装门(也就是说不封闭), 那么这时要问这几个羊?.. [/B]


1.何不等羊圈的門弄好再說,更何況有的才剛弄羊圈就說這塊地是我的
2.每個人的需求不一樣,程序設計中又沒有分類統計,做出來的只是一個數字,圖面上多畫一個lwpolyline,或一個arc就得到不同的結果,不是想和您抬槓,只是提供出來討論,讓程序設計時考慮的更嚴謹而已
3.cad只是一個工具,並沒有規定這樣得到的結果就要接受它
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-12-10 23:43:34 | 显示全部楼层
最初由 f5612140 发布
[B]
讓程序設計時考慮的更嚴謹而已...
[/B]


我们这里只讨论怎么实现,至于考虑的问题全面不全面,写的时候大家都明白.
如果只是想要一个程序,而不是交流lisp,请到"编程申请"板块.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-11 09:50:29 | 显示全部楼层
最初由 aeo 发布
[B]

我们这里只讨论怎么实现,至于考虑的问题全面不全面,写的时候大家都明白.
如果只是想要一个程序,而不是交流lisp,请... [/B]


1.只是好心提醒,卻得到這般態度
2.您確定寫的人,用的人都明白
3.我自己專攻工程估算,這些東西我都用到爛了,我還會把他當寶?
4.此板塊回應至此,祝你們玩的愉快
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-14 05:38:33 | 显示全部楼层
兄弟,别走啊.我个人以为你对事情严谨的态度是值得钦佩的.我支持你.
也希望有一个程序能在判断上加是否闭合的功能,这样看起来总是更完善些 :)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-14 06:07:58 | 显示全部楼层
最初由 陌生人 发布
[B]...也希望有一个程序能在判断上加是否闭合的功能,这样看起来总是更完善些 :) [/B]


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

使用道具 举报

发表于 2003-12-23 10:09:34 | 显示全部楼层
那位大侠能在自己的程序上加个功能,在统计面积时,把没有闭合的物体标记出来,比如换个图层。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-27 02:01 , Processed in 0.215782 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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