wolffd@0: function varargout=som_select(c_vect,plane_h,arg) wolffd@0: wolffd@0: %SOM_SELECT Manual selection of map units from a visualization. wolffd@0: % wolffd@0: % som_select(c_vect,[plane_h]) wolffd@0: % wolffd@0: % som_select(3) wolffd@0: % som_select(sM.labels(:,1)) wolffd@0: % wolffd@0: % Input arguments ([]'s are optional): wolffd@0: % c_vect (scalar) number of classes wolffd@0: % (vector) initial class identifiers wolffd@0: % (cell array) of strings, class names wolffd@0: % (matrix) size * x 3, the color of each class wolffd@0: % [plane_h] (scalar) handle of the plane (axes) to be marked. wolffd@0: % By default, the current axes is used (GCA). wolffd@0: % For the function to work, the plot in the wolffd@0: % axes must have been created with the wolffd@0: % SOM_CPLANE function (or SOM_SHOW). wolffd@0: % wolffd@0: % Launches a GUI which allows user to select nodes from plane by wolffd@0: % clicking them or by choosing a region (a polygon). wolffd@0: % wolffd@0: % Middle mouse button: selects (or clears selection of) a single node wolffd@0: % Left mouse button: lets user draw a polygon wolffd@0: % Right mouse button: selects (or clears selection of) the units wolffd@0: % inside the polygon wolffd@0: % wolffd@0: % From the GUI, the color (class) is selected as well as whether wolffd@0: % but buttons select or clear the selection from the units. The wolffd@0: % buttons on the bottom have the following actions: wolffd@0: % wolffd@0: % 'OK' Assigns the class identifiers to the 'ans' variable in wolffd@0: % workspace. The value is an array of class identifiers: wolffd@0: % strings (cellstr) if the c_vect was an array of wolffd@0: % strings, a vector otherwise. wolffd@0: % 'Clear' Removes marks from the plane. wolffd@0: % 'Close' Closes the application. wolffd@0: % wolffd@0: % See also SOM_SHOW, SOM_CPLANE. wolffd@0: wolffd@0: % Contributed to SOM Toolbox vs2, February 2nd, 2000 by Juha Parhankangas wolffd@0: % Copyright (c) by Juha Parhankangas wolffd@0: % http://www.cis.hut.fi/projects/somtoolbox/ wolffd@0: wolffd@0: % Juha Parhankangas 050100, juuso 010200 wolffd@0: wolffd@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wolffd@0: %% input arguments wolffd@0: wolffd@0: if nargin < 2, plane_h = gca; end wolffd@0: if(isempty(gcbo)), arg='start'; end wolffd@0: wolffd@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wolffd@0: %% action wolffd@0: wolffd@0: switch arg wolffd@0: case 'start' wolffd@0: patch_h=find_patch(plane_h); wolffd@0: lattice=getfield(size(get(patch_h,'XData')),{1}); wolffd@0: msize(1)=floor(getfield(get(plane_h,'YLim'),{2})); wolffd@0: msize(2)=floor(getfield(get(plane_h,'XLim'),{2})-0.5); wolffd@0: if lattice==6 wolffd@0: lattice='hexa'; wolffd@0: else wolffd@0: lattice='rect'; wolffd@0: end wolffd@0: wolffd@0: if any(strcmp(get(patch_h,'Tag'),{'planeBar','planePie'})) wolffd@0: tmp_dim=size(get(patch_h,'XData'),2)/prod(msize); wolffd@0: tmp_xdata=get(patch_h,'XData'); wolffd@0: tmp_x=tmp_xdata(:,(msize(1)*(msize(2)-1)+2)*tmp_dim); wolffd@0: if floor(tmp_x(1)) ~= round(tmp_x(1)) wolffd@0: lattice = 'hexa'; wolffd@0: else wolffd@0: lattice = 'rect'; wolffd@0: end wolffd@0: elseif strcmp(get(patch_h,'Tag'),'planePlot') wolffd@0: tmp_lines_h=get(gca,'Children'); wolffd@0: test_x=mean(get(tmp_lines_h(2),'XData')); wolffd@0: if round(test_x) ~= floor(test_x) wolffd@0: lattice = 'hexa'; wolffd@0: else wolffd@0: lattice = 'rect'; wolffd@0: end wolffd@0: form=0.5*vis_patch('hexa'); wolffd@0: l = size(form,1); wolffd@0: wolffd@0: nx = repmat(form(:,1),1,prod(msize)); wolffd@0: ny = repmat(form(:,2),1,prod(msize)); wolffd@0: wolffd@0: x=reshape(repmat(1:msize(2),l*msize(1),1),l,prod(msize)); wolffd@0: y=repmat(repmat(1:msize(1),l,1),1,msize(2)); wolffd@0: wolffd@0: if strcmp(lattice,'hexa') wolffd@0: t = find(~rem(y(1,:),2)); wolffd@0: x(:,t)=x(:,t)+.5; wolffd@0: end wolffd@0: x=x+nx; wolffd@0: y=y+ny; wolffd@0: wolffd@0: colors=reshape(ones(prod(msize),1)*[NaN NaN NaN],... wolffd@0: [1 prod(msize) 3]); wolffd@0: v=caxis; wolffd@0: patch_h=patch(x,y,colors,... wolffd@0: 'EdgeColor','none',... wolffd@0: 'ButtonDownFcn',... wolffd@0: 'som_select([],[],''click'')',... wolffd@0: 'Tag','planePlot'); wolffd@0: set([gca gcf],'ButtonDownFcn','som_select([],[],''click'')'); wolffd@0: caxis(v) wolffd@0: end wolffd@0: wolffd@0: c_colors = []; wolffd@0: if iscell(c_vect) wolffd@0: [c_vect,c_names,c_classes]=class2num(c_vect); wolffd@0: if length(c_classes)1), wolffd@0: c_colors = c_vect; wolffd@0: c_names = 1:size(c_vect,1); wolffd@0: c_vect = size(c_vect,1); wolffd@0: c_classes = zeros(prod(msize),1); wolffd@0: elseif length(c_vect)==prod(msize), wolffd@0: c_classes = c_vect; wolffd@0: u = unique(c_classes(isfinite(c_classes) & c_classes>0)); wolffd@0: c_names = u; wolffd@0: c_vect = length(u); wolffd@0: elseif length(c_vect)>1, wolffd@0: c_names = c_vect; wolffd@0: c_vect = length(c_vect); wolffd@0: c_classes = zeros(prod(msize),1); wolffd@0: elseif length(c_vect)==1, wolffd@0: c_names = 1:c_vect; wolffd@0: c_classes = zeros(prod(msize),1); wolffd@0: end wolffd@0: end wolffd@0: wolffd@0: udata.lattice=lattice; wolffd@0: udata.patch_h=patch_h; wolffd@0: udata.plane_h=plane_h; wolffd@0: udata.type=get(udata.patch_h,'Tag'); wolffd@0: udata.msize=msize; wolffd@0: set(patch_h,'UserData',udata); wolffd@0: if strcmp(udata.type,'planePlot') wolffd@0: set([gca gcf],'UserData',udata); wolffd@0: end wolffd@0: str=cat(2,'som_select([],[],''click'')'); wolffd@0: set(patch_h,'ButtonDownFcn',str); wolffd@0: wolffd@0: draw_colorselection(c_names,c_colors); wolffd@0: tmp_data=findobj(get(0,'Children'),'Tag','SELECT_GUI'); wolffd@0: tmp_data=get(tmp_data,'UserData'); wolffd@0: tmp_data.c_names=c_names; wolffd@0: tmp_data.mat=reshape(c_classes,msize); wolffd@0: tmp_data.patch_h=patch_h; wolffd@0: tmp_data.plane_h=plane_h; wolffd@0: tmp_data.type=get(udata.patch_h,'Tag'); wolffd@0: tmp_data.lattice=lattice; wolffd@0: tmp_data.coords=[]; wolffd@0: tmp_data.poly_h=[]; wolffd@0: tmp_data.msize=msize; wolffd@0: tmp_data.mode='select'; wolffd@0: set(tmp_data.fig_h,'UserData',tmp_data); wolffd@0: draw_classes; wolffd@0: wolffd@0: case 'click' wolffd@0: switch get(gcf,'SelectionType') wolffd@0: case 'open' wolffd@0: return; wolffd@0: case {'normal','alt'} wolffd@0: draw_poly; wolffd@0: case 'extend' wolffd@0: click; wolffd@0: end wolffd@0: case 'choose' wolffd@0: draw_colorselection(0,0,'choose'); wolffd@0: case 'close' wolffd@0: close_gui; wolffd@0: case 'clear' wolffd@0: clear_plane; wolffd@0: case 'rb' wolffd@0: rb_control; wolffd@0: case 'ret_mat' wolffd@0: gui=findobj(get(0,'Children'),'Tag','SELECT_GUI'); wolffd@0: gui=get(gui,'UserData'); wolffd@0: mat=reshape(gui.mat,prod(size(gui.mat)),1); wolffd@0: if ~isempty(gui.c_names) wolffd@0: if isnumeric(gui.c_names), tmp=zeros(length(mat),1); wolffd@0: else tmp=cell(length(mat),1); wolffd@0: end wolffd@0: for i=1:length(gui.c_names) wolffd@0: inds=find(mat==i); wolffd@0: tmp(inds)=gui.c_names(i); wolffd@0: end wolffd@0: mat=tmp; wolffd@0: end wolffd@0: varargout{1}=mat; wolffd@0: %gui.mat=zeros(size(gui.mat)); wolffd@0: %set(gui.fig_h,'UserData',gui); wolffd@0: %h=findobj(get(gui.plane_h,'Children'),'Tag','SEL_PATCH'); wolffd@0: %delete(h); wolffd@0: end wolffd@0: wolffd@0: return; wolffd@0: wolffd@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wolffd@0: %% subfunctions wolffd@0: wolffd@0: function rb_control; wolffd@0: wolffd@0: h=findobj(get(gcf,'Children'),'Style','radiobutton'); wolffd@0: set(h,'Value',0); wolffd@0: set(gcbo,'Value',1); wolffd@0: wolffd@0: udata=get(gcf,'UserData'); wolffd@0: if strcmp(get(gcbo,'Tag'),'Radiobutton1') wolffd@0: udata.mode='select'; wolffd@0: else wolffd@0: udata.mode='clear'; wolffd@0: end wolffd@0: wolffd@0: set(gcf,'UserData',udata); wolffd@0: wolffd@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wolffd@0: wolffd@0: function clear_plane wolffd@0: wolffd@0: h=findobj(get(0,'Children'),'Tag','SELECT_GUI'); wolffd@0: gui=get(h,'UserData'); wolffd@0: wolffd@0: if strcmp(get(gui.patch_h,'Tag'),'planePlot') wolffd@0: colors=reshape(get(gui.patch_h,'FaceVertexCData'),[prod(gui.msize) 3]); wolffd@0: colors(:,:)=NaN; wolffd@0: set(gui.patch_h,'FaceVertexCData',colors); wolffd@0: end wolffd@0: wolffd@0: h=findobj(get(gui.plane_h,'Children'),'Tag','SEL_PATCH'); wolffd@0: gui.mat=zeros(gui.msize); wolffd@0: set(gui.fig_h,'UserData',gui); wolffd@0: delete(h); wolffd@0: wolffd@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wolffd@0: wolffd@0: function click wolffd@0: wolffd@0: udata=get(gcbo,'UserData'); wolffd@0: wolffd@0: udata=get(udata.patch_h,'UserData'); wolffd@0: coords=get(gca,'CurrentPoint'); wolffd@0: row=round(coords(1,2)); wolffd@0: if row > udata.msize(1), row = udata.msize(1); end wolffd@0: if row < 1, row = 1; end wolffd@0: if any(strcmp(udata.lattice,{'hexa','hexaU'})) & ~mod(row,2), wolffd@0: col=floor(coords(1,1))+0.5; wolffd@0: if col > udata.msize(2)+0.5, col=udata.msize(2)+0.5; end wolffd@0: else wolffd@0: col=round(coords(1,1)); wolffd@0: if col > udata.msize(2), col=udata.msize(2); end wolffd@0: end wolffd@0: if col < 1, col = 1; end wolffd@0: wolffd@0: if strcmp(udata.type,'planePlot') wolffd@0: wolffd@0: if ~mod(row,2) & strcmp(udata.lattice,'hexa'), col=round(col-0.5); end wolffd@0: wolffd@0: ind=sub2ind(udata.msize,row,col); wolffd@0: colors=reshape(get(udata.patch_h,'FaceVertexCData'),[prod(udata.msize) 3]); wolffd@0: gui=findobj(get(0,'Children'),'Tag','SELECT_GUI'); wolffd@0: gui=get(gui,'UserData'); wolffd@0: wolffd@0: if ~isempty(gui.curr_col) & all(~isnan(colors(ind,1,:))), wolffd@0: if ~strcmp(gui.mode,'clear') & ~all(gui.curr_col == colors(ind,:)) wolffd@0: colors(ind,:)=gui.curr_col; wolffd@0: gui.mat(row,col)=gui.class; wolffd@0: else wolffd@0: colors(ind,:)=[NaN NaN NaN]; wolffd@0: gui.mat(row,col)=0; wolffd@0: end wolffd@0: elseif strcmp(gui.mode,'clear') wolffd@0: colors(ind,:)=[NaN NaN NaN]; wolffd@0: gui.mat(row,col)=0; wolffd@0: elseif isempty(gui.curr_col) wolffd@0: return; wolffd@0: else wolffd@0: gui.mat(row,col)=gui.class; wolffd@0: colors(ind,:)=gui.curr_col; wolffd@0: end wolffd@0: set(udata.patch_h,'FaceVertexCData',colors); wolffd@0: set(gui.fig_h,'UserData',gui); wolffd@0: return; wolffd@0: end wolffd@0: wolffd@0: if any(strcmp(udata.type,{'planePie','planeBar'})) wolffd@0: [x,y]=pol2cart(0:0.1:2*pi,0.5); wolffd@0: coords=[x';0.5]*0.7; wolffd@0: coords(:,2)=[y';0]*0.7; wolffd@0: elseif strcmp(udata.lattice,'hexa'); wolffd@0: coords=0.7*vis_patch('hexa'); wolffd@0: else wolffd@0: coords=0.7*vis_patch('rect'); wolffd@0: end wolffd@0: coords(:,1)=coords(:,1)+col; wolffd@0: coords(:,2)=coords(:,2)+row; wolffd@0: if ~mod(row,2) & strcmp(udata.lattice,'hexa'), col=round(col-0.5); end wolffd@0: wolffd@0: hold on; wolffd@0: if gco == udata.patch_h wolffd@0: gui=findobj(get(0,'Children'),'Tag','SELECT_GUI'); wolffd@0: gui=get(gui,'UserData'); wolffd@0: if isnan(gui.curr_col) | strcmp(gui.mode,'clear'), return; end wolffd@0: h=fill(coords(:,1),coords(:,2),gui.curr_col); wolffd@0: str=cat(2,'som_select([],[],''click'')'); wolffd@0: set(h,'ButtonDownFcn',str,'Tag','SEL_PATCH'); wolffd@0: tmp.patch_h=udata.patch_h; wolffd@0: set(h,'UserData',tmp); wolffd@0: gui.mat(row,col)=gui.class; wolffd@0: set(gui.fig_h,'UserData',gui); wolffd@0: else wolffd@0: gui=findobj(get(0,'Children'),'Tag','SELECT_GUI'); wolffd@0: gui=get(gui,'UserData'); wolffd@0: if ~all(get(gcbo,'FaceColor') == gui.curr_col) & ~strcmp(gui.mode,'clear'), wolffd@0: if ~isnan(gui.curr_col), wolffd@0: set(gcbo,'FaceColor',gui.curr_col); wolffd@0: gui.mat(row,col) = gui.class; wolffd@0: end wolffd@0: else wolffd@0: gui.mat(row,col)=0; wolffd@0: delete(gco); wolffd@0: end wolffd@0: set(gui.fig_h,'UserData',gui); wolffd@0: end wolffd@0: wolffd@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wolffd@0: wolffd@0: function draw_colorselection(varargin) wolffd@0: wolffd@0: if length(varargin)==2, wolffd@0: wolffd@0: if length(varargin{1})==1, wolffd@0: n = varargin{1}; wolffd@0: names = 1:n; wolffd@0: else wolffd@0: n = length(varargin{1}); wolffd@0: names = varargin{1}; wolffd@0: end wolffd@0: colors = varargin{2}; wolffd@0: wolffd@0: shape=[0.5 -0.5;0.5 0.5;1.5 0.5;1.5 -0.5]; wolffd@0: rep_x=repmat(shape(:,1),1,n); wolffd@0: rep_y=repmat(shape(:,2),1,n); wolffd@0: for i=0:getfield(size(rep_y,2))-1, rep_x(:,i+1)=rep_x(:,i+1)+i; end wolffd@0: if isempty(colors), colors=jet(n); end wolffd@0: data=som_select_gui; wolffd@0: data.colors=colors; wolffd@0: data.curr_col=NaN; wolffd@0: data.class=0; wolffd@0: set(0,'CurrentFigure',data.fig_h); wolffd@0: hold on; wolffd@0: tmp=fill(rep_x,rep_y,0.8); wolffd@0: for i=1:n wolffd@0: set(tmp(i),... wolffd@0: 'EdgeColor',[0 0 0],... wolffd@0: 'FaceColor',colors(i,:),... wolffd@0: 'ButtonDownFcn','som_select([],0,''choose'');'); wolffd@0: end wolffd@0: axis('equal'); wolffd@0: axis('on'); wolffd@0: set(gca,'XTick',1:n,'XTickLabel',names,'XAxisLocation','top'); wolffd@0: set(data.a_h,'YLim',[-0.5,0.5],... wolffd@0: 'XLim',[0.5 n+0.5],... wolffd@0: 'YTickLabel',''); wolffd@0: set(data.fig_h,'UserData',data); wolffd@0: wolffd@0: elseif strcmp(varargin{3},'choose') wolffd@0: wolffd@0: udata=get(gcf,'UserData'); wolffd@0: if strcmp(get(gcbo,'Selected'),'off') wolffd@0: old=findobj(get(gca,'Children'),'Type','patch'); wolffd@0: set(old,'Selected','off'); wolffd@0: set(gcbo,'Selected','on'); wolffd@0: udata.curr_col=udata.colors(round(mean(get(gcbo,'XData'))),:); wolffd@0: udata.class=mean(get(gcbo,'XData')); wolffd@0: else wolffd@0: set(gcbo,'Selected','off'); wolffd@0: udata.curr_col=NaN; wolffd@0: udata.class=0; wolffd@0: end wolffd@0: set(gcf,'UserData',udata); wolffd@0: wolffd@0: end wolffd@0: wolffd@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wolffd@0: wolffd@0: function data=som_select_gui() wolffd@0: wolffd@0: wolffd@0: a = figure('Color',[0.8 0.8 0.8], ... wolffd@0: 'PaperType','a4letter', ... wolffd@0: 'Position',[586 584 560 210], ... wolffd@0: 'Tag','SELECT_GUI'); wolffd@0: wolffd@0: data.fig_h=a; wolffd@0: wolffd@0: b = axes('Parent',a, ... wolffd@0: 'Box','on', ... wolffd@0: 'CameraUpVector',[0 1 0], ... wolffd@0: 'Color',[1 1 1], ... wolffd@0: 'DataAspectRatioMode','manual', ... wolffd@0: 'PlotBoxAspectRatio',[20 1 2], ... wolffd@0: 'PlotBoxAspectRatioMode','manual', ... wolffd@0: 'Position',[0.13 0.11 0.775 0.815], ... wolffd@0: 'Tag','Axes1', ... wolffd@0: 'WarpToFill','off', ... wolffd@0: 'XColor',[0 0 0], ... wolffd@0: 'XLimMode','manual', ... wolffd@0: 'YColor',[0 0 0], ... wolffd@0: 'YLimMode','manual', ... wolffd@0: 'YTickLabelMode','manual', ... wolffd@0: 'ZColor',[0 0 0]); wolffd@0: wolffd@0: data.a_h=b; wolffd@0: wolffd@0: b = uicontrol('Parent',a, ... wolffd@0: 'Units','points', ... wolffd@0: 'BackgroundColor',[0.701961 0.701961 0.701961], ... wolffd@0: 'Callback','som_select([],[],''close'')', ... wolffd@0: 'FontWeight','demi', ... wolffd@0: 'Position',[150 12 50 20], ... wolffd@0: 'String','CLOSE', ... wolffd@0: 'Tag','Pushbutton1'); wolffd@0: wolffd@0: b = uicontrol('Parent',a, ... wolffd@0: 'Units','points', ... wolffd@0: 'BackgroundColor',[0.701961 0.701961 0.701961], ... wolffd@0: 'Callback','som_select([],0,''ret_mat'')',... wolffd@0: 'FontWeight','demi', ... wolffd@0: 'Position',[365 12 50 20], ... wolffd@0: 'String','OK', ... wolffd@0: 'Tag','Pushbutton2'); wolffd@0: wolffd@0: b = uicontrol('Parent',a, ... wolffd@0: 'Units','points', ... wolffd@0: 'BackgroundColor',[0.701961 0.701961 0.701961], ... wolffd@0: 'Callback','som_select([],0,''clear'')',... wolffd@0: 'FontWeight','demi', ... wolffd@0: 'Position',[257.5 12 50 20], ... wolffd@0: 'String','CLEAR', ... wolffd@0: 'Tag','Pushbutton3'); wolffd@0: wolffd@0: b = uicontrol('Parent',a, ... wolffd@0: 'Units','points', ... wolffd@0: 'Position',[50 27 17 16], ... wolffd@0: 'Callback','som_select([],[],''rb'')',... wolffd@0: 'Style','radiobutton', ... wolffd@0: 'Tag','Radiobutton1', ... wolffd@0: 'Value',1); wolffd@0: b = uicontrol('Parent',a, ... wolffd@0: 'Units','points', ... wolffd@0: 'BackgroundColor',[0.701961 0.701961 0.701961], ... wolffd@0: 'Callback','som_select([],[],''rb'')',... wolffd@0: 'Position',[50 7 17 16], ... wolffd@0: 'Style','radiobutton', ... wolffd@0: 'Tag','Radiobutton2'); wolffd@0: b = uicontrol('Parent',a, ... wolffd@0: 'Units','points', ... wolffd@0: 'BackgroundColor',[0.8 0.8 0.8], ... wolffd@0: 'FontSize',9, ... wolffd@0: 'FontWeight','demi', ... wolffd@0: 'HorizontalAlignment','left', ... wolffd@0: 'Position',[72 25 28 15], ... wolffd@0: 'String','Select', ... wolffd@0: 'Style','text', ... wolffd@0: 'Tag','StaticText1'); wolffd@0: b = uicontrol('Parent',a, ... wolffd@0: 'Units','points', ... wolffd@0: 'BackgroundColor',[0.8 0.8 0.8], ... wolffd@0: 'FontSize',9, ... wolffd@0: 'FontWeight','demi', ... wolffd@0: 'HorizontalAlignment','left', ... wolffd@0: 'Position',[72 7 25 13.6], ... wolffd@0: 'String','Clear', ... wolffd@0: 'Style','text', ... wolffd@0: 'Tag','StaticText2'); wolffd@0: wolffd@0: wolffd@0: wolffd@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wolffd@0: wolffd@0: function close_gui wolffd@0: wolffd@0: udata=get(get(gcbo,'Parent'),'UserData'); wolffd@0: wolffd@0: if strcmp(udata.type,'planePlot'); wolffd@0: set(udata.plane_h,'ButtonDownFcn','','UserData',[]); wolffd@0: set(get(udata.plane_h,'Parent'),'ButtonDownFcn',''); wolffd@0: delete(udata.patch_h); wolffd@0: return; wolffd@0: end wolffd@0: wolffd@0: h=findobj(get(udata.plane_h,'Children'),'Tag','SEL_PATCH'); wolffd@0: set(udata.patch_h,'ButtonDownFcn','','UserData',[]); wolffd@0: delete(h); wolffd@0: close(udata.fig_h); wolffd@0: wolffd@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wolffd@0: wolffd@0: function draw_poly wolffd@0: wolffd@0: udata=get(findobj(get(0,'Children'),'Tag','SELECT_GUI'),'UserData'); wolffd@0: wolffd@0: if isempty(udata.coords) & strcmp(get(gcf,'SelectionType'),'alt') wolffd@0: return; wolffd@0: end wolffd@0: wolffd@0: coords(1,1) = getfield(get(gca,'CurrentPoint'),{3}); wolffd@0: coords(1,2) = getfield(get(gca,'CurrentPoint'),{1}); wolffd@0: udata.coords = cat(1,udata.coords,coords); wolffd@0: delete(udata.poly_h); wolffd@0: subplot(udata.plane_h); wolffd@0: wolffd@0: hold on; wolffd@0: switch get(gcf,'SelectionType'); wolffd@0: case 'normal' wolffd@0: udata.poly_h=plot(udata.coords(:,2),udata.coords(:,1),'black',... wolffd@0: 'ButtonDownFcn','som_select([],[],''click'')',... wolffd@0: 'LineWidth',2); wolffd@0: set(udata.fig_h,'UserData',udata); wolffd@0: case 'alt' wolffd@0: udata.coords=cat(1,udata.coords,udata.coords(1,:)); wolffd@0: udata.poly_h=plot(udata.coords(:,2),udata.coords(:,1),'black',... wolffd@0: 'LineWidth',2); wolffd@0: delete(udata.poly_h); wolffd@0: if ~isnan(udata.curr_col) wolffd@0: tmp=sort(repmat((1:udata.msize(1))',udata.msize(2),1)); wolffd@0: tmp(:,2)=repmat((1:udata.msize(2))',udata.msize(1),1); wolffd@0: tmp2=tmp; wolffd@0: if strcmp(udata.type,'planePlot') wolffd@0: in=find(inpolygon(tmp(:,2),tmp(:,1),... wolffd@0: udata.coords(:,2),udata.coords(:,1))); wolffd@0: row=tmp2(in,1); wolffd@0: col=tmp2(in,2); wolffd@0: in=sub2ind(udata.msize,row,col); wolffd@0: colors=reshape(get(udata.patch_h,'FaceVertexCData'),... wolffd@0: [prod(udata.msize) 3]); wolffd@0: if ~isnan(udata.curr_col) & ~strcmp(udata.mode,'clear') wolffd@0: colors(in,:)=ones(length(in),1)*udata.curr_col; wolffd@0: udata.mat(row,col)=udata.class; wolffd@0: elseif strcmp(udata.mode,'clear') wolffd@0: colors(in,:)=[NaN NaN NaN]; wolffd@0: udata.mat(row,col)=0; wolffd@0: end wolffd@0: udata.poly_h=[]; wolffd@0: udata.coords=[]; wolffd@0: set(udata.patch_h,'FaceVertexCData',colors); wolffd@0: set(udata.fig_h,'UserData',udata); wolffd@0: return; wolffd@0: end wolffd@0: if strcmp(udata.lattice,'hexa'); wolffd@0: t=find(~rem(tmp(:,1),2)); wolffd@0: tmp(t,2)=tmp(t,2)+0.5; wolffd@0: if any(strcmp(get(udata.patch_h,'Tag'),{'planeC','planeU'})) wolffd@0: p=0.7*vis_patch('hexa'); wolffd@0: else wolffd@0: [x,y]=pol2cart(0:0.1:2*pi,0.5); wolffd@0: p=[x';0.5]*0.7; wolffd@0: p(:,2)=[y';0]*0.7; wolffd@0: end wolffd@0: else wolffd@0: if any(strcmp(get(udata.patch_h,'Tag'),{'planeC','planeU'})) wolffd@0: p=0.7*vis_patch('rect'); wolffd@0: else wolffd@0: [x,y]=pol2cart(0:0.1:2*pi,0.5); wolffd@0: p=[x';0.5]*0.7; wolffd@0: p(:,2)=[y';0]*0.7; wolffd@0: end wolffd@0: end wolffd@0: in=find(inpolygon(tmp(:,2),tmp(:,1),udata.coords(:,2),udata.coords(:,1))); wolffd@0: set(udata.fig_h,'UserData',udata); wolffd@0: if strcmp(udata.mode,'select') wolffd@0: remove_selpatches; wolffd@0: udata=get(udata.fig_h,'UserData'); wolffd@0: for i=1:length(in) wolffd@0: udat.patch_h=udata.patch_h; wolffd@0: h=patch(p(:,1)+tmp(in(i),2),p(:,2)+tmp(in(i),1),... wolffd@0: udata.curr_col,... wolffd@0: 'EdgeColor','black',... wolffd@0: 'ButtonDownFcn','som_select([],[],''click'')', ... wolffd@0: 'Tag','SEL_PATCH',... wolffd@0: 'UserData',udat); wolffd@0: udata.mat(tmp2(in(i),1),tmp2(in(i),2))=udata.class; wolffd@0: end wolffd@0: else wolffd@0: remove_selpatches; wolffd@0: udata=get(udata.fig_h,'UserData'); wolffd@0: %h=findobj(get(udata.plane_h,'Children'),'Tag','SEL_PATCH'); wolffd@0: %for i=1:length(h) wolffd@0: % if all(get(h(i),'FaceColor')==udata.curr_col) & ... wolffd@0: % inpolygon(mean(get(h(i),'XData')),mean(get(h(i),'YData')),... wolffd@0: % udata.coords(:,2),udata.coords(:,1)) wolffd@0: % coords=[floor(mean(get(h(i),'YData')))... wolffd@0: % floor(mean(get(h(i),'XData')))]; wolffd@0: % udata.mat(coords(1),coords(2))=0; wolffd@0: % delete(h(i)); wolffd@0: % end wolffd@0: %end wolffd@0: end wolffd@0: end wolffd@0: udata.poly_h=[]; wolffd@0: udata.coords=[]; wolffd@0: set(udata.fig_h,'UserData',udata); wolffd@0: end wolffd@0: wolffd@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wolffd@0: wolffd@0: function remove_selpatches wolffd@0: wolffd@0: udata=get(findobj(get(0,'Children'),'Tag','SELECT_GUI'),'UserData'); wolffd@0: h=findobj(get(udata.plane_h,'Children'),'Tag','SEL_PATCH'); wolffd@0: for i=1:length(h) wolffd@0: if inpolygon(mean(get(h(i),'XData')),mean(get(h(i),'YData')),... wolffd@0: udata.coords(:,2),udata.coords(:,1)); wolffd@0: coords=[floor(mean(get(h(i),'YData')))... wolffd@0: floor(mean(get(h(i),'XData')))]; wolffd@0: udata.mat(coords(1),coords(2))=0; wolffd@0: delete(h(i)); wolffd@0: end wolffd@0: end wolffd@0: wolffd@0: set(udata.fig_h,'UserData',udata); wolffd@0: wolffd@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wolffd@0: wolffd@0: function [n,names,classes]=class2num(class) wolffd@0: wolffd@0: names = {}; wolffd@0: classes = zeros(length(class),1); wolffd@0: for i=1:length(class) wolffd@0: if ~isempty(class{i}), wolffd@0: a = find(strcmp(class{i},names)); wolffd@0: if isempty(a), wolffd@0: names=cat(1,names,class(i)); wolffd@0: classes(i) = length(names); wolffd@0: else wolffd@0: classes(i) = a; wolffd@0: end wolffd@0: end wolffd@0: end wolffd@0: n=length(names); wolffd@0: wolffd@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wolffd@0: wolffd@0: function h=find_patch(a_h) wolffd@0: wolffd@0: h=[]; wolffd@0: wolffd@0: tags={'planeC','planeU','planePie','planeBar','planePlot'}; wolffd@0: wolffd@0: for i=1:5 wolffd@0: if ~isempty(findobj(get(a_h,'Children'),'Tag',tags{i})) wolffd@0: h=findobj(get(gca,'Children'),'Tag',tags{i}); wolffd@0: if length(h) > 1 wolffd@0: h=h(1); wolffd@0: end wolffd@0: return; wolffd@0: end wolffd@0: end wolffd@0: wolffd@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wolffd@0: wolffd@0: function draw_classes wolffd@0: wolffd@0: udata=get(findobj(get(0,'Children'),'Tag','SELECT_GUI'), ... wolffd@0: 'UserData'); wolffd@0: figure(get(udata.plane_h,'Parent')) wolffd@0: subplot(udata.plane_h); wolffd@0: wolffd@0: colors=zeros(prod(udata.msize),3)+NaN; wolffd@0: c_map=jet(length(udata.c_names)); wolffd@0: inds = find(udata.mat); wolffd@0: for i=1:length(inds), wolffd@0: colors(inds(i),:) = c_map(udata.mat(inds(i)),:); wolffd@0: end wolffd@0: wolffd@0: if strcmp(udata.type,'planePlot'), wolffd@0: wolffd@0: set(udata.patch_h,'FaceVertexCData',colors); wolffd@0: set(udata.fig_h,'UserData',udata); wolffd@0: wolffd@0: else wolffd@0: wolffd@0: hold on wolffd@0: co = som_vis_coords(udata.lattice,udata.msize); wolffd@0: if any(strcmp(get(udata.patch_h,'Tag'),{'planeC','planeU'})) wolffd@0: p=0.7*vis_patch(udata.lattice); wolffd@0: else wolffd@0: [x,y]=pol2cart(0:0.1:2*pi,0.5); wolffd@0: p=[x';0.5]*0.7; wolffd@0: p(:,2)=[y';0]*0.7; wolffd@0: end wolffd@0: for i=1:length(inds), wolffd@0: udat.patch_h=udata.patch_h; wolffd@0: h=patch(p(:,1)+co(inds(i),1),p(:,2)+co(inds(i),2),... wolffd@0: colors(inds(i),:),... wolffd@0: 'EdgeColor','black',... wolffd@0: 'ButtonDownFcn','som_select([],[],''click'')', ... wolffd@0: 'Tag','SEL_PATCH',... wolffd@0: 'UserData',udat); wolffd@0: end wolffd@0: wolffd@0: end wolffd@0: wolffd@0: wolffd@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%