本帖最后由 开心无惧 于 2025-11-4 09:43 编辑
功能:一次性把断开的矩形 ,对应的端点各自连接上;
支持矩形可任意角度布置
有大小两个矩形被打断,有8个外部端点需要两两相连接;
图上的打断虚线是示意的,实际没有这个线;
原图形:只有绿色的线;
新图形:新增红色的线;
请教大家,有好的思路可以推荐一下吗?
网友答: 本帖最后由 llsheng_73 于 2025-11-3 13:53 编辑
取每条线的(起点 第二点)和(终点、倒数第二点)组成表,对每四个点进行共线检查,如果起点与终点都在(第二点、倒数第二点)所在直线段内,则连接(起点 终点),则达到楼主需求

网友答: 本帖最后由 hhh454 于 2025-11-1 14:14 编辑

DeepSeek-R1-满血版(0528)辅助
复制上面的代码就行,一样的
网友答: ex延申就行了 你这个都是方正的网友答: 用 J 命令不行吗网友答:
图上的打断虚线是示意的,实际没有;网友答: 方案一:
筛选向量夹角一致的,每个角度为一组,组a.
按照组把逆角度旋转,此时全部都是x轴平行,按照y排序,得到组b.
每个y行,min和max就是新line了.
(效率不高,多次旋转)
方案二:
延伸点是拐点,拐点在拐点集中.网友答: 本帖最后由 guosheyang 于 2025-11-1 09:04 编辑
线的起点 第二点 与另一条线的终点 或起点 共线 来判断连接点网友答: 先分解为直线,
join合并直线
pe链接为多段线。网友答: 本帖最后由 开心无惧 于 2025-11-3 13:45 编辑
谢谢 方案一没有完全懂 方案二没太懂,拐点是什么意思?网友答:
谢谢 按共线检查的方法
功能:一次性把断开的矩形 ,对应的端点各自连接上;
支持矩形可任意角度布置
有大小两个矩形被打断,有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
线的起点 第二点 与另一条线的终点 或起点 共线 来判断连接点
谢谢 按共线检查的方法