GregGleason 发表于 2022-7-5 15:46:39

全局变量不那么全局?

我有一个阿卡多克。具有以下代码段的lsp例程:
 
文本窗口中的结果为:
 
调用文件中用于定义全局变量的代码如下:
当我试图单独运行例程时,我得到以下结果:
 
我该怎么做才能让它工作? 
格雷格

Grrr 发表于 2022-7-5 15:52:14

未定义函数“defvar”。在您得到的代码片段中,应该有一个(defun defvar…)密码

Aftertouch 发表于 2022-7-5 15:58:15

我想你在找SetEnv函数?这将向寄存器中添加一个自定义变量,因此其全局可访问。但这与全局autolisp变量不同。。。

GregGleason 发表于 2022-7-5 16:05:12

 
 
啊。好啊
 
那么,这可以设置一个可以在其他例程中更改的变量吗?
 
(setvar "insulationtyp" "QQQ")
Greg

ronjonp 发表于 2022-7-5 16:13:24

 
如果有疑问,你可以自己试试。将其粘贴到命令行以查看其功能。

Aftertouch 发表于 2022-7-5 16:18:15

对不起,我在上一个帖子中犯了一个错误。。。
 
使用(setenv“MYVARIABLENAME”1)时(仅允许字符串)
然后变量MYVARIABLENAME存储在寄存器中。
使用(getenv“MYVARIABLENAME”)可以再次获得值。在本例中为“1”。
由于该变量存储在寄存器中,因此所有其他lisp例程都可以调用它。
重新启动AutoCAD时,变量将保留在那里。它也可以在所有DWG文件中访问。
当在一个文件中更改时,所有文件都会更改。
 
使用AutoLisp“全局变量”时,通常会出现以下情况:
例如:

(defun C:TEST ( / )
(setq testvariable "blablabla")
(princ)
)

 
变量“testvariable”现在是一个全局变量,可以被samen DWG文件中的其他LISP接受。
重新启动AutoCAD时,此变量将消失,因为它永远不会存储。
 
使用时:

(defun C:TEST ( / testvariable )
(setq testvariable "blablabla")
(princ)
)

现在testvariable被设置为一个局部变量,当函数完成时,该局部变量被删除,因此,其他lisp程序无法再访问该局部变量。。。
 
希望这有意义。:-)

GregGleason 发表于 2022-7-5 16:21:19

好啊我不认为setvar是我想要的,因为它设置了一个系统变量。
 
以下是我想做的:
 
 
[列表=1]
[*]在acaddoc中设置全局变量。lsp
[*]从acaddoc调用“例程X”。更改全局变量的lsp
[*]princ“例程X”运行后的全局变量
[/列表]
 
我想我已经很接近了,但我仍然有语法错误。
 
格雷格

Aftertouch 发表于 2022-7-5 16:25:42

更好地阅读我的帖子。我说的是setENV,而不是setVAR。
 
你的愿望。。
 
方法一:
在阿卡多克。lsp:
5
 
 
或方法2:
6
 
使用方法一,关闭DWG时,全局变量丢失。
使用方法二,全局变量存储在寄存器中,并存储用于下一个会话。。

Grrr 发表于 2022-7-5 16:34:20

同样,IMO“defvar”是一个自定义函数,它是从某个地方复制的,因此GregLeason在没有任何进一步了解的情况下发布了一个带有代码片段的问题。
函数名不能像Aftertouch建议的setenv那样容易出错。下一个问题可能是“你是说defun吗?”。
因此,对于基本问题,只需发布完整的代码或源代码链接。

GregGleason 发表于 2022-7-5 16:37:09

好啊我想怎么做就怎么做。
 
我想我迷路的地方是我对全局变量的理解。
 
除非用defun声明将变量定义为程序的局部变量,否则“看起来”变量是全局的。这在某种程度上是一种范式转变,因为我认为所有变量都是局部的,除非显式地成为全局的。我的想法正确吗?
 
格雷格
页: [1] 2
查看完整版本: 全局变量不那么全局?