尘缘一生 发表于 2022-12-18 10:16:06

选择集:定点、角度动态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)
[*])











技术工作室 发表于 2022-12-19 07:59:28

不一样地设计 发表于 2023-8-17 14:13:38

感谢楼主分享,非常好的功能函数

不一样地设计 发表于 2023-8-17 16:35:39

大师,能不能给个完整的图块原地镜像的例子,我这边写的不成功,参数少
(DEFUN C:tt6 (/obj p0 ang1)
(princ "\n选择对象定点角度动态镜像:")
(setq obj (ssget))                  
(setq ang1 0)
(dtmirr obj p0 ang1)
)
页: [1]
查看完整版本: 选择集:定点、角度动态4镜像(源码)