本帖最后由 hhh454 于 2025-11-1 14:14 编辑
 - (defun c:tt ( / *error* oldCmdEcho oldOSMode ss allPoints ptCount)
-
- ;;; 错误处理函数 ;;;
- (defun *error* (msg)
- (if oldOSMode (setvar "OSMODE" oldOSMode))
- (if oldCmdEcho (setvar "CMDECHO" oldCmdEcho))
- (princ (strcat "\n错误: " msg))
- )
-
- ;;; 保存系统变量状态 ;;;
- (setq oldCmdEcho (getvar "CMDECHO"))
- (setq oldOSMode (getvar "OSMODE"))
- (setvar "CMDECHO" 0) ; 关闭命令回显
- (setvar "OSMODE" 0) ; 关闭对象捕捉
-
- ;;; 主程序逻辑 ;;;
- (princ "\n请框选多段线(PLINE)和直线(LINE)对象: ")
- (if (setq ss (ssget '((0 . "LINE,LWPOLYLINE,POLYLINE")))) ; 过滤选择类型
- (progn
- ; 遍历选择集中的所有对象
- (setq allPoints nil)
- (repeat (setq i (sslength ss))
- (setq ent (ssname ss (setq i (1- i))))
- (setq entData (entget ent))
- (setq objType (cdr (assoc 0 entData)))
-
- ; 根据不同对象类型提取顶点
- (cond
- ; 处理直线(LINE)
- ((= objType "LINE")
- (setq allPoints (cons (cdr (assoc 10 entData)) allPoints)) ; 起点
- (setq allPoints (cons (cdr (assoc 11 entData)) allPoints)) ; 终点
- )
-
- ; 处理轻量多段线(LWPOLYLINE)
- ((= objType "LWPOLYLINE")
- (foreach x entData
- (if (= (car x) 10)
- (setq allPoints (cons (cdr x) allPoints))
- )
- )
- )
-
- ; 处理旧式多段线(POLYLINE)
- ((= objType "POLYLINE")
- (setq nextEnt (entnext ent))
- (while (and nextEnt
- (not (eq (cdr (assoc 0 (entget nextEnt))) "SEQEND")))
- (setq vertexData (entget nextEnt))
- (if (assoc 10 vertexData)
- (setq allPoints (cons (cdr (assoc 10 vertexData)) allPoints))
- )
- (setq nextEnt (entnext nextEnt))
- )
- )
- )
- )
-
- ; 反转点列表以保持原始顺序
- (setq allPoints (reverse allPoints))
-
- ; 提取点数量统计
- (setq ptCount (length allPoints))
- (princ (strcat "\n共提取 " (itoa ptCount) " 个顶点,自动创建闭合多边形"))
-
- ; 创建闭合连接线
- (command "_.PLINE") ; 使用多段线命令
- (foreach pt allPoints
- (command pt) ; 逐个添加点
- )
- (command "_close") ; 自动闭合多边形
- )
- (princ "\n未选择到有效对象!")
-
- ; 删除原始对象
- (command "_.ERASE" ss "")
- (princ (strcat "\n已删除 " (itoa (sslength ss)) " 个原始对象"))
- )
-
- ;;; 恢复系统设置 ;;;
- (setvar "CMDECHO" oldCmdEcho)
- (setvar "OSMODE" oldOSMode)
- (princ)
- )
-
- (princ "\n输入 tt 启动插件")
DeepSeek-R1-满血版(0528)辅助
复制上面的代码就行,一样的
|