明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5559|回复: 24

area命令所取得多个对象的面积怎么能标注在图形指定地点

    [复制链接]
发表于 2010-9-30 08:13 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2010-10-7 10:16:00 编辑

如图,计算出1、3、5的图形面积之和标注在指定地点

本帖子中包含更多资源

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

x
发表于 2010-9-30 09:33 | 显示全部楼层
  1. (defun c:mjqh1 (/ pt1 pt2 zg mj zmj ss LastEntity LastEntity1 gxl-Sel-EntNextAll ssaddsel #ZJWS# mjHeight)
  2.   ;(setierr)
  3.   ;(initArea)
  4.   ;;;gxl-Sel-EntNextAll en 返回 en 之后的所有物体选择集,无则返回 nil
  5. (defun gxl-Sel-EntNextAll (ent / ss ent1)
  6.   (setq ss (ssadd))
  7.   (while (setq ent1 (entnext ent))
  8.     (ssadd ent1 ss)
  9.     (setq ent ent1)
  10.     )
  11.   (if (= 0 (sslength ss))
  12.     nil
  13.     ss
  14.     )
  15.   )
  16. ;把选择集1中的图元加入到选择集2中
  17. (defun ssaddsel (ss1 ss2 / n k)
  18.    (setq n (sslength ss1)
  19.   k 0)
  20.   (if (> n 0)
  21.     (while (setq ent (ssname ss1 k))
  22.        (ssadd ent ss2)
  23.        (setq k (1+ k))
  24.       )
  25.     )
  26.   (setq ss2 ss2)
  27. )
  28. ;;;gxl-MakeText1 生成文字函数,参数: 标注点 字高 宽比 旋转角 倾角,角度单位:度
  29. (defun gxl-MakeText1 (xy Txt ZG KB XZ Qj / xyL TxtL ZGL KBL XZL QJL)
  30.    (setq xy (trans xy 1 0));;;坐标换算为世界坐标
  31.    (SETQ XZ (gxl-Num-DtoR (gxl-Num-Angle->Wcs XZ )))
  32.       (setq xyL  (cons 10 xy)
  33.      TxtL (cons 1 Txt)
  34.      ZGL  (cons 40 ZG)
  35.      KBL  (cons 41 KB)
  36.      XZL  (cons 50 XZ)
  37.      QJL  (cons 51 (gxl-Num-DtoR QJ))
  38.       )
  39.       (setq TextL (list '(0 . "TEXT")
  40.    '(67 . 0)
  41.    '(100
  42.      .
  43.      "AcDbText"
  44.     )
  45.    xyL
  46.    ZGL
  47.    TxtL
  48.    XZL
  49.    KBL
  50.    QJL
  51.    '(7 . "standard")
  52.     )
  53.       )
  54.       (entmake TextL)
  55.     )
  56. ;;;程序开始
  57.   (setq zmj 0)
  58.   (setq #ZJWS# (getint "\n输入注记位数:"))
  59.   (if (not(= 'INT (type #ZJWS#))) (setq #ZJWS# 3))
  60.   (setq mjHeight (getreal "\n输入注记高度:"))
  61.   (if (not(or (= 'INT (type mjHeight))(= 'REAL (type mjHeight)))) (setq mjHeight 1.5))
  62.   (setq ss (ssadd))
  63.    (while (= 'LIST (type
  64.       (progn
  65.                         (initget 7 "No  ")
  66.                         (setq pt1 (getpoint "\n请选择中心点:"))
  67.                         )
  68.       )
  69.      )
  70.   (setq LastEntity (entlast))
  71.   (while (progn
  72.    ;(setq pt1 (getpoint "\n请输入中心点:"))
  73.    (command "-boundary" pt1 "")
  74.    (setq LastEntity1 (entlast))
  75.    (equal LastEntity LastEntity1)
  76.    )
  77.     (setq pt1 (getpoint "\n请输入中心点:"))
  78.     )
  79.   (command "Area" "o" LastEntity1)
  80.   ;(entdel (entlast))
  81.     ; (ssadd LastEntity1 ss)
  82.           (setq ss0 (GXL-SEL-ENTNEXTALL LastEntity))
  83.      (setq ss (ssaddsel ss0 ss))
  84.        (redraw LastEntity1 3)
  85.   (setq mj (getvar "area"))
  86.   ;|(if (= mjdw 1000)
  87.     (setq mj (/ mj 1000000.0))
  88.     )|;
  89.      (princ (rtos mj 2 #ZJWS#))
  90.      (setq mj (atof (rtos mj 2 #ZJWS#)))
  91.   (setq zg mjHeight)
  92.   
  93.      (setq zmj (+ zmj mj))
  94.      (princ (strcat "  当前总面积:" (rtos zmj 2 #ZJWS#)))
  95.      ;;;注记文字
  96.      (gxl-MakeText1 pt1 (rtos mj 2 #ZJWS#) zg 0.8 0 0 )
  97.     (ssadd (entlast) ss)
  98.   ;(setq mj (rtos mj 2 2))
  99.   ;(gxl-MakeText pt1 mj zg 0.8 0 0)
  100.      )
  101.   (command "erase" ss "")
  102.   (princ (strcat "\n 总面积为: " (setq zmj (rtos zmj 2 #ZJWS#))))
  103.   (setq zmj (strcat " 总面积为: " zmj))
  104.   (setq zg mjHeight)
  105.   (initget 7 " ")
  106.   (setq pt2 (getpoint "\n 选择注记位置:"))
  107.   (if (= 'List (type pt2))
  108.       (gxl-MakeText1 pt2 zmj zg 0.8 0 0 )
  109.     )
  110.    
  111.   ;(reerr)
  112.   ;(princ)
  113.   )

评分

参与人数 1明经币 +1 收起 理由
mccad + 1 【好评】表扬一下

查看全部评分

发表于 2010-9-30 11:52 | 显示全部楼层

2楼的运行后,出现

命令: mjqh1
输入注记位数:
输入注记高度:
请选择中心点:-boundary
指定内部点或 [高级选项(A)]: 正在选择所有对象...
正在选择所有可见对象...
正在分析所选数据...
正在分析内部孤岛...
指定内部点或 [高级选项(A)]:
BOUNDARY 已创建 1 个多段线
命令: Area
指定第一个角点或 [对象(O)/加(A)/减(S)]: o
选择对象:
面积 = 927.8424,周长 = 125.1786
命令: 927.842  当前总面积:927.842; 错误: no function definition:
GXL-NUM-ANGLE->WCS

请问要如何操作?望指教。

谢谢

 楼主| 发表于 2010-9-30 16:44 | 显示全部楼层

怎么执行不了啊?

发表于 2010-9-30 22:36 | 显示全部楼层
补上几个自定义函数,看还缺函数么?
  1. ;;;==================================================================
  2. ;;;gxl-Num-RtoD 弧度转为度数,十进制
  3. ;;;==================================================================
  4. (defun gxl-Num-RtoD (dat /)
  5.   (* 180.0 (/ dat pi))
  6. )
  7. ;;;==================================================================
  8. ;;;gxl-Num-DtoR 度数转为弧度,十进制
  9. ;;;==================================================================
  10.   (defun gxl-Num-DtoR (JD / a)
  11.     (setq a (/ (* jd pi) 180.0))
  12.     )
  13. ;;;获取自定义坐标系的旋转角度函数
  14. (defun gxl-GetUcsRotateAngle ()
  15. (if (= 0 (CAR (GETVAR "UCSXDIR")))
  16.   (if (> (CADR (GETVAR "UCSXDIR")) 0) (/ pi 2.0) (/ pi -2.0))
  17.   (if (< (CAR (GETVAR "UCSXDIR")) 0)
  18.     (+ pi (ATAN (/ (CADR (GETVAR "UCSXDIR")) (CAR (GETVAR "UCSXDIR")))))
  19.   (ATAN (/ (CADR (GETVAR "UCSXDIR")) (CAR (GETVAR "UCSXDIR"))))
  20.     )
  21.   )
  22.   )
  23. ;;;gxl-Num-Angle->Wcs 角度换算为世界坐标角度,角度单位为度,返回度
  24. (defun gxl-Num-Angle->Wcs (a)
  25.   (+ (gxl-Num-RtoD (gxl-GetUcsRotateAngle)) a )
  26.   )
发表于 2010-10-1 06:40 | 显示全部楼层

5楼的先收下了。

等会试一试。

谢谢Gu_xl

国庆快乐

 楼主| 发表于 2010-10-7 10:16 | 显示全部楼层
  1. 能否修改下面的程序为:拾取一个或多个图形内部点后标注面积之和到指定地点 (defun C:d (/ HOLDCMD HOLDZIN PNT LENT)   (vl-load-com)   (setq HOLDCMD (getvar "cmdecho"))   (setq HOLDZIN (getvar "dimzin"))   (setvar "cmdecho" 0)   (defun DO_IT ()     (setvar "dimzin" 0)     (setq PNT1 (getpoint "\n点选文字起点: "))     (command "_.text"       PNT1       1                  ;;这里的1改字高       ""       (strcat ""        (rtos ENT 2 3);;这里的3改小数位数       )     )     (setvar "dimzin" HOLDZIN)   )   (while (if (= PNT NIL)     (setq PNT (getpoint "\n点选内部点: "))     PNT   )     (setq LENT (entlast))     (command "_.boundary" "a" "i" "y" "" PNT "")     (if (not (equal (entlast) LENT))       (progn  (setq ENT (vla-get-area (vlax-ename->vla-object (entlast))))  (while (not (equal (entlast) LENT))    (entdel (entlast))  )  (DO_IT)       )     )     (setq PNT NIL)   )   (setvar "cmdecho" HOLDCMD)   (princ) )
发表于 2010-10-7 14:06 | 显示全部楼层

能否修改下面的程序为:拾取一个或多个图形内部点后标注面积之和到指定地点
(defun C:d (/ HOLDCMD HOLDZIN PNT LENT)
(vl-load-com)

我给的程序就是你要的!点取多个图形内部后,按回车键,选择标注的位置,标注完后之前在各个图形内部显示的面积会自动删除!

 楼主| 发表于 2010-10-7 16:25 | 显示全部楼层
非常感谢,已经解决了,就是执行到最后是不是有写不顺畅,能否优化一下呢
发表于 2010-10-7 19:34 | 显示全部楼层
124350440发表于2010-10-7 16:25:00非常感谢,已经解决了,就是执行到最后是不是有写不顺畅,能否优化一下呢

怎么不顺畅,说具体点...

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-2 03:01 , Processed in 0.479682 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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