No BSD License  

Highlights from
Neurocal

image thumbnail
from Neurocal by Zeng Lertmanorat
Simulation describing the electrical activity of nerve cell (neuron) by solving cable equation

zview3d(varargin)
function zview3d(varargin)
global zeng2  t
action = varargin{1};
switch action
case 'initial'
    temp=get(varargin{2},'position');
    FG_Size=[temp(1)+temp(3)+10 temp(2)+temp(4)-320 400 290];
    ScreenSize=get(0,'ScreenSize');
    if (FG_Size(1)+FG_Size(3))>ScreenSize(3)
        FG_Size(1)=temp(1)-FG_Size(3)-5;
    end
    if FG_Size(2)<20;
        FG_Size(2)=temp(2);
    end
    view3d.figure = figure('Color',[0.8 0.8 0.8], ...
        'Position',FG_Size, ...
        'DeleteFcn','zview3d(''DeleteFcn'');',...
        'Tag',['zview3d'], ...
        'menu','none',...
        'Name',['3D-Viewer'],...
        'NumberTitle','off',...
        'ToolBar','figure');
    view3d.axes=axes('parent',view3d.figure);
    view3d.plotvariable.var=[]; %[var para]
    view3d.plot=[];
    view3d.menu.plot(1)=uimenu('parent',view3d.figure,'label','plot','callback','zview3d(''plot'',gcf)');
    view3d.menu.plot(2)=uimenu('parent',view3d.figure,'label','Duplicate','callback','zview3d(''Duplicate'',gcf)');
    view3d.menu.plot(2)=uimenu('parent',view3d.figure,'label','Export','callback','zview3d(''Export'',gcf)');
    set(view3d.figure,'userdata',view3d);
    zview3d('plot',view3d.figure)
case 'DeleteFcn'
    view=get(gcbf,'userdata');
    if ~isempty(view.plot)
        if ishandle(view.plot)
            close(view.plot)
        end
    end    
case 'Duplicate'
    tempaxes=findobj(gcbf,'type','axes');
    figure
    if ~isempty(tempaxes)
        tempsurface=findobj(tempaxes,'type','surface');
        if ~isempty(tempsurface)
            UD=get(tempaxes,'userdata');
            mesh(UD.x,UD.y,get(tempsurface,'cdata'),'edgecolor','interp','FaceColor','interp','EdgeLighting','phong')
            title(UD.title);
        end
    end
case 'Export'
    [Filename Path]=uiputfile('*.txt');
    if Filename~=0 
        if length(Filename)<4
            Filename=[Filename '.txt'];
        elseif ~strcmp(Filename((-3:0)+length(Filename)),'.txt')
            Filename=[Filename '.txt'];
        end
        
        temp=findobj(gcbf,'type','surface');
        if ~isempty(temp)
            temp=get(temp,'cdata');
            if ~isempty(temp)
                temp=[t;temp]';
                dlmwrite([Path Filename],'  ');
                FID=fopen([Path Filename],'wb');
                tic
                for i=1:size(temp,1)
                    fprintf(FID,'%6.4f \t',[temp(i,:)']);
                    fprintf(FID,'\n');
                end
                Status=fclose(FID); 
            end
        end
    end
case 'plot'
    view3d=get(varargin{2},'userdata');
    temp=get(varargin{2},'position');
    FG_Size=[temp(1)+temp(3)+10 temp(2)+temp(4)-150+50 200 150];
    ScreenSize=get(0,'ScreenSize');
    if (FG_Size(1)+FG_Size(3))>ScreenSize(3)
        FG_Size(1)=temp(1)-FG_Size(3)-5;
    end
    if FG_Size(2)<20;
        FG_Size(2)=temp(2);
    end
    
    temp=findobj('type','figure','tag',[num2str(view3d.figure) num2str(view3d.axes)]);
    if ~isempty(temp)
        figure(temp)
        set(temp,'Position',FG_Size)
    else
    
        view3dplot.figure = figure('Color',[0.8 0.8 0.8], ...
           'ResizeFcn','zview3d(''plot-ResizeFcn'')',...
           'Position',FG_Size, ...
           'Tag',[num2str(view3d.figure) num2str(view3d.axes)], ...
           'menu','none',...
           'Name','3D-Viewer : Plot',...
           'NumberTitle','off',...
           'ToolBar','none');
   
        view3d.plot=view3dplot.figure;
        set(view3d.figure,'userdata',view3d);
        
        view3dplot.axes=view3d.axes;
        view3dplot.parent=view3d.figure;
        plot_calback='zview3d(''plot variable'')';
            
   
   	    view3dplot.var = uicontrol('Parent',view3dplot.figure, ...
            'BackgroundColor',[1 1 1], ...   
            'callback','zview3d(''update-plot'',gcbf);',...
            'ForegroundColor',[0 0 0],...
            'HorizontalAlignment','left',...
            'ListboxTop',[1],...
            'Units','pixels',...
            'Position',[10 40 FG_Size(3)/2-15 FG_Size(4)-60], ...
            'Style','listbox',...
            'Value',1);
        view3dplot.text.label(1) = uicontrol('Parent',view3dplot.figure, ...
            'Units','pixels',...
    	    'BackgroundColor',get(view3dplot.figure,'color'), ...
            'FontName','Arial',...
            'FontUnits','points',...
            'FontWeight','normal',...
            'FontAngle','normal',...
            'Position',[10 FG_Size(4)-20 FG_Size(3)/2-15 18], ...
            'String','Variables', ...
            'Style','text');

   	    view3dplot.para = uicontrol('Parent',view3dplot.figure, ...
        'BackgroundColor',[1 1 1], ...   
        'ForegroundColor',[0 0 0],...
        'HorizontalAlignment','right',...
        'ListboxTop',[1],...
        'Units','pixels',...
        'Position',[FG_Size(3)/2+5 40 FG_Size(3)/2-15 FG_Size(4)-60], ...
        'Style','listbox',...
        'Value',1);
        view3dplot.text.label(2) = uicontrol('Parent',view3dplot.figure, ...
            'Units','pixels',...
	        'BackgroundColor',get(view3dplot.figure,'color'), ...
         'FontName','Arial',...
         'FontUnits','points',...
         'FontWeight','normal',...
         'FontAngle','normal',...
         'Position',[FG_Size(3)/2+5 FG_Size(4)-20 FG_Size(3)/2-15 18], ...
         'String','Parameters', ...
         'Style','text');
        view3dplot.plot = uicontrol('Parent',view3dplot.figure, ...
         'Units','pixels',...
	        'BackgroundColor',[0.847058823529412 0.8 0.7215686274509801], ...
         'callback',plot_calback,...
         'FontName','Arial',...
         'FontUnits','points',...
         'FontWeight','normal',...
         'FontAngle','normal',...
         'Position',[FG_Size(3)/4-25 10 50 20], ...
         'String','Replace', ...
         'Tag','Pushbutton');
        view3dplot.close = uicontrol('Parent',view3dplot.figure, ...
        'callback','delete(gcbf)',...
	    'BackgroundColor',[0.847058823529412 0.8 0.7215686274509801], ...
         'Units','pixels',...
         'FontName','Arial',...
         'FontUnits','points',...
         'FontWeight','normal',...
         'FontAngle','normal',...
         'Position',[FG_Size(3)*3/4-25 10 50 20], ...
         'String','Close', ...
         'Tag','Pushbutton');
        set(view3dplot.figure,'userdata',view3dplot)
        varname=cell(length(zeng2.var),1);
        for i=1:length(zeng2.var)
            varname{i}=zeng2.var{i}.name;
        end
        set(view3dplot.var,'string',varname)
        zview3d('update-plot',view3dplot.figure);
    end
case 'update-plot'
    if ~isempty(zeng2.var)
        viewplot=get(varargin{2},'userdata');
        varnumber=get(viewplot.var,'value');
        para_value=1;
        temp=zeng2.var{varnumber}.paraname;
        if length(temp)>2
            temp{1}=[temp{1} ' (mV)'];
%            temp{2}=[temp{2} ' (mV)'];
            temp{3}=[temp{3} '   (nA)'];
        end
        set(viewplot.para,'value',para_value,'string',temp)
    end
case 'plot-ResizeFcn'
    view3dplot=get(gcbf,'userdata');
    FG_Size=get(view3dplot.figure,'position');
    FG_Size(3)=max(FG_Size(3),110);
    FG_Size(4)=max(FG_Size(4),80);
    set(view3dplot.figure,'position',FG_Size)
    
    set(view3dplot.var,'Position',[10 40 FG_Size(3)/2-15 FG_Size(4)-60])
    set(view3dplot.para,'Position',[FG_Size(3)/2+5 40 FG_Size(3)/2-15 FG_Size(4)-60])
    
    set(view3dplot.text.label(1),'Position',[10 FG_Size(4)-20 FG_Size(3)/2-15 18])
    set(view3dplot.text.label(2),'Position',[FG_Size(3)/2+5 FG_Size(4)-20 FG_Size(3)/2-15 18])
    
    set(view3dplot.plot,'Position',[FG_Size(3)/4-25 10 50 20])
    set(view3dplot.close,'Position',[FG_Size(3)*3/4-25 10 50 20])
   	

case 'plot variable'
        view3dplot=get(gcbf,'userdata');
        view=get(view3dplot.parent,'userdata');
        varnumber=get(view3dplot.var,'value');
        paranumber=get(view3dplot.para,'value');
        temp=find(zeng2.var{varnumber}.name=='{');
        global zeng
        if isempty(temp)
            eval(['global ' zeng2.var{varnumber}.name])
        else
            eval(['global ' zeng2.var{varnumber}.name(1:(temp-1))])
        end
        if eval([zeng2.var{varnumber}.name '.nseg==1'])
            zexst('err',[zeng2.var{varnumber}.name ' has only 1 segment and cannot be ploted in 3D.'  char(13) char(13) 'Only multiple segment variable can be ploted in 3D.' ])
            return
        end
        if ~(eval(['isfield(' zeng2.var{varnumber}.name  ',''vm'')' ]))
            zexst('err',['Please press ''Apply'' to run some simulation first.' char(13) char(13) '''Apply'' can be found in Setting-Time or Setting-Environment']);
            return
        end

        if strcmp('ve',zeng2.var{varnumber}.paraname{paranumber}) 
            if isempty(zeng.Iexstim)
                zexst('err',['No extracellular source in this model.' ])
                return
            elseif ~(eval(['isfield(' zeng2.var{varnumber}.name  ',''ve'')' ]))
                zexst('err',['Please press ''Apply'' to run some simulation first.' char(13) char(13) '''Apply'' can be found in Setting-Time or Setting-Environment']);
                return
            end
        end
        
        view.plotvariable.var=[varnumber paranumber]; %[var para ]
        set(view.figure,'userdata',view)
        zview3d('update',view.figure)
case 'update' %from zexst;cal and zview3:plot var
    view=get(varargin{2},'userdata');
    axes(view.axes)
    if ~isempty(view.plotvariable.var)
        temp=find(zeng2.var{view.plotvariable.var(1)}.name=='{');
        if isempty(temp)
            eval(['global ' zeng2.var{view.plotvariable.var(1)}.name])
        else
            eval(['global ' zeng2.var{view.plotvariable.var(1)}.name(1:(temp-1))])
        end
        UD.x=t;
        UD.y=[-(zeng2.var{view.plotvariable.var(1)}.nseg-1)/2:(zeng2.var{view.plotvariable.var(1)}.nseg-1)/2]/zeng2.var{view.plotvariable.var(1)}.nseg*zeng2.var{view.plotvariable.var(1)}.L;
        UD.title=[zeng2.var{view.plotvariable.var(1)}.name '.' zeng2.var{view.plotvariable.var(1)}.paraname{view.plotvariable.var(2)}];
        eval(['mesh(UD.x,UD.y,' zeng2.var{view.plotvariable.var(1)}.name '.' zeng2.var{view.plotvariable.var(1)}.paraname{view.plotvariable.var(2)} ',''edgecolor'',''interp'', ''FaceColor'',''interp'',''EdgeLighting'',''phong'')'])        
%       eval(['mesh(UD.x,UD.y,' zeng2.var{view.plotvariable.var(1)}.name '.' zeng2.var{view.plotvariable.var(1)}.paraname{view.plotvariable.var(2)} ',''edgecolor'',''interp'')'])
        set(view.axes,'userdata',UD);
        title(UD.title);
        xlabel('ms')
        ylabel('um')
        if view.plotvariable.var(2)==1 | view.plotvariable.var(2)==2 %vm em
           zlabel('mV')
        else
        end

    end
end

Contact us at files@mathworks.com