动态initget getkword that
我做了一个LSP,它工作得很好,要求用户做出选择,这是一件经典的事情。正在工作
(initget "American Canadianmetric")
(setq GRADE (getkword "\nGRADE:: "))
(cond
((= GRADE "American")
(setq *LASTGRADE* "American")
)
((= GRADE "Canadianmetric")
(setq *LASTGRADE* "Canadianmetric")
)
); cond
*LASTGRADE*(全局变量)如下所示,是我的变量,用于动态提供最后一个年级的输入作为默认答案(如果还不存在,则为美式)。除此之外,不能再点击选择(这正常吗?),这似乎有效,但如果我点击“回车”(而不是写“A”“American”等),它将分数定义为零(并返回零)
这是错误代码
(defun c:gg ()
(setq OLDCMD (getvar "cmdecho"))
(setq OLDLAY (getvar "clayer"))
(setq OLDATTREQ (getvar "attreq"))
(setvar "cmdecho" 0)
;;;; SET INEXISTING COUNTERS TO 1
(if (not *PCOUNT*) (setq *PCOUNT* 1))
(if (not *WCOUNT*) (setq *WCOUNT* 1))
(if (not *ICOUNT*) (setq *ICOUNT* 1))
(if (not *CCOUNT*) (setq *CCOUNT* 1))
; initialize variables
(setq ITEM_TYPE ""
GRADE ""
NUMB ""
ITEM_ATT ""
DESC_ATT ""
MAT_ATT ""
QTY_ATT ""
); setq
;; query # 1 - GRADE
(if (not *LASTGRADE*) (setq *LASTGRADE* "American"))
(initget "American Canadianmetric")
(setq GRADE (getkword (strcat "\nChoose grade::< " *LASTGRADE* " >:")))
(cond
((= GRADE "American")
(setq *LASTGRADE* "American")
)
((= GRADE "Canadianmetric")
(setq *LASTGRADE* "Canadianmetric")
)
); cond
);defun
有人能看到并指出我的(可能是明显的)缺陷是什么吗?
干杯
杰夫! 嗨,杰夫!
您的逻辑似乎很好,如果您不希望通过按enter键而不是键入a或C来返回等级的nil值,则可以使用以下方法
(cond
((= GRADE "American")
(setq *LASTGRADE* "American")
)
((= GRADE "Canadianmetric")
(setq *LASTGRADE* "Canadianmetric")
)
(T (setq GRADE *LASTGRADE*))
) 这里有一种方法:
(initget "American Canadianmetric")
(setq GRADE (if (setq GRADE (getkword "\nGRADE:[ American / Canadianmetric ]: <American>")) GRADE "American") *LASTGRADE* GRADE)
我更喜欢使用函数来简化过程:
(defun list->kword ( l2k_lst l2k_prompt / nospace_lst initgk_lst spos kword)
(setq nospace_lst
(mapcar
'(lambda (x / txt)
(setq txt x spos 0)
(while (setq spos (vl-string-position (ascii " ") txt spos))
(setq txt (vl-string-subst "" " " txt spos))) txt)
l2k_lst))
(initget
(setq i -1 initgk_lst
(apply 'strcat
(mapcar
'(lambda (x)
(if (nth (1+ (setq i (1+ i))) nospace_lst) (strcat x " ") (strcat x)))
nospace_lst))))
(setq spos -3)
(while (setq spos (vl-string-position (ascii " ") initgk_lst (+ spos 3)))
(setq initgk_lst (vl-string-subst " / " " " initgk_lst spos)))
(setq kword
(if
(setq kword
(getkword
(strcat "\n" l2k_prompt " [ " initgk_lst " ]:<" (nth 0 nospace_lst) ">")))
kword (nth 0 nospace_lst)))
(nth (vl-position kword nospace_lst) l2k_lst)
)
示例用法:
(list->kword '("American" "Canadian Metric") "Grade:")
如您所见,该函数也占用了空间。
希望这有帮助,
胡安 对不起,我误读了你的帖子。
这应该做到:
(initget "American Canadianmetric")
(setq GRADE (if (setq GRADE (getkword "\nGRADE:[ American / Canadianmetric ]:")) GRADE (if *LASTGRADE* *LASTGRADE* "American")) *LASTGRADE* GRADE)
如果这是您仅有的两个选择,那么使用动态提示功能会更好:
(or *LASTGRADE* (setq *LASTGRADE* "American"))
(initget "American Canadianmetric")
(setq *LASTGRADE* (if (setq GRADE (getkword (strcat "\nGRADE:[ American / Canadianmetric ]:<" *LASTGRADE* ">"))) GRADE *LASTGRADE*))
首先,感谢您的回复和宝贵的时间!
@Juan(Jvillarreal):我现在有两个选择,但我最终会添加“canadianImperial”,这就是为什么我使用cond而不是ifs。我还希望能够创建更通用的结构,使我有2个或更多的选择,以后再次使用它。
我试了一下你的“list->kword”lsp,太棒了!
不过,我不会用它来选择等级,因为一旦我们为客户开始工作,我们希望在整个工作过程中坚持他的偏好。。。(我之所以选择*LASTGRADE*,是为了动态地提供最后一个条目作为默认选项)假设他们的工程师想要美国等级,我想“设置”它,使其保持不变。不必每次都选择,可以减少出错的风险。
我目前正在制作的lisp使用了一些全局变量(目前),但我认为稍后我会从全局变量转移到绘制自定义属性,这样,如果其他设计师或绘图员打开文件添加零件,在插入新信息气泡时,CAD将动态提供正确的选择。
现在我已经添加了这句话(根据jammie的回复,谢谢!)(T(setq GRADE*LASTGRADE*),它起作用了。因此,如果我理解得很好,我的问题是,通过点击提示符的“return”,从而使用动态提供的值,它不是返回“American”或“Canadianmetric”,而是返回“true”?
如果你回到那个线程,我很想知道你是否有其他getxxx函数的lisp,比如list->int,list->real,等等?
事实恰恰相反。使用您最初的示例,在getkword上点击enter键而不键入实际上会返回一个nil值。为了确保为等级分配了一个值,如图所示,将t添加到cond只会确保在没有找到其他匹配项的情况下设置defaut值。该函数可以按如下方式编写函数
(cond
((= GRADE "American")
(setq *LASTGRADE* "American")
)
((= GRADE "Canadianmetric")
(setq *LASTGRADE* "Canadianmetric")
)
((= GRADE nil)(setq GRADE *LASTGRADE*))
)
但正如您将看到的那样,最终条件总是通过点击return返回t,而不使用getkword键入,因为GRADE的值将为零(除非您在initget中设置了位代码)
(= GRADE nil)
页:
[1]