找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2855|回复: 34

[原创]:如图示的两条多义线,如何得到两者之间的面积

[复制链接]
发表于 2003-1-15 12:04:19 | 显示全部楼层 |阅读模式

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

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

×
如图示的两条多义线,如何得到两者之间的面积,用area要点击每个交点才能得出,比较麻烦,如用选对象方式只能选一个就计算结束,因为我要算很多这种情况下的面积,能不能只点中间一个点,即可算出包围的面积呢?或者有其他的省时方法?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-1-15 12:13:44 | 显示全部楼层

FLASH教学

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

使用道具 举报

 楼主| 发表于 2003-1-15 12:20:08 | 显示全部楼层
这个方法不错,
要是有段lsp代码就好了,一气呵成,最后把新建的边界也删掉。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2003-1-15 14:37:46 | 显示全部楼层

Re: [原创]:如图示的两条多义线,如何得到两者之间的面积

最初由 god 发布
[B]如图示的两条多义线,如何得到两者之间的面积,用area要点击每个交点才能得出,比较麻烦,如用选对象方式只能选一个就计算结束,因为我要算很多这种情况下的面积,能不能只点中间一个点,即可算出包围的面积呢?或者... [/B]

刚开始用API时写的,应该还能用。

  1. ;|
  2. 命令:Plarea

  3. 功能:计算封闭曲线(*polyline,spline,circle,ellipse)面积并标注

  4. 说明:用于统计曲线面积,包括三种方式:
  5.       1. boundary方式,拾取点,如果生成边界则标面积
  6.       2. 统计图层曲线面积
  7.       3. 选择范围后标注所有曲线积   

  8.       程序中标注数字采用了临时图层tmp_area,方便使用

  9.       需配合xdrx_api build 11208以上版本使用。
  10. |;

  11. (defun c:plarea        (/ kw redraw_le get_area get_layer_area get_point_area)
  12.   (defun redraw_le ()
  13.     (foreach e le_drw (redraw e 4))
  14.     (foreach e le_del (entdel e))
  15.     (setq le_drw nil
  16.           le_del nil
  17.     )
  18.   )
  19.   (defun get_area (l / _$area _area ss ss0 ss1 e e1 info pt str len)
  20.     (setq ss1 (ssadd)
  21.           _$area 0.0
  22.     )
  23.     (princ
  24.       "\n选择拾取范围 (*polyline,circle,ellipse,spline)<全选>: "
  25.     )
  26.     (setq ss (ssget "x" l))
  27.     (setq ss0 (ssget l)
  28.           ss  (if ss0
  29.                 ss0
  30.                 ss
  31.               )
  32.     )
  33.     (xdrx_setsstodb ss 0)
  34.     (while (setq e (xdrx_getentdata 0))
  35.                                         ;(if (xdrx_curve_isclosed e)
  36.                                         ;        (progn
  37.       (setq _$area (+ (car (xdrx_getarea e)) _$area))
  38.                                         ;(command ".text" "j" "mc" pt (* 3 bl) 0 str)
  39.                                         ;        )
  40.                                         ;(setq ss1 (ssadd e ss1))
  41.                                         ;     )
  42.     )
  43.     (princ (strcat "\n\t总面积为 " (rtos _$area 2 2) "。"))
  44.     (xdrx_ucsoff)
  45.     (xdrx_end)
  46.     ;|(if        (/= (sslength ss1) 0)
  47.       (progn
  48.         (If (And
  49.               (Zerop (Getvar "cmdactive"))
  50.               (Ssget "i")
  51.             )
  52.           (sssetfirst nil)
  53.         )
  54.         (xdrx_setsstodb ss1 0)
  55.         (while (setq e1 (xdrx_getentdata 0))
  56.           (redraw e1 3)
  57.           (setq le_drw (cons e1 le_drw))
  58.         )
  59.         (redraw_le)
  60.         (sssetfirst nil ss1)
  61.         (setq len (rtos (sslength ss1) 2 0))
  62.         (prompt
  63.           (strcat "\n\t" "共 " len " 根非闭合多义线未标注面积。")
  64.         )
  65.       )
  66.     )|;
  67.   )
  68.   (defun get_layer_area        (/ e)
  69.     (setq e (xdrx_entsel "\n拾取实体: "))
  70.     (princ (strcat "\n你已选择了 " (xdrx_getentdxf 8) " 层"))
  71.     (get_area (list '(0 . "*polyline,circle,ellipse,spline")
  72.                     (cons 8 (xdrx_getentdxf 8))
  73.               )
  74.     )
  75.   )
  76.   (defun get_point_area        (/ p0 e str info tf)
  77.     (setq p0 (getpoint "\n拾取标注范围内一点: "))
  78.     (while p0
  79.       (if (setq e (bpoly p0))
  80.         (progn
  81.           (setq info (xdrx_getarea e))
  82.           (entdel (entlast))
  83.           (setq str (rtos (/ (car info) 1e6) 2 2))
  84.           (command ".text" "j" "mc" p0 (* 3 bl) 0 str)
  85.         )
  86.         (progn
  87.           (xdrx_drawing_viewsave)
  88.           (command ".zoom" ".3x")
  89.           (setq tf T)
  90.           (alert "无法找到范围, 重新选择!")
  91.         )
  92.       )
  93.       (setq p0 (getpoint "\n拾取标注范围内一点: "))
  94.     )
  95.     (if        tf
  96.       (xdrx_drawing_viewres)
  97.     )
  98.   )
  99.   (xdrx_begin "tmp_area" "1" '("cmdecho" "0"))
  100.   (xdrx_ucson)
  101.   (initget "1 2 3")
  102.   (setq kw (getkword "\n[1 拾取点/2 按图层/3 选择范围]<3>: "))
  103.   (cond        ((eq kw "1") (get_point_area))
  104.         ((eq kw "2") (get_layer_area))
  105.         (T (get_area '((0 . "*polyline,circle,ellipse,spline"))))
  106.   )
  107.   (princ)
  108. )
  109. (princ)
  110. (prompt
  111.   "\n\t面积标注工具之一Ver 1.0,命令C:plarea。"
  112. )
  113. (princ)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2003-1-15 17:26:24 | 显示全部楼层
用不了啊

我装的是xdbox0.27,xdapi是3010。
Command:
***  == AutoCAD 应用程序开发接口XdRx_API For ACAD R14 Build 30107 ==  ***

***  请访问“晓东的CAD空间 http://xdsoft.126.com”获取最新版本 ***
XDsoft loaded completed.

在r14下出现这种提示。

Command:  PLAREA
[1 拾取点/2 按图层/3 选择范围]<3>: 1
拾取标注范围内一点:
错误: bad argument type

Requires numeric distance or second point.

Requires numeric distance or second point.

Requires numeric distance or second point.
((ST) (IF (AND (/= ST "Function cancelled") (/= ST "quit / exit abort")) (PRINC
(STRCAT "\n错误: " ST "\n"))) (XDRX_END) (XDRX_SYSVAR_POP)
(XDRX_DRAWING_VIEWRES) (XDRX_PBAREND) (SETQ *ERROR* $XDLSP_ERROR))
Height <0.2000>: *Cancel*

Command:  

在2002下出现这种提示。

Regenerating model.

AutoCAD menu utilities loaded.
***  == AutoCAD 应用程序开发接口XdRx_API For ACAD 2000 Build 30107 ==  ***


***  请访问“晓东的CAD空间 http://xdsoft.126.com”获取最新版本 ***
XDsoft loaded completed.
Command:

Command: plarea
[1 拾取点/2 按图层/3 选择范围]<3>: 1
拾取标注范围内一点:
错误: 参数类型错误: numberp: nil

Requires numeric distance or second point.

Requires valid numeric angle or second point.
Unknown command "A".  Press F1 for help.
Unknown command "ON".  Press F1 for help.

Command:

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

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2003-1-15 18:42:08 | 显示全部楼层
忘了,里面有个全局变量 bl 控制字高的,说说你的要求,我可以再改改。还有R14下和2000的 text 命令参数有区别的。

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

使用道具 举报

 楼主| 发表于 2003-1-16 10:10:03 | 显示全部楼层
试了一下,2002下可以用,不过标注的面积不正确,小了很多很多倍。

我觉得选中范围后应暂停一下,以便看清楚选中的范围到底对不对。因为多数情况下,图形的线条比较多,容易出错。

最好也能计算由line组成的封闭图形,

bpoly是xdrx-api吗?

14和2002的text命令不一样吗,我试了试,还是一样的嘛,没看出有什么不一样啊。

其实我觉得用-BOUNDARY命令就能比较完美的找到边界了。再增加一个删除边界和标注,只要几个语句就行了。对吧
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-1-16 14:14:52 | 显示全部楼层
看看这段代码有什么问题?为什么在acad2002下不能得到面积结果?

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

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2003-1-16 18:15:50 | 显示全部楼层
最初由 god 发布
[B]看看这段代码有什么问题?为什么在acad2002下不能得到面积结果?

(defun c:ww()
        (command "BOUNDARY"  )
        (command "area" "o" (entlast))
        (entdel (entlast))
) [/B]

bpoly 是lisp函数,在手册上没有,我也是经人指点:4 后才知道的。不要用command,用bpoly函数,如果生成线返回实体,否则为nil。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-1-17 11:53:31 | 显示全部楼层
最初由 god 发布
[B]看看这段代码有什么问题?为什么在acad2002下不能得到面积结果?

(defun c:ww()
        (command "BOUNDARY"  )
        (command "area" "o" (entlast))
        (entdel (entlast))
) [/B]

这样就可以了:
(defun c:ww()
        (command "BOUNDARY" (getpoint) "")
                     (command "area" "o" (entlast))
        (entdel (entlast))
)
你的问题主要是出在没有正确地结束"boundary"命令。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2003-1-17 14:00:24 | 显示全部楼层
最初由 god 发布
[B]为什么求面积代码执行不了呢?

(defun c:ww()
        (bpoly )
        (command "area" "o" (entlast))
) [/B]

应该是

  1. (if [color=blue](bpoly (getpoint "\n内部点: "))[/color]
  2.   (command ".area" "o" (entlast))
  3. )


另:command 内少用 getxxx 函数,最好在前面单独用 getxxx 获得参数。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-1-17 14:01:22 | 显示全部楼层 |阅读模式

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

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

×
这句还是不能执行

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

已领礼包: 593个

财富等级: 财运亨通

发表于 2003-1-17 14:08:13 | 显示全部楼层
最初由 god 发布
[B]这句还是不能执行

(command "area" "o" (entlast)) [/B]

完善一下

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

使用道具 举报

发表于 2003-2-26 22:24:54 | 显示全部楼层
最初由 god 发布
[B]这句还是不能执行

(command "area" "o" (entlast)) [/B]



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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-28 15:46 , Processed in 0.371771 second(s), 63 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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