乐筑天下

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

变量在. NET中是如何处理的,它是否与LISP相关?

[复制链接]

19

主题

99

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
175
发表于 2022-4-30 14:12:58 | 显示全部楼层 |阅读模式
在AutoLISP中,它非常简单:
(defuny

/

...从AutoLISP程序员的角度来看,在函数本身中声明的任何内容都是“持久”或“全局”变量。
我正在寻找一种方法,既可以在绘图中设置全局变量(从一个会话持续到另一个会话),也可以为该会话保留但在关闭绘图时消失的变量。
我相信这在. NET中很容易实现,但我还没有找到答案。

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

57

主题

559

帖子

13

银币

中流砥柱

Rank: 25

铜币
786
发表于 2022-5-1 01:32:38 | 显示全部楼层
不确定它在不在。NET,但是在ARX你可以使用函数AcedPutSym、AcedGetSym和acedevaratelisp(COM EvalLispExpression)
你知道的。net和lisp是可以互相交流的吧?您可以创建一个. NET函数,向lisp返回变量。
一个想法是创建一个. NET函数,将变量列表返回给lisp。搜索LispFunction属性
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2022-5-1 02:58:43 | 显示全部楼层
我假设这些会完成工作??
公共对象GetLispSymbol(字符串名称);
声明类型:Autodesk.AutoCAD.ApplicationServices.Document
程序集:accoremgd, Version=24.2.0.0

公共无效SetLispSymbol(字符串名称,对象值);
声明类型:Autodesk.AutoCAD.ApplicationServices.Document
程序集:accoremgd, Version=24.2.0.0
添加
至少我们不再需要像10年前那样跳过平克环
回复

使用道具 举报

19

主题

99

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
175
发表于 2022-5-1 03:03:49 | 显示全部楼层
感谢所有非常有用的信息!
It's Alive:我知道他们沟通并逐渐探索这一点。当我创建自己的LISP函数时,我超级兴奋,当我在VLIDE中键入它的符号时,它变成了蓝色;男人曾经很酷!我只是触及了可用内容的表面。与此同时,我在.NET上的进步如此之快,以至于我几乎可以比重新布线的东西更快地在.NET中编写旧的LISP例程。
kdub:这些将是非常有帮助的!
Gile:我误用了“持久”这个词。在AutoLISP中,你可以用很少的“主流”知识来逃脱,所以我使用的许多术语都是不正确的。我想我的意思是我希望变量在会话期间以它们的状态存在。我将详细描述我的情况:我正在制作一个LISP例程的改进版本,该例程根据用户输入绘制楼梯。它收集各种输入,包括总高度、立管数量和一些其他参数。我的意图是/如果在同一会话中再次运行该命令,我希望所有先前的输入都填充表单(我正在使用WinForm)。.NET 向导模板的注释提到,当在该会话中首次运行命令时,将实例化主封闭类。我想知道是否在该类本身中声明了我的变量(它们当前位于表单的cs文件中...当我打字时触发了一个灯泡...)是关键。由于该类将在会话的其余部分实例化,因此它的变量也将存在于其余部分?
这是AfraLISP关于如何使用AutoLISP:
https://www.afralisp.net/autolisp/tutorials/application-data.php
存储变量的教程,这比使用xData / xRecords要简单得多。我想这有点一样?它只允许存储字符串,但简单的转换以及大多数AutoLISP程序的简单性意味着它不会产生太大影响。
我只使用xData将信息存储在对象本身(行和块)中。在该应用程序中,我创建了一种具有“Revit”样式标签的方法。我的工作比Revit的更好:-O。代码非常密集(至少对我来说),特别是与上面链接中演示的setcfg/getcfg途径相比。
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2022-5-1 10:35:43 | 显示全部楼层
您可以从本主题的示例中获得一些灵感。除其他事项外,它还显示了tu如何在另一个类中定义的对话框中使用默认值(主类的实例字段)。
回复

使用道具 举报

19

主题

99

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
175
发表于 2022-5-1 11:11:26 | 显示全部楼层
我想我明白了。您的链接/站点非常有用
从您的站点:
公共类命令
{
//实例字段
文档文档;//活动文档
双半径;//半径默认值
字符串层;//层默认值
…因此,当在会话中第一次使用该命令时,“命令”构造函数将运行(在这种情况下,为了加载默认值,您已经显式创建了自己的构造函数)。“Commands”类对象将在整个会话中保持实例化(在命令完成后它不会“解构”),这意味着任何变量更改也将在会话中保持。因此,在第一次调用或后续调用期间,如果用户将“半径”更改为12.0,它将保留该值(对于该会话)
我一直在做一些非常疯狂的事情,包括将变量放在代码中(我知道这对初学者来说是不可能的,但非常诱人)。事实上,我几乎所有的东西都正常工作了,但我认为回去把所有东西都正确编码将是一个很好的练习<非常感谢你的帮助。我得到的有用性远远超出了我原来的问题。非常兴奋尝试它(但不太兴奋修复我的代码,呵呵)
回复

使用道具 举报

4

主题

219

帖子

4

银币

后起之秀

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

铜币
238
发表于 2022-5-1 15:33:39 | 显示全部楼层
在Acad任务中第一次调用CommandMethod(命令)时,AutoCAD会实例化CommandClass。您需要理解CommandMethod是静态的还是非静态的区别:当CommandMethod是静态的时,会在会话级别创建一个CommandClass实例,而如果CommandMethod不是静态的,则会在调用该命令的每个文档级别创建一个CommandClass实例。然而,您永远不需要“新建”一个CommandClass:当调用CommandMethod时,AutoCAD会为您做这件事。通常,我们不会为CommandClass创建构造函数。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-2-4 02:41 , Processed in 0.170488 second(s), 66 queries .

© 2020-2025 乐筑天下

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