乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 38|回复: 13

[编程交流] 块内擦除问题

[复制链接]

27

主题

126

帖子

99

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
135
发表于 2022-7-6 09:16:41 | 显示全部楼层 |阅读模式
我最近遇到了一个问题,当我们的模板复制到另一个图形中时,块内的擦除被带到对象的前面。擦除嵌入块内。
 
作为我们的一些代码的一部分,我写道:
  1. (if
  2.      (setq ss1 (ssget "_X" (list (cons 0 "WIPEOUT"))))
  3.      (progn
  4.        (command ".draworder" ss1 "" "back")
  5.        ))

 
这很好,除了它不适用于块内的擦除,只适用于块外的擦除。我怎样才能让它在街区内发挥作用?
 
谢谢
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 09:21:51 | 显示全部楼层
尝试一下:
 
  1. (defun c:test ( / acblk acdoc acsel name obj processed )
  2. ;; Lee Mac 17.06.11
  3. (setq acdoc (vla-get-activedocument (vlax-get-acad-object))
  4.        acblk (vla-get-blocks acdoc)
  5. )
  6. (if (ssget '((0 . "INSERT")))
  7.    (progn
  8.      (vlax-for block (setq acsel (vla-get-activeselectionset acdoc))
  9.        (if (not (member (setq name (vla-get-name block)) processed))
  10.          (
  11.            (lambda ( / lst )
  12.              (vlax-for obj (vla-item acblk name)
  13.                (if (eq "AcDbWipeout" (vla-get-objectname obj))
  14.                  (setq lst (cons obj lst))
  15.                )
  16.              )
  17.              (if lst
  18.                (vla-movetobottom (LM:SortentsTable (vla-item acblk name))
  19.                  (vlax-make-variant
  20.                    (vlax-safearray-fill
  21.                      (vlax-make-safearray vlax-vbobject (cons 0 (1- (length lst)))) lst
  22.                    )
  23.                  )
  24.                )
  25.              )
  26.              (setq processed (cons name processed))
  27.            )
  28.          )
  29.        )
  30.      )
  31.      (vla-delete acsel)
  32.      (vla-regen  acdoc acallviewports)
  33.    )
  34. )
  35. (princ)
  36. )
  37. (defun LM:SortentsTable ( space / dict result )
  38. (cond
  39.    (
  40.      (not
  41.        (vl-catch-all-error-p
  42.          (setq result
  43.            (vl-catch-all-apply 'vla-item
  44.              (list (setq dict (vla-GetExtensionDictionary space)) "ACAD_SORTENTS")
  45.            )
  46.          )
  47.        )
  48.      )
  49.      result
  50.    )
  51.    ( (vla-AddObject dict "ACAD_SORTENTS" "AcDbSortentsTable") )
  52. )
  53. )
  54. (vl-load-com) (princ)
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 09:29:35 | 显示全部楼层
我还用李的代码做了一些事情:http://forums.augi.com/showthread.php?t=130229
 
但也许李的版本(使用他自己的代码)更简洁:wink:
回复

使用道具 举报

44

主题

542

帖子

502

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
220
发表于 2022-7-6 09:30:45 | 显示全部楼层
我根本不会用抹布。如果需要的话,我更喜欢使用实心图案填充作为遮罩。
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 09:38:57 | 显示全部楼层
是的,它们的麻烦比清除更少(尤其是在打印到PDF时)。whipeout只不过是一个没有透明度的剪裁空白图像,因此你会遇到图像附带的所有问题。另一方面,图案填充也有一些与PDF有关的小问题(例如,acad图案填充实际上由许多2D实心三角形组成,在大多数情况下,这些三角形确实出现在PDF中)。为了使图案填充正确工作,您需要将其绘制为纯白色-通常这会在acad中显示wierd(如果您有黑色背景)。
 
然而,您仍然需要使用draworder使图案填充正确工作。但是,不确定在DWG之间复制块时OP是否会出现同样的问题。我见过这种确切的问题发生在抹杀,但只有在一些街区。。。在有人重新编辑它们之后。虽然我从未见过有舱口的。
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 09:42:14 | 显示全部楼层
 
1+
 
我使用实心图案填充,颜色为255255。
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 09:46:55 | 显示全部楼层
 
我使用的是32位的WinXP,现在使用的是64位的Win7,我从来没有遇到过这个问题。
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 09:52:11 | 显示全部楼层
我的意思是它显示为白色-好像它是一个填充区域(嗯,就是这样!)使用抹布时,它的颜色始终与背景相同,因此它“看起来”就像一块空白,正如您实际想要的那样。如果你不介意的话,那么你在使用图案填充时没有问题-不幸的是,对我来说,我们的许多绘图还包括灰色实心图案填充:它开始与这些白色图案填充看起来很像,因此在屏幕上会造成混乱。所以我想说这取决于你的情况。
 
如果您将背景更改为白色,那么白色图案填充在屏幕上看起来当然也会正确。但是,你必须习惯白色背景,不要使用像黄色这样的颜色(这很难看到)。
 
对我来说,只要你留意威普的问题——它们并不是不可逾越的。对于像这样的lisp代码,它们是“自动”修复的。图案填充的想法会导致屏幕上出现人为错误,因为很容易将白色图案填充与254色图案填充混淆,然后只有在绘制后才会选择。然而,这种类型的“错误”并不能自动修复,因为程序无法“理解”这部分需要灰色阴影,但实际上应该看起来是空白的。如果你不使用容易与这些白色“空白”混淆的图案填充,那么显然你没有这个问题。
回复

使用道具 举报

27

主题

126

帖子

99

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
135
发表于 2022-7-6 09:55:40 | 显示全部楼层
回复所有回复。。。我要说的是,我从未想过使用阴影背景。几年来,我们在所有的块中都使用了擦除,但最近,在过去两周内,擦除开始移动到块中对象的前面。到目前为止,我们还没有遇到任何问题,在我们的模板中,一切看起来都是正确的。
 
 
@李,
 
谢谢,效果很好。我唯一的要求是,我希望它自动选择所有的区块。我用我知道的“_X”对ssget进行了各种修改,但都给了我一个错误。
 
编辑:当选择一个没有擦除的块时,我也会遇到这个错误。为了解决这个问题,我添加了一个块列表,其中确实有一个覆盖,并使用以下代码引用它们。
 
  1. (ssget
  2.          (list '(0 . "INSERT") (66 . 1)
  3.            (cons 2
  4.              (apply 'strcat (cons "`*U*" (mapcar '(lambda ( s ) (strcat "," s)) wipeblocks)))
  5.            )
  6.          )

 
