How to run a custom command from a UI

조회 수: 9 (최근 30일)
Guy Stimpson
Guy Stimpson 2019년 12월 23일
편집: Adam Danz 2019년 12월 30일
Hi,
I'm designing a UI for plotting various instrumental data. However, I'd like to have a text field in which the user can enter any Matlab command they want and have it executed, as if they were using the Matlab console. The command would be entered as standard Matlab syntax, and would be processed as follows:
function SomeButtonPushed(app, event)
command = app.aTextField.Value;
% Some code to execute command
end
I would also like to get the console output (or whatever equivalent) in terms of error messages etc.
Is this possible? If so, how should I go about it?
Many thanks in advance.
  댓글 수: 2
Stephen23
Stephen23 2019년 12월 23일
편집: Stephen23 2019년 12월 23일
"...in which the user can enter any Matlab command they want and have it executed..."
Does this include, for example, commands like (pseudocode):
system format my entire harddrive
quit MATLAB
delete everything in the workspace
reallocate any variable used in your code
system uninstall MS Office
"Is this possible? If so, how should I go about it?"
evalc
Guy Stimpson
Guy Stimpson 2019년 12월 23일
편집: Guy Stimpson 2019년 12월 23일
If those commands are executable from Matlab normally, then yes, it should include them. The 'new' command window should operate in exactly the same manner as the Matlab command window, or at least as close as possible.

댓글을 달려면 로그인하십시오.

채택된 답변

Adam Danz
Adam Danz 2019년 12월 30일
편집: Adam Danz 2019년 12월 30일
Another approach is to write the set of commands to an m-file that can run as a script or a function and then you can call that script/function from within the GUI. This method allows for evaluation of more complex code than the evalc() approach.
Here's a demo.
Part 1: Create GUI with edit text window and 'Compute' button. The text window will contain some code to be analyzed.
fh = figure();
editBoxHandle = uicontrol('style','edit','units','normalize','position',[.1 .1 .6 .6],'Max',2,...
'String',['x = -pi : 0.001 : pi;', newline, 'y = zeros(size(x));', newline, newline, ...
'for i = 1:numel(x)', newline, ' y(i) = sin(x(i));', newline, 'end'], ...
'HorizontalAlignment','Left');
uicontrol('style','PushButton','units','normalize','position',[.3 .75 .2 .1],...
'String','Compute','Callback',{@mainWindowCommandFcn, editBoxHandle});
Part 2: Define the callback function to the 'Compute' button. The 3rd input is the edit box handle. If you're using GUIDE or APP DESIGNER, you can get this handle through the handles or app structure, respectively. Before running this code, edit the path to the m-file (see mfileName variable).
function mainWindowCommandFcn(hObj,~, editBoxHandle)
% Get text from edit-text window
commandTxt = editBoxHandle.String;
% make sure each line ends with (at least one) carriage return
commandTxt = [commandTxt,repmat(newline,size(commandTxt,1),1)];
% Create/overwrite m-file (replace the path)
mfileName = fullfile('C:\Users\name\Documents\MATLAB','mainWindowCommandFcn.m');
fid = fopen(mfileName,'w+');
if fid<0
% Throw error if there was a problem creating/writing the m-file
error('Error accessing %s',mfileName)
end
fprintf(fid,'%s',sprintf('%s',commandTxt'));
fclose(fid);
% To see the new file: open(mfileName)
% make sure the m-file is on path and execute it
if exist(mfileName,'file')~=2
addpath(fileparts(mfileName))
end
run(mfileName); % This will run the scrip; now 'x' and 'y' are available
% Now you have access to the variable created within the script or
% the outputs provided by the function.
disp(y) %display the value of y
end
Caveats:
  • If the m-file you create is a script, any variable names created by the user in the edit-window will overwrite variable names in your callback function. To decrease the chances of error, use long and strange variable names in your callback function.
  • If the user does not suppress outputs using a semicolon, results for those lines will display in the command window. You can easily add semicolons to all lines in order to avoid that.
  • If the user's code is not functional, errors/warnings will be thrown from the m-file but the error stack will clearly show that the callback function called the m-file so error tracing shouldn't be too difficult.
  • What ever variable you use after evaluating the user's code must exist in the user's code as an exact case-sensitive match.

추가 답변 (1개)

Jalaj Gambhir
Jalaj Gambhir 2019년 12월 30일
Hi,
As Stephen suggested, you can simply use eval or evalc with the expression as the arguement.
function SomeButtonPushed(app, event)
command = app.aTextField.Value;
% Some code to execute command
evalc(command);
end
  댓글 수: 1
Guy Stimpson
Guy Stimpson 2019년 12월 30일
Thank you! Is it possible to get the output from evalc? So far I have not been able to obtain this and send it to my gui.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 File Operations에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by