乐筑天下

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

[编程交流] 背景准备LISP-许多co

[复制链接]

3

主题

7

帖子

4

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-6 09:20:53 | 显示全部楼层 |阅读模式
因此,我从建筑师那里得到了很多图纸,这些图纸需要以一种特定的方式进行准备,这可能相当繁琐,有时甚至是一个耗时的过程。我一直试图通过编写一些简单的Lisp(我是autoLISP新手)并将它们与其他命令合并到宏中来加快速度。这种方法是可行的,但在切换计算机时,我必须加载每个lisp和宏。它还需要相当长的时间,某些命令必须选择stuff或点击enter等。有时我可以在工作过程中更新整个图形集,有时我需要用20多个大型图形来完成这一过程。
 
我对LISP不太熟悉,无法将所有这些轻松地写进一个例程中。我一直在努力,但有无数的问题。以下是我努力实现的目标:
 
-绑定所有x参考
-突发绑定x参考
-解锁所有层
-删除冻结层
-删除不可见层
-删除所有尺寸
-将所有层设置为单一颜色
-将所有对象的颜色设置为“ByLayer”
 
以下是绑定所有外部参照的方式:
  1. (defun c:xrb ()
  2. (command "xref" "b" "*")
  3. (princ)
  4. )

 
为了分解所有外部参照,我选择它们并从宏中分解它们。。。我想不出如何打破常规。我也从命令宏解锁所有层。
 
删除冻结/不可见层上的所有对象是通过以下方式完成的:
  1. (defun c:deleteFROZENOFF (/ blocks doc ent idx layers lays2delete ss)
  2. (vl-load-com)
  3. (setq doc (vla-get-activedocument (vlax-get-acad-object))
  4. layers (vla-get-layers doc)
  5. blocks (vla-get-blocks doc)
  6. idx -1
  7. )
  8. (vlax-for lay layers
  9.    (if (or (eq (vla-get-layeron lay) :vlax-false)
  10.     (eq (vla-get-freeze lay) :vlax-true)
  11.     )
  12.      (progn
  13. (vla-put-lock lay :vlax-false)
  14. (if lays2delete
  15.   (setq lays2delete (strcat lays2delete "," (vla-get-name lay)))
  16.   (setq lays2delete (vla-get-name lay))
  17.   )
  18. )
  19.      )
  20.    )
  21. (if (and lays2delete
  22.    (setq ss (ssget "x" (list (cons 8 lays2delete))))
  23.    )
  24.    (progn
  25.      (while (setq ent (ssname ss (setq idx (1+ idx))))
  26. (vla-delete (vlax-ename->vla-object ent))
  27. )
  28.      )
  29.    )
  30. (princ (strcat "\nDone....deleted " (itoa (1+ idx)) " entities from the drawing."))
  31. (princ)
  32. )

^有人帮了点忙
 
使用以下方法将所有层设置为单一颜色:
  1. (defun c:layers55 ()
  2. (command "_.layer" "_co" "55" "*" "")
  3. (princ)
  4. )

 
SetByLayer命令的工作原理类似于将所有对象的颜色设置为ByLayer,但当在宏中调用它时,我需要将设置仅配置为颜色。我想取消这一步。
 
这就是我现在的处境。任何帮助、提示或想法都将不胜感激。理想情况下,我只想键入一个命令,让例程一次为我完成所有任务,而不必理会它。
 
谢谢
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 09:48:14 | 显示全部楼层
也许是这样?
 
  1. (defun c:test ( / *error* a b c d e f )
  2. ;; © Lee Mac 2011
  3. (defun *error* ( msg )
  4.    (if c (setvar 'CMDECHO c))
  5.    (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
  6.        (princ (strcat "\n** Error: " msg " **")))
  7.    (princ)
  8. )
  9. (setq c (getvar 'CMDECHO))
  10. (setvar 'CMDECHO 0)
  11. (while (setq b (tblnext "BLOCK" (null b)))
  12.    (if
  13.      (= 4 (logand 4 (cdr (assoc 70 b))))
  14.      (setq a (cons "," (cons (cdr (assoc 2 b)) a)))
  15.    )
  16. )  
  17. (command "_.undo" "_BE" "_.-xref" "_B" "*" "_.-layer" "_U" "*" "")
  18. (sssetfirst nil (ssget "_X" (list '(0 . "INSERT") (cons 2 (apply 'strcat (cdr a))))))
  19. (c:burst)
  20. (while (setq d (tblnext "LAYER" (null d)))
  21.    (if
  22.      (or
  23.        (minusp (cdr (assoc 62 d)))
  24.        (= 1 (logand 1 (cdr (assoc 70 d))))
  25.      )
  26.      (setq e (cons (cdr (assoc 2 d)) e))
  27.    )
  28. )
  29. (command "_.-laydel")
  30. (foreach x e (command "_N" x))
  31. (command "" "_Y" "_.-layer" "_C" "55" "*" "")
  32. (if (setq f (ssget "_X" '((0 . "*DIMENSION"))))
  33.    (command "_.erase" f "")
  34. )
  35. (if (setq f (ssget "_X"))
  36.    (command "_.chprop" f "" "_C" "ByLayer" "")
  37. )
  38. (command "_.undo" "_E")
  39. (setvar 'CMDECHO c)
  40. (princ)
  41. )

 
但是要小心,上面的代码很危险,因为它使用LayDel命令,该命令将在删除某个层之前删除该层上的所有实体。
回复

使用道具 举报

3

主题

7

帖子

4

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-6 09:57:43 | 显示全部楼层
谢谢李!我已经试过了那个剧本,它符合我想要的。不过我有个问题。。为什么你要调用Undo并加入这一行?
 
  1.   (command "_.undo" "_BE" "_.-xref" "_B" "*" "_.-layer" "_U" "*" "")

 
此外,不确定您是否知道这一点,但当我在一台计算机上运行此例程时,它自己完成了所有操作,而不提示我回答是/否问题或选择。在另一台计算机上,它要求我选择一些东西,这些问题出现在命令行中,我必须手动回答。我假设这是一个设置,但有没有办法覆盖它?
 
另一个问题:我将在哪里调用删除特定填充图案的命令。我想删除所有实心图案填充,但保留其余部分。我通常可以用QSelect来实现这一点,但由于该命令会弹出一个对话框,我将在其中选择特定的图案填充属性,因此我不确定如何实现这一点。有什么想法吗?
 
谢谢你的帮助,非常感谢!
回复

使用道具 举报

VVA

1

主题

308

帖子

308

银币

初来乍到

Rank: 1

铜币
8
发表于 2022-7-6 10:09:25 | 显示全部楼层
这里有一些命令(谷歌翻译)
突发绑定x参考-BGBLEXP
删除冻结层-BGLAYDEL
删除不可见层-BGLAYDEL
将所有对象的颜色设置为ByLayer-BGCOLOR
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:25:33 | 显示全部楼层
 
我错过要点了吗?
 
 
启动一个Undo组,以便该语句和Undo End调用之间的所有操作都可以通过单次使用Undo命令来撤消。
 
 
这就是程序应该如何运行(以及它如何与我的初始测试配合)。
 
 
提示您做什么?您可以复制命令行历史记录吗?两台计算机是否运行相同版本的AutoCAD?
 
 
您可能需要使用带有过滤器列表的选择集来过滤实体图案填充:
 
  1. (if (setq ss (ssget "_X" '((0 . "HATCH") (2 . "SOLID"))))
  2. (command "_.erase" ss "")
  3. )
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-7 03:26 , Processed in 0.989798 second(s), 62 queries .

© 2020-2025 乐筑天下

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