spring 发表于 2004-9-30 14:56:00

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

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


命令: area


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


选择对象:


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


我试过用 grread 和 getkword 都没成功

BDYCAD 发表于 2004-9-30 15:25:00

用getkword可以吧. 就是按下字母后调用ssget涵数可以的啊.但就知你的具体情况呢.

无痕 发表于 2004-9-30 15:48:00

用getpoint或者其他的,参vl帮助中,initget函数

xyp1964 发表于 2004-9-30 18:42:00

用initget、getkword和if函数配合使用。


参考“总图面积程序”:

spring 发表于 2004-9-30 19:33:00

xyp1964你上面的程序不是我想要的效果



;;;1.根据 meflying 的程序修改的,可是还是不理想<BR>;;;现在只要是键盘输入的都会执行,而不是由程序设置的关键字<BR>;;;如果在这个基础上改成可以由程序自定义的关键字+回车执行动作的话。就达到我的要求了<BR>(defun Sel (msg / m gr x)<BR>       (prompt msg)<BR>       (setq m nil)<BR>       (while (not m)<BR>                       (setq gr (grread 2 4 2))<BR>                       (cond<BR>                                       ((= (car gr) 3)                        ;点选<BR>                                               (setq m t)<BR>                                       )<BR>                                       ((= (car gr) 2)                        ;键盘输入<BR>                                               (initget "S")<BR>                                               (setq x (getkword "确实要这样做吗? (Y/N)&lt;Y&gt; "))<BR>                                               (if (or (= x nil) (= x "Yes"))<BR>       (setq m t)<BR>                                               )<BR>                                       )<BR>                                       ((= (car gr) 12)                        ;回车<BR>                                               (setq m t)<BR>                                       )<BR>                       )<BR>       )<BR>       gr<BR>)<BR>(defun c:aa (/ ss msg)<BR>       (setq ss (sel "\nSelect Circle / S: 设置 :"))<BR>)<BR>;;;----------------------------------------<BR>;;;2.用 getkword <BR>(defun c:aa1 (/ x)<BR>       (initget "S M")<BR>       (setq x (getkword "请输入选项 &lt;S&gt;"))<BR>       (if (or (= x nil) (= x "S"))<BR>                       (progn<BR>                                       (if (= a nil)<BR>        (setq a 1)<BR>                                       )<BR>                                       (setq a (1+ a))<BR>                       )<BR>       )<BR>)

meflying 发表于 2004-9-30 19:37:00

为什么不看3楼的???????????


(defun c:test( / pt)<BR>       (initget "O A S")<BR>       (setq pt (getpoint "指定第一个角点或 [对象(O)/加(A)/减(S)]:"))<BR>)

王咣生 发表于 2004-9-30 19:39:00

回复

你是想要PLINE命令的效果,想输入点就用鼠标点选,想封闭就按C,...?

spring 发表于 2004-9-30 20:15:00

meflying发表于2004-9-30 19:37:00static/image/common/back.gif为什么不看3楼的???????????



(defun c:test( / pt)       (initget \"O A S\")       (setq pt (getpoint \"指定第一个角点或 :\")))


<BR>哦,不是不看,而是脑子没反应过来.


谢谢!!!这就是我想要的效果.可是这样我就得写一个函数 (函数 参数)来执行我要的功能。这个函数就是类视 get.... 函数。我刚才写了一下。可是没写出来回去再想想。


祝大家国庆愉快!!!

无痕 发表于 2004-10-1 00:19:00

本帖最后由 作者 于 2004-10-1 1:43:33 编辑

有必要写么?好像简单了些,呵呵(defun mygetpt (msg ini)
   (initget ini)
   (getpoint msg)
)(x-getpt "指定第一个角点或 [对象(O)/加(A)/减(S)]:" "O A S");;返回:nil或点或大写关键字.
(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 编辑

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