乐筑天下

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

[编程交流] DCL/LSP开发-Consta

[复制链接]

1

主题

5

帖子

4

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 15:16:47 | 显示全部楼层 |阅读模式
几个问题:
1) DCL错误会在运行时锁定autocad-需要使用任务管理器终止autocad
2) Autocad在生成一个程序时崩溃,我忘记了保存所有更改,即使它提示我可以保存这些更改。
3) 因此,正在缓存的调试日志记录与应用程序一起写入文件的日志消息是不完整的。
 
一些细节:
我已经使用Autocad很多年了,在lsp中编写了许多程序,但在DCL中更新了。在开发DCL、动作、事件等的过程中,我发现(由于我自己的编码错误),autocad在测试我正在制作的项目时会锁定。在过去的一个月里,我已经搜索了很多小时,但尚未找到解决方案,如果在启动DCL或与DCL交互时发生错误,则界面会停止响应,并需要任务管理器kill autocad才能重新启动。
 
我已经设置了自定义错误陷阱,使用VL-BT和绘图日志文件(实际上在我杀死autocad之前会转储错误)。虽然我希望我能在第一次(可能几十年后)正确获得代码,但有没有更好的方法在不杀死autocad的情况下退出dcl?
 
我遇到的另一个问题是,在Visual Lisp IDE中,如果我在构建之前忘记了“保存所有”,我会得到一个命令提示,其中显示我可以保存;但是,它每次都会崩溃autocad。这正常吗?这种行为发生在2016年和2018年。
 
谢谢你的帮助和建议。
回复

使用道具 举报

1

主题

5

帖子

4

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 15:22:47 | 显示全部楼层
我有一个带有许多lsp文件的visual lisp项目。当我编译项目时,Visual Lisp IDE显示一条消息,即在构建之前需要保存一些文件。我单击“全部保存”,然后AutoCAD崩溃!
 
我的工作是在建造之前保存所有东西,但有时我会忘记。其他人有这个问题吗?有已知的解决方案吗?
 
我在过去一个月的不同时间进行了搜索,但没有找到任何解决问题的方法。
 
如有任何建议,我们将不胜感激。
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 15:27:21 | 显示全部楼层
讨厌被人踢开一扇敞开的门(不是!)但在测试或编译之前,要训练自己保存工作,只需将其视为数字尿布训练。。。对编辑器中的对话框使用预览功能。使用ok\u only或ok\u cancel按钮创建模板函数。创建新函数时,从模板开始,另存为,然后在创建时添加按钮。
回复

使用道具 举报

1

主题

5

帖子

4

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 15:27:57 | 显示全部楼层
Thx的评论。我通常在编译之前保存,但有时会忘记。我只是想知道为什么每次我忘记保存时它都会崩溃。Autocad知道您没有保存它,它会警告您,然后询问您是否要保存,然后它会崩溃。
 
其他人也是这样吗?我更擅长存钱,这不是问题,只是偶尔让人烦恼。
 
了解您对DCL的评论,我使用预览并构建DCL添加功能。虽然DCL似乎可以工作,但在我编写代码时,是支持LSP导致了问题。我犯了一些编码错误,在设置动作块、模式或值时,如果出现错误,autocad将停止响应。
 
