开心无惧 发表于 2025-10-31 17:15:20

请教 把断开的矩形 自动连接上

本帖最后由 开心无惧 于 2025-11-4 09:43 编辑

功能:一次性把断开的矩形 ,对应的端点各自连接上;
          支持矩形可任意角度布置
          有大小两个矩形被打断,有8个外部端点需要两两相连接;


图上的打断虚线是示意的,实际没有这个线;
原图形:只有绿色的线;
新图形:新增红色的线;



请教大家,有好的思路可以推荐一下吗?









llsheng_73 发表于 2025-11-3 13:32:47

本帖最后由 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:13:13

本帖最后由 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)辅助

复制上面的代码就行,一样的



qifeifei 发表于 2025-10-31 17:32:01

ex延申就行了 你这个都是方正的

mokson 发表于 2025-10-31 18:39:28

用 J 命令不行吗

开心无惧 发表于 2025-10-31 19:46:06

mokson 发表于 2025-10-31 18:39
用 J 命令不行吗

图上的打断虚线是示意的,实际没有;

你有种再说一遍 发表于 2025-10-31 20:29:13

方案一:
筛选向量夹角一致的,每个角度为一组,组a.
按照组把逆角度旋转,此时全部都是x轴平行,按照y排序,得到组b.
每个y行,min和max就是新line了.
(效率不高,多次旋转)

方案二:
延伸点是拐点,拐点在拐点集中.

guosheyang 发表于 2025-11-1 09:01:29

本帖最后由 guosheyang 于 2025-11-1 09:04 编辑

线的起点第二点 与另一条线的终点 或起点 共线 来判断连接点

edata 发表于 2025-11-1 10:55:56

先分解为直线,
join合并直线
pe链接为多段线。

开心无惧 发表于 2025-11-2 18:44:47

本帖最后由 开心无惧 于 2025-11-3 13:45 编辑

你有种再说一遍 发表于 2025-10-31 20:29
方案一:
筛选向量夹角一致的,每个角度为一组,组a.
按照组把逆角度旋转,此时全部都是x轴平行,按照y排序,得 ...
谢谢 方案一没有完全懂方案二没太懂,拐点是什么意思?

开心无惧 发表于 2025-11-2 18:46:04

guosheyang 发表于 2025-11-1 09:01
线的起点第二点 与另一条线的终点 或起点 共线 来判断连接点

谢谢 按共线检查的方法
页: [1] 2 3
查看完整版本: 请教 把断开的矩形 自动连接上