明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 8381|回复: 46

[源码] cad输入法自动切换程序[热键版修改]

    [复制链接]
发表于 2021-5-19 10:11 | 显示全部楼层 |阅读模式
本帖最后由 guangdonglbq 于 2021-6-6 19:04 编辑

    原版源码在个贴子:  http://bbs.mjtd.com/thread-176934-1-1.htmlhttp://bbs.mjtd.com/thread-183157-1-1.html
    原程序思路很好,本程序主要是根据个人的习惯修改了一下。
    另外,有些二开的程序也会在代码中运行文本编辑相关的命令,这时自动切换输入法功能会造成软件卡钝,因此本程序添加在执行lisp代码前,关闭自动自动切换输入法,并在lisp程序执行结束后重新开启的功能。   根据大家的反馈意见,修改后的源码如下:


;;cad输入法自动切换程序,打开dwg文件时,运行一次即可
;;请在操作系统中设置输入法热键:ctrl+shift+1为英文,ctrl+shift+2为中文
;;修改日期:2021年06月06日
(vl-load-reactors)
(setq Scriptshell (vlax-create-object "WScript.Shell"))

(defun StartEnglishInputMethod(reactor_object listCommand )
        (StartInputMethod (car listCommand) "+^1" )
)

(defun StartChineseInputMethod(reactor_object listCommand )
        (StartInputMethod (car listCommand)  "+^2")
)

(defun StartInputMethod(strCommand strInputMethodKey / listEditCommands)
        (setq strCommand (strcase strCommand T) )
        (setq strCommand (vl-string-subst "" "-" strCommand))
        (setq strCommand (vl-string-subst "" "_" strCommand))
        (setq listEditCommands (list "mtedit" "ddedit" "textedit" "text" "mtext" "leader" "mleader" "tobjedit" "saveas" "tsaveas" "eattedit"))
  (if (member strCommand listEditCommands)
                (vlax-invoke Scriptshell "SendKeys" strInputMethodKey)
  )  
)
;鼠标双击
(defun onMouseDoubleClick (a b / en end entype )
  (if (setq en (nentselp (trans (car b) 0 1)))
    (progn
      (setq end (entget (car en)))
      (setq entype (cdr (assoc 0 end)))
      (if (wcmatch entype "*TEXT")
       (vlax-invoke Scriptshell "SendKeys"  "+^2")
      )
    )
  )
  (princ)
)

(defun startIMEScript(a b)
(vlr-command-reactor nil
        '((:vlr-commandWillStart . StartChineseInputMethod) ;;启动CAD命令时
                 (:vlr-commandEnded . StartEnglishInputMethod) ;;完成CAD命令时
                 (:vlr-commandCancelled . StartEnglishInputMethod) ;;取消CAD命令时
                 (:vlr-commandFailed . StartEnglishInputMethod) ;;无法完成CAD命令时
         )                
)
)

(defun EndIMEScript(a b )
        (vlr-remove-all :vlr-command-reactor)
)

(startIMEScript nil nil)

(vlr-mouse-reactor nil '((:vlr-beginDoubleClick . onMouseDoubleClick)))       ;鼠标反应器-双击事件
(vlr-lisp-reactor nil
        '((:vlr-lispWillStart . EndIMEScript) ;;启动lisp时
                 (:vlr-lispEnded . startIMEScript) ;;完成lisp时
                 (:vlr-lispCancelled . startIMEScript) ;;取消lisp时
         )                
)

(vlax-invoke Scriptshell "SendKeys" "+^1") ;加载时,启用英文输入法
(princ)



评分

参与人数 3明经币 +3 收起 理由
love1030312 + 1 赞一个!
ddbegg + 1 赞一个!
断箭 + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2022-8-29 07:49 | 显示全部楼层
唯一的缺点就是系统设好的输入法快捷键总是变
回复 支持 1 反对 1

使用道具 举报

发表于 2021-11-23 10:19 | 显示全部楼层
;请在操作系统中设置输入法热键:ctrl+shift+1为英文,ctrl+shift+2为中文

居然找不到设置的地方

回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-5-20 15:53 | 显示全部楼层
本帖最后由 guangdonglbq 于 2021-5-20 16:00 编辑

下面的代码增加了打开dwg时,切换为英文输入法的功能




;;cad输入法自动切换程序,打开dwg文件时,运行一次即可

;;请在操作系统中设置输入法热键:ctrl+shift+1为英文,ctrl+shift+2为中文
(vl-load-reactors)
(setq Scriptshell (vlax-create-object "WScript.Shell"))


(defun StartEnglishInputMethod(reactor_object listCommand )
        (StartInputMethod (car listCommand) "+^1" )
)


(defun StartChineseInputMethod(reactor_object listCommand )
        (StartInputMethod (car listCommand)  "+^2")
)


(defun StartInputMethod(strCommand strInputMethodKey / listEditCommands)
        (setq strCommand (strcase strCommand T) )
        (setq strCommand (vl-string-subst "" "-" strCommand))
        (setq strCommand (vl-string-subst "" "_" strCommand))
        (setq listEditCommands (list "mtedit" "ddedit" "textedit" "text" "mtext" "leader" "mleader" ))
  (if (member strCommand listEditCommands)
                (vlax-invoke Scriptshell "SendKeys" strInputMethodKey)
  )  
)


(defun startIMEScript(a b)
(vlr-command-reactor nil
        '((:vlr-commandWillStart . StartChineseInputMethod) ;;启动CAD命令时
                 (:vlr-commandEnded . StartEnglishInputMethod) ;;完成CAD命令时
                 (:vlr-commandCancelled . StartEnglishInputMethod) ;;取消CAD命令时
                 (:vlr-commandFailed . StartEnglishInputMethod) ;;无法完成CAD命令时
         )                 
)
)

(defun EndIMEScript(a b )
        (vlr-remove-all :vlr-command-reactor)
)

(startIMEScript nil nil)

(vlax-invoke Scriptshell "SendKeys" "+^1") ;加载时,启用英文输入法

(vlr-lisp-reactor nil
        '((:vlr-lispWillStart . EndIMEScript) ;;启动lisp时
                 (:vlr-lispEnded . startIMEScript) ;;完成lisp时
                 (:vlr-lispCancelled . startIMEScript) ;;取消lisp时
         )                 
)
(princ)

回复 支持 1 反对 0

使用道具 举报

发表于 2021-5-19 11:17 | 显示全部楼层
不错,解决了原版使用中的两个BUG

(1、ctrl+z 不能连续撤销,2、空白处双击也弹出中文输入法就需要手动设置英文输入法)
发表于 2021-5-19 15:01 | 显示全部楼层
这个最好用了
发表于 2021-5-20 08:37 | 显示全部楼层
真的很好用嘛
发表于 2021-5-20 09:21 | 显示全部楼层
本帖最后由 zhangcn 于 2021-5-20 09:55 编辑

能不能加一个功能 win10 系统环境,CAD启动后自动切换英文输入法,(比如我的win10系统用“微软五笔”输入法默认是中文输入,CAD打开时就是中文输入法,需要手动切换到英文一次)

发表于 2021-5-20 09:37 | 显示全部楼层
作图神器!谢谢
发表于 2021-5-20 10:26 | 显示全部楼层
感谢分享,MARK一下
发表于 2021-5-20 12:06 | 显示全部楼层
zhangcn 发表于 2021-5-20 09:21
能不能加一个功能 win10 系统环境,CAD启动后自动切换英文输入法,(比如我的win10系统用“微软五笔”输入 ...

这个提议真心不错,希望楼主出手
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-5 03:21 , Processed in 0.562505 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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