sadhu Posted March 1, 2010 Share Posted March 1, 2010 Is there a lisp function to round up numbers ? What I need to do is round up numbers to the second decimal point as in the example below. Rounds up to the higher value. e.g. 12.00 remains 12.00 12.01 becomes 12.05 12.12 becomes 12.15 12.14 becomes 12.15 12.16 becomes 12.20 12.19 becomes 12.20 Quote Link to comment Share on other sites More sharing options...
Tiger Posted March 1, 2010 Share Posted March 1, 2010 In dimensions? There is already a function there for it - find roundoff in the Properties box or at the Dim Style. Quote Link to comment Share on other sites More sharing options...
Lee Mac Posted March 1, 2010 Share Posted March 1, 2010 Not sure quite what you are driving at, but this should cater for all dp: (defun Round (num dp / fac) (setq fac (float (expt 10 dp))) (if (< 0.5 (rem (setq num (* fac num)) 1)) (/ (1+ (fix num)) fac) (/ (fix num) fac))) Quote Link to comment Share on other sites More sharing options...
sadhu Posted March 1, 2010 Author Share Posted March 1, 2010 In dimensions? There is already a function there for it - find roundoff in the Properties box or at the Dim Style. No, it isn't dimension. It's a value returned by a lisp routine. So I guess roundoff doesn't apply to my case - or does it ? Quote Link to comment Share on other sites More sharing options...
Tiger Posted March 1, 2010 Share Posted March 1, 2010 No, the roundoff that I was getting at doesn't apply then. Can you psot the lisp routine? I don't know much about lisps but others know loads and they might help you alter the original instead of adding more steps to your routines. Quote Link to comment Share on other sites More sharing options...
sadhu Posted March 1, 2010 Author Share Posted March 1, 2010 (defun Round (num dp / fac) (setq fac (float (expt 10 dp))) (if ( (/ (1+ (fix num)) fac) (/ (fix num) fac))) I tried to integrate your code in mine but i guess I'm still a .. what I need to do is get "d1" rounded up like this. evaluats the second decimal digit (second after the decimal seperater) and rounds it up to 5 if less than 5 0 if greater than 5 but increments the first decimal number by 1 e.g. 12.00 remains 12.00 12.01 becomes 12.05 12.12 becomes 12.15 12.14 becomes 12.15 12.16 becomes 12.20 12.19 becomes 12.20 two: ;cumulative distance ;this routine is just like the Autocad Distance command with the ;exception that it allows you to pick more than 2 consecutive points. ;the routine will display the cumulative distance and the distance ;between the last two points picked on the command line. (defun c:cd () (setvar "cmdecho" 0) (graphscr) (setq p1 (getpoint "\nPick start point ") p2 (getpoint p1 "\nPick next point ") d1 (distance p1 p2) prdist (strcat "\nDistance: " (rtos d1)) ) (princ prdist) (setq p3 (getpoint p2 "\nPick next point or RETURN if done ")) (while p3 (setq d0 (distance p2 p3) d1 (+ (distance p2 p3) d1) p2 p3 prdist (strcat "\nDistance: " (rtos d0) ", Cumulative distance: " (rtos d1)) ) (princ prdist) (setq p3 (getpoint p2 "\nPick Next Point ")) ) (setq cumd (strcat "Cumulative distance --> " (rtos d1))) (prompt cumd) (princ) ;-------------start dialog------------ (setq dcl_id (load_dialog "hello_sp.dcl")) ; Load the DCL file. (if (not (new_dialog "hello_sp" dcl_id)) ; Initialize the dialog. (exit) ; Exit if this doesn't ; work. ) ;------------ set values in dialog box---- (set_tile "discesa" " ") (set_tile "masetto1" " ") (set_tile "salita" " ") (set_tile "tolleranza" " ") (set_tile "grand_dist" (rtos d1 2 2)) (set_tile "grand_dist_" "GRAND TOTAL (CD)") ;------------ end - set values in dialog box---- (start_dialog) ; Display the dialog ; box. (unload_dialog dcl_id) ; Unload the DCL file. (princ) ;------------------------ (setq lay "RH MEASURE Layer" ;; Layer ) (and (setq pnt (getpoint "\nSpecify Text placement point: ")) (entmakex (list '(0 . "MTEXT") '(100 . "AcDbEntity") '(100 . "AcDbMText") (cons 8 lay) (cons 1 (rtos tot2 2 2)) (cons 7 (getvar 'textstyle)) (cons 10 pnt) (cons 40 0.1) ) ;_ list ) ;_ entmakex ) ;_ and ) ;------------------------ (princ "\nType CD to run Cumulative Distance") (princ) Quote Link to comment Share on other sites More sharing options...
Lee Mac Posted March 1, 2010 Share Posted March 1, 2010 That's a dodgy bit of rounding, but this should work then (defun Round (num dp / fac rm) (setq fac (float (expt 10 dp)) rm (rem (setq num (* fac num)) 1)) (/ (cond ( (zerop rm) (fix num)) ( (< 0.5 rm) (1+ (fix num))) ( (+ (/ 5 fac) (fix num)))) fac)) Quote Link to comment Share on other sites More sharing options...
Lee Mac Posted March 1, 2010 Share Posted March 1, 2010 How about this? [b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] c:cd [b][color=RED]([/color][/b][b][color=BLUE]/[/color][/b] *error* Round DLST PT PTLST TOT[b][color=RED])[/color][/b] [i][color=#990099];; Lee Mac ~ 01.03.10[/color][/i] [b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] *error* [b][color=RED]([/color][/b]msg[b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]or[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]wcmatch[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]strcase[/color][/b] msg[b][color=RED])[/color][/b] [b][color=#a52a2a]"*BREAK,*CANCEL*,*EXIT*"[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]princ[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]strcat[/color][/b] [b][color=#a52a2a]"\n** Error: "[/color][/b] msg [b][color=#a52a2a]" **"[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]princ[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] Round [b][color=RED]([/color][/b]num dp [b][color=BLUE]/[/color][/b] fac rm[b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] fac [b][color=RED]([/color][/b][b][color=BLUE]float[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]expt[/color][/b] [b][color=#009900]10[/color][/b] dp[b][color=RED])[/color][/b][b][color=RED])[/color][/b] rm [b][color=RED]([/color][/b][b][color=BLUE]rem[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] num [b][color=RED]([/color][/b][b][color=BLUE]*[/color][/b] fac num[b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=#009900]1[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]/[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cond[/color][/b] [b][color=RED]([/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]zerop[/color][/b] rm[b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]fix[/color][/b] num[b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]<[/color][/b] [b][color=#009999]0.5[/color][/b] rm[b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]1+[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]fix[/color][/b] num[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]+[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]/[/color][/b] [b][color=#009900]5[/color][/b] fac[b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]fix[/color][/b] num[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] fac[b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]if[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]car[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] ptLst [b][color=RED]([/color][/b][b][color=BLUE]list[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]getpoint[/color][/b] [b][color=#a52a2a]"\nSpecify First Point: "[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]progn[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]while[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] pt [b][color=RED]([/color][/b][b][color=BLUE]getpoint[/color][/b] [b][color=#a52a2a]"\nSpecify Next Point: "[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]car[/color][/b] ptLst[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]mapcar[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]function[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]lambda[/color][/b] [b][color=RED]([/color][/b]from to[b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]grdraw[/color][/b] from to [b][color=#009900]3[/color][/b] [b][color=#009900]1[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]reverse[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] ptLst [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b] pt ptLst[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cdr[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]reverse[/color][/b] ptLst[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] dLst [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b] [b][color=RED]([/color][/b]Round [b][color=RED]([/color][/b][b][color=BLUE]distance[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]car[/color][/b] ptlst[b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cadr[/color][/b] ptlst[b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=#009900]1[/color][/b][b][color=RED])[/color][/b] dLst[b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]princ[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]strcat[/color][/b] [b][color=#a52a2a]"\n<< Distance: "[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]rtos[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]car[/color][/b] dLst[b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=#a52a2a]" -- "[/color][/b] [b][color=#a52a2a]"Cumulative: "[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] tot [b][color=RED]([/color][/b][b][color=BLUE]rtos[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]apply[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]function[/color][/b] +[b][color=RED])[/color][/b] dLst[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=#a52a2a]" >>"[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]if[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] pt [b][color=RED]([/color][/b][b][color=BLUE]getpoint[/color][/b] [b][color=#a52a2a]"\nSpecify Point for Text: "[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]entmakex[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]list[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b] [b][color=#009900]0[/color][/b] [b][color=#a52a2a]"MTEXT"[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b] [b][color=#009900]100[/color][/b] [b][color=#a52a2a]"AcDbEntity"[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b] [b][color=#009900]100[/color][/b] [b][color=#a52a2a]"AcDbMText"[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b] [b][color=#009900]8[/color][/b] [b][color=#a52a2a]"RH MEASURE Layer"[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b] [b][color=#009900]10[/color][/b] pt[b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b] [b][color=#009900]1[/color][/b] tot[b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b] [b][color=#009900]40[/color][/b] [b][color=#009999]0.1[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]redraw[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]princ[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] Quote Link to comment Share on other sites More sharing options...
sadhu Posted March 2, 2010 Author Share Posted March 2, 2010 :)It works great. I'm trying the code you uploaded. It is so complex (at least to me) that I'm afraid to make changes. any way I added a 2 2 to rtos - I hope it's in the right place. I needed to see only the two decimal digits after the point. "Cumulative: " (setq tot (rtos (apply (function +) dLst) 2 2)) " >>"))) Quote Link to comment Share on other sites More sharing options...
Lee Mac Posted March 2, 2010 Share Posted March 2, 2010 :)It works great. I'm trying the code you uploaded. It is so complex (at least to me) that I'm afraid to make changes. any way I added a 2 2 to rtos - I hope it's in the right place. I needed to see only the two decimal digits after the point. Yep, you added it in the right place I get a bit carried away sometimes - the complicated bit was just for the extra effect to show the path. I wasn't sure of the accuracy you wanted - so rtos with no arguments just uses your default settings. Happy to help, Lee Quote Link to comment Share on other sites More sharing options...
sadhu Posted September 3, 2010 Author Share Posted September 3, 2010 I'm using this code by LEE , now I need to add another feature. While I select the points to measure I need to draw the path on a different layer (dotted lines in red). (A polyline with rounded angles would be great) ;cumulative distance ;this routine is just like the Autocad Distance command with the ;exception that it allows you to pick more than 2 consecutive points. ;the routine will display the cumulative distance and the distance ;between the last two points picked on the command line. (defun c:cd (/ *error* Round DLST PT PTLST TOT) ;; Lee Mac ~ 01.03.10 (SETQ CLY (GETVAR "CLAYER")) (SETQ OSM (GETVAR "OSMODE")) (SETQ OTM (GETVAR "ORTHOMODE")) (setvar "orthomode" 0) (setvar "osmode" 0) (defun *error* (msg) (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*") (princ (strcat "\n** Error: " msg " **"))) (princ)) (defun Round (num dp / fac rm) (setq fac (float (expt 10 dp)) rm (rem (setq num (* fac num)) 1)) (/ (cond ( (zerop rm) (fix num)) ( (< 0.5 rm) (1+ (fix num))) ( (+ (/ 5 fac) (fix num)))) fac)) (if (car (setq ptLst (list (getpoint "\nSpecify First Point: ")))) (progn (while (setq pt (getpoint "\nSpecify Next Point: " (car ptLst))) (mapcar (function (lambda (from to) (grdraw from to 3 1))) (reverse (setq ptLst (cons pt ptLst))) (cdr (reverse ptLst))) (setq dLst (cons (Round (distance (car ptlst) (cadr ptlst)) 1) dLst)) (princ (strcat "\n<< Distance: " (rtos (car dLst)) " -- " "Cumulative: " (setq tot (rtos (apply (function +) dLst) 2 2)) " >>"))) (if (setq pt (getpoint "\nSpecify Point for Text: ")) (entmakex (list (cons 0 "MTEXT") (cons 100 "AcDbEntity") (cons 100 "AcDbMText") (cons 8 "RH_FDP") (cons 10 pt) (cons 1 tot) (cons 40 0.1) ) ) ) )) (princ (strcat "\nDistanza : " tot " **")) (redraw) (SETVAR "CLAYER" CLY) (SETVAR "OSMODE" OSM) (SETVAR "ORTHOMODE" OTM) (princ)) Quote Link to comment Share on other sites More sharing options...
sadhu Posted September 6, 2010 Author Share Posted September 6, 2010 I did it this way. What do you think ? I used entmakex polyline. (defun c:cdt (/ *error* Round DLST PT PTLST TOT) ;; Lee Mac ~ 01.03.10 (SETQ CLY (GETVAR "CLAYER")) (SETQ OSM (GETVAR "OSMODE")) (SETQ OTM (GETVAR "ORTHOMODE")) (setvar "orthomode" 0) (setvar "osmode" 0) [color=red](defun LWPoly (lst) (entmakex (append (list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (cons 100 "AcDbPolyline") (cons 90 (length lst)) (cons 70 0)) (mapcar (function (lambda (p) (cons 10 p))) lst))))[/color] (defun Round (num dp / fac rm) (setq fac (float (expt 10 dp)) rm (rem (setq num (* fac num)) 1)) (/ (cond ( (zerop rm) (fix num)) ( (< 0.5 rm) (1+ (fix num))) ( (+ (/ 5 fac) (fix num)))) fac)) (if (car (setq ptLst (list (setq pt3 (getpoint "\nSpecify First Point: "))))) (progn (while (setq pt (getpoint "\nSpecify Next Point: " (car ptLst))) (mapcar (function (lambda (from to) (grdraw from to 3 1))) (reverse (setq ptLst (cons pt ptLst))) (cdr (reverse ptLst)));mapcar (setq dLst (cons (Round (distance (car ptlst) (cadr ptlst)) 1) dLst)) (princ (strcat "\n<< Distance: " (rtos (car dLst)) " -- " "Cumulative: " (setq tot (rtos (apply (function +) dLst) 2 2)) " >>")) ) ;while [b][color=red] (LWPoly ptlst) [/color][/b] (if (setq pt (getpoint "\nSpecify Point for Text: ")) (entmakex (list (cons 0 "MTEXT") (cons 100 "AcDbEntity") (cons 100 "AcDbMText") (cons 8 "RH_FDP") (cons 10 pt) (cons 1 tot) (cons 40 0.1) ) ) );if );progn );if (princ (strcat "\nDistanza : " tot " **")) (redraw) (SETVAR "CLAYER" CLY) (SETVAR "OSMODE" OSM) (SETVAR "ORTHOMODE" OTM) (princ)) Quote Link to comment Share on other sites More sharing options...
bogeymen77 Posted March 23, 2019 Share Posted March 23, 2019 Hi everybody, i would like to integrated the same Roundup lisp routine but in a dimension area lisp routine. but i don't know where to put it or what to modify thank you. (defun c:aaa ( / *error* _SelectIf _ObjectID acdoc acspc d1 d2 fieldformatting msg predicate pt ) (setq fieldformatting "%lu2%ct4%qf1 PC ") ;; Field Formatting (defun *error* ( msg ) (if (not (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")) (princ (strcat "\nError: " msg)) ) (princ) ) (defun _SelectIf ( msg pred ) ( (lambda ( f / e ) (while (progn (setvar 'ERRNO 0) (setq e (car (entsel msg))) (cond ( (= 7 (getvar 'ERRNO)) (princ "\nMissed, try again.") ) ( (eq 'ENAME (type e)) (if (and f (null (f e))) (princ "\nInvalid Object.") ) ) ) ) ) e ) (eval pred) ) ) (setq acdoc (vla-get-activedocument (vlax-get-acad-object)) acspc (vlax-get-property acdoc (if (= 1 (getvar 'CVPORT)) 'paperspace 'modelspace)) ) (setq _ObjectID (eval (list 'lambda '( obj ) (if (and (vl-string-search "64" (getenv "PROCESSOR_ARCHITECTURE")) (vlax-method-applicable-p (vla-get-utility acdoc) 'getobjectidstring) ) (list 'vla-getobjectidstring (vla-get-utility acdoc) 'obj ':vlax-false) '(itoa (vla-get-objectid obj)) ) ) ) ) (setq predicate (function (lambda ( x ) (and (eq (cdr (assoc 0 (setq x (entget x)))) "DIMENSION") (member (boole 4 (+ 128 64 32) (cdr (assoc 70 x))) '(0 1)) ) ) ) ) (while (and (setq d1 (_SelectIf "\nSelect 1st Dimension <Exit>: " predicate)) (setq d2 (_SelectIf "\nSelect 2nd Dimension <Exit>: " predicate)) (setq pt (getpoint "\nPoint for Result <Exit>: ")) ) (vla-addmtext acspc (vlax-3D-point (trans pt 1 0))) 0.0 (strcat "%<\\AcExpr " "%<\\AcObjProp Object(%<\\_ObjId " (_ObjectID (vlax-ename->vla-object d1)) ">%).Measurement>% * " "%<\\AcObjProp Object(%<\\_ObjId " (_ObjectID (vlax-ename->vla-object d2)) ">%).Measurement>% " "\\f \"" fieldformatting "\">%" ) ) ) (princ) ) (vl-load-com) (princ) Quote Link to comment Share on other sites More sharing options...
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.