j_spawn_h Posted September 26, 2011 Posted September 26, 2011 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)) Quote
Lt Dan's legs Posted September 26, 2011 Posted September 26, 2011 (setq dist (getdist "\nSpecify distance: ")) (setq disttostring (rtos dist 2 0)) Quote
marko_ribar Posted September 26, 2011 Posted September 26, 2011 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. Quote
David Bethel Posted September 26, 2011 Posted September 26, 2011 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 Quote
j_spawn_h Posted September 26, 2011 Author Posted September 26, 2011 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 Quote
BlackBox Posted September 26, 2011 Posted September 26, 2011 (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 September 26, 2011 by BlackBox Code author corrected Quote
Recommended Posts
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.