Jef! 发表于 2022-7-5 23:33:18

dcl冻结执行函数

我写了dcl文件,它加载。我开始设置我的action_tiles以向测试发送警报。我所有的按钮都能用。我的set\u tile动态检索所有正确的值,并且我已经测试了我的mode\u tile,改变了我的输入。它们一直都是预期的。太棒了
 
 
我还编写了所有函数,当我独立调用它们时,它们都可以工作。当我试图回忆一个按钮的action_tile中的一个(工作)功能时,dcl和cad冻结。
(action_tile "converttostb" "(alert \"this alert prints\") (convtostb) (alert \"this one doesn't print, cad freeze before\") (current_plot_style_table_type_update)")
 
 
看起来我的函数(convtostb)无法由dcl调用,但我可以在命令行上调用它而不会出现问题。
 
 
我不明白为什么它不起作用。是否有一些功能在dcl打开时无法执行?有人指出我做错了什么吗?
 
 
谢谢
杰夫!

Snownut 发表于 2022-7-5 23:48:03

如果函数试图在不关闭DCL框的情况下转到图形编辑器,它将冻结。(即:getpoint或类似)
 
简而言之,在不关闭DCL的情况下,不能将图形编辑器用作用户输入的方法。

Jef! 发表于 2022-7-5 23:51:48

嗨,斯诺努特!
 
 
此函数不使用任何getpoint,而是使用getvar和getenv。你认为这类似吗?
这是密码
(defun convtostb ( / oldecho)
(setq oldecho (getvar "cmdecho"))
(setvar "cmdecho" 0)
(if (vl-directory-files (getenv "PrinterStyleSheetDir") "convert.stb")
      (princ "\nConvert.stb available. Launching conversion from CTB to STB")
      (progn
         (vl-file-copy (findfile "convert.stb") (strcat (getenv "PrinterStyleSheetDir") "\\convert.stb"))
         (command "shell" (strcat "attrib +R \"" (getenv "PrinterStyleSheetDir") "\\convert.stb\""))
         (princ "\nConvert.stb could not be found locally and has been copied from the server")
         (princ "\nand has been made read-only")
         (princ "\Launching conversion from CTB to STB")
      )
)
(command "convertpstyles" "convert.stb")
(setvar "cmdecho" oldecho)
(princ)
)

Snownut 发表于 2022-7-5 23:59:14

试着注释(princ)行。。。。

Jef! 发表于 2022-7-6 00:09:17

我试图评论所有的princ行(整个if,因为if-true是a(princ))
它仍然挂着。。。
 
 
我取消了所有princ的注释并注释了(命令“convertpstyles”“convert.stb”),它不再挂起。。。但这个命令是convtoctb例行程序的唯一目的。真不方便。我有什么选择=D

Snownut 发表于 2022-7-6 00:17:47

首先关闭DCL,然后执行命令,如果仍然需要,可以将其合并到while循环中以重新启动DCL。(发生得如此之快,大多数用户都不知道DCL已关闭并重新启动)

Jef! 发表于 2022-7-6 00:19:55

似乎是一个很好的解决方法。
我两者都试过了
(action\u tile“converttostb”“(alert \“will try to conv\”)(done\u对话框)(convtostb)(standard\u scan\u dcl)”)
(action\u tile“converttostb”“(alert \“will try to conv\”)(done\u dialog)(unload\u dialog DCL\u ID)(convtostb)(standard\u scan\u DCL)“”)
使用这两种方法,dcl不会挂断,但虽然它似乎在处理命令,但最终会出现两个对话框。我可以关闭第二个,但第一个仍然存在,甚至取消按钮也不起作用。我必须进入任务管理器才能杀死我的cad应用程序。

Jef! 发表于 2022-7-6 00:29:16

好的,我学到了:打开dcl时不能调用命令。
 
 
我设法做到了。我不确定我是否明白如何像你建议的那样在一段时间内做到这一点,但以下是我是如何做到的。
(action\u tile“converttostb”“(alert \“will try to conv \”“)(done\u对话框)(setq convtostbflag 1)”)
 
 
在我的dcl定义中,卸载后我添加了
(if (= convtostbflag 1)
   (convtostb))
 
 
然后在我的convtostb定义中,最后,如果存在convtosbtflag,我(再次将其重置为nil并启动对话框文件)。。。因此,理论上我可以在不启动dcl的情况下使用该子函数,因为标志不存在。我很确定有更好的方法。。但我很高兴它起作用了。
感谢您的帮助和输入snownut!

Snownut 发表于 2022-7-6 00:39:54

不客气,很高兴我能把你引向正确的方向。
页: [1]
查看完整版本: dcl冻结执行函数