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