选择集:定点、角度动态4镜像(源码)
本帖最后由 尘缘一生 于 2022-12-18 10:45 编辑分享函数,灵活运用,可以做出非常玄的效果
[*];移除嵌套表中的所有nil元素----(一级)------
[*];;(remove-nil '("毛主席" (1 nil 2 nil 3) nil (nil nil (nil) )))
[*](defun remove-nil (lst)
[*](if (= (type lst) 'list)
[*] (vl-remove nil (mapcar 'remove-nil (vl-remove nil lst)))
[*] lst
[*])
[*])
[*];;存储系统变量-------(一级)--------------
[*];;lis 系统变量表 '("osmode" "cmdecho" "ORTHOMODE")
[*](defun sysvar (lis / n)
[*](setq e_lst (remove-nil (mapcar (function (lambda (n) (if (getvar n) (list 'setvar n (getvar n))))) lis)))
[*]e_lst
[*])
[*];;4等分象限函数-----(一级)-------
[*];;p0 定点p1 位置落在不同象限,返回 1 2 3 4
[*](defun sl-4p (p0 p1 / x0 y0 x1 y1) ;;象限
[*](setq x0 (car p0) y0 (cadr p0) x1 (car p1) y1 (cadr p1))
[*](if (> x1 x0)
[*] (if (> y1 y0) (setq xx 1) (setq xx 4))
[*] (if (> y1 y0) (setq xx 2) (setq xx 3))
[*])
[*]xx
[*])
[*];;动态选择集 基点 角度 MIRROR------(一级)-----
[*];ang 为初始角度
[*](defun dtmirr (ss p0 ang / gr p1 e_lst px py dqxx xx)
[*](setq e_lst (sysvar '("osmode" "cmdecho" "ORTHOMODE")))
[*](setvar "cmdecho" 0)
[*](setvar "OSMODE" 0) ;;捕捉关闭
[*](setvar "ORTHOMODE" 0) ;;正交关闭
[*](if (= p0 nil)
[*] (setq p0 (cadr (grread 5))) ;;P0点为nil时,取选择集中心,测试失败,原因不明
[*])
[*](setq px (polar p0 ang 50) py (polar p0 (+ ang pi2) 50) dqxx 1)
[*](while (and (setq gr (grread t 15 2) p1 (cadr gr)) (= (car gr) 5))
[*] (setq xx (sl-4p p0 p1))
[*] (redraw)
[*] (grdraw p0 p1 3 2)
[*] ;;(slslx p0 ang) ;点p0处,以ang角度显示交叉矢量线
[*] (if (/= dqxx xx)
[*] (progn
[*] (if (= dqxx 1)
[*] (cond
[*] ((= xx 2)(command "mirror" ss "" p0 py "y"))
[*] ((= xx 3)(command "mirror" ss "" p0 py "y")(command "mirror" ss "" p0 px "y"))
[*] ((= xx 4)(command "mirror" ss "" p0 px "y"))
[*] )
[*] )
[*] (if (= dqxx 2)
[*] (cond
[*] ((= xx 1)(command "mirror" ss "" p0 py "y"))
[*] ((= xx 3)(command "mirror" ss "" p0 px "y"))
[*] ((= xx 4)(command "mirror" ss "" p0 py "y")(command "mirror" ss "" p0 px "y"))
[*] )
[*] )
[*] (if (= dqxx 3)
[*] (cond
[*] ((= xx 1)(command "mirror" ss "" p0 py "y")(command "mirror" ss "" p0 px "y"))
[*] ((= xx 2)(command "mirror" ss "" p0 px "y"))
[*] ((= xx 4)(command "mirror" ss "" p0 py "y"))
[*] )
[*] )
[*] (if (= dqxx 4)
[*] (cond
[*] ((= xx 1)(command "mirror" ss "" p0 px "y"))
[*] ((= xx 2)(command "mirror" ss "" p0 py "y")(command "mirror" ss "" p0 px "y"))
[*] ((= xx 3)(command "mirror" ss "" p0 py "y"))
[*] )
[*] )
[*] )
[*] )
[*] (setq dqxx xx)
[*])
[*](redraw)
[*](mapcar 'eval e_lst)
[*](princ)
[*])
感谢楼主分享,非常好的功能函数 大师,能不能给个完整的图块原地镜像的例子,我这边写的不成功,参数少
(DEFUN C:tt6 (/obj p0 ang1)
(princ "\n选择对象定点角度动态镜像:")
(setq obj (ssget))
(setq ang1 0)
(dtmirr obj p0 ang1)
)
页:
[1]