明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3266|回复: 19

用 LISP 如何做到像 AREA 命令的一样的提示呢?

  [复制链接]
发表于 2004-9-30 14:56:00 | 显示全部楼层 |阅读模式
用 LISP 如何做到像 AREA 命令的一样的提示呢?


命令: area


指定第一个角点或 [对象(O)/加(A)/减(S)]: o


选择对象:


也就是当前可以执行动作,也可以输入关键字来执行其它的动作.


我试过用 grread 和 getkword 都没成功
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2004-9-30 15:25:00 | 显示全部楼层
用getkword可以吧. 就是按下字母后调用ssget涵数可以的啊.但就知你的具体情况呢.
发表于 2004-9-30 15:48:00 | 显示全部楼层
用getpoint或者其他的,参vl帮助中,initget函数
发表于 2004-9-30 18:42:00 | 显示全部楼层
用initget、getkword和if函数配合使用。


参考“总图面积程序”:

本帖子中包含更多资源

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

x
 楼主| 发表于 2004-9-30 19:33:00 | 显示全部楼层
xyp1964你上面的程序不是我想要的效果 ;;;1.根据 meflying 的程序修改的,可是还是不理想
;;;现在只要是键盘输入的都会执行,而不是由程序设置的关键字
;;;如果在这个基础上改成可以由程序自定义的关键字+回车执行动作的话。就达到我的要求了
(defun Sel (msg / m gr x)
(prompt msg)
(setq m nil)
(while (not m)
(setq gr (grread 2 4 2))
(cond
((= (car gr) 3) ;点选
(setq m t)
)
((= (car gr) 2) ;键盘输入
(initget "S")
(setq x (getkword "确实要这样做吗? (Y/N)<Y> "))
(if (or (= x nil) (= x "Yes"))
(setq m t)
)
)
((= (car gr) 12) ;回车
(setq m t)
)
)
)
gr
)
(defun c:aa (/ ss msg)
(setq ss (sel "\nSelect Circle / S: 设置 :"))
)
;;;----------------------------------------
;;;2.用 getkword
(defun c:aa1 (/ x)
(initget "S M")
(setq x (getkword "请输入选项 [S 执行 a+1 /M 不执行]<S>"))
(if (or (= x nil) (= x "S"))
(progn
(if (= a nil)
(setq a 1)
)
(setq a (1+ a))
)
)
)
发表于 2004-9-30 19:37:00 | 显示全部楼层
为什么不看3楼的??????????? (defun c:test( / pt)
(initget "O A S")
(setq pt (getpoint "指定第一个角点或 [对象(O)/加(A)/减(S)]:"))
)
发表于 2004-9-30 19:39:00 | 显示全部楼层

回复

你是想要PLINE命令的效果,想输入点就用鼠标点选,想封闭就按C,...?
 楼主| 发表于 2004-9-30 20:15:00 | 显示全部楼层
