请教 把断开的矩形 自动连接上
本帖最后由 开心无惧 于 2025-11-4 09:43 编辑功能:一次性把断开的矩形 ,对应的端点各自连接上;
支持矩形可任意角度布置
有大小两个矩形被打断,有8个外部端点需要两两相连接;
图上的打断虚线是示意的,实际没有这个线;
原图形:只有绿色的线;
新图形:新增红色的线;
请教大家,有好的思路可以推荐一下吗?
本帖最后由 llsheng_73 于 2025-11-3 13:53 编辑
取每条线的(起点 第二点)和(终点、倒数第二点)组成表,对每四个点进行共线检查,如果起点与终点都在(第二点、倒数第二点)所在直线段内,则连接(起点终点),则达到楼主需求
(defun PToLn(p p1 p2);;;点p到p1,p2所在直线分量
(trans(mapcar'- p1 p) 0 (mapcar'- p1 p2)))
(defun s2e(s)
(vl-remove'nil(mapcar'(lambda(x)(if(=(type(cadr x))'ename)(cadr x)))(ssnamex s))))
(defun c:tt(/ s p p1)
(setq s(apply'append(mapcar(function(lambda(x / n)(setq n(vlax-curve-getendparam x))
(list(list(vlax-curve-getpointatparam x 0)(vlax-curve-getpointatparam x 1))
(list(vlax-curve-getpointatparam x n)(vlax-curve-getpointatparam x(1- n))))))
(s2e(ssget'((0 . "lwpolyline")(-4 . "<not")(-4 . "&")(70 . 1)(-4 . "not>")))))))
(while(setq p(car s)s(cdr s))
(if(vl-some(function(lambda(x / d a b)
(and(not(equal p(reverse x)1e-5))
(setq d(distance(cadr p)(cadr x))
a(PToLn(car p)(cadr p)(cadr x))
b(PToLn(car x)(cadr x)(cadr p)))
(equal(car a)0 1e-5)
(equal(car b)0 1e-5)
(< 0(caddr a)d)
(< 0(caddr b)d)
(setq p1 x))))s)
(entmakex(mapcar'cons'(0 100 100 62 90 10 10)(list"LWPOLYLINE""AcDbEntity""AcDbPolyline"1 2(car p)(car p1)))))))
本帖最后由 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)辅助
复制上面的代码就行,一样的
ex延申就行了 你这个都是方正的 用 J 命令不行吗 mokson 发表于 2025-10-31 18:39
用 J 命令不行吗
图上的打断虚线是示意的,实际没有; 方案一:
筛选向量夹角一致的,每个角度为一组,组a.
按照组把逆角度旋转,此时全部都是x轴平行,按照y排序,得到组b.
每个y行,min和max就是新line了.
(效率不高,多次旋转)
方案二:
延伸点是拐点,拐点在拐点集中. 本帖最后由 guosheyang 于 2025-11-1 09:04 编辑
线的起点第二点 与另一条线的终点 或起点 共线 来判断连接点 先分解为直线,
join合并直线
pe链接为多段线。 本帖最后由 开心无惧 于 2025-11-3 13:45 编辑
你有种再说一遍 发表于 2025-10-31 20:29
方案一:
筛选向量夹角一致的,每个角度为一组,组a.
按照组把逆角度旋转,此时全部都是x轴平行,按照y排序,得 ...
谢谢 方案一没有完全懂方案二没太懂,拐点是什么意思? guosheyang 发表于 2025-11-1 09:01
线的起点第二点 与另一条线的终点 或起点 共线 来判断连接点
谢谢 按共线检查的方法