autolisp删除重复块
2023-01-10阅读(629)
问:CAD 的autolisp编程问题:我用下面这个程序还去掉重合的点,但这个程序不能够循环。
- 答:(defun c:ere ( )
(setq ss (ssget (list (cons 0 "POINT"))) li '() si 0 ei 0)
(repeat (sslength ss)
(setq cs (ssname ss si) si (1+ si) ce (entget cs))
(if (member (vl-princ-to-string (cdr (assoc 10 ce))) li)
(progn
(command "_.Erase" cs "")
(setq ei (1+ ei))
)
(setq li (cons (vl-princ-to-string (cdr (assoc 10 ce))) li))
)
)
(princ (strcat "\n在选择的" (itoa (sslength ss)) "个点中,删除了" (itoa ei) "个重复的点!"))
(princ)
)
上面的程序,我用的是REPEAT,用WHILE也是一样的效果。另外,循环里面套循环个人觉得不太可取,若对象过多会运算很大。 - 答:不妨试试下面的代码:
(defun c:ere()
(setq a (ssget (list(cons 0 "point"))))
(setq i (sslength a))
(setq j (1- i))
(while (> j -1)
(setq b (ssname a j))
(setq c (entget b))
(if (/= c nil)
(progn
(setq zb(cdr (assoc 10 c)))
(setq cfdj(ssget "x" (list (cons 10 Zb)(cons 0 "point"))))
(if (/= cfdj nil)(progn(setq cfdj(ssdel b cfdj))(command "erase" cfdj "")))
)
)
(setq j(1- j))
)
) - 答:可以用(repeat (sslength i)
.................)试试,用while循环i值没有在循环体中修正啊,这样不成死循环了。。 - 答:fgrdtgrrfg
- 答:请问朋友是否有删除重复线的LISP命令
问:autocad中块文件如何分解,删除一部分图形
- 答:选中你要分解的块,然后单击右键,在下拉菜单中选中块编辑器,在块编辑器中删除你不要的部分,在关闭块编辑器,提示保存,点击是。就OK了~!~!
- 答:选中,分解,再删除你要删的部分,就OK了
- 答:双击块会弹出块编辑对话框选择块点确定就可以开始编辑块了,编辑完了右击鼠标选关闭块编辑器弹出是否保存修改选是就好了。
- 答:utoCAD如何消除dwg文件中多余的图层和图块
对于绘制CAD图纸后残留的一些多余的图层、文字样式、线型和图块等,可以通过以下方法将它们清除:
(1)利用CAD文件菜单下的“输出”命令,填写输出图形文件名称,选择形式为block(*.dwg),图块名称不填,选择基本点为(0,0),然后选择要输出的图形内容,图形经过如此处理后不会再有多余的信息。
(2)利用CAD文件菜单下的“清理”命令,当命令行提示“Verify each name to be purged? <Y>(验证每个要清理的名称)”时:,键入“n”不用验证是否清理,可加快清理速度。多重复几次PURGE命令后也不会再有多余的图形信息了。
(3)编制一个小巧的AutoLISP程序,可以减少手工操作。
(defun C:QHTX ()
(ar "cmdecho" 0);关闭命令回显
(repeat 10
(command "purge" "a" "" "n")
);重复执行purge命令10次
(princ)
);end defun C:QHTX ()
将以上代码复制在新文本文件中,另存为QHTX.lsp,然后在“工具”菜单下加载运行,便能清除图形中的残余信息。 - 答:选定要分解的“块”,然后在默认工具栏里,找到“块菜单”,左键单击“块编辑器”。
- 答:输入X 选择要分解的块 就可以了
- 答:选中你要编辑的块,再按“X”分解 就可以了
- 答:输入X再回车就可以了编辑图形,也可以双击块进入编辑块修改图形,关闭时记得保存
- 答:选中你要编辑的块,单击分解命令,你的块就分解成单个对象,然后选择你要删除的图形,右击,选择删除即可。
- 答:为什么标注分解后变成?号呢
问:求一autolisp程序,要求是选择一个文字,那么能够把这个相同的文字全部选择出来
- 答:;先框选范围,再选择一个想筛选的文字,w为快捷键,可以自己更改
(defun c:w()
(ar "cmdecho" 0)
(setq ss (ssget '((0 . "TEXT,MTEXT"))))
(setq en (entsel "请选择一个文字:"))
(setq en_data (entget (car en)))
(setq text1 (cdr (assoc 1 en_data)))
(setq n 0)
(setq SX (ssadd))
(setq SX (ssadd (car en) SX))
(repeat (sslength ss)
(setq ssn (ssname ss n))
(setq ssn_data (entget ssn))
(setq text2 (cdr (assoc 1 ssn_data)))
(if (= text1 text2) (setq SX (ssadd ssn SX)))
(setq n (1+ n))
)
(sssetfirst ss sx)
(prin1)
)