277283904 发表于 6 天前

怎么一次性偏移成如图这样呢,并且可以指偏移距离?

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

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

xyp1964 发表于 6 天前

(defun c:tt ()
(setq o1 '(10 20 30 40);外偏移数据
      o2 '(40 30 20 10);内偏移数据
)
(if (setq s1 (car (entsel "\n选择偏移线<退出>: ")))
    (progn
      (setq s2 s1)
      (setvar 'cecolor "3")
      (foreach a o1
      (vla-OFFSET (vlax-ename->vla-object s1) a)
      (setq s1 (entlast))
      )
      (setvar 'cecolor "1")
      (foreach a o2
      (vla-OFFSET (vlax-ename->vla-object s2) (- a))
      (setq s2 (entlast))
      )
    )
)
(princ)
)

qifeifei 发表于 6 天前

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

(defun c:of (/ offset-dist entity ent-type offset-side)
(setq old-cmdecho (getvar "CMDECHO"))
(setvar "CMDECHO" 0)

;; 初始化偏移距离
(if (not *of-offset-distance*)
    (setq *of-offset-distance* 10.0)
)

;; 主循环
(while T
    ;; 使用带关键字的提示
    (initget "设置距离 S 退出 Exit")
    (setq entity
      (entsel
      (strcat
          "\n选择要偏移的对象或 [设置距离(S)/退出(E)] <当前距离: "
          (rtos *of-offset-distance* 2 2)
          ">: "
      )
      )
    )
   
    ;; 处理用户选择
    (cond
      ;; 用户选择设置距离
      ((or (= entity "设置距离") (= entity "S"))
       (progn
         (initget 6)
         (setq new-dist
         (getdist
             (strcat
               "\n指定偏移距离 <"
               (rtos *of-offset-distance* 2 2)
               ">: "
             )
         )
         )
         (if new-dist
         (setq *of-offset-distance* new-dist)
         (princ "\n保持当前距离")
         )
       )
      )
      
      ;; 用户选择退出
      ((or (= entity "退出") (= entity "Exit"))
       (progn
         (princ "\n退出偏移命令")
         (exit)
       )
      )
      
      ;; 用户选择了对象
      ((= (type entity) 'LIST)
       (progn
         (setq ent-name (car entity))
         (setq ent-data (entget ent-name))
         (setq ent-type (cdr (assoc 0 ent-data)))
         
         ;; 检查是否为支持的线型
         (if (or (= ent-type "LINE")
               (= ent-type "LWPOLYLINE")
               (= ent-type "POLYLINE")
               (= ent-type "ARC")
               (= ent-type "CIRCLE")
             )
         (progn
             ;; 获取偏移方向
             (initget "左侧 Left 右侧 Right")
             (setq offset-side
               (getkword
               "\n指定偏移侧 [左侧(L)/右侧(R)] <右侧>: "
               )
             )
            
             ;; 默认右侧偏移
             (if (null offset-side)
               (setq offset-side "右侧")
             )
            
             ;; 执行偏移命令
             (command "_.OFFSET" *of-offset-distance* ent-name "" "")
            
             ;; 如果选择了左侧偏移,需要镜像
             (if (or (= offset-side "左侧") (= offset-side "Left"))
               (progn
               (princ "\n左侧偏移,正在调整方向...")
               ;; 这里可以根据需要添加额外的逻辑
               ;; 暂时使用标准偏移,方向由AutoCAD自动处理
               )
             )
            
             (princ (strcat "\n成功偏移 " ent-type " 对象"))
         )
         (princ "\n不支持的对象类型!请选择直线、多段线、圆弧或圆。")
         )
       )
      )
      
      ;; 用户取消或回车
      ((null entity)
       (progn
         (princ "\n退出偏移命令")
         (exit)
       )
      )
    )
)

;; 恢复系统变量
(setvar "CMDECHO" old-cmdecho)
(princ)
)

;;; 简化版本的偏移命令 - 直接偏移选中对象
(defun c:of-quick (/ entity offset-dist)
(setq old-cmdecho (getvar "CMDECHO"))
(setvar "CMDECHO" 0)

;; 使用上次距离或默认值
(if (not *of-offset-distance*)
    (setq *of-offset-distance* 10.0)
)

;; 选择对象
(setq entity (entsel "\n选择要偏移的对象: "))

(if entity
    (progn
      ;; 检查对象类型
      (setq ent-data (entget (car entity)))
      (setq ent-type (cdr (assoc 0 ent-data)))
      
      (if (or (= ent-type "LINE")
            (= ent-type "LWPOLYLINE")
            (= ent-type "POLYLINE")
            (= ent-type "ARC")
            (= ent-type "CIRCLE")
          )
      (progn
          ;; 获取偏移距离
          (initget 6)
          (setq offset-dist
            (getdist
            (strcat
                "\n指定偏移距离 <"
                (rtos *of-offset-distance* 2 2)
                ">: "
            )
            )
          )
         
          (if (null offset-dist)
            (setq offset-dist *of-offset-distance*)
            (setq *of-offset-distance* offset-dist)
          )
         
          ;; 执行偏移
          (command "_.OFFSET" offset-dist (car entity) "" "")
          (princ (strcat "\n成功偏移 " ent-type " 对象"))
      )
      (princ "\n不支持的对象类型!")
      )
    )
    (princ "\n未选择对象")
)

(setvar "CMDECHO" old-cmdecho)
(princ)
)

;;; 加载提示
(princ "\n偏移命令已加载:")
(princ "\nOF- 完整版偏移命令(支持设置距离)")
(princ "\nOF-QUICK - 快速偏移命令")
(princ "\n使用 S 选项可以设置偏移距离")
(princ)
页: [1]
查看完整版本: 怎么一次性偏移成如图这样呢,并且可以指偏移距离?