概述
WPS.lsp或CPS.lsp宏命令是一个AutoCAD LISP脚本,用于选择一个圆或多段线,并在命令行中生成一系列点。这些点可以是圆上的等间距点或多段线上的顶点。此外,该宏还集成了移动命令,允许用户直接移动上一次选择的对象。
其中WP代表CAD中的圈选,CP代表CAD中的圈交。
使用说明
步骤
- 加载宏:将此LISP代码保存为
.lsp
文件,并使用AutoCAD的APPLOAD
命令加载该文件。 - 执行命令:在AutoCAD命令行中输入
WPS
并按回车键执行该宏。 - 选择对象:当提示“Pick a circle or polyline: ”时,选择一个圆或多段线对象。
- 移动对象:生成点后,宏会自动调用
move
命令,并使用_p
参数选择上一次选择的对象,以便用户可以直接进行移动操作。 - 继续手动选择对象,或者直接回车。完成移动
参数
_p
:这是一个特殊的AutoCAD参数,用于在move
命令中选择上一次选择的对象。
代码解释(以WPS.lsp为例)
WPS.lsp代码成果
;(use the WPS command or 'WPS inside an object selection prompt)
(defun C:WPS ( / i elist at cmde cen rad p1)
(setq cmde (getvar "cmdecho"))
(setvar "cmdecho" 1)
(setq i 0 elist (entget (car (entsel "\nPick a circle or polyline: "))))
(setvar "OSMODE" (boole 7 (getvar "OSMODE") 16384))
(if (zerop (getvar "CMDACTIVE")) (command "_select"))
(command "_wp") ; or _CP
(if (= (cdr(assoc 0 elist)) "CIRCLE")
(progn
(setq cen (cdr (assoc 10 elist))
rad (cdr (assoc 40 elist))
)
(repeat 90 ; 360/4 0.06981317=4*pi/180
(setq p1 (polar cen (* i 0.06981317) rad) i (1+ i))
; (command "_POINT" (trans p1 0 1))
(command (trans p1 0 1))
)); else
(repeat (length elist)
(setq at (nth i elist) i (1+ i))
; (if (= (car at) 10) (command (cdr at)))
(if (= (car at) 10) (command (trans (cdr at) 0 1)))
)
);if CIRCLE
(command "")
(command "")
(command "move" "_p")
(setvar "OSMODE" (boole 2 (getvar "OSMODE") 16384))
(setvar "cmdecho" cmde)
(princ)
)
lisp代码解读
;Polyline/circle select - www.xanadu.cz - www.cadforum.cz
;(use the WPS command or 'WPS inside an object selection prompt)
(defun C:WPS ( / i elist at cmde cen rad p1)
; 保存当前的cmdecho状态,并设置为1以显示命令行回显
(setq cmde (getvar "cmdecho"))
(setvar "cmdecho" 1)
; 初始化变量
(setq i 0 elist (entget (car (entsel "\nPick a circle or polyline: "))))
; 修改OSMODE系统变量,允许在对象选择时使用窗口选择
(setvar "OSMODE" (boole 7 (getvar "OSMODE") 16384))
; 如果没有活动命令,则执行_select命令
(if (zerop (getvar "CMDACTIVE")) (command "_select"))
; 执行_wp命令,用于选择窗口
(command "_wp") ; or _CP
; 检查选择的对象是否为圆
(if (= (cdr(assoc 0 elist)) "CIRCLE")
(progn
; 提取圆心和半径
(setq cen (cdr (assoc 10 elist))
rad (cdr (assoc 40 elist)))
; 在圆上生成90个点
(repeat 90 ; 360/4 0.06981317=4*pi/180
(setq p1 (polar cen (* i 0.06981317) rad) i (1+ i))
; 将点添加到绘图中
(command (trans p1 0 1))
)); else
; 如果选择的是多段线,则生成顶点
(repeat (length elist)
(setq at (nth i elist) i (1+ i))
; 将顶点添加到绘图中
(if (= (car at) 10) (command (trans (cdr at) 0 1)))
)
);if CIRCLE
; 清除当前选择集
(command "")
; 调用move命令并选择上一次的对象
(command "move" "_p")
; 恢复OSMODE和cmdecho的原始状态
(setvar "OSMODE" (boole 2 (getvar "OSMODE") 16384))
(setvar "cmdecho" cmde)
; 结束命令
(princ)
)
注意事项
- 确保在执行此宏之前,您的AutoCAD环境支持LISP脚本。
- 此宏假设用户将选择一个有效的圆或多段线对象。
- 宏中的
move
命令将自动选择上一次的对象,用户需要手动指定移动的基点和目标点。