只是想知道是否有一种方法可以避免每次在故障排除过程中杀死autocad。另一种选择是停止编码错误,这样它就不会崩溃。。。也许有一天。
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 15:31:29 | 显示全部楼层
只有几件事你必须确保是正确的。永远不要引用不存在的互动程序。因此,最好复制并粘贴名称以避免拼写错误。大多数瓷砖都需要字符串作为输入,因此在使用之前请检查数据。如果你有一个带有预定义字符串的弹出列表,比如left、right、bottom等等,你甚至可以把它们放在dcl定义本身中。但是当你传递一个列表时,首先检查所有项目是否都是字符串。测试时,在每个磁贴前放置一块手表,以确保看到正确的数据。当涉及到混合数据类型时,Lisp真的很宽容,但dcl不是。如果你在代码方面有困难,只要发布,总会有人愿意帮助你。
 
 
刚刚记得Grrr对dcl输入进行了很好的检查:http://www.cadtutor.net/forum/showthread.php?102696-AutoCAD-Lisp-Routine-to-change-all-attributes-text-to-a-style/page3&高亮显示=%28defun+void
 
 
啊,我明白了。。。虽然我喜欢这个子对象,但我在一些DCL例程中使用了它/重写版本/来检查有效的编辑框输入。
在没有vl的情况下仍然可解-*:
  1. ; _$ (mapcar 'valid-p (list nil "" " " "  " 123 "str" "                            ")) >> (nil nil nil nil 123 T nil)
  2. (defun valid-p ( s / c )   
  3. (cond ( (not (eq 'STR (type s))) s)  ( (= s "") nil)  ( (/= (setq c (substr s 1 1)) " ") t) ( (valid-p (substr s 2)) )   ) ); defun valid-p
(尽管上述函数测试的是值,而不是字符串)
 
 
还有几个:
  1. ; test (setq a 1 b "" c nil) -> 1 "" nil -> (nonil '(a b c)) -> 1 "" ""
  2. (defun nonil (%vl) (mapcar '(lambda (x) (if (null (vl-symbol-value x))(set (read (vl-symbol-name x)) ""))) %vl))
  3. ; same but for 1 value
  4. (defun !nil (%v) (if (null %v) "" %v))
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 15:36:46 | 显示全部楼层
您可以只加载一个dcl,并将其作为第一个检查来查看dcl是否至少工作,然后选择任何一个,关闭dcl并检查dcl响应的lisp答案,例如命令行类型上的(action\u tile“key1”“(setq val1$value)”)!如果得到nil,val1应该显示一个文本字符串。如果这是代码所期望的,那么可以检查其他变量!val2!val3
 
张贴您的dcl,我们可以看看。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 15:41:10 | 显示全部楼层
 
谢谢,虽然我不记得为什么我用了那个“c”变量-
也许我的第一个意图是映射到整个字符串并返回每个chr的结果,而不是vl-some'ing并返回布尔值思考:
 
 
 
很好,现在你让我玩引用的符号列表(也称为未评估列表)。
 
我认为仅仅重新分配值比检查null更快:
  1. ; _$ (mapcar 'set '(a b c d) '("" nil 23 nil)) >> ("" nil 23 nil)
  2. ; _$ (nil->dquote '(a b c d))                  >> ("" "" 23 "")
  3. (defun nil->dquote ( nil->dquote:L )
  4. (foreach nil->dquote:x nil->dquote:L
  5.    (set nil->dquote:x (cond ((vl-symbol-value nil->dquote:x)) ("")))
  6. ); foreach
  7. (mapcar 'eval nil->dquote:L) ; if you want-ed the function to return something
  8. )

 
您可以将“”切换为零,反之亦然:
  1. ; _$ (mapcar 'set '(a b c d e x) '(nil "" nil nil 123 "string")) >> (nil "" nil nil 123 "string")
  2. ; _$ (nil<->dquote '(a b c d e x))                               >> ("" nil "" "" 123 "string")
  3. ; _$ (nil<->dquote '(a b c d e x))                               >> (nil "" nil nil 123 "string")
  4. (defun nil<->dquote ( nil<->dquote:L )
  5. (foreach nil<->dquote:x nil<->dquote:L
  6.    (set nil<->dquote:x ((lambda (x) (cond ( (not x) "") ( (= x "") nil) (x))) (vl-symbol-value nil<->dquote:x)))
  7. ); foreach  
  8. (mapcar 'eval nil<->dquote:L) ; if you want-ed the function to return something
  9. ); defun

 
注意,在我的代码中:
“->”表示“到”
“”表示“开关”
 
我使用这种类型的子函数(重新分配符号的值)非常罕见,但最常见的是这种子函数(在手动调试时,将代码中的变量重置为零):
  1. ; (SymsSetToNull '(a b c d e f g h i x a1 a2 a3 a4 b1 b2 b3 b4 aa bb cc))
  2. (defun SymsSetToNull ( SymsSetToNull:L )
  3. (foreach SymsSetToNull:x SymsSetToNull:L
  4.    (set SymsSetToNull:x nil)
  5. )
  6. (mapcar 'eval SymsSetToNull:L)
  7. )
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 15:43:33 | 显示全部楼层
 
 
很高兴你能再次上场
 
 
我主要关注易读的代码,而不是速度,除非我需要它。为了一个字符串,我不得不搜索了几千张图纸,并决定让李大师的bfind试一试,但速度太慢了,只是因为我需要扫描简单的文本和属性,而且它做得更快,所以很快就用一些数字Dutape制作了一个更轻的版本哈哈。并且还发现wcmatch比vl字符串搜索更快,所以不要认为我会将我的小文本应用程序重写为vl命令。
 
 
但是OP的主要问题是在将数据传递给set_tile之前首先检查数据
 
 
无论如何,对于繁重的编码来说,它变得越来越热了
 
 
是时候
 
 
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 15:48:06 | 显示全部楼层
 
我倾向于将整个代码分解为子功能,每个子功能都清楚地描述了所需的输入以及它返回/或执行的操作。
如果Subfo中出现错误,那么我将对此负责,并尝试修复它。。(但通常首先尝试预测所有可能的错误)。
 
 
 
我看到他使用RegExp对象是为了覆盖所有/大部分文本格式字符串的处理,所以是的,它应该相对较慢,但很有必要-
否则,人们可能会把他的画搞砸,并责怪他。
 
 
 
的确
 
 
本体论,
我通常提出/定义问题。lsp代码(使用DCL)进入VLIDE的控制台,以调试它
运行它并获取错误后-
从VLIDE的窗口->调试->最后一个中断源来确定发生错误的位置和原因。
要强制关闭锁定的对话框,只需使用Ctrl+R,或在VLIDE的窗口调试->重置到顶层。
 
但在我看来,最好的方法就是使用自己的无错误DCL代码模板,然后直接使用它。
我看不到任何其他使用任务管理器杀死ACAD的方法,因为锁定的对话框和VLIDE没有打开。
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 15:49:55 | 显示全部楼层
只是玩的东西,只是为了教育目的
错误500真令人恼火!
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-14 13:04 , Processed in 0.978910 second(s), 73 queries .

© 2020-2025 乐筑天下

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