Lisp程序未完成
你好我做了这个简单的Autolisp程序,但它并没有完成这个姿势。
可能是由于角度错误(72)。或该线的长度(125.873)。
注意:在执行程序后,请注意起点和终点没有连接。。。。为什么?
(defun c:ax (/ p1 p2 p3 p4 p5oldsnap oldortho newortho)
(setq small 38)
(setq pcs1 (getdist"\nLength of First peice: "))
(setq p1 (getpoint"\nSpecify the start point of peice:"))
(setq p2 (polar p1 (DTR 270) 120))
(setq p3 (polar p2 (DTR 0)(- pcs1 small)))
(setq p4 (polar p3 (DTR 72) 125.873))
(setq p5 (polar p4 (DTR 180) pcs1))
(setq oldsnap (getvar "osmode"))
(setq oldortho (getvar "orthomode"))
(setq newsnap (setvar "osmode" 0))
(setq newortho (setvar "orthomode" 0))
(command "_pline" p1 "_w" 0 0 p2 p3 p4 p5 "")
(setvar "osmode" oldsnap)
(setvar "orthomode" oldortho)
(princ "Made by Tharwat")
(princ))
;++++++++++++ degree to radians ++++++++++++
(defun DTR (ang)(* pi (/ ang 180.0)))
非常感谢您的帮助。。。
谢谢
塔瓦特 姿势应如下图所示:
看见
我只能评论你的三角学,而不是Lisp程序。
你的72角并不精确,无论如何应该是(72+180)。
为什么不从下一行的右端开始lisp绘图?然后lisp将绘制600线、120线和638线。然后用“c”选项关闭多段线。在这种情况下,你不必计算出尴尬的角度。 我对你的代码做了一些修改——总是尝试计算你的值,而不是内置它来提高精度。
(defun c:ax( / p1 p2 p3 p4 p5 small height SlopeLength SlopeAngle oldsnap )
(setq small38.0
height 120.0)
(setq pcs1 (getdist"\nLength of First piece: "))
(setq p1 (getpoint"\nSpecify the start point of piece:"))
(setq p2 (polar p1 (DTR 270) height))
(setq p3 (polar p2 0.0 (- pcs1 small)))
(setq SlopeLength (sqrt (+ (expt small 2) (expt height 2)))
SlopeAngle(atan (/ height small)))
(setq p4 (polar p3 SlopeAngle SlopeLength))
(setq p5 (polar p4 pi pcs1))
(setq oldsnap (getvar "osmode"))
(setvar "osmode" 0)
(command "_pline" p1 "_w" 0 0 p2 p3 p4 p5 "")
(setvar "osmode" oldsnap)
(princ "Made by Tharwat")
(princ)
)
;++++++++++++ degree to radians ++++++++++++
(defun DTR (ang)(* pi (/ ang 180.0)))
当做 非常感谢msasu,太棒了。
您确实重新计算了角度值,并为高度指定了一个值。尽管如此,我还是手动计算了角度值,并在代码中插入了该值。
既然这些值也正确,为什么Autocad不能正确理解或执行?
我希望你能给我解释一下。
非常感谢你。
塔瓦特 不客气!
这种差距是因为使用手动计算/舍入的值无法获得足够的精度:例如,坡度部分的角度为72.42874。。。而不是72度。
当做
首先感谢您的回复。
关于你的问题。这种处理Autolisp的方法是完全错误的,它是一种非常先进的方法,但向后而不是向前。
这就是为什么。
塔瓦特
事实上,我建议你可以计算p4,从p1开始,在0的方位上取600。在评估了p1、p2、p3和p4之后,您不需要p5,反正p5应该与p1相同。然后,多段线的绘制是完全独立的命令,不必从p1开始,它可以从p4开始,然后当到达p3时,用“c”选项闭合该线。
那么你就不需要用一个不可靠的长度和一个不可靠的方向来计算p4,你的p5是错误的,因为它是从p4推导出来的。我不确定我的逻辑出了什么问题,但也许你不理解我,我对Autolisp了解得足够多,以至于无法理解一些简单的错误计算。
无论如何,你有一些有效的东西,这就是一切。
我完全不同意——埃尔登的方法要简单得多:
(defun c:test ( / delt hgt l pt p1 )
(setq delt 38. hgt 120.)
(if (and (setq l(getdist "\nSpecify Length: "))
(setq pt (getpoint "\nPick Insertion: ")))
(LWPoly (list (polar pt 0 l) pt (setq p1 (polar pt (/ pi 2.) hgt))
(polar p1 0 (+ l delt))) 1)
)
(princ)
)
(defun LWPoly ( lst cls )
(entmakex (append (list (cons 0 "LWPOLYLINE")
(cons 100 "AcDbEntity")
(cons 100 "AcDbPolyline")
(cons 90 (length lst))
(cons 70 cls))
(mapcar (function (lambda ( p ) (cons 10 p))) lst))))
Hi Eldon。
感谢您的第二次回复,并尽最大努力提供帮助。
你的观点没有错,但不能发展那么多。我从你第一次给我写信时就明白了你的意思,因为我刚开始写的这些代码是一个大型Lisp程序的一部分。
所以你的想法真的很聪明,但对于唯一的工具或一个简单的姿势。
我真的很喜欢你那种表达想法的技巧。。。真的
致以最良好的问候,
塔瓦特
页:
[1]
2