用 LISP 如何做到像 AREA 命令的一样的提示呢?
用 LISP 如何做到像 AREA 命令的一样的提示呢?命令: area
指定第一个角点或 [对象(O)/加(A)/减(S)]: o
选择对象:
也就是当前可以执行动作,也可以输入关键字来执行其它的动作.
我试过用 grread 和 getkword 都没成功 用getkword可以吧. 就是按下字母后调用ssget涵数可以的啊.但就知你的具体情况呢. 用getpoint或者其他的,参vl帮助中,initget函数 用initget、getkword和if函数配合使用。
参考“总图面积程序”:
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)<Y> "))<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 "请输入选项 <S>"))<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>) 为什么不看3楼的???????????
(defun c:test( / pt)<BR> (initget "O A S")<BR> (setq pt (getpoint "指定第一个角点或 [对象(O)/加(A)/减(S)]:"))<BR>)
回复
你是想要PLINE命令的效果,想输入点就用鼠标点选,想封闭就按C,...? 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 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 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