明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 209|回复: 9

[源码] 碰到了两个奇怪的无法解决的bug,求助

[复制链接]
发表于 昨天 11:41 | 显示全部楼层 |阅读模式
本帖最后由 hadessna 于 2025-4-23 15:40 编辑

    弄了个绘制垫块的lisp,原理上就是绘制一个矩形+两条对角线,另外加上文字尺寸,并归层建块插入。有两种输入模式,默认是鼠标点击两个对角点绘制,第二种是空格或回车后输入尺寸插入。尺寸取值四舍五入取整,小于1时取1。当宽度小于高度,插入块时把对象旋转90°

    目前有两个无法理解的bug
    1、在DK垫块测试环境.dwg文档中,把图纸内的白色矩形删掉(即空白图纸),首次运行DK时,前一段代码正常执行,但是执行到建块之前就停止并报错。第二次运行DK就正常了……
    2、当输入宽度和高度尺寸相等(即len=wid)也会报错,排查了一下,是尺寸转换的时候出错的,我本意是想当输入的宽度小于高度时,把这两个变量值调转,我尝试用
(SETQ len (VL-SORT (LIST len wid) '<) wid (CAR len) len(CADR len));

(if swap-flag

    (setq temp len len wid wid temp))

两种转换方式都不成功,而且把条件参数改为(setq swap-flag (<= len wid))也不行,让我一个新手实在是摸不着头脑
找了一下DeepSeek,也解决不了,只能厚着脸皮来这里求助大佬了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复

使用道具 举报

发表于 昨天 15:40 | 显示全部楼层
本帖最后由 tryhi 于 2025-4-23 16:07 编辑
hadessna 发表于 2025-4-23 15:23
1、这是同一个问题,在我发出来的那个dwg文件中删除矩形后,其实就已经是空白文档来的了,我的lisp里面有 ...

1、你创建图层的代码是错误的,并没有创建成功
2、定义全局*error*容易引起其他程序冲突
3、手动模式下第53、54行的p1、p2必然被运行导致出错,除非你上传的lsp不是你在用的lsp

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复 支持 1 反对 0

使用道具 举报

发表于 昨天 12:12 | 显示全部楼层
第一个问题,报错是变量未定义,把83行的(setq oldLayer (getvar "CLAYER"))  ; 保存原始图层,放到59行的if前面可解决
第二个问题,饭点到了,没看
回复 支持 反对

使用道具 举报

发表于 昨天 13:37 | 显示全部楼层
tryhi 发表于 2025-4-23 12:12
第一个问题,报错是变量未定义,把83行的(setq oldLayer (getvar "CLAYER"))  ; 保存原始图层,放到59行的i ...

你这时间观念太强了,差评。
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 14:38 | 显示全部楼层
tryhi 发表于 2025-4-23 12:12
第一个问题,报错是变量未定义,把83行的(setq oldLayer (getvar "CLAYER"))  ; 保存原始图层,放到59行的i ...

感谢指导,我尝试了一下,还是一样的效果,当图纸里面是没有图元的空白图纸的时候,还是会在0,0的原点坐标位置把矩形、对角线、文字正常执行绘制出来,但是却没有执行后续的建块和插入操作……
回复 支持 反对

使用道具 举报

发表于 昨天 14:51 | 显示全部楼层
本帖最后由 tryhi 于 2025-4-23 14:59 编辑
hadessna 发表于 2025-4-23 14:38
感谢指导,我尝试了一下,还是一样的效果,当图纸里面是没有图元的空白图纸的时候,还是会在0,0的原点坐 ...

你提的这个是另外的问题了,不是那个变量报错的问题了,只能说这代码写出了不少问题,空白图报错是缺少“Text”“Gasket”层,
还有你最后那句(*error* nil)又是干嘛的?
另外输入模式下报错是因为调用了p1、p2变量,你都没有输入p1、p2,后面调用那肯定出错
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 15:23 | 显示全部楼层
本帖最后由 hadessna 于 2025-4-23 15:27 编辑
tryhi 发表于 2025-4-23 14:51
你提的这个是另外的问题了,不是那个变量报错的问题了,只能说这代码写出了不少问题,空白图报错是缺少“ ...

1、这是同一个问题,在我发出来的那个dwg文件中删除矩形后,其实就已经是空白文档来的了,我的lisp里面有编写了如果存在“Text”“Gasket”层就跳过,如果没有图层才会建立这两个图层,但是我这个dwg文件已经有这两个图层了……而且,执行DK后,他实际上已经切换了图层并把图元绘制出来了,只是没有执行后面的建块和插入代码
2、(*error* nil)是抄的论坛通用代码,就是在修改部分系统变量的情况下,比如捕捉模式和图层切换,如果中途按esc退出去,导致最后的恢复变量的代码还没有执行,这时候这个通用代码就可以让系统变量变回去,(*error* nil)和主程序之前那些代码都是论坛的通用代码,不影响运行的。
3、手动输入模式下,插入点的insertPt是通过点击来指定的,跟p1、p2变量无关(setq insertPt (getpoint "\n指定插入点: ")),点击两点模式下,才会调用p1、p2自动计算插入点。


另外,不管是手动输入还是点击输入,只要是宽度和高度相等,都会报错……
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 16:06 | 显示全部楼层
tryhi 发表于 2025-4-23 15:40
1、你创建图层的代码是错误的,并没有创建成功
2、定义全局*error*容易引起其他程序冲突
3、手动模式下 ...


按你说的,我把那些P1P2变量调整了一下位置,第二个问题确实是解决了,谢谢
不过新建图层我改成了command函数,空白图纸上首次运行依然还是出错

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复 支持 反对

使用道具 举报

发表于 昨天 16:08 | 显示全部楼层
本帖最后由 tryhi 于 2025-4-23 16:10 编辑
hadessna 发表于 2025-4-23 16:06
按你说的,我把那些P1P2变量调整了一下位置,第二个问题确实是解决了,谢谢
不过新建图层我改成了comm ...

空白图纸是因为你的startEnt没处理好,你下载我上传的lsp去看吧

发现你的lsp是UTF-8,CAD2021以上版本?没用过这么高的版本,可能有些不一样
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 16:17 | 显示全部楼层
tryhi 发表于 2025-4-23 15:40
1、你创建图层的代码是错误的,并没有创建成功
2、定义全局*error*容易引起其他程序冲突
3、手动模式下 ...

大佬,请收下我的膝盖,谢谢
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-4-24 06:35 , Processed in 0.156533 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表