明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1046|回复: 24

[提问] 请教 把断开的矩形 自动连接上

[复制链接]
发表于 2025-10-31 17:15:20 | 显示全部楼层 |阅读模式
本帖最后由 开心无惧 于 2025-11-4 09:43 编辑

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


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



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









本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复

使用道具 举报

发表于 2025-11-3 13:32:47 | 显示全部楼层
本帖最后由 llsheng_73 于 2025-11-3 13:53 编辑

取每条线的(起点 第二点)和(终点、倒数第二点)组成表,对每四个点进行共线检查,如果起点与终点都在(第二点、倒数第二点)所在直线段内,则连接(起点  终点),则达到楼主需求
  1. (defun PToLn(p p1 p2);;;点p到p1,p2所在直线分量
  2.   (trans(mapcar'- p1 p) 0 (mapcar'- p1 p2)))
  3. (defun s2e(s)
  4.   (vl-remove'nil(mapcar'(lambda(x)(if(=(type(cadr x))'ename)(cadr x)))(ssnamex s))))
  5. (defun c:tt(/ s p p1)
  6.   (setq s(apply'append(mapcar(function(lambda(x / n)(setq n(vlax-curve-getendparam x))
  7.        (list(list(vlax-curve-getpointatparam x 0)(vlax-curve-getpointatparam x 1))
  8.       (list(vlax-curve-getpointatparam x n)(vlax-curve-getpointatparam x(1- n))))))
  9.     (s2e(ssget'((0 . "lwpolyline")(-4 . "<not")(-4 . "&")(70 . 1)(-4 . "not>")))))))
  10.   (while(setq p(car s)s(cdr s))
  11.     (if(vl-some(function(lambda(x / d a b)
  12.         (and(not(equal p(reverse x)1e-5))
  13.             (setq d(distance(cadr p)(cadr x))
  14.             a(PToLn(car p)(cadr p)(cadr x))
  15.             b(PToLn(car x)(cadr x)(cadr p)))
  16.             (equal(car a)0 1e-5)
  17.             (equal(car b)0 1e-5)
  18.             (< 0(caddr a)d)
  19.             (< 0(caddr b)d)
  20.             (setq p1 x))))s)
  21.       (entmakex(mapcar'cons'(0 100 100 62 90 10 10)(list"LWPOLYLINE""AcDbEntity""AcDbPolyline"1 2(car p)(car p1)))))))

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 1明经币 +1 收起 理由
aihuyujian + 1 很给力!

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2025-11-1 14:13:13 | 显示全部楼层
本帖最后由 hhh454 于 2025-11-1 14:14 编辑



  1. (defun c:tt ( / *error* oldCmdEcho oldOSMode ss allPoints ptCount)

  2.   ;;; 错误处理函数 ;;;
  3.   (defun *error* (msg)
  4.     (if oldOSMode (setvar "OSMODE" oldOSMode))
  5.     (if oldCmdEcho (setvar "CMDECHO" oldCmdEcho))
  6.     (princ (strcat "\n错误: " msg))
  7.   )

  8.   ;;; 保存系统变量状态 ;;;
  9.   (setq oldCmdEcho (getvar "CMDECHO"))
  10.   (setq oldOSMode (getvar "OSMODE"))
  11.   (setvar "CMDECHO" 0)  ; 关闭命令回显
  12.   (setvar "OSMODE" 0)   ; 关闭对象捕捉

  13.   ;;; 主程序逻辑 ;;;
  14.   (princ "\n请框选多段线(PLINE)和直线(LINE)对象: ")
  15.   (if (setq ss (ssget '((0 . "LINE,LWPOLYLINE,POLYLINE"))))  ; 过滤选择类型
  16.     (progn
  17.       ; 遍历选择集中的所有对象
  18.       (setq allPoints nil)
  19.       (repeat (setq i (sslength ss))
  20.         (setq ent (ssname ss (setq i (1- i))))
  21.         (setq entData (entget ent))
  22.         (setq objType (cdr (assoc 0 entData)))
  23.         
  24.         ; 根据不同对象类型提取顶点
  25.         (cond
  26.           ; 处理直线(LINE)
  27.           ((= objType "LINE")
  28.             (setq allPoints (cons (cdr (assoc 10 entData)) allPoints)) ; 起点
  29.             (setq allPoints (cons (cdr (assoc 11 entData)) allPoints)) ; 终点
  30.           )
  31.          
  32.           ; 处理轻量多段线(LWPOLYLINE)
  33.           ((= objType "LWPOLYLINE")
  34.             (foreach x entData
  35.               (if (= (car x) 10)
  36.                 (setq allPoints (cons (cdr x) allPoints))
  37.               )
  38.             )
  39.           )
  40.          
  41.           ; 处理旧式多段线(POLYLINE)
  42.           ((= objType "POLYLINE")
  43.             (setq nextEnt (entnext ent))
  44.             (while (and nextEnt
  45.                        (not (eq (cdr (assoc 0 (entget nextEnt))) "SEQEND")))
  46.               (setq vertexData (entget nextEnt))
  47.               (if (assoc 10 vertexData)
  48.                 (setq allPoints (cons (cdr (assoc 10 vertexData)) allPoints))
  49.               )
  50.               (setq nextEnt (entnext nextEnt))
  51.             )
  52.           )
  53.         )
  54.       )
  55.       
  56.       ; 反转点列表以保持原始顺序
  57.       (setq allPoints (reverse allPoints))
  58.       
  59.       ; 提取点数量统计
  60.       (setq ptCount (length allPoints))
  61.       (princ (strcat "\n共提取 " (itoa ptCount) " 个顶点,自动创建闭合多边形"))
  62.       
  63.       ; 创建闭合连接线
  64.       (command "_.PLINE")  ; 使用多段线命令
  65.       (foreach pt allPoints
  66.         (command pt)  ; 逐个添加点
  67.       )
  68.       (command "_close")  ; 自动闭合多边形
  69.     )
  70.     (princ "\n未选择到有效对象!")
  71.    
  72.      ; 删除原始对象
  73.       (command "_.ERASE" ss "")
  74.       (princ (strcat "\n已删除 " (itoa (sslength ss)) " 个原始对象"))
  75.   )
  76.   
  77.   ;;; 恢复系统设置 ;;;
  78.   (setvar "CMDECHO" oldCmdEcho)
  79.   (setvar "OSMODE" oldOSMode)
  80.   (princ)
  81. )

  82. (princ "\n输入 tt 启动插件")


DeepSeek-R1-满血版(0528)辅助

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



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

优秀  发表于 2025-11-1 18:09

评分

参与人数 1明经币 +1 收起 理由
USER2128 + 1 赞一个!

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2025-10-31 17:32:01 | 显示全部楼层
ex延申就行了 你这个都是方正的
回复 支持 反对

使用道具 举报

发表于 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了.
(效率不高,多次旋转)

方案二:
延伸点是拐点,拐点在拐点集中.
回复 支持 反对

使用道具 举报

发表于 2025-11-1 09:01:29 | 显示全部楼层
本帖最后由 guosheyang 于 2025-11-1 09:04 编辑

线的起点  第二点 与另一条线的终点 或起点 共线 来判断连接点
回复 支持 反对

使用道具 举报

发表于 2025-11-1 10:55:56 | 显示全部楼层
先分解为直线,
join合并直线
pe链接为多段线。

点评

效率  发表于 2025-11-1 11:17
回复 支持 反对

使用道具 举报

 楼主| 发表于 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
线的起点  第二点 与另一条线的终点 或起点 共线 来判断连接点

谢谢 按共线检查的方法
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-11-13 21:52 , Processed in 0.297402 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表