乐筑天下

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

[编程交流] 需要INITGET选项可能是

[复制链接]

47

主题

257

帖子

216

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
229
发表于 2022-7-5 16:18:21 | 显示全部楼层 |阅读模式
我有一个多年前写的基本代码。它根据用户输入绘制平面2d血管。我想修改代码,因此在开始时,当它要求用户以英寸为单位输入接缝到接缝的长度时,用户可以只输入以英寸为单位的尺寸,并正常运行代码,或者询问用户是否在(F)eet中。类似于“输入接缝到接缝的长度,单位为英寸或(F)eet”。非常感谢您的帮助。
  1. (defun c:vv ()
  2. (input)
  3. (compute)
  4. (draw)
  5. (whatif)(princ))
  6. (defun input ()
  7. (setvar "cmdecho" 0)
  8. (command "-units" "4" "" "" "" "" "")
  9. (setq vc (getdist "Enter vessel seam to seam length in inches..."))
  10. (setq vd (getreal "Enter vessel diameter in inches..."))
  11. (initget 1 "H V")(setq vo (getkword "Enter vessel orientation...(H or V)  "))
  12. (setq vb (getint "How many shellbelts? "))  
  13. (setq vs (getpoint "Select starting point..."))
  14. (princ))
  15. ;;;compute
  16. (defun compute ()
  17. (setq vc1 (/ vc 2))
  18. (setq vc2 (+ vc1 2))
  19. (setq vcc (rtos vc 4 4))
  20. (setq vcc1 (rtos vc1 4 4))
  21. (setq vcc2 (rtos vc2 4 4))
  22. ;shellbelts
  23. (setq vc3 (- vc 12))
  24. (setq vb1 (- vb 1))
  25. (setq vc4 (/ vc3 vb1))
  26. (princ))
  27.    
  28. ;;;draw
  29. (defun draw ()
  30. (setq vss (strcat "@" vcc ",0"))
  31. (command "layer" "n" "vessel" "s" "vessel" "")
  32. (command "line" vs vss "")
  33. ;;offset
  34. (setq os (ssget "l"))
  35. (command "offset" vd os vs "")
  36. (command "insert" "vcap" vs vd "" "")
  37. ;;;mirror
  38. (setq mc (ssget "l"))
  39. (setq vss1 (strcat "@" vcc1 ",0"))
  40. (setq vss2 (strcat "@" "0," vcc2))
  41. (command "mirror" mc "" vss1 vss2 "n")
  42. (command "layer" "n" "shellbelt" "s" "shellbelt" "")
  43. (command "insert" "shellbelt" vs vd "" "")
  44. (command "array" "l" "" "r" "" vb vc4)
  45. (setq lay_name2 "shellbelt")
  46. (setq ss1 (ssget "X" (list  (cons 8 lay_name2))))
  47. (command "move" ss1 "" "0,0" "@6,0")
  48. (setq lay_name1 "vessel")
  49. (command "-units" "2" "" "" "" "" "")
  50. (setq ss2 (ssget "X" (list  (cons 8 lay_name1))))
  51. (princ))
  52. (defun whatif ()
  53. (if (= "V" vo)
  54.    (command "rotate" ss1 ss2 "" vs "90"))
  55. (princ))
回复

使用道具 举报

47

主题

257

帖子

216

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
229
发表于 2022-7-5 16:41:47 | 显示全部楼层
伙计们,我明白了。我一直在努力思考这个问题。我最后添加了以下内容:
 
  1.   (initget 1 "I F")(setq IFIF (getkword "\nEnter vessel seam to seam length in (I)nches or (F)eet..."))
  2. (cond ((= IFIF "I")
  3.          (setq vc (getdist "Enter vessel seam to seam length in inches...")))
  4.        ((= IFIF "F")
  5.          (setq vvv (getdist "Enter vessel seam to seam length in feet...")))
  6.          (setq vc (* vvv 12))
  7. )

 
