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))
)
) 首先,您需要通过将OSMODE变量设置为0来禁用自动OSNAP-最好将其当前状态存储到一个变量中,以便在最后恢复:
这样做可以防止使用命令语句将实体添加到最近的OSNAP点。
当做 其次,将点构造为列表而不是字符串更有效:
(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 "")
当做 另一个建议是在设计时注释掉局部变量,以便能够列出它们的值进行调试。
当做 将OSMODE设置为0成功。我在我看到的很多代码中都看到过这种做法,我只是需要受到它的影响才能真正理解它。
至于你的其他建议,特别是关于把我的观点变成列表而不是字符串的建议,非常感谢!作为一个新手,我没有太多的前瞻性思考,大多数时候我仍然在以最基本的方式做事(你可以从我的代码中看出),哈哈。再次感谢。
朗尼 不客气!祝你学习顺利!
请看一下极函数——当你知道位移的大小和方向(角度)时,它将帮助你计算给定点的位移。
这样,上述摘录将成为:
(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 "")
当做 实际上我已经试着先做了,但我真的没有找到答案,我确信这也解决了我上面提到的关于代码过于简单的问题。以下是我之前的经历:
4 一些更正:
[列表=1]
[*]构造点使用列表函数-事实上,点是2或3个实数的列表。
[*]用作极轴参数的点不需要用括号括起来。
[*]极轴语句的角度必须以弧度为单位,而不是以十进制度数为单位。
[/列表]
问候,
页:
[1]