明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2908|回复: 7

[原创]立面标高关联程序!

[复制链接]
发表于 2003-9-14 12:06:00 | 显示全部楼层 |阅读模式
;;
;;立面标高关联程序
;;

(vl-load-com)

;;标高反应器
(defun elev-record(owner-object reactor-object parameter-list)
  (if (not (vlax-erased-p owner-object))
    (setq elev-to-update (append elev-to-update (list owner-object)))
  )
)
(defun elev-copied(owner-object reactor-object parameter-list / new-ename)
  (setq elev-object-reactor reactor-object)
  (setq new-ename (car parameter-list))
  (setq elev-to-update (append elev-to-update (list new-ename)))
)
(defun commande (calling-reactor lst / elev-update-attr elev-object)
  (defun elev-update-attr(elev-object / elev-ename insp text attr-object)
    (setq elev-ename (vlax-vla-object->ename elev-object))
    (setq insp (vla-get-InsertionPoint elev-object))
    (setq insp (vlax-safearray->list (vlax-variant-value insp)))
    (setq text (rtos (/ (+ (cadr insp) (vlax-ldata-get "yad_dict" "elev")) 1000.0) 2 3))
    (if (= text "0.000") (setq text "%%p0.000"))
    (setq attr-object (vlax-ename->vla-object (entnext elev-ename)))
    (vla-put-textstring attr-object text)
    (if (vlax-object-released-p attr-object)
      (vlax-release-object attr-object)
    )
  )
  (if elev-to-update
    (progn
      (setq elev-to-update (vl-remove nil elev-to-update))
      (foreach elev-object elev-to-update
        (if (= (type elev-object) 'ename)
          (progn
            (setq elev-object (vlax-ename->vla-object elev-object))
            (vlr-owner-add elev-object-reactor elev-object)
          )
        )
        (if (vlax-erased-p elev-object)
          nil
          (elev-update-attr elev-object)
        )
        (if (vlax-object-released-p elev-object)
          (vlax-release-object elev-object)
        )
      )
      (setq elev-to-update nil)
    )
  )
  (princ)
)
(vlr-command-reactor nil '((:vlr-commandEnded . commande)))

;;如果要确保图形下次打开时关联有效,请把以上代码及本段代码加入acad2000doc.lsp文件。
;;(if (and (vlax-ldata-get "yad_dict" "elev")
;;       (setq ss (ssget "x" '((0 . "insert")(2 . "yad_elev"))))
;;  )
;;  (progn
;;    (setq n -1)
;;    (repeat (sslength ss)
;;      (setq ent (ssname ss (setq n (1+ n))))
;;      (setq ent (vlax-ename->vla-object ent))
;;      (setq l_obj (append l_obj (list ent)))
;;    )
;;    (setq elev-object-reactor
;;      (vlr-object-reactor l_obj
;;       "elev-Reactor"
;;        '((:vlr-ObjectClosed . elev-record) (:vlr-Copied . elev-copied))
;;      )
;;    )
;;  )
;;)
;;(setq ss nil n nil ent nil l_obj nil)

;;主程序
(defun c:yad_elev(/ os lay ss insp text obj)
  (command "_.undo" "_be")
  (command "_.ucs" "")
  (setvar "cmdecho" 0)
  (setvar "dimzin" 0)
  (if (not (tblsearch "block" "yad_elev"))
    (progn
      (setq os (getvar "osmode") lay (getvar "clayer"))
      (setvar "osmode" 0)
      (setvar "clayer" "0")
      (setq ss (ssadd))
      (command "_.pline" "300,300" "_w" "0" "0" "0,0" "-300,300" "1300,300" "")
      (ssadd (entlast) ss)
      (command "_.attdef" "" "elev" "" "" "_s" "standard" "-100,400" "250" "0")
      (ssadd (entlast) ss)
      (command "_.block" "yad_elev" "0,0" ss "")
      (setvar "osmode" os)
      (setvar "clayer" lay)
    )
  )
  (if (not (vlax-ldata-get "yad_dict" "elev"))
    (progn
      (setq insp (if (setq insp (getpoint "\n点取立剖面正负零标高的标注位置:<原点>")) insp '(0.0 0.0 0.0)))
      (setq text (- (cadr insp)))
      (vlax-ldata-put "yad_dict" "elev" text)
      (command "_.insert" "yad_elev" insp "1" "" "0" "%%p0.000")
      (setq obj (vlax-ename->vla-object (entlast)))
      (if (not elev-object-reactor)
        (setq elev-object-reactor
              (vlr-object-reactor (list obj)
                "elev-Reactor"
                '((:vlr-ObjectClosed . elev-record) (:vlr-Copied . elev-copied))
              )
        )
        (vlr-owner-add elev-object-reactor obj)
      )
      (if (vlax-object-released-p obj)
          (vlax-release-object obj)
      )
    )
    (while (and (setq text (vlax-ldata-get "yad_dict" "elev"))
                (not (prompt (strcat "\n***当前正负零标高相当于屏幕Y轴坐标" (rtos (- text) 2 0) "***")))
                (not (initget "Ch"))
                (setq insp (getpoint "\n点取立剖面标高标注点[C 重新确认正负零标高的位置]:"))
           )
      (if (= insp "Ch")
        (progn
          (setq text (getpoint "\n***注意:原有标高会自动更改***\n点取正负零标高的位置:"))
          (if (and text (setq text (- (cadr text))) (not (equal text (vlax-ldata-get "yad_dict" "elev"))))
            (progn
              (vlax-ldata-put "yad_dict" "elev" text)
              (if (ssget "x" '((0 . "insert")(2 . "yad_elev")))
                (command "_.move" (ssget "x" '((0 . "insert")(2 . "yad_elev"))) "" "0,0" "0,0")
              )
            )
          )
        )
        (progn
          (setq text (+ text (cadr insp))
                text (if (equal text 0) "%%p0.000" (rtos (/ text 1000.0) 2 3))
          )
          (command "_.insert" "yad_elev" insp "1" "" "0" text)
          (setq obj (vlax-ename->vla-object (entlast)))
          (if (not elev-object-reactor)
            (setq elev-object-reactor
                  (vlr-object-reactor (list obj)
                    "elev-Reactor"
                    '((:vlr-ObjectClosed . elev-record) (:vlr-Copied . elev-copied))
                  )
            )
            (vlr-owner-add elev-object-reactor obj)
          )
          (if (vlax-object-released-p obj)
              (vlax-release-object obj)
          )
        )
      )
    )
  )
  (command "_.undo" "_e")
  (princ)
)
(prompt "\n*** 立面标高关联程序yad_elev ***   YAD建筑")
(princ)
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2003-9-15 21:49:00 | 显示全部楼层
lyy,你好厉害哦。高手啊
发表于 2011-11-18 21:10:24 | 显示全部楼层
真得很好用啊谢谢
发表于 2013-6-20 08:42:43 | 显示全部楼层
程序不错,要是能让用户 自定义 三角 符号的大小就更好了 比如在1:1的图上用
发表于 2015-9-1 22:54:16 | 显示全部楼层
太强了
发表于 2015-9-2 09:21:21 | 显示全部楼层
好程序,但应该加一个取消关联的设置,因为图纸完成后,可能需要调整图面布置,这时就不需要标高跟着改动。另;1,标高三角下面应该有一短直线,2,文字高度250是否有点小
发表于 2022-12-1 16:52:52 | 显示全部楼层
      (command "_.attdef" "" "elev" "" "" "_s" "standard" "-100,400" "250" "0") 修改此句的250到300的话还是没法将标高文字高度调整为300呢?
发表于 2022-12-2 07:20:26 | 显示全部楼层
可以了-----
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-16 05:37 , Processed in 0.167491 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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