j_spawn_h 发表于 2022-7-6 08:52:53

我的解决方案是偶数。

我有一个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))

Lt Dan's l 发表于 2022-7-6 09:05:11

(setq dist (getdist "\nSpecify distance: "))
(setq disttostring (rtos dist 2 0))

marko_ribar 发表于 2022-7-6 09:17:04

如果奇数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。

David Bethel 发表于 2022-7-6 09:40:16

对整数进行四舍五入的偶数测试:

(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)))))

 
-大卫

j_spawn_h 发表于 2022-7-6 09:46:59

谢谢大家。你的大卫做得很好。我知道我可以做的顶部较小,但我变得懒惰,不想查它的数学。
再次感谢你

BlackBox 发表于 2022-7-6 10:03:09

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]
查看完整版本: 我的解决方案是偶数。