tryhi 发表于 2018-7-17 17:35:36

使用反应器定义无限多种虚拟命令

本帖最后由 tryhi 于 2020-3-5 10:15 编辑



标题很难准确表达帖子要说的东西,先看一下这个动画,注意输入的命令,实现SC后面直接带数字来进行缩放,可以达到减少绘图过程中右手鼠标与键盘的之间切换频率,这个例子可以玩出很多花样来,如果配合正则表达式,效果将更好。(注:感谢群友远影、惊惊等提供了宝贵的意见)

;定义未知命令反应器例子---BY:tryhi-大海
;;命令反应器定义直接带数字缩放
(vl-load-com)
(or *lispvlr*
(setq *lispvlr* (vlr-command-reactor nil '((:vlr-unknownCommand . _wzml_vlr))));定义未知命令反应器
)
(defun _wzml_vlr (vlrobj data / send wzml);反应器触发函数
(setq wzml (car data));输入的未知命令名称
(defun send(str)(vla-sendcommand (vla-get-ActiveDocument (vlax-get-acad-object)) (strcat str"\n")));发送字符串到命令行
(cond ;采用cond来管理多种类型,本处只举例一种
    (
      (and;sc缩放带比例命令
      (wcmatch wzml "SC.*,SC#*");是否SC开头带数字
      (wcmatch (substr wzml 3)"~*[~`.-9]*");二次判断
      );通用命令
      (send (strcat "(-wzml-fyq \""wzml"\")"));触发命令(反应器里面无法使用command等多种函数,采取跳出反应器来突破函数限制)
                )
      )
)
;触发通用函数(可以定义多个函数,也可以只用一个函数,自由发挥)
(defun -wzml-fyq(wzml / bili)
(cond ;采用cond来管理多种类型的命令,本处只举例一种
    ((wcmatch wzml "SC.*,SC#*");缩放命令
      (setq bili(atof (substr wzml 3)));取得数字
      (command "SCALE" (ssget) "" pause bili)
    )
)
)
(princ "\n未知命令反应器例子,作者:tryhi-大海")(princ)


这只是一个简单的实例,而且实际应用并不限于命令+数字,只要脑洞够大,什么组合都行,甚至还能将因为没切换中英输入法不小心打在命令行的中文强制转换为拼音首字母来启动你原来想要输入的命令(14楼已经实现),或者定义模糊输入,通过已加载的c:函数来进行模糊匹配,达到在低版本不小心输入字母也能正确启动想要的命令的功能,总之,请自行发挥想象。

不过目前有一个无关紧要的问题还未解决,结束命令行会提示"知命令“XX”。按 F1 查看帮助。",这个提示一直找不到方法来屏蔽,请问有人知道怎么屏蔽这个提示吗?

=================续===================
有人反映高版本(低于2008无此问题)无法识别到小数点,感觉原因是高版本的反应器函数有问题,37楼给出了解决方法,即不使用反应器的参数传入,而直接读取命令行可以解决小数点问题

yanshengjiang 发表于 2018-8-8 16:37:13

tryhi 发表于 2018-7-20 10:48
使用返回汉字拼音首字母函数,可以非常方便的实现对未知中文命令的强制转换,比如输入“批量”“漂亮 ...

哥们我这只实现了词组的首一个字母。你在吗提取到“批量”=“PL“的呢?




(vl-load-com)
(or *doc* (setq *doc* (vla-get-ActiveDocument (vlax-get-acad-object))))
(or *chinese-text* (setq *chinese-text* (vlr-editor-reactor nil '((:vlr-unknownCommand . chinese-text)))))

(defun chinese-text(a b / asc)
(setvar "cmdecho" 0)
(setq c (strcase(car b)))
(setq asc (+ (* (ascii c) 1000) (ascii (substr c 2 1))));得到汉字机器码(貌似是)
(cond;cond
((<= 176161 asc 176196)(setq sendcommand-text"_.TRIM "));A啊
((<= 178193 asc 180237)(setq sendcommand-text"_.copy "));C才
((<= 182234 asc 183161)(setq sendcommand-text"_.erase "));E 额
((<= 183162 asc 184192)(setq sendcommand-text"_.fuzhi " ));F发
((<= 184193 asc 185253)(setq sendcommand-text"_.DRAWGCD " ));G个
((<= 185254 asc 187246)(setq sendcommand-text"_.huan "));H好
((<= 187247 asc 191165)(setq sendcommand-text"_.POLYJOIN " ));J就
((<= 191166 asc 192171)(setq sendcommand-text"_.DRAWDK " ));K看
((<= 194171 asc 196194)(setq sendcommand-text"_.move "));M 门=====此处机器码不是很准确
((<= 196195 asc 197181)(setq sendcommand-text"_.PLIND "));N你
((<= 198218 asc 200186)(setq sendcommand-text"_.EXTEND "));Q去
((<= 200187 asc 200245)(setq sendcommand-text"_.offset "));R人
((<= 200246 asc 203249)(setq sendcommand-text"_.putp "));S是
((<= 203250 asc 205217)(setq sendcommand-text"_.TEXT "));T 他
((<= 205218 asc 206243)(setq sendcommand-text"_.DRAWWQ " ));W我
((<= 206244 asc 209184)(setq sendcommand-text"_.DJF3 0 " ));X想
((<= 209185 asc 212208)(setq sendcommand-text"_.POLYINS " ));Y有
((<= 212209 asc)       (setq sendcommand-text"_.zoom e "));Z 中
((> 176161 asc)       (setq sendcommand-text nil));如果不是汉字就
)   ;cond
(if (/= sendcommand-text nil)
(vla-sendcommand *doc* sendcommand-text)
    )
(setq sendcommand-text nil)
(princ)
)

yanshengjiang 发表于 2018-8-8 16:35:44

(vl-load-com)
(or *doc* (setq *doc* (vla-get-ActiveDocument (vlax-get-acad-object))))
(or *chinese-text* (setq *chinese-text* (vlr-editor-reactor nil '((:vlr-unknownCommand . chinese-text)))))

(defun chinese-text(a b / asc)
(setvar "cmdecho" 0)
(setq c (strcase(car b)))
(setq asc (+ (* (ascii c) 1000) (ascii (substr c 2 1))));得到汉字机器码(貌似是)
(cond;cond
((<= 176161 asc 176196)(setq sendcommand-text"_.TRIM "));A啊
((<= 178193 asc 180237)(setq sendcommand-text"_.copy "));C才
((<= 182234 asc 183161)(setq sendcommand-text"_.erase "));E 额
((<= 183162 asc 184192)(setq sendcommand-text"_.fuzhi " ));F发
((<= 184193 asc 185253)(setq sendcommand-text"_.DRAWGCD " ));G个
((<= 185254 asc 187246)(setq sendcommand-text"_.huan "));H好
((<= 187247 asc 191165)(setq sendcommand-text"_.POLYJOIN " ));J就
((<= 191166 asc 192171)(setq sendcommand-text"_.DRAWDK " ));K看
((<= 194171 asc 196194)(setq sendcommand-text"_.move "));M 门=====此处机器码不是很准确
((<= 196195 asc 197181)(setq sendcommand-text"_.PLIND "));N你
((<= 198218 asc 200186)(setq sendcommand-text"_.EXTEND "));Q去
((<= 200187 asc 200245)(setq sendcommand-text"_.offset "));R人
((<= 200246 asc 203249)(setq sendcommand-text"_.putp "));S是
((<= 203250 asc 205217)(setq sendcommand-text"_.TEXT "));T 他
((<= 205218 asc 206243)(setq sendcommand-text"_.DRAWWQ " ));W我
((<= 206244 asc 209184)(setq sendcommand-text"_.DJF3 0 " ));X想
((<= 209185 asc 212208)(setq sendcommand-text"_.POLYINS " ));Y有
((<= 212209 asc)       (setq sendcommand-text"_.zoom e "));Z 中
((> 176161 asc)       (setq sendcommand-text nil));如果不是汉字就
)   ;cond
(if (/= sendcommand-text nil)
(vla-sendcommand *doc* sendcommand-text)
    )
(setq sendcommand-text nil)
(princ)
)

tryhi 发表于 2018-8-27 18:03:29

yanshengjiang 发表于 2018-8-8 16:37
哥们我这只实现了词组的首一个字母。你在吗提取到“批量”=“PL“的呢?




;;获取汉字的拼音首字母,返回字母表
(defun pingyin (str / asc lst rt)
(setq lst (vl-string->list str))
(while lst
    (setq asc (+ (* (car lst) 256) (cadr lst) -65536)
    lst (cddr lst)
    )

    (setq rt (cons
         (cond
   ((<= -20319 asc -20284) "A")
   ((<= -20283 asc -19776) "B")
   ((<= -19775 asc -19219) "C")
   ((<= -19218 asc -18711) "D")
   ((<= -18710 asc -18527) "E")
   ((<= -18526 asc -18240) "F")
   ((<= -18239 asc -17923) "G")
   ((<= -17922 asc -17418) "H")
   ((<= -17922 asc -17418) "I")
   ((<= -17417 asc -16475) "J")
   ((<= -16474 asc -16213) "K")
   ((<= -16212 asc -15641) "L")
   ((<= -15640 asc -15166) "M")
   ((<= -15165 asc -14923) "N")
   ((<= -14922 asc -14915) "O")
   ((<= -14914 asc -14631) "P")
   ((<= -14630 asc -14150) "Q")
   ((<= -14149 asc -14091) "R")
   ((<= -14090 asc -13319) "S")
   ((<= -13318 asc -12839) "T")
   ((<= -12838 asc -12557) "W")
   ((<= -12556 asc -11848) "X")
   ((<= -11847 asc -11056) "Y")
   ((<= -11055 asc -10247) "Z")
   (t nil)
         )
         rt
       )
    )
)
(reverse rt)
)

你有种再说一遍 发表于 2018-7-17 17:56:38

惊惊来捧场~

陨落 发表于 2018-7-17 18:03:18

远影前来捧场

jpg102329 发表于 2018-7-17 18:38:52

懒猪前来捧场

lover920 发表于 2018-7-17 18:41:13

瞻仰大神风采,虽然看不懂

zixuan203344 发表于 2018-7-17 19:14:57

大海牛逼!

spp_wall 发表于 2018-7-17 19:31:23

不懂啊不懂!nnnn

669423907 发表于 2018-7-17 20:59:25

和gbhsu大师的智能命令http://bbs.mjtd.com/forum.php?mod=viewthread&tid=88273
相似。谢谢大海分享好程序

tryhi 发表于 2018-7-17 21:48:21

本帖最后由 tryhi 于 2018-7-17 23:26 编辑

669423907 发表于 2018-7-17 20:59
和gbhsu大师的智能命令http://bbs.mjtd.com/forum.php?mod=viewthread&tid=88273
相似。谢谢大海分享好程 ...
确实是一样的原理,不过我只写了一个实例,gbhsu大师写了很多功能出来,而且实际应用并不限于命令+数字,只要脑洞够大,什么组合都行,甚至还能将因为没切换中英输入法不小心打在命令行的中文强制转换为拼音首字母来启动命令。他也没有解决命令栏出现未知命令提示,由于用的是同样的反应器,所以这种程序只能加载一个,也算是其中的一个缺陷

panliang9 发表于 2018-7-18 09:40:11

围观,大家能不能根据楼主的想法写出各种东西来,把楼主的想法玩出花来呢!
页: [1] 2 3 4 5
查看完整版本: 使用反应器定义无限多种虚拟命令