meflying发表于2004-9-30 19:37:00为什么不看3楼的??????????? (defun c:test( / pt) (initget \"O A S\") (setq pt (getpoint \"指定第一个角点或 :\")))

哦,不是不看,而是脑子没反应过来. 谢谢!!!这就是我想要的效果.可是这样我就得写一个函数 (函数 参数)来执行我要的功能。这个函数就是类视 get.... 函数。我刚才写了一下。可是没写出来回去再想想。 祝大家国庆愉快!!!
发表于 2004-10-1 00:19:00 | 显示全部楼层
本帖最后由 作者 于 2004-10-1 1:43:33 编辑

有必要写么?好像简单了些,呵呵
  1. (defun mygetpt (msg ini)
  2.    (initget ini)
  3.    (getpoint msg)
  4. )(x-getpt "指定第一个角点或 [对象(O)/加(A)/减(S)]:" "O A S");;返回:nil或点或大写关键字.
  5. (x-getpt "指定第一个角点或 [对象(O)/加(A)/减(S)]:" 128);;返回:nil或任意输入字符.
至于把判断后要执行的语句写进函数我觉得没必要因为用(setq k (mygetpt "..." "..."))(cond  ((listp k) ....)  ((= k "O")...)  (....))也"复杂"不了多少
发表于 2004-10-1 03:18:00 | 显示全部楼层
本帖最后由 作者 于 2004-10-1 3:49:52 编辑

呵呵,没办法,来了精神了.
  1. ;|声明:使用 本函数.你可以改动函数名,及部分程序内容.但请保留本声明及作者注释信息.本函数仅供学习参考,不对可能造成的后果负责.版权所有,未经允许不得用于商业用途.作者:梁雄啸函数:(x-cond-getpt msg doel dopt dolst) 功能:扩展getpoint功能,支持取点,取点选中实体,关键字,并执行相应功能函数及语句.
  2. 参数: msg = 提示信息.
  3.            doel = '(自定义传递变量 语句1 语句2...);传递变量的值为(nentselp)返回值格式,可在语句*中应用,如同 getboundingbox的'minp,'maxp 自定义变量.
  4.            dopt = '(自定义传递变量 语句1 语句2...);传递变量的值为(getpoint)返回值格式,可在语句*中应用,如同 getboundingbox的'minp,'maxp 自定义变量.
  5.            dolst = '((关键字1 语句1 语句1 ...)(关键字2 语句1 语句2 ...)...);如(("A" fa1 fa2...)("B" fb1 fb2 ...)...);关键字大小写无关!
  6. 返回值: 符合条件的各条语句的执行结果列表.
  7.                如果要取最后结果返回值,可使用(last 返回值)
  8. 说明: doel,dopt,dolst应用时表前需加 ' 号或用(FUNCTION ())将内容包括起来.如同使用lambda函数.
  9. 版本: v1.0-200410.
  10. 更新:
  11. 实例: (defun test (pt) (angle '(0 0 0) pt)) ;;测试用的临时函数.
  12.            (x-cond-getpt "\n点选实体/取点/A-/B-:"
  13.                  nil
  14.                  '(pt (setq ptx pt)(test ptx))   ;;调用test函数.
  15.                  '(("a" (princ "a"))
  16.                      ("B" (princ "\n返回值: ")(princ "B"))
  17.                    )
  18.            )
  19. |;;;主函数:
  20. (defun x-cond-getpt (msg doel dopt dolst / k el ass)
  21.    (setq dolst (mapcar '(lambda(x)(cons (strcase (car x))(cdr x))) dolst))
  22.    (initget (apply 'strcat (mapcar '(lambda(x)(strcat (car x) " ")) dolst)))
  23.    (setq k (getpoint msg))
  24.    (cond
  25.        ((and k doel (listp k) (setq el (nentselp k)))
  26.          (set (car doel) el)
  27.          (mapcar 'eval (cdr doel)))
  28.        ((and k dopt (listp k))
  29.          (set (car dopt) k)
  30.          (mapcar 'eval (cdr dopt)))
  31.        ((and k (= 'STR (type k))(setq ass (assoc k dolst)))
  32.          (mapcar 'eval (cdr ass)))
  33.        (T nil)
  34.    )
  35. )
  1. ;|应用实例:
  2. (setq a
  3.              (x-cond-getpt "\n指定第一个角点或 [对象(O)/加(A)/减(S)]:"
  4.                                          '(entl (print (car entl))(princ (cadr entl)))
  5.                                          '(pt     (print pt)(princ "   角度:")(princ (angle '(0. 0. 0.) pt)))
  6.                                          '(("O" (print "O"))
  7.                                ("a" (print "A"))
  8.                                ("S" (print "S"))
  9.                              )
  10.              )
  11. )
  12. ;;如果要执行的最末值作为返回值,使用下面语句,或将程序中(mapcar 'eval ...)改为(last(mapcar 'eval ...)).
  13. ;;(setq b (if a (last a) nil)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;应用实例效果测试;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  14. ;; vl控制台显示信息(行末注释为后期加注):----------------------------;;
  15. (140824.0 528880.0 0.0)     角度:1.31057                             ;;点击绘图区,选中实体的执行过程.
  16. ((140824.0 528880.0 0.0) "   角度:" 1.31057)                   ;;返回值.
  17. _$ <图元名: 7efb4dd8> (247879.0 491409.0 0.0)                     ;;点击绘图区,无实体的执行过程.
  18. (<图元名: 7efb4dd8> (247879.0 491409.0 0.0))                 ;;返回值.
  19. _$ "O"                     ;;输入"o"后的执行过程.
  20. ("O")                 ;;返回值.
  21. _$ "S"                     ;;输入"S"
  22. ("S")
  23. _$ nil                     ;;回车,执行过程无显示,返回值为nil
  24. _$;; cad命令行显示信息:----------------------------;;
  25. 指定第一个角点或 [对象(O)/加(A)/减(S)]:
  26. (140824.0 528880.0 0.0)     角度:1.31057
  27. 指定第一个角点或 [对象(O)/加(A)/减(S)]:
  28. <图元名: 7efb4dd8> (247879.0 491409.0 0.0)
  29. 指定第一个角点或 [对象(O)/加(A)/减(S)]:o
  30. "O"
  31. 指定第一个角点或 [对象(O)/加(A)/减(S)]:t
  32. 需要点或选项关键字。
  33. 指定第一个角点或 [对象(O)/加(A)/减(S)]:s
  34. "S"
  35. 指定第一个角点或 [对象(O)/加(A)/减(S)]:
  36. 命令:
  37. |;

评分

参与人数 1金钱 +2 贡献 +5 激情 +2 收起 理由
龙龙仔 + 2 + 5 + 2 【好评】小程序不錯

查看全部评分

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

本版积分规则

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

GMT+8, 2025-7-31 04:34 , Processed in 0.212825 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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