明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1677|回复: 16

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

  [复制链接]
发表于 2025-6-23 11:47:21 | 显示全部楼层 |阅读模式
本帖最后由 qifeifei 于 2025-6-23 13:08 编辑

让ai帮我写一个Autodesk cad lsp代码 命令是lp
视图固定在上  是二维画图 需求是 选择一根线或者线段 line or pline
让选择的线copy 往左边移动18 然后选选中初始线与复制出来的线 往右移动9


但是ai写的非常的失败 根本不能稳定稳定运行 有没有大神可以帮助修改下

  1. (defun cP (/ sel entType copiedEnt ss)
  2.   (prompt "\n请选择一条 LINE 或 LWPOLYLINE 线段:")
  3.   (setq sel (car (entsel)))
  4.   
  5.   (if (and sel
  6.            (setq entType (cdr (assoc 0 (entget sel))))
  7.            (or (equal entType "LINE") (equal entType "LWPOLYLINE")))
  8.     (progn
  9.       ;; 明确使用坐标偏移,不依赖选择点
  10.       (command "_.COPY" sel "" '(0 0 0) '(-18 0 0))
  11.       (setq copiedEnt (entlast))

  12.       ;; 使用精确选择集控制两个对象
  13.       (setq ss (ssadd))
  14.       (ssadd sel ss)
  15.       (ssadd copiedEnt ss)

  16.       ;; 向右移动 9 单位
  17.       (command "_.MOVE" ss "" '(0 0 0) '(9 0 0))

  18.       (prompt "\n✔ 线段处理完成。")
  19.     )
  20.     (prompt "\n⚠ 请选择一条 LINE 或 LWPOLYLINE 线段。")
  21.   )
  22.   (princ)
  23. )

本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2025-6-25 22:29:25 | 显示全部楼层
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. )
回复 支持 反对

使用道具 举报

