Values in SPIN
Jul 28, 2021 9:25:12 GMT 1
Post by chrisjournoud on Jul 28, 2021 9:25:12 GMT 1
Hi,
I know Bacon for quite a while but I am new to use it. I found it very interesting.
I am translating a small program I wrote sometimes ago (in Python + Tk, Gambas basic, Vala + Glade, Lazarus, ). In fact, it is the program I wrote when I am looking for a new programming language.
My actual problem is about SPIN. It can take floating point values with any number of digit after the decimal point, if you declare the step parameter with this amount of decimals (ex: Svalue = SPIN(100, 25, 0.0, 40.0, 0.0001) mean that you can enter 20.0015 in the SPIN field)
But, when you do value2 = GET(Svalue), if you have entered 20.0015, you get 20. Is it normal or my mistake somewhere ? value2 have been declared TYPE double first ?
Thanks for your advices.
Here is my code:
INCLUDE "hug.bac"
GLOBAL v_pente, v_denivele, masse1, masse2, masse_totale, v_distance, v_temps, v_vitesse, coef_pente, cp1, cp2, cp3, rendement, puissance, puissance1, puissance2 TYPE double
'Déclaration des fonctions du programme
SUB apropos
SHOW(Msgbox1)
END SUB
SUB close_dialog(NUMBER widget)
SYSTEM "true"
FOCUS(Appli)
HIDE(widget)
END SUB
SUB calculer
v_pente = 0.0
v_denivele = 0.0
masse1 = GET(Smc)
masse2 = GET(Smv)
masse_totale = arrondi((masse1 + masse2), 2)
TEXT(Lmtv, STR$(masse_totale))
IF masse_totale = 0 THEN
msg = MSGDIALOG("La masse ne peut être nulle", 300, 150, 0, 1): CALLBACK(msg, close_dialog)
SHOW(msg)
EXIT SUB
END IF
v_distance = GET(Sdist)
IF v_distance = 0 THEN
msg = MSGDIALOG("La distance ne peut être nulle", 300, 150, 0, 1): CALLBACK(msg, close_dialog)
SHOW(msg)
EXIT SUB
END IF
IF GET(Rden) THEN
v_denivele = GET(Sden)
IF v_denivele <> 0 THEN
IF v_denivele >= (v_distance * 1000) THEN
msg = MSGDIALOG("Le dénivelé ne peut pas être" & NL$ & "supérieur ou égal à la distance", 300, 150, 0, 1): CALLBACK(msg, close_dialog)
SHOW(msg)
SET(Sden, 0)
SET(Rden, 1)
SET(Rpen, 0)
EXIT SUB
END IF
v_pente = v_denivele / SQR(POW(v_distance * 1000, 2) - POW(v_denivele, 2)) * 100: PRINT "v_pente "; v_pente
SET(Spen, v_pente)
SHOW(Spen)
ELSE
v_pente = 0.0
SET(Spen, v_pente)
SHOW(Spen)
END IF
ELSE
v_pente = VAL(GRAB$(Spen)): PRINT v_pente
v_denivele = arrondi(SIN(ATN(v_pente / 100) * v_distance * 1000), 2): PRINT v_denivele
SET(Sden, v_denivele)
SHOW(Sden)
END IF
v_temps = GET(Sheure) + GET(Sminute) / 60 + GET(Sseconde) / 3600
IF v_temps = 0 THEN
msg = MSGDIALOG("Il faut saisir une durée", 300, 150, 0, 1): CALLBACK(msg, close_dialog)
SHOW(msg)
EXIT SUB
END IF
v_vitesse = v_distance / v_temps
TEXT(Lvitv, STR$(arrondi(v_vitesse, 2)))
coef_pente = v_pente / 100
cp1 = 9,81 * (masse1 + masse2) * coef_pente * (v_vitesse / 3.6)
cp1 = arrondi(cp1, 2)
TEXT(Lp1v, STR$(cp1))
air = 0.00
IF GET(Rp21) THEN
air = 0.35
END IF
IF GET(Rp22) THEN
air = 0.30
END IF
IF GET(Rp23) THEN
air = 0.22
END IF
densite = 1.0
cp2 = arrondi(densite / 2 * air * POW((v_vitesse - GET(Svent)) / 3.6, 3), 2)
TEXT(Lp2v, STR$(cp2))
frot = 0.0
IF GET(Rp31) THEN
frot = 0.004
END IF
IF GET(Rp32) THEN
frot = 0.006
END IF
IF GET(Rp33) THEN
frot = 0.009
END IF
cp3 = arrondi(9.81 * (masse1 + masse2) * frot * v_vitesse / 3.6, 2)
TEXT(Lp3v, STR$(cp3))
rendement = GET(Sp4)
IF rendement = 0 THEN
msg = MSGDIALOG("Il faut saisir une valeur non" & NL$ & "nulle pour le rendement", 300, 150, 0, 1): CALLBACK(msg, close_dialog)
SHOW(msg)
EXIT
END IF
puissance = (cp1 + cp2 + cp3) * 100 / rendement
puissance1 = arrondi(puissance, 3)
TEXT(Lpui1v, STR$(puissance1))
puissance2 = arrondi(puissance / masse1, 3)
TEXT(Lpui2v, STR$(puissance2))
END SUB
SUB effacer
SET(Smc, 0)
SET(Smv, 0)
TEXT(Lmtv, "NC")
SET(Rden, 1)
SET(Sden, 0)
SET(Spen, 0)
SET(Sdist, 0)
SET(Sheure, 0)
SET(Sminute, 0)
SET(Sseconde, 0)
TEXT(Lvitv, "NC")
TEXT(Lp1v, "NC")
TEXT(Lp2v, "Mains en haut")
SET(Rp21, 1)
SET(Svent, 0)
TEXT(Lp3v, "Vélo de route")
SET(Rp31, 1)
SET(Sp4, 97.5)
TEXT(Lpui1v, "NC")
TEXT(Lpui2v, "NC")
END SUB
SUB calc_masse_tot
tmp = GET(Smc) + GET(Smv)
TEXT(Lmtv, STR$(tmp))
END SUB
SUB swap_den_pente
IF GET(Rden) THEN
HIDE(Spen)
SHOW(Sden)
END IF
IF GET(Rpen) THEN
HIDE(Sden)
SHOW(Spen)
END IF
END SUB
SUB position
IF GET(Rp21) THEN
TEXT(Lp2v, "Mains en haut")
END IF
IF GET(Rp22) THEN
TEXT(Lp2v, "Mains en bas")
END IF
IF GET(Rp23) THEN
TEXT(Lp2v, "Guidon/vélo CLM")
END IF
END SUB
SUB roulement
IF GET(Rp31) THEN
TEXT(Lp3v, "Vélo de route")
END IF
IF GET(Rp32) THEN
TEXT(Lp3v, "Vélo gravel")
END IF
IF GET(Rp33) THEN
TEXT(Lp3v, "VTT")
END IF
END SUB
FUNCTION arrondi(double x, int y)
LOCAL z TYPE double
IF y = 0 THEN
x = ROUND(x)
ELSE
tmp = POW(10, y)
z = ROUND((x * tmp)) / tmp
END IF
RETURN z
END FUNCTION
'Dessiner l'interface
Appli = WINDOW("CALCUL DE PUISSANCE A VELO", 360, 516)
'En partant du haut et de gauche à droite
Lmc = MARK("Masse corporelle :", 200,25): ATTACH(Appli, Lmc, 5, 0)
Smc = SPIN(100,25,0, 200,0.5): ATTACH(Appli, Smc, 210, 0): CALLBACK(Smc, calc_masse_tot)
Lmv = MARK("Masse vélo + équipement :", 200,25): ATTACH(Appli, Lmv, 5, 26)
Smv = SPIN(100,25,0, 30,0.1): ATTACH(Appli, Smv, 210, 26): CALLBACK(Smv, calc_masse_tot)
Lmtt = MARK("Masse totale en kg :", 200,25): ATTACH(Appli, Lmtt, 5, 52)
Lmtv = MARK("NC", 100,25): ATTACH(Appli, Lmtv, 210, 52)
Rden = RADIO("Dénivelé en m :", 200, 25, 0): ATTACH(Appli, Rden, 5, 78): CALLBACK(Rden, swap_den_pente)
Sden = SPIN(100,25,-9999, 9999, 0.01): ATTACH(Appli, Sden, 210, 78): SET(Sden, 0)
Rpen = RADIO("Pente en % :", 200, 25, Rden): ATTACH(Appli, Rpen, 5, 104): CALLBACK(Rpen, swap_den_pente)
Spen = SPIN(100,25,0.0, 40.0, 0.0001): ATTACH(Appli, Spen, 210, 104): SET(Spen, 0): HIDE(Spen)
Ldist = MARK("Distance en km :", 200, 25): ATTACH(Appli, Ldist, 5, 130)
Sdist = SPIN(100,25,0, 100, 0.01): ATTACH(Appli, Sdist, 210, 130)
Ltps = MARK("Temps en hh:mm:ss :", 200, 25): ATTACH(Appli, Ltps, 5, 156)
Sheure = SPIN(45,25,0, 59, 1): ATTACH(Appli, Sheure, 193, 156)
Sminute = SPIN(45,25,0, 59, 1): ATTACH(Appli, Sminute, 238, 156)
Sseconde = SPIN(45,25,0, 59, 1): ATTACH(Appli, Sseconde, 283, 156)
Lvitt = MARK("Vitesse en km/h :", 200, 25): ATTACH(Appli, Lvitt, 5, 182)
Lvitv = MARK("NC", 100, 25): ATTACH(Appli, Lvitv, 210, 182)
Lp1t = MARK("P1 > gravité :", 200, 25): ATTACH(Appli, Lp1t, 5, 208)
Lp1v = MARK("NC", 100, 25): ATTACH(Appli, Lp1v, 210, 208)
Lp2t = MARK("P2 > pénétration dans l'air :", 200, 25): ATTACH(Appli, Lp2t, 5, 234)
Lp2v = MARK("Mains en haut", 120, 25): ATTACH(Appli, Lp2v, 210, 234)
Rp21 = RADIO("Haut", 100, 25, 0): ATTACH(Appli, Rp21, 50, 260): CALLBACK(Rp21, position)
Rp22 = RADIO("Bas", 100, 25, Rp21): ATTACH(Appli, Rp22, 155, 260): CALLBACK(Rp22, position)
Rp23 = RADIO("CLM", 100, 25, Rp21): ATTACH(Appli, Rp23, 250, 260): CALLBACK(Rp23, position)
Lvent = MARK("Vitesse du vent (+ ou -) :", 200, 25): ATTACH(Appli, Lvent, 5, 286)
Svent = SPIN(100,25,0, 40, 0.01): ATTACH(Appli, Svent, 210, 286)
Lp3t = MARK("P3 > frottements :", 200, 25): ATTACH(Appli, Lp3t, 5, 312)
Lp3v = MARK("Vélo de route", 100, 25): ATTACH(Appli, Lp3v, 210, 312)
Rp31 = RADIO("700x25C", 100, 25, 0): ATTACH(Appli, Rp31, 50, 338): CALLBACK(Rp31, roulement)
Rp32 = RADIO("27,5 route", 100, 25, Rp31): ATTACH(Appli, Rp32, 155, 338): CALLBACK(Rp32, roulement)
Rp33 = RADIO("27,5 XC", 100, 25, Rp31): ATTACH(Appli, Rp33, 260, 338): CALLBACK(Rp33, roulement)
Lp4 = MARK("P4 > rendement :", 200, 25): ATTACH(Appli, Lp4, 5, 364)
Sp4 = SPIN(100,25,97.5, 100.0, 0.01): ATTACH(Appli, Sp4, 210, 364)
Lpui1t = MARK("PUISSANCE TOTALE EN W :", 200, 25): ATTACH(Appli, Lpui1t, 5, 390)
Lpui1v = MARK("NC", 100, 25): ATTACH(Appli, Lpui1v, 210, 390)
Lpui2t = MARK("PUISSANCE EN W / kg :", 200, 25): ATTACH(Appli, Lpui2t, 5, 416)
Lpui2v = MARK("NC", 100, 25): ATTACH(Appli, Lpui2v, 210, 416)
'Boutons
Bcal = BUTTON("Calculer", 172, 30): ATTACH(Appli, Bcal, 5, 446): CALLBACK(Bcal, calculer)
Bef = BUTTON("Effacer", 172, 30): ATTACH(Appli, Bef, 182, 446): CALLBACK(Bef, effacer)
Bap = BUTTON("A propos", 172, 30): ATTACH(Appli, Bap, 5, 481): CALLBACK(Bap, apropos)
Bqt = BUTTON("Quitter", 172, 30): ATTACH(Appli, Bqt, 182, 481): CALLBACK(Bqt, QUIT)
'Tooltips et mise en forme
PROPERTY(Lmc, "tooltip-text", "Poids de corps du cycliste")
PROPERTY(Lmc,"xalign", 0.0)
PROPERTY(Lmv, "tooltip-text", "Poids du vélo " & NL$ & "+ vêtements " & NL$ & "+ accessoires")
PROPERTY(Lmv,"xalign", 0.0)
PROPERTY(Lmtt,"xalign", 0.0)
PROPERTY(Ldist,"xalign", 0.0)
PROPERTY(Ltps,"xalign", 0.0)
PROPERTY(Lvitt,"xalign", 0.0)
PROPERTY(Lp1t,"xalign", 0.0)
PROPERTY(Lp2t,"xalign", 0.0)
PROPERTY(Lvent,"xalign", 0.0)
PROPERTY(Lp3t,"xalign", 0.0)
PROPERTY(Lp4,"xalign", 0.0)
PROPERTY(Lpui1t,"xalign", 0.0)
PROPERTY(Lpui1t, "tooltip-text", "Avec masse totale")
PROPERTY(Lpui2t,"xalign", 0.0)
PROPERTY(Lpui2t, "tooltip-text", "Avec poids du cycliste seul")
'Boites de dialogue
Msgbox1 = MSGDIALOG("Programmé et compilé" & NL$ & "avec Bacon " & VERSION$ & NL$ & "+ HUG version " & HUGVERSION$ & NL$ & "par C. Journoud" & NL$ & "selon méthode Vayer / Portoleau" & NL$ & "Avril 2019 mod. 07/2021", 300, 200, 0, 1): CALLBACK(Msgbox1, close_dialog)
Msgbox2 = MSGDIALOG("le bouton calculer a été" & NL$ & "sélectionné", 300, 150, 0, 1): CALLBACK(Msgbox2, close_dialog)
'Affichage et lancement de la boucle
DISPLAY