FastFiber

Getal laten afronden

Gestart door Tom, vr 04 03 2005, 10:52:51

Vorige topic - Volgende topic

Tom

Ik heb reeds geprobeerd om een getal te laten afronden met FIX

(setq x2 (fix x1))

Het probleem met deze functie is dat hij altijd naar beneden afrond.
Is er een andere functie die het dichtst bijzijnde integer getal neemt ?

Alvast bedankt

Tom

Joop

Dit is een eenvoudig trukje:

(setq x2 (fix (+ x1 0.5)))

FIX rond namelijk altijd af naar beneden.
Een gelovig volger van
"de Sacrale Kunst van Luiheid",
zijn leider "Lisp" en acoliet "Script".

thomas151283

Heeft er iemand een idee hoe je met "fix" kan afronden tot op 2 cijfers na de komma.
vb: 800,00 ipv 800
Voorlopig lukt het me enkel om mijn getal naar boven of naar beneden af te ronden.

MVG,
Thomas

thomas151283

Sorry,  :oops:

FIX is enkel voor integere getallen.

Iemand een idee hoe je dan wel kan afronden tot 2 cijfers na de komma?

MVG,
Thomas

cadtools@gmail.com

Miscchien heb je iets aan dit stukje code.
Ik heb een functie voor plaatsing coordinaten.
Deze rond ze af in meters 3 decimalen


(DEFUN COOR2 ()
 (COMMAND "UCSICON" "ON")
 (SETVAR "CMDECHO" 0)
 (SETQ CDS (GETVAR "DIMSTYLE"))
 (prompt (strcat "\nDimstyle  " CDS "  is current."))
 (SETQ STOP 1)
 (WHILE (/= STOP 0)
   (command "ucs" "WORLD")
   (SETQ PUNT (GETPOINT "\nWijs het punt aan (WCS): "))

   (SETQ XPUNT (/ (CAR PUNT) 1000))
   (SETQ YPUNT (/ (CADR PUNT) 1000))

   (command "ucs" "VIEW")
; oud  (SETQ PLAATS (GETPOINT "\nWijs positie tekst aan (UCS-VIEW): "))

    (setq var (* 10 (getvar "DIMSCALE"))
          PLAATS (getpoint (strcat "\nGeef positie tekst \(default @"
                                 (rtos var 2 (if (= var (fix var)) 0 3))
                                 "<30\): ")))
   (SETQ PUNTUCS (TRANS PUNT 0 1))
   (SETQ XTEKST (STRCAT "X = " (RTOS XPUNT 2 3)))
   (SETQ YTEKST (STRCAT "Y = " (RTOS YPUNT 2 3)))
   (if (not PLAATS) (setq PLAATS (polar PUNTUCS (/ pi 6) var)))
   (COMMAND "LEADER" PUNTUCS PLAATS "" XTEKST YTEKST "")
   (SETQ STOP (GETREAL "\nStoppen=0: "))
   (command "ucs" "view")
 )
 (PRINT)
)


(defun c:coor ()
 (coor2)
)

(defun c:cdr ()
 (coor2)
)

thomas151283

Ik begrijp het nut van "cmdecho" niet goed  :oops:

Volgens de helpfunctie van cad krijg ik dit als antwoord:

Type: Integer
Not saved
Initial value: 1

Controls whether AutoCAD echoes prompts and input during the AutoLISP command function.

0 Turns off echoing

1 Turns on echoing


Thomas

bart

middels cmdecho
kan je de uitvoering van de diverse commando's onzichtbaar maken.
Domme vragen bestaan niet.
Domme antwoorden wel.

m.vr. groet Bart

Joop

Het versnelt ook de werking van het commando, omdat de commando regel niet meer bijgewerkt wordt.
Normaal maakt dat niet veel uit, maar als er veel in de tekening automatisch wordt gedaan (bv 500 attributes wijzigen) dan scheelt het al gauw een slok op een borrel.

Tevens is het een handig middeltje om te kijken waar een commando vastloopt en/of in de fout gaat.
Een gelovig volger van
"de Sacrale Kunst van Luiheid",
zijn leider "Lisp" en acoliet "Script".

Sven

nu kunnen we wel een getal afronden, maar ik zou een getal willen afronden naar 0 of 5 (na de komma).
Kan dit?

WebRacer

