function truss(action)
%TRUSS	Animation of a bending bridge truss.

%	Ned Gulley, 6-21-93
%	Copyright (c) 1984-94 by The MathWorks, Inc.

% Information regarding the play status will be held in
% the axis user data according to the following table:
play= 1;
stop=-1;

if nargin<1,
    action='initialize';
end;

if strcmp(action,'initialize'),
    oldFigNumber=watchon;

    figNumber=figure( ...
        'Name','Bending Truss', ...
        'NumberTitle','off', ...
	'Visible','off', ...
	'BackingStore','off', ...
	'Colormap',[]);
    axes( ...
        'Units','normalized', ...
        'Position',[0.05 0.05 0.75 0.90], ...
        'Visible','off', ...
	'NextPlot','add');

    text(0,0,'Press the "Start" button to see the Bending Truss demo', ...
	'HorizontalAlignment','center');
    axis([-1 1 -1 1]);

    %===================================
    % Information for all buttons
    labelColor=[0.8 0.8 0.8];
    yInitPos=0.90;
    xPos=0.85;
    btnWid=0.10;
    btnHt=0.10;
    % Spacing between the button and the next command's label
    spacing=0.05;
    
    %====================================
    % The CONSOLE frame
    frmBorder=0.02;
    yPos=0.05-frmBorder;
    frmPos=[xPos-frmBorder yPos btnWid+2*frmBorder 0.9+2*frmBorder];
    h=uicontrol( ...
        'Style','frame', ...
        'Units','normalized', ...
        'Position',frmPos, ...
	'BackgroundColor',[0.5 0.5 0.5]);

    %====================================
    % The START button
    btnNumber=1;
    yPos=0.90-(btnNumber-1)*(btnHt+spacing);
    labelStr='Start';
    cmdStr='start';
    callbackStr='truss(''start'');';

    % Generic button information
    btnPos=[xPos yPos-spacing btnWid btnHt];
    startHndl=uicontrol( ...
        'Style','pushbutton', ...
        'Units','normalized', ...
        'Position',btnPos, ...
        'String',labelStr, ...
        'Interruptible','yes', ...
        'Callback',callbackStr);

    %====================================
    % The MODE popup button
    btnNumber=2;
    yPos=0.90-(btnNumber-1)*(btnHt+spacing);
    textStr='Mode';
    popupStr=reshape(' 1  2  3  4  5  6  7  8  9 10 11 12 ',3,12)';
    
    % Generic button information
    btnPos1=[xPos yPos-spacing+btnHt/2 btnWid btnHt/2];
    btnPos2=[xPos yPos-spacing btnWid btnHt/2];
    popupHndl=uicontrol( ...
        'Style','text', ...
        'Units','normalized', ...
        'Position',btnPos1, ...
        'String',textStr);
    btnPos=[xPos yPos-spacing btnWid btnHt/2];
    popupHndl=uicontrol( ...
        'Style','popup', ...
        'Units','normalized', ...
        'Position',btnPos2, ...
        'String',popupStr);

    %====================================
    % The STOP button
    btnNumber=3;
    yPos=0.90-(btnNumber-1)*(btnHt+spacing);
    labelStr='Stop';
    % Setting userdata to -1 (=stop) will stop the demo.
    callbackStr='set(gca,''Userdata'',-1)';
    
    % Generic button information
    btnPos=[xPos yPos-spacing btnWid btnHt];
    stopHndl=uicontrol( ...
        'Style','pushbutton', ...
        'Units','normalized', ...
        'Position',btnPos, ...
        'Enable','off', ...
        'String',labelStr, ...
        'Callback',callbackStr);

    %====================================
    % The INFO button
    labelStr='Info';
    callbackStr='truss(''info'')';
    infoHndl=uicontrol( ...
        'Style','push', ...
        'Units','normalized', ...
        'Position',[xPos 0.20 btnWid 0.10], ...
        'String',labelStr, ...
        'Callback',callbackStr);

    %====================================
    % The CLOSE button
    labelStr='Close';
    callbackStr='close(gcf)';
    closeHndl=uicontrol( ...
        'Style','push', ...
        'Units','normalized', ...
        'Position',[xPos 0.05 btnWid 0.10], ...
        'String',labelStr, ...
        'Callback',callbackStr);

    % Uncover the figure
    hndlList=[startHndl popupHndl stopHndl infoHndl closeHndl];
    set(figNumber,'Visible','on', ...
	'UserData',hndlList);

    watchoff(oldFigNumber);
    figure(figNumber);
    
elseif strcmp(action,'start'),
    axHndl=gca;
    figNumber=gcf;
    hndlList=get(figNumber,'UserData');
    startHndl=hndlList(1);
    popupHndl=hndlList(2);
    stopHndl=hndlList(3);
    infoHndl=hndlList(4);
    closeHndl=hndlList(5);
    set([startHndl closeHndl infoHndl],'Enable','off');
    set(stopHndl,'Enable','on');
    
    % ====== Start of Demo
    load truss
    n=get(popupHndl,'Value');
    set(axHndl,'Userdata',play);
    numframes=15;
    del= x0(:,n);
    del=reshape([del' zeros(1,4)] ,2,10)';
    [xd,yd]=gplot(a,xy);
    cla;
    axis([-0.5 5.5 -2 2]);
    h=plot(xd,yd,'EraseMode','background');
    % Draw green embankment next to the bridge truss.
    patch([-0.5 0 0.5 -0.5],[0 0 -2 -2],[0 0.7 0]);
    patch([5 5.5 5.5 4.5],[0 0 -2 -2],[0 0.7 0]);
    text(2.5,1.7,'Bending Modes of a Truss', ...
	'HorizontalAlignment','center');
    axis off;
    set(gca,'Drawmode','Fast');

    t=linspace(0,2*pi,numframes+1);

    while get(axHndl,'Userdata')==play,
   	for count=1:numframes,
            if get(axHndl,'Userdata')~=play, break; end;
  
            if n~=get(popupHndl,'Value'),
		n=get(popupHndl,'Value');
      	    	del= x0(:,n);
      	    	del=reshape([del' zeros(1,4)] ,2,10)';
    	    end;
  
    	    delnow=del*sin(t(count));
    	    [xd,yd]=gplot(a,xy+delnow);
    	    set(h,'xdata',xd,'ydata',yd);
    	    drawnow;
    	end;    % for count=...
    end;    % while get(axHndl,...

    % ====== End of Demo
    set([startHndl closeHndl infoHndl],'Enable','on');
    set(stopHndl,'Enable','off');

elseif strcmp(action,'info');
    ttlStr='Bending Modes Info';
    hlpStr= ...                                            
        ['                                              '  
         ' This demo animates 12 natural bending modes  '  
         ' of a two-dimensional truss. These bending    '  
         ' modes are the results of eigenvalue analysis.'  
         ' They have been ordered by natural frequency, '
         ' with one being the slowest (and easiest to   '
         ' excite) mode and 12 being the fastest.       '  
         '                                              '  
         ' Use the "Mode" popup menu to select among    '  
         ' the various modes. The "Start" and "Stop"    '  
         ' buttons control the animation.               '  
         '                                              '  
         ' File name: truss.m                           '];
    helpfun(ttlStr,hlpStr);                                

end;    % if strcmp(action, ...
