Jump to content

Recommended Posts

Posted

I have this lisp routine that rounds and puts the length on the line, but I would like for it to always come out with an even number. Is that possible?

 

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

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

Posted

if odd d4d => d4d = first higher number by 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)))) 
   [highlight](if (/= (/ (float d4d) 2) (fix (/ (float d4d) 2))) (setq d4d (+ d4d 1)) )[/highlight]           
       (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.

Posted

A test for even integers that rounds up:

(defun even (n)
 (if (zerop (rem n 2)) n (1+ n)))

 

I don't quite understand the program, but the front end could be compacted:

 

 [b][color=BLACK]([/color][/b]initget 7[b][color=BLACK])[/color][/b]
 [b][color=BLACK]([/color][/b]setq rise [b][color=FUCHSIA]([/color][/b]getint [color=#2f4f4f]"\nSlope Rise in 12:   "[/color][b][color=FUCHSIA])[/color][/b][b][color=BLACK])[/color][/b]
 [b][color=BLACK]([/color][/b]setq mp [b][color=FUCHSIA]([/color][/b]/ 1. [b][color=NAVY]([/color][/b]sin [b][color=MAROON]([/color][/b]angle '[b][color=GREEN]([/color][/b]0 0[b][color=GREEN])[/color][/b] [b][color=GREEN]([/color][/b]list rise 12[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b][b][color=BLACK])[/color][/b]

 

-David

Posted

Thank you to all of you. David yours worked perfect. I knew I could do the top smaller but I got lazy and didn't want to look up the math on it.

Thank you again

Posted (edited)

(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)))) 
   [highlight](if (/= (/ (float d4d) 2) (fix (/ (float d4d) 2))) (setq d4d (+ d4d 1)) )[/highlight]           
       (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))

Marko j_spawn_h, among other things, consider using COND in lieu of repeated IF statements.

 

Also, consider testing for valid user input, before continuing with routine:

 

Pseudo code:

 

(defun c:RL ( / [color=seagreen];| Don't forget to localize vars |;[/color])
 (if (and (princ "enter roof slope rise for rafter")
          (setq raf1 (getstring "\n INPUT: 2,3,4,5,6,7,8,9,10,12,14,15,16"))
          (cond [color=seagreen];| Options here |;[/color]))
   (progn
     [color=seagreen];; <-- Do soemthing[/color]
     )
   (prompt "\n** Invalid input ** "))
 (princ))

HTH

Edited by BlackBox
Code author corrected

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...