明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: qifeifei

[提问] 控制线段移动的距离的问题

  [复制链接]
 楼主| 发表于 4 天前 | 显示全部楼层
学会了 但是我又了新的想法 我双线偏移18 但是要如何剪切掉中间那部分
没研究出来
  1. (defun c:T5 (/ ss i ent obj p1 p2 vec len unit p2new rightObj leftObj
  2.                pR1 pR2 midR pL1 pL2 midL trimP1 trimP2)

  3.   (setq extend-dist 18.0)

  4.   (prompt "\n请选择直线(LINE):")

  5.   ;; 获取用户选中的主线
  6.   (if (setq ss (ssget '((0 . "LINE"))))
  7.     (progn
  8.       (setq i -1)
  9.       (while (setq ent (ssname ss (setq i (1+ i))))
  10.         (setq obj (vlax-ename->vla-object ent))
  11.         (setq p1 (vlax-get obj 'StartPoint))
  12.         (setq p2 (vlax-get obj 'EndPoint))

  13.         ;; 单位向量
  14.         (setq vec (mapcar '- p2 p1))
  15.         (setq len (distance p1 p2))

  16.         (if (zerop len)
  17.           (prompt "\n跳过长度为0的线段。")
  18.           (progn
  19.             ;; 延申终点
  20.             (setq unit (mapcar '(lambda (x) (/ x len)) vec))
  21.             (setq p2new (mapcar '+ p2 (mapcar '(lambda (x) (* x extend-dist)) unit)))
  22.             (vlax-put obj 'EndPoint p2new)

  23.             ;; 左右偏移
  24.             (setq rightObj (car (vlax-invoke obj 'Offset 18.0)))
  25.             (setq leftObj  (car (vlax-invoke obj 'Offset -18.0)))

  26.             ;; 取两条偏移线的起点和终点
  27.             (setq pR1 (vlax-get rightObj 'StartPoint))
  28.             (setq pR2 (vlax-get rightObj 'EndPoint))
  29.             (setq pL1 (vlax-get leftObj  'StartPoint))
  30.             (setq pL2 (vlax-get leftObj  'EndPoint))

  31.             ;; 取交点范围的两个中点,用作 TRIM 的两个点
  32.             (setq trimP1 (mapcar '(lambda (a b) (/ (+ a b) 2.0)) pR1 pR2))
  33.             (setq trimP2 (mapcar '(lambda (a b) (/ (+ a b) 2.0)) pL1 pL2))

  34.             ;; 执行自动 TRIM,剪掉中间横线
  35.             (command "_.trim" "" (list trimP1 trimP2) "")  ; 注意这里的点用于裁剪横线
  36.           )
  37.         )
  38.       )
  39.     )
  40.     (prompt "\n未选择任何 LINE。")
  41.   )

  42.   (princ)
  43. )




本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 4 天前 | 显示全部楼层
chenlianghuai 发表于 2025-6-24 12:21
小伙子不错,有前途

您好 请教一下新的问题 延申后怎么自动剪切
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层

;; 双向偏移交点修剪

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层
xyp1964 发表于 2025-6-24 14:29
;; 双向偏移交点修剪

很好,求院长分享,,,
回复 支持 反对

使用道具 举报

 楼主| 发表于 3 天前 | 显示全部楼层
bai2000 发表于 2025-6-24 15:05
很好,求院长分享,,,

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. )
回复 支持 反对

使用道具 举报

发表于 前天 20:47 | 显示全部楼层
(defun c:tt ( / &kw ent ent2 obj ss x)
(setvar "cmdecho" 0)
(setvar "blipmode" 0)
(princ "\n请选择直线,多段线,样条曲线,圆弧,圆,椭圆。")
(if (setq &kw (ssget '((0 . "*LINE,ARC,CIRCLE,ELLIPSE"))))
  (progn
   (setq ss '());空表,记录未成功偏移的图元
   (while (setq ent (ssname &kw 0))
    (setq &kw (ssdel ent &kw) obj (vlax-ename->vla-object ent));这样写,是为了防止删除图元后造成错误
    (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-offset (list obj 9)));正向偏移9;防止偏移错误,造成程序中断
     (progn
      (setq ent2 nil);如果没有偏移成功就提示
      (setq ss (cons ent ss));如果未偏移成功就记录
     )
     (progn
      (setq ent2 (entlast));偏移成功的话,就记录这个图元
      (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-offset (list obj -9)));反向偏移9
       (progn
        (entdel ent2);反向偏移未成功,就删除已经偏移的对象
        (setq ss (cons ent ss));如果未偏移成功就记录
       )
       (vla-delete obj);如果双向偏移成功,就删除原来的图元
      )
     )
    )
   );while
   (if (car ss);如果有未偏移成功的图元
    (progn
     (princ (strcat "\n共有:<" (itoa (length ss)) ">个图元不能双向偏移"))
     (setq &kw (ssadd))
     (mapcar '(lambda(x) (ssadd x &kw)) ss)
     (sssetfirst nil &kw);图元亮显选择
    )
   )
  )
)
(princ)
)
;优化了使用过程当中产生的错误
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-28 11:22 , Processed in 0.157182 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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