找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 798|回复: 8

[求助] [求助]:标注面积的一个程序,求优化方法

[复制链接]
发表于 2008-1-2 17:06:03 | 显示全部楼层 |阅读模式

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

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

×
我有一个标注面积、长度的小程序(原作者是highflybird),每次标注时需输入选择项及文字高度,但其实我通常只需标注面积,文字高度基本固定,可惜无法设定默认值,如果有一个选项能设定默认值就好了。
源程序如下:
;;;===================
;;;面积和长度统计程序
;;;highflybird kunming
;;;===================
(prompt "命令为:At")
(defun C:at (/ f     ss             l             i             SSarea  totlen  entlen
             ename   name    obj     text-S  text-L  insPt0  height
             insPt1  insPt2  text-1  text-2  *APP    *DOC    *MSP
            )
  (vl-load-com)
  (setq *APP (vlax-get-acad-object))
  (setq *DOC (vla-get-activeDocument *APP))
  (setq *MSP (vla-get-Modelspace *DOC))
  (initget 1 "1 2 3")
  (setq f (getkword "\n请输入你要统计的<1>面积<2>长度<3>两者:"))
  (if
    (and
      (setq ss (ssget))
      (setq insPt0 (getpoint "\n请输入文字插入点: "))
      (setq height (getdist "\n请输入文字高度:"))
    )
    (progn
      (setq l (sslength ss))
      (setq i 0)
      (setq SSarea 0)
      (setq totlen 0)
      (setq insPt1 (vlax-3d-point insPt0))
      (setq insPt2 (polar insPt0 (* 1.5 Pi) (* 1.5 height)))
      (setq insPt2 (vlax-3d-point insPt2))               
      (cond
        ( (= f "1")
          (repeat l
            (func-1)
            (func-2)
            (setq i (1+ i))
          )
          (setq text-S (strcat (convert1 SSarea 6) "平方米"));总面积为:小数后6位
          (vla-addtext *MSP text-S insPt1 height)
        )
        ( (= f "2")
          (repeat l
            (func-1)
            (func-3)
            (setq i (1+ i))
          )
          (setq text-L (strcat (convert1 totlen 3) "米"))    ;总长度为:小数后3位
          (vla-addtext *MSP text-L insPt2 height)
        )
        ( (= f "3")
          (repeat l
            (func-1)
            (func-2)
            (func-3)
            (setq i (1+ i))
          )
          (setq text-S (strcat (convert1 SSarea 6) "平方米"));总面积为:小数后6位
          (setq text-L (strcat (convert1 totlen 3) "米"))    ;总长度为:小数后3位
          (vla-addtext *MSP text-S insPt1 height)
          (vla-addtext *MSP text-L insPt2 height)
        )       
      )       
    )
    (alert "你没有选取物体或者输入正确的数据!")
  )
  (princ)
)
(defun func-1 ()
  (setq ename (ssname ss i))
  (setq obj (vlax-ename->vla-object ename))
  (setq elist (entget ename))
  (setq name (cdr (assoc 0 elist)))
)
;;面积的统计
(defun func-2 (/ p1 p2 p3 p4)
  (if (vlax-property-available-p obj "area")
    (setq SSarea (+ (vla-get-area obj) SSarea))
    (if        (= name "SOLID")
      (setq p1 (cdr (assoc 10 elist))
            p2 (cdr (assoc 11 elist))
            p3 (cdr (assoc 12 elist))
            p4 (cdr (assoc 13 elist))
            SSarea (+ (area-of-verties (list p1 p2 p4 p3)) SSarea)
      )
    )
  )
)
;;长度的统计
(defun func-3 (/ p1 p2 p3 p4)
  (cond
    ( (= name "MLINE")
      (setq totlen (+ totlen (ml-length ename)))
    )
    ( (or (= name "ARC")
          (= name "CIRCLE")
          (= name "LINE")
          (= name "POLYLINE")
          (= name "LWPOLYLINE")
          (= name "SPLINE")
          (= name "ELLIPSE")
      )
      (setq entlen (vlax-curve-getdistatparam ename (vlax-curve-getendparam ename)))
      (setq totlen (+ totlen entlen))
    )
    ( (= name "SOLID")
      (setq p1 (cdr (assoc 10 elist)))
      (setq p2 (cdr (assoc 11 elist)))
      (setq p3 (cdr (assoc 12 elist)))
      (setq p4 (cdr (assoc 13 elist)))   
      (setq totlen (+ (length-of-verties (list p1 p2 p4 p3)) totlen))
    )
  )
)
;;Mline的长度
(defun ml-length (ename / j d ptlist)
  (foreach n (entget ename)
    (if        (= (car n) 11)
      (setq ptlist (cons (cdr n) ptlist))
    )
  )
  (setq        d 0 j -1)
  (repeat (1- (length ptlist))
    (setq j (1+ j))
    (setq d (+ d (distance (nth j ptlist) (nth (1+ j) ptlist))))  
  )
)
;;单位转化
(defun convert (x n /)
  (rtos (/ x (expt 10 n)) 2 n)
)
(defun convert1 (x n /)
  (rtos (/ x (expt 10 n)) 2 3)
)
;;n个点的长度
(defun length-of-verties (pts / i l len pts1)
  (setq i -1 len 0)
  (setq pts1 (cons (last pts) pts))
  (repeat (length pts)
    (setq i   (1+ i))
    (setq l   (distance (nth i pts1) (nth (1+ i) pts1)))
    (setq len (+ l len))
  )  
)
;;n个点的面积
(defun area-of-verties (pts / i area PX0 PY0 x1 y1 x2 y2)
  (setq i 0)
  (setq area 0)
  (setq px0 (caar pts))
  (setq py0 (cadar pts))
  (repeat (- (length pts) 1)
    (setq x1 (- (car  (nth i pts)) px0)
          y1 (- (cadr (nth i pts)) py0)
          x2 (- (car  (nth (1+ i) pts)) px0)
          y2 (- (cadr (nth (1+ i) pts)) py0)
    )          
    (setq area (+ (- (* x1 y2)(* x2 y1)) area))
    (setq i (1+ i))
  )
  (abs (/ area 2))
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 10402个

财富等级: 富甲天下

发表于 2008-1-2 20:21:53 | 显示全部楼层
[php]
;;;===================
;;;面积和长度统计程序
;;;highflybird kunming
;;;===================
(prompt "命令为:At")
(defun C:at (/ f ss l i SSarea totlen entlen
ename name obj text-S text-L insPt0 height
insPt1 insPt2 text-1 text-2 *APP *DOC *MSP
)
(vl-load-com)
(setq *APP (vlax-get-acad-object))
(setq *DOC (vla-get-activeDocument *APP))
(setq *MSP (vla-get-Modelspace *DOC))
(initget 1 "1 2 3")
(setq f (getkword "\n请输入你要统计的<1>面积<2>长度<3>两者:"))
(if (and
  (setq ss (ssget))
  (initget 1 "High")
  (setq insPt0 (getpoint "\n请输入文字插入点(文字高度H) : "))
  (if (= insPt0 "High") (princ
   (setq height (getdist "\n请输入文字高度:"))
   nil
  )
   T
  )
)
(progn
(setq l (sslength ss))
(setq i 0)
(setq SSarea 0)
(setq totlen 0)
(setq insPt1 (vlax-3d-point insPt0))
(setq insPt2 (polar insPt0 (* 1.5 Pi) (* 1.5 height)))
(setq insPt2 (vlax-3d-point insPt2))
(cond
  ((= f "1")
   (repeat l
    (func-1)
    (func-2)
    (setq i (1+ i))
   )
   (setq text-S (strcat (convert1 SSarea 6) "平方米"));总面积为:小数后6位
   (vla-addtext *MSP text-S insPt1 height)
  )
  ((= f "2")
   (repeat l
    (func-1)
    (func-3)
    (setq i (1+ i))
   )
   (setq text-L (strcat (convert1 totlen 3) "米")) ;总长度为:小数后3位
   (vla-addtext *MSP text-L insPt2 height)
  )
  ((= f "3")
   (repeat l
    (func-1)
    (func-2)
    (func-3)
    (setq i (1+ i))
   )
   (setq text-S (strcat (convert1 SSarea 6) "平方米"));总面积为:小数后6位
   (setq text-L (strcat (convert1 totlen 3) "米")) ;总长度为:小数后3位
   (vla-addtext *MSP text-S insPt1 height)
   (vla-addtext *MSP text-L insPt2 height)
  )
)
)
(alert "你没有选取物体或者输入正确的数据!")
)
(princ)
)
(defun func-1 ()
(setq ename (ssname ss i))
(setq obj (vlax-ename->vla-object ename))
(setq elist (entget ename))
(setq name (cdr (assoc 0 elist)))
)
;;面积的统计
(defun func-2 (/ p1 p2 p3 p4)
(if (vlax-property-available-p obj "area")
(setq SSarea (+ (vla-get-area obj) SSarea))
(if (= name "SOLID")
(setq p1 (cdr (assoc 10 elist))
p2 (cdr (assoc 11 elist))
p3 (cdr (assoc 12 elist))
p4 (cdr (assoc 13 elist))
SSarea (+ (area-of-verties (list p1 p2 p4 p3)) SSarea)
)
)
)
)
;;长度的统计
(defun func-3 (/ p1 p2 p3 p4)
(cond
( (= name "MLINE")
(setq totlen (+ totlen (ml-length ename)))
)
( (or (= name "ARC")
(= name "CIRCLE")
(= name "LINE")
(= name "POLYLINE")
(= name "LWPOLYLINE")
(= name "SPLINE")
(= name "ELLIPSE")
)
(setq entlen (vlax-curve-getdistatparam ename (vlax-curve-getendparam ename)))
(setq totlen (+ totlen entlen))
)
( (= name "SOLID")
(setq p1 (cdr (assoc 10 elist)))
(setq p2 (cdr (assoc 11 elist)))
(setq p3 (cdr (assoc 12 elist)))
(setq p4 (cdr (assoc 13 elist)))
(setq totlen (+ (length-of-verties (list p1 p2 p4 p3)) totlen))
)
)
)
;;Mline的长度
(defun ml-length (ename / j d ptlist)
(foreach n (entget ename)
(if (= (car n) 11)
(setq ptlist (cons (cdr n) ptlist))
)
)
(setq d 0 j -1)
(repeat (1- (length ptlist))
(setq j (1+ j))
(setq d (+ d (distance (nth j ptlist) (nth (1+ j) ptlist))))
)
)
;;单位转化
(defun convert (x n /)
(rtos (/ x (expt 10 n)) 2 n)
)
(defun convert1 (x n /)
(rtos (/ x (expt 10 n)) 2 3)
)
;;n个点的长度
(defun length-of-verties (pts / i l len pts1)
(setq i -1 len 0)
(setq pts1 (cons (last pts) pts))
(repeat (length pts)
(setq i (1+ i))
(setq l (distance (nth i pts1) (nth (1+ i) pts1)))
(setq len (+ l len))
)
)
;;n个点的面积
(defun area-of-verties (pts / i area PX0 PY0 x1 y1 x2 y2)
(setq i 0)
(setq area 0)
(setq px0 (caar pts))
(setq py0 (cadar pts))
(repeat (- (length pts) 1)
(setq x1 (- (car (nth i pts)) px0)
y1 (- (cadr (nth i pts)) py0)
x2 (- (car (nth (1+ i) pts)) px0)
y2 (- (cadr (nth (1+ i) pts)) py0)
)
(setq area (+ (- (* x1 y2)(* x2 y1)) area))
(setq i (1+ i))
)
(abs (/ area 2))
)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-1-3 14:55:33 | 显示全部楼层
二楼修改后选择物体显示“你没有选择物体或者输入正确的数据”,不知是什么原因,不过还是谢谢您的支持。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-1-3 18:36:55 | 显示全部楼层
[php]
;;;===================
;;;面积和长度统计程序
;;;highflybird kunming
;;;===================
(prompt "命令为:At")
(defun C:at (/             f             ss             l             i             SSarea  totlen
             entlen  ename   name    obj     text-S  text-L  insPt0
             height  insPt1  insPt2  text-1  text-2  *APP    *DOC
             *MSP
            )
  (vl-load-com)
  (setq user1 (getvar "userr1"))
  (setq *APP (vlax-get-acad-object))
  (setq *DOC (vla-get-activeDocument *APP))
  (setq *MSP (vla-get-Modelspace *DOC))
  (initget 1 "1 2 3")
  (setq f (getkword "\n请输入你要统计的<1>面积<2>长度<3>两者:"))
  (if
    (and
      (setq ss (ssget))
      (setq insPt0 (getpoint "\n请输入文字插入点: "))
    )
     (progn
       (setq height
              (getdist (strcat "\n请输入文字高度<" (rtos user1 2) ">:")
              )
       )
       (if (= height nil)
         (setq height user1)
       )
       (setvar "userr1" height)
       (setq l (sslength ss))
       (setq i 0)
       (setq SSarea 0)
       (setq totlen 0)
       (setq insPt1 (vlax-3d-point insPt0))
       (setq insPt2 (polar insPt0 (* 1.5 Pi) (* 1.5 height)))
       (setq insPt2 (vlax-3d-point insPt2))
       (cond
         ((= f "1")
          (repeat l
            (func-1)
            (func-2)
            (setq i (1+ i))
          )
          (setq text-S (strcat (convert1 SSarea 6) "平方米"))
                                        ;总面积为:小数后6位
          (vla-addtext *MSP text-S insPt1 height)
         )
         ((= f "2")
          (repeat l
            (func-1)
            (func-3)
            (setq i (1+ i))
          )
          (setq text-L (strcat (convert1 totlen 3) "米"))
                                        ;总长度为:小数后3位
          (vla-addtext *MSP text-L insPt2 height)
         )
         ((= f "3")
          (repeat l
            (func-1)
            (func-2)
            (func-3)
            (setq i (1+ i))
          )
          (setq text-S (strcat (convert1 SSarea 6) "平方米"))
                                        ;总面积为:小数后6位
          (setq text-L (strcat (convert1 totlen 3) "米"))
                                        ;总长度为:小数后3位
          (vla-addtext *MSP text-S insPt1 height)
          (vla-addtext *MSP text-L insPt2 height)
         )
       )
     )
     (alert "你没有选取物体或者输入正确的数据!")
  )
  (princ)
)
(defun func-1 ()
  (setq ename (ssname ss i))
  (setq obj (vlax-ename->vla-object ename))
  (setq elist (entget ename))
  (setq name (cdr (assoc 0 elist)))
)
;;面积的统计
(defun func-2 (/ p1 p2 p3 p4)
  (if (vlax-property-available-p obj "area")
    (setq SSarea (+ (vla-get-area obj) SSarea))
    (if        (= name "SOLID")
      (setq p1           (cdr (assoc 10 elist))
            p2           (cdr (assoc 11 elist))
            p3           (cdr (assoc 12 elist))
            p4           (cdr (assoc 13 elist))
            SSarea (+ (area-of-verties (list p1 p2 p4 p3)) SSarea)
      )
    )
  )
)
;;长度的统计
(defun func-3 (/ p1 p2 p3 p4)
  (cond
    ((= name "MLINE")
     (setq totlen (+ totlen (ml-length ename)))
    )
    ((or (= name "ARC")
         (= name "CIRCLE")
         (= name "LINE")
         (= name "POLYLINE")
         (= name "LWPOLYLINE")
         (= name "SPLINE")
         (= name "ELLIPSE")
     )
     (setq entlen (vlax-curve-getdistatparam
                    ename
                    (vlax-curve-getendparam ename)
                  )
     )
     (setq totlen (+ totlen entlen))
    )
    ((= name "SOLID")
     (setq p1 (cdr (assoc 10 elist)))
     (setq p2 (cdr (assoc 11 elist)))
     (setq p3 (cdr (assoc 12 elist)))
     (setq p4 (cdr (assoc 13 elist)))
     (setq totlen (+ (length-of-verties (list p1 p2 p4 p3)) totlen))
    )
  )
)
;;Mline的长度
(defun ml-length (ename / j d ptlist)
  (foreach n (entget ename)
    (if        (= (car n) 11)
      (setq ptlist (cons (cdr n) ptlist))
    )
  )
  (setq        d 0
        j -1
  )
  (repeat (1- (length ptlist))
    (setq j (1+ j))
    (setq d (+ d (distance (nth j ptlist) (nth (1+ j) ptlist))))
  )
)
;;单位转化
(defun convert (x n /)
  (rtos (/ x (expt 10 n)) 2 n)
)
(defun convert1        (x n /)
  (rtos (/ x (expt 10 n)) 2 3)
)
;;n个点的长度
(defun length-of-verties (pts / i l len pts1)
  (setq        i -1
        len 0
  )
  (setq pts1 (cons (last pts) pts))
  (repeat (length pts)
    (setq i (1+ i))
    (setq l (distance (nth i pts1) (nth (1+ i) pts1)))
    (setq len (+ l len))
  )
)
;;n个点的面积
(defun area-of-verties (pts / i area PX0 PY0 x1 y1 x2 y2)
  (setq i 0)
  (setq area 0)
  (setq px0 (caar pts))
  (setq py0 (cadar pts))
  (repeat (- (length pts) 1)
    (setq x1 (- (car (nth i pts)) px0)
          y1 (- (cadr (nth i pts)) py0)
          x2 (- (car (nth (1+ i) pts)) px0)
          y2 (- (cadr (nth (1+ i) pts)) py0)
    )
    (setq area (+ (- (* x1 y2) (* x2 y1)) area))
    (setq i (1+ i))
  )
  (abs (/ area 2))
)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-1-7 16:26:30 | 显示全部楼层
四楼的优化非常好,非常感谢,但我还有一个问题,我通常只需标注面积,第一个选择项我希望默认为选择1(最好默认值可以修改),最理想的状态是能有一个选项板,需设置时键入O,设置好字高、标注内容等,实际使用时,可直接标注面积或长度或二者全标,不用每次都要输入选择项,选择文字高度等。另外标注的精度能修改吗?我通常只需小数点后的一位或两位,不知修改哪个参数可以实现。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2008-1-10 14:19:39 | 显示全部楼层
最后一次改啦。。。再有什么要求,只能叫highflybird 重新给你写一个。。。


  1. ;;;===================
  2. ;;;面积和长度统计程序
  3. ;;;highflybird kunming
  4. ;;;===================
  5. (vl-load-com)
  6. (prompt "命令为:At")
  7. (defun C:at (/             *APP    *DOC    *MSP    F             HEIGHT  I
  8.              INSPT0  INSPT1  INSPT2  L             SS             SSAREA  TEXT-L
  9.              TEXT-S  TOTLEN
  10.             )
  11.   (setq *APP (vlax-get-acad-object))
  12.   (setq *DOC (vla-get-activeDocument *APP))
  13.   (setq *MSP (vla-get-Modelspace *DOC))
  14.   (if 文字高度
  15.     (princ (strcat "\n文字高度为 " (rtos 文字高度 2)))
  16.     (princ "\n文字高度为 300 ")
  17.   )
  18.   (if (not (vlax-ldata-get "dict" "getkword"))
  19.     (vlax-ldata-put "dict" "getkword" "1")
  20.   )
  21.   (initget "1 2 3 4")
  22.   (setq        f
  23.          (getkword
  24.            (strcat
  25.              "\n请输入你要统计的[1]面积[2]长度[3]两者/[4]改高度并统计面积 <"
  26.              (vlax-ldata-get
  27.                "dict"
  28.                "getkword"
  29.              )
  30.              ">: "
  31.            )
  32.          )
  33.   )
  34.   (if (= f nil)
  35.     (setq f (vlax-ldata-get "dict" "getkword"))
  36.   )
  37.   (vlax-ldata-put "dict" "getkword" f)
  38.   (if
  39.     (and
  40.       (setq ss (ssget))
  41.       (setq insPt0 (getpoint "\n请输入文字插入点: "))
  42.     )
  43.      (progn
  44.        (if (= height nil)
  45.          (setq height 文字高度)
  46.        )
  47.        (if (= f "4")
  48.          (progn
  49.            (setq height
  50.                   (getdist insPt0 "\n请输入文字高度<300>:")
  51.            )
  52.            (if (= height nil)
  53.              (setq height 300)
  54.            )
  55.            (setq 文字高度 height)
  56.          )
  57.        )
  58.        (setq l (sslength ss))
  59.        (setq i 0)
  60.        (setq SSarea 0)
  61.        (setq totlen 0)
  62.        (setq insPt1 (vlax-3d-point insPt0))
  63.        (setq insPt2 (polar insPt0 (* 1.5 Pi) (* 1.5 height)))
  64.        (setq insPt2 (vlax-3d-point insPt2))
  65.        (cond
  66.          ((or (= f "1") (= f "4"))
  67.           (repeat l
  68.             (func-1)
  69.             (func-2)
  70.             (setq i (1+ i))
  71.           )
  72.           (setq text-S (strcat (convert1 SSarea 6) "平方米"))
  73.                                         ;总面积为:小数后6位
  74.           (vla-addtext *MSP text-S insPt1 height)
  75.          )
  76.          ((= f "2")
  77.           (repeat l
  78.             (func-1)
  79.             (func-3)
  80.             (setq i (1+ i))
  81.           )
  82.           (setq text-L (strcat (convert1 totlen 3) "米"))
  83.                                         ;总长度为:小数后3位
  84.           (vla-addtext *MSP text-L insPt2 height)
  85.          )
  86.          ((= f "3")
  87.           (repeat l
  88.             (func-1)
  89.             (func-2)
  90.             (func-3)
  91.             (setq i (1+ i))
  92.           )
  93.           (setq text-S (strcat (convert1 SSarea 6) "平方米"))
  94.                                         ;总面积为:小数后6位
  95.           (setq text-L (strcat (convert1 totlen 3) "米"))
  96.                                         ;总长度为:小数后3位
  97.           (vla-addtext *MSP text-S insPt1 height)
  98.           (vla-addtext *MSP text-L insPt2 height)
  99.          )
  100.        )
  101.      )
  102.      (alert "你没有选取物体或者输入正确的数据!")
  103.   )
  104.   (princ)
  105. )
  106. (defun func-1 ()
  107.   (setq ename (ssname ss i))
  108.   (setq obj (vlax-ename->vla-object ename))
  109.   (setq elist (entget ename))
  110.   (setq name (cdr (assoc 0 elist)))
  111. )
  112. ;;面积的统计
  113. (defun func-2 (/ p1 p2 p3 p4)
  114.   (if (vlax-property-available-p obj "area")
  115.     (setq SSarea (+ (vla-get-area obj) SSarea))
  116.     (if        (= name "SOLID")
  117.       (setq p1           (cdr (assoc 10 elist))
  118.             p2           (cdr (assoc 11 elist))
  119.             p3           (cdr (assoc 12 elist))
  120.             p4           (cdr (assoc 13 elist))
  121.             SSarea (+ (area-of-verties (list p1 p2 p4 p3)) SSarea)
  122.       )
  123.     )
  124.   )
  125. )
  126. ;;长度的统计
  127. (defun func-3 (/ p1 p2 p3 p4)
  128.   (cond
  129.     ((= name "MLINE")
  130.      (setq totlen (+ totlen (ml-length ename)))
  131.     )
  132.     ((or (= name "ARC")
  133.          (= name "CIRCLE")
  134.          (= name "LINE")
  135.          (= name "POLYLINE")
  136.          (= name "LWPOLYLINE")
  137.          (= name "SPLINE")
  138.          (= name "ELLIPSE")
  139.      )
  140.      (setq entlen (vlax-curve-getdistatparam
  141.                     ename
  142.                     (vlax-curve-getendparam ename)
  143.                   )
  144.      )
  145.      (setq totlen (+ totlen entlen))
  146.     )
  147.     ((= name "SOLID")
  148.      (setq p1 (cdr (assoc 10 elist)))
  149.      (setq p2 (cdr (assoc 11 elist)))
  150.      (setq p3 (cdr (assoc 12 elist)))
  151.      (setq p4 (cdr (assoc 13 elist)))
  152.      (setq totlen (+ (length-of-verties (list p1 p2 p4 p3)) totlen))
  153.     )
  154.   )
  155. )
  156. ;;Mline的长度
  157. (defun ml-length (ename / j d ptlist)
  158.   (foreach n (entget ename)
  159.     (if        (= (car n) 11)
  160.       (setq ptlist (cons (cdr n) ptlist))
  161.     )
  162.   )
  163.   (setq        d 0
  164.         j -1
  165.   )
  166.   (repeat (1- (length ptlist))
  167.     (setq j (1+ j))
  168.     (setq d (+ d (distance (nth j ptlist) (nth (1+ j) ptlist))))
  169.   )
  170. )
  171. ;;单位转化
  172. (defun convert (x n /)
  173.   (rtos (/ x (expt 10 n)) 2 n)
  174. )
  175. (defun convert1        (x n /)
  176.   (rtos (/ x (expt 10 n)) 2 3)
  177. )
  178. ;;n个点的长度
  179. (defun length-of-verties (pts / i l len pts1)
  180.   (setq        i -1
  181.         len 0
  182.   )
  183.   (setq pts1 (cons (last pts) pts))
  184.   (repeat (length pts)
  185.     (setq i (1+ i))
  186.     (setq l (distance (nth i pts1) (nth (1+ i) pts1)))
  187.     (setq len (+ l len))
  188.   )
  189. )
  190. ;;n个点的面积
  191. (defun area-of-verties (pts / i area PX0 PY0 x1 y1 x2 y2)
  192.   (setq i 0)
  193.   (setq area 0)
  194.   (setq px0 (caar pts))
  195.   (setq py0 (cadar pts))
  196.   (repeat (- (length pts) 1)
  197.     (setq x1 (- (car (nth i pts)) px0)
  198.           y1 (- (cadr (nth i pts)) py0)
  199.           x2 (- (car (nth (1+ i) pts)) px0)
  200.           y2 (- (cadr (nth (1+ i) pts)) py0)
  201.     )
  202.     (setq area (+ (- (* x1 y2) (* x2 y1)) area))
  203.     (setq i (1+ i))
  204.   )
  205.   (abs (/ area 2))
  206. )

点评

错误: 参数类型错误: numberp: nil,,加载后才先输入4后再输1不出错,望卜哥修正,谢谢。好不容易找到的哈  发表于 2013-6-9 00:30
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-16 23:57 , Processed in 0.231816 second(s), 45 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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