lfe011969 发表于 2022-7-6 10:34:02

Lisp功能不正常

我有一个lisp(见下文),我正在编写它来创建图纸前页上Sheets块的修订状态。它应该是一个长矩形,由间距为0.4的垂直线分隔“在由图纸中的张数决定的长度上分开。还创建了一条水平线,将块分成两半。我面临的问题涉及创建垂直线的代码,该垂直线用于将块划分为等距块。作为整体代码的一部分,它不起作用,这就是结果:

 
虽然你在图中看不到,但这张图有11张纸,11条垂直线确实是由代码绘制的。3画在末尾,6画在中间,2画在开头
 
然而,如果我将代码逐行(仅代码的底部)输入AutoCAD,那么它的工作方式就像我想象的那样:

 
有人能帮我找出我的代码出了什么问题吗?谢谢
 
朗尼
 
P、 我还在学习,所以我知道可能有一千种更好的方法来做我正在做的事情,但为了努力学习,我希望能得到一些提示,告诉我的代码有什么问题。当然,如果你想分享你自己的代码来做同样的事情,那么我想看看。编码是关于逻辑的,我需要找出我的错误,这样我才能纠正我的想法。再次感谢。
 
(defun c:revsh (/   n   linelengthln1pt1
ln1pt2x   ln1pt2y   ln1pt2    ln2pt1 ln2pt2x
ln2pt2y   ln2pt2    ln3pt1    ln3pt2x ln3pt2y
ln3pt2    k         x         ptx       pty
ptz       lnpt1   lnpt2
       )

;; Draw bottom line
(setq n (length (layoutlist)))
(setq linelength (* n 0.4))
(setq ln1pt1 "37.75,11,0")
(setq ln1pt2x (- 37.75 linelength))
(setq ln1pt2y "11")
(setq ln1pt2 (strcat (rtos ln1pt2x 2 2) "," ln1pt2y ",0"))
(command "line" ln1pt1 ln1pt2 "")

;; Draw top line
(setq ln2pt1 "37.75,12,0")
(setq ln2pt2x (- 37.75 linelength))
(setq ln2pt2y "12")
(setq ln2pt2 (strcat (rtos ln2pt2x 2 2) "," ln2pt2y ",0"))
(command "line" ln2pt1 ln2pt2 "")

;; Draw middle line
(setq ln3pt1 "37.75,11.5,0")
(setq ln3pt2x (- 37.75 linelength))
(setq ln3pt2y "11.5")
(setq ln3pt2 (strcat (rtos ln3pt2x 2 2) "," ln3pt2y ",0"))
(command "line" ln3pt1 ln3pt2 "")

;; Draw sheet separators
(setq k 0)
(setq k (length (layoutlist)))
(setq x 1)
(repeat k
   (setq ptx (- 37.75 (* x 0.4)))
   (setq pty 11)
   (setq ptz 12)
   (setq lnpt1 (strcat (rtos ptx 2 2) "," (rtos pty 2 2) ",0"))
   (setq lnpt2 (strcat (rtos ptx 2 2) "," (rtos ptz 2 2) ",0"))
   (command "line" lnpt1 lnpt2 "")
   (setq x (1+ x))
)
)

MSasu 发表于 2022-7-6 10:46:49

首先,您需要通过将OSMODE变量设置为0来禁用自动OSNAP-最好将其当前状态存储到一个变量中,以便在最后恢复:
这样做可以防止使用命令语句将实体添加到最近的OSNAP点。
 
当做

MSasu 发表于 2022-7-6 10:55:10

其次,将点构造为列表而不是字符串更有效:

(setq n          (length (layoutlist)))
(setq linelength (* n 0.4))
(setq ln1pt1   '(37.75 11.0 0.0))
(setq ln1pt2x    (- 37.75 linelength))
(setq ln1pt2y    11.0)
(setq ln1pt2   (list ln1pt2x ln1pt2y 0.0))

(command "line" ln1pt1 ln1pt2 "")
 
 
当做

MSasu 发表于 2022-7-6 11:03:55

另一个建议是在设计时注释掉局部变量,以便能够列出它们的值进行调试。
 
当做

lfe011969 发表于 2022-7-6 11:13:24

将OSMODE设置为0成功。我在我看到的很多代码中都看到过这种做法,我只是需要受到它的影响才能真正理解它。
 
至于你的其他建议,特别是关于把我的观点变成列表而不是字符串的建议,非常感谢!作为一个新手,我没有太多的前瞻性思考,大多数时候我仍然在以最基本的方式做事(你可以从我的代码中看出),哈哈。再次感谢。
 
朗尼

MSasu 发表于 2022-7-6 11:18:47

不客气!祝你学习顺利!
 
请看一下极函数——当你知道位移的大小和方向(角度)时,它将帮助你计算给定点的位移。
这样,上述摘录将成为:
(setq n          (length (layoutlist)))
(setq linelength (* n 0.4))
(setq ln1pt1   '(37.75 11.0 0.0))
(setq ln1pt2   (polar ln1pt1 pi linelength))

(command "line" ln1pt1 ln1pt2 "")
 
 
当做

lfe011969 发表于 2022-7-6 11:26:23

实际上我已经试着先做了,但我真的没有找到答案,我确信这也解决了我上面提到的关于代码过于简单的问题。以下是我之前的经历:
4

MSasu 发表于 2022-7-6 11:40:58

一些更正:
 
[列表=1]
[*]构造点使用列表函数-事实上,点是2或3个实数的列表。
[*]用作极轴参数的点不需要用括号括起来。
[*]极轴语句的角度必须以弧度为单位,而不是以十进制度数为单位。
[/列表]
 
问候,
页: [1]
查看完整版本: Lisp功能不正常