本帖最后由 277283904 于 2025-12-6 11:55 编辑
如图:就是一次性从蓝色线向外偏移到绿色线,又可以一次性向内从蓝色线偏移到红色线,并且可以指偏移距离?网友答: 这个超简单的;我要是写出来收费;肯定会被骂的;不收费我没动力。
给你半成品 拿去改把
网友答:
如图:就是一次性从蓝色线向外偏移到绿色线,又可以一次性向内从蓝色线偏移到红色线,并且可以指偏移距离?网友答: 这个超简单的;我要是写出来收费;肯定会被骂的;不收费我没动力。
给你半成品 拿去改把

- ;;; 偏移命令 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 "\n OF - 完整版偏移命令(支持设置距离)")
- (princ "\n OF-QUICK - 快速偏移命令")
- (princ "\n使用 S 选项可以设置偏移距离")
- (princ)

- (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)
- )