明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 157|回复: 2

[讨论] 双线延申并偏移剪切

[复制链接]
发表于 昨天 13:40 | 显示全部楼层 |阅读模式
本帖最后由 qifeifei 于 2025-6-27 13:43 编辑

平时做平面图衣柜
需要用到这个代码;使用AI写的代码 调试了很多了 效果也不太理想
有时候可能达到自己想要的效果 有时候又抽风 求优化

  1. (defun c:T5 (/ ss ent obj p1 p2 dir unit len p2new leftEnt rightEnt left right
  2.                 newp1 newp2 mid allLines i crossEnt crossP1 crossP2 x1 x2
  3.                 y1 y2 ip1 ip2)

  4.   (vl-load-com)
  5.   (prompt "\n[T5] 开始运行命令...")

  6.   ;; 选择竖向直线
  7.   (if (setq ss (ssget '((0 . "LINE,LWPOLYLINE"))))
  8.     (progn
  9.       (setq ent (ssname ss 0)
  10.             obj (vlax-ename->vla-object ent)
  11.             p1 (vlax-get obj 'StartPoint)
  12.             p2 (vlax-get obj 'EndPoint)
  13.             dir (mapcar '- p2 p1)
  14.             len (distance p1 p2))

  15.       ;; 判断竖线
  16.       (if (< (abs (car dir)) 0.01)
  17.         (progn
  18.           (setq unit (mapcar '(lambda (x) (/ x len)) dir))
  19.           (setq p2new (mapcar '+ p2 (mapcar '(lambda (x) (* x 18.0)) unit)))
  20.           (vlax-put obj 'EndPoint p2new)
  21.           (prompt (strcat "\n[T5] 已延申到新终点: "
  22.                           (rtos (car p2new) 2 2) ", "
  23.                           (rtos (cadr p2new) 2 2)))

  24.           ;; 左右偏移
  25.           (vla-offset obj 18.0)
  26.           (setq rightEnt (entlast))
  27.           (vla-offset obj -18.0)
  28.           (setq leftEnt (entlast))

  29.           ;; 获取偏移线坐标
  30.           (setq right (vlax-ename->vla-object rightEnt))
  31.           (setq left  (vlax-ename->vla-object leftEnt))
  32.           (setq newp1 (vlax-get obj 'StartPoint))
  33.           (setq newp2 (vlax-get obj 'EndPoint))
  34.           (setq mid (mapcar '(lambda (a b) (/ (+ a b) 2.0)) newp1 newp2))

  35.           ;; 获取左右偏移的X范围
  36.           (setq x1 (car (vlax-get left 'StartPoint)))
  37.           (setq x2 (car (vlax-get right 'StartPoint)))
  38.           (if (> x1 x2) (setq tmp x1 x1 x2 x2 tmp)) ; 交换x1 x2顺序

  39.           ;; 查找在左右偏移线之间的横线
  40.           (setq allLines (ssget "_X" '((0 . "LINE,LWPOLYLINE"))))
  41.           (setq i -1)
  42.           (while (and allLines (setq crossEnt (ssname allLines (setq i (1+ i)))))
  43.             (setq crossObj (vlax-ename->vla-object crossEnt))
  44.             (setq crossP1 (vlax-get crossObj 'StartPoint))
  45.             (setq crossP2 (vlax-get crossObj 'EndPoint))

  46.             ;; 横向判断:y 坐标相同,x 跨越 x1 ~ x2
  47.             (if (and (equal (cadr crossP1) (cadr crossP2) 0.01)
  48.                      (< (min (car crossP1) (car crossP2)) x1)
  49.                      (> (max (car crossP1) (car crossP2)) x2))
  50.               (progn
  51.                 ;; 计算交点:在左右偏移线 x1 和 x2 的交点处 break
  52.                 (setq y (cadr crossP1))
  53.                 (setq ip1 (list x1 y 0.0))
  54.                 (setq ip2 (list x2 y 0.0))

  55.                 ;; 执行 break
  56.                 (command "_.break" crossEnt ip1 ip2)
  57.                 (prompt "\n[T5] 成功剪切一条横线")
  58.                 (setq i (sslength allLines)) ; 跳出循环,只剪一条
  59.               )
  60.             )
  61.           )

  62.         )
  63.         (prompt "\n[T5] 请只选择一条竖向的 LINE 或 LWPOLYLINE.")
  64.       )
  65.     )
  66.     (prompt "\n[T5] 没有选择任何对象")
  67.   )
  68.   (princ)
  69. )
成功展示:

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 昨天 18:03 | 显示全部楼层
哈哈,怎么感觉现在还比以前糟糕,以前都是求代码,
起码大家的代码都没有问题.

现在是拿着代码让别人改,别人还得从头看一次你的代码,
你代码的函数又不是别人的函数库,还得从头学一次.

真的把这个工作想得太简单了...
不是懂代码的用这个工具会让全部人都感受到痛苦.
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 20:18 | 显示全部楼层
你有种再说一遍 发表于 2025-6-27 18:03
哈哈,怎么感觉现在还比以前糟糕,以前都是求代码,
起码大家的代码都没有问题.

好吧
我是有研究了部分;但是效果调试的不理想,才发出来
比较多的代码 我调试好的;我都自己用了 没发了

那等我空了 在研究下
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-28 04:16 , Processed in 0.173902 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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