尘缘一生 发表于 2023-6-26 21:29:07

Grread+F3+F8 的事

本帖最后由 尘缘一生 于 2023-6-27 13:25 编辑

如题,经过磨合,现把 《三领设计 V3.0》中的整合,简化发下,
链接:https://pan.baidu.com/s/1t7tNGZiH1kZuLVmtOPzcnA
提取码:keqt
因为 grread整合正交与扑捉,不好办
尚有遗憾,那就是正交时候,由于点位相同,水平与垂直转换,不易控制方向,

[*]

[*];;移动-拷贝-旋转-镜像-递增-放缩------(一级)---------
[*];;三领集成by QQ:15290049 <简化版>
[*];;ss:实体、实体表、选择集 p0 移动起点 nil | k: t(move) nil(copy)
[*](defun sldomov (ss p0 k / e_lst pt pt1 loop ang dis f3 f8 bb p00)
[*];;(setq e_lst (sysvar '("QAFLAGS" "CMDECHO" "NOMUTT" "OSMODE" "ORTHOMODE")))
[*](cond
[*]    ((= (type ss) 'ENAME) (setq ss (ssadd ss))) ;图元
[*]    ((= (type ss) 'LIST) (setq ss (sl:pickset-fromlist ss))) ;实体表
[*])
[*](command "_.undo" "be") ;;舍弃高级代码,加速
[*](setvar "cmdecho" 0) ;;命令显示关闭
[*](setvar "nomutt" 1)
[*](setvar "qaflags" 0)
[*](if (= p0 nil) (setq p0 (cadr (grread 5))))
[*](if (= k nil) ;;复制
[*]    (princ
[*]      (strcat "\n->[逆转90度(TAB)/取角(A)/<-mir->(D)/↑mir ↓(S)/放大(Q)/缩小(W)/递增(Z)/递减(J)/大一倍(+)/小一半(-)][空格d=->1复制][左键.复制当前][右键/其余键.退出]")
[*]    )
[*]    (princ
[*]      (strcat "\n->[逆转90度(TAB)/取角(A)/<-mir->(D)/↑mir ↓(S)/放大(Q)/缩小(W)/递增(Z)/递减(J)/大一倍(+)/小一半(-)/复制当前(C)][空格d=->1复制][左键.复制当前][右键/其余键.退出]")
[*]    )
[*])
[*](setq loop t pt1 p0 f8 (getvar "ORTHOMODE") f3 (getvar "OSMODE"))
[*](while loop
[*]    (setq bb (grread t 15 2) p00 (cadr bb))
[*]    (cond
[*]      ((equal bb '(2 6));F3切换捕捉开关
[*]      (cond
[*]          ((and (< f3 16384) (/= f3 0))
[*]            (setq f3 (+ f3 16384))
[*]            (prompt "\n <对象捕捉 关>")
[*]          )
[*]          ((or (= f3 0) (>= f3 16384))
[*]            (setq f3 16383)
[*]            (prompt "\n <对象捕捉 开>")
[*]          )
[*]      )
[*]      (setvar "OSMODE" f3) (redraw)
[*]      )   
[*]      ((equal bb '(2 15))    ;F8切换正交开关
[*]      (if (= f8 0)
[*]          (progn (setq f8 1) (prompt "\n <正交 开>"))
[*]          (progn (setq f8 0) (prompt "\n <正交 关>"))
[*]      )
[*]      (setvar "ORTHOMODE" f8) (redraw)
[*]      )
[*]      ((= (car bb) 5)
[*]      (redraw)
[*]      (setq pt p00)
[*]      (if (= f8 1)
[*]          (if (< (abs (- (car p00) (car p0))) (abs (- (cadr p00) (cadr p0))))
[*]            (setq pt (list (car p00) (cadr p0)))
[*]            (setq pt (list (car p0)(cadr p00)))
[*]          )
[*]      )
[*]      (if (> (/ (distance p0 p00) (getvar "VIEWSIZE")) 0.001) ;此处意在减小刷新频率
[*]          (progn
[*]            (command "move" ss "" "_non" p0 "_non" pt)
[*]            (if (and (<= f3 16384) (> f3 0))
[*]            (setq p0 (osnappt ss (ssmpt ss)))
[*]            (setq p0 pt)
[*]            )
[*]          )
[*]      )
[*]      )
[*]      ((member bb '((2 9)))      ;;table 键
[*]      (command "ROTATE" ss "" "_non" pt 90)
[*]      ;(setq ss (sl-wzgz ss))
[*]      )
[*]      ((member bb '((2 65) (2 97)))   ;;A 旋转定角
[*]      (command "ROTATE" ss "" "_non" pt pause)
[*]      ;(setq ss (sl-wzgz ss))
[*]      )
[*]      ((member bb '((2 115) (2 83)));;S s 上下翻
[*]      (command "mirror" ss "" "_non" pt (mapcar '- pt '(1 0)) "Y")
[*]      )
[*]      ((member bb '((2 100) (2 68))) ;;D d 左右翻
[*]      (command "mirror" ss "" "_non" pt (mapcar '- pt '(0 1)) "Y")
[*]      )
[*]      ((or (member bb '((2 13))) (= (car bb) 3));;左键、回车
[*]      (if (= k t) ;;移动
[*]          (setq loop nil)
[*]          (progn
[*]            (command "copy" ss "" "_non" '(0 0) "_non" '(0 0))
[*]            (setq ang (angle pt1 pt) dis (distance pt1 pt) pt1 pt)
[*]          )
[*]      )
[*]      )
[*]      ((member bb '((2 67) (2 99)))   ;;C c 复制在当前
[*]      (command "copy" ss "" "_non" '(0 0) "_non" '(0 0))
[*]      (setq ang (angle pt1 pt) dis (distance pt1 pt) pt1 pt)
[*]      )
[*]      ((member bb '((2 32))) ;;空格键
[*]      (command "copy" ss "" "_non" '(0 0) "_non" '(0 0))
[*]      (command "MOVE" ss "" "_non" pt1 "_non" (setq pt1 (polar pt1 ang dis))) ;;移位
[*]      )
[*]      ((member bb '((2 87) (2 119)))         ;;缩小W w
[*]      (command "scale" ss "" "_non" pt "0.9")
[*]      )
[*]      ((member bb '((2 81) (2 113)))         ;;放大Q q
[*]      (command "scale" ss "" "_non" pt "1.1")
[*]      )
[*]      ((equal bb '(2 45))         ;;缩小一半 -
[*]      (command "scale" ss "" "_non" pt "0.5")
[*]      )
[*]      ((member bb '((2 43) (2 61))) ;;放大一倍 +
[*]      (command "scale" ss "" "_non" pt "2.0")
[*]      )
[*]      ;((member bb '((2 90) (2 122)));; 递增 Z z
[*]      ;(setq ss (ss++ ss 1))
[*]      ;)
[*]      ;((member bb '((2 74) (2 106)));; 递减 J j
[*]      ;(setq ss (ss++ ss -1))
[*]      ;)
[*]      ((or t (member (car bb) '(11 25)));;右键 其余键
[*]      (if (= k t) ;;移动
[*]          (command "MOVE" ss "" "_non" pt "_non" p0);;移回去
[*]          (sl:-erase ss)
[*]      )
[*]      (setq loop nil)
[*]      )
[*]    )
[*])
[*](redraw)
[*](command "_.undo" "e")
[*];;;(mapcar 'eval e_lst)
[*](princ)
[*])
[*];;对以下扑捉函数,需要再提高点位准确性,也是遗憾之
[*];;grread图元捕捉子函数-----(一级)------
[*];;name为移动的图元、选择集,pt为光标点
[*];;有捕捉点则返回捕捉点,无返回光标点
[*](defun osnappt (name pt / color d h k lst nearpt p0 osmo pt1 pt2 pt3 pt4 pt5 ptx pty x)
[*](cond
[*]    ((= (type name) 'ENAME) (entdel name)) ;图元先删除
[*]    ((= (type name) 'PICKSET) ;选择集
[*]      (sl-sel-redrawsel name 2) ;先隐藏
[*]    )
[*])
[*](redraw)
[*](if (< (getvar "OSMODE") 16384) ;;打开捕捉
[*]    (progn
[*]      (setq color (vla-get-autosnapmarkercolor (vla-get-drafting (vla-get-preferences *Acad*)))
[*]      h (p2uu 1.0) d (getvar "PICKBOX")
[*]      lst (list (* d h) (* (- d 0.5) h) (* (+ d 0.5) h)) k (* 1.5 d h)
[*]      )
[*]      (if (setq nearpt (osnap pt "_END,_CEN,_NOD,_QUA,_INS,_PER,_TAN,_APP,_EXT,_PAR"))
[*]      (setq osmo 1)
[*]      )
[*]      (if (and (setq p0 (osnap pt "_NEA")) (not (equal nearpt p0 k)))
[*]      (setq osmo 2 nearpt p0)
[*]      )
[*]      (if (and (setq p0 (osnap pt "_MID")) (equal nearpt p0 k))
[*]      (setq osmo 3 nearpt p0)
[*]      )
[*]      (if (and (setq p0 (osnap pt "_INT")) (equal nearpt p0 k))
[*]      (setq osmo 4 nearpt p0)
[*]      )
[*]    )
[*])
[*](cond
[*]    ((= (type name) 'ENAME) (entdel name)) ;图元恢复
[*]    ((= (type name) 'PICKSET) ;选择集
[*]      (sl-sel-redrawsel name 1) ;恢复显示
[*]    )
[*])
[*](if nearpt
[*]    (progn
[*]      (setq ptx (car nearpt) pty (cadr nearpt))
[*]      (foreach x lst
[*]      (setq pt1 (list (- ptx x) (- pty x)) pt2 (list (+ ptx x) (- pty x))
[*]          pt3 (list (+ ptx x) (+ pty x)) pt4 (list (- ptx x) (+ pty x))
[*]          pt5 (list ptx (+ pty x))
[*]      )
[*]      (cond
[*]          ((= osmo 1) (grvecs (list color pt1 pt2 pt2 pt3 pt3 pt4 pt4 pt1)))
[*]          ((= osmo 2) (grvecs (list color pt1 pt2 pt2 pt4 pt3 pt4 pt3 pt1)))
[*]          ((= osmo 3) (grvecs (list color pt1 pt2 pt2 pt5 pt5 pt1)))
[*]          ((= osmo 4) (grvecs (list color pt1 pt3 color pt2 pt4)))
[*]      )
[*]      )
[*]      (setq pt nearpt)
[*]    )
[*])
[*]pt
[*])
[*]
[*];;重画选择集中的对象-----(一级)-----
[*];;Sel为选择集或图元名; mode为方式码
[*];;mode 1 在屏幕重画该选择集对象
[*];;mode 2 隐藏该选择集对象
[*];;mode 3 <醒目显示> 该选择集对象
[*];;mode 4 取消<醒目显示>该选择集对象
[*](defun sl-sel-redrawsel (sel mode / n)
[*](if sel
[*]    (cond
[*]      ((= 'PICKSET (type sel))
[*]      (repeat (setq n (sslength sel))
[*]          (redraw (ssname sel (setq n (1- n))) mode)
[*]      )
[*]      )
[*]      ((= 'ENAME (type sel))
[*]      (redraw sel mode)
[*]      )
[*]    )
[*])
[*]t
[*])
页: [1]
查看完整版本: Grread+F3+F8 的事