发表于 2025-6-24 08:05:12 | 显示全部楼层
(defun c:lP (/ ss i ent entData entType p1 p2 dx dy copyEnt tempSS)
  (prompt "\n 请选择一条或多条 LINE 或 LWPOLYLINE 线段:")
  (setq ss (ssget '((0 . "LINE,LWPOLYLINE")))) ; 支持多选线段

  (if ss
    (progn
      (setq i 0)
      (while (< i (sslength ss))
        (setq ent (ssname ss i))
        (setq entData (entget ent))
        (setq entType (cdr (assoc 0 entData)))

        ;; 获取起点和终点
        (cond
          ((equal entType "LINE")
           (setq p1 (cdr (assoc 10 entData)))
           (setq p2 (cdr (assoc 11 entData)))
          )
          ((equal entType "LWPOLYLINE")
           ;; 取前两个点
           (setq p1 (cdr (assoc 10 entData)))
           (setq p2 (cdr (assoc 10 (nth 1 entData))))
          )
        )

        ;; 判断方向
        (setq dx (abs (- (car p2) (car p1))))
        (setq dy (abs (- (cadr p2) (cadr p1))))

        ;; 执行复制与移动
        (cond
          ((> dy dx)
           ;; 竖直线处理
           (command "_.COPY" ent "" "non" '(0 0 0) "non" '(-18 0 0))
           (setq copyEnt (entlast))
           (setq tempSS (ssadd))
           (ssadd ent tempSS)
           (ssadd copyEnt tempSS)
           (command "_.MOVE" tempSS "" "non" '(0 0 0) "non" '(9 0 0))
          )
          ((>= dx dy)
           ;; 横线处理
           (command "_.COPY" ent "" "non" '(0 0 0) "non" '(0 -18 0))
           (setq copyEnt (entlast))
           (setq tempSS (ssadd))
           (ssadd ent tempSS)
           (ssadd copyEnt tempSS)
           (command "_.MOVE" tempSS "" "non" '(0 0 0) "non" '(0 9 0))
          )
        )

        (setq i (1+ i))
      )
      (prompt (strcat "\n&#10004; 成功处理 " (itoa (sslength ss)) " 条线段。"))
    )
    (prompt "\n&#9888; 没有选择任何有效线段。")
  )
  (princ)
)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-6-23 12:59:40 | 显示全部楼层
本帖最后由 qifeifei 于 2025-6-23 13:01 编辑


我已经成功让ai帮我修复好了 亲测可以用了
但是偶尔还是有点小bug 不管了 先用
或者有大师可以帮忙修复升级下
----


  1. (defun cP (/ ss i ent entData entType p1 p2 dx dy copyEnt tempSS)
  2.   (prompt "\n请选择一条或多条 LINE 或 LWPOLYLINE 线段:")
  3.   (setq ss (ssget '((0 . "LINE,LWPOLYLINE")))) ; 支持多选线段

  4.   (if ss
  5.     (progn
  6.       (setq i 0)
  7.       (while (< i (sslength ss))
  8.         (setq ent (ssname ss i))
  9.         (setq entData (entget ent))
  10.         (setq entType (cdr (assoc 0 entData)))

  11.         ;; 获取起点和终点
  12.         (cond
  13.           ((equal entType "LINE")
  14.            (setq p1 (cdr (assoc 10 entData)))
  15.            (setq p2 (cdr (assoc 11 entData)))
  16.           )
  17.           ((equal entType "LWPOLYLINE")
  18.            ;; 取前两个点
  19.            (setq p1 (cdr (assoc 10 entData)))
  20.            (setq p2 (cdr (assoc 10 (nth 1 entData))))
  21.           )
  22.         )

  23.         ;; 判断方向
  24.         (setq dx (abs (- (car p2) (car p1))))
  25.         (setq dy (abs (- (cadr p2) (cadr p1))))

  26.         ;; 执行复制与移动
  27.         (cond
  28.           ((> dy dx)
  29.            ;; 竖直线处理
  30.            (command "_.COPY" ent "" '(0 0 0) '(-18 0 0))
  31.            (setq copyEnt (entlast))
  32.            (setq tempSS (ssadd))
  33.            (ssadd ent tempSS)
  34.            (ssadd copyEnt tempSS)
  35.            (command "_.MOVE" tempSS "" '(0 0 0) '(9 0 0))
  36.           )
  37.           ((>= dx dy)
  38.            ;; 横线处理
  39.            (command "_.COPY" ent "" '(0 0 0) '(0 -18 0))
  40.            (setq copyEnt (entlast))
  41.            (setq tempSS (ssadd))
  42.            (ssadd ent tempSS)
  43.            (ssadd copyEnt tempSS)
  44.            (command "_.MOVE" tempSS "" '(0 0 0) '(0 9 0))
  45.           )
  46.         )

  47.         (setq i (1+ i))
  48.       )
  49.       (prompt (strcat "\n&#10004; 成功处理 " (itoa (sslength ss)) " 条线段。"))
  50.     )
  51.     (prompt "\n&#9888; 没有选择任何有效线段。")
  52.   )
  53.   (princ)
  54. )

点评

放弃吧……  发表于 2025-6-23 20:50
回复 支持 反对

使用道具 举报

发表于 2025-6-23 19:40:30 | 显示全部楼层
不就是双向偏移吗
回复 支持 反对

使用道具 举报

发表于 2025-6-23 20:54:21 | 显示全部楼层
本帖最后由 xyp1964 于 2025-6-24 11:21 编辑

  1. (defun c:tt ()
  2.   "双向偏移"
  3.   (princ "\n请选择 LINE 或 LWPOLYLINE 线段<退出>:")
  4.   (while (setq ss (ssget '((0 . "LINE,LWPOLYLINE"))))
  5.     (setq i -1)
  6.     (while (setq s1 (ssname ss (setq i (1+ i))))
  7.       (xyp-Offset s1 9 t t t)
  8.     )
  9.   )
  10.   (princ)
  11. )



  1. (defun c:tt ()
  2.   "双向偏移"
  3.   (princ "\n请选择 LINE 或 LWPOLYLINE 线段<退出>:")
  4.   (while (setq ss (ssget '((0 . "LINE,*POLYLINE,arc,circle"))))
  5.     (setq i -1)
  6.     (while (setq s1 (ssname ss (setq i (1+ i))))
  7.       (setq ob(vlax-ename->vla-object s1))
  8.       (vla-offset ob 9)
  9.       (vla-offset ob -9)
  10.       (vla-delete ob)
  11.     )
  12.   )
  13.   (princ)
  14. )


回复 支持 反对

使用道具 举报

发表于 2025-6-24 02:47:56 | 显示全部楼层
双向偏移,当年我学习写代码接触的第一个插件
回复 支持 反对

使用道具 举报

发表于 2025-6-24 08:03:07 | 显示全部楼层
qifeifei 发表于 2025-6-23 12:59
我已经成功让ai帮我修复好了 亲测可以用了
但是偶尔还是有点小bug 不管了 先用
或者有大师可以帮忙修 ...

双向偏移,还可以了,继续努力
回复 支持 反对

使用道具 举报

发表于 2025-6-24 09:37:52 | 显示全部楼层

你要给他完整代码,偏移命令
(vla-offset obj 9);偏移9
(vla-offset obj -9);偏移-9
(vla-delete obj);删除原来图元
适用所有曲线,不需要分析方向
回复 支持 反对

使用道具 举报

发表于 2025-6-24 10:14:45 | 显示全部楼层
437271963 发表于 2025-6-24 09:37
你要给他完整代码,偏移命令
(vla-offset obj 9);偏移9
(vla-offset obj -9);偏移-9

分析了半天 还是你这个来得快。给大佬补全一下子。应该就是这样。
  1. (defun c:tt(/ ss i obj_n)
  2.         (if(setq ss(ssget '((0 . "LINE,LWPOLYLINE"))) i 0)
  3.                 (progn
  4.                         (command "UNDO" "be")
  5.                         (repeat(sslength ss)
  6.                                 (setq obj_n (vlax-ename->vla-object (ssname ss i)))
  7.                                 (vla-offset obj_n 9)
  8.                                 (vla-offset obj_n -9)
  9.                                 (vla-Delete obj_n)
  10.                                 (setq i(1+ i))
  11.                         )
  12.                         (command "UNDO" "e")
  13.                 )
  14.         )
  15. )
回复 支持 反对

使用道具 举报

发表于 2025-6-24 12:21:42 | 显示全部楼层
嘒彼小星 发表于 2025-6-24 10:14
分析了半天 还是你这个来得快。给大佬补全一下子。应该就是这样。

小伙子不错,有前途
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-12 09:29 , Processed in 0.191796 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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