它仍然可以将擦除发送到后面,但仍然可以对所有块执行此操作,而不仅仅是列表上的块。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:02:24 | 显示全部楼层
 
太好了,很高兴它起作用了。请注意,由于代码修改块定义(而不是块引用),因此只需要使用ssget进行选择,以便用户可以确定要处理的块定义。
 
对于选定的每个不同块参照,程序仅处理一次块定义,并且此更改将反映在所有参照中。因此,如果选择了同一定义的多个引用,则只有第一个引用将用于确定要处理的定义,其余的将被忽略。
 
这样,如果您希望处理所有块,则可以完全删除ssget选择,代码只需在块集合中迭代即可:
 
  1. ([color=BLUE]defun[/color] c:test ( [color=BLUE]/[/color] acdoc )
  2. [color=GREEN];; Lee Mac 20.06.11[/color]
  3. ([color=BLUE]setq[/color] acdoc ([color=BLUE]vla-get-activedocument[/color] ([color=BLUE]vlax-get-acad-object[/color])))
  4. ([color=BLUE]vlax-for[/color] block ([color=BLUE]vla-get-blocks[/color] acdoc)
  5.    ([color=BLUE]if[/color]
  6.      ([color=BLUE]and[/color]
  7.        ([color=BLUE]eq[/color] [color=BLUE]:vlax-false[/color] ([color=BLUE]vla-get-islayout[/color] block))
  8.        ([color=BLUE]eq[/color] [color=BLUE]:vlax-false[/color] ([color=BLUE]vla-get-isxref[/color]   block))
  9.      )
  10.      (
  11.        ([color=BLUE]lambda[/color] ( [color=BLUE]/[/color] lst )
  12.          ([color=BLUE]vlax-for[/color] obj block
  13.            ([color=BLUE]if[/color] ([color=BLUE]eq[/color] [color=MAROON]"AcDbWipeout"[/color] ([color=BLUE]vla-get-objectname[/color] obj))
  14.              ([color=BLUE]setq[/color] lst ([color=BLUE]cons[/color] obj lst))
  15.            )
  16.          )
  17.          ([color=BLUE]if[/color] lst
  18.            ([color=BLUE]vla-movetobottom[/color] (LM:SortentsTable block)
  19.              ([color=BLUE]vlax-make-variant[/color]
  20.                ([color=BLUE]vlax-safearray-fill[/color]
  21.                  ([color=BLUE]vlax-make-safearray[/color] [color=BLUE]vlax-vbobject[/color] ([color=BLUE]cons[/color] 0 ([color=BLUE]1-[/color] ([color=BLUE]length[/color] lst)))) lst
  22.                )
  23.              )
  24.            )
  25.          )
  26.        )
  27.      )
  28.    )
  29. )
  30. ([color=BLUE]vla-regen[/color] acdoc [color=BLUE]acallviewports[/color])
  31. ([color=BLUE]princ[/color])
  32. )
  33. ([color=BLUE]defun[/color] LM:SortentsTable ( space [color=BLUE]/[/color] dict result )
  34. ([color=BLUE]cond[/color]
  35.    (
  36.      ([color=BLUE]not[/color]
  37.        ([color=BLUE]vl-catch-all-error-p[/color]
  38.          ([color=BLUE]setq[/color] result
  39.            ([color=BLUE]vl-catch-all-apply[/color] '[color=BLUE]vla-item[/color]
  40.              ([color=BLUE]list[/color] ([color=BLUE]setq[/color] dict ([color=BLUE]vla-GetExtensionDictionary[/color] space)) [color=MAROON]"ACAD_SORTENTS"[/color])
  41.            )
  42.          )
  43.        )
  44.      )
  45.      result
  46.    )
  47.    ( ([color=BLUE]vla-AddObject[/color] dict [color=MAROON]"ACAD_SORTENTS"[/color] [color=MAROON]"AcDbSortentsTable"[/color]) )
  48. )
  49. )
  50. ([color=BLUE]vl-load-com[/color]) ([color=BLUE]princ[/color])
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-7 02:59 , Processed in 1.593209 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表