微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Octave uicontrol 按钮元素

如何解决Octave uicontrol 按钮元素

我现在正在尝试扩展 Tasos 在 callback function throws unexpected "nonconformant arguments" error 中给出的答案。我想以按钮的形式再插入两个 uicontrol。我想要有两个按钮来调节两个功能中的哪一个显示在图表上(以及之前定义的滑块)。如果按下第一个按钮 (elp_button),则应绘制函数 Eu 和 Ev,而如果按下第二个按钮 (pot_button),则应绘制函数 Pu 和 Pv。但是,我得到一个空图。这是我制作的脚本。

%1

%Definiramo klizace ispod grafa
function radiodugme()
  % Oznaka za dugmad
    rd_label = uicontrol ( 
    "style","text","units","normalized","string","Prikaz:","horizontalalignment","left","position",[0.05 0.16 0.05 0.05],"fontsize",16 );
    
  % Dugme za el. polje
    elp_button = uicontrol ( 
    "style","radiobutton","El. polje",[0.05 0.09 0.05 0.05],16 );
    
  % Dugme za el. pot.
    pot_button = uicontrol ( 
    "style","El. pot.",[0.05 0.02 0.05 0.05],16 );
    
  % Oznaka i klizac za R
    R_label  = uicontrol( 
    "style",[0.20,0.02,0.10,0.05],"R",16 );
    R_slider = uicontrol( 
    "style","slider",[0.35,0.035,0.50,0.1],"min",0.01,"max",0.05 );
    
  % Oznaka i klizac za rho
    rho_label  = uicontrol( 
    "style",0.09,"rho (C/m3)",16 );
    rho_slider = uicontrol( 
    "style",0.105,0.1,1 );
    
  % Oznaka i klizac za er
    er_label  = uicontrol( 
    "style",0.16,"e_r",16 );
    er_slider = uicontrol( 
    "style",0.175,1,15 );

% Pozivamo callback funkciju,postavimo pocetne klizace i graf
    R_init = 0.01;   
    rho_init = 0.1;
    er_init = 1;
    set (elp_button,"value","callback",{ @rd_callback,elp_button,pot_button } );
    set (pot_button,pot_button } );
    set( R_slider,R_init,{ @slider_callback,R_slider,rho_slider,er_slider } );
    set( rho_slider,rho_init,er_slider } );
    set( er_slider,er_init,er_slider } );
    plot_elppot ( R_init,er_init );
endfunction

% Definiramo callback funkciju - poziva radiodugme i klizace
function rd_callback (active_handle,event,pot_button )
    slider_callback (active_handle,er_slider );
endfunction

% Definiramo callback funkciju - poziva klizace i crtanje grafa
function slider_callback (active_handle,er_slider )
    R = get ( R_slider,"value" );
    rho  = get ( rho_slider,"value" );
    er  = get ( er_slider,"value" );
    plot_elppot ( R,rho,er );
endfunction

% Definiramo funkciju za crtanje grafa
function plot_elppot ( R,er ) 
    e0 = 8.8541878128e-12;
    rv = R : 0.001 : 0.1;
    Ev = (R^3 * rho)./(3 * e0 * rv.^2);
    Pv = (R^3 * rho)./(3 * e0 * rv);
    ru = 0 : 0.001 : R;
    Eu = (rho * ru)./(3 * e0 * er);
    Pu = (rho * ( R^2 * (2*er + 1) - ru.^2 ))./(6 * e0 * er);
    
    %Crtamo graf Eu/Ev ili Pu/Pv
    axes ("position",[0.2,0.325,0.675,0.6]);
    if get ( elp_button,"value" )
     set (pot_button,0);
     plot ( 
     ru,Eu,"linewidth",2.5,rv,Ev,2.5 );   
     set( gca,"xlim",[0,"ylim",2d9],"xlabel","r (m)","ylabel","E (V/m)",18,"xgrid","on","ygrid","on" );
    endif
    if get ( pot_button,"value" )
     set (elp_button,Pu,Pv,1.6d8],"\\phi (V)","on" );
    endif

    %Legenda
    l = legend( sprintf( 
    " R = %.2f,\n \\rho = %.2f,\n \\epsilon_r = %.2f",R,er ) );   
    set( l,"location","northwestoutside" );
endfunction

当 Octave 尝试绘制函数时,问题似乎出现了。我使用“if”语句来确定按下了哪个按钮。这可能是问题吗?我尝试按照 https://wiki.octave.org/Uicontrols 中的示例进行操作,但我无法理解它,无法将其转移到我的示例中。除了使用“if”语句之外,还有其他方法可以根据按钮选择绘制图形吗?

提前致谢。

最好的问候,

伊戈尔

解决方法

我设法通过将单选按钮 uicontrol 替换为弹出菜单 uicontrol 来解决问题。代码现在看起来像这样:

%1

%Definiramo izbornik i klizace ispod grafa
function iamenu()
  % Oznaka za izbornik
    elpp_label = uicontrol ( 
    "style","text","units","normalized","string","  Prikaz:","horizontalalignment","left","position",[0.05 0.16 0.05 0.05],"fontsize",16 );
    
  % Izbornik za el. polje i pot.
    elpp_popup = uicontrol ( 
    "style","popupmenu",{"El. polje","Potencijal"},%    "callback",@update_plot
    "position",[0.05 0.09 0.1 0.05],16 );
    
  % Oznaka i klizac za R
    R_label  = uicontrol( 
    "style",[0.20,0.02,0.10,0.05],"R",16 );
    R_slider = uicontrol( 
    "style","slider",[0.35,0.035,0.50,0.1],"min",0.01,"max",0.05 );
    
  % Oznaka i klizac za rho
    rho_label  = uicontrol( 
    "style",0.09,"rho (C/m3)",16 );
    rho_slider = uicontrol( 
    "style",0.105,0.1,1 );
    
  % Oznaka i klizac za er
    er_label  = uicontrol( 
    "style",0.16,"e_r",16 );
    er_slider = uicontrol( 
    "style",0.175,1,15 );

% Postavimo pocetni izbornik,klizace i graf,te pozivamo callback funkciju plot_elppot 
    iaelpp_init = 1;
    R_init = 0.01;   
    rho_init = 0.1;
    er_init = 1;
    set (elpp_popup,"value",iaelpp_init,"callback",{ @iamenu_callback,elpp_popup,R_slider,rho_slider,er_slider } );
    set( R_slider,R_init,er_slider } );
    set( rho_slider,rho_init,er_slider } );
    set( er_slider,er_init,er_slider } );
    plot_elppot ( iaelpp_init,er_init );
endfunction

% Definiramo callback funkciju - poziva izbornik i klizace te crtanje grafa s plot_elppot
function iamenu_callback (active_handle,event,er_slider )
    iaelpp = get ( elpp_popup,"value");
    R = get ( R_slider,"value" );
    rho  = get ( rho_slider,"value" );
    er  = get ( er_slider,"value" );
    plot_elppot ( iaelpp,R,rho,er );
endfunction

% Definiramo funkciju za crtanje grafa
function plot_elppot ( iaelpp,er ) 
    e0 = 8.8541878128e-12;
    rv = R : 0.001 : 0.1;
    Ev = (R^3 * rho)./(3 * e0 * rv.^2);
    Pv = (R^3 * rho)./(3 * e0 * rv);
    ru = 0 : 0.001 : R;
    Eu = (rho * ru)./(3 * e0 * er);
    Pu = (rho * ( R^2 * (2*er + 1) - ru.^2 ))./(6 * e0 * er);
    
    %Crtamo graf Eu/Ev ili Pu/Pv,ovisno o izboru iaelpp
    axes ("position",[0.2,0.325,0.675,0.6]);  
    if ( iaelpp == 1 )
      plot ( 
      ru,Eu,"linewidth",2.5,rv,Ev,2.5 ); 
      set( gca,"xlim",[0,"ylim",2d9],"xlabel","r (m)","ylabel","E (V/m)",18,"xgrid","on","ygrid","on" );
    endif
    if ( iaelpp == 2 )
      plot ( 
      ru,Pu,Pv,1.6d8],"\\phi (V)","on" );
    endif

    %Legenda
    l = legend( sprintf( 
    " R = %.2f,\n \\rho = %.2f,\n \\epsilon_r = %.2f",er ) );   
    set( l,"location","northwestoutside" );
endfunction

但是现在出现了另一个问题。选择弹出菜单中的第二个选项时,绘图很好地出现,但它覆盖在第一个选项的曲线上。似乎保留了轴和图。我尝试在 if 语句中使用 cla、clear、refresh、drawow、delete 和 hold 命令,但没有一个是令人满意的。我想在选择另一个弹出菜单选项时替换坐标轴和绘图。如果有人知道如何解决这个问题,我将不胜感激。

最好的问候,

伊戈尔

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。