找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1585|回复: 17

[LISP程序]:我编制的面积求解工具 请指点交流

[复制链接]
发表于 2004-8-4 21:46:41 | 显示全部楼层 |阅读模式

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

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

×
参考各位大侠的作品,我也写了一个求面积的程序。请大家多提意见,相互交流进一步完善。
程序主要特点:
1、支持批量选定需要求面积的实体;
2、根据用户要求进行面积的加、减;
3、对于直线组成的封闭图形可以先组成面域然后求出面积;
4、可以根据用户所提供求出面积的壁厚计算重量。
5、支持选定的实体有圆、弧、椭圆、轻型多段线、多段线、面域、或平面封闭样条曲线构成的封闭面积;
6、面积以平方米为单位输出。
7、加载程序以后,在命令行输入MJ即可调用。
暂时没有加入按比例求面积的功能。
[php]

(defun c:MJ ( / bh hd hd1 n obj oldcmdecho p1 ss sum tt tw zmj zzl)
  (setq oldcmdecho (getvar "cmdecho"))
  (setvar "cmdecho" 0)
  (vl-load-com)
  (setq        zmj 0
        sum 0
        n 0
  )
  (setq tt 1)
  (while (= tt 1)
    (setq
      hd (getint
           " 创建面域计算面积 / 选取实体计算面积/ 退出 ? 1/2/3 <2>"
         )
    )
    (if        (= hd nil)
      (setq hd 2)
    )
    (if        (/= hd 3)
      (progn
        (setq hd1 (getstring "相加/扣减?  +/- <+>"))
        (if (or (= hd1 "") (= hd1 nil))
          (setq hd1 "+")
        )
      )
    )
    (if        (= hd 2)
      (progn
        (setq ss (ssget        '((-4 . "<OR")
                          (0 . "Arc")
                          (0 . "Circle")
                          (0 . "Ellipse")
                          (0 . "LWPOLYLINE")
                          (0 . "POLYLINE")
                          (0 . "Region")
                          (0 . "Spline")
                          (-4 . "OR>")
                         )
                 )
        )
        (setq sum 0
              n        0
        )
        (if (= hd1 "+")
         (progn
            (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)) 1000000))
              )
              (setq n (1+ n))
            )
            (setq zmj (+ zmj sum))
          )
          (progn
            (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)) 1000000))
              )
              (setq n (1+ n))
            )
            (setq zmj (+ zmj sum))
          ))

        ;)
        (princ "\n当前计算面积(m2)= ")
        (princ zmj)
        (princ "\n")
      )
    )
    (if        (= hd 1)
      (progn
        (if (setq p1 (getpoint "\n选择闭合区域内任意一点建立面域"))
          (progn
            (command "boundary" p1 "")
            (command "._area" "_O" "L")
            (setq sum (/ (getvar "area") 1000000))
          )
        )
        (if (= hd1 "+")
          (setq zmj (+ zmj sum))
          (setq zmj (-zmj sum))
        )
        (princ "\n当前计算面积(m2)= ")
        (princ zmj)
        (princ "\n")
      )
    )
    (if        (= hd 3)
      (progn
        (setq tw (getint "是否计算金属材料重量? 计算1 /不计算 2 <1>"))
        (if (or (= tw nil) (= tw ""))
          (setq tw 1)
        )
        (if (= tw 1)
          (progn
            (setq bh (getreal "壁厚(mm)?"))
            (setq zzl (* zmj bh 7.85))
            (princ "\n总面积(m2)= ")
            (princ zmj)
            (princ "\n 净重")
            (princ zzl)
            (setq tt nil)
          )
        )
        (setq tt nil)
      )
    )
  )
  (setvar "cmdecho" oldcmdecho)
  (princ)
)

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

使用道具 举报

发表于 2004-8-4 22:16:58 | 显示全部楼层
1 ssget 这样写更简洁
  1. (ssget
  2.   '((0 . "Arc,Circle,Ellipse,*POLYLINE,Region,Spline"))
  3. )
复制代码

2 (command "boundary" p1 "")  不一定生成面域,建议使用

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

使用道具 举报

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

使用道具 举报

发表于 2004-8-5 07:30:10 | 显示全部楼层
去除孤岛的面积
REFER TO
1. http://www.xdcad.net/forum/showt ... hlight=%C3%E6%BB%FD
2. 先建HATCH>面积
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-8-5 07:43:20 | 显示全部楼层
最初由 梦断江南 发布
[B]完善一下,把bpoly排除孤岛写出来吧:) [/B]

Bpoly是忽略孤岛的,只形成外环。Boundary不忽略孤岛,可以这样处理:
1 记录 (entlast)
2 使用 Boundary 后判定 entlast 是不是多了,如果多了,将多出的部分生成面域。
3 用最大面积的面域减去其他面域面积
4 删除临时 面域实体。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2004-8-5 15:33:29 | 显示全部楼层
6楼楼主说的对,我也写了个类似的程序,当时主要是对格筏基础求面积,要先求出外轮廓面积,后减去内部孤岛面积。也是采用的那个办法。
回头我把我的源程序,贴出来给大家讨论。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-8-5 15:58:44 | 显示全部楼层
最初由 它山之石 发布
[B]6楼楼主说的对,我也写了个类似的程序,当时主要是对格筏基础求面积,要先求出外轮廓面积,后减去内部孤岛面积。也是采用的那个办法。
回头我把我的源程序,贴出来给大家讨论。 [/B]


希望早点看到你的程序。如何自动判定并括除孤岛面积,还是没有一个清晰的思路。希望得到各位进一步明确地指点。谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-8-5 20:20:45 | 显示全部楼层
最初由 lsjjm 发布
[B]去除孤岛的面积
REFER TO
1. http://www.xdcad.net/forum/showt ... hlight=%C3%E6%BB%FD
2. 先建HATCH>面积 [/B]


楼主的程序已经提供面积 +,- 功能,你链接中的程序也是这个方法,并无特别之处,我觉得6楼的思路不错。
提出这个“孤岛”的话题,主要是想简化步骤,“自动化”一些,只要在cad空间空白处点一下就自动求面积(有孤岛自动排除孤岛面积-不用再去选一轮,点中实体返回0,没有在封闭区域内返回nil或则0)

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

使用道具 举报

 楼主| 发表于 2004-8-5 21:07:51 | 显示全部楼层
6楼搂主的思路是不错,但是如何取得孤岛的选择集比较困难,目前还没有找到好的解决办法。正如梦版主所言,提出孤岛关键是提高“自动化”识别并排除孤岛面积的问题。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-8-6 03:56:45 | 显示全部楼层
10,11楼:
请参考
重建填充边界并求面积
http://www.xdcad.com/forum/showthread.php?s=&threadid=161134
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-8-6 06:41:33 | 显示全部楼层
最初由 xiaping 发布
[B]6楼搂主的思路是不错,但是如何取得孤岛的选择集比较困难,目前还没有找到好的解决办法。正如梦版主所言,提出孤岛关键是提高“自动化”识别并排除孤岛面积的问题。 [/B]

孤岛问题就是 Region In Region,在ARX版 RAVE 斑竹曾有过 ARx 代码,当然Lisp的效率不能和ARX比,但可以用来参考
http://www.xdcad.net/forum/showt ... d=308317#post308317
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-8-6 10:57:03 | 显示全部楼层
基本搞定,对于组合图形点击A点以后的计算结果如下图所示,正确地排除了孤岛面积。但是适用范围还需要进一步验证。
另外,解决了孤岛面积扣除问题以后 "-"面积的计算似乎已无必要,各位觉得如何?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-23 08:27 , Processed in 0.388360 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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