用autolisp写一个autocad插件,可以快速闭合所有多段线
(defun c:closeallpolylines (/ ent)
(vl-load-com)
(setq ent (ssget "X")) ; 选择所有多段线
(if ent ; 如果选择了实体,就进行下面的处理,否则退出函数
(progn ; 进入循环,对选中的实体做循环处理
(repeat (sslength ent) ; 根据选中实体的数量设置循环次数
(if (= "POLYLINE" (cdr (assoc 0 (entget (ssname ent 0))))) ; 判断是不是多段线,是就进行下面的闭合动作,否则跳过此实体。
(command "_pedit" "_m" "_j" "_c" "_c") ; 闭合命令 pedit m j c c (修剪、合并、关闭、归零)。注意此命令参数必须在一条语句内使用。
) ; 结束if判断
;; 循环中要做的动作都在上面了,下面就是循环自己要做的动作了。即将当前实体从选集中去除。直到所有实体都去除了,循环就会退出。
;; 注意 ssname 返回的是字串应用, ssdel 用字串应用来去除一个实体及其子对象.
;; 向 ssdel 添加参数 0, 表明只去除当前对象而不包含子对象.
;; 本例子不包含子对象, 故将 0 添加到 ssdel 的参数中.
;; 本例子也使用了一般 AutoLISP 的 repeat 命令而不使用 while, for 等 AutoCAD LISP 命令.
;; repeat 要求我们传入一个代表重复次数的表达式. 本例中我们传入 sslength 函数返回值, sslength 返回当前选集内包含多少个实体.
(ssdel ; 在正式去除之前最好将当前处理的实体保存在一个变量里供日志或者显示使用. 也方便 debug 处理时查看问题所在.
ename ; ename 是上方 ssname 返回值保存地方.
ent ; 需要去除该 ename 的集合.
0 ; 针对本例考虑, 添加 0 表明不包含子对象.(如: 多段线上端标法). ) )) ) )
创作工场
免责声明:
以上内容除特别注明外均来源于网友提问,创作工场回答,未经许可,严谨转载。
点击这里>>使用🔥专业版,更聪明、更完整、更原创!