⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 topview.m

📁 matlab中常用电法各种装置的电磁正演计算
💻 M
📖 第 1 页 / 共 3 页
字号:
            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 + -