乐筑天下

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

[编程交流] 全局变量不那么全局?

[复制链接]

35

主题

145

帖子

114

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
180
发表于 2022-7-5 15:46:39 | 显示全部楼层 |阅读模式
我有一个阿卡多克。具有以下代码段的lsp例程:
 
文本窗口中的结果为:
 
调用文件中用于定义全局变量的代码如下:
当我试图单独运行例程时,我得到以下结果:
 
我该怎么做才能让它工作? 
格雷格
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 15:52:14 | 显示全部楼层
未定义函数“defvar”。在您得到的代码片段中,应该有一个(defun defvar…)密码
回复

使用道具 举报

76

主题

312

帖子

254

银币

后起之秀

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

铜币
390
发表于 2022-7-5 15:58:15 | 显示全部楼层
我想你在找SetEnv函数?这将向寄存器中添加一个自定义变量,因此其全局可访问。但这与全局autolisp变量不同。。。
回复

使用道具 举报

35

主题

145

帖子

114

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
180
发表于 2022-7-5 16:05:12 | 显示全部楼层
 
 
啊。好啊
 
那么,这可以设置一个可以在其他例程中更改的变量吗?
 
  1. (setvar "insulationtyp" "QQQ")
Greg
回复

使用道具 举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-5 16:13:24 | 显示全部楼层
 
如果有疑问,你可以自己试试。将其粘贴到命令行以查看其功能。
回复

使用道具 举报

76

主题

312

帖子

254

银币

后起之秀

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

铜币
390
发表于 2022-7-5 16:18:15 | 显示全部楼层
对不起,我在上一个帖子中犯了一个错误。。。
 
使用(setenv“MYVARIABLENAME”1)时(仅允许字符串)
然后变量MYVARIABLENAME存储在寄存器中。
使用(getenv“MYVARIABLENAME”)可以再次获得值。在本例中为“1”。
由于该变量存储在寄存器中,因此所有其他lisp例程都可以调用它。
重新启动AutoCAD时,变量将保留在那里。它也可以在所有DWG文件中访问。
当在一个文件中更改时,所有文件都会更改。
 
使用AutoLisp“全局变量”时,通常会出现以下情况:
例如:
  1. (defun C:TEST ( / )
  2. (setq testvariable "blablabla")
  3. (princ)
  4. )

 
变量“testvariable”现在是一个全局变量,可以被samen DWG文件中的其他LISP接受。
重新启动AutoCAD时,此变量将消失,因为它永远不会存储。
 
使用时:
  1. (defun C:TEST ( / testvariable )
  2. (setq testvariable "blablabla")
  3. (princ)
  4. )

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

使用道具 举报

35

主题

145

帖子

114

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
180
发表于 2022-7-5 16:21:19 | 显示全部楼层
好啊我不认为setvar是我想要的,因为它设置了一个系统变量。
 
以下是我想做的:
 
 
[列表=1]
  • 在acaddoc中设置全局变量。lsp
  • 从acaddoc调用“例程X”。更改全局变量的lsp
  • princ“例程X”运行后的全局变量
    [/列表]
     
    我想我已经很接近了,但我仍然有语法错误。
     
    格雷格
  • 回复

    使用道具 举报

    76

    主题

    312

    帖子

    254

    银币

    后起之秀

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

    铜币
    390
    发表于 2022-7-5 16:25:42 | 显示全部楼层
    更好地阅读我的帖子。我说的是setENV,而不是setVAR。
     
    你的愿望。。
     
    方法一:
    在阿卡多克。lsp:
    1. 5

     
     
    或方法2:
    1. 6

     
    使用方法一,关闭DWG时,全局变量丢失。
    使用方法二,全局变量存储在寄存器中,并存储用于下一个会话。。
    回复

    使用道具 举报

    66

    主题

    1552

    帖子

    1514

    银币

    后起之秀

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

    铜币
    325
    发表于 2022-7-5 16:34:20 | 显示全部楼层
    同样,IMO“defvar”是一个自定义函数,它是从某个地方复制的,因此GregLeason在没有任何进一步了解的情况下发布了一个带有代码片段的问题。
    函数名不能像Aftertouch建议的setenv那样容易出错。下一个问题可能是“你是说defun吗?”。
    因此,对于基本问题,只需发布完整的代码或源代码链接。
    回复

    使用道具 举报

    35

    主题

    145

    帖子

    114

    银币

    初露锋芒

    Rank: 3Rank: 3Rank: 3

    铜币
    180
    发表于 2022-7-5 16:37:09 | 显示全部楼层
    好啊我想怎么做就怎么做。
     
    我想我迷路的地方是我对全局变量的理解。
     
    除非用defun声明将变量定义为程序的局部变量,否则“看起来”变量是全局的。这在某种程度上是一种范式转变,因为我认为所有变量都是局部的,除非显式地成为全局的。我的想法正确吗?
     
    格雷格
    回复

    使用道具 举报

    发表回复

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

    本版积分规则

    • 微信公众平台

    • 扫描访问手机版

    • 点击图片下载手机App

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

    GMT+8, 2025-3-14 00:13 , Processed in 0.674879 second(s), 72 queries .

    © 2020-2025 乐筑天下

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