Le 29/11/2019 à 19:17, Claus Futtrup a écrit :
Hi Stéphane

Hm, you're right. This actually fixes the problem, but I do find it to be a strange "solution" that you write each of them to be equal with itself ... I prefer calling the set() function.

In "ge_fs=ge_fs" the lhs is a local copy and the rhs the variable in the calling context.


Cheers,
Claus

On 29.11.2019 19:05, Stéphane Mottelet wrote:
To makeit work, just insert

ge_r=ge_r;
ge_fs=ge_fs;
ge_hz=ge_hz;

at the begining of function calc.

My two cents...

S.


Le 29/11/2019 à 18:58, Claus Futtrup a écrit :
Hi Antoine

>Not much progress because I never managed to get a minimal working example
I can repeat my example again and again. It never works. Please see it below.

Do you agree. This consistently fails if you run it from Scinotes editor ... but if I copy e.g. ge_r.visible = "on" to the command line (not from within the calc function), then it shows up.

/Claus

// BAD_GUI_EXAMPLE.SCE
//
// Demo of how _NOT_ to build a simple GUI in Scilab.

// Initialize variables
m  =  1;  // Moving mass 'm'(kilogram)
k  =  1;  // Stiffness, spring constant 'k'(Newton per meter)
fres  =  1;  // Resonance frequency (Hertz)

function  calc()
     m  =  evstr(get(ge_m,"string"));  // get content in uicontrol ge_m
     k  =  evstr(get(ge_k,"string"));  // get content in uicontrol ge_k
     fres=sqrt(k/m)/(2*%pi);
// putting GUI updates inside the calculation routine is not pretty code.
     ge_r.visible  =  "on";
     ge_fs.visible  =  "on";        // THIS DOESN'T WORK
     ge_hz.visible  =  "on";
// set(ge_r,"Visible","on"); // THIS WORKS
// set(ge_fs,"Visible","on");
// set(ge_hz,"Visible","on");
     // update global variables
     [m,k,fres]=return(m,k,fres);
endfunction

function  goodbye()
     close(ge);  // Close GUI window
     printf("Resulting fres: %f Hertz\n",fres);
     abort  // Print result in console (e.g. for copy/paste), then kill the app
endfunction

ge  =  scf();  // GUI Example, Initialize and 'set current figure'
as  =  ge.axes_size;  // read size of window, as = [width height]
ge.figure_name  =  "GUI Example";  // Change window header

uicontrol("style","text","string","Moving mass :","position",  ..
           [10  as(2)-35  80  20],"background",[1  1  1]);  // white background
           // position properties has four parameters = x,y,width,height
           // y-position counts from lower left corner, so we subtract from 'as'
ge_m  =  uicontrol("style","edit","string",string(m),  ..
           "position",[100  as(2)-35  80  20]);
uicontrol("style","text","string","kg ","position",  ..
           [200  as(2)-35  30  20],"background",[1  1  1]);

uicontrol("style","text","string","Stiffness :","position",  ..
           [10  as(2)-60  80  20],"background",[1  1  1]);
ge_k  =  uicontrol("style","edit","string",string(k),  ..
           "position",[100  as(2)-60  80  20]);
uicontrol("style","text","string","N/m ","position",  ..
           [200  as(2)-60  30  20],"background",[1  1  1]);

uicontrol("style","pushbutton","string","Calculate",  ..
           "position",[10  as(2)-85  80  20],"callback","calc");

ge_r  =  uicontrol("style","text","string","Result :","position",  ..
           [10  as(2)-110  80  20],"visible","off");  // keep these hidden for 
a start
ge_fs  =  uicontrol("style","text","string",string(fres),  ..
           "position",[100  as(2)-110  80  20],"visible","off");
ge_hz  =  uicontrol("style","text","string","Hz ","position",  ..
           [200  as(2)-110  30  20],"visible","off");

uicontrol("style","pushbutton","string","Exit",  ..
           "position",[10  as(2)-135  80  20],"callback","goodbye");

On 29.11.2019 10:20, Antoine Monmayrant wrote:
Le Jeudi, Novembre 28, 2019 19:40 CET, Claus Futtrup<cfutt...@gmail.com>  a 
écrit:
Hi Antoine

Also, you should better use get(a, 'propertyName') or set(a, 'propertyName', 
value) instead of a.propertyName and a.propertyName=value in your callbacks.


I see what you mean. I just now had trouble turning visibility on/off,
but using set(), it works fine. Thanks for the tip.
It's something quite weird, maybe a race condition.
I've seen it when using 'a.prop' or 'a.prop=value' syntax in either a callback 
function or in a for loop.
When you repeatedly use this syntax, scilab tends to forget that 'a' exists and 
that it's a handle with different properties.
The initial bug report is here:http://bugzilla.scilab.org/show_bug.cgi?id=15786
Not much progress because I never managed to get a minimal working example 
(it's an Heisenbug).

Antoine

Best regards,
Claus

On 28.11.2019 17:47, Antoine Monmayrant wrote:
Le Jeudi, Novembre 28, 2019 17:05 CET, Claus Futtrup<cfutt...@gmail.com>  a 
écrit:
Hi Antoine, et al.

Your reply is very helpful, so I think you got the right question :-)

1) Good point that I can use callback on every uicontrol. This would be
suitable for a simple example (like gui_example.sce) ... but for heavy
calculations, it might be more practical with a CALC button. P.S. The
correct equation for the resonance frequency is fres=sqrt(k/m)/(2*%pi);
You are right.
Also, the trick to disable the callback function/ reenable it is key for 
sliders that tend to generate an avalanche of call to the function when one 
moves the cursor.

2) I see what you mean, so not having an empty space, but "show" the
whole she-bang from the beginning. I didn't want to do that (just
deleting the IF-statement), but it could be the best solution in the end
(rather than the inline GUI updates), if nothing better shows up. This
was somehow the "core" of my question. Maybe I ask for too much.
I think you can achieve what you want by setting ".visible='off'" for all the uicontrols 
you don't want to show initialy. You can then set  ".visible='on'" after the first call 
to the callback (or at each call if you are lazy).

3) I will look into this. Thanks for the tip.
Also, you should better use get(a, 'propertyName') or set(a, 'propertyName', 
value) instead of a.propertyName and a.propertyName=value in your callbacks.
I have found that this latter syntax is causing a lot of bug if your callback 
get called really often. I still don't know why.

4) I will also look into this. My problem is the steep learning curve.
If you look at the Scilab tutorials you have the good-old Openeering
LHY_Tutorial - it's incredibly complicated and long. Is LHY_Tutorial
using the Model-Viewer-Controller approach? - Maybe the
Model-Viewer-Controller could be presented in a _simple_ tutorial - is
it possible?
Hmm, that would be a good idea.
I'll see whether I can put something together.
The thing is, MVC approach looks rather silly and overengineered on a small 
example.

I appreciate gui_example.sce with just about 70 lines of code, two
inputs and one output. I think something like it could help a lot of
people ... and it's not 250 lines of code to get a GUI up and running,
if you know what I mean. The gui_example shows a few differences, like
white versus grey background, editable boxes, etc. In the outputs,
because of the default grey background, you can see the dimensions of
the grid / text-boxes, and gui_example has two buttons. It looks
operational and easy to expand for new users.

Cheers,
Claus

On 28.11.2019 08:57, Antoine Monmayrant wrote:
Hello Claus,

I've been playing a bit with GUIs for teaching, so maybe I can help.
The issue is that I don't get what your problem is exactly here, so I my answer 
might be a bit off-topic.
Do not hesitate to rephrase your issue, I'll try a more focused answer.

Anywya, here is how I think your code could be improved:

(1) You can use 'calc' as the callback for all of the editable text field so 
that your result gets shown right away, without having to press a button.
(2) You should populate all the uicontrols of your gui first, then only update 
the displayed values, the visibility of the uicontrols, etc inside your calc 
function. (ie no more creating a uicontrol inside a callback)
(3) The 'tag' property of any uicontrol together with 'findobj()' are really 
nice to get/set the properties of each existing uicontrol.
(4) You can rely on a proper Model-View-Controler approach (or any other well 
established method to avoid mixing gui stuff with calculation stuff).

I attached a small gui I use to illustrate optical anti-reflection coating.
It is far from perfect (I did not implement a proper model-view-controler for 
example).
But you can see how I tried to separate the different parts of the code an how 
I use findobj/tag/get/set,  etc.

Hope it helps,

Antoine
Le Mercredi, Novembre 27, 2019 19:21 CET, Claus Futtrup<cfutt...@gmail.com> a écrit:
Hi there

I'm trying to build a GUI. For simplicity on the forum, I've built a
really simple example of what I'm trying to do. How can I make the
"conditional" GUI output work and not have it inside the calc function?
... or, how would you do it? Thanks.

Best regards, Claus.

// GUI_EXAMPLE.SCE
//
// Demo of how to build a simple GUI in Scilab.
// Real simple, with two input variables and one output.
// The example uses the basic mechanical example of a mass and a spring as
// input parameters and calculates the resonance frequency of the mechanical
// system.

// Initialize variables
m  =  1;  // Moving mass 'm'(kilogram)
k  =  1;  // Stiffness, spring constant 'k'(Newton per meter)
fres  =  1;  // Resonance frequency (Hertz)
show_result  =  %f;

function  calc()
        m  =  evstr(get(ge_m,"string"));  // get content in uicontrol ge_m
        k  =  evstr(get(ge_k,"string"));  // get content in uicontrol ge_k
        fres  =  sqrt(m  *  k);
        // putting GUI updates inside the calculation routine is not pretty 
code.
        uicontrol("style","text","string","Result :","position",  ..
                  [10  as(2)-110  80  20]);
        uicontrol("style","text","string",string(fres),  ..
                  "position",[100  as(2)-110  80  20]);
        uicontrol("style","text","string","Hz ","position",  ..
                  [200  as(2)-110  30  20]);
        show_result  =  %t;
        // update global variables
        [m,k,fres,show_result]=return(m,k,fres,show_result);
endfunction

function  goodbye()
        close(ge);  // Close GUI window
        printf("Resulting fres: %f Hertz\n",fres);
        abort  // Print result in console (e.g. for copy/paste), then kill the 
app
endfunction

ge  =  scf();  // GUI Example, Initialize and 'set current figure'
as  =  ge.axes_size;  // read size of window, as = [width height]
ge.figure_name  =  "GUI Example";  // Change window header

uicontrol("style","text","string","Moving mass :","position",  ..
              [10  as(2)-35  80  20],"background",[1  1  1]);  // white 
background
              // position properties has four parameters = x,y,width,height
              // y-position counts from lower left corner, so we subtract from 
'as'
ge_m  =  uicontrol("style","edit","string",string(m),  ..
              "position",[100  as(2)-35  80  20]);
uicontrol("style","text","string","kg ","position",  ..
              [200  as(2)-35  30  20],"background",[1  1  1]);

uicontrol("style","text","string","Stiffness :","position",  ..
              [10  as(2)-60  80  20],"background",[1  1  1]);
ge_k  =  uicontrol("style","edit","string",string(k),  ..
              "position",[100  as(2)-60  80  20]);
uicontrol("style","text","string","N/m ","position",  ..
              [200  as(2)-60  30  20],"background",[1  1  1]);

uicontrol("style","pushbutton","string","Calculate",  ..
              "position",[10  as(2)-85  80  20],"callback","calc");

// How do I make this "conditional"output show up in my GUI?
if  show_result  then  // If "Calculate"button was pushed at least once ...
        uicontrol("style","text","string","Result :","position",  ..
                  [10  as(2)-110  80  20]);
        uicontrol("style","text","string",string(fres),  ..
                  "position",[100  as(2)-110  80  20]);
        uicontrol("style","text","string","Hz ","position",  ..
                  [200  as(2)-110  30  20]);
end

uicontrol("style","pushbutton","string","Exit",  ..
              "position",[10  as(2)-135  80  20],"callback","goodbye");


_______________________________________________
users mailing list
users@lists.scilab.org
http://lists.scilab.org/mailman/listinfo/users
_______________________________________________
users mailing list
users@lists.scilab.org
http://lists.scilab.org/mailman/listinfo/users
_______________________________________________
users mailing list
users@lists.scilab.org
http://lists.scilab.org/mailman/listinfo/users

_______________________________________________
users mailing list
users@lists.scilab.org
http://lists.scilab.org/mailman/listinfo/users



_______________________________________________
users mailing list
users@lists.scilab.org
https://antispam.utc.fr/proxy/1/c3RlcGhhbmUubW90dGVsZXRAdXRjLmZy/lists.scilab.org/mailman/listinfo/users
--
Stéphane Mottelet
Ingénieur de recherche
EA 4297 Transformations Intégrées de la Matière Renouvelable
Département Génie des Procédés Industriels
Sorbonne Universités - Université de Technologie de Compiègne
CS 60319, 60203 Compiègne cedex
Tel : +33(0)344234688
http://www.utc.fr/~mottelet

_______________________________________________
users mailing list
users@lists.scilab.org
http://lists.scilab.org/mailman/listinfo/users



_______________________________________________
users mailing list
users@lists.scilab.org
https://antispam.utc.fr/proxy/1/c3RlcGhhbmUubW90dGVsZXRAdXRjLmZy/lists.scilab.org/mailman/listinfo/users

--
Stéphane Mottelet
Ingénieur de recherche
EA 4297 Transformations Intégrées de la Matière Renouvelable
Département Génie des Procédés Industriels
Sorbonne Universités - Université de Technologie de Compiègne
CS 60319, 60203 Compiègne cedex
Tel : +33(0)344234688
http://www.utc.fr/~mottelet

_______________________________________________
users mailing list
users@lists.scilab.org
http://lists.scilab.org/mailman/listinfo/users

Reply via email to