Beste sven....
eerst even wat meer uitleg aub...
en een stukje lisp hierbij kan wonderen doen,
veel problemen kunnen echter opgelost worden door enkel systeemvariabelen in te stellen...
ik denk daarbij vooral aan:
Dimtdec
Dimdec
Dimzin
zie help voor meer uitleg....
?

HofCAD

Citaat van: Svennu kunnen we wel een getal afronden, maar ik zou een getal willen afronden naar 0 of 5 (na de komma).
Kan dit?

Beste Sven , Thom en Thomas

Bedoelen jullie dit: :twisted:


(defun Round50 (num / numtek Signof)
 ;; Signof - returns -1 or 1 for sign of number
   (defun Signof (num) (if (minusp num) -1 1))
   (setq numtek (Signof num) num (abs num))  
 (if (>= (- num (fix num)) 0.5)  
   (setq num (fix (1+ num)))  
   (setq num (fix num))
 )
(setq num (* numtek (float num)))
)

(defun Round25 (num / numtek Signof)
 ;; Signof - returns -1 or 1 for sign of number
   (defun Signof (num) (if (minusp num) -1 1))
   (setq numtek (Signof num) num (abs num))  
(if (< num (+ (fix num) 0.25)) (progn (setq num (fix num))))
(if (and (>= num (+ (fix num) 0.25)) (< num (+ (fix num) 0.75)))
(progn (setq num (+ (fix num) 0.5))))
(if (>= num (+ (fix num) 0.75)) (progn (setq num (round50 num))))
(setq num (* numtek (float num)))
)


Waarbij (round25 8.43) een uitkomst van 8.5 geeft.
Zo niet, even laten weten.


Groetjes HofCAD CSI

PS1 Zo ja, dan nog wel even nog uittesten. :oops:  8)
PS2 Wil je op meer decimalen achter de komma, dan de Barbapapa truuk  :oops: van eerst vermenigvuldigen met bijv. 10, afronden en daarna delen door 10.
Voorbeeld (/ (round25 (* 8.44 10)) 10) geeft 8.45
en  (/ (round25 (* 8.4949 100)) 100) geeft 8.495
PS3 800 door lisp als 800.00 weergeven, dan zou je volgens de
autolisphelp de autolispfunctie rtos moeten gebruiken met (rtos number [mode [precision]]),
waarbij (setq x 17.5) en  (setq fmtval (rtos x 2 2)) "17.50" moet geven.?????????????????
Maar dat gebeurt jammer genoeg niet, wel geeft (setq fmtval (rtos x 1 4))
de string "1.7500E+01".
PS4 Thomas151283 hoe is met je stageopdracht gegaan?
ACADcadabra

Kenny H

Beste HofCAD,

Uw programma's zijn zoals altijd goed  :vreegoe: , maar bij vorige progjes krijg ik volgende melding.

CiteerCommand: round50
; error: too few arguments

Command:
Command: round25
; error: too few arguments

Command:

Ik denk dat het probleem ligt bij:

(defun Signof   (num)
8) Volvo 4 Life 8)

Kenny H

Voor round 50 heb ik dit.

Citeer(defun c:round50 ()
 (setq maat (getdist "\nGeef de maat op:"))
 (setq absmaat (abs maat))
   (if   (>= (- absmaat (fix absmaat)) 0.5)
     (setq num (fix (1+ absmaat)))
     (setq num (fix absmaat))
   )
 
)
8) Volvo 4 Life 8)

Kenny H

Voor round 25

Citeer(defun c:round25   ()
 (setq maat (getdist "\nGeef de maat op:"))
 (setq absmaat (abs maat))
 (if (< absmaat (+ (fix absmaat) 0.25))
   (setq num (fix absmaat))
 )
 (if (and (>= absmaat (+ (fix absmaat) 0.25))
      (< absmaat (+ (fix absmaat) 0.75))
     )
   (setq num (+ (fix absmaat) 0.5))
 )
 (if (>= absmaat (+ (fix absmaat) 0.75))
   (setq num (fix (1+ absmaat)))
 )
)
8) Volvo 4 Life 8)

Kenny H

Als je nu wil verderwerken met de afgerond maten werk je met NUM verder.

Ik heb gewerkt om een maat zelf te typen om makelijk te kunnen testen. Maar dit kan worden vervangen door een eventuele berekening enz uit voorgaande regels uit uw programma.
8) Volvo 4 Life 8)