Heewonny
Heewonny

Reputation: 25

Call Argument into other function Octave GNU?

I'm using Octave GNU for GUI Excel data. I want to ask you guys how can I call defined argument in another function. Here is my code.

%%First Function = pushbutton_Callback

function pushbutton_Callback(hObject, eventdata, handles)
fileName = uigetfile('*.xlsx')%%excel data import

handles.fileName=fileName;

guidata(hObject, handles)

endfunction

%%Second Function = popupmenuX_Callback

function popupmenuX_Callback(hObject, eventdata, handles)
fileName = fileName @pushbutton_Callback; 
printf ("in popupmenuX_Callback, calling pushbutton_Callback\n");

%%To nested function to prevent (because in Octave nested function is not accepted), I used subfunction as alternative%%

handles.fileName=fileName; %% This argument fileName I want to bring from first function
[numbers, colNames]=xlsread(fileName); %%read columns of excel data in first function
set(hObject,'string',colNames);
endfunction

If I put my functions like this, always come these errors.

>> fileName = V8.xlsx
error: superclass calls can only occur in methods or constructors
error: called from
    popupmenuX_Callback at line 61 column 10

So what I want to do is, I want to bring defined Argument "fileName" in first function (pushbutton_Callback) to second function (popupX_callback). But it can not be defined in second function. I've heard that nested function in octave can be resolved with "foo", "foobar" or "ex_top", "ex_a" function. But I can't not resolve the problem with "ex_"function. Then should I have to use "foo", "foobar" function to call arguments into other function?

Best regards!

===========================================================================

I edited my questions with my full codes. (Full codes below) So what I want to do is, just like this video. But in Matlab like in video, it can be made with GUIDE or Application designer but in Octave there are no functions like that. So as a octave Beginner, it is hard for me to solve the problem.

%%Versuch
%% Diagramm zeichen
%%============================================================================
close all
clear h
graphics_toolkit qt
pkg load io
%%Uicontrols
%%Graph
h.ax = axes ("position", [0.3 0.25 0.6 0.5]);


%%Title
h.plot_title_label = uicontrol ("style", "text",
                                "units", "normalized",
                                "string", "Versuchsergebnis",
                                "horizontalalignment", "left",
                                "position", [0.03 0.9 0.25 0.08]);
                                  
%% Design for excel data import
    
h.print_pushbutton = uicontrol ("style", "pushbutton",
                                "units", "normalized",
                                "string", "Excel Datei mitbringen",
                                "callback", @pushbutton_Callback,
                                "position", [0.03 0.8 0.3 0.09]);


%% Drawing axis
h.popupmenuX        = uicontrol("Style","popupmenu",
    "units", "normalized",
    "string","X Axis",...
    "callback", @popupmenuX_Callback,
    "Position",[0.7 0.04 0.2 0.05]);
    
h.popupmenuY        = uicontrol("Style","popupmenu",
    "units", "normalized",
    "string","Y Axis",
    "callback",@popupmenuY_Callback,
    "Position",[0.03 0.5 0.2 0.05]);
%%=============================================================================                              
%% Functions
%%=============================================================================

%% 1. Excel Data import
function pushbutton_Callback(hObject, eventdata, handles)
fileName            = uigetfile('*.xlsx')%%excel data import
handles.fileName    = fileName;
guidata(hObject, handles)
endfunction

%% 2. X Axis Information from excel data import

function popupmenuX_Callback(hObject, eventdata, handles)
fileName            = pushbutton_Callback(hObject, eventdata, handles)
%%This code fileName causes error, that 'handles' is not defined.%%
handles.fileName    = fileName; %% This argument fileName I want to bring from first function
[numbers, colNames] = xlsread(fileName); %%read columns of excel data in first function
set(hObject,'string',colNames);
endfunction

%% 3. Y Axis Information from excel data import
function popupmenuY_Callback(hObject, eventdata, handles)
filename            = pushbutton_Callback(hObject, eventdata, handles)
handles.fileName    = fileName;
[numbers, colNames] = xlsread(fileName);
set(hObject,'string',colNames);
endfunction

%%%% Plot the graph
a                   = xlsread (fileName);
xColNum             = get(popupmenuX_Callback,'value');
yColNum             = get(popupmenuY_Callback,'value');
fileName            = handles.fileName;
x                   = a(:,xColNum);
y                   = a(:,yColNum);
h.ax                = plot(x,y);

