乐筑天下

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

[编程交流] 层分解

[复制链接]

4

主题

12

帖子

8

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 15:24:19 | 显示全部楼层 |阅读模式
多年来,我一直在使用以下LISP文件将块分解到插入的图层中,但现在我使用的是AutoCAD 2008,我收到了以下消息“nil”
雷克斯普洛德
 
选择块参照、多段线、标注或网格:
 
*无效的选择*
需要一个点或
Window/Last/Crossing/BOX/ALL/Fence/WPolygon/CPolygon/Group/Add/Remove/Multiple/P
上一个/撤消/自动/单个“
 
如果我再次选择同一个项目,它会分解到创建它的层中。
我正在附加LISP文件。
有什么想法吗?
顺便说一句,我正在用windows XP X64运行AutoCAD 2008。
LEXPLODE。LSP
回复

使用道具 举报

2

主题

439

帖子

536

银币

限制会员

铜币
-14
发表于 2022-7-6 15:35:33 | 显示全部楼层
它可以在我的电脑上运行,也许是x64的AutoCAD错误?试试我刚写的代码,它也应该和你的一样。
 
  1. (defun c:lxplode(/ cSel cEnt oArr cLay)
  2. (vl-load-com)
  3. (if(setq cSel(entsel "\nSelect entity to explode: "))
  4.    (progn
  5.      (setq cEnt(vlax-ename->vla-object(car cSel)))
  6.      (if(vl-catch-all-error-p
  7.    (setq oArr(vl-catch-all-apply 'vla-Explode(list cEnt))))
  8. (princ "\n<!> Can't explode this entity <!> ")
  9. (progn
  10.   (setq cLay(vla-get-Layer cEnt))
  11.   (foreach e(vlax-safearray->list(vlax-variant-value oArr))
  12.     (vla-put-Layer e cLay)
  13.     ); end foreach
  14.   (princ (strcat "\nEntities exploded onto layer " cLay "."))
  15.   ); end progn
  16. ); end if
  17.      ); end progn
  18.    ); end if
  19. (princ)
  20. ); end of c:lxplode
回复

使用道具 举报

4

主题

12

帖子

8

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 15:36:35 | 显示全部楼层
谢谢,你的代码可以用。
我想我一定改变了我的系统变量,因为在我的机器上不工作的同一个LISP,它在其他X64机器上工作。
我会继续使用你的代码。
再次感谢。
回复

使用道具 举报

2

主题

439

帖子

536

银币

限制会员

铜币
-14
发表于 2022-7-6 15:44:24 | 显示全部楼层
打扰一下还有三行代码:
 
  1. (defun c:lxplode(/ cSel cEnt oArr cLay)
  2. (vl-load-com)
  3. (if(setq cSel(entsel "\nSelect entity to explode: "))
  4.    (progn
  5.      (setq cEnt(vlax-ename->vla-object(car cSel)))
  6.      (if(vl-catch-all-error-p
  7.    (setq oArr(vl-catch-all-apply 'vla-Explode
  8.                (list cEnt))))
  9. (princ "\n<!> Can't explode this entity <!> ")
  10. (progn
  11.   (setq cLay(vla-get-Layer cEnt))
  12.   (foreach e(vlax-safearray->list(vlax-variant-value oArr))
  13.     (vla-put-Layer e cLay)
  14.     [color="SeaGreen"](vla-put-Linetype e "ByLayer")[/color]
  15.     [color="#2e8b57"](vla-put-Lineweight e acLnWtByLayer)[/color]
  16.     ); end foreach
  17.   [color="#2e8b57"](vla-Delete cEnt)[/color]
  18.   (princ (strcat "\nEntities exploded onto layer " cLay "."))
  19.   ); end progn
  20. ); end if
  21.      ); end progn
  22.    ); end if
  23. (princ)
  24. ); end of c:lxplode
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:50:11 | 显示全部楼层
ASMI,在看过你的很多例程之后,你似乎只使用Visual LISP,而不是使用DXF表格之类的旧样式当我试图解决这个问题时,我考虑使用一个选择集,然后逐个遍历每个元素,就好像它是使用entsel选择的一样。
 
如果不使用Visual LISP,是否可以完成相同的例程?
 
我必须承认,我试图不惜一切代价避免Visual LISP-我知道它可以更轻松地完成任务-但我发现这些函数太复杂了,难以理解-我想这正是你所习惯的。
回复

使用道具 举报

2

主题

439

帖子

536

银币

限制会员

铜币
-14
发表于 2022-7-6 15:54:36 | 显示全部楼层
 
在大多数情况下,在我看来使用Visual LISP更方便,但我可以使用和DXF代码。下面是一个没有Visual LISP的程序示例:
 
  1. (defun c:lxplode2(/ cSel eEnt cLay lEnt cDxf nDxf)
  2. (if(setq cSel(entsel "\nSelect entity to explode: "))
  3.    (progn
  4.      (setq eEnt(car cSel)
  5.     cLay(cdr(assoc 8(entget eEnt)))
  6.     lEnt(entlast)); end setq
  7.      (if(and
  8.    (vl-cmdf "_.explode" eEnt)
  9.    (not(equal lEnt(entlast)))
  10.    ); end and
  11. (progn
  12.          (while(setq lEnt(entnext lEnt))
  13.   (setq cDxf(entget lEnt)
  14.         nDxf(subst(cons 8 cLay)(assoc 8 cDxf)cDxf))
  15.     (entmod nDxf)
  16.    ); end while
  17.   (princ (strcat "\nEntities exploded onto layer " cLay "."))
  18.   ); end progn
  19. (princ "\n<!> Can't explode this entity <!> ")
  20. ); end if
  21.      ); end progn
  22.    ); end if
  23. (princ)
  24. ); end of c:lxplode2

 
 
我认为学习Visual LISP对你来说只是时间问题。说实话,您首先学习常用的AutoLISP是非常好的,因为它是知识的基础,没有它,Visual LISP就不会给您带来很大的优势。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 16:01:01 | 显示全部楼层
谢谢你的建议ASMI-非常感谢。
 
我理解你贴出的大部分例行公事,除了一件事:
 
为什么必须包括这一行:
 
  1. (not(equal lEnt(entlast)))
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 16:06:49 | 显示全部楼层
另外,顺便提一下,这行得通吗?
 
  1. ; Lxplode by ASMI - modified slightly (and hopefully correctly) by Lee McDonnell
  2. (defun c:lxplode2 (/ cSel eEnt cLay lEnt cDxf nDxf)
  3.    (setq ss (ssget))
  4.    (if    (/= (setq ssl (sslength ss)) nil)
  5.    (progn
  6.        (setq index 0)
  7.        (repeat ssl
  8.        (setq eEnt (ssname ss index)
  9.              cLay (cdr (assoc 8 (entget eEnt)))
  10.              lEnt (entlast)
  11.        ) ; end setq
  12.        (if (and
  13.            (vl-cmdf "_.explode" eEnt)
  14.            (not (equal lEnt (entlast)))
  15.            ) ; end and
  16.            (progn
  17.            (while (setq lEnt (entnext lEnt))
  18.                (setq cDxf (entget lEnt)
  19.                  nDxf (subst (cons 8 cLay) (assoc 8 cDxf) cDxf)
  20.                ) ;_  end setq
  21.                (entmod nDxf)
  22.            ) ; end while
  23.            (princ (strcat "\nEntities exploded onto layer " cLay "."))
  24.            ) ; end progn
  25.            (princ "\n<!> Can't explode this entity <!> ")
  26.        ) ; end if
  27.        (setq index (1+ index))
  28.        ) ;_  end repeat
  29.    ) ;_  end progn
  30.    (princ "\nNo Entities Selected!")
  31.    ) ;_  end if
  32.    (princ)
  33. ) ; end of c:lxplode2
回复

使用道具 举报

2

主题

439

帖子

536

银币

限制会员

铜币
-14
发表于 2022-7-6 16:14:43 | 显示全部楼层
 
因为如果(equal lEnt(entlast))爆炸后的最后一个实体与爆炸前相同,即由于某种原因爆炸不会发生。
 
 
看起来还可以。但ss1和索引变量需要局部化。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 16:23:55 | 显示全部楼层
啊,是的,我忘了哦
 
 
 
 
我认为entlast是最后一个被“创建”的实体-所以最后一个被创建的实体可能不一定是要被分解的实体。。。?
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-4 19:14 , Processed in 0.332948 second(s), 72 queries .

© 2020-2025 乐筑天下

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