找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 994|回复: 8

[编程申请]:求 去除孤岛的面积

[复制链接]
发表于 2003-9-18 22:54:07 | 显示全部楼层 |阅读模式

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

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

×
有一闭合pl线,里面有若干闭合pl线(孤岛),求,去除孤岛后的面积。请各位高手帮忙,谢谢……
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-9-19 04:33:03 | 显示全部楼层
去除孤岛后的面积:
(defun c:test ()
  (vl-load-com)
  (setq ent (car (entsel "\nSelect Original Polyline: ")))
  (setq a0 (curvearea ent))
  (prompt "\nSelect Island Polyline: ")
  (setq ss (ssget) n 0 sum 0)
  (while (< n (sslength ss))
    (setq sum (+ sum (curvearea (ssname ss n))))
    (setq n (1+ n))
  )
  (- a0 sum)
)
(defun curvearea (ent)
  (setq obj (vlax-ename->vla-object ent))
  (setq  ar (vla-get-area obj))
  ar
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-9-20 22:38:42 | 显示全部楼层
谢谢青铜长老。
假设里面有很多个孤岛,或者说有n个,难以逐个点出,能否只选择最外面的pl后,里面的pl闭合区域面积自动扣除。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-8-6 11:34:37 | 显示全部楼层
看不太懂,还得提高学习,好像只能求闭合的实体面积,不能求由直线组成的面积。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-8-6 16:17:45 | 显示全部楼层
最初由 ShiwJeff 发布
[B]谢谢青铜长老。
假设里面有很多个孤岛,或者说有n个,难以逐个点出,能否只选择最外面的pl后,里面的pl闭合区域面积自动扣除。 [/B]

可以啊
做循环就可以了
先求一个大的
用ssget  w  取出所有的面
然后相减就可以了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-11-23 13:34:30 | 显示全部楼层
晕,竟然有这么好的工具,可惜不能对填充求面积:(~~,我去想想该怎么改~~
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-11-23 13:52:25 | 显示全部楼层
test
Select Original Polyline: ; 错误: ActiveX 服务器返回错误: 未知名称: Area
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-11-24 03:45:19 | 显示全部楼层
最初由 xxxyzxx 发布
[B]晕,竟然有这么好的工具,可惜不能对填充求面积:(~~,我去想想该怎么改~~ [/B]

搜索一下论坛就知道了,请参考:
重建填充(hatch边界并求面积
http://www.xdcad.net/forum/showthre...threadid=161134
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-11-24 12:18:28 | 显示全部楼层
  这是我写的面积相关程序的一部分,其中JMJ命令就是利用了楼主所说的原理来计算基底净面积的。MJS命令可以设置比例等。


  1. ;;;       =============================================
  2. ;;;       |              面积相关程序                 |
  3. ;;;       |           Update: 2004.09.18              |
  4. ;;;       =============================================

  5. (defun C:mjs (/ ctscale htccale xdw xdws)
  6.   (setvar "CMDECHO" 0)

  7.   (if (= cts nil)
  8.     (setq cts 100)
  9.   )
  10.   (setq
  11.     ctscale (getreal (strcat "\n出图比例(1:?) <" (rtos cts 2 0) ">:"))
  12.   )
  13.   (if (= ctscale nil)
  14.     (setq ctscale cts)
  15.   )
  16.   (setq cts ctscale)

  17.   (if (= htc nil)
  18.     (setq htc 100)
  19.   )
  20.   (setq
  21.     htccale (getreal (strcat "\n绘图比例(1:?) <" (rtos htc 2 0) ">:"))
  22.   )
  23.   (if (= htccale nil)
  24.     (setq htccale htc)
  25.   )
  26.   (setq htc htccale)

  27.   (if (or (= xd nil) (= xd ""))
  28.     (setq xd "M")
  29.   )
  30.   (setq xdw (getstring (strcat "\n显示单位 <" xd ">:")))
  31.   (if (= xdw "")
  32.     (setq xdw xd)
  33.   )
  34.   (setq xd xdw)
  35.   (cond        ((or (eq xdw "mm") (eq xdw "MM")) (setq xdws 1))
  36.         ((or (eq xdw "cm") (eq xdw "CM")) (setq xdws 1000))
  37.         ((or (eq xdw "m") (eq xdw "M")) (setq xdws 1000000))
  38.   )
  39.   (setq mj_sc (* (* (/ ctscale htccale) (/ ctscale htccale)) xdws))
  40.   (princ)

  41. )

  42. (defun C:jmj (/        ss sss sc os xzs pt n stm stmm mj_txt mjm_txt mjj_txt
  43.               test)

  44.   (princ (strcat "\n***基底面积自动计算软件040201***"))
  45.   (princ (strcat "\n       [它山之石作品]"))
  46.   (princ)

  47.   (command "undo" "be")
  48.   (setq        olderr        *error*                        ; Initialize variables
  49.         *error*        chgterr
  50.   )
  51.   (setvar "CMDECHO" 0)

  52.   (setq os (getvar "OSMODE"))
  53.   (setvar "OSMODE"
  54.           (if (> os 16383)
  55.             os
  56.             (+ 16384 os)
  57.           )
  58.   )
  59.   (setq lay (getvar "clayer"))
  60.   (if mj_sc
  61.     (setq mj_sc mj_sc)
  62.     (setq mj_sc 1000000)
  63.   )
  64.   (if xd
  65.     (setq xd xd)
  66.     (setq xd "m")
  67.   )

  68.   (if (or (= nil (tblsearch "layer" "文字__面积"))
  69.           (/= (cdr (assoc 8 (tblsearch "layer" "文字__面积"))) 0)
  70.       )
  71.     (command "layer" "m" "文字__面积" "c" "255" "文字__面积" "")
  72.     (command "layer" "s" "文字__面积" "" "")
  73.   )
  74. ;;; 如果图中原有面域则删除
  75.   (setq ss (ssget "X" '((0 . "REGION"))))
  76.   (if ss
  77.     (command "erase" ss "")
  78.   )

  79.   (setq pt (getpoint "\n请点取基底范围内一点<退出>:"))
  80.   (if pt
  81.     (progn
  82.       (setvar "HPBOUND" 0)
  83.       (command "boundary" pt "")
  84.       (setq ss (ssget "X" '((0 . "REGION"))))



  85.       (if ss                                ; 如果选取到了实体
  86.         (progn
  87.           (setq xzs (sslength ss))
  88.           (setq mjm_txt 0)                ;mj_txt---重叠面积

  89.           (setq n 1)                        ;n---实体数
  90.           (while (<= n xzs)                ;对选取的实体逐个进行处理
  91.             (setq stm (ssname ss (1- n))) ;stm---实体名称
  92.             (command "area" "o" stm)
  93.             (setq mjj_txt (getvar "AREA")) ;mj_txt---重叠面积
  94.             (if        (< mjm_txt Mjj_txt)
  95.               (setq stmm    stm
  96.                     Mjm_txt Mjj_txt
  97.               )
  98.             )
  99.             (setq n (+ 1 n))                ;下一个实体
  100.           )                                ;while


  101.           (setq sss (ssadd))                ;ss---获得生成的面域实体
  102.           (setq sss (ssadd stmm sss))        ;获得生成的面域实体
  103.           (setq ss (ssdel stmm ss))        ;获得生成的面域实体
  104.           (if (< 1 xzs)
  105.             (command "subtract" sss "" ss "")
  106.           )                                ;如果获得了一个以上的面域,则生成交集。
  107.           (command "area" "o" (entlast)) ;获得交集的面积
  108.           (setq mj_txt (getvar "AREA"))        ;mj_txt---交集面积
  109.           (setq mj_txt (rtos (/ mj_txt mj_sc) 2 2))
  110.           (setq mjm_txt (rtos (/ mjm_txt mj_sc) 2 2))
  111.           (cond        ((or (eq xd "mm") (eq xd "MM"))
  112.                  (alert        (strcat        "基底外包面积为: "
  113.                                 mjm_txt
  114.                                 " 平方毫米   基底净面积为: "
  115.                                 mj_txt
  116.                                 " 平方毫米"
  117.                                )
  118.                  )
  119.                 )
  120.                 ((or (eq xd "cm") (eq xd "CM"))
  121.                  (alert        (strcat        "基底外包面积为: "
  122.                                 mjm_txt
  123.                                 " 平方厘米   基底净面积为: "
  124.                                 mj_txt
  125.                                 " 平方厘米"
  126.                                )
  127.                  )
  128.                 )
  129.                 ((or (eq xd "m") (eq xd "M"))
  130.                  (alert        (strcat        "基底外包面积为: "
  131.                                 mjm_txt
  132.                                 " 平方米   基底净面积为: "
  133.                                 mj_txt
  134.                                 " 平方米"
  135.                                )
  136.                  )
  137.                 )
  138.           )


  139.         )                                ;progn ss
  140.         (alert (strcat "\n无法得到正确的基底边界"))

  141.       )                                        ;if ss
  142.     )                                        ;progn pt
  143.   )                                        ;if pt

  144.   (command "layer" "s" lay "")
  145.   (setvar "osmode" os)
  146.   (setq *error* olderr)                        ; Restore old *error* handler
  147.   (command "undo" "e")
  148.   (command "undo" "")

  149.   (princ (strcat "\n***基底面积自动计算软件040201***"))
  150.   (princ (strcat "\n      [它山之石作品]"))
  151.   (princ)
  152. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-21 21:53 , Processed in 0.194418 second(s), 49 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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