明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2109|回复: 5

[资源] 如何实现阵列加标高值

[复制链接]
发表于 2014-6-17 07:46 | 显示全部楼层 |阅读模式
以下是复制加标高增加标高值的源程序(感谢原作者),哪位高手能帮助改一下达到如下结果:单方向阵列加标高值,就是在画高层建筑时如果我一层标高为正负零(图中已经标出该标高),共有20层,直接阵列该标高值20次(垂直方向),则直接生成每一层的标高,谢谢!
(defun c:jbg ()
  ;(PXT_ER)
  (defun DXF (n da) (cdr (assoc n da)))
  (setq        xtblm '("osmode" "clayer" "cecolor" "orthomode" "plinewid")
        xtblz (mapcar 'getvar xtblm)
  )
  (setvar "osmode" 1) ;_捕捉端点  
  (princ "\n请选择要复制\"图层为_B标高\"的标高(退出):")
;;;  (setq        ss (ssget ":L"
;;;                  (list (cons 8 "B标高"))
;;;           )
;;;  )
  (setq ss (ssget))
  (if ss
    (progn
      (command "undo" "be")
      (if (null bl-cb)
        (setq bl-cb 1.0)
      )
      (prompt (strcat "\n当前缩放比例:【" (rtos bl-cb 2 1) "】"))
      (initget "Bili")
      (setq p1 (getpoint "\nBili改变比例/ 基点(退出):"))
      (while (= p1 "Bili")
        (setq
          bl-cb2
           (getreal (strcat "\n请输入比例:<" (rtos bl-cb 2 1) ">")
           )
        )
        (if bl-cb2
          (setq bl-cb bl-cb2)
          (setq bl-cb bl-cb)
        )
        (prompt (strcat "\n当前缩放比例:【" (rtos bl-cb 2 1) "】"))
        (initget "Bili")
        (setq p1 (getpoint "\nBili改变比例/ 基点(退出):"))
      )
      ;;--------------------------------------------  
      (setvar "osmode" 673) ;_捕捉端点、交叉点、最近点 垂足
      (while (setq p2 (getpoint p1 "\n拷贝至 (退出): "))
        ;;-------------------------------
        ;; 返回复制后,新生成的物体ss_new
        (setq en_Last (entlast)
              ss_new  (ssadd)
        )
        (command "copy" ss "" p1 p2)
        (setq en_next (entnext en_Last))
        (while en_next
          (ssadd en_next ss_new)
          (setq en_next (entnext en_next))
        )
        ;;------------------------------

        (setq i 0)
        (repeat        (sslength ss_new)
          (setq        en   (ssname ss_new i)
                da   (entget en)
                enty (DXF 0 da)
          )
          (cond
            ;;处理:普通标高text 天正标高
            ((member enty (list "TEXT" "TCH_ELEVATION"))
             (setq txt (DXF 1 da))
             (if (or (= txt "%%p0.000")
                     (= txt "0") ;_Tch标高为 (1 . "0")
                     (and (/= (atof txt) 0)
                          (wcmatch txt "*.*")
                     )
                 )
               (progn
                 ;;--计算高差----
                 (setq d   (- (cadr p2) (cadr p1))
                       d   (* d 0.001 bl-cb)
                       num (+ (atof txt) d)
                 )
                 (setq txt-n (rtos num 2 3))
                 (if (= txt-n "0.000")
                   (setq txt-n "%%p0.000")
                 )
                 ;;-------------
                 (setq da (subst (cons 1 txt-n) (assoc 1 da) da))
                 (entmod da)
               )
             )
            )
            ;;处理:属性标高
            ((member enty (list "INSERT"))
             (setq da  (entget (entnext en))
                   txt (DXF 1 da)
             )
             ;;--计算高差----
             (setq d   (- (cadr p2) (cadr p1))
                   d   (* d 0.001 bl-cb)
                   num (+ (atof txt) d)
             )
             (setq txt-n (rtos num 2 3))
             (if (= txt-n "0.000")
               (setq txt-n "%%p0.000")
             )
             ;;-------------

             ;;============================
             ;; 替换属性文字
             (setq da (entget (entnext en)))
             (setq da (subst (cons 1 txt-n) (assoc 1 da) da))
             (entmod da)
             (entupd en)
             (entupd (entnext en))
             ;;============================
            )
          ) ;_ cond
          (setq i (1+ i))
        ) ;_end repeat
      ) ;_end while
      (command "undo" "e")
    )
  ) ;_ if ss
  (mapcar 'setvar xtblm xtblz)
  (princ)
)

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2014-6-17 08:31 | 显示全部楼层
  1. ;阵列标高
  2. (defun c:arbg ()
  3.   ;(PXT_ER)
  4. (defun DXF (n da) (cdr (assoc n da)))
  5. (setq xtblm '("osmode" "clayer" "cecolor" "orthomode" "plinewid")
  6.        xtblz (mapcar 'getvar xtblm))
  7. (setvar "osmode" 1) ;_捕捉端点  
  8. (if  (setq s1 (entsel "\n请选择要复制"图层为_B标高"的标高(退出):")) (progn
  9.   (command "undo" "be")
  10.   (if (null bl-cb) (setq bl-cb 1.0))
  11.   (prompt (strcat "\n当前缩放比例:【" (rtos bl-cb 2 1) "】"))
  12.   (initget "Bili")
  13.   (setq p1 (getpoint "\nBili改变比例/ 基点(退出):"))
  14.   (while (= (progn (initget "Bili")
  15.                   (setq p1 (getpoint "\nBili改变比例/ 基点(退出):"))) "Bili")
  16.    (setq bl-cb2 (getreal (strcat "\n请输入比例:<" (rtos bl-cb 2 1) ">")))
  17.    (setq bl-cb (if bl-cb2 bl-cb2 bl-cb))
  18.    (prompt (strcat "\n当前缩放比例:【" (rtos bl-cb 2 1) "】"))
  19.   )
  20. ;;--------------------------------------------  
  21.   (setq en_Last (entlast) ss  (ssadd))
  22.   (command "_.ARRAY" s1 "" "R")
  23.   (if (> (getvar "CMDACTIVE") 0) (command PAUSE))
  24. ;; 返回阵列后,新生成的物体ss
  25.   (while (setq en_Last (entnext en_Last))
  26.    (ssadd en_Last ss)
  27.   )
  28. ;;------------------------------
  29.   (setq i 0)
  30.   (repeat (sslength ss)
  31.    (setq en (ssname ss i)
  32.         da (entget en)
  33.         enty (DXF 0 da))
  34.    (cond ;;处理:普通标高text 天正标高
  35.     ((member enty (list "TEXT" "TCH_ELEVATION"))
  36.      (setq txt (DXF 1 da))
  37.      (if (or (= txt "%%p0.000") (= txt "0") ;_Tch标高为 (1 . "0")
  38.                (and (/= (atof txt) 0) (wcmatch txt "*.*"))
  39.           ) (progn
  40. ;;--计算高差----
  41.       (setq d (* (- (cadr p2) (cadr p1)) 0.001 bl-cb)
  42.          num (+ (atof txt) d))
  43.       (setq txt-n (rtos num 2 3))
  44.       (if (= txt-n "0.000") (setq txt-n "%%p0.000"))
  45. ;;------------
  46.       (entmod (subst (cons 1 txt-n) (assoc 1 da) da))
  47.      ))
  48.     )
  49. ;;处理:属性标高
  50.     ((member enty (list "INSERT"))
  51.      (setq da  (entget (entnext en))
  52.           txt (DXF 1 da))
  53. ;;--计算高差----
  54.      (setq d (* (- (cadr p2) (cadr p1)) 0.001 bl-cb)
  55.            num (+ (atof txt) d))
  56.      (setq txt-n (rtos num 2 3))
  57.      (if (= txt-n "0.000") (setq txt-n "%%p0.000"))
  58. ;; 替换属性文字
  59.      (setq da (entget (entnext en)))
  60.      (entmod (subst (cons 1 txt-n) (assoc 1 da) da))
  61.      (entupd en)
  62.      (entupd (entnext en))
  63. ;;============================
  64.     )
  65.    ) ;_ cond
  66.    (setq i (1+ i))
  67.   ) ;_end repeat
  68. )) ;_end while
  69. (command "undo" "e")
  70. (mapcar 'setvar xtblm xtblz)
  71. (princ)
  72. )
发表于 2014-6-17 22:16 | 显示全部楼层
提个思路。
选择标高符号标准,判断标高符号类型。普通文字 属性块 天正标高。。
以此作为标准选择集,指定符号基点,确定楼层数,每层高度,地下多少层。
确定0.00标高(或者在第一步就是0.00标高。)
repeat 楼层数,根据基点 每层高度 计算复制点,并修改标高文字
完成。

发表于 2014-6-17 23:47 | 显示全部楼层




本帖子中包含更多资源

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

x
发表于 2014-6-17 23:55 | 显示全部楼层

本帖子中包含更多资源

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

x
 楼主| 发表于 2022-9-12 20:09 | 显示全部楼层

CAD2010输入命令arbg没有反应呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-3 13:41 , Processed in 0.544200 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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