mrjagsr744 发表于 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

ASMI 发表于 2022-7-6 15:35:33

它可以在我的电脑上运行,也许是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

mrjagsr744 发表于 2022-7-6 15:36:35

谢谢,你的代码可以用。
我想我一定改变了我的系统变量,因为在我的机器上不工作的同一个LISP,它在其他X64机器上工作。
我会继续使用你的代码。
再次感谢。

ASMI 发表于 2022-7-6 15:44:24

打扰一下还有三行代码:
 
(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

Lee Mac 发表于 2022-7-6 15:50:11

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

ASMI 发表于 2022-7-6 15:54:36

 
在大多数情况下,在我看来使用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就不会给您带来很大的优势。

Lee Mac 发表于 2022-7-6 16:01:01

谢谢你的建议ASMI-非常感谢。
 
我理解你贴出的大部分例行公事,除了一件事:
 
为什么必须包括这一行:
 

(not(equal lEnt(entlast)))

Lee Mac 发表于 2022-7-6 16:06:49

另外,顺便提一下,这行得通吗?
 

; 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

ASMI 发表于 2022-7-6 16:14:43

 
因为如果(equal lEnt(entlast))爆炸后的最后一个实体与爆炸前相同,即由于某种原因爆炸不会发生。
 
 
看起来还可以。但ss1和索引变量需要局部化。

Lee Mac 发表于 2022-7-6 16:23:55

啊,是的,我忘了哦
 
 
 
 
我认为entlast是最后一个被“创建”的实体-所以最后一个被创建的实体可能不一定是要被分解的实体。。。?
页: [1] 2
查看完整版本: 层分解