块内擦除问题
我最近遇到了一个问题,当我们的模板复制到另一个图形中时,块内的擦除被带到对象的前面。擦除嵌入块内。作为我们的一些代码的一部分,我写道:
(if
(setq ss1 (ssget "_X" (list (cons 0 "WIPEOUT"))))
(progn
(command ".draworder" ss1 "" "back")
))
这很好,除了它不适用于块内的擦除,只适用于块外的擦除。我怎样才能让它在街区内发挥作用?
谢谢 尝试一下:
(defun c:test ( / acblk acdoc acsel name obj processed )
;; Lee Mac 17.06.11
(setq acdoc (vla-get-activedocument (vlax-get-acad-object))
acblk (vla-get-blocks acdoc)
)
(if (ssget '((0 . "INSERT")))
(progn
(vlax-for block (setq acsel (vla-get-activeselectionset acdoc))
(if (not (member (setq name (vla-get-name block)) processed))
(
(lambda ( / lst )
(vlax-for obj (vla-item acblk name)
(if (eq "AcDbWipeout" (vla-get-objectname obj))
(setq lst (cons obj lst))
)
)
(if lst
(vla-movetobottom (LM:SortentsTable (vla-item acblk name))
(vlax-make-variant
(vlax-safearray-fill
(vlax-make-safearray vlax-vbobject (cons 0 (1- (length lst)))) lst
)
)
)
)
(setq processed (cons name processed))
)
)
)
)
(vla-delete acsel)
(vla-regenacdoc acallviewports)
)
)
(princ)
)
(defun LM:SortentsTable ( space / dict result )
(cond
(
(not
(vl-catch-all-error-p
(setq result
(vl-catch-all-apply 'vla-item
(list (setq dict (vla-GetExtensionDictionary space)) "ACAD_SORTENTS")
)
)
)
)
result
)
( (vla-AddObject dict "ACAD_SORTENTS" "AcDbSortentsTable") )
)
)
(vl-load-com) (princ) 我还用李的代码做了一些事情:http://forums.augi.com/showthread.php?t=130229
但也许李的版本(使用他自己的代码)更简洁:wink: 我根本不会用抹布。如果需要的话,我更喜欢使用实心图案填充作为遮罩。 是的,它们的麻烦比清除更少(尤其是在打印到PDF时)。whipeout只不过是一个没有透明度的剪裁空白图像,因此你会遇到图像附带的所有问题。另一方面,图案填充也有一些与PDF有关的小问题(例如,acad图案填充实际上由许多2D实心三角形组成,在大多数情况下,这些三角形确实出现在PDF中)。为了使图案填充正确工作,您需要将其绘制为纯白色-通常这会在acad中显示wierd(如果您有黑色背景)。
然而,您仍然需要使用draworder使图案填充正确工作。但是,不确定在DWG之间复制块时OP是否会出现同样的问题。我见过这种确切的问题发生在抹杀,但只有在一些街区。。。在有人重新编辑它们之后。虽然我从未见过有舱口的。
1+
我使用实心图案填充,颜色为255255。
我使用的是32位的WinXP,现在使用的是64位的Win7,我从来没有遇到过这个问题。 我的意思是它显示为白色-好像它是一个填充区域(嗯,就是这样!)使用抹布时,它的颜色始终与背景相同,因此它“看起来”就像一块空白,正如您实际想要的那样。如果你不介意的话,那么你在使用图案填充时没有问题-不幸的是,对我来说,我们的许多绘图还包括灰色实心图案填充:它开始与这些白色图案填充看起来很像,因此在屏幕上会造成混乱。所以我想说这取决于你的情况。
如果您将背景更改为白色,那么白色图案填充在屏幕上看起来当然也会正确。但是,你必须习惯白色背景,不要使用像黄色这样的颜色(这很难看到)。
对我来说,只要你留意威普的问题——它们并不是不可逾越的。对于像这样的lisp代码,它们是“自动”修复的。图案填充的想法会导致屏幕上出现人为错误,因为很容易将白色图案填充与254色图案填充混淆,然后只有在绘制后才会选择。然而,这种类型的“错误”并不能自动修复,因为程序无法“理解”这部分需要灰色阴影,但实际上应该看起来是空白的。如果你不使用容易与这些白色“空白”混淆的图案填充,那么显然你没有这个问题。 回复所有回复。。。我要说的是,我从未想过使用阴影背景。几年来,我们在所有的块中都使用了擦除,但最近,在过去两周内,擦除开始移动到块中对象的前面。到目前为止,我们还没有遇到任何问题,在我们的模板中,一切看起来都是正确的。
@李,
谢谢,效果很好。我唯一的要求是,我希望它自动选择所有的区块。我用我知道的“_X”对ssget进行了各种修改,但都给了我一个错误。
编辑:当选择一个没有擦除的块时,我也会遇到这个错误。为了解决这个问题,我添加了一个块列表,其中确实有一个覆盖,并使用以下代码引用它们。
(ssget
(list '(0 . "INSERT") (66 . 1)
(cons 2
(apply 'strcat (cons "`*U*" (mapcar '(lambda ( s ) (strcat "," s)) wipeblocks)))
)
)
它仍然可以将擦除发送到后面,但仍然可以对所有块执行此操作,而不仅仅是列表上的块。
太好了,很高兴它起作用了。请注意,由于代码修改块定义(而不是块引用),因此只需要使用ssget进行选择,以便用户可以确定要处理的块定义。
对于选定的每个不同块参照,程序仅处理一次块定义,并且此更改将反映在所有参照中。因此,如果选择了同一定义的多个引用,则只有第一个引用将用于确定要处理的定义,其余的将被忽略。
这样,如果您希望处理所有块,则可以完全删除ssget选择,代码只需在块集合中迭代即可:
(defun c:test ( / acdoc )
;; Lee Mac 20.06.11
(setq acdoc (vla-get-activedocument (vlax-get-acad-object)))
(vlax-for block (vla-get-blocks acdoc)
(if
(and
(eq :vlax-false (vla-get-islayout block))
(eq :vlax-false (vla-get-isxref block))
)
(
(lambda ( / lst )
(vlax-for obj block
(if (eq "AcDbWipeout" (vla-get-objectname obj))
(setq lst (cons obj lst))
)
)
(if lst
(vla-movetobottom (LM:SortentsTable block)
(vlax-make-variant
(vlax-safearray-fill
(vlax-make-safearray vlax-vbobject (cons 0 (1- (length lst)))) lst
)
)
)
)
)
)
)
)
(vla-regen acdoc acallviewports)
(princ)
)
(defun LM:SortentsTable ( space / dict result )
(cond
(
(not
(vl-catch-all-error-p
(setq result
(vl-catch-all-apply 'vla-item
(list (setq dict (vla-GetExtensionDictionary space)) "ACAD_SORTENTS")
)
)
)
)
result
)
( (vla-AddObject dict "ACAD_SORTENTS" "AcDbSortentsTable") )
)
)
(vl-load-com) (princ)
页:
[1]
2