Lisaj98052 发表于 2022-7-5 15:55:50

层状反应器

我想知道是否有人有一个在布局选项卡上切换图层的图层编辑器示例。
 
 
我的想法是将文本放置在活动选项卡的选项卡上的不同层上。
例如,我有一个布局为5的文件,所以我想将文字放置在图层anno text sheet 1或anno text sheet 2上,依此类推。
 
 
任何帮助都会很好。

Roy_043 发表于 2022-7-5 16:04:48

你为什么不冻结图层?

Lisaj98052 发表于 2022-7-5 16:20:05

我以前有一个lisp或reactor,当我切换布局并键入txt时,会生成一个名为c-anno-tabname-text的层(比如c-anno-C005-text,然后我所要做的就是冻结c-anno-C004-text和c-anno-C006-text层。但我在某些地方丢失了它。

PDuMont 发表于 2022-7-5 16:22:08

嗨,丽莎。
 
这取决于布局选项卡的命名是否正确:
i、 e.C001、C002等。
 
简要测试。
 
 
(defun c:TabNameOn ()
(vl-load-com)
(if (not com:react)
   (progn
   (setq com:react
(vlr-command-reactor nil
    '((:vlr-commandWillStart . ComReactBegin)
      (:vlr-commandEnded . ComReactEnd)
      (:vlr-commandCancelled . ComReactCancel))))
   (princ "\n<<< Command reactor Switched ON >>>")
      ); end progn
   ); end if
   (princ)
   ); end of c:TabNameOn

(defun c:TabNameOff ()
   (if com:react
   (progn
      (vlr-Remove com:react)
      (setq com:react nil)
      (princ "\n<<< Command reactor Switched OFF >>> ")
      ); end progn
   ); end if
   ); end of c:TabNameOff

(defun ComReactBegin (react args / layname comLst nLay)
   (setq layname (getvar 'ctab))
   (setq layname (strcase (strcat "C-ANNO-" layname "-TEXT")))
   (setq comLst '(((layname 3)
                   "MTEXT"
                   "DTEXT"
                   "TEXT"
                   "EATTEXT"
                   "QLEADER"
                   "MLEADER"
                   "LEADER"
                   "REVCLOUD"
                   "TABLE"
                   "DATAEXTRACTION"
                  )
               ) ; end comLst
   ) ; end setq

   (foreach itm comLst
   (if (member (car args) itm)
(progn
(if (not (tblsearch "LAYER" layname))
    (progn
   (setq nLay (vla-Add (vla-get-Layers
      (vla-get-ActiveDocument
          (vlax-get-acad-object))) layname))
   (vla-put-Color nLay (cadar itm))
   (setq com:resFlg T)
   ); end progn
    ); end if
   (setq com:oldLay (getvar 'clayer)
       com:resFlg T)
   (setvar 'clayer layname)
); end progn
); end if
   ); end foreach
   (princ)
   ); end of ComReactBegin

(defun ComReactEnd(react args)
   (if com:resFlg
   (progn
(setq com:resFlg nil)
       (setvar 'clayer com:oldLay)
      ); end progn
   ); end if
   (princ)
   ); end of ComReactEnd

(defun ComReactCancel(react args)
   (if com:resFlg
   (progn
(setq com:resFlg nil)
       (setvar 'clayer com:oldLay)
      ); end progn
   ); end if
   (princ)
   ); end of ComReactCancel

(princ "\nType TABNAMEON to switch-on and TABNAMEOFF switch-off command reactor! ")
(c:TabNameOn)

Tharwat 发表于 2022-7-5 16:31:37

你好
 
试试这个;
(vl-load-com)
;; Tharwat - 16.Oct.2017        ;;
(defun SetLayerApp ()
(or *SetLayerReactor*
   (setq *SetLayerReactor* (vlr-sysvar-reactor nil '((:vlr-sysVarChanged . SetLayer))))
)
)

(defun SetLayer (e p / l)
(if (or (eq (car p) "CLAYOUT") (eq (car p) "CTAB"))
   (and (or (tblsearch "LAYER" (setq l (strcat "anno-text-" (setq *currenttab* (getvar 'CTAB)))))
            (vla-add (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) l))
      (setvar 'CLAYER l)
      )
   )
)

(SetLayerApp)

PDuMont 发表于 2022-7-5 16:46:55

非常简洁的塔尔瓦!

Tharwat 发表于 2022-7-5 16:52:48

 
谢谢你,菲利普。

Lee Mac 发表于 2022-7-5 16:58:57

可能更容易使用vlr layoutswitched事件。。。
(vl-load-com)
(foreach rtr (cdar (vlr-reactors :vlr-miscellaneous-reactor))
   (if (= "layout-text-reactor" (vlr-data rtr)) (vlr-remove rtr))
)
(vlr-miscellaneous-reactor "layout-text-reactor" '((:vlr-layoutswitched . layout-text-reactor-callback)))
(defun layout-text-reactor-callback ( rtr arg / lyn )
   (if (/= "model" (strcase (car arg) t))
       (progn
         (vla-put-freeze
               (vla-add
                   (cond
                     (layout-text-reactor-layers)
                     ((setq layout-text-reactor-layers (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))))
                   )
                   (setq lyn (strcat "anno-text-" (car arg)))
               )
               :vlax-false
         )
         (setvar 'clayer lyn)
       )
   )
   (princ)
)
页: [1]
查看完整版本: 层状反应器