Search code examples
matlabanimationworkspace

Matlab assignin('base',...) Resets


I am attempting to write a function that, if called before any animation, will handle the close events without extra code in the animation file.

function matlabStopFunction(varargin)
persistent runs
if runs==2
    runs = [];
end
if isempty(runs)
    evalin('base','figure(''DeleteFcn'',@matlabStopFunction);');
    runs = 1;
else
    assignin('base','play',false);
    pause(1);
    runs = 2;
end
end

Here's a sample animation code that I've been using:

function sampleAnimation
matlabStopFunction;
r = 5;
th = 0;
play = true;
while play
    x = r * cosd(th);
    y = r * -sind(th);
    plot(x,y,'r*');
    axis([-10 10 -10 10]);
    th = th + 45;
    pause(0.25);
end
end

The stop function works fine creating the figure, and when I close the figure, it calls the same function as expected (including the assignin on line 10). However, when stepping through, when I first get back to the base function (sampleAnimation), play is false as would be expected: Base Workspace

But when I step one more line, play is reset to true

Base Workspace

Am I incorrectly assigning the value of play to false in the stop function, and if so, how could I correct this so that the animation stops when the figure is closed while keeping the code inside the animation to a minimum? I am trying to replicate the method on this blog except with all the code contained in a separate file.

I am running Matlab 2014b on Windows 8.1.


Solution

  • To answer your question - you are modifying the value play in the base workspace - where as the loop is in the workspace of the sampleAnimation function -> so you are not changing the required value to stop the animation. To verify this clear your variables in the base workspace clear before you run your code and you will see that the variable play is created and set to false.

    By the way there is a much simpler way to do this, you animation can create a figure and then you can stop when it is deleted:

    function sampleAnimation
      h = figure;
      r = 5;
      th = 0;
      while ishandle ( h )
        x = r * cosd(th);
        y = r * -sind(th);
        plot(x,y,'r*');
        axis([-10 10 -10 10]);
        th = th + 45;
        pause(0.25);
      end
    end