这就成功了。再次感谢!
回复

使用道具 举报

47

主题

257

帖子

216

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
229
发表于 2022-7-5 16:48:22 | 显示全部楼层
哼,我只是在想,如果还有人想插话的话。我该如何将其编辑为我最初所说的内容。如果用户甚至不需要输入(I)英寸,那么初始输入总是以英寸为单位。仅在尺寸单位为英尺的情况下添加(F)选项。如果用户输入14-6,它将计算出英尺乘以12,然后再加上额外的英寸,并使用该数字作为总数。
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 17:01:47 | 显示全部楼层
或者提示输入文本并使用(distof)。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:07:52 | 显示全部楼层
我会把一个不同方向的输入12或f12作为一个字符串,看第一个字符,如果它的f,那么它的脚去掉f等乘以12,我没有看代码关闭。缺点是不能使用getdist。但是,如果你的打字输入99%的时间,那么它的确定。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 17:19:58 | 显示全部楼层
一种简单的方法:
 
  1. (while (not (numberp (setq vc (progn (initget "Feet Inches") (getdist "\nSpecify length or [Feet/Inches]: ")))))
  2. (cond
  3.    ( (= vc "Feet")
  4.      (alert "Feet were specified, prompting back for a length.") ; do something here
  5.    )
  6.    ( (= vc "Inches")
  7.      (alert "Inches were specified, prompting back for a length.") ; do something here
  8.    )
  9. ); cond
  10. ); while

 
或定义自定义子功能(非相关示例):
 
  1. ; Example for (_GetWithOption):
  2. (defun C:test ( / p )
  3. (defun pointp ( p ) (and (vl-consp p) (member (length p) '(2 3)) (vl-every 'numberp p)))
  4. (while
  5.    (not
  6.      (pointp
  7.        (setq p
  8.          (_GetWithOption getpoint "Specify a point or "
  9.            '(
  10.              ("Inches" (alert "Inches were specified, prompting back for a point."))
  11.              ("Feet" (alert "Feet were specified prompting back for a point."))
  12.            )
  13.          ); _GetWithOption
  14.        ); setq p
  15.      ); pointp
  16.    ); not
  17. ); while
  18. (princ)
  19. ); defun C:test for (_GetWithOption)
  20. ; getfoo - getXXX function, i.e.: getpoint/getint/getreal/getstring
  21. ; msg - message
  22. ; aL - assoc list of (<Option [sTR]> <foo>)
  23. (defun _GetWithOption ( getfoo msg aL / v itm r )
  24. (defun stringp ( s ) (eq 'STR (type s)) )
  25. (cond
  26.    ( (not (eq 'SUBR (type getfoo))) (princ "\nInvalid "getfoo" provided.") )
  27.    ( (not (eq 'STR (type msg))) (princ "\nInvalid "msg" provided.") )
  28.    ( (not (and (vl-consp aL) (vl-every 'vl-consp aL) (vl-every 'stringp (mapcar 'car aL)))) (princ "\nInvalid "aL" provided.") )
  29.    (T
  30.      (initget (apply 'strcat (mapcar '(lambda (x) (strcat (car x) " ")) aL)))
  31.      (setq v (getfoo (strcat "\n" msg "[" (vl-string-left-trim "/" (apply 'strcat (mapcar '(lambda (x) (strcat "/" (car x))) aL))) "]")))
  32.      (or (and (setq itm (assoc v aL)) (setq r (car itm)) (progn (eval (cadr itm)) T)) (setq r v) )
  33.    )
  34. ); cond
  35. r
  36. ); defun _GetWithOption

 
一个缺点是,这种提示会强制用户输入(不能通过按[ENTER]键中断提示),因此这可能更合适:
  1. 5

 
正如您所见,整个过程都是关于使用cond并将其包装在while循环中。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-3 17:31 , Processed in 1.376673 second(s), 65 queries .

© 2020-2025 乐筑天下

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