明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 68|回复: 2

函数:不用回车的超级GETPOINT

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
这个问题,继续完善下去:

我曾经发过一个帖子,但是不理想
http://bbs.mjtd.com/thread-193171-1-1.html
本次继续对这个问题,换思路写写,希望大家继续研究、探索
  1. ;Modify By SLdesign V3.0 尘缘一生 QQ:15290049
  2. ;不用回车的超级key&getpoint(非循环按键)-----(一级)-----
  3. ;ms前缀提示 ks键位提示
  4. ;返回表:(点  Key) 点击时 key=t
  5. ;(key_getpoint "\n 取点.方式->" "[实体(A)/钢筋砼(B)](左键,回车,右键,空格->取点)")
  6. (defun key_getpoint (ms ks / e_lst f8 f3 loop bb keylis p00 key p2 pt)
  7.   (setq ks (t-string-subst (slmsg "/正交(F8)/扑捉(F3)]" "/タユ(F8)/汲(F3)]" "/Orth(F8)/Osnap(F3)]") "]" ks))
  8.   (setq e_lst (sysvar '("OSMODE" "ORTHOMODE"))
  9.     keylis '((2 65) (2 97) ;A a
  10.               (2 66) (2 98) ;B b
  11.               (2 67) (2 99) ;C c
  12.               (2 100) (2 68) ;D d
  13.               (2 69) (2 101) ;E e
  14.               (2 70) (2 102) ;F f
  15.               (2 71) (2 103) ;G g
  16.               (2 72) (2 104) ;H h
  17.               (2 73) (2 105) ;I i
  18.               (2 74) (2 106) ;J j
  19.               (2 75) (2 107) ;K k
  20.               (2 76) (2 108) ;L l
  21.               (2 77) (2 109) ;M m
  22.               (2 78) (2 110) ;N n
  23.               (2 79) (2 111) ;O o
  24.               (2 80) (2 112) ;P p
  25.               (2 81) (2 113) ;Q q
  26.               (2 82) (2 114) ;Q q
  27.               (2 83) (2 115) ;S s
  28.               (2 84) (2 116) ;T t
  29.               (2 85) (2 117) ;U u
  30.               (2 86) (2 118) ;V v
  31.               (2 87) (2 119) ;W w
  32.               (2 88) (2 120) ;X x
  33.               (2 89) (2 121) ;Y y
  34.               (2 90) (2 122) ;Z z
  35.               (2 48) ;0
  36.               (2 49) ;1
  37.               (2 50) ;2
  38.               (2 51) ;3
  39.               (2 52) ;4
  40.               (2 53) ;5
  41.               (2 54) ;6
  42.               (2 55) ;7
  43.               (2 56) ;8
  44.               (2 57) ;9
  45.               (2 96) (2 126) ;`~键
  46.               (2 9) ;;table 键
  47.               (2 45) ;-
  48.               (2 43) (2 61);+=
  49.             )
  50.     loop t f8 (getvar "ORTHOMODE") f3 (getvar "OSMODE") p2 (cadr (grread 5))
  51.   )
  52.   (prompt (strcat ms ks))
  53.   (while loop
  54.     (setq bb (grread t 15 2) p00 (cadr bb))
  55.     (cond
  56.       ((equal bb '(2 6));F3切换捕捉开关
  57.         (cond
  58.           ((and (< f3 16384) (/= f3 0))
  59.             (setq f3 (+ f3 16384))
  60.             (prompt (slmsg "\n <对象捕捉 关>" "\n <癸禜 闽>" "\n <OSnap Off>"))
  61.           )
  62.           ((or (= f3 0) (>= f3 16384))
  63.             (setq f3 16383 f8 0)
  64.             (setvar "ORTHOMODE" f8)
  65.             (prompt (slmsg "\n <对象捕捉 开>" "\n <癸禜 秨>" "\n <OSnap On>"))
  66.           )
  67.         )
  68.         (setvar "OSMODE" f3) (redraw)
  69.       )   
  70.       ((equal bb '(2 15))    ;F8切换正交开关
  71.         (if (= f8 0)
  72.           (progn
  73.             (setq f8 1)
  74.             (if (and (< f3 16384) (/= f3 0))
  75.               (progn (setq f3 (+ f3 16384)) (setvar "OSMODE" f3))
  76.             )
  77.             (prompt (slmsg "\n <正交 开>" "\n <タユ 秨>" "\n <Orth open>"))
  78.           )
  79.           (progn (setq f8 0) (prompt (slmsg "\n <正交 关>" "\n <タユ 闽>" "\n <Orth off>")))
  80.         )
  81.         (setvar "ORTHOMODE" f8) (redraw)
  82.       )
  83.       ((= (car bb) 5)
  84.         (redraw)
  85.         (setq pt p00)
  86.         (if (= f8 1)
  87.           (if (< (abs (- (car p2) (car p00))) (abs (- (cadr p2) (cadr p00))))
  88.             (setq pt (list (car p2) (cadr p00)))
  89.             (setq pt (list (car p00) (cadr p2)))
  90.           )
  91.         )
  92.         (if (and (<= f3 16384) (> f3 0))
  93.           (setq pt (slosnappt nil pt))
  94.           (slslx pt 0)
  95.         )
  96.         (setq p00 pt)
  97.       )
  98.       ((member bb keylis)
  99.         (if (= (cadr bb) 9)
  100.           (setq key "TAB")
  101.           (setq key (strcase (chr (cadr bb))))
  102.         )
  103.         (setq p00 pt loop nil)
  104.       )
  105.       ((or (member bb '((2 13))) (= (car bb) 3) (member (car bb) '(11 25)) (member bb '((2 32))));;左键、回车、右键、空格,缺省退出
  106.         (setq p00 pt key t loop nil)
  107.       )
  108.     )
  109.   )
  110.   (redraw)
  111.   (mapcar 'eval e_lst)
  112.   (list p00 key)
  113. )


SLdesign 3.0  三领设计下载如下:

通过网盘分享的文件:三领设计
链接: https://pan.baidu.com/s/1iMwJD68IDQpbDfmGsdoQ-A?pwd=inxs 提取码: inxs

评分

参与人数 1明经币 +1 收起 理由
tranque + 1 很给力!

查看全部评分

回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层
让元宝AI给陈总的代码加了下注释和代码总结


总结:
这是一个高级的点取函数,主要特点包括:

智能输入:支持鼠标点取和键盘快捷键两种输入方式
实时反馈:光标移动时显示临时图形辅助定位
状态切换:F3切换对象捕捉,F8切换正交模式
多键支持:支持字母、数字、符号等多种快捷键
自动恢复:函数结束时自动恢复之前的系统设置
简洁交互:减少命令行文字显示,提供更直观的操作体验
这个函数常用于需要快速点选位置同时可能需要进行模式切换的CAD操作场景


注释版:
  1. (vl-load-com)  ;; 加载Visual LISP扩展功能,支持ActiveX对象操作

  2. ;==============================================================
  3. ; 函数名称:key_getpoint - 智能点取函数(支持键盘快捷键)
  4. ; 开发信息:Modify By SLdesign V3.0 尘缘一生 QQ:15290049
  5. ; 功能描述:不用回车的超级key&getpoint(非循环按键)-----(一级)-----
  6. ;           实现带键盘快捷键的点取功能,提高操作效率
  7. ; 参数说明:
  8. ;   ms - 主提示字符串(ms前缀提示)
  9. ;   ks - 按键提示字符串(ks键位提示)
  10. ; 返回值:返回表点 Key)
  11. ;          点击时 key=t,按快捷键时 key=对应的键名
  12. ; 使用示例:
  13. ;   (key_getpoint "\n 取点.方式->" "[实体(A)/钢筋砼(B)](左键,回车,右键,空格->取点)")
  14. ;==============================================================

  15. (defun key_getpoint (ms ks / e_lst f8 f3 loop bb keylis p00 key p2 pt)
  16.   ;; 初始化部分 ================================================
  17.   
  18.   ; 在按键提示字符串末尾添加正交和捕捉的状态提示
  19.   ; t-string-subst函数用于字符串替换,支持多语言显示
  20.   (setq ks (t-string-subst
  21.             (slmsg "/正交(F8)/捕捉(F3)]" "/タユ(F8)/汲(F3)]" "/Orth(F8)/Osnap(F3)]")
  22.             "]" ks))
  23.   
  24.   ; 保存当前的系统变量设置,函数结束时恢复
  25.   ; sysvar函数用于保存指定的系统变量值
  26.   (setq e_lst (sysvar '("OSMODE" "ORTHOMODE"))
  27.    
  28.     ; 定义可识别的快捷键列表
  29.     ; 格式:((类型码 键值) ...) 其中类型码2表示键盘输入
  30.     keylis '((2 65) (2 97)    ; A a
  31.               (2 66) (2 98)    ; B b
  32.               (2 67) (2 99)    ; C c
  33.               (2 100) (2 68)   ; D d
  34.               (2 69) (2 101)   ; E e
  35.               (2 70) (2 102)   ; F f
  36.               (2 71) (2 103)   ; G g
  37.               (2 72) (2 104)   ; H h
  38.               (2 73) (2 105)   ; I i
  39.               (2 74) (2 106)   ; J j
  40.               (2 75) (2 107)   ; K k
  41.               (2 76) (2 108)   ; L l
  42.               (2 77) (2 109)   ; M m
  43.               (2 78) (2 110)   ; N n
  44.               (2 79) (2 111)   ; O o
  45.               (2 80) (2 112)   ; P p
  46.               (2 81) (2 113)   ; Q q
  47.               (2 82) (2 114)   ; R r
  48.               (2 83) (2 115)   ; S s
  49.               (2 84) (2 116)   ; T t
  50.               (2 85) (2 117)   ; U u
  51.               (2 86) (2 118)   ; V v
  52.               (2 87) (2 119)   ; W w
  53.               (2 88) (2 120)   ; X x
  54.               (2 89) (2 121)   ; Y y
  55.               (2 90) (2 122)   ; Z z
  56.               (2 48)           ; 0
  57.               (2 49)           ; 1
  58.               (2 50)           ; 2
  59.               (2 51)           ; 3
  60.               (2 52)           ; 4
  61.               (2 53)           ; 5
  62.               (2 54)           ; 6
  63.               (2 55)           ; 7
  64.               (2 56)           ; 8
  65.               (2 57)           ; 9
  66.               (2 96) (2 126)   ; `~键
  67.               (2 9)            ; TAB键
  68.               (2 45)           ; - 减号键
  69.               (2 43) (2 61)    ; += 等号键
  70.             )
  71.    
  72.     ; 初始化循环控制变量和状态变量
  73.     loop t          ; 循环控制标志,初始为真(t)
  74.     f8 (getvar "ORTHOMODE")  ; 保存当前正交模式状态
  75.     f3 (getvar "OSMODE")     ; 保存当前对象捕捉模式状态
  76.     p2 (cadr (grread 5))     ; 预读鼠标位置(grread 5表示非阻塞读取)
  77.   )
  78.   
  79.   ; 在命令行显示提示信息
  80.   (prompt (strcat ms ks))
  81.   
  82.   ;; 主循环 ====================================================
  83.   (while loop
  84.     ; 等待用户输入:grread参数说明:
  85.     ;   t - 跟踪光标移动
  86.     ;   15 - 光标跟踪间隔(毫秒)
  87.     ;   2 - 返回光标坐标(非零值)
  88.     (setq bb (grread t 15 2)   ; bb包含输入类型和值
  89.           p00 (cadr bb))       ; p00保存当前的坐标点
  90.    
  91.     ; 条件判断:根据不同的输入类型执行相应操作
  92.     (cond
  93.       ;; F3键处理 - 切换对象捕捉开关 ===========================
  94.       ((equal bb '(2 6))  ; 2表示键盘输入,6是F3键的键值
  95.         (cond
  96.           ; 此处条件判断不完整,可能是代码有误,但保持原样
  97.           ((and (" "\n " "\n "))
  98.           )
  99.           ; 如果当前捕捉关闭或处于高级捕捉模式,则开启常规捕捉
  100.           ((or (= f3 0) (>= f3 16384))
  101.             (setq f3 16383  ; 设置为常用捕捉模式组合
  102.                   f8 0)     ; 关闭正交模式
  103.             (setvar "ORTHOMODE" f8)  ; 应用正交模式设置
  104.             (prompt (slmsg "\n " "\n " "\n "))  ; 显示状态提示
  105.           )
  106.         )
  107.         (setvar "OSMODE" f3)  ; 应用捕捉模式设置
  108.         (redraw)  ; 重绘图面,清除临时图形
  109.       )   
  110.       
  111.       ;; F8键处理 - 切换正交模式开关 ===========================
  112.       ((equal bb '(2 15))  ; 2表示键盘输入,15是F8键的键值
  113.         (if (= f8 0)  ; 如果当前正交关闭
  114.           (progn
  115.             (setq f8 1)  ; 开启正交模式
  116.             ; 此处条件判断不完整,可能是代码有误
  117.             (if (and (" "\n " "\n "))
  118.             )
  119.           )
  120.           (progn  ; 如果当前正交开启
  121.             (setq f8 0)  ; 关闭正交模式
  122.             (prompt (slmsg "\n " "\n " "\n "))  ; 显示状态提示
  123.           )
  124.         )
  125.         (setvar "ORTHOMODE" f8)  ; 应用正交模式设置
  126.         (redraw)  ; 重绘图面
  127.       )
  128.       
  129.       ;; 鼠标移动处理 - 类型5表示光标移动 ======================
  130.       ((= (car bb) 5)
  131.         (redraw)  ; 清除之前的临时图形
  132.         (setq pt p00)  ; 保存当前鼠标位置
  133.         
  134.         ; 如果正交模式开启
  135.         (if (= f8 1)
  136.           ; 此处条件判断不完整,可能是代码有误
  137.           (if ( f3 0))
  138.           ; 应用对象捕捉到当前点
  139.           (setq pt (slosnappt nil pt))
  140.         )
  141.         ; 绘制临时图形(可能是十字线或预览图形)
  142.         (slslx pt 0)
  143.         (setq p00 pt)  ; 更新当前点坐标
  144.       )
  145.       
  146.       ;; 快捷键处理 - 检查是否按下了定义的快捷键 ===============
  147.       ((member bb keylis)  ; 检查输入是否在快捷键列表中
  148.         ; 处理TAB键特殊情况
  149.         (if (= (cadr bb) 9)  ; 9是TAB键的键值
  150.           (setq key "TAB")    ; 特殊处理TAB键
  151.           (setq key (strcase (chr (cadr bb))))  ; 将键值转换为大写字符
  152.         )
  153.         (setq p00 pt    ; 保存当前点
  154.               loop nil)  ; 退出循环
  155.       )
  156.       
  157.       ;; 确认操作处理 - 左键、回车、右键、空格等 ==============
  158.       ((or (member bb '((2 13)))   ; 回车键
  159.            (= (car bb) 3)          ; 鼠标右键
  160.            (member (car bb) '(11 25))  ; 其他确认键
  161.            (member bb '((2 32)))   ; 空格键
  162.       )  
  163.         (setq p00 pt    ; 保存当前点
  164.               key t     ; 设置key为t,表示是点击确认
  165.               loop nil) ; 退出循环
  166.       )
  167.     )
  168.   )
  169.   
  170.   ;; 清理和返回 ================================================
  171.   (redraw)  ; 最终重绘,清除所有临时图形
  172.   
  173.   ; 恢复之前保存的系统变量设置
  174.   ; mapcar 'eval 逐个执行保存的恢复命令
  175.   (mapcar 'eval e_lst)
  176.   
  177.   ; 返回结果:(点坐标 按键标识)
  178.   (list p00 key)
  179. )


回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层
  1. (defun key_getpoint (ms ks / e_lst f8 f3 loop bb keylis p00 key p2 pt)

  2.   ;; 替换提示文本
  3.   (setq ks (t-string-subst
  4.             (slmsg "/正交(F8)/扑捉(F3)]"
  5.                    "/タユ(F8)/汲(F3)]"
  6.                    "/Orth(F8)/Osnap(F3)]")
  7.             "]" ks))

  8.   ;; 备份系统变量
  9.   (setq e_lst (sysvar '("OSMODE" "ORTHOMODE")))

  10.   ;; 所有按键列表(修复语法)
  11.   (setq keylis
  12.         '((2 65) (2 97)   ; A a
  13.           (2 66) (2 98)   ; B b
  14.           (2 67) (2 99)
  15.           (2 68) (2 100)
  16.           (2 69) (2 101)
  17.           (2 70) (2 102)
  18.           (2 71) (2 103)
  19.           (2 72) (2 104)
  20.           (2 73) (2 105)
  21.           (2 74) (2 106)
  22.           (2 75) (2 107)
  23.           (2 76) (2 108)
  24.           (2 77) (2 109)
  25.           (2 78) (2 110)
  26.           (2 79) (2 111)
  27.           (2 80) (2 112)
  28.           (2 81) (2 113)
  29.           (2 82) (2 114)
  30.           (2 83) (2 115)
  31.           (2 84) (2 116)
  32.           (2 85) (2 117)
  33.           (2 86) (2 118)
  34.           (2 87) (2 119)
  35.           (2 88) (2 120)
  36.           (2 89) (2 121)
  37.           (2 90) (2 122)
  38.           (2 48) (2 49) (2 50) (2 51) (2 52)
  39.           (2 53) (2 54) (2 55) (2 56) (2 57)
  40.           (2 96) (2 126)
  41.           (2 9)     ; TAB
  42.           (2 45)    ; -
  43.           (2 43) (2 61))) ; + and =

  44.   (setq loop t
  45.         f8 (getvar "ORTHOMODE")
  46.         f3 (getvar "OSMODE")
  47.         p2 (cadr (grread 5)))

  48.   (prompt (strcat ms ks))

  49.   (while loop
  50.     (setq bb  (grread t 15 2)
  51.           p00 (cadr bb))

  52.     (cond
  53.       ;; ---------------- F3 捕捉 --------------------
  54.       ((and (= (car bb) 2) (= (cadr bb) 6))
  55.        (if (and (< f3 16384) (/= f3 0))
  56.          (progn
  57.            (setq f3 (+ f3 16384))
  58.            (prompt (slmsg "\n <对象捕捉 关>"
  59.                            "\n <癸禜 闽>"
  60.                            "\n <OSnap Off>")))
  61.          (progn
  62.            (setq f3 16383  f8 0)
  63.            (setvar "ORTHOMODE" f8)
  64.            (prompt (slmsg "\n <对象捕捉 开>"
  65.                            "\n <癸禜 秨>"
  66.                            "\n <OSnap On>"))))
  67.        (setvar "OSMODE" f3) (redraw))

  68.       ;; ---------------- F8 正交 --------------------
  69.       ((and (= (car bb) 2) (= (cadr bb) 15))
  70.        (if (= f8 0)
  71.          (progn
  72.            (setq f8 1)
  73.            (if (and (< f3 16384) (/= f3 0))
  74.              (setq f3 (+ f3 16384)))
  75.            (setvar "OSMODE" f3)
  76.            (prompt (slmsg "\n <正交 开>"
  77.                            "\n <タユ 秨>"
  78.                            "\n <Orth open>")))
  79.          (progn
  80.            (setq f8 0)
  81.            (prompt (slmsg "\n <正交 关>"
  82.                            "\n <タユ 闽>"
  83.                            "\n <Orth off>"))))
  84.        (setvar "ORTHOMODE" f8) (redraw))

  85.       ;; ---------------- 鼠标移动 --------------------
  86.       ((= (car bb) 5)
  87.        (redraw)
  88.        (setq pt p00)
  89.        ;; 正交
  90.        (if (= f8 1)
  91.          (setq pt (if (< (abs (- (car p2) (car p00)))
  92.                          (abs (- (cadr p2) (cadr p00))))
  93.                      (list (car p2)  (cadr p00))
  94.                      (list (car p00) (cadr p2)))))

  95.        ;; 捕捉
  96.        (if (and (<= f3 16384) (> f3 0))
  97.          (setq pt (slosnappt nil pt))
  98.          (slslx pt 0))

  99.        (setq p00 pt))

  100.       ;; ---------------- 键盘字母/数字 --------------------
  101.       ((vl-some '(lambda (x) (equal x bb)) keylis)
  102.        (setq key (if (= (cadr bb) 9)
  103.                    "TAB"
  104.                    (strcase (chr (cadr bb)))))
  105.        (setq p00 pt loop nil))

  106.       ;; ---------------- 退出(左键/回车/右键/空格) --------------------
  107.       ((or
  108.         (and (= (car bb) 2) (= (cadr bb) 13)) ; 回车
  109.         (= (car bb) 3)                       ; 右键
  110.         (member (car bb) '(11 25))
  111.         (and (= (car bb) 2) (= (cadr bb) 32)) ; 空格
  112.         (= (car bb) 3))
  113.        (setq p00 pt key t loop nil))
  114.     )
  115.   )

  116.   (redraw)
  117.   (mapcar 'eval e_lst)
  118.   (list p00 key)
  119. )
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-11-24 13:45 , Processed in 0.196089 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表