Antas 发表于 2022-7-5 20:25:44

属性块实体层

你好
有人请帮我用一个lisp程序,它改变了所有标签在一个属性块层为单一层由用户选择。

Tharwat 发表于 2022-7-5 20:32:51

你好
 
你知道指挥官吗?
如果没有帮助,如果可能的话,请用一张示例图来详细说明您的目标。

Antas 发表于 2022-7-5 20:38:22

谢谢你的回复。
 
是的,我用过几次巴特曼指挥。使用该命令,我可以更改属性块每个标记的层。但使用该命令,我们只能通过单独选择每个标记来更改层。因此,如果我有一个带有许多标记的属性块,它会变得很乏味。
 
但我的目标是将属性块的所有标记层更改为公共层。

pBe 发表于 2022-7-5 20:46:49

 
但是,您可以使用块编辑器更改标记层,然后运行Attsync。
 
让我问一下,属性定义的图层是否因每个绘图任务而异?或者它是所有人的永久层?

Antas 发表于 2022-7-5 20:50:09

你好,pBe,
我正在寻找LISP,因为这是我现在正在尝试的自动化过程的一部分。
 
是的,属性定义的图层因每个绘图任务而异。但在大约70%的会话中,它是单层的“注释参考”

pBe 发表于 2022-7-5 20:53:57

 
你说的自动化过程是指批量?还是你在一个接一个地打开文件?
 
 
那30%呢?这是怎么起作用的?
 
一个lisp例程很简单,我只是想理解它背后的逻辑,我很确定有人正在为此编写代码。
 
我只是在开始编写lisp代码之前确保我理解了所有条件

Antas 发表于 2022-7-5 21:03:12

感谢您的关注pBe,
 
让我解释一下我的惯例,
 
我有很多套图纸,每套包含大约20张图纸。每个图形都包含一个属性块。
该块通常包含多达30个标记。
我打开一个图形,然后使用BATTMAN或只需双击块,将块的所有标记层更改为单个所需层。
 
70%意味着…在我工作的10个集合中,有7个需要将层更改为层“Note ref”。即在大多数图纸中,块的所有标记都转换为“Note ref”。
 
撇开这些百分比不谈,
我希望我已经向你澄清了。
请询问是否需要提供更多信息

Tharwat 发表于 2022-7-5 21:07:07

你好
 
试试看,让我知道
 

(defun c:Test (/ _doc ss name l)
;;;      Tharwat 31.12.2014      ;;
(if
   (and
   (or
       (tblsearch "LAYER" "Note-ref")
       (progn (alert
                "Layer name < Note-ref > is not found in the drawing !!"
            )
            nil
       )
   )
   (princ "\n Select Attributed Blocks ...")
   (ssget "_:L" '((0 . "INSERT") (66 . 1)))
   )
    (progn
      (setq _doc (vla-get-ActiveDocument (vlax-get-acad-object)))
      (vlax-for s (setq ss (vla-get-ActiveSelectionSet _doc))
      (if (not (member (setq name (vla-get-effectivename s)) l))
          (setq l (cons name l))
      )
      )
      (vla-startUndomark _doc)
      (vlax-for x (vla-get-blocks _doc)
      (if (member (vla-get-name x) l)
          (vlax-for b x
            (vla-put-layer b "Note-ref")
          )
      )
      )
      (mapcar '(lambda (n) (command "_.attsync" "_name" n)) l)
      (vla-endundomark _doc)
      (if ss
      (vla-delete ss)
      )
    )
)
(princ)
)(vl-load-com)

Antas 发表于 2022-7-5 21:10:50

这代码很好用Tharwat
 
你能用代码要求用户从图形中可用的图层中选择图层吗。?

Tharwat 发表于 2022-7-5 21:18:15

 
试试这个,让我知道。
 

(defun c:Test (/ *error* _dialog cho _doc dlg ss name l lay)
;;;      Tharwat 31.12.2014      ;;
(defun *error* (msg)
   (if (and dlg (findfile dlg))
   (vl-file-delete dlg)
   )
   (if cho
   (setvar 'CMDECHO cho)
   )
   (if (not (wcmatch (strcase msg) "*BREAK*,*CANCEL*,*EXIT*"))
   (princ (strcat "\n** Error: " msg " **"))
   )
   (princ)
)
;;;                        ;;;
(defun _dialog (/ nm id f l lay layers)
   (cond
   ((not
      (and
          (setq dlg (vl-filename-mktemp nil nil ".dcl"))
          (setq f (open dlg "w"))
          (write-line
            "options : dialog {label = \"Layers\"; height = 6;
            spacer_1 ;
            : popup_list { key = \"lst\";}
            : boxed_row {
            : button { label = \"Okay\"; key = \"oki\"; width = 12;}
            : button { label = \"Exit\"; key = \"esc\"; is_default = true; is_cancel = true; width = 12;}}}"
            f
          )
          (not (close f))
      )
      )
      (alert "Can't load the temporary file <!>")
   )
   ((or (not dlg)
          (not (> (setq id (load_dialog dlg)) 0))
          (not (new_dialog
               "options"
               id
               )
          )
      )
      (princ "\n Can not load Dialog !")
   )
   (t
      (while (setq l (tblnext "LAYER" (not l)))
      (if (not (wcmatch (setq nm (cdr (assoc 2 l))) "*|*"))
          (setq layers (cons nm layers))
      )
      )
      (setq layers (acad_strlsort layers))
      (start_list "lst")
      (mapcar 'add_list layers)
      (end_list)
      (action_tile
      "oki"
      "(setq lay (get_tile \"lst\"))(done_dialog)"
      )
      (action_tile "esc" "(done_dialog)")
      (start_dialog)
      (unload_dialog id)
      (vl-file-delete dlg)
   )
   )
   (if lay
   (nth (atoi lay) layers)
   )
)
;;                            ;;;
(if
   (and (setq lay (_dialog))
      (princ "\n Select Attributed Blocks ...")
      (ssget "_:L" '((0 . "INSERT") (66 . 1)))
   )
    (progn
      (setq cho(getvar 'CMDECHO)
            _doc (vla-get-ActiveDocument (vlax-get-acad-object))
      )
      (setvar 'CMDECHO 0)
      (vlax-for s (setq ss (vla-get-ActiveSelectionSet _doc))
      (if (not (member (setq name (vla-get-effectivename s)) l))
          (setq l (cons name l))
      )
      )
      (vla-startUndomark _doc)
      (vlax-for x (vla-get-blocks _doc)
      (if (member (vla-get-name x) l)
          (vlax-for b x
            (vla-put-layer b lay)
          )
      )
      )
      (mapcar '(lambda (n) (command "_.attsync" "_name" n)) l)
      (vla-endundomark _doc)
      (setvar 'CMDECHO cho)
      (if ss
      (vla-delete ss)
      )
    )
)
(princ)
)(vl-load-com)
页: [1] 2
查看完整版本: 属性块实体层