注册 发表于 2014-6-17 07:46:59

如何实现阵列加标高值

以下是复制加标高增加标高值的源程序(感谢原作者),哪位高手能帮助改一下达到如下结果:单方向阵列加标高值,就是在画高层建筑时如果我一层标高为正负零(图中已经标出该标高),共有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)
)

ZZXXQQ 发表于 2014-6-17 08:31:51

;阵列标高
(defun c:arbg ()
;(PXT_ER)
(defun DXF (n da) (cdr (assoc n da)))
(setq xtblm '("osmode" "clayer" "cecolor" "orthomode" "plinewid")
       xtblz (mapcar 'getvar xtblm))
(setvar "osmode" 1) ;_捕捉端点
(if(setq s1 (entsel "\n请选择要复制\"图层为_B标高\"的标高(退出):")) (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 (= (progn (initget "Bili")
                  (setq p1 (getpoint "\nBili改变比例/ 基点(退出):"))) "Bili")
   (setq bl-cb2 (getreal (strcat "\n请输入比例:<" (rtos bl-cb 2 1) ">")))
   (setq bl-cb (if bl-cb2 bl-cb2 bl-cb))
   (prompt (strcat "\n当前缩放比例:【" (rtos bl-cb 2 1) "】"))
)
;;--------------------------------------------
(setq en_Last (entlast) ss(ssadd))
(command "_.ARRAY" s1 "" "R")
(if (> (getvar "CMDACTIVE") 0) (command PAUSE))
;; 返回阵列后,新生成的物体ss
(while (setq en_Last (entnext en_Last))
   (ssadd en_Last ss)
)
;;------------------------------
(setq i 0)
(repeat (sslength ss)
   (setq en (ssname ss 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)) 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"))
;;------------
      (entmod (subst (cons 1 txt-n) (assoc 1 da) da))
   ))
    )
;;处理:属性标高
    ((member enty (list "INSERT"))
   (setq da(entget (entnext en))
          txt (DXF 1 da))
;;--计算高差----
   (setq d (* (- (cadr p2) (cadr p1)) 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)))
   (entmod (subst (cons 1 txt-n) (assoc 1 da) da))
   (entupd en)
   (entupd (entnext en))
;;============================
    )
   ) ;_ cond
   (setq i (1+ i))
) ;_end repeat
)) ;_end while
(command "undo" "e")
(mapcar 'setvar xtblm xtblz)
(princ)
)

edata 发表于 2014-6-17 22:16:35

提个思路。
选择标高符号标准,判断标高符号类型。普通文字 属性块 天正标高。。
以此作为标准选择集,指定符号基点,确定楼层数,每层高度,地下多少层。
确定0.00标高(或者在第一步就是0.00标高。)
repeat 楼层数,根据基点 每层高度 计算复制点,并修改标高文字
完成。

xyp1964 发表于 2014-6-17 23:47:49





xyp1964 发表于 2014-6-17 23:55:49


注册 发表于 2022-9-12 20:09:42

ZZXXQQ 发表于 2014-6-17 08:31


CAD2010输入命令arbg没有反应呢
页: [1]
查看完整版本: 如何实现阵列加标高值