Scilab:如何在xclick()中使用cbmenu

时间:2016-12-19 22:30:12

标签: scilab

我不理解xclick的Scilab文档中输出参数cbmenu的解释。

它说:

  

cbmenu:String:如果由于单击菜单而返回xclick,则与菜单关联的回调。

我在网上没有找到任何例子,所以我在这里问。我编写了一个片段,它将可能与cbmenu相关的元素混为一谈。当我点击CLICK时,该片段什么都不做。任何人都可以改变/补充/修改代码,以便它能做某些事情 - 不管是什么让我知道cbmenu可以做些什么?

xdel()
x=[-1 +1];
cf=figure(0);
plot(x,x)
m=uimenu(cf,'label','CLICK','callback','two=1+1');
[ibutton,xcoord,yxcoord,iwin,cbmenu]=xclick();

亲切的问候

Rosestock

2 个答案:

答案 0 :(得分:0)

如果我的意图正确,您需要创建自定义菜单。这是一个小型演示,如何自定义菜单元素,以及如何使用locate来获取坐标(但您不需要xclick来感知菜单点击)。此代码不使用显式cbmenu,但没有必要让它工作。如果运行代码,请先单击“选择范围”菜单,然后在图形上单击两次。然后激活“回归”菜单,您可以选择“线性回归”。通过单击“退出程序”,执行将中止。并非所有nenu函数都已实现,它们仅用于演示多层结构。我希望它有所帮助!

//Interactive menu demo
//  Scilab 5.5.2
//  2016.12.20. Attila Eredics
//
//Attention!
//Do not close the graphic window with the original x symbol 
//  while the program is running,
//  because the program will run infinitely!
//  But you can stop it in the Consol with: Ctrl+C and then typing: abort
clc;
clear;
lines(0);

//artificial data vectors
row = 100;
t=gsort(rand(row,1),'r','i');    //time
c=10*t+8;       //concentration
c=c+rand(c);    //add some noise

//graphic window
scf(0); clf(0);
w=gcf();    //get current figure

//new menu elements
m3=uimenu(w,"Label","Select range","Callback","m=3");
m4=uimenu(w,"Label","Regression","Enable","off","ForegroundColor","0.5|0.5|0.5");
m41=uimenu(m4,"Label","Linear","Callback","m=41","Enable","on");
m42=uimenu(m4,"Label","Nonlinear","Callback","m=42","Enable","on");
m5=uimenu(w,"Label","Save results","Callback","m=5");
m6=uimenu(w,"Label","Exit program","Callback","abort","ForegroundColor","1|0|0");

plot2d(t,c,style=-5,frameflag=6);    //plot the data
xtitle("","time","concentration");  //axis labels

while %T   //infinite loop
    //-------------wait for user action (click on a menu)-------
    m=0;
    while m<1
        xpause(1e4);    //pause 10ms
    end

    //------------------the menu actions-------------------------
    if m==3 then    //Select range
        mprintf("\nChoose 2 points (click on the graph)!");
        coord=locate(2);    //locate two clicks
        disp(coord);        //coord: according to the axes

        //Select range in t vector
        for i=1:row-1
            if coord(1,1)>=t(i) & coord(1,1)<t(i+1) then    //t(i) <= 1st click < t(i+1)
                i1=i;
            end
            if coord(1,2)>=t(i) & coord(1,2)<t(i+1) then    //t(i) <= 2nd click < t(i+1)
                i2=i;
            end
        end

        //selected range
        clear tt;
        clear cc;
        tt=t(i1:i2);
        cc=c(i1:i2);

        plot2d(tt,cc,style=-5);    //plot selected points
        h2=gce();
        h2.children.mark_foreground=3;    //green

        m4.Enable="on";    //enable Regression menu
        m4.ForegroundColor="0|0|0"
        m3.Enable="off";    //Disable selection menu
        m3.ForegroundColor="0.5|0.5|0.5"
    elseif m==41 then    //linear regression of the selected points
        mprintf("\nLinear regression");
        [a,b,sig]=reglin(tt',cc');

        plot2d([tt(1),tt($)],a*[tt(1),tt($)]+b,style=2);    //blue line

        m41.Enable="off";    //disable Linear regression menu
        m41.ForegroundColor="0.5|0.5|0.5"
    elseif m==42 then    //Nonlinear regression
        mprintf("\nNot implemented yet!");
    elseif m==5 then    //Save
        mprintf("\nNot implemented yet!");
    end

end

答案 1 :(得分:0)

这是一个最小的脚本,它解释了xclick()的第五个输出参数可以做什么:

xdel()
x=[-1 +1];
winnum=1;  win=string(winnum);
cf=figure(winnum);
plot(x,x)
C=["Green" "Red" "Abort"];//case name strings
addmenu(winnum, C(1)); C1="execstr("+C(1)+"_"+win+"(1))";   
addmenu(winnum, C(2)); C2="execstr("+C(2)+"_"+win+"(1))";
addmenu(winnum, C(3)); C3="execstr("+C(3)+"_"+win+"(1))";
while %t
  [!,!,!,!,cbmenu]=xclick();
  //Get the clicked option by cbmenu
  if cbmenu==C1, cf.background=3; end
  if cbmenu==C2, cf.background=5; end
  if cbmenu==C3, break, end
end