MarcoW 发表于 2022-7-6 14:33:22

计算器有点问题

我正在尝试制作我自己的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)
)

可以
简而言之:
有人能帮我理解计算这个吗?
不要马上给我答案,让我努力吧。

Lee Mac 发表于 2022-7-6 14:38:16

这将有望更好地解释事情,而不仅仅是“给你答案”。
 

(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

MarcoW 发表于 2022-7-6 14:40:40

 
是的,谢谢李。
 
所以变量“pi”就像180度,因为(*pi 0.5)给出了90度。仅使用pi给出180度角,使用0.0保持在0度。有道理。
 
我喜欢你在例程中放置setq的方式:这样我可以很容易地看到,如果我有适当数量的括号..->().
 
_. 前缀tu始终用作任何命令中的前缀?这样更好吗?
比如(命令“_.ddatte”等。。?
 
奇怪的是:当我打开一个干净的新绘图时,我尝试了这个命令,它有时会绘制“不好”。我的意思是,看起来有一个变量没有正确计算。这是不可能的,因为它有时有效。
 
看到图片了吗,你能把这个放好吗?左图为涂鸦,右图为#$%@向上。

MarcoW 发表于 2022-7-6 14:45:59

我想这可能和_u有关。pline函数,所以我用一个矩形来做这项工作。
 
现在它保持“形状”,但尺寸不正确。例如,我创建了一个1500 x 200 dist 100的盒子。。。
我有一个1423 x 261 dist 100的盒子。
 
啊。。。

Lee Mac 发表于 2022-7-6 14:48:49

 
“pi”是LISP中公认的符号,“polar”函数以弧度表示角度参数,因此是2*pi的分数。
 
 
包含此前缀是一种很好的编码实践,因为它将考虑其他语言的版本。
 
 
当您使用“_.pline”命令时,这将是起作用的OSNAP。
 
你需要关闭它们,然后再打开,以使这个例程保持一致。

Lee Mac 发表于 2022-7-6 14:50:37

这将帮助您关闭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

MarcoW 发表于 2022-7-6 14:55:03

李,
 
一切都需要学习。我读到你只有9个月的编程lisp。。。这让我惊讶,学习速度快!谢谢你的帮助。
 
我的下一步将提出新的问题:-),所以我很快会和你们谈谈。
附:你什么时候考试?

Lee Mac 发表于 2022-7-6 14:57:24

 
谢谢Marco
 
我的考试本周五开始-我有7门考试,分10天进行。。。

David Bethel 发表于 2022-7-6 15:01:42

我发现弧度有一点很有趣:
 
(来自维基百科)

Lee Mac 发表于 2022-7-6 15:03:30

 
很好的观点David,很好地解释了为什么一个整圆有2*pi,因为周长是2*pi*r。
页: [1] 2
查看完整版本: 计算器有点问题