计算器有点问题
我正在尝试制作我自己的lisp,我的意思是不需要将其他例程剪切/粘贴到我自己的lisp中。这一个例子是,只要我有想法,我就会“扩展”。
例程功能:绘制具有指定边长的方框。插入点框必须为
从实际插入点偏移一定距离。最后,它应该是可旋转的。
这是我目前得到的:
(defun c:box1 (/ len leng dist pt1 pt2 pt3 pt4 pt5 pt6)
(setq len (getint "\nLength1:"))
(setq leng (getint "\nLength2:"))
(setq dist (getdist "\nDistance:"))
(setq pt1 (getpoint "\nInsertion:"))
(setq pt2 (polar pt1 (* pi 0.5) dist))
(setq pt3 (polar pt2 (* 2 (* pi 0.5)) (* len 0.5)))
(setq pt4 (polar pt3 (* pi 0.5) leng))
(setq pt5 (polar pt4 0.0 len))
(setq pt6 (polar pt3 0.0 len))
(command "pline" pt3 pt4 pt5 pt6 pt3 "")
(command "rotate" "l" "" pt1pause)
(princ)
)
我的问题:
(defun c:box1 (/ len leng dist pt1 pt2 pt3 pt4 pt5 pt6)
没有问题,给定“/”后的变量在我的例程结束后被清除。
(setq len (getint "\nLength1:"))
(setq leng (getint "\nLength2:"))
我有len1和len2,但后来它卡住了,我想len1不能和(polar…)结合使用下面的东西。这就是为什么我取len和leng变量。
(setq dist (getdist "\nDistance:"))
没问题。。。
(setq pt1 (getpoint "\nInsertion:"))
没问题。。。
我含着泪水计算:
(setq pt2 (polar pt1 (* pi 0.5) dist))
Polar表示角度,对吗?
->(*pi 0.5)是我计算的90度。
因此:计算点2,它“极化”到点1,角度为90度,距离称为“dist”。
(setq pt3 (polar pt2 (* 2 (* pi 0.5)) (* len 0.5)))
(setq pt4 (polar pt3 (* pi 0.5) leng))
(setq pt5 (polar pt4 0.0 len))
(setq pt6 (polar pt3 0.0 len))
以上内容必须包含错误/故障,因为它不能正常工作。
(command "pline" pt3 pt4 pt5 pt6 pt3 "")
(command "rotate" "l" "" pt1pause)
(princ)
)
可以
简而言之:
有人能帮我理解计算这个吗?
不要马上给我答案,让我努力吧。 这将有望更好地解释事情,而不仅仅是“给你答案”。
(defun c:box1(/ len leng dist pt1 pt2 pt3 pt4 pt5 pt6)
; Define Functions and Localise Variables
(setq len(getdist "\nLength1:")
leng (getdist "\nLength2:")
; I'd be more inclined to use "getdist"
; so that the user can pick the distance.
dist (getdist "\nDistance:")
pt1(getpoint "\nInsertion:")
pt2(polar pt1 (* pi 0.5) dist)
;;; + pt2
;;; |
;;; |
;;; + pt1
pt3(polar pt2 pi (* len 0.5))
;;; +--------+ pt2
;;; pt3 |
;;; |
;;; + pt1
pt4(polar pt3 (* pi 0.5) leng)
;;; pt4
;;; +
;;; |
;;; |
;;; +--------+ pt2
;;; pt3 |
;;; |
;;; + pt1
pt5(polar pt4 0.0 len)
;;; pt4 pt5
;;; +-----------------+
;;; |
;;; | pt2
;;; +--------+--------+
;;; pt3 | pt6
;;; |
;;; + pt1
pt6(polar pt3 0.0 len)
); End Setq
(command "_.pline" pt3 pt4 pt5 pt6 pt3 "")
; Remember to use "_." prefix to make it
; compatible for all language versions.
(command "_.rotate" (entlast) "" pt1 pause)
; Use "entlast" to detect last entity
; added to database (hence created).
(princ)
; Exit Cleanly
) ; End box1
是的,谢谢李。
所以变量“pi”就像180度,因为(*pi 0.5)给出了90度。仅使用pi给出180度角,使用0.0保持在0度。有道理。
我喜欢你在例程中放置setq的方式:这样我可以很容易地看到,如果我有适当数量的括号..->().
_. 前缀tu始终用作任何命令中的前缀?这样更好吗?
比如(命令“_.ddatte”等。。?
奇怪的是:当我打开一个干净的新绘图时,我尝试了这个命令,它有时会绘制“不好”。我的意思是,看起来有一个变量没有正确计算。这是不可能的,因为它有时有效。
看到图片了吗,你能把这个放好吗?左图为涂鸦,右图为#$%@向上。
我想这可能和_u有关。pline函数,所以我用一个矩形来做这项工作。
现在它保持“形状”,但尺寸不正确。例如,我创建了一个1500 x 200 dist 100的盒子。。。
我有一个1423 x 261 dist 100的盒子。
啊。。。
“pi”是LISP中公认的符号,“polar”函数以弧度表示角度参数,因此是2*pi的分数。
包含此前缀是一种很好的编码实践,因为它将考虑其他语言的版本。
当您使用“_.pline”命令时,这将是起作用的OSNAP。
你需要关闭它们,然后再打开,以使这个例程保持一致。 这将帮助您关闭OSNAP,但如果您想在此例程中实现完全的“安全”,则需要添加错误处理程序,以便在用户点击Esc时重新打开OSNAP。
(defun c:box1(/ oldos len leng dist pt1 pt2 pt3 pt4 pt5 pt6)
(setq oldos (getvar "OSMODE"); Collect Old OSMODE setting
; Define Functions and Localise Variables
len(getdist "\nLength1:")
leng (getdist "\nLength2:")
; I'd be more inclined to use "getdist"
; so that the user can pick the distance.
dist (getdist "\nDistance:")
pt1(getpoint "\nInsertion:")
pt2(polar pt1 (* pi 0.5) dist)
;;; + pt2
;;; |
;;; |
;;; + pt1
pt3(polar pt2 pi (* len 0.5))
;;; +--------+ pt2
;;; pt3 |
;;; |
;;; + pt1
pt4(polar pt3 (* pi 0.5) leng)
;;; pt4
;;; +
;;; |
;;; |
;;; +--------+ pt2
;;; pt3 |
;;; |
;;; + pt1
pt5(polar pt4 0.0 len)
;;; pt4 pt5
;;; +-----------------+
;;; |
;;; | pt2
;;; +--------+--------+
;;; pt3 | pt6
;;; |
;;; + pt1
pt6(polar pt3 0.0 len)
); End Setq
(setvar "OSMODE" 0); Turn off the OSnaps!
(command "_.pline" pt3 pt4 pt5 pt6 pt3 "")
; Remember to use "_." prefix to make it
; compatible for all language versions.
(command "_.rotate" (entlast) "" pt1 pause)
; Use "entlast" to detect last entity
; added to database (hence created).
(setvar "OSMODE" oldos); Turn OSMODE back on
(princ)
; Exit Cleanly
) ; End box1
李,
一切都需要学习。我读到你只有9个月的编程lisp。。。这让我惊讶,学习速度快!谢谢你的帮助。
我的下一步将提出新的问题:-),所以我很快会和你们谈谈。
附:你什么时候考试?
谢谢Marco
我的考试本周五开始-我有7门考试,分10天进行。。。 我发现弧度有一点很有趣:
(来自维基百科)
很好的观点David,很好地解释了为什么一个整圆有2*pi,因为周长是2*pi*r。
页:
[1]
2