Steven Erickson 发表于 2022-7-6 10:26:56

这个口齿不清给了我一个坏a

我有一个简单的lisp程序,可以创建一个星形。我从Michel Trottier那里借的。出于某种原因,当它到达这一行==>(inters pt4 pt1 pt3 pt5)时,它返回一条消息,说==>错误:参数类型错误。据我所知,代码中的一切似乎都很好。
 
你觉得有什么问题吗?
 
;; by Michel Trottier
;;
(defun c:star (/ osn pt rd pt1 pt2 pt3 pt4 pt5 pt1a pt2a pt3a pt4a pt5a)
   (setvar "CMDECHO" 0)
   (setvar "OSMODE" 0)
   (setq osn (getvar "OSMODE")   
         pt (getpoint "\nGive the center of the star")
         rd (getdist "\nRadius? : ")
         pt1 (polar pt (dtr 90) rd)
         pt2 (polar pt (dtr 162) rd)
         pt3 (polar pt (dtr 234) rd)
         pt4 (polar pt (dtr 306) rd)
         pt5 (polar pt (dtr 18) rd)
         pt1a (inters pt1 pt3 pt2 pt5)
         pt2a (inters pt2 pt4 pt1 pt3))
         pt3a (inters pt3 pt5 pt2 pt4))
         pt4a (inters pt4 pt1 pt3 pt5))
         pt5a (inters pt4 pt1 pt2 pt5))
   )
   (defun dtr (x)
   (/ (* x pi) 180.0)
   )
(command "_PLINE" pt1 pt1a pt2 pt2a pt3 pt3a pt4 pt4a pt5 pt5a "C")
(setvar "OSMODE" osn)
(princ)
)

Kerry Brown 发表于 2022-7-6 10:37:46

将DTR定义移到例程的顶部??
... 因此,在需要之前定义它。

Kerry Brown 发表于 2022-7-6 10:46:15

看起来你还有很多额外的括号。

Steven Erickson 发表于 2022-7-6 10:56:37

 
 
我明白你说的所有额外的括号是什么意思。我将修复它并移动函数(dtr)。
 
非常感谢。

Small Fish 发表于 2022-7-6 11:01:12

试试这个:
 

;; by Michel Trottier
;;
(defun c:star (/ osn pt rd pt1 pt2 pt3 pt4 pt5 pt1a pt2a pt3a pt4a pt5a)
(setvar "CMDECHO" 0)
(setvar "OSMODE" 0)
(setq osn (getvar "OSMODE")
pt (getpoint "\nGive the center of the star")
rd (getdist "\nRadius? : ")
pt1 (polar pt (dtr 90) rd)
pt2 (polar pt (dtr 162) rd)
pt3 (polar pt (dtr 234) rd)
pt4 (polar pt (dtr 306) rd)
pt5 (polar pt (dtr 18) rd)
pt1a (inters pt1 pt3 pt2 pt5)
pt2a (inters pt2 pt4 pt1 pt3)
pt3a (inters pt3 pt5 pt2 pt4)
pt4a (inters pt4 pt1 pt3 pt5)
pt5a (inters pt4 pt1 pt2 pt5)
)

(command "_PLINE" pt1 pt1a pt2 pt2a pt3 pt3a pt4 pt4a pt5 pt5a "C")
(setvar "OSMODE" osn)
(princ)
)
(defun dtr (x)
(/ (* x pi) 180.0)
)

Steven Erickson 发表于 2022-7-6 11:07:12

是的,当我去掉多余的部分时,效果很好。谢谢你的帮助。

Kerry Brown 发表于 2022-7-6 11:19:23

 
确定DTR是否真的是程序的局部;如果是这样,请将dtr添加到局部变量列表中,否则定义将变为全局定义,并且浪费了在每次调用例程时重新定义它所需的处理时间。

Kerry Brown 发表于 2022-7-6 11:24:22

我还注意到,在将变量值保存到osn之前,您正在将“OSMODE”设置为0。
 
您可能打算在设置之前保存该值;允许最终(setvar“OSMODE”osn)恢复预保存的值。

Steven Erickson 发表于 2022-7-6 11:30:19

 
我明白你的意思。我会改变的。
 
 
我明白了。因此,(OSMODE)将为0,而不是原始(OSMODE)值。非常感谢您抽出时间。
页: [1]
查看完整版本: 这个Lisp程序给了我一个坏a