我的解决方案是偶数。
我有一个lisp例程,它会循环并将长度放在一行上,但我希望它总是用偶数。这可能吗?(defun c:rl ()
(prompt "enter roof slope rise for rafter")
(setq raf1 (getstring "\n INPUT: 2,3,4,5,6,7,8,9,10,12,14,15,16"))
(if (= raf1 "2") (setq raf2 1.014))
(if (= raf1 "3") (setq raf2 1.031))
(if (= raf1 "4") (setq raf2 1.054))
(if (= raf1 "5") (setq raf2 1.083))
(if (= raf1 "6") (setq raf2 1.118))
(if (= raf1 "7") (setq raf2 1.158))
(if (= raf1 "8") (setq raf2 1.202))
(if (= raf1 "9") (setq raf2 1.250))
(if (= raf1 "10") (setq raf2 1.302))
(if (= raf1 "11") (setq raf2 1.357))
(if (= raf1 "12") (setq raf2 1.414))
(if (= raf1 "13") (setq raf2 1.475))
(if (= raf1 "14") (setq raf2 1.537))
(and (setq ss (ssget "_:L" '((0 . "LINE"))))
(while (setq en (ssname ss 0))
(setq ed (entget en))
(setq p10 (cdr (assoc 10 ed)))
(setq p11 (cdr (assoc 11 ed)))
(setq mpt (mapcar '(lambda (a b) (* (+ a b) 0.5)) p10 p11))
(setq d2d (distance (cdr (reverse p10)) (cdr (reverse p11))))
(setq d1d (/ d2d 12.))
(setq d3d (* d1d raf2))
(if (<= d3d 8.0)
(setq d4d (fix (+ d3d 1))))
(if (>= d3d 9.0)
(setq d4d (fix (* (+ (/ d3d 2.0) 0.5)2.0))))
(setq lan (angle p10 p11))
(setq dir (if (< (* pi 0.5) lan (* pi 1.5)) - +))
(setq tan (if (> (* pi 1.5) lan (* pi 0.5)) (+ lan pi) lan))
(entmake (list (cons 0 "TEXT")
(cons 8 (getvar "CLAYER"))
(cons 7 (getvar "TEXTSTYLE"))
(cons 40 (getvar "TEXTSIZE"))
(cons 72 4)
(setq fg(cons 10 (polar mpt (dir (angle p10 p11) (* pi 0.5))
(getvar "TEXTSIZE"))))
(setq hg(cons 11 (polar mpt (dir (angle p10 p11) (* pi 0.5))
(getvar "TEXTSIZE"))))
(cons 50 tan)
(setq rb1 (cons 1 (strcat (itoa d4d) "'")))))
(ssdel en ss)))
(prin1)) (setq dist (getdist "\nSpecify distance: "))
(setq disttostring (rtos dist 2 0)) 如果奇数d4d=>d4d=第一个更高的数字乘以1
(defun c:rl ()
(prompt "enter roof slope rise for rafter")
(setq raf1 (getstring "\n INPUT: 2,3,4,5,6,7,8,9,10,12,14,15,16"))
(if (= raf1 "2") (setq raf2 1.014))
(if (= raf1 "3") (setq raf2 1.031))
(if (= raf1 "4") (setq raf2 1.054))
(if (= raf1 "5") (setq raf2 1.083))
(if (= raf1 "6") (setq raf2 1.118))
(if (= raf1 "7") (setq raf2 1.158))
(if (= raf1 "8") (setq raf2 1.202))
(if (= raf1 "9") (setq raf2 1.250))
(if (= raf1 "10") (setq raf2 1.302))
(if (= raf1 "11") (setq raf2 1.357))
(if (= raf1 "12") (setq raf2 1.414))
(if (= raf1 "13") (setq raf2 1.475))
(if (= raf1 "14") (setq raf2 1.537))
(and (setq ss (ssget "_:L" '((0 . "LINE"))))
(while (setq en (ssname ss 0))
(setq ed (entget en))
(setq p10 (cdr (assoc 10 ed)))
(setq p11 (cdr (assoc 11 ed)))
(setq mpt (mapcar '(lambda (a b) (* (+ a b) 0.5)) p10 p11))
(setq d2d (distance (cdr (reverse p10)) (cdr (reverse p11))))
(setq d1d (/ d2d 12.))
(setq d3d (* d1d raf2))
(if (<= d3d 8.0)
(setq d4d (fix (+ d3d 1))))
(if (>= d3d 9.0)
(setq d4d (fix (* (+ (/ d3d 2.0) 0.5)2.0))))
(if (/= (/ (float d4d) 2) (fix (/ (float d4d) 2))) (setq d4d (+ d4d 1)) )
(setq lan (angle p10 p11))
(setq dir (if (< (* pi 0.5) lan (* pi 1.5)) - +))
(setq tan (if (> (* pi 1.5) lan (* pi 0.5)) (+ lan pi) lan))
(entmake (list (cons 0 "TEXT")
(cons 8 (getvar "CLAYER"))
(cons 7 (getvar "TEXTSTYLE"))
(cons 40 (getvar "TEXTSIZE"))
(cons 72 4)
(setq fg(cons 10 (polar mpt (dir (angle p10 p11) (* pi 0.5))
(getvar "TEXTSIZE"))))
(setq hg(cons 11 (polar mpt (dir (angle p10 p11) (* pi 0.5))
(getvar "TEXTSIZE"))))
(cons 50 tan)
(setq rb1 (cons 1 (strcat (itoa d4d) "'")))))
(ssdel en ss)))
(prin1))
M.R。 对整数进行四舍五入的偶数测试:
(defun even (n)
(if (zerop (rem n 2)) n (1+ n)))
我不太懂这个程序,但前端可以压缩:
(initget 7)
(setq rise (getint "\nSlope Rise in 12: "))
(setq mp (/ 1. (sin (angle '(0 0) (list rise 12)))))
-大卫 谢谢大家。你的大卫做得很好。我知道我可以做的顶部较小,但我变得懒惰,不想查它的数学。
再次感谢你 Marko j_spawn_h,除其他外,考虑使用COND代替重复的IF语句。
此外,在继续执行例行程序之前,请考虑测试有效的用户输入:
伪代码:
(defun c:RL(/;|别忘了定位变量|;)(if(and(princ“enter roof slope rise for rafter”)(setq raf1(getstring“\n输入:2,3,4,5,6,7,8,9,10,12,14,15,16”)(cond;|选项在此|;;)(progn;;
页:
[1]