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