Upvotes: 1

Views: 383

Answers (3)

Heewonny
Heewonny

Reputation: 25

Above there is Tasos's answer (with csv file), I applied his answer to my code, which works with excel file. Because the code xlsread ignores the columns, users should have to care about that.

Thank you again Tasos!

 pkg load io

% Create the Gui Window which will hold all controls and relevant data.
  GuiWindow = figure()

% An 'axes' object for displaying plots in the Gui Window
  axes ("position", [0.3 0.25 0.6 0.5], 'tag', 'plotarea' );

% Static text element used as a title
  uicontrol ("style", "text", "units", "normalized", "string", "Versuchsergebnis",'ForegroundColor','w','BackgroundColor',[0 0.4470 0.7410],'Fontweight','bold', "horizontalalignment", "center", "position", [0.03 0.9 0.35 0.08] );
                                    
% A button for importing (excel) data
  uicontrol ("style", "pushbutton", "units", "normalized", "string", "Datei(xlsx) mitbringen", "callback", { @pushbutton_Callback, GuiWindow }, "position", [0.03 0.8 0.35 0.09], 'tag', 'button' );

% Popupmenus for selecting appropriate X and Y axis to display in plots
  uicontrol("Style","popupmenu", "units", "normalized", "string","X Axis", "callback", { @popupmenuX_Callback, GuiWindow }, "Position",[0.7 0.04 0.2 0.05], 'tag', 'XAxisMenu' );
  uicontrol("Style","popupmenu", "units", "normalized", "string","Y Axis", "callback", { @popupmenuY_Callback, GuiWindow }, "Position",[0.03 0.5 0.2 0.05], 'tag', 'YAxisMenu' );

  %%=============================================================================                              
  %% Functions (preferably placed in their own files!)
  %%=============================================================================

  function pushbutton_Callback(hObject, eventdata, GuiWindow)

    % Read in data from file, graphically selected by user
      fileName      = uigetfile('*.xlsx');
      [num,txt,raw] = xlsread(fileName);
      header        = raw(1,:);
      Data          = xlsread(fileName);
    % Show fileName
      button   = findobj('tag', 'button');
      set( button, 'string', fileName)
    % Populate the menu items for the X and Y Axis from the csv header
      XAxisMenu = findobj( 'tag', 'XAxisMenu' );
      set( XAxisMenu, 'string', header );

      YAxisMenu = findobj( 'tag', 'YAxisMenu' );
      set( YAxisMenu, 'string', header );

    % Also store headers and data as GuiWindow app data, in case we need them again later.
      setappdata( GuiWindow, 'header', header );
      setappdata( GuiWindow, 'Data'  , Data   );

    % Plot a preliminary plot in the plot area
      XData = Data(:, 1);
      YData = Data(:, 1);
      plot( XData, YData, 'tag', 'plotobject' );          
  endfunction

  %% 2. X Axis Information from excel data import
  function popupmenuX_Callback( hObject, eventdata, GuiWindow )
      Axes      = findobj( 'tag', 'plotarea' );
      Selection = get( hObject, 'value' );
      XData     = [ getappdata( GuiWindow, 'Data' )( :, Selection ) ];
      PlotObj   = findobj( 'tag', 'plotobject' );
      set( PlotObj, 'xdata', XData )
  endfunction

  %% 3. Y Axis Information from excel data import
  function popupmenuY_Callback( hObject, eventdata, GuiWindow )
      Axes      = findobj( 'tag', 'plotarea' );
      Selection = get( hObject, 'value' );
      YData     = [ getappdata( GuiWindow, 'Data' )( :, Selection ) ];
      PlotObj   = findobj( 'tag', 'plotobject' );
      set( PlotObj, 'ydata', YData )
  endfunction

Upvotes: 1

Tasos Papastylianou
Tasos Papastylianou

Reputation: 22215

Example of GUI which allows loading a .csv file, and populating two popupmenus based on the csv headers.

Example data.csv file:

Col1, Col2, Col3
1,    2,    3
2,    4,    8
3,    8,    9

Example myscript.m

  pkg load io

% Create the Gui Window which will hold all controls and relevant data.
  GuiWindow = figure()

% An 'axes' object for displaying plots in the Gui Window
  axes ("position", [0.3 0.25 0.6 0.5], 'tag', 'plotarea' );

