明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: 124350440

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

    [复制链接]
 楼主| 发表于 2010-10-8 08:25:00 | 显示全部楼层
Gu_xl发表于2010-10-7 19:34:00怎么不顺畅,说具体点...

命令: mjqh1
输入注记位数:3
输入注记高度:3
请选择中心点:-boundary
指定内部点或 [高级选项(A)]: 正在选择所有对象...
正在选择所有可见对象...
正在分析所选数据...

正在分析内部孤岛...

指定内部点或 [高级选项(A)]:
BOUNDARY 已创建 1 个多段线
命令: Area
指定第一个角点或 [对象(O)/加(A)/减(S)]: o
选择对象:
面积 = 4684.9831,周长 = 281.0738

命令: 4684.983  当前总面积:4684.983
请选择中心点:-boundary
指定内部点或 [高级选项(A)]: 正在选择所有对象...
正在选择所有可见对象...
正在分析所选数据...

正在分析内部孤岛...

指定内部点或 [高级选项(A)]:
BOUNDARY 已创建 1 个多段线
命令: Area
指定第一个角点或 [对象(O)/加(A)/减(S)]: o
选择对象:
面积 = 2458.9718,周长 = 199.4614

命令: 2458.972  当前总面积:7143.955
请选择中心点:-boundary
指定内部点或 [高级选项(A)]: 正在选择所有对象...
正在选择所有可见对象...
正在分析所选数据...

正在分析内部孤岛...

指定内部点或 [高级选项(A)]:
BOUNDARY 已创建 1 个多段线
命令: Area
指定第一个角点或 [对象(O)/加(A)/减(S)]: o
选择对象:
面积 = 2543.1098,周长 = 203.6487

命令: 2543.110  当前总面积:9687.065
请选择中心点: erase
选择对象:   找到 6 个

选择对象:
命令:
 总面积为: 9687.065
 选择注记位置:((0 . "TEXT") (67 . 0) (100 . "AcDbText") (10 186.209 29.0081
0.0) (40 . 3.0) (1 . " 总面积为: 9687.065") (50 . 0.0) (41 . 0.8) (51 . 0.0) (7
. "standard"))

发表于 2010-10-8 10:44:00 | 显示全部楼层
本帖最后由 作者 于 2010-10-8 15:18:11 编辑

我提供的代码隐去了错误处理代码,一般一个好的程序都要有错误处理函数,在开始要关闭一些系统变量,如"CMDECHO""ATTDIA" "ATTREQ" "BLIPMODE"等等,来关闭命令行显示等,在程序出错或中途意外退出时可自动恢复这些变量;在程序结束时要恢复系统变量,如我的程序开始用setierr函数重定义*error*,设置一些系统变量,程序结束是用reerr函数恢复*error*,下面提供这两个函数代码:
  1. (DEFUN SetIErr (/ sv)
  2.   (if (or (= 'LIST (type *Error*))(= 'USUBR (type *Error*)))
  3.   (alert "ERROR  :THE LAST (SETiERR) FUNCTION HAS NO (ReErr)!")
  4. (PROGN
  5.    (SETQ *SVARL* '())
  6.    (FOREACH SV *SYSVARNL*
  7.      (SETQ *SVARL* (CONS (GETVAR SV) *SVARL*))
  8.      )
  9.    (FOREACH SV '("ATTDIA" "ATTREQ" "BLIPMODE" "CMDECHO" "DIMZIN"
  10.    "OSMODE" "ORTHOMODE" "MIRRTEXT")
  11.      (SETVAR SV 0)
  12.      )
  13.    
  14.    (SETVAR "EXPERT" 5)
  15.          (SETVAR "CECOLOR" "BYLAYER")
  16.          (SETVAR "celtype" "BYLAYER")
  17.    (SETVAR "LWDISPLAY" 1)
  18.    (SETVAR "PLINEGEN" 1)
  19.         ; (if SetScale () (InitMap))
  20.          (setq MyOld*error* *error*)
  21.    (defun *error* (st) (reerr)(princ))
  22.    )
  23.   )
  24.   
  25.     )
  26. (defun ReErr ()
  27.   (if (or (= 'LIST (type *error*)) (= 'SUBR (type *error*)) (= 'USUBR (type *error*)))
  28.   (PROGN (MAPCAR 'SETVAR *SYSVARNL* (REVERSE *SVARL*))
  29.     (SETQ  *Error* MyOld*error*)
  30.     )
  31.   (ALERT "ERROR  : NO (SETIERR)!")
  32.   )
  33.   (PRINC)
  34.    )
 楼主| 发表于 2010-10-8 13:57:00 | 显示全部楼层

哦,有点迷糊了,现在要把您发的这些代码都组合在一起吗?该怎么组合啊?

发表于 2010-10-8 15:22:00 | 显示全部楼层
请将12楼贴中错误处理函数setmyerr 改为SetIerr,贴中已改!将2楼的代码第2行和111行语句前面的";"去掉即可!
 楼主| 发表于 2010-10-8 16:20:00 | 显示全部楼层
Gu_xl发表于2010-10-8 15:22:00请将12楼贴中错误处理函数setmyerr 改为SetIerr,贴中已改!将2楼的代码第2行和111行语句前面的\";\"去掉即可!

ok,明白了!

再问一下,是不是在取小数位数的时候在中途点取的时候就已经四舍五入了,而不是在最终的结果四舍五入。

发表于 2010-10-8 16:39:00 | 显示全部楼层
根据你设定的注记位数,中途已经舍去了,如不想损失精度,请将该代码
  1. (setq mj (atof (rtos mj 2 #ZJWS#)))
删除!
 楼主| 发表于 2010-10-8 16:50:00 | 显示全部楼层
Gu_xl发表于2010-10-8 16:39:00根据你设定的注记位数,中途已经舍去了,如不想损失精度,请将该代码 以下内容为程序代码: (setq mj (atof (rtos mj 2 #ZJWS#)))
删除!

嗯,可以了!如果不需重复的敲空格键来设置小数位和字高,怎么在源码中直接修改?

发表于 2010-10-8 19:48:00 | 显示全部楼层
本帖最后由 作者 于 2010-10-9 8:30:40 编辑

  1. (setq #ZJWS# (getint "\n输入注记位数:"))
改为:
  1. (setq oldZJWS #ZJWS#)
  2. (initget 5 "  ")
  3. (if #ZJWS# (setq #ZJWS# (getint (strcat "\n输入注记位数<" (itoa #ZJWS#) ">:")))
  4. (setq #ZJWS# (getint "\n输入注记位数<3>:"))
  5. )
  6. (if (and oldZJWS (= #ZJWS# "")) (setq #ZJWS# oldZJWS)
  7. (if (and (not oldZJWS) (= #ZJWS# "")) (setq #ZJWS# 3) ))
注记高度代码的写法类似,注意高度使用getreal函数,并将
(initget 5 "  ")改为
(initget 7 "  "),阻止0和负数输入
你自己写一下吧!
 楼主| 发表于 2010-10-9 11:46:00 | 显示全部楼层
Gu_xl发表于2010-10-8 19:48:00将 以下内容为程序代码: (setq #ZJWS# (getint \"\n输入注记位数:\"))
改为:

[复制代码][语法着色]以下内容为程序代码:
  1. (setq oldZJWS #ZJWS#)
  2. (initget 5 "  ")
  3. (if #ZJWS# (setq #ZJWS# (getint (strcat "\n输入注记位数<" (itoa #ZJWS#) ">:")))
  4. (setq #ZJWS# (getint "\n输入注记位数<3>:"))
  5. )
  6. (if (and oldZJWS (= #ZJWS# "")) (setq #ZJWS# oldZJWS)
  7. (if (and (not oldZJWS) (= #ZJWS# "")) (setq #ZJWS# 3) ))

注记高度代码的写法类似,注意高度使用getreal函数,并将

(initget 5 "  ")改为

(initget 7 "  "),阻止0和负数输入

你自己写一下吧!

[此贴子已经被作者于2010-10-9 8:30:40编辑过]

[em119]我改不赢啊,改了还是要输入,并且文字是乱码

回复 支持 反对

使用道具 举报

发表于 2010-10-9 14:25:00 | 显示全部楼层
修改后代码:
  1. (defun c:mjqh1 (/ pt1 pt2 zg mj zmj ss LastEntity LastEntity1 gxl-Sel-EntNextAll ssaddsel )
  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 oldZJWS #ZJWS#)
  61. (initget 5 "  ")
  62. (if #ZJWS# (setq #ZJWS# (getint (strcat "\n 输入注记位数<" (itoa #ZJWS#) ">:")))
  63. (setq #ZJWS# (getint "\n 输入注记位数<3>:"))
  64. )
  65. (if (and oldZJWS (= #ZJWS# "")) (setq #ZJWS# oldZJWS)
  66. (if (and (not oldZJWS) (= #ZJWS# "")) (setq #ZJWS# 3) ))
  67. (setq oldZJWS #ZJWS#)
  68.   ;(setq mjHeight (getreal "\n输入注记高度:"))
  69.   ;(if (not(or (= 'INT (type mjHeight))(= 'REAL (type mjHeight)))) (setq mjHeight 1.5))
  70.   (setq oldZJGD mjHeight)
  71. (initget 7 "  ")
  72. (if mjHeight (setq mjHeight (getreal (strcat "\n 输入注记高度:<" (rtos mjHeight 2 2) ">:")))
  73. (setq mjHeight (getreal "\n 输入注记高度<1.5>:"))
  74. )
  75. (if (and oldZJGD (= mjHeight "")) (setq mjHeight oldZJGD)
  76. (if (and (not oldZJGD) (= mjHeight "")) (setq mjHeight 3) ))
  77. (setq oldZJGD mjHeight)
  78.   (setq ss (ssadd))
  79.    (while (= 'LIST (type
  80.       (progn
  81.                         (initget 7 "No  ")
  82.                         (setq pt1 (getpoint "\n请选择中心点:"))
  83.                         )
  84.       )
  85.      )
  86.   (setq LastEntity (entlast))
  87.   (while (progn
  88.    ;(setq pt1 (getpoint "\n请输入中心点:"))
  89.    (command "-boundary" pt1 "")
  90.    (setq LastEntity1 (entlast))
  91.    (equal LastEntity LastEntity1)
  92.    )
  93.     (setq pt1 (getpoint "\n请输入中心点:"))
  94.     )
  95.   (command "Area" "o" LastEntity1)
  96.   ;(entdel (entlast))
  97.     ; (ssadd LastEntity1 ss)
  98.           (setq ss0 (GXL-SEL-ENTNEXTALL LastEntity))
  99.      (setq ss (ssaddsel ss0 ss))
  100.        (redraw LastEntity1 3)
  101.   (setq mj (getvar "area"))
  102.   ;|(if (= mjdw 1000)
  103.     (setq mj (/ mj 1000000.0))
  104.     )|;
  105.      (princ (rtos mj 2 #ZJWS#))
  106.      (setq mj (atof (rtos mj 2 #ZJWS#)))
  107.   (setq zg mjHeight)
  108.   
  109.      (setq zmj (+ zmj mj))
  110.      (princ (strcat "  当前总面积:" (rtos zmj 2 #ZJWS#)))
  111.      ;;;注记文字
  112.      (gxl-MakeText1 pt1 (rtos mj 2 #ZJWS#) zg 0.8 0 0 )
  113.     (ssadd (entlast) ss)
  114.   ;(setq mj (rtos mj 2 2))
  115.   ;(gxl-MakeText pt1 mj zg 0.8 0 0)
  116.      )
  117.   (command "erase" ss "")
  118.   (princ (strcat "\n 总面积为: " (setq zmj (rtos zmj 2 #ZJWS#))))
  119.   (setq zmj (strcat " 总面积为: " zmj))
  120.   (setq zg mjHeight)
  121.   (initget 7 " ")
  122.   (setq pt2 (getpoint "\n 选择注记位置:"))
  123.   (if (= 'List (type pt2))
  124.       (gxl-MakeText1 pt2 zmj zg 0.8 0 0 )
  125.     )
  126.    
  127.   (reerr)
  128.   ;(princ)
  129.   )
123下一页
返回列表 发新帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-2-27 17:06 , Processed in 0.170579 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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