层分解
多年来,我一直在使用以下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 它可以在我的电脑上运行,也许是x64的AutoCAD错误?试试我刚写的代码,它也应该和你的一样。
(defun c:lxplode(/ cSel cEnt oArr cLay)
(vl-load-com)
(if(setq cSel(entsel "\nSelect entity to explode: "))
(progn
(setq cEnt(vlax-ename->vla-object(car cSel)))
(if(vl-catch-all-error-p
(setq oArr(vl-catch-all-apply 'vla-Explode(list cEnt))))
(princ "\n<!> Can't explode this entity <!> ")
(progn
(setq cLay(vla-get-Layer cEnt))
(foreach e(vlax-safearray->list(vlax-variant-value oArr))
(vla-put-Layer e cLay)
); end foreach
(princ (strcat "\nEntities exploded onto layer " cLay "."))
); end progn
); end if
); end progn
); end if
(princ)
); end of c:lxplode 谢谢,你的代码可以用。
我想我一定改变了我的系统变量,因为在我的机器上不工作的同一个LISP,它在其他X64机器上工作。
我会继续使用你的代码。
再次感谢。 打扰一下还有三行代码:
(defun c:lxplode(/ cSel cEnt oArr cLay)
(vl-load-com)
(if(setq cSel(entsel "\nSelect entity to explode: "))
(progn
(setq cEnt(vlax-ename->vla-object(car cSel)))
(if(vl-catch-all-error-p
(setq oArr(vl-catch-all-apply 'vla-Explode
(list cEnt))))
(princ "\n<!> Can't explode this entity <!> ")
(progn
(setq cLay(vla-get-Layer cEnt))
(foreach e(vlax-safearray->list(vlax-variant-value oArr))
(vla-put-Layer e cLay)
(vla-put-Linetype e "ByLayer")
(vla-put-Lineweight e acLnWtByLayer)
); end foreach
(vla-Delete cEnt)
(princ (strcat "\nEntities exploded onto layer " cLay "."))
); end progn
); end if
); end progn
); end if
(princ)
); end of c:lxplode ASMI,在看过你的很多例程之后,你似乎只使用Visual LISP,而不是使用DXF表格之类的旧样式当我试图解决这个问题时,我考虑使用一个选择集,然后逐个遍历每个元素,就好像它是使用entsel选择的一样。
如果不使用Visual LISP,是否可以完成相同的例程?
我必须承认,我试图不惜一切代价避免Visual LISP-我知道它可以更轻松地完成任务-但我发现这些函数太复杂了,难以理解-我想这正是你所习惯的。
在大多数情况下,在我看来使用Visual LISP更方便,但我可以使用和DXF代码。下面是一个没有Visual LISP的程序示例:
(defun c:lxplode2(/ cSel eEnt cLay lEnt cDxf nDxf)
(if(setq cSel(entsel "\nSelect entity to explode: "))
(progn
(setq eEnt(car cSel)
cLay(cdr(assoc 8(entget eEnt)))
lEnt(entlast)); end setq
(if(and
(vl-cmdf "_.explode" eEnt)
(not(equal lEnt(entlast)))
); end and
(progn
(while(setq lEnt(entnext lEnt))
(setq cDxf(entget lEnt)
nDxf(subst(cons 8 cLay)(assoc 8 cDxf)cDxf))
(entmod nDxf)
); end while
(princ (strcat "\nEntities exploded onto layer " cLay "."))
); end progn
(princ "\n<!> Can't explode this entity <!> ")
); end if
); end progn
); end if
(princ)
); end of c:lxplode2
我认为学习Visual LISP对你来说只是时间问题。说实话,您首先学习常用的AutoLISP是非常好的,因为它是知识的基础,没有它,Visual LISP就不会给您带来很大的优势。 谢谢你的建议ASMI-非常感谢。
我理解你贴出的大部分例行公事,除了一件事:
为什么必须包括这一行:
(not(equal lEnt(entlast)))
另外,顺便提一下,这行得通吗?
; Lxplode by ASMI - modified slightly (and hopefully correctly) by Lee McDonnell
(defun c:lxplode2 (/ cSel eEnt cLay lEnt cDxf nDxf)
(setq ss (ssget))
(if (/= (setq ssl (sslength ss)) nil)
(progn
(setq index 0)
(repeat ssl
(setq eEnt (ssname ss index)
cLay (cdr (assoc 8 (entget eEnt)))
lEnt (entlast)
) ; end setq
(if (and
(vl-cmdf "_.explode" eEnt)
(not (equal lEnt (entlast)))
) ; end and
(progn
(while (setq lEnt (entnext lEnt))
(setq cDxf (entget lEnt)
nDxf (subst (cons 8 cLay) (assoc 8 cDxf) cDxf)
) ;_end setq
(entmod nDxf)
) ; end while
(princ (strcat "\nEntities exploded onto layer " cLay "."))
) ; end progn
(princ "\n<!> Can't explode this entity <!> ")
) ; end if
(setq index (1+ index))
) ;_end repeat
) ;_end progn
(princ "\nNo Entities Selected!")
) ;_end if
(princ)
) ; end of c:lxplode2
因为如果(equal lEnt(entlast))爆炸后的最后一个实体与爆炸前相同,即由于某种原因爆炸不会发生。
看起来还可以。但ss1和索引变量需要局部化。 啊,是的,我忘了哦
我认为entlast是最后一个被“创建”的实体-所以最后一个被创建的实体可能不一定是要被分解的实体。。。?
页:
[1]
2