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

- ;|
- 命令:Plarea
- 功能:计算封闭曲线(*polyline,spline,circle,ellipse)面积并标注
- 说明:用于统计曲线面积,包括三种方式:
- 1. boundary方式,拾取点,如果生成边界则标面积
- 2. 统计图层曲线面积
- 3. 选择范围后标注所有曲线积
- 程序中标注数字采用了临时图层tmp_area,方便使用
- 需配合xdrx_api build 11208以上版本使用。
- |;
- (defun c:plarea (/ kw redraw_le get_area get_layer_area get_point_area)
- (defun redraw_le ()
- (foreach e le_drw (redraw e 4))
- (foreach e le_del (entdel e))
- (setq le_drw nil
- le_del nil
- )
- )
- (defun get_area (l / _$area _area ss ss0 ss1 e e1 info pt str len)
- (setq ss1 (ssadd)
- _$area 0.0
- )
- (princ
- "\n选择拾取范围 (*polyline,circle,ellipse,spline)<全选>: "
- )
- (setq ss (ssget "x" l))
- (setq ss0 (ssget l)
- ss (if ss0
- ss0
- ss
- )
- )
- (xdrx_setsstodb ss 0)
- (while (setq e (xdrx_getentdata 0))
- ;(if (xdrx_curve_isclosed e)
- ; (progn
- (setq _$area (+ (car (xdrx_getarea e)) _$area))
- ;(command ".text" "j" "mc" pt (* 3 bl) 0 str)
- ; )
- ;(setq ss1 (ssadd e ss1))
- ; )
- )
- (princ (strcat "\n\t总面积为 " (rtos _$area 2 2) "。"))
- (xdrx_ucsoff)
- (xdrx_end)
- ;|(if (/= (sslength ss1) 0)
- (progn
- (If (And
- (Zerop (Getvar "cmdactive"))
- (Ssget "i")
- )
- (sssetfirst nil)
- )
- (xdrx_setsstodb ss1 0)
- (while (setq e1 (xdrx_getentdata 0))
- (redraw e1 3)
- (setq le_drw (cons e1 le_drw))
- )
- (redraw_le)
- (sssetfirst nil ss1)
- (setq len (rtos (sslength ss1) 2 0))
- (prompt
- (strcat "\n\t" "共 " len " 根非闭合多义线未标注面积。")
- )
- )
- )|;
- )
- (defun get_layer_area (/ e)
- (setq e (xdrx_entsel "\n拾取实体: "))
- (princ (strcat "\n你已选择了 " (xdrx_getentdxf 8) " 层"))
- (get_area (list '(0 . "*polyline,circle,ellipse,spline")
- (cons 8 (xdrx_getentdxf 8))
- )
- )
- )
- (defun get_point_area (/ p0 e str info tf)
- (setq p0 (getpoint "\n拾取标注范围内一点: "))
- (while p0
- (if (setq e (bpoly p0))
- (progn
- (setq info (xdrx_getarea e))
- (entdel (entlast))
- (setq str (rtos (/ (car info) 1e6) 2 2))
- (command ".text" "j" "mc" p0 (* 3 bl) 0 str)
- )
- (progn
- (xdrx_drawing_viewsave)
- (command ".zoom" ".3x")
- (setq tf T)
- (alert "无法找到范围, 重新选择!")
- )
- )
- (setq p0 (getpoint "\n拾取标注范围内一点: "))
- )
- (if tf
- (xdrx_drawing_viewres)
- )
- )
- (xdrx_begin "tmp_area" "1" '("cmdecho" "0"))
- (xdrx_ucson)
- (initget "1 2 3")
- (setq kw (getkword "\n[1 拾取点/2 按图层/3 选择范围]<3>: "))
- (cond ((eq kw "1") (get_point_area))
- ((eq kw "2") (get_layer_area))
- (T (get_area '((0 . "*polyline,circle,ellipse,spline"))))
- )
- (princ)
- )
- (princ)
- (prompt
- "\n\t面积标注工具之一Ver 1.0,命令C:plarea。"
- )
- (princ)
|