背景准备LISP-许多co
因此,我从建筑师那里得到了很多图纸,这些图纸需要以一种特定的方式进行准备,这可能相当繁琐,有时甚至是一个耗时的过程。我一直试图通过编写一些简单的Lisp(我是autoLISP新手)并将它们与其他命令合并到宏中来加快速度。这种方法是可行的,但在切换计算机时,我必须加载每个lisp和宏。它还需要相当长的时间,某些命令必须选择stuff或点击enter等。有时我可以在工作过程中更新整个图形集,有时我需要用20多个大型图形来完成这一过程。我对LISP不太熟悉,无法将所有这些轻松地写进一个例程中。我一直在努力,但有无数的问题。以下是我努力实现的目标:
-绑定所有x参考
-突发绑定x参考
-解锁所有层
-删除冻结层
-删除不可见层
-删除所有尺寸
-将所有层设置为单一颜色
-将所有对象的颜色设置为“ByLayer”
以下是绑定所有外部参照的方式:
(defun c:xrb ()
(command "xref" "b" "*")
(princ)
)
为了分解所有外部参照,我选择它们并从宏中分解它们。。。我想不出如何打破常规。我也从命令宏解锁所有层。
删除冻结/不可见层上的所有对象是通过以下方式完成的:
(defun c:deleteFROZENOFF (/ blocks doc ent idx layers lays2delete ss)
(vl-load-com)
(setq doc (vla-get-activedocument (vlax-get-acad-object))
layers (vla-get-layers doc)
blocks (vla-get-blocks doc)
idx -1
)
(vlax-for lay layers
(if (or (eq (vla-get-layeron lay) :vlax-false)
(eq (vla-get-freeze lay) :vlax-true)
)
(progn
(vla-put-lock lay :vlax-false)
(if lays2delete
(setq lays2delete (strcat lays2delete "," (vla-get-name lay)))
(setq lays2delete (vla-get-name lay))
)
)
)
)
(if (and lays2delete
(setq ss (ssget "x" (list (cons 8 lays2delete))))
)
(progn
(while (setq ent (ssname ss (setq idx (1+ idx))))
(vla-delete (vlax-ename->vla-object ent))
)
)
)
(princ (strcat "\nDone....deleted " (itoa (1+ idx)) " entities from the drawing."))
(princ)
)
^有人帮了点忙
使用以下方法将所有层设置为单一颜色:
(defun c:layers55 ()
(command "_.layer" "_co" "55" "*" "")
(princ)
)
SetByLayer命令的工作原理类似于将所有对象的颜色设置为ByLayer,但当在宏中调用它时,我需要将设置仅配置为颜色。我想取消这一步。
这就是我现在的处境。任何帮助、提示或想法都将不胜感激。理想情况下,我只想键入一个命令,让例程一次为我完成所有任务,而不必理会它。
谢谢 也许是这样?
(defun c:test ( / *error* a b c d e f )
;; © Lee Mac 2011
(defun *error* ( msg )
(if c (setvar 'CMDECHO c))
(or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
(princ (strcat "\n** Error: " msg " **")))
(princ)
)
(setq c (getvar 'CMDECHO))
(setvar 'CMDECHO 0)
(while (setq b (tblnext "BLOCK" (null b)))
(if
(= 4 (logand 4 (cdr (assoc 70 b))))
(setq a (cons "," (cons (cdr (assoc 2 b)) a)))
)
)
(command "_.undo" "_BE" "_.-xref" "_B" "*" "_.-layer" "_U" "*" "")
(sssetfirst nil (ssget "_X" (list '(0 . "INSERT") (cons 2 (apply 'strcat (cdr a))))))
(c:burst)
(while (setq d (tblnext "LAYER" (null d)))
(if
(or
(minusp (cdr (assoc 62 d)))
(= 1 (logand 1 (cdr (assoc 70 d))))
)
(setq e (cons (cdr (assoc 2 d)) e))
)
)
(command "_.-laydel")
(foreach x e (command "_N" x))
(command "" "_Y" "_.-layer" "_C" "55" "*" "")
(if (setq f (ssget "_X" '((0 . "*DIMENSION"))))
(command "_.erase" f "")
)
(if (setq f (ssget "_X"))
(command "_.chprop" f "" "_C" "ByLayer" "")
)
(command "_.undo" "_E")
(setvar 'CMDECHO c)
(princ)
)
但是要小心,上面的代码很危险,因为它使用LayDel命令,该命令将在删除某个层之前删除该层上的所有实体。 谢谢李!我已经试过了那个剧本,它符合我想要的。不过我有个问题。。为什么你要调用Undo并加入这一行?
(command "_.undo" "_BE" "_.-xref" "_B" "*" "_.-layer" "_U" "*" "")
此外,不确定您是否知道这一点,但当我在一台计算机上运行此例程时,它自己完成了所有操作,而不提示我回答是/否问题或选择。在另一台计算机上,它要求我选择一些东西,这些问题出现在命令行中,我必须手动回答。我假设这是一个设置,但有没有办法覆盖它?
另一个问题:我将在哪里调用删除特定填充图案的命令。我想删除所有实心图案填充,但保留其余部分。我通常可以用QSelect来实现这一点,但由于该命令会弹出一个对话框,我将在其中选择特定的图案填充属性,因此我不确定如何实现这一点。有什么想法吗?
谢谢你的帮助,非常感谢! 这里有一些命令(谷歌翻译)
突发绑定x参考-BGBLEXP
删除冻结层-BGLAYDEL
删除不可见层-BGLAYDEL
将所有对象的颜色设置为ByLayer-BGCOLOR
我错过要点了吗?
启动一个Undo组,以便该语句和Undo End调用之间的所有操作都可以通过单次使用Undo命令来撤消。
这就是程序应该如何运行(以及它如何与我的初始测试配合)。
提示您做什么?您可以复制命令行历史记录吗?两台计算机是否运行相同版本的AutoCAD?
您可能需要使用带有过滤器列表的选择集来过滤实体图案填充:
(if (setq ss (ssget "_X" '((0 . "HATCH") (2 . "SOLID"))))
(command "_.erase" ss "")
)
页:
[1]