ksperopoulos 发表于 2022-7-5 20:01:12

递增问题

我编写了一些代码,将单个字母插入到使用带属性块的多重引线中。放置第一条多重引线后,它将递增到字母表中的下一个字母,并提示用户放置下一条多重引线。这种情况一直持续到用户将带有字母“Z”的多重引线放置在其中或用户点击“Escape”键之后。我希望它继续经过字母“Z”,但不是只有一个字母,我希望它从“AA”开始,然后继续到“ZZ”。有人能给我指出正确的方向,让我完成这件事吗?
 
(defun c:WID ( / *error* weld numb)
(defun *error* (msg)
   (if (not (member msg '("Function cancelled" "quit / exit abort")))
       (princ (strcat "\nError: " msg))
   )
   (princ)
)
(initget "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z")
(setq weld (getkword "\nEnter weld identification letter: ")
       numb (ascii weld)
)
(while (<= numb 90)
      (command "mleader" pause pause (chr numb))
      (setq numb (1+ numb))
)
(princ)
)
 
未经测试,前往午餐,HTH

Bhull1985 发表于 2022-7-5 20:07:19

谢谢你的建议。我试着玩弄你贴的东西,但我好像没法用。我可能会尝试走另一条路,使用vl string->list。你认为我用这个方法比OP方法更走运吗?

ksperopoulos 发表于 2022-7-5 20:08:43

您需要将initget从“A-Z”重新定义为“A-ZZ”,使其成为huuuge。

Snownut 发表于 2022-7-5 20:13:56

是的,确实是ksper,除非你的initget从A-Z开始,然后是AA-ZZ,否则我的建议不会起作用

Bhull1985 发表于 2022-7-5 20:16:15

你是对的,但即使在我重新定义initget之后,它仍然不能正常工作。它只从AA到ZZ,而不是从A到Z。由于允许计数大于90,它还开始添加一些符号。

ksperopoulos 发表于 2022-7-5 20:19:29

bhull1985,snownut。。我不敢打赌。。。
我修改了Lisp程序
我走的路:
我检查输入并检索ascii。如果是双字母,则得到第一个字符的ascii码。
我启动一个计数器(setq计数器(+1(-weldascii 65)))。基本上,计数器得到A的值1,B的值2,依此类推。我用它来去掉while,以防止超过z(或zz)。
然后,我检查原始输入是否是单字符列表或双字符列表的一部分,然后在此基础上继续执行条件。ascii编号用于焊接ID。
当其单个输入时,我也使用ascii数,如果ascii超过90(z),我从其值中删除26(从A开始),并使用它两次(AA)。
 
我从来没想过,大师。。
这让我疯狂了好几个小时!!!需要一位大师来解释。。。
在开始时,橙色线是(出口),而不是t。。。这样地
(not(如果(>计数器52)(progn(princ“\n\n无字母,中止”)(exit)))
我不明白为什么当计数器达到52时,程序似乎被评估了。已处理(princ“\n没有字母,例程被中断”),但没有处理(exit)。Cad/vlide frooze和我在控制台上拿到了1美元。我试图监控变量,但由于Cad需要用户输入,我一直没有找到继续的方法。为什么只有一半的程序被处理,而没有退出?
 
最后我简单地返回true(t),在例程被和打断之前使用“not”。。所以,不是f阻止它,而是while/and谁制造了所有的calcelling。有意义吗=D
 
@ksperopoulos。完全工作。我希望你会喜欢=)
干杯
杰夫!
注:欢迎大家发表意见

Jef! 发表于 2022-7-5 20:21:43

我建议如下:
2

Bhull1985 发表于 2022-7-5 20:25:20

Jef!-我感谢您在代码中所做的努力。我在运行它时遇到了一个问题——没有领导。它只有一个带狗腿的文字作为标题。
 
李-几个问题:
1.在第一个IF函数中,为什么计算“”不等于str?从外观上看,如果为“”,则程序在第一段时间内退出。如果有字符串,则继续。
2.为什么使用vl cmdf而不是命令?
3.在暂停时使用“\\”有好处吗?
显然你的代码是有效的。我看到你是如何使用mapcar重置变量lst并在A-Z之间循环的。我甚至理解你是如何从Z转换到AA的。但我不明白你是怎么告诉它从(65)到(66)等等的。你能解释一下你是怎么做到的吗?

Jef! 发表于 2022-7-5 20:28:09

 
在初始while循环期间,用户可以通过按Enter键退出循环,使getstring函数返回空字符串(“”)。这是必要的,因为如果未满足焊接ID格式标准,用户将需要使用Esc强制错误退出此循环。
 
注意,随后的if表达式不是初始while循环的一部分,因此程序必须在继续程序操作之前测试是否存在有效字符串。
 
 
因为vl cmdf在将提供的参数提交到命令行之前测试其有效性(而命令函数只是将所有提供的参数提交到命令行),这意味着如果用户在MLEADER命令提示符期间按Esc键,程序将继续运行而不会出错。
 
 
请参见此处。
 
 
请注意,mapcar表达式不是“重置”lst变量,而是增加其内容。
 
 
请参阅我的mapcar函数评估教程:mapcar和Lambda

Snownut 发表于 2022-7-5 20:32:08

嗯。我使用mleader命令,和mleader命令一样,如果将尖端放得离文本太近,箭头尖端将不在那里。
 
也许:mleader中有一些选项,例如,我的要求文本限制为2点,文本比引线尖端。。虽然看起来有些用户只需要指定2个点。最初,当您使用“暂停”“暂停”文本创建引线时,我必须在末尾添加一个暂停,才能使其工作。尽管如此,即使没有李·麦克斯那么优雅(他不支持我,因为我的mleader要求3分,而你的似乎只需要2分),它也适用于我当前的mleader设置。因为我使用引线而不是多重引线,所以我从不更改任何内容,所以我保留了所有原始设置。
 
李,我不得不说,我有点失望,你似乎从我的代码和逻辑中获得了灵感,但没有提及它,没有评论我的代码,也没有回答我的问题。
页: [1] 2
查看完整版本: 递增问题