prodromosm 发表于 2022-7-5 16:28:24

块和层

我在画图中用了很多积木。所有块都有自己的层。有时会变得一团糟,因为相同的块会被转移到其他层。是否有lisp检查所有图形并将所有块放在正确的图层中?
 
谢谢

tombu 发表于 2022-7-5 16:42:40

lisp如何知道每个块属于哪一层?从来没有见过一张每个区块都有自己图层的图纸。

Grrr 发表于 2022-7-5 16:49:41

这在理论上应该可以工作,但我不知道回调函数失败的原因-返回的参数是“无效”的ename:
 

; (setq *LinkLyrBlk* nil)

(defun C:LinkLayerBlock ( / SymNms Lyrs Blks Lyr Blk itm )

(defun SymNms ( tbl / d L )
   (while (setq d (tblnext tbl (not d))) (setq L (cons (cdr (assoc 2 d)) L)) )
   (acad_strlsort L)
); defun SymNms
(if
   (and
   (setq Lyrs (SymNms "LAYER"))
   (setq Blks (SymNms "BLOCK"))
   (setq Blks (vl-remove-if '(lambda (x) (wcmatch x "`*U*,_*,`*T*")) Blks))
   (setq Lyr (car (LM:listbox "Select Layer" Lyrs 0)))
   (setq Blk (car (LM:listbox (strcat "Select Block to link with " Lyr) Blks 0)))
   )
   (progn
   (foreach rtr (cdar (vlr-reactors :vlr-AcDb-reactor)) (if (= "LinkLyrBlk" (vlr-data rtr)) (vlr-remove rtr)))
   (vlax-for o (vla-get-Block (vla-get-ActiveLayout (vla-get-ActiveDocument (vlax-get-acad-object))))
       (and
         (vlax-write-enabled-p o)
         (eq "AcDbBlockReference" (vla-get-ObjectName o))
         (eq Blk (vla-get-EffectiveName o))
         (vla-put-Layer o Lyr)
       ); and
   ); vlax-for
   (cond
       ( (setq itm (assoc Lyr *LinkLyrBlk*))
         (setq *LinkLyrBlk* (mapcar '(lambda (x) (vl-remove-if '(lambda (b) (eq b Blk)) (cdr x))) *LinkLyrBlk*)); Remove duplicate blocks
         (setq *LinkLyrBlk* (subst (append itm (list Blk)) itm *LinkLyrBlk*))
       )
       ( (setq *LinkLyrBlk* (cons (list Lyr Blk) *LinkLyrBlk*)) )
   ); cond
   (vlr-AcDb-reactor "LinkLyrBlk"
       '((:vlr-objectAppended . LinkLyrBlk:callback)
         (:vlr-objectReAppended . LinkLyrBlk:callback)
         (:vlr-objectModified . LinkLyrBlk:callback)
       )
   ); vlr-AcDb-reactor
   ); progn
); if
(princ)
); defun C:LinkLayerBlock

(defun LinkLyrBlk:callback (rtr arg / e o nm )
(and
   *LinkLyrBlk*
   (eq 'ENAME (type (setq e (cadr arg))))
   (= "INSERT" (cdr (assoc 0 (entget e))))
   (setq o (vlax-ename->vla-object e))
   (vlax-write-enabled-p o)
   (eq "AcDbBlockReference" (vla-get-ObjectName o))
   (setq nm (vla-get-EffectiveName o))
   (vl-some
   '(lambda (a)
       (vl-some
         '(lambda (b)
         (if (eq b nm) (progn (vla-put-Layer o (car a)) T))
         ); lambda b
         (cdr a)
       ); vl-some
   ); lambda a
   *LinkLyrBlk*
   ); vl-some
); and
); defun LinkLyrBlk:callback



;; List Box-Lee Mac
;; Displays a DCL list box allowing the user to make a selection from the supplied data.
;; msg - Dialog label
;; lst - List of strings to display
;; bit - 1=allow multiple; 2=return indexes
;; Returns: List of selected items/indexes, else nil

(defun LM:listbox ( msg lst bit / dch des tmp rtn )
(cond
   (   (not
   (and
       (setq tmp (vl-filename-mktemp nil nil ".dcl"))
       (setq des (open tmp "w"))
       (write-line
         (strcat "listbox:dialog{label=\"" msg "\";spacer;:list_box{key=\"list\";multiple_select="
         (if (= 1 (logand 1 bit)) "true" "false") ";width=50;height=15;}spacer;ok_cancel;}"
         )
         des
       )
       (not (close des))
       (< 0 (setq dch (load_dialog tmp)))
       (new_dialog "listbox" dch)
   )
   )
   (prompt "\nError Loading List Box Dialog.")
   )
   (   t   
   (start_list "list")
   (foreach itm lst (add_list itm))
   (end_list)
   (setq rtn (set_tile "list" "0"))
   (action_tile "list" "(setq rtn $value)")
   (setq rtn
       (if (= 1 (start_dialog))
         (if (= 2 (logand 2 bit))
         (read (strcat "(" rtn ")"))
         (mapcar '(lambda ( x ) (nth x lst)) (read (strcat "(" rtn ")")))
         )
       )
   )
   )
)
(if (< 0 dch)
   (unload_dialog dch)
)
(if (and tmp (setq tmp (findfile tmp)))
   (vl-file-delete tmp)
)
rtn
)                     

prodromosm 发表于 2022-7-5 16:55:26

您好,Grrr。你的代码运行良好。谢谢

Grrr 发表于 2022-7-5 17:03:06

最初改变层的部分工作,但反应器不工作-它应该检查块是否被修改,如果块的层被更改,反应器将其切换回(锁定层)。
但就像我说的,我得到了一个奇怪的无效实体名参数:
 
https://preview.ibb.co/eLczJ5/Screen_Shot001.jpg
 
尽管一些其他类型的反应堆可能会工作-例如图纸将被保存/将被关闭/变量更改-并迭代所有块并重置其层。

prodromosm 发表于 2022-7-5 17:09:28

我用我的一些代码块检查代码,直到现在都很好。。。如果我看到任何错误,我会告诉你。谢谢

Roy_043 发表于 2022-7-5 17:14:33

@Grrr:
也许这有助于澄清你的反应堆问题:
https://www.theswamp.org/index.php?topic=52466.0

Grrr 发表于 2022-7-5 17:21:57

 
谢谢,罗伊!
我已经忘记了那个线程(当时我还是一个反应器假人,所以有点忽略了它)。
从图中你可能会看到,我试图获取或错误捕获结果-这些将停止进一步的评估,并且不会解决问题。
我下载了您上传的最新的“ConnectObjects\u AutoCAD.lsp”,并粗略检查了您的代码(没有仔细分析),这是一种非常有趣的扩展数据技术。
这几天我太忙了,所以我只想问一个简单的问题——你找到解决办法了吗?(没有时间测试代码)。
 
最后,我在这个任务中扮演了DCL部分,但我把反应堆问题留给了甜点:
 
https://image.ibb.co/nqvPkk/Screen_Shot001.jpg

Roy_043 发表于 2022-7-5 17:28:44

两位AutoCAD用户已确认ConnectObjects\u AutoCAD。lsp在该程序中起作用。您使用entget让我想起了ConnectObjects代码的问题。
页: [1]
查看完整版本: 块和层