明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 36075|回复: 165

cmd+num 命令简称加任意数字组成智能命令[07.20]

    [复制链接]
发表于 2011-7-18 16:58:24 | 显示全部楼层 |阅读模式
本帖最后由 gbhsu 于 2012-10-20 21:42 编辑

;;;这几天不用画图了,有时间编编小程,到也觉得轻松!呵呵
;;;感谢明经LISP编程QQ群里的朋友们的热忱,现将此程序源代码奉献给大家!
;;;命令简称加任意数字组成智能命令这种想法在过去多少年中一直均有,因时间或能力问题一直未能如愿。
;;;如今终于完成了大部分的命令,欢迎大家测试。最初的程序是论坛里找的,非常有用,本人也只是深化了一下而已。
;;;不敢独享,希望大家在工作中能时时运用,提高效率!
;;本程序由燕川布衣编者编写,QQ:112100528
;;;作者对本程序不提供任何使用上的保证。
;;本程序不得用于商业目的,复制传播请保留以上信息
;;;附件最新更新时间2011.07.21
(vl-load-com)
(or *doc* (setq *doc* (vla-get-ActiveDocument (vlax-get-acad-object))))
(or *hsu:commandall* (setq *hsu:commandall* (vlr-editor-reactor nil '((:vlr-unknownCommand . hsu:commandall)))))
(defun hsu:commandall (a b / c s l hsu:vla-sendcommand-string ANG key )
  (prompt "\ncmd+num组成命令
  现已解决了:
  fillet  f100 f150.5  即f+任意数字可成命令
  move    m100  mr100  向右移100     ;move right
                mL100  向左移100     ;move left
                mu100  向上移100     ;move up
                md100  向下移100     ;move down
                m45X100  45度方向移动100
                m-45X-100  -45度方向移动-100          ;极标坐标
                m100,200   移动到相对坐标 100,200     ;相对坐标
                m,200      移动到相对坐标  0,200      ;可以略零
  circle   c100 画半径为100的圆
           选取D[仅选一次即可]画直径为100的圆         ;2011.07.20add
  chamfer  y100 cha100 倒角100
           y100x200    倒角100X200                    ;2011.07.19add
           y100,200    倒角100X200                    ;2011.07.19add
  stretch  s100 sr100  向右拉伸100   ;stretch right
                sL100  向左拉伸100   ;stretch left
                su100  向上拉伸100   ;stretch up
                sd100  向下拉伸100   ;stretch down
  line     L100 lr100  向右画线100   ;line right
                LL100  向左画线100   ;line left
                Lu100  向上画线100   ;line up
                Ld100  向下画线100   ;line down
                L45X100    45度方向画线100             ;极标坐标
                L-45X-100  -45度方向画线-100           ;极标坐标
                L100,300   相对坐标100,300画线         ;相对坐标 ;2011.07.19add
  copy     cc100 co100 向右拷贝100   ;copy right
                cL100  向左拷贝100   ;copy left
                cu100  向上拷贝100   ;copy up
                cd100  向下拷贝100   ;copy down
                c45X100  45度方向拷贝100
                c-45X-100  -45度方向拷贝-100          ;极标坐标
                c100,200   拷贝到相对坐标 100,200     ;相对坐标  ;2011.07.19add
                c,200      拷贝到相对坐标  0,200      ;可以略零               
  offset        o100
  scale         sc100  放大100
  rotate        rt45  ro45  逆时针旋45度
                rt-45 ro-45 顺时针旋45度
  rectang       rec100x200  绘制矩形100x200
  square        sq100       绘制边长100的正方形
   ")
  (prompt "/n
  zoom          za=zoom a;zd=zoom d; ze=zoom e; zo=zoom o;
                zv=zoom v; zp=zoom p;                                2011.07.21add               
  分数亦可以实现,如sc1/2则为SCALE命令缩小0.5倍!
  pscale为调整绘图比例的命令,选取时回车亦可调整绘图比例,默认比例为1:1.
                燕川布衣 QQ:112100528
  ")
        (princ)
  );defun



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

带小数点怎么不行呢?求教!  发表于 2020-4-11 15:54
好  发表于 2011-7-24 22:59

评分

参与人数 16金钱 +460 收起 理由
GamIng + 50 很给力!
烟雨江南00 + 20 很给力!
zoubo604 + 20
l64631778 + 20 可不可以不要明经币啊
yanshengjiang + 20 绮惧搧鏂囩珷
小神仙 + 20 给力啊
1078815748 + 50
daidong013 + 50 支持源码!~~非常不错!~~
luyu9635 + 20
xiaxiang + 40 请楼主添加版本以便区分

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

发表于 2021-9-11 23:38:09 | 显示全部楼层
690994 发表于 2011-9-21 10:12
我以前也是将自己常用的定义成命令,但这样还是不够用,
全部定义又太多命令了,不知会不会影响速度。
...

还是看不明白怎么使重复命令有效运行的,能否贴一个能直接运行的简单的完整的程序出来供大家调整、修改?谢谢!!!
回复 支持 0 反对 2

使用道具 举报

发表于 2011-9-21 10:12:12 | 显示全部楼层
gbhsu 发表于 2011-9-20 21:47
没看到你的源码,这样做每次可能还要出现未知命令的提示
我是将未知命令重新定义成命令,可能是繁了点, ...

我以前也是将自己常用的定义成命令,但这样还是不够用,
全部定义又太多命令了,不知会不会影响速度。
至于未知命令提示还是不能消除,好象是CAD判断是未知命令
后才会执行我们定义的程序。好象在论坛看到有个变量能控制
SSGET不显示请选择实体提示的,对这个不知有没在效。
这个不影响使用,我也就懒得试了。
我的代码如下,samcom对应内容是我自己定义的功能。
(defun unknownCommand (calling-reactor commandInfo / c n)        
    (setq c (strcase (car commandInfo)))
    (if (and(setq n(vl-string-search "." c))(wcmatch(substr c n 1) "[A-Z]")) ;f.5>F0.5
        (setq c (strcat(substr c 1 n)"0"(substr c (1+ n))))
    )
    (setq n t)
  (cond
  ((or(wcmatch c "0,200,201,255,256")
     (and(wcmatch c "##")(wcmatch c "~0#"))
    )   
   (setq samcom(strcat"(sam_activelayer \""(vl-princ-to-string c)"\") "))
  )
    ((wcmatch c "[1-9],###,####,#####,######,#######,########")
      (if(= c "345")(setq c "12345"))
      (if(= c "678")(setq c "6789"))
   (setq samcom(strcat "(sam_onlayer \"" (vl-princ-to-string c)"\") "))
  )
  ((and(=(substr c 1 1) "O")
    (numberp (setq n(read(substr c 2))))
    (>= n 10.0)
   )
   (setq samcom(strcat "(sam_laycopy \"" (vl-princ-to-string n) "\") "))
  )
  ((and(=(substr c 1 1) "M")
    (numberp (setq n(read(substr c 2))))
    (>= n 10.0)
   )
   (setq samcom(strcat "(sam_laymove \"" (vl-princ-to-string n) "\") "))
  )
  ((and(=(substr c 1 1) "F")
    (numberp (setq n(read(substr c 2))))
   )
   (setq samcom(strcat "(sam_fillet " (vl-princ-to-string n) " nil) "))
  )
  ((= c "FF")   
   (setq samcom "(sam_fillet 0.0 nil) ")
  )  
  ((and(=(substr c 1 1) "C")
    (numberp (setq n(read (substr c 2))))
   )
    (setq samcom(strcat "(sam_fillet " (vl-princ-to-string n) " t) "))
  )
  ((and(=(substr c 1 1) "N")
    (numberp (setq n(read(substr c 2))))
   )
   (if(= n 0.0)
      (setq samcom "(sam_co_lts nil nil) ")
      (setq samcom(strcat "(sam_co_lts " (vl-princ-to-string (fix n)) " nil) "))
   )
  )  
  ((and(=(substr c 1 1) "L")
    (numberp (setq n (read (substr c 2))))
   )
    (setq samcom(strcat "(sam_co_lts nil " (vl-princ-to-string n) ") "))
  )
  ((and(=(substr c 1 1) "X")
    (numberp (setq n(read(substr c 2))))
   )
   (setq samcom(strcat "(sam_xline " (vl-princ-to-string n) ") "))
  )
  ((and(=(substr c 1 1) "D")
    (numberp (setq n(read(substr c 2))))
   )
   (setq samcom(strcat "(sam_dimbit " (vl-princ-to-string n) ") "))
  )
  ((and(=(substr c 1 1) "H")
    (numberp (setq n(read(substr c 2))))
   )
   (setq samcom(strcat "(sam_ha_sc " (vl-princ-to-string n) ") "))
  )
  ((and(=(substr c 1 1) "T")
    (numberp (setq n(read(substr c 2))))
   )
   (setq samcom(strcat "(sam_text_h " (vl-princ-to-string n) ") "))
  )   
  ((and(=(substr c 1 1) "J")
    (numberp (setq n(read(substr c 2))))
   )
   (setq samcom(strcat "(sam_jion_select " (vl-princ-to-string n) ") "))
  )
  (t (setq n nil))
)
(if n(vl-catch-all-apply 'vla-SendCommand (list(vla-get-ActiveDocument (vlax-get-acad-object)) "SmartCommand ")))
(princ)
)
(defun c:SmartCommand( / *doc* )
   (vla-startundomark (setq *doc*(vla-get-activedocument (vlax-get-acad-object))))
   (setvar "cmdecho" 0)      
   (if(and (=(type samcom) 'str)(wcmatch samcom "(sam_*\) "))
      (vl-catch-all-apply 'eval  (list (read samcom))))
  (setvar "cmdecho" 1)
  (vla-endundomark *doc*)
  (princ)
)

点评

very good!  发表于 2011-9-21 11:08

评分

参与人数 1金钱 +20 收起 理由
gbhsu + 20 很给力!

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2021-9-16 08:58:54 | 显示全部楼层
690994 发表于 2021-9-15 18:02
你还没有明白你的问题,(sam_fillet 0.0 nil)就是一个子函数,能用任何lisp命令,包括vla-sendcommand,v ...

  1. (vl-load-com)
  2. (or *doc*
  3.     (setq *doc* (vla-get-ActiveDocument (vlax-get-acad-object)))
  4. )
  5. (or *unknownCommand*
  6.     (setq *unknownCommand*
  7.            (vlr-editor-reactor
  8.              nil
  9.              '((:vlr-unknownCommand . unknownCommand))
  10.            )
  11.     )
  12. )


  13. (defun unknownCommand (a b / CMD CMDLST CMDSTR FLAG I NV UNCMDSTR)
  14.   ;;---------------------------------------------------
  15.   (setq UNCmdStr (strcase (car b)))
  16.   (setq cmdLst (list "DE" "CH"))
  17.   (setq        flag T
  18.         i 0
  19.   )
  20.   ;;---------------------------------------------------
  21.   (while (and flag (< i (length cmdLst)))
  22.     (progn
  23.       (if (wcmatch UNCmdStr (strcat (nth i cmdLst) "*"))
  24.         (progn
  25.           (setq flag nil)
  26.           (setq cmd (nth i cmdLst))
  27.         )
  28.       )
  29.       (setq i (+ i 1))
  30.     )
  31.   )
  32.   ;;---------------------------------------------------
  33.   (if flag
  34.     (progn
  35.       (princ "\n UNKOWNCOMMAND:未找到对应的命令!")
  36.       (exit)
  37.     )
  38.     (progn      
  39.       ;;-------------------------------
  40.       (cond
  41.         ((= cmd "DE")
  42.          (progn
  43.            (setq NV (substr UNCmdStr (+ (strlen cmd) 1)))
  44.            (setq FCTN (strcat "(XP-UNKOWNCMD-LengthenDE "
  45.                               (vl-princ-to-string NV)
  46.                               ") "
  47.                       )
  48.            )
  49.          )
  50.         )
  51.       )
  52.       ;;-------------------------------
  53.       (cond
  54.         ((= cmd "CH")
  55.          (progn
  56.            (setq NV (substr UNCmdStr (+ (strlen cmd) 1)))
  57.            (setq FCTN (strcat "(XP-UNKOWNCMD-Chamfer "
  58.                               (vl-princ-to-string NV)
  59.                               ") "
  60.                       )
  61.            )
  62.          )
  63.         )
  64.       )
  65.       ;;-------------------------------
  66.       (vl-catch-all-apply
  67.         'vla-SendCommand
  68.         (list (vla-get-ActiveDocument (vlax-get-acad-object))
  69.               "SmartCommand "
  70.         )
  71.       )
  72.       ;;-------------------------------
  73.     )
  74.   )
  75.   ;;---------------------------------------------------
  76.   (princ)
  77. )

  78. (defun c:SmartCommand (/ *doc*)
  79.   (vla-startundomark
  80.     (setq *doc* (vla-get-activedocument (vlax-get-acad-object)))
  81.   )
  82.   (setvar "cmdecho" 0)
  83.   (vl-catch-all-apply 'eval (list (read FCTN)))
  84.   (setvar "cmdecho" 1)
  85.   (vla-endundomark *doc*)
  86.   (princ)
  87. )


  88. (defun XP-UNKOWNCMD-LengthenDE (NV /)
  89.   (vl-cmdf "._Lengthen" "DE" NV)
  90. )

  91. (defun XP-UNKOWNCMD-Chamfer (NV /)
  92.   (vl-cmdf "Chamfer" "D" NV NV "Chamfer")
  93. )


请帮我看看。上面代码中的 XP-UNKOWNCMD-LengthenDE相当于(sam_fillet),(FCTN)相当于(samcom)。
麻烦将XP-UNKOWNCMD-LengthenDE中的vl-cmdf改用vla-sendcommand调试一下。
 楼主| 发表于 2011-7-18 17:03:03 | 显示全部楼层
欢迎大家批评指正!

评分

参与人数 1明经币 +1 金钱 +20 收起 理由
yanshengjiang + 1 + 20 很给力!

查看全部评分

发表于 2011-7-18 17:07:37 | 显示全部楼层
谢谢!还没时间细看,不过很强大,下了有时间学习学习!
再次感谢楼主!
发表于 2011-7-18 20:05:40 | 显示全部楼层
我也下来学习学习,楼主辛苦了!
发表于 2011-7-18 22:58:31 | 显示全部楼层
本帖最后由 lincctw_ccl 于 2011-7-18 22:58 编辑

很棒的程式!!
最近忙的頭暈
等過些日子清醒點再來好好研究一下!!
感謝樓主分享!!
发表于 2011-7-18 23:03:58 | 显示全部楼层
cond中的判断可以再简化一下
如:(and (or (eq s "M") (eq s "MOVE") (eq s "ML") (eq s "MR") (eq s "MU") (eq s "MD"))
         (numberp n))
可改为:(and (eq (substr s 1 1) "M") (numberp n))
后面可参照更改
 楼主| 发表于 2011-7-18 23:48:05 | 显示全部楼层
感谢版主!
发表于 2011-7-19 00:27:37 | 显示全部楼层
这个思路非常好哦..可以很灵活的使用命令
发表于 2011-7-19 06:13:39 | 显示全部楼层
想法不错,举一反三,支持一下.
发表于 2011-7-19 08:37:00 | 显示全部楼层
好程式,支持一个。望楼主持续扩展
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-15 01:12 , Processed in 0.409200 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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