乐筑天下

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

[编程交流] 自定义系统变量

[复制链接]

218

主题

699

帖子

483

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1090
发表于 2022-7-5 23:03:40 | 显示全部楼层 |阅读模式
你好
 
我使用了很多预定义的全局变量来控制程序流。我想知道autolisp如何引用同名的变量和函数?
 
  1. (setq
  2.                        
  3.   REBARLOWERDIA
  4.   "3£16" ;_REBAR UPPER DIAMETER
  5. )
  6. (defun c:REBARLOWERDIA ()
  7. (setq        REBARLOWERDIA
  8. (getString (strcat "Set rebar diameter and frequncy ["
  9.                     REBARLOWERDIA
  10.                     "]"
  11.             )
  12. )
  13. )
  14. )

 
应该是这样吗?
 
谢谢
谢伊
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-5 23:11:07 | 显示全部楼层
一种良好的编程实践是使用星号构建全局变量名,以方便区分它们:
  1. (setq [color=blue]*[/color]REBARLOWERDIA[color=blue]*[/color]
  2.      "3£16" ;_REBAR UPPER DIAMETER
  3. )
回复

使用道具 举报

218

主题

699

帖子

483

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1090
发表于 2022-7-5 23:15:37 | 显示全部楼层
 
thanx公司
我想知道autolisp如何引用同名的变量和函数?
回复

使用道具 举报

1

主题

116

帖子

115

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 23:20:15 | 显示全部楼层
简而言之,如果尝试为函数和全局变量使用相同的符号名,则不会起作用(注意-注释位于图形文档名称空间的上下文中,这就是您所指的名称空间)。
符号将包含您上次将其设置为的任何内容,例如字符串、实数、整数或函数。它不可能同时是两件事。
 
 
如果你在理解这一点时感到困惑,也许你还没有意识到“C:REBARLOWERDIA”与“REBARLOWERDIA”指的是不同的符号。
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-5 23:27:12 | 显示全部楼层
FWIW-
 
你也可能会对布拉格马感兴趣。
 
干杯
回复

使用道具 举报

218

主题

699

帖子

483

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1090
发表于 2022-7-5 23:34:48 | 显示全部楼层
我的代码写得正确吗?
回复

使用道具 举报

15

主题

243

帖子

228

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
75
发表于 2022-7-5 23:41:03 | 显示全部楼层
我不确定你的问题samifox,你是在问你做得对吗?
看起来是这样。。。。
如果您想看看autolisp是否区分了“C:REBARLOWERDIA”和“REBARLOWERDIA”,那么正如clint所提到的那样,是的。如果我理解正确的话,它们是两个不同的原子。
回复

使用道具 举报

218

主题

699

帖子

483

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1090
发表于 2022-7-5 23:45:15 | 显示全部楼层
你好
 
我正在为自己的全局变量编写一个函数(如setVar()),以便根据需要轻松更新它们。
 
我的问题是在不调用全局变量的情况下访问全局变量,这是我迄今为止编写的代码,
 
谢谢
谢伊
 
  1. (defun setValue        (var val)
  2. (if (= (type var) 'STR)
  3.     (set var (getstring (strcat "Enter new value for ["var"]<"'existValue">")))
  4.    )
  5. )
  6. (setq
  7.    *upperRebarTitle*        "3£12" ;_REBAR UPPER DIAMETER
  8. ) ;_ end of setq
  9. (defun C:UPRREBARTLT ()
  10. (setValue "UPRREBARTLT" "3x20")
  11. ) ;_ end of defun
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-5 23:48:48 | 显示全部楼层
我会这样写:
  1. (defun setValue( var val / tmp1 tmp2 )
  2. (if (not val)
  3. (progn
  4.   (or (setq tmp1 (eval (read var)))
  5.       (setq tmp1 "3£12"))
  6.   (set (read var)
  7.        (if (/= (setq tmp2
  8.                      (getstring (strcat "Enter new value for [" var "] <" tmp1 ">")))
  9.                "")
  10.         tmp2
  11.         tmp1))
  12. )
  13. (set (read var) val)
  14. )
  15. (princ)
  16. )

 
 
调用直接设置值:
  1. (setValue "*upperRebarTitle*" "3x20")

调用以通过用户输入设置值:
  1. (setValue "*upperRebarTitle*" nil)

如果变量未初始化,默认值将使用“3£12”。
回复

使用道具 举报

218

主题

699

帖子

483

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1090
发表于 2022-7-5 23:53:49 | 显示全部楼层
 
你好,MSasu,
 
试图理解这个魔法是如何实现的,
这是评估:
 
  1. (set (read var) val)
  2. (set (read var) "3x20")
  3. (set *upperRebarTitle* "3x20")

 
现在如果我使用
 
  1. (set var val)

 
没有(读)我会出错,为什么?
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-11 03:15 , Processed in 0.488984 second(s), 72 queries .

© 2020-2025 乐筑天下

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