grread函数的应用非常广泛,论坛里的例子也不少。
grread函数也有不足,就是精确输入,比如通过grread函数拖动输入一个距p1点距离为12.5的点,做起来还是有难度的。
这里自定义了一个函数,可以解决这个问题:
 - (defun cs-int-grdata (lst / FLAG)
- (cond
- ((= (type lst) 'list)
- (mapcar 'cs-int-grdata lst)
- )
- ((member (type lst) '(int REAL))
- (setq flag 0)
- (and (ACET-SYS-CONTROL-DOWN) (setq flag (+ flag 2)))
- (and (ACET-SYS-SHIFT-DOWN) (setq flag (+ flag 4)))
- (CS-INT lst (cdr (assoc flag '((0 . 0.1) (2 . 0.5) (4 . 5) (6 . 10)))))
- )
- (t lst)
- )
- )
其中的CS-INT函数,请参考
http://bbs.mjtd.com/thread-173452-grread函数 1-1.html
用grread函数拖动,得出的坐标点或距离或角度等数不一定是我们想要的数据,如果加入cs-int-grdata函数进行处理,就很容易得到我们想要的数据
示例:
 - (defun tt (p1 / DIS PT)
- (princ "\n")
- (while (/= 3 (car (setq pt (grread t 4 0))))
- (if (= 5 (car pt))
- (progn
- (setq pt (cadr pt))
- (setq dis (cs-int-grdata (distance p1 pt)))
- (redraw)
- (grdraw p1 pt 1 1)
- (princ (strcat "\r距离为:" (rtos dis)))
- )
- )
- )
- (princ "\r")
- (redraw)
- (if (= 3 (car pt))
- (setq dis (cs-int-grdata (distance p1 (cadr pt))))
- )
- )
运行函数tt时,只拖动鼠标,命令行提示的距离按0.1进行圆整
拖动鼠标的同时,按下ctrl键,命令行提示的距离按0.5进行圆整
拖动鼠标的同时,按下shift键,命令行提示的距离按5进行圆整
拖动鼠标的同时,按下shift和Ctrl键,命令行提示的距离按10进行圆整
|