明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1017|回复: 0

找到lyy在2003年写的程序,现在有没有更简洁的写法(有关反应器)

[复制链接]
发表于 2008-8-27 12:18 | 显示全部楼层 |阅读模式

下面这段是lyy在2003年发的程序,在CAD2008里测试是可以用的,只是图块是程序画的,不能用自己的属性块。其实执行过程中是不没必要跳出那个让人填写的EVEV属性值的对话框的,写了也没用,点“确定”后值也是会自动变成程序测量的数值,好像多此一举(还是我还没测出其它方面用处?)。
另外就是被参照的基准点不能移动,有没办法实现参照点也可以移动?也就是移动这个基准点(可以是直线的一端点或块的插入点)时其它参照它的标高值也能自动跟着变?
不知5年后的今天有没有更简洁的写法?
  1. ;; ;;立面标高关联程序 ;;
  2. (vl-load-com) ;;标高反应器
  3. (defun elev-record(owner-object reactor-object parameter-list)
  4.   (if (not (vlax-erased-p owner-object))
  5. (setq elev-to-update (append elev-to-update (list owner-object))) ) )
  6. (defun elev-copied(owner-object reactor-object parameter-list / new-ename)
  7. (setq elev-object-reactor reactor-object) (setq new-ename (car parameter-list))
  8. (setq elev-to-update (append elev-to-update (list new-ename))) )
  9. (defun commande (calling-reactor lst / elev-update-attr elev-object)
  10. (defun elev-update-attr(elev-object / elev-ename insp text attr-object)
  11. (setq elev-ename (vlax-vla-object->ename elev-object))
  12. (setq insp (vla-get-InsertionPoint elev-object))
  13.   (setq insp (vlax-safearray->list (vlax-variant-value insp)))
  14. (setq text (rtos (/ (+ (cadr insp) (vlax-ldata-get "yad_dict" "elev")) 1000.0) 2 3))
  15. (if (= text "0.000") (setq text "%%p0.000"))
  16. (setq attr-object (vlax-ename->vla-object (entnext elev-ename))) (vla-put-textstring attr-object text)
  17.   (if (vlax-object-released-p attr-object) (vlax-release-object attr-object) ) )
  18. (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)))
  19.   ;;如果要确保图形下次打开时关联有效,请把以上代码及本段代码加入acad2000doc.lsp文件。
  20. ;;(if (and (vlax-ldata-get "yad_dict" "elev")
  21. ;; (setq ss (ssget "x" '((0 . "insert")(2 . "yad_elev"))))
  22. ;; ) ;; (progn ;; (setq n -1)
  23. ;; (repeat (sslength ss)
  24. ;; (setq ent (ssname ss (setq n (1+ n))))
  25. ;; (setq ent (vlax-ename->vla-object ent))
  26. ;; (setq l_obj (append l_obj (list ent)))
  27. ;; )
  28. ;; (setq elev-object-reactor
  29. ;; (vlr-object-reactor l_obj
  30. ;; "elev-Reactor"
  31. ;; '((:vlr-ObjectClosed . elev-record) (:vlr-Copied . elev-copied))
  32. ;; )
  33. ;; )
  34. ;; )
  35. ;;)
  36. ;;(setq ss nil n nil ent nil l_obj nil)
  37. ;;主程序
  38.   (defun c:yad_elev(/ os lay ss insp text obj)
  39.   (command "_.undo" "_be")
  40.   (command "_.ucs" "")
  41.   (setvar "cmdecho" 0)
  42.   (setvar "dimzin" 0)
  43.   (if (not (tblsearch "block" "yad_elev"))
  44.   (progn (setq os (getvar "osmode") lay (getvar "clayer"))
  45.   (setvar "osmode" 0)
  46.   (setvar "clayer" "0")
  47.   (setq ss (ssadd))
  48.   (command "_.pline" "300,300" "_w" "0" "0" "0,0" "-300,300" "1300,300" "")
  49.   (ssadd (entlast) ss)
  50.   (command "_.attdef" "" "elev" "" "" "_s" "standard" "-100,400" "250" "0")
  51.   (ssadd (entlast) ss) (command "_.block" "yad_elev" "0,0" ss "")
  52.   (setvar "osmode" os) (setvar "clayer" lay) ) )
  53.   (if (not (vlax-ldata-get "yad_dict" "elev"))
  54.   (progn (setq insp
  55.   (if (setq insp (getpoint "\n点取立剖面正负零标高的标注位置:")) insp '(0.0 0.0 0.0)))
  56.   (setq text (- (cadr insp)))
  57.   (vlax-ldata-put "yad_dict" "elev" text)
  58.   (command "_.insert" "yad_elev" insp "1" "" "0" "%%p0.000")
  59.   (setq obj (vlax-ename->vla-object (entlast)))
  60.   (if (not elev-object-reactor)
  61.   (setq elev-object-reactor (vlr-object-reactor (list obj) "elev-Reactor" '((:vlr-ObjectClosed . elev-record) (:vlr-Copied . elev-copied)) ) )
  62.   (vlr-owner-add elev-object-reactor obj) )
  63.   (if (vlax-object-released-p obj)
  64.   (vlax-release-object obj) ) )
  65.   (while (and (setq text (vlax-ldata-get "yad_dict" "elev"))
  66.   (not (prompt (strcat "\n***当前正负零标高相当于屏幕Y轴坐标" (rtos (- text) 2 0) "***")))
  67.   (not (initget "Ch")) (setq insp (getpoint "\n点取立剖面标高标注点[C 重新确认正负零标高的位置]:"))
  68.   )
  69.   (if (= insp "Ch")
  70.   (progn (setq text (getpoint "\n***注意:原有标高会自动更改***\n点取正负零标高的位置:"))
  71.   (if (and text (setq text (- (cadr text))) (not (equal text (vlax-ldata-get "yad_dict" "elev"))))
  72.   (progn (vlax-ldata-put "yad_dict" "elev" text) (if (ssget "x" '((0 . "insert")(2 . "yad_elev")))
  73.   (command "_.move" (ssget "x" '((0 . "insert")(2 . "yad_elev"))) "" "0,0" "0,0") ) ) ) )
  74.   (progn (setq text (+ text (cadr insp)) text (if (equal text 0) "%%p0.000" (rtos (/ text 1000.0) 2 3)) )
  75.   (command "_.insert" "yad_elev" insp "1" "" "0" text)
  76.   (setq obj (vlax-ename->vla-object (entlast)))
  77.   (if (not elev-object-reactor)
  78.   (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) )
  79.   (if (vlax-object-released-p obj) (vlax-release-object obj) ) ) ) ) )
  80.   (command "_.undo" "_e")
  81.   (princ)
  82.   )
  83.   (prompt "\n*** 立面标高关联程序yad_elev *** YAD建筑") (princ)
"觉得好,就打赏"
还没有人打赏,支持一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-21 01:23 , Processed in 0.174712 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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