乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 61|回复: 6

[编程交流] 动态initget getkword that

[复制链接]

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-5 23:56:34 | 显示全部楼层 |阅读模式
我做了一个LSP,它工作得很好,要求用户做出选择,这是一件经典的事情。
正在工作
 
  1. (initget "American Canadianmetric")
  2. (setq GRADE (getkword "\nGRADE:[American/Canadianmetric]: "))
  3. (cond
  4. ((= GRADE "American")
  5. (setq *LASTGRADE* "American")
  6. )
  7. ((= GRADE "Canadianmetric")
  8. (setq *LASTGRADE* "Canadianmetric")
  9. )
  10. ); cond

 
 
*LASTGRADE*(全局变量)如下所示,是我的变量,用于动态提供最后一个年级的输入作为默认答案(如果还不存在,则为美式)。除此之外,不能再点击选择(这正常吗?),这似乎有效,但如果我点击“回车”(而不是写“A”“American”等),它将分数定义为零(并返回零)
这是错误代码
 
  1. (defun c:gg ()
  2. (setq OLDCMD (getvar "cmdecho"))
  3. (setq OLDLAY (getvar "clayer"))
  4. (setq OLDATTREQ (getvar "attreq"))
  5. (setvar "cmdecho" 0)
  6. ;;;; SET INEXISTING COUNTERS TO 1
  7. (if (not *PCOUNT*) (setq *PCOUNT* 1))
  8. (if (not *WCOUNT*) (setq *WCOUNT* 1))
  9. (if (not *ICOUNT*) (setq *ICOUNT* 1))
  10. (if (not *CCOUNT*) (setq *CCOUNT* 1))
  11. ; initialize variables
  12. (setq ITEM_TYPE ""
  13.       GRADE ""
  14.       NUMB ""
  15.       ITEM_ATT ""
  16.       DESC_ATT ""
  17.       MAT_ATT ""
  18.       QTY_ATT ""
  19. ); setq
  20. ;; query # 1 - GRADE
  21. (if (not *LASTGRADE*) (setq *LASTGRADE* "American"))
  22. (initget "American Canadianmetric")
  23. (setq GRADE (getkword (strcat "\nChoose grade:[American/Canadianmetric]:< " *LASTGRADE* " >:")))
  24. (cond
  25. ((= GRADE "American")
  26.   (setq *LASTGRADE* "American")
  27. )
  28. ((= GRADE "Canadianmetric")
  29.   (setq *LASTGRADE* "Canadianmetric")
  30. )
  31. ); cond
  32. );defun

 
有人能看到并指出我的(可能是明显的)缺陷是什么吗?
干杯
杰夫!
回复

使用道具 举报

5

主题

194

帖子

193

银币

初来乍到

Rank: 1

铜币
24
发表于 2022-7-6 00:15:50 | 显示全部楼层
嗨,杰夫!
 
您的逻辑似乎很好,如果您不希望通过按enter键而不是键入a或C来返回等级的nil值,则可以使用以下方法
 
  1. (cond
  2. ((= GRADE "American")
  3.   (setq *LASTGRADE* "American")
  4. )
  5. ((= GRADE "Canadianmetric")
  6.   (setq *LASTGRADE* "Canadianmetric")
  7. )
  8. (T (setq GRADE *LASTGRADE*))
  9. )
回复

使用道具 举报

8

主题

81

帖子

45

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
76
发表于 2022-7-6 00:22:27 | 显示全部楼层
这里有一种方法:
  1. (initget "American Canadianmetric")
  2. (setq GRADE (if (setq GRADE (getkword "\nGRADE:[ American / Canadianmetric ]: <American>")) GRADE "American") *LASTGRADE* GRADE)

 
我更喜欢使用函数来简化过程:
  1. (defun list->kword ( l2k_lst l2k_prompt / nospace_lst initgk_lst spos kword)
  2. (setq nospace_lst
  3. (mapcar
  4. '(lambda (x / txt)
  5.   (setq txt x spos 0)
  6.   (while (setq spos (vl-string-position (ascii " ") txt spos))
  7.     (setq txt (vl-string-subst "" " " txt spos))) txt)
  8. l2k_lst))
  9. (initget
  10. (setq i -1 initgk_lst
  11. (apply 'strcat
  12.   (mapcar
  13.   '(lambda (x)
  14.     (if (nth (1+ (setq i (1+ i))) nospace_lst) (strcat x " ") (strcat x)))
  15.   nospace_lst))))
  16. (setq spos -3)
  17. (while (setq spos (vl-string-position (ascii " ") initgk_lst (+ spos 3)))
  18. (setq initgk_lst (vl-string-subst " / " " " initgk_lst spos)))
  19. (setq kword
  20. (if
  21. (setq kword
  22.   (getkword
  23.    (strcat "\n" l2k_prompt " [ " initgk_lst " ]:<" (nth 0 nospace_lst) ">")))
  24.   kword (nth 0 nospace_lst)))
  25. (nth (vl-position kword nospace_lst) l2k_lst)
  26. )

 
示例用法:
  1. (list->kword '("American" "Canadian Metric") "Grade:")

 
如您所见,该函数也占用了空间。
希望这有帮助,
 
胡安
回复

使用道具 举报

8

主题

81

帖子

45

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
76
发表于 2022-7-6 00:30:53 | 显示全部楼层
对不起,我误读了你的帖子。
这应该做到:
  1. (initget "American Canadianmetric")
  2. (setq GRADE (if (setq GRADE (getkword "\nGRADE:[ American / Canadianmetric ]:")) GRADE (if *LASTGRADE* *LASTGRADE* "American")) *LASTGRADE* GRADE)
回复

使用道具 举报

8

主题

81

帖子

45

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
76
发表于 2022-7-6 00:43:39 | 显示全部楼层
如果这是您仅有的两个选择,那么使用动态提示功能会更好:
  1. (or *LASTGRADE* (setq *LASTGRADE* "American"))
  2. (initget "American Canadianmetric")
  3. (setq *LASTGRADE* (if (setq GRADE (getkword (strcat "\nGRADE:[ American / Canadianmetric ]:<" *LASTGRADE* ">"))) GRADE *LASTGRADE*))
回复

使用道具 举报

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-6 00:53:20 | 显示全部楼层
首先,感谢您的回复和宝贵的时间!
@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,等等?
回复

使用道具 举报

5

主题

194

帖子

193

银币

初来乍到

Rank: 1

铜币
24
发表于 2022-7-6 00:59:49 | 显示全部楼层
 
事实恰恰相反。使用您最初的示例,在getkword上点击enter键而不键入实际上会返回一个nil值。为了确保为等级分配了一个值,如图所示,将t添加到cond只会确保在没有找到其他匹配项的情况下设置defaut值。该函数可以按如下方式编写函数
 
  1. (cond
  2. ((= GRADE "American")
  3.   (setq *LASTGRADE* "American")
  4. )
  5. ((= GRADE "Canadianmetric")
  6.   (setq *LASTGRADE* "Canadianmetric")
  7. )
  8. ((= GRADE nil)  (setq GRADE *LASTGRADE*))
  9. )

 
但正如您将看到的那样,最终条件总是通过点击return返回t,而不使用getkword键入,因为GRADE的值将为零(除非您在initget中设置了位代码)
 
  1. (= GRADE nil)
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-10 22:36 , Processed in 0.474490 second(s), 66 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表