块和层
我在画图中用了很多积木。所有块都有自己的层。有时会变得一团糟,因为相同的块会被转移到其他层。是否有lisp检查所有图形并将所有块放在正确的图层中?谢谢 lisp如何知道每个块属于哪一层?从来没有见过一张每个区块都有自己图层的图纸。 这在理论上应该可以工作,但我不知道回调函数失败的原因-返回的参数是“无效”的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
)
您好,Grrr。你的代码运行良好。谢谢 最初改变层的部分工作,但反应器不工作-它应该检查块是否被修改,如果块的层被更改,反应器将其切换回(锁定层)。
但就像我说的,我得到了一个奇怪的无效实体名参数:
https://preview.ibb.co/eLczJ5/Screen_Shot001.jpg
尽管一些其他类型的反应堆可能会工作-例如图纸将被保存/将被关闭/变量更改-并迭代所有块并重置其层。 我用我的一些代码块检查代码,直到现在都很好。。。如果我看到任何错误,我会告诉你。谢谢 @Grrr:
也许这有助于澄清你的反应堆问题:
https://www.theswamp.org/index.php?topic=52466.0
谢谢,罗伊!
我已经忘记了那个线程(当时我还是一个反应器假人,所以有点忽略了它)。
从图中你可能会看到,我试图获取或错误捕获结果-这些将停止进一步的评估,并且不会解决问题。
我下载了您上传的最新的“ConnectObjects\u AutoCAD.lsp”,并粗略检查了您的代码(没有仔细分析),这是一种非常有趣的扩展数据技术。
这几天我太忙了,所以我只想问一个简单的问题——你找到解决办法了吗?(没有时间测试代码)。
最后,我在这个任务中扮演了DCL部分,但我把反应堆问题留给了甜点:
https://image.ibb.co/nqvPkk/Screen_Shot001.jpg 两位AutoCAD用户已确认ConnectObjects\u AutoCAD。lsp在该程序中起作用。您使用entget让我想起了ConnectObjects代码的问题。
页:
[1]