本帖最后由 277283904 于 2025-12-6 11:55 编辑

如图:就是一次性从蓝色线向外偏移到绿色线,又可以一次性向内从蓝色线偏移到红色线,并且可以指偏移距离?

网友答: 这个超简单的;我要是写出来收费;肯定会被骂的;不收费我没动力。
给你半成品 拿去改把
  1. ;;; 偏移命令 OF - 支持选中线条偏移,可设置偏移距离
  2. ;;; 支持直线(Line)、多段线(Pline)等多种线型

  3. (defun c:of (/ offset-dist entity ent-type offset-side)
  4.   (setq old-cmdecho (getvar "CMDECHO"))
  5.   (setvar "CMDECHO" 0)
  6.   
  7.   ;; 初始化偏移距离
  8.   (if (not *of-offset-distance*)
  9.     (setq *of-offset-distance* 10.0)
  10.   )
  11.   
  12.   ;; 主循环
  13.   (while T
  14.     ;; 使用带关键字的提示
  15.     (initget "设置距离 S 退出 Exit")
  16.     (setq entity
  17.       (entsel
  18.         (strcat
  19.           "\n选择要偏移的对象或 [设置距离(S)/退出(E)] <当前距离: "
  20.           (rtos *of-offset-distance* 2 2)
  21.           ">: "
  22.         )
  23.       )
  24.     )
  25.    
  26.     ;; 处理用户选择
  27.     (cond
  28.       ;; 用户选择设置距离
  29.       ((or (= entity "设置距离") (= entity "S"))
  30.        (progn
  31.          (initget 6)
  32.          (setq new-dist
  33.            (getdist
  34.              (strcat
  35.                "\n指定偏移距离 <"
  36.                (rtos *of-offset-distance* 2 2)
  37.                ">: "
  38.              )
  39.            )
  40.          )
  41.          (if new-dist
  42.            (setq *of-offset-distance* new-dist)
  43.            (princ "\n保持当前距离")
  44.          )
  45.        )
  46.       )
  47.       
  48.       ;; 用户选择退出
  49.       ((or (= entity "退出") (= entity "Exit"))
  50.        (progn
  51.          (princ "\n退出偏移命令")
  52.          (exit)
  53.        )
  54.       )
  55.       
  56.       ;; 用户选择了对象
  57.       ((= (type entity) 'LIST)
  58.        (progn
  59.          (setq ent-name (car entity))
  60.          (setq ent-data (entget ent-name))
  61.          (setq ent-type (cdr (assoc 0 ent-data)))
  62.          
  63.          ;; 检查是否为支持的线型
  64.          (if (or (= ent-type "LINE")
  65.                  (= ent-type "LWPOLYLINE")
  66.                  (= ent-type "POLYLINE")
  67.                  (= ent-type "ARC")
  68.                  (= ent-type "CIRCLE")
  69.              )
  70.            (progn
  71.              ;; 获取偏移方向
  72.              (initget "左侧 Left 右侧 Right")
  73.              (setq offset-side
  74.                (getkword
  75.                  "\n指定偏移侧 [左侧(L)/右侧(R)] <右侧>: "
  76.                )
  77.              )
  78.             
  79.              ;; 默认右侧偏移
  80.              (if (null offset-side)
  81.                (setq offset-side "右侧")
  82.              )
  83.             
  84.              ;; 执行偏移命令
  85.              (command "_.OFFSET" *of-offset-distance* ent-name "" "")
  86.             
  87.              ;; 如果选择了左侧偏移,需要镜像
  88.              (if (or (= offset-side "左侧") (= offset-side "Left"))
  89.                (progn
  90.                  (princ "\n左侧偏移,正在调整方向...")
  91.                  ;; 这里可以根据需要添加额外的逻辑
  92.                  ;; 暂时使用标准偏移,方向由AutoCAD自动处理
  93.                )
  94.              )
  95.             
  96.              (princ (strcat "\n成功偏移 " ent-type " 对象"))
  97.            )
  98.            (princ "\n不支持的对象类型!请选择直线、多段线、圆弧或圆。")
  99.          )
  100.        )
  101.       )
  102.       
  103.       ;; 用户取消或回车
  104.       ((null entity)
  105.        (progn
  106.          (princ "\n退出偏移命令")
  107.          (exit)
  108.        )
  109.       )
  110.     )
  111.   )
  112.   
  113.   ;; 恢复系统变量
  114.   (setvar "CMDECHO" old-cmdecho)
  115.   (princ)
  116. )

  117. ;;; 简化版本的偏移命令 - 直接偏移选中对象
  118. (defun c:of-quick (/ entity offset-dist)
  119.   (setq old-cmdecho (getvar "CMDECHO"))
  120.   (setvar "CMDECHO" 0)
  121.   
  122.   ;; 使用上次距离或默认值
  123.   (if (not *of-offset-distance*)
  124.     (setq *of-offset-distance* 10.0)
  125.   )
  126.   
  127.   ;; 选择对象
  128.   (setq entity (entsel "\n选择要偏移的对象: "))
  129.   
  130.   (if entity
  131.     (progn
  132.       ;; 检查对象类型
  133.       (setq ent-data (entget (car entity)))
  134.       (setq ent-type (cdr (assoc 0 ent-data)))
  135.       
  136.       (if (or (= ent-type "LINE")
  137.               (= ent-type "LWPOLYLINE")
  138.               (= ent-type "POLYLINE")
  139.               (= ent-type "ARC")
  140.               (= ent-type "CIRCLE")
  141.           )
  142.         (progn
  143.           ;; 获取偏移距离
  144.           (initget 6)
  145.           (setq offset-dist
  146.             (getdist
  147.               (strcat
  148.                 "\n指定偏移距离 <"
  149.                 (rtos *of-offset-distance* 2 2)
  150.                 ">: "
  151.               )
  152.             )
  153.           )
  154.          
  155.           (if (null offset-dist)
  156.             (setq offset-dist *of-offset-distance*)
  157.             (setq *of-offset-distance* offset-dist)
  158.           )
  159.          
  160.           ;; 执行偏移
  161.           (command "_.OFFSET" offset-dist (car entity) "" "")
  162.           (princ (strcat "\n成功偏移 " ent-type " 对象"))
  163.         )
  164.         (princ "\n不支持的对象类型!")
  165.       )
  166.     )
  167.     (princ "\n未选择对象")
  168.   )
  169.   
  170.   (setvar "CMDECHO" old-cmdecho)
  171.   (princ)
  172. )

  173. ;;; 加载提示
  174. (princ "\n偏移命令已加载:")
  175. (princ "\n  OF  - 完整版偏移命令(支持设置距离)")
  176. (princ "\n  OF-QUICK - 快速偏移命令")
  177. (princ "\n使用 S 选项可以设置偏移距离")
  178. (princ)


网友答:
  1. (defun c:tt ()
  2.   (setq o1 '(10 20 30 40);外偏移数据
  3.         o2 '(40 30 20 10);内偏移数据
  4.   )
  5.   (if (setq s1 (car (entsel "\n选择偏移线<退出>: ")))
  6.     (progn
  7.       (setq s2 s1)
  8.       (setvar 'cecolor "3")
  9.       (foreach a o1
  10.         (vla-OFFSET (vlax-ename->vla-object s1) a)
  11.         (setq s1 (entlast))
  12.       )
  13.       (setvar 'cecolor "1")
  14.       (foreach a o2
  15.         (vla-OFFSET (vlax-ename->vla-object s2) (- a))
  16.         (setq s2 (entlast))
  17.       )
  18.     )
  19.   )
  20.   (princ)
  21. )
  • 上一篇:小菜的选择易 用AI修复下,应该是1.2版本
  • 下一篇:没有了