% Static text element used as a title
  uicontrol ("style", "text", "units", "normalized", "string", "Fur Zoo Hair Geb knees.", "horizontalalignment", "left", "position", [0.03 0.9 0.3 0.08] );
                                    
% A button for importing (excel) data
  uicontrol ("style", "pushbutton", "units", "normalized", "string", "CSV Dat Eye Meat Bringen", "callback", { @pushbutton_Callback, GuiWindow }, "position", [0.03 0.8 0.35 0.09], 'tag', 'button' );

% Popupmenus for selecting appropriate X and Y axis to display in plots
  uicontrol("Style","popupmenu", "units", "normalized", "string","X Axis", "callback", { @popupmenuX_Callback, GuiWindow }, "Position",[0.7 0.04 0.2 0.05], 'tag', 'XAxisMenu' );
  uicontrol("Style","popupmenu", "units", "normalized", "string","Y Axis", "callback", { @popupmenuY_Callback, GuiWindow }, "Position",[0.03 0.5 0.2 0.05], 'tag', 'YAxisMenu' );

  %%=============================================================================                              
  %% Functions (preferably placed in their own files!)
  %%=============================================================================

  function pushbutton_Callback(hObject, eventdata, GuiWindow)

    % Read in data from file, graphically selected by user
      fileName = uigetfile('*.csv');
      CellCsv  = csv2cell( fileName );
      Header   = CellCsv(1, :);
      Data     = CellCsv(2:end, :);

    % Populate the menu items for the X and Y Axis from the csv header
      XAxisMenu = findobj( 'tag', 'XAxisMenu' );
      set( XAxisMenu, 'string', Header );

      YAxisMenu = findobj( 'tag', 'YAxisMenu' );
      set( YAxisMenu, 'string', Header );

    % Also store headers and data as GuiWindow app data, in case we need them again later.
      setappdata( GuiWindow, 'Header', Header );
      setappdata( GuiWindow, 'Data'  , Data   );

    % Plot a preliminary plot in the plot area
      XData = [Data{:, 1}];
      YData = [Data{:, 1}];
      plot( XData, YData, 'bo-', 'tag', 'plotobject' );          
  endfunction

  %% 2. X Axis Information from excel data import
  function popupmenuX_Callback( hObject, eventdata, GuiWindow )
      Axes      = findobj( 'tag', 'plotarea' );
      Selection = get( hObject, 'value' );
      XData     = [ getappdata( GuiWindow, 'Data' ){ :, Selection } ];
      PlotObj   = findobj( 'tag', 'plotobject' );
      set( PlotObj, 'xdata', XData )
  endfunction

  %% 3. Y Axis Information from excel data import
  function popupmenuY_Callback( hObject, eventdata, GuiWindow )
      Axes      = findobj( 'tag', 'plotarea' );
      Selection = get( hObject, 'value' );
      YData     = [ getappdata( GuiWindow, 'Data' ){ :, Selection } ];
      PlotObj   = findobj( 'tag', 'plotobject' );
      set( PlotObj, 'ydata', YData )
  endfunction

This demonstrates two methods of accessing other graphical objects within callbacks. One is providing an object as an argument (e.g., GuiWindow), and the other is providing 'tags' that can be used to identify objects via the findobj function.

Note that I stored data in the GuiWindow object only, not to each individual graphical object (like buttons etc). Also, I preferred setappdata, because it allows to store multiple data under individual names (whereas guidata only stores a single object, although this can be a struct).

Upvotes: 2

Tasos Papastylianou
Tasos Papastylianou

Reputation: 22215

The line

fileName = fileName @pushbutton_Callback; 

doesn't do what you think it does.

It's a bit complicated to explain the background, but basically in matlab, new-style classes created with the classdef keyword, which also allow inheritance, allow you to call a method of a 'parent' class (or "superclass") via the methodname@parentclassname(args) syntax. Octave has ported this system to octave too, for matlab compatibility. The error you get effectively says you're trying to call a superclass method, in a context where it doesn't make sense (which is true, since you're not inside a classdef block).

This explains why you get that error.

Now, in terms of what you're trying to do, I think you basically just want to call the pushbutton_Callback function from within your popupmenuX_Callback one, right? So just do that, with appropriate arguments, e.g.:

filename            = pushbutton_Callback(hObject, eventdata, handles)
[numbers, colNames] = xlsread(fileName);

PS. I would recommend you always indent code inside functions. It looks clearer and helps catch bugs!

Upvotes: 0

Related Questions