📄 topview.m
字号:
if strcmp(wire,'Cwire')
pos = mean([handles.config.C1(1,:);handles.config.C2(1,:)]);
else
pos = mean([handles.config.P1(1,:);handles.config.P2(1,:)]);
end
handles.topview.current_apex(1:2) = {wire, 0};
handles = add_apex(handles,pos(1:2),wire);
id = 1;
elseif size(handles.config.(wire),1)==1
handles.topview.current_apex(1:2) = {wire, 1};
handles = update_topview(handles);
id = 1;
else
CurrentPoint = mean(get(gca,'CurrentPoint'));
dist = sqrt((handles.config.(wire)(:,1)-CurrentPoint(1)).^2+...
(handles.config.(wire)(:,2)-CurrentPoint(2)).^2);
[temp,id] = min(dist,[],1);
handles.topview.current_apex(1:2) = {wire, id};
handles = update_topview(handles);
end
if ishandle(handles.topview.current_apex{3})
set(handles.topview.current_apex{3},'xdata',handles.config.(wire)(id,1),...
'ydata',handles.config.(wire)(id,2));
else
handles.topview.current_apex{3} = line(handles.config.(wire)(id,1),...
handles.config.(wire)(id,2),'MarkerSize',4, ...
'markeredgecolor','k','markerfacecolor','k','marker','o',...
'linewidth',0.5,'ButtonDownFcn',{@apex_ButtonDownFcn, wire});
end
%CurrentPoint = round(mean(get(gca,'CurrentPoint')).*10)./10;
%handles = add_apex(handles,CurrentPoint(1:2));
set(gcbf,'WindowButtonMotionFcn',{@apex_move_Callback, wire});
set(gcbf,'WindowButtonUpFcn',@ButtonUpFcn);
wire
set(handles.CP_x_edit,'string',num2str(handles.config.(wire)(id,1)));
set(handles.CP_y_edit,'string',num2str(handles.config.(wire)(id,2)));
case{'extend'} % Shift - left
case{'alt'} % Ctrl - left
case{'open'} % Double click
disp(['Apex Double click!']);
end
guidata(hObject,handles);
% --------------------------------------------------------------------
% --- Executes on mouse movement with button pressed on an apex.
function apex_move_Callback(hObject, eventdata, wire)
handles = guidata(hObject);
CurrentPoint = round(mean(get(gca,'CurrentPoint'))*10)/10;
set(handles.CP_x_edit, 'string', num2str(CurrentPoint(1)));
set(handles.CP_y_edit, 'string', num2str(CurrentPoint(2)));
handles.config.(wire)(handles.topview.current_apex{2},1:2) = CurrentPoint(1:2);
if ishandle(handles.topview.current_apex{3})
set(handles.topview.current_apex{3},'xdata',...
handles.config.(wire)(handles.topview.current_apex{2},1),...
'ydata',handles.config.(wire)(handles.topview.current_apex{2},2));
else
handles.topview.current_apex{3} =...
line(handles.config.(wire)(handles.topview.current_apex{2},1),...
handles.config.(wire)(handles.topview.current_apex{2},2),'MarkerSize',4, ...
'markeredgecolor','k','markerfacecolor','k','marker','o',...
'linewidth',0.5,'ButtonDownFcn',{@apex_ButtonDownFcn, wire});
end
set(handles.CP_x_edit,'string',num2str(CurrentPoint(1)));
set(handles.CP_y_edit,'string',num2str(CurrentPoint(2)));
handles = update_topview(handles);
guidata(hObject,handles);
% --------------------------------------------------------------------
% --- Executes on mouse press over electrode.
function electrode_ButtonDownFcn(hObject, eventdata, handles, electrode)
click_type = get(gcbf,'SelectionType');
switch click_type
case{'normal'} % left click
disp(['Electrode ' electrode ' Left click!']);
set(gcbf,'WindowButtonMotionFcn',{@electrode_move_Callback, electrode});
set(gcbf,'WindowButtonUpFcn',@ButtonUpFcn);
set(handles.CP_x_edit, 'string', num2str(handles.config.(electrode)(1)));
set(handles.CP_y_edit, 'string', num2str(handles.config.(electrode)(2)));
wire = [electrode(1) 'wire'];
if ~isempty(handles.config.(wire)) && strcmp(electrode(2),'2')
apex = size(handles.config.(wire),1);
else
apex = 0;
end
handles.topview.current_apex(1:2) = {wire, apex};
% handles = update_topview(handles);
if ishandle(handles.topview.current_apex{3})
delete(handles.topview.current_apex{3});
if apex ~= 0
handles.topview.current_apex{3} = line(handles.config.(wire)(apex,1),...
handles.config.(wire)(apex,2),'MarkerSize',4, ...
'markeredgecolor','k','markerfacecolor','k','marker','o',...
'linewidth',0.5,'ButtonDownFcn',{@apex_ButtonDownFcn, wire});
end
end
case{'extend'} % Shift - left
case{'alt'} % Ctrl - left
case{'open'} % Double click
disp(['Electrode ' electrode ' Double click!']);
end
guidata(hObject, handles);
% --------------------------------------------------------------------
% --- Executes on mouse release.
function ButtonUpFcn(hObject, eventdata)
set(gcbf,'WindowButtonMotionFcn','');
set(gcbf,'WindowButtonUpFcn','');
handles = guidata(hObject);
set_axis_limmits(handles);
% --------------------------------------------------------------------
% --- Executes on mouse movement with button pressed on an interface.
function electrode_move_Callback(hObject, eventdata, electrode)
handles = guidata(hObject);
CurrentPoint = mean(get(gca,'CurrentPoint'));
CP = round(CurrentPoint(1:2).*10)./10;
set(handles.CP_x_edit, 'string', num2str(CP(1)));
set(handles.CP_y_edit, 'string', num2str(CP(2)));
handles.config.(electrode)(1:2) = CP;
handles = update_topview(handles);
handles.config.type = 'General Surface Array';
set(handles.Config_popup,'String', handles.config.type);
guidata(hObject,handles);
% --------------------------------------------------------------------
% --- function to update model plot.
function handles = update_topview(handles);
% Update electrode positions
set(handles.C1_x_edit,'string',num2str(handles.config.C1(1)));
set(handles.C1_y_edit,'string',num2str(handles.config.C1(2)));
set(handles.C1_z_edit,'string',num2str(handles.config.C1(3)));
set(handles.topview.C1,'xdata',handles.config.C1(1),...
'ydata',handles.config.C1(2));
set(handles.C2_x_edit,'string',num2str(handles.config.C2(1)));
set(handles.C2_y_edit,'string',num2str(handles.config.C2(2)));
set(handles.C2_z_edit,'string',num2str(handles.config.C2(3)));
set(handles.topview.C2,'xdata',handles.config.C2(1),...
'ydata',handles.config.C2(2));
set(handles.P1_x_edit,'string',num2str(handles.config.P1(1)));
set(handles.P1_y_edit,'string',num2str(handles.config.P1(2)));
set(handles.P1_z_edit,'string',num2str(handles.config.P1(3)));
set(handles.topview.P1,'xdata',handles.config.P1(1),...
'ydata',handles.config.P1(2));
set(handles.P2_x_edit,'string',num2str(handles.config.P2(1)));
set(handles.P2_y_edit,'string',num2str(handles.config.P2(2)));
set(handles.P2_z_edit,'string',num2str(handles.config.P2(3)));
set(handles.topview.P2,'xdata',handles.config.P2(1),...
'ydata',handles.config.P2(2));
% Update wires
pos1 = handles.config.C1(1:2);
wireunits = length(handles.topview.Cwire);
for k = 1:wireunits
if isfield(handles.config, 'Cwire') & k<=size(handles.config.Cwire,1)
pos2 = handles.config.Cwire(k,1:2);
else
pos2 = handles.config.C2(1:2);
end
set(handles.topview.Cwire(k),'xdata',[pos1(1) pos2(1)],...
'ydata',[pos1(2) pos2(2)]);
pos1 = pos2;
end
pos1 = handles.config.P1(1:2);
wireunits = length(handles.topview.Pwire);
for k = 1:wireunits
if isfield(handles.config, 'Pwire') & k<=size(handles.config.Pwire,1)
pos2 = handles.config.Pwire(k,1:2);
else
pos2 = handles.config.P2(1:2);
end
set(handles.topview.Pwire(k),'xdata',[pos1(1) pos2(1)],...
'ydata',[pos1(2) pos2(2)]);
pos1 = pos2;
end
h_list = get(handles.axes1,'children');
h_electr = [handles.topview.C1; handles.topview.C2; handles.topview.P1; handles.topview.P2];
h_list = [h_electr; setdiff(h_list, h_electr)];
set(handles.axes1,'children', h_list);
% --------------------------------------------------------------------
% --- function to adjust limmits on axis.
function set_axis_limmits(handles);
minlimmits = min([handles.config.C1;handles.config.C2;handles.config.P1;handles.config.P2],[],1);
maxlimmits = max([handles.config.C1;handles.config.C2;handles.config.P1;handles.config.P2],[],1);
if minlimmits(2)>-20 minlimmits(2) = -20/1.2; end;
if maxlimmits(2)<20 maxlimmits(2) = 20/1.2; end;
set(handles.axes1,'xlim',([minlimmits(1) maxlimmits(1)]+[-0.2 0.2]*diff([minlimmits(1) maxlimmits(1)])));
set(handles.axes1,'ylim',([minlimmits(2) maxlimmits(2)]*1.2));
% --------------------------------------------------------------------
% --- function to add apex to current wire segment.
function handles = add_apex(handles,pos2,wire);
if ~isempty(pos2)
handles.config.type = 'General Surface Array';
set(handles.Config_popup,'String', handles.config.type);
% if strcmp(handles.topview.current_apex{1},'Cwire')
apex = handles.topview.current_apex{2};
if isfield(handles.config,wire) & ~isempty(handles.config.(wire))
if apex == 0
pos1 = handles.config.([wire(1) '1'])(1,:);
handles.config.(wire)(2:end+1,:) = ...
handles.config.(wire)(1:end,:);
else
pos1 = handles.config.(wire)(apex,:);
end
% handles.config.(wire)(apex+1:end+1,:) = ...
% handles.config.(wire)(apex:end,:);
else
if strcmp(wire,'Cwire')
pos1 = handles.config.C1;
else
pos1 = handles.config.P1;
end
end
handles.topview.(wire)(apex+2:end+1,:) = ...
handles.topview.(wire)(apex+1:end,:);
handles.config.(wire)(apex+1,1:3) = [pos2 0];
handles.topview.(wire)(apex+1) = line([pos1(1) pos2(1)],...
[pos1(2) pos2(2)],'MarkerSize',6, ...
'markeredgecolor','k','markerfacecolor','b','marker','none',...
'linewidth',2,'color','k', 'ButtonDownFcn',{@apex_ButtonDownFcn, wire});
handles.topview.current_apex(1:2) = {wire, apex+1};
if ishandle(handles.topview.current_apex{3})
set(handles.topview.current_apex{3},'xdata',handles.config.(wire)(apex+1,1),...
'ydata',handles.config.(wire)(apex+1,2));
else
handles.topview.current_apex{3} = line(handles.config.(wire)(apex+1,1),...
handles.config.(wire)(apex+1,2),'MarkerSize',4, ...
'markeredgecolor','k','markerfacecolor','k','marker','o',...
'linewidth',0.5,'ButtonDownFcn',{@apex_ButtonDownFcn, wire});
end
handles = update_topview(handles);
else
end
% --- Executes when user attempts to close figure1.
function figure1_CloseRequestFcn(hObject, eventdata, handles)
% hObject handle to figure1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
if isequal(get(handles.figure1, 'waitstatus'), 'waiting')
% The GUI is still in UIWAIT, us UIRESUME
uiresume(handles.figure1);
else
% The GUI is no longer waiting, just close it
delete(handles.figure1);
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -