Matlab GUI 纯代码学习(本人刚学,非讲解,只是边学边写)

从一个现有的模型来理解GUI纯代码的实现过程

简介:一个三坐标纳米测量台的轨迹规划软件

  •  主程序 TrajectoryPlanner

开头

programPath = pwd;   
addpath(genpath([programPath filesep 'frontend']));   
addpath(genpath([programPath filesep 'backend']));  

%pwd:返回当前文件夹的路径

%addpath:向搜索路径中添加文件

% genpath:将文件夹及其子文件夹添加到搜索路径。

%filesep:文件分隔符 programPath/backend or programPath/frontend

%% Design
% Farben
color.figureBackground	= get(0,'defaultUicontrolBackgroundColor');
color.orange			= [255 121 0]/255; 
color.lightorange		= [255 188 127]/255;
color.lightlightorange	= [255 218 185]/255;
color.blue				= [0 51 89]/255;
color.lightblue			= [51 153 255]/255;
color.green				= [0 116 122]/255;
color.lightgreen		= [180 220 220]/255;
color.purple			= [128 0 255]/255;
color.tablecolor		= [255 255 255; 245 245 245]/255;
color.tablecolorError	= color.tablecolor.*[1 .8 .8; 1 .8 .8];

% color 更改后续封装图标绘制命令的绘图颜色

%  v=get(h,'default') 以结构体数组返回对象 h 上当前定义的所有默认值。字段名称为对象属性名称,字段值为对应的属性值。如果您不指定输出参数,MATLAB 会在屏幕上显示该信息。

% 问题:为什么要除以255,color.xxxxx是个什么定义方式,最后一条是什么意思?错误了就变色?

设置断点运行得到如下

 初始化模块 0

%% Initialisierungsbalken
initProgress = 0:1/4:1;     %一共4步
initStep = 1; 
hFigInit = waitbar(initProgress(initStep),'Initialize...','name','Initialize Program','color',color.figureBackground, 'visible', 'off');
makeWaitbarLookNicer(hFigInit, 'Initialize', 'right', color);

初始化小条 

% waitbar:创建或更新等待条对话框

% initProgress:进度条长度  

% initProgress(initStep) 这个很神奇 initStep为1的时候 waitbar如上 initStep设置为2时,是这样

仔细研究了一下,发现是这个道理

创建了一个矩阵,然后去选择这个矩阵中的值

% visible off or on :要使您的 App 更快地启动,请将不需要在启动时出现的所有组件的 Visible 属性设置为'off '。.

% makeWaitbarLookNicer:没有这个指令,没有waitbar 

建立主窗口 0.25

%% Hauptfenster erstellen
initStep = initStep+1;
waitbar(initProgress(initStep),hFigInit,'Create main window...');

resFigMain = [900 600];
hFigMain = figure('MenuBar','none',...      % 是否显示默认菜单
        'color',color.figureBackground,...  % 图窗颜色
        'NumberTitle','off',...             % 窗口名是否显示默认的 figure1 figure2等等  
        'position',[0 0 resFigMain(1) resFigMain(2)],...   % 左 下 宽 高
        'KeyPressFcn',@hotkeys,...          % 键盘回调
        'ResizeFcn',@resizeWindow,...       % 图窗是否可调整  
        'CloseRequestFcn',@closeProgram,... % 图窗关闭函数
        'visible','off');                

相关Function

1.@hotkeys:

    %% hotkeys
    function hotkeys(hObject,eventdata)
        % Tastenkombinationen   按键组合
		
        handles = guihandles(hFigMain);

        switch get(hObject,'tag')
			% Cut/Copy/Paste falls Cursor in der Liste 如果光标在列表上,剪切 拷贝 粘贴
            case 'itemlist'             % 也许是如果光标在列表上 
                if ~isempty(eventdata.Modifier)    % 判断是否有快捷键
                    switch eventdata.Modifier{1,1}
                        case 'control'             % 如果按下 ctrl
                            switch eventdata.Key   % 提取键名
                                case 'x'
                                    if strcmp(get(handles.cut,'enable'),'on')
                                        cutAndCopyItems(hMenuEditCut,eventdata,'cut');
                                    end
                                case 'c'
                                    if strcmp(get(handles.copy,'enable'),'on')
                                        cutAndCopyItems(hMenuEditCopy,eventdata,'copy');
                                    end
                                case 'v'
                                    if strcmp(get(handles.paste,'enable'),'on')
                                        insertItems(hMenuEditPaste,eventdata,'paste');
                                    end
                            end
                    end
				end
        end

        switch eventdata.Key  % 单键
            case 'delete'     % 是否为delete
                if strcmp(get(handles.delete,'enable'),'on')   
                 % 比较delete 按钮是否为on(非灰色) 是的话删除movement
                    deleteItems(hMenuEditDelete);
				end
        end
    end

1.1 cutAndCopyItems

    %% cutAndCopyItems
    function cutAndCopyItems(hObject,eventdata,choice)  % choice 上面继承下来的cut paste等
        % Elemente kopieren und ausschneiden 元素的粘贴与剪切
        
        movement = getappdata(hFigMain,'movement');   
        % 输入元素movement, 每增加一个line/pause/circle都会get到不同的结构体,见下图
        lastSelectedItems = getappdata(hFigMain,'lastSelectedItems');  
        % 每选择一个新的行,都会产生一个旧行的值,见下图
        actualError = getappdata(hFigMain,'actualError'); 
        % 见下图,没错为空
        % Abbruch, wenn das momentane Segment Fehler enthalt 如果这段值有问题,直接取消
        if ~isempty(actualError)
            set(hItemlist,'value',lastSelectedItems);
            errordlg(actualError,'Error','modal');  % 创建错误对话框
            updateProperty(hFigMain);
            return;
        end
        
        % markierte Elemente
        selectedItems = get(hItemlist,'value');
        
        % markierte Elemente in den Zwischenspeicher
        setappdata(hFigMain,'clipboard',movement(min(selectedItems):max(selectedItems)));

        % sollen Eintr鋑e ausgeschnitten werden?
        if strcmp(choice,'cut')        
            % ausgeschnittene Elemente loeschen 
            deleteItems(hObject);    
        end
          
        % Internes Update
        updateButtons(hFigMain);
    end

 

 

 

1.2 insertItems

%% insertItems
    function insertItems(hObject,eventdata,choice)
        % Neue Elemente einfuegen 添加新元素
        
        movement = getappdata(hFigMain,'movement'); 
        settings = getappdata(hFigMain,'settings');
        lastSelectedItems = getappdata(hFigMain,'lastSelectedItems');
        clipboard = getappdata(hFigMain,'clipboard');
        actualError = getappdata(hFigMain,'actualError');
        
        % Abbruch, wenn das momentane Segment Fehler enthalt 如果当时的路径有问题,则取消
        if ~isempty(actualError)
            set(hItemlist,'value',lastSelectedItems);
            errordlg(actualError,'Error','modal');
            updateProperty(hFigMain);
            return;
        end
        
        % altes Movement
        oldMovement = movement; % 我加一段之后,他就是上面的所有的movement的总和

        % markierte Elemente
        selectedItems = get(hItemlist,'value'); 
        % 按下insert movement之后,就是上面的那行的行数
        oldSelectedItems = selectedItems;
        
        % Liste leer    
        if isempty(movement)
            insertAt = 1;
        % kein Element markiert
        elseif isempty(selectedItems)
            % neue Segmente an Anfang einfuegen 
            insertAt = 1;
            
            % gesamtes Movement speichern
            remainItems = movement;

            % Movement loechen
            movement(1:end) = [];
            
        % letztes markiertes Element
        else        
            % Anzahl der Listeneintraege
            listLength = length(movement);
            % letztes angeklicktes Element
            insertAt = max(selectedItems)+1;
            
            % es gibt nachfolgende Segmente
            if insertAt <= length(movement)
                % restliche Listeneintrage speichern
                remainItems = movement(insertAt:listLength);

                % restliche Listeneintrage loechen
                movement(insertAt:listLength) = [];
            end
        end

        % neues Element einfuegen
        switch choice
            case 'new'
                actionName = ['insert ' get(hObject,'tag')];

                % Anzahl der einzufuegenden Elemente
                numberOfInsertedItems = 1;

                % Segment aufbauen
                % Typ
                movement(insertAt).segmentType = get(hObject,'tag');
                % Modus
                movement(insertAt).mode = 'transfer';
                switch get(hObject,'tag')
                    case 'pause'
                        % Messabschnitt aufteilen
                        movement(insertAt).splitMeasure = [];
                        movement(insertAt).translation = struct(...
                            'position',[0;0;0],...
                            'pauseValue',settings.calculation.minPause);
                        movement(insertAt).rotation = [0;0;0];

                    otherwise % Linie/Kreis
                        % Messabschnitt aufteilen
                        movement(insertAt).splitMeasure = [0.1;0.1];
                        
                        % Unterteilung der Translation f黵 Linie und Kreis
                        switch get(hObject,'tag')
                            case 'line'
                                % versuchen als Tangente zum
                                % Vorg鋘gersegment zu setzen
                                if (insertAt > 1) && ~strcmp(movement(insertAt-1).segmentType,'pause')
                                    tangent = getTangentFromSegment(movement(insertAt-1),'end');
                                else
                                    tangent = [1;0;0];
                                end
                                % Tangente der momentanen Einheit anpassen
                                tangent = getConvertedDistance(tangent,settings.general.unitTranslation,'m');
                                
                                movement(insertAt).translation = struct(...
                                    'startposition',[0;0;0],...
                                    'endposition',tangent,...
                                    'keepStartvelocity',0,...
                                    'startvelocity',[0;0;0],...
                                    'keepEndvelocity',0,...
                                    'endvelocity',[0;0;0]);

                            case 'circle'
                                % versuchen als Tangente zum
                                % Vorg鋘gersegment zu setzen
                                if (insertAt > 1) && ~strcmp(movement(insertAt-1).segmentType,'pause')
                                    epsilonPosition = settings.general.epsilonPosition;
                                    tangent = getTangentFromSegment(movement(insertAt-1),'end');
                                    % Kreismittelpunkt aus Normalenvektor
                                    circlecenter = cross(tangent,[0;0;1]);
                                    if norm(circlecenter) < epsilonPosition
                                        circlecenter = cross(tangent,[0;1;0]);
                                        if norm(circlecenter) < epsilonPosition
                                            circlecenter = cross(tangent,[1;0;0]);
                                        end
                                    end
                                    % Rotationsachse
                                    rotaxis = cross(tangent,circlecenter);
                                else
                                    circlecenter = [1;0;0];
                                    rotaxis = [0;0;1];                                    
                                end
                                % Kreismittelpunkt der momentanen Einheit anpassen
                                circlecenter = getConvertedDistance(circlecenter,settings.general.unitTranslation,'m');
                                
                                movement(insertAt).translation = struct(...
                                    'startposition',[0;0;0],...
                                    'circlecenter',circlecenter,...
                                    'rotaxis',rotaxis,...
                                    'rotangle',pi,...
                                    'keepStartvelocity',0,...
                                    'startvelocity',[0;0;0],...
                                    'keepEndvelocity',0,...
                                    'endvelocity',[0;0;0]);
                        end
                        % Rotation
                        condition1Struct = struct('auxVector',[1;0;0],'targetSystem','local','targetVector',[1;0;0]);
                        condition2Struct = struct('auxVector',[0;0;1],'targetSystem','local','targetVector',[0;0;1]);
                        orientationStruct = struct('yaw',[0 0; 1 0],'pitch',[0 0; 1 0],'roll',[0 0; 1 0]);
                        movement(insertAt).rotation = struct(...
                            'transfer1',struct('condition1',condition1Struct,'condition2',condition2Struct,'bounds',{ones(3,2)*inf}),...
                            'measure',struct('condition1',condition1Struct,'condition2',condition2Struct,'orientation',orientationStruct),...
                            'transfer2',struct('condition1',condition1Struct,'condition2',condition2Struct,'bounds',{ones(3,2)*inf}));
                end
            % Paste - Elemente aus Zwischenspeicher einf黦en
            otherwise
                actionName = 'paste';

                % Anzahl der einzuf黦enden Elemente
                numberOfInsertedItems = length(clipboard);

                % Zwischenspeicher einf黦en
                movement(insertAt:insertAt+numberOfInsertedItems-1) = clipboard;
        end

        % restliche Eintr鋑e wieder anf黦en
        if exist('remainItems','var')
            movement(insertAt+numberOfInsertedItems:insertAt+numberOfInsertedItems+length(remainItems)-1) = remainItems;
        end
        
        % Daten speichern
        setappdata(hFigMain,'movement',movement);

        % Segmentuebergaenge anpassen
        % alle Positionen anpassen ab dem 1. eingef黦ten Segment
        connectSegmentTransitions('position',insertAt-1:length(movement));
        
        % Pruefung, auf Einhaltung der Positionsrestriktionen
        movement = getappdata(hFigMain,'movement');
        try
            for i = insertAt:length(movement)
                checkSegmentConsistency(hFigMain,movement,settings,i,'endposition');
            end
        catch ME
            errordlg(ME.message,'Error','modal');
            setappdata(hFigMain,'movement',oldMovement);
            return;
        end
        
        % Orientierungen der Transferteile zu Gruppen f黦en und
        % Geschwindigkeiten anpassen
        switch actionName
            case 'paste'
                % Orientierungen in alle Vorg鋘ger schreiben
                % Geschwindigkeiten in direkten Vorg鋘ger schreiben
                warningString1 = connectSegmentTransitions(...
                    'rotation',insertAt:-1:1,...
                    'velocity',insertAt:-1:insertAt-1,...
                    'zerovelocities',insertAt:-1:insertAt-1);
                % Orientierungen in alle Nachfolger schreiben
                % Geschwindigkeiten in direkten Nachfolger schreiben
                warningString2 = connectSegmentTransitions(...
                    'rotation',insertAt+numberOfInsertedItems-1:length(movement),...
                    'velocity',insertAt+numberOfInsertedItems-1:insertAt+numberOfInsertedItems,...
                    'zerovelocities',insertAt+numberOfInsertedItems-1:insertAt+numberOfInsertedItems);
            otherwise
                % Orientierungen vom direkten Vorg鋘ger holen
                % Geschwindigkeiten vom direkten Vorg鋘ger holen
                warningString1 = connectSegmentTransitions(...
                    'rotation',insertAt-1:insertAt,...
                    'velocity',insertAt-1:insertAt,...
                    'zerovelocities',insertAt-1:insertAt);
                % Orientierungen vom direkten Nachfolger holen
                % Geschwindigkeiten vom direkten Nachfolger holen
                warningString2 = connectSegmentTransitions(...
                    'rotation',insertAt+1:-1:insertAt,...
                    'velocity',insertAt+1:-1:insertAt,...
                    'zerovelocities',insertAt+1:-1:insertAt);
        end
        % Warnungen anzeigen
        if ~isempty(warningString1) || ~isempty(warningString2)
            warnDialog([warningString1;warningString2]);
        end
        
        % verbundenes Movement erneut laden
        movement = getappdata(hFigMain,'movement');
        % neues Movement
        newMovement = movement;
        
        % Liste aktualisieren
        set(hItemlist,'string',{movement.segmentType});

        % eingefuegte Elemente markieren
        set(hItemlist,'value',insertAt:insertAt+numberOfInsertedItems-1);
        newSelectedItems = get(hItemlist,'value');
        
        % altes und neues Movement fuer Undo/Redo zugaenglich machen
        prepareUndoRedo(hFigMain,actionName,oldMovement,newMovement,oldSelectedItems,newSelectedItems);         
        
        % Internes Update
        internalUpdate(hFigMain);
    end

1.3 deleteItems

%% deleteItems
    function deleteItems(hObject,eventdata)
        % Elemente loechen
        
        % Daten laden
        movement = getappdata(hFigMain,'movement');
        
        % altes Movement
        oldMovement = movement;

        % markierte Elemente
        selectedItems = get(hItemlist,'value');
        oldSelectedItems = selectedItems;

        % Anzahl der Listeneintraege
        listLength = length(movement);

        % markierte Segmente aus Movement entfernen
        remainItems = setdiff(1:listLength,selectedItems);        
        movement = movement(remainItems);
        
        % Daten speichern
        setappdata(hFigMain,'movement',movement);
		
        % Uebergaenge der restlichen Segmente herausfinden
        remainTransitions = [];
        transition = 1;
		
        for i = 1:length(remainItems)
            if (i ~= length(remainItems)) && (remainItems(i+1) ~= remainItems(i)+1)
                startTransition = i;
                endTransition = i+1;
                remainTransitions(transition,:) = [startTransition,endTransition];
                transition = transition+1;
            end
        end
        
        % Transferangaben an jedem 躡ergang auf Gleichheit pr黤en
        % und evtl. Auswahldialog einblenden
        deletedOffset = 0;
        for i = 1:size(remainTransitions,1)
            % 1. 躡ergangssegment
            segment1Nr = remainTransitions(i,1)-deletedOffset;
            % Anzahl der gel鰏chten Segmente zwischen dem neuen 躡ergang
            deletedNr = remainTransitions(i,2)-remainTransitions(i,1) - 1;
            % Offset erh鰄en
            deletedOffset = deletedOffset + deletedNr;
            % 2. 躡ergangssegment
            segment2Nr = remainTransitions(i,2)-deletedOffset;
            
            % bei mehreren benachbarten Pausen die Ausrichtung der 1. Pause
            % in alle weiteren Pausen 黚ernehmen
            if strcmp(movement(segment1Nr).segmentType,'pause') && strcmp(movement(segment2Nr).segmentType,'pause')
                % alle Vorg鋘ger
                connectSegmentTransitions('rotation',segment1Nr:-1:1);
                % alle Nachfolger
                connectSegmentTransitions('rotation',segment1Nr:length(movement));
            % 躡erg鋘ge von Nicht-Pause-Segmenten
            else
                transferEnd = movement(segment1Nr).rotation.transfer2;
                transferStart = movement(segment2Nr).rotation.transfer1;
                % Dialog einblenden, wenn Unterschiede bestehen
                if ~isequal(transferEnd.condition1.auxVector,transferStart.condition1.auxVector) ||...
                        ~isequal(transferEnd.condition1.targetSystem,transferStart.condition1.targetSystem) ||...
                        ~isequal(transferEnd.condition1.targetVector,transferStart.condition1.targetVector) ||...
                        ~isequal(transferEnd.condition2.auxVector,transferStart.condition2.auxVector) ||...
                        ~isequal(transferEnd.condition2.targetSystem,transferStart.condition2.targetSystem) ||...
                        ~isequal(transferEnd.condition2.targetVector,transferStart.condition2.targetVector) ||...
                        ~isequal(transferEnd.bounds,transferStart.bounds)
                    % Wahl der Transfergruppe
                    transferNr = chooseTransferGroupWindow(hFigMain,...
                        segment1Nr,transferEnd,...
                        segment2Nr,transferStart);                
                    % Abbruch
                    if isequal(transferNr,0)
                        % altes Movement wiederherstellen
                        setappdata(hFigMain,'movement',oldMovement);
                        % abbrechen
                        return;
                    end
                    % gew鋒lte Gruppe
                    switch transferNr
                        % alle Nachfolger anpassen
                        case 1
                            connectSegmentTransitions('rotation',segment1Nr:length(movement));
                        % alle Vorg鋘ger anpassen    
                        case 2
                            connectSegmentTransitions('rotation',segment2Nr:-1:1);
                    end
                end
            end
        end
        
        % alle Elemente ab ersten zu l鰏chenden Element anpassen
        warningString = connectSegmentTransitions(...
            'position',min(selectedItems)-1:length(remainItems),...
            'velocity',min(selectedItems)-1:length(remainItems),...
            'zerovelocities',min(selectedItems)-1:length(remainItems));
        % Warnungen anzeigen
        if ~isempty(warningString)
            warnDialog(warningString);
        end
        
        % ge鋘dertes Movement erneut laden
        movement = getappdata(hFigMain,'movement');
       
        % kein Element markieren, falls alles gel鰏cht wurde
        if listLength == length(selectedItems)
            set(hItemlist,'value',[]);
            % neues letztes Element markieren, falls letztes Element gel鰏cht wurde
        elseif max(selectedItems) == listLength        
            set(hItemlist,'value',length(movement));
            % Element markieren, dass nach dem letzten gel鰏chten Element steht
        else
            set(hItemlist,'value',max(selectedItems)-length(selectedItems)+1);
        end
        newSelectedItems = get(hItemlist,'value');
        
        % Liste aktualisieren
        set(hItemlist,'string',{movement.segmentType});
        
        % neues Movement
        newMovement = movement;
        
        % altes und neues Movement fuer Undo/Redo zugaenglich machen
        prepareUndoRedo(hFigMain,get(hObject,'tag'),oldMovement,newMovement,oldSelectedItems,newSelectedItems);
        
        % Internes Update
        internalUpdate(hFigMain);    
    end

2.@resizeWindow:

3.@closeProgram:

装饰框

% Schmuckleiste
addOrnamentToFigure(hFigMain, .2, 'Trajectory Planner', 'right', color.figureBackground);

% addOrnamentToFigure  添加背景框里的这个文字,但是怎么搞得跟艺术字一样,而且还有波浪就不知道了

建立各种菜单

% Top-Level-Menue erstellen
hMenuFile     = uimenu(hFigMain,'label','&File');
hMenuEdit     = uimenu(hFigMain,'label','&Edit');
hMenuOptions  = uimenu(hFigMain,'label','&Options');
hMenuView     = uimenu(hFigMain,'label','&View');
hMenuInfo     = uimenu(hFigMain,'label','&Info');

% m = uimenu(parent,Name,Value) 指定父容器和一个或多个属性值。

但是示例中用的不是label 是Text 那么label和Text有什么区别呢,我俩都改了试了但是没差别

具体见MATLAB帮助示例

子菜单

% Sub-Menues erstellen
hMenuFileNew     = uimenu(hMenuFile,'label','&New','tag','new','accelerator','N','callback',@newMovement);
hMenuFileOpen    = uimenu(hMenuFile,'label','&Open...','tag','open','accelerator','O','callback',@openMovement);
hMenuFileSave    = uimenu(hMenuFile,'label','&Save','tag','save','separator','on','accelerator','S','callback',@saveMovement);
hMenuFileSaveas  = uimenu(hMenuFile,'label','Save &As...','tag','saveas','callback',@saveMovement);
hMenuFileClose   = uimenu(hMenuFile,'label','&Close...','separator','on','accelerator','Q','callback',@closeProgram);

hMenuEditUndo       = uimenu(hMenuEdit,'label','&Undo','tag','undo','accelerator','Z','callback',@undoRedo);
hMenuEditRedo       = uimenu(hMenuEdit,'label','&Redo','tag','redo','accelerator','Y','callback',@undoRedo);
hMenuEditCut        = uimenu(hMenuEdit,'label','Cu&t','tag','cut','separator','on','accelerator','X','callback',{@cutAndCopyItems,'cut'});
hMenuEditCopy       = uimenu(hMenuEdit,'label','&Copy','tag','copy','accelerator','C','callback',{@cutAndCopyItems,'copy'});
hMenuEditPaste      = uimenu(hMenuEdit,'label','&Paste','tag','paste','accelerator','V','callback',{@insertItems,'paste'});
hMenuEditSelectAll  = uimenu(hMenuEdit,'label','&Select All','tag','selectAll','separator','on','accelerator','A','callback',@selectItemsInList);
hMenuEditDelete     = uimenu(hMenuEdit,'label','&Delete','tag','delete','callback',@deleteItems);

hMenuOptionsInsert = uimenu(hMenuOptions,'label','&Insert');
hMenuOptionsInsertPause		= uimenu(hMenuOptionsInsert,'label','&Pause','tag','pause','callback',{@insertItems,'new'});
hMenuOptionsInsertLine		= uimenu(hMenuOptionsInsert,'label','&Line','tag','line','callback',{@insertItems,'new'});
hMenuOptionsInsertCircle	= uimenu(hMenuOptionsInsert,'label','&Circle','tag','circle','callback',{@insertItems,'new'});
hMenuOptionsTransform		= uimenu(hMenuOptions,'label','&Transform Trajectory...','tag','transform','callback',@showTransform);
hMenuOptionsCalculate		= uimenu(hMenuOptions,'label','&Calculate...','tag','calc','separator','on','callback',@showCalculation);
hMenuOptionsUploadToDevice	= uimenu(hMenuOptions,'label','&Upload To Device...','tag','uploadToDevice','callback',@showUploadToDevice);
hMenuOptionsSettings		= uimenu(hMenuOptions,'label','&Settings...','separator','on','callback',@showSettings);

hMenuViewSelect  = uimenu(hMenuView,'label','&Select','tag','select','callback',@handleViewTools);
hMenuViewZoomin  = uimenu(hMenuView,'label','&Zoom In','tag','zoomin','callback',@handleViewTools);
hMenuViewZoomout = uimenu(hMenuView,'label','Zoom &Out','tag','zoomout','callback',@handleViewTools);
hMenuViewPan     = uimenu(hMenuView,'label','&Pan','tag','pan','callback',@handleViewTools);
hMenuViewRotate  = uimenu(hMenuView,'label','&Rotate 3D','tag','rotate','callback',@handleViewTools);
hMenuViewCursor  = uimenu(hMenuView,'label','&Data Cursor','tag','cursor','callback',@handleViewTools);
hMenuViewGrid    = uimenu(hMenuView,'label','&Grid','tag','grid','separator','on','callback',@handleViewTools);
hMenuViewAxis    = uimenu(hMenuView,'label','&Axis Equal','tag','axis','callback',@handleViewTools);
hMenuViewProj    = uimenu(hMenuView,'label','&Perspective Projection','tag','projection','callback',@handleViewTools);
hMenuViewShowPlotOriginal = uimenu(hMenuView,'label','&1 Original Movement','tag','movementOriginal','checked','on','separator','on','accelerator','1','callback',@showPlot);
hMenuViewShowPlotPlanned  = uimenu(hMenuView,'label','&2 Planned Movement','tag','movementPlanned','accelerator','2','callback',@showPlot);

hMenuInfoAbout   = uimenu(hMenuInfo,'label','&About','callback',{@aboutWindow, hFigMain});

% tag:不知道是啥东西     'accelerator','N' 快捷键,cyrl+N

详细写法是:变量名.Accelerator = ' 快捷键 ';

'separator','on/off' 是在菜单内容之间加线条 

'call back' 为回调函数 引用后面@里的Function

创建上面一行小图标

% Toolbar erstellen
hToolbar = uitoolbar(hFigMain);
hToolbarNew     = uipushtool(hToolbar,'cdata',loadIcon('file_new',1),'tag','new','tooltipstring','New movement','clickedcallback',@newMovement);
hToolbarOpen    = uipushtool(hToolbar,'cdata',loadIcon('Open_16',1),'tag','open','tooltipstring','Open movement','clickedcallback',@openMovement);
hToolbarSave    = uipushtool(hToolbar,'cdata',loadIcon('Save_16',1),'tag','save','tooltipstring','Save movement','clickedcallback',@saveMovement);
hToolbarCut     = uipushtool(hToolbar,'cdata',loadIcon('Cut_16',1),'tag','cut','tooltipstring','Cut','separator','on','clickedcallback',{@cutAndCopyItems,'cut'});
hToolbarCopy    = uipushtool(hToolbar,'cdata',loadIcon('Copy_16',1),'tag','copy','tooltipstring','Copy','clickedcallback',{@cutAndCopyItems,'copy'});
hToolbarPaste   = uipushtool(hToolbar,'cdata',loadIcon('Paste_16',1),'tag','paste','tooltipstring','Paste','clickedcallback',{@insertItems,'paste'});
hToolbarDelete  = uipushtool(hToolbar,'cdata',loadIcon('delete',1),'tag','delete','tooltipstring','Delete','clickedcallback',@deleteItems);
hToolbarUndo    = uipushtool(hToolbar,'cdata',loadIcon('Undo_16',1),'tag','undo','tooltipstring','Undo','clickedcallback',@undoRedo); 
hToolbarRedo    = uipushtool(hToolbar,'cdata',loadIcon('Redo_16',1),'tag','redo','tooltipstring','Redo','clickedcallback',@undoRedo);
hToolbarSelect  = uitoggletool(hToolbar,'cdata',loadIcon('tool_pointer',1),'tag','select','tooltipstring','Select','separator','on','clickedcallback',@handleViewTools);
hToolbarZoomin  = uitoggletool(hToolbar,'cdata',loadIcon('Zoom_In_16',1),'tag','zoomin','tooltipstring','Zoom In','clickedcallback',@handleViewTools);
hToolbarZoomout = uitoggletool(hToolbar,'cdata',loadIcon('Zoom_Out_16',1),'tag','zoomout','tooltipstring','Zoom Out','clickedcallback',@handleViewTools);
hToolbarPan     = uitoggletool(hToolbar,'cdata',loadIcon('Pan_16',1),'tag','pan','tooltipstring','Pan','clickedcallback',@handleViewTools);
hToolbarRotate  = uitoggletool(hToolbar,'cdata',loadIcon('tool_rotate_3d',1),'tag','rotate','tooltipstring','Rotate 3D','clickedcallback',@handleViewTools);
hToolbarCursor  = uitoggletool(hToolbar,'cdata',loadIcon('tool_data_cursor',1),'tag','cursor','tooltipstring','Data Cursor','clickedcallback',@handleViewTools);
hToolbarGrid    = uitoggletool(hToolbar,'cdata',loadIcon('grid',1),'tag','grid','tooltipstring','Grid','separator','on','clickedcallback',@handleViewTools);
hToolbarAxis    = uitoggletool(hToolbar,'cdata',loadIcon('axis_equal',1),'tag','axis','tooltipstring','Axis Equal','clickedcallback',@handleViewTools);
hToolbarProj    = uitoggletool(hToolbar,'cdata',loadIcon('View',1),'tag','projection','tooltipstring','Perspective Projection','clickedcallback',@handleViewTools);
hToolbarCalc    = uipushtool(hToolbar,'cdata',loadIcon('Run_16',1),'tag','calc','tooltipstring','Calculate Movement','separator','on','clickedcallback',@showCalculation);
hToolbarUpload  = uipushtool(hToolbar,'cdata',loadIcon('drive-upload',1),'tag','uploadToDevice','tooltipstring','Upload to device','clickedcallback',@showUploadToDevice);

 % ui拖把:在图窗中创建工具栏

% uipushtool:在工具栏中创建按钮工具

% uitoggletool:在工具栏中创建切换工具

% cdata:感觉跟上面那个label差不多的样子

% loadIcon:加载按钮图标,后面那个数字不知道是什么,改了也没差别

主界面上的各种按钮表格等

% Plot-Fenster erstellen
hTrajectoryPlot = axes('tag','plot','units','normalized','outerposition',[.24 .1 .76 .9]);
line([],[],[]);
view(-35,45);

帮助中心

% line(x,y,z):在三维坐标中绘制线条。

% view(az,el) 为当前坐标区设置相机视线的方位角和仰角。(调整这个三坐标轴的方向)

% Neue-Segmente-Buttons erstellen
hInsertPanel  = uipanel('title','Insert','foregroundcolor',color.lightblue,'units','pixels');
% Bilder laden
iconCData = load('buttonIconCData','-mat');
iconCData.pauseCData = imresize(iconCData.pauseCData,[48 48]);
iconCData.lineCData = imresize(iconCData.lineCData,[48 48]);
iconCData.circleCData = imresize(iconCData.circleCData,[48 48]);
iconCData.pauseCData(iconCData.pauseCData < 0) = 0;
iconCData.pauseCData(iconCData.pauseCData > 1) = 1;
iconCData.lineCData(iconCData.lineCData < 0) = 0;
iconCData.lineCData(iconCData.lineCData > 1) = 1;
iconCData.circleCData(iconCData.circleCData < 0) = 0;
iconCData.circleCData(iconCData.circleCData > 1) = 1;
hInsertPause  = uicontrol(hInsertPanel,'style','pushbutton','tag','pause','tooltipstring','Pause','units','pixels','position',[5 105 60 50],'CData',iconCData.pauseCData,'callback',{@insertItems,'new'});
hInsertLine   = uicontrol(hInsertPanel,'style','pushbutton','tag','line','tooltipstring','Line','units','pixels','position',[5 55 60 50],'CData',iconCData.lineCData,'callback',{@insertItems,'new'});
hInsertCircle = uicontrol(hInsertPanel,'style','pushbutton','tag','circle','tooltipstring','Circle','units','pixels','position',[5 5 60 50],'CData',iconCData.circleCData,'callback',{@insertItems,'new'});

% uipanel:创建一个面板容器

% imresize:调整图像大小 48行 48列

% 这个小于0大于1等于0还是1的不知道怎么查,但是大概是确认点击位置之类的

% uicontrol:创建用户界面控件,就是让它能按下去,并且能使用回调函数

% Elementliste erstellen
hItemlistContextmenu = uicontextmenu;
hItemlistContextmenuInsert = uimenu(hItemlistContextmenu,'label','Insert');
hItemlistContextmenuInsertPause = uimenu(hItemlistContextmenuInsert,'label','Pause','tag','pause','callback',{@insertItems,'new'});
hItemlistContextmenuInsertLine = uimenu(hItemlistContextmenuInsert,'label','Line','tag','line','callback',{@insertItems,'new'});
hItemlistContextmenuInsertCircle = uimenu(hItemlistContextmenuInsert,'label','Circle','tag','circle','callback',{@insertItems,'new'});
hItemlistContextmenuCut      = uimenu(hItemlistContextmenu,'label','Cut','tag','cut','separator','on','accelerator','X','callback',{@cutAndCopyItems,'cut'});
hItemlistContextmenuCopy     = uimenu(hItemlistContextmenu,'label','Copy','tag','copy','callback',{@cutAndCopyItems,'copy'});
hItemlistContextmenuPaste    = uimenu(hItemlistContextmenu,'label','Paste','tag','paste','callback',{@insertItems,'paste'});
hItemlistContextmenuSelectAll = uimenu(hItemlistContextmenu,'label','Select All','tag','selectAll','separator','on','callback',@selectItemsInList);
hItemlistContextmenuDelete   = uimenu(hItemlistContextmenu,'label','Delete','tag','delete','callback',@deleteItems);
hItemlist = uicontrol(hFigMain,'style','listbox','max',2,'value',[],'uicontextmenu',hItemlistContextmenu,'tag','itemlist','backgroundcolor','white','units','pixels','KeyPressFcn',@hotkeys,'callback',@selectItemsInList);

% 这段没看懂在干啥,把中间的%了也没看出什么差别

% Eigenschaftenfenster erstellen
% Panel
hPropertyPanel  = uipanel('tag','propertyPanel','foregroundcolor',color.lightblue,'units','normalized','position',[0 0 .37 .68]);
% TabGroup fuer Modus, Translation und Rotation
hPropertyPanelTabGroup = uibuttongroup(hPropertyPanel,'bordertype','none','units','normalized','position',[0 .9 1 .1],'SelectionChangeFcn','updateProperty(gcbf)');
hPropertyPanelModeButton = uicontrol(hPropertyPanelTabGroup,'style','togglebutton','tag','modeButton','string','Mode','units','normalized','position',[0 0 1/3 1]);
hPropertyPanelTranslationButton = uicontrol(hPropertyPanelTabGroup,'style','togglebutton','tag','translationButton','string','Translation','units','normalized','position',[1/3 0 1/3 1]);
hPropertyPanelRotationButton = uicontrol(hPropertyPanelTabGroup,'style','togglebutton','tag','rotationButton','string','Rotation','units','normalized','position',[2/3 0 1/3 1]);
hPropertyPanelContentPanel = uipanel(hPropertyPanel,'tag','propertyPanelContentPanel','bordertype','none','units','normalized','position',[0 0 1 .9]);
% Button zum Ein-/Ausblenden des Eigenschaftenfensters
hPropertyButton = uicontrol('style','pushbutton','tag','propertyButton','string','-','foregroundcolor',[.5 .5 .5],'FontWeight','normal','FontSize',10,'UserData',1,'callback',@showAndHideProperty);

% Modus
hModePanelSelect = uibuttongroup(hPropertyPanelContentPanel,'title','Mode select','tag','mode','foregroundcolor',color.lightblue,'units','normalized','position',[0 .5 1 .5],'SelectionChangeFcn',@storeData);
hModePanelText   = uicontrol(hModePanelSelect,'style','text','string',{'Transfer: section with variable velocity';'Measure: section with constant velocity'},'horizontalAlignment','left','units','normalized','position',[.02 .75 .96 .2]);
hModeTransfer    = uicontrol(hModePanelSelect,'style','radiobutton','tag','modeTransfer','string','Transfer','units','normalized','position',[.12 .6 .86 .15]);
hModeMeasure     = uicontrol(hModePanelSelect,'style','radiobutton','tag','modeMeasure','string','Transfer-Measure-Transfer','units','normalized','position',[.12 .45 .86 .15]);
hSplitMeasureText = uicontrol(hModePanelSelect,'style','text','tag','splitMeasureText','string','Sets both transfer sections in %.','horizontalAlignment','left','units','normalized','position',[.32 .35 .66 .1]);
hSplitMeasure     = uitable(hModePanelSelect,'tag','splitMeasure','units','normalized','rowname',{'1st transfer' '2nd transfer'},'position',[.32 .02 .6 .32],'celleditcallback',@storeData);

% Translation
% Position
% Pause
hPausePanelPosition = uipanel(hPropertyPanelContentPanel,'tag','pausePanelPosition','foregroundcolor',color.lightblue,'title','Position','units','normalized','position',[0 2/3 1 1/3]);
hPausePositionText = uicontrol(hPausePanelPosition,'style','text','tag','pausePositionText','horizontalAlignment','left','units','normalized','position',[.01 .8 .98 .18]);
hPausePosition     = uitable(hPausePanelPosition,'tag','startposition','units','normalized','rowname',{'x' 'y' 'z'},'position',[.01 .02 .32 .78],'celleditcallback',@storeData);
hPausePanelValue = uipanel(hPropertyPanelContentPanel,'tag','pausePanelValue','foregroundcolor',color.lightblue,'title','Holding Time','units','normalized','position',[0 1/3 1 1/3]);
hPauseValueText = uicontrol(hPausePanelValue,'style','text','horizontalAlignment','left','String','Sets the holding time in s','units','normalized','position',[.01 .8 .98 .18]);
hPauseValue     = uicontrol(hPausePanelValue,'style','edit','tag','pauseValue','backgroundcolor','white','units','normalized','position',[.01 .44 .32 .36],'callback',@storeData);
% Linie
hLinePanelPosition = uipanel(hPropertyPanelContentPanel,'tag','linePanelPosition','foregroundcolor',color.lightblue,'title','Position','units','normalized','position',[0 2/3 1 1/3]);
hLinePositionText = uicontrol(hLinePanelPosition,'style','text','tag','linePositionText','horizontalAlignment','left','units','normalized','position',[.01 .8 .98 .18]);
hLineStartpositionText = uicontrol(hLinePanelPosition,'style','text','string','Startposition','units','normalized','position',[.01 .62 .32 .18]);
hLineRelativepositionText = uicontrol(hLinePanelPosition,'style','text','string','Relative','units','normalized','position',[.34 .62 .32 .18]);
hLineEndpositionText      = uicontrol(hLinePanelPosition,'style','text','string','Endposition','units','normalized','position',[.67 .62 .32 .18]);
hLineStartposition        = uitable(hLinePanelPosition,'tag','startposition','units','normalized','rowname',{'x' 'y' 'z'},'position',[.01 .02 .32 .6],'celleditcallback',@storeData);
hLineRelativeposition     = uitable(hLinePanelPosition,'tag','relativeposition','units','normalized','rowname',{'x' 'y' 'z'},'position',[.34 .02 .32 .6],'celleditcallback',@storeData);
hLineEndposition          = uitable(hLinePanelPosition,'tag','endposition','units','normalized','rowname',{'x' 'y' 'z'},'position',[.67 .02 .32 .6],'celleditcallback',@storeData);
% Kreis
hCirclePanelPosition = uipanel(hPropertyPanelContentPanel,'tag','circlePanelPosition','foregroundcolor',color.lightblue,'title','Position','units','normalized','position',[0 1/3 1 2/3]);
hCirclePositionText = uicontrol(hCirclePanelPosition,'style','text','tag','circlePositionText','horizontalAlignment','left','units','normalized','position',[.01 .9 .98 .08]);
hCircleStartpositionText    = uicontrol(hCirclePanelPosition,'style','text','string','Startposition','units','normalized','position',[.01 .8 .32 .08]);
hCircleRelativepositionText = uicontrol(hCirclePanelPosition,'style','text','string','Relative','units','normalized','position',[.34 .8 .32 .08]);
hCircleCirclecenterText  = uicontrol(hCirclePanelPosition,'style','text','tag','circlecenterText','units','normalized','position',[.67 .8 .32 .08]);
hCircleStartposition     = uitable(hCirclePanelPosition,'tag','startposition','units','normalized','rowname',{'x' 'y' 'z'},'position',[.01 .5 .32 .3],'celleditcallback',@storeData);
hCircleRelativeposition  = uitable(hCirclePanelPosition,'tag','relativeposition','units','normalized','rowname',{'x' 'y' 'z'},'position',[.34 .5 .32 .3],'celleditcallback',@storeData);
hCircleCirclecenter      = uitable(hCirclePanelPosition,'tag','circlecenter','units','normalized','rowname',{'x' 'y' 'z'},'position',[.67 .5 .32 .3],'celleditcallback',@storeData);
hCircleRotaxisText       = uicontrol(hCirclePanelPosition,'style','text','string','Rotation axis','units','normalized','position',[.34 .4 .32 .08]);
hCircleRotangleText      = uicontrol(hCirclePanelPosition,'style','text','tag','rotangleText','units','normalized','position',[.67 .4 .32 .08]);
hCircleRotaxis           = uitable(hCirclePanelPosition,'tag','rotaxis','units','normalized','rowname',{'x' 'y' 'z'},'position',[.34 .1 .32 .3],'celleditcallback',@storeData);
hCircleRotangle          = uicontrol(hCirclePanelPosition,'style','edit','tag','rotangle','backgroundcolor','white','units','normalized','position',[.67 .3 .32 .1],'callback',@storeData);

% Velocity
hPanelVelocity = uipanel(hPropertyPanelContentPanel,'tag','panelVelocity','foregroundcolor',color.lightblue,'title','Velocity','units','normalized','position',[0 1/3 1 1/3]);
hVelocityText = uicontrol(hPanelVelocity,'style','text','tag','velocityText','horizontalAlignment','left','units','normalized','position',[.01 .8 .98 .18]);
hKeepStartvelocity = uicontrol(hPanelVelocity,'style','checkbox','string','Keep Startvelocity','tag','keepStartvelocity','horizontalalignment','left','units','normalized','position',[.01 .5 .64 .2],'callback',@storeData);
hKeepEndvelocity   = uicontrol(hPanelVelocity,'style','checkbox','string','Keep Endvelocity','tag','keepEndvelocity','horizontalalignment','left','units','normalized','position',[.01 .2 .64 .2],'callback',@storeData);
hStartvelocity     = uicontrol(hPanelVelocity,'style','edit','tag','startvelocity','backgroundcolor','white','units','normalized','position',[.66 .5 .33 .2],'callback',@storeData);
hEndvelocity	   = uicontrol(hPanelVelocity,'style','edit','tag','endvelocity','backgroundcolor','white','units','normalized','position',[.66 .2 .33 .2],'callback',@storeData);

% Eigenschaften Rotation
% Pause
hPausePanelOrientation = uipanel(hPropertyPanelContentPanel,'tag','pauseOrientationPanel','foregroundcolor',color.lightblue,'title','Orientation','units','normalized','position',[0 2/3 1 1/3]);
hPauseOrientationText = uicontrol(hPausePanelOrientation,'style','text','tag','pauseOrientationText','horizontalAlignment','left','units','normalized','position',[.01 .8 .98 .18]);
hPauseOrientation     = uitable(hPausePanelOrientation,'tag','pauseOrientation','units','normalized','rowname',{'yaw' 'pitch' 'roll'},'position',[.01 .02 .6 .78],'celleditcallback',@storeData);
% Linie/Kreis
% Tabs fuer Transfer-Measure-Transfer
hRotationPanelTabGroup = uibuttongroup(hPropertyPanelContentPanel,'tag','rotationPanelTabGroup','bordertype','none','units','normalized','position',[0 .9 1 .1],'SelectionChangeFcn','updateProperty(gcbf)');
hRotationPanelTransfer1Button = uicontrol(hRotationPanelTabGroup,'style','togglebutton','tag','transfer1Button','string','1. Transfer','units','normalized','position',[0 0 .25 1]);
hRotationPanelMeasureButton   = uicontrol(hRotationPanelTabGroup,'style','togglebutton','tag','measureButton','string','Measure','units','normalized','position',[.25 0 .25 1]);
hRotationPanelTransfer2Button = uicontrol(hRotationPanelTabGroup,'style','togglebutton','tag','transfer2Button','string','2. Transfer','units','normalized','position',[.5 0 .25 1]);
hRotationPanel = uipanel(hPropertyPanelContentPanel,'tag','rotationPanel','bordertype','none','units','normalized','position',[0 0 1 .9]);
% Inhalt
% 1. Bedingung
hConditionPanel1 = uipanel(hRotationPanel,'foregroundcolor',color.lightblue,'title','Primary condition','units','normalized','position',[0 .65 1 .35]);
hCondition1Text             = uicontrol(hConditionPanel1,'style','text','string','Set auxiliary vector to target vector','horizontalAlignment','left','units','normalized','position',[.01 .8 .98 .18]);
hCondition1AuxVectorText    = uicontrol(hConditionPanel1,'style','text','string','Auxiliary vector','horizontalAlignment','left','units','normalized','position',[.01 .62 .32 .18]);
hCondition1TargetSystemText = uicontrol(hConditionPanel1,'style','text','string','Target system','horizontalAlignment','left','units','normalized','position',[.34 .62 .32 .18]);
hCondition1TargetVectorText = uicontrol(hConditionPanel1,'style','text','string','Target vector','horizontalAlignment','left','units','normalized','position',[.67 .62 .32 .18]); 
hCondition1AuxVector    = uitable(hConditionPanel1,'tag','condition1AuxVector','units','normalized','rowname',{'x' 'y' 'z'},'position',[.01 .02 .32 .6],'celleditcallback',@storeData);
hCondition1TargetSystem = uicontrol(hConditionPanel1,'style','popupmenu','tag','condition1TargetSystem','string',{'global';'local';'frenet'},'backgroundcolor','white','units','normalized','position',[.34 .32 .32 .3],'callback',@storeData);
hCondition1TargetVector = uitable(hConditionPanel1,'tag','condition1TargetVector','units','normalized','rowname',{'x' 'y' 'z'},'position',[.67 .02 .32 .6],'celleditcallback',@storeData);
% 2. Bedingung
hConditionPanel2 = uipanel(hRotationPanel,'foregroundcolor',color.lightblue,'title','Secondary condition','units','normalized','position',[0 .3 1 .35]);
hCondition2Text             = uicontrol(hConditionPanel2,'style','text','string','Set auxiliary vector to target vector','horizontalAlignment','left','units','normalized','position',[.01 .8 .98 .18]);
hCondition2AuxVectorText    = uicontrol(hConditionPanel2,'style','text','string','Auxiliary vector','horizontalAlignment','left','units','normalized','position',[.01 .62 .32 .18]);
hCondition2TargetSystemText = uicontrol(hConditionPanel2,'style','text','string','Target system','horizontalAlignment','left','units','normalized','position',[.34 .62 .32 .18]);
hCondition2TargetVectorText = uicontrol(hConditionPanel2,'style','text','string','Target vector','horizontalAlignment','left','units','normalized','position',[.67 .62 .32 .18]); 
hCondition2AuxVector     = uitable(hConditionPanel2,'tag','condition2AuxVector','units','normalized','rowname',{'x' 'y' 'z'},'position',[.01 .02 .32 .6],'celleditcallback',@storeData);
hCondition2TargetSystem  = uicontrol(hConditionPanel2,'style','popupmenu','tag','condition2TargetSystem','string',{'global';'local';'frenet'},'backgroundcolor','white','units','normalized','position',[.34 .32 .32 .3],'callback',@storeData);
hCondition2TargetVector  = uitable(hConditionPanel2,'tag','condition2TargetVector','units','normalized','rowname',{'x' 'y' 'z'},'position',[.67 .02 .32 .6],'celleditcallback',@storeData);
% Splines
hSplinesPanel = uipanel(hRotationPanel,'tag','splinesPanel','foregroundcolor',color.lightblue,'title','Splines','units','normalized','position',[0 0 1 .3]);
hSplinesButtonText = uicontrol(hSplinesPanel,'style','text','string','Change yaw, pitch and roll for the measure part.','horizontalAlignment','left','units','normalized','position',[.01 .7 .98 .28]);
hSplinesButton = uicontrol(hSplinesPanel,'style','pushbutton','string','Change Rotation...','units','normalized','position',[.01 .02 .64 .68],'callback',@showRotation);
% Grenzen
hBoundsPanel = uipanel(hRotationPanel,'tag','boundsPanel','foregroundcolor',color.lightblue,'title','Bounds','units','normalized','position',[0 0 1 .3]);
hBoundsText = uicontrol(hBoundsPanel,'tag','boundsText','style','text','horizontalAlignment','left','units','normalized','position',[.01 .02 .32 .96]);
hBoundsTable = uitable(hBoundsPanel,'tag','bounds','columnwidth',{70 70},...
    'rowname',{'yaw' 'pitch' 'roll'},'columnname',{'rising' 'falling'},...
    'columneditable',[true true],'columnformat',{'short' 'short'},...
    'units','normalized','position',[.34 .02 .65 .96],...
    'celleditcallback',@storeData);

% einige Eigenschaften fuer alle Tabellen setzen
% Leerdaten in alle Tabellen schreiben, damit ResizeFcn die Tabellenbreiten
% berechnen kann
set(findobj(findall(hFigMain),'-property','celleditcallback','-not','tag','bounds'),...
    'columneditable',true,'columnwidth',{10},'data',[0;0;0],...
    'columnformat',{'short'},'columnname',[]);

% Select/Grid/Axis equal schon zum Programmstart setzen
handleViewTools(hMenuViewSelect,1);
handleViewTools(hMenuViewGrid,1);
handleViewTools(hMenuViewAxis,1);

软件主界面的各种框框啊内容啊外型之类的

存储应用程序定义的数据  0.5

%% Variablen anlegen und speichern
initStep = initStep+1;
waitbar(initProgress(initStep),hFigInit,'Set variables...');

setappdata(hFigMain,'programPath',programPath);
setappdata(hFigMain,'movement',[]);
% Dateiname und -pfad
setappdata(hFigMain,'filename','Untitled');
setappdata(hFigMain,'pathname',[]);
% Zwischenspeicher
setappdata(hFigMain,'clipboard',[]);
% Zustande werden benoetigt fuer Freigabe der Save/Undo/Redo-Buttons
setappdata(hFigMain,'originalState',0); % unveraenderter Zustand
setappdata(hFigMain,'actualState',0);   % fortlaufender Zustand
setappdata(hFigMain,'newestState',0);   % neuster Zustand
% undoStack erstellen
undoStack = struct('actionName',{},...
    'undo',struct('movement',{},'selectedItems',{}),...
    'redo',struct('movement',{},'selectedItems',{}));
setappdata(hFigMain,'undoStack',undoStack);
% momentaner Fehler
setappdata(hFigMain,'actualError',[]);
% die zuletzt markierten Segmente werden ben鰐igt, wenn diese Segmenten
% nicht fehlerfrei sind 
setappdata(hFigMain,'lastSelectedItems',[]);
% Farben
setappdata(hFigMain,'colors',color);

% setappdata:存储应用程序定义的数据 setappdata(obj,name,val)

可以在另外地方用get函数调用值

%% Handle fuer Fenster anlegen, damit jede Instanz des Programms eigene Fenster besitzt
% Einstellungsfenster
setappdata(hFigMain,'hFigSettings',[]);
% Rotationsfenster
setappdata(hFigMain,'hFigRotation',[]);
% Berechnungsfenster
setappdata(hFigMain,'hFigCalculation',[]);
% Transformationsfenster
setappdata(hFigMain,'hFigTransform',[]);
% Uploadfenster
setappdata(hFigMain,'hFigUpload',[]);

% 点有些按钮会新建窗口,这里是先为窗口创建手柄,以便程序的每个实例都有自己的窗口。

从文件中加载默认设置 0.75

%% default Settings aus Datei laden
initStep = initStep+1;
waitbar(initProgress(initStep),hFigInit,'Load settings...');

errorFreeSettings = defaultSettings('all');
settingsToCheck = {...
    'general',      'sixD';...
    'general',      'unitTranslation';...
    'general',      'unitRotation';...
    'general',      'circleInput';...
    'general',      'epsilonPosition';...
    'general',      'epsilonTime';...
    'general',      'deltaPosition';...
    'restrictions', 'maxKinematicsTranslation';...
    'restrictions', 'maxKinematicsRotation';...
    'calculation',  'insertPauses';...
    'calculation',  'minPause';...
    'calculation',  'snapProfile';...
    'calculation',  'maxMeasureVelocityMode';...
    'calculation',  'maxMeasureVelocity';...
    'optimization', 'intervalSwitchTimesCounter';...
    'optimization', 'examinationFlag';...
    'optimization', 'restrictionIterationCounter1';...
    'optimization', 'restrictionIterationCounter2';...
    'appearance',   'showWarnings';...
    'appearance',   'showPause';...
    'appearance',   'colorStyle';...
    'appearance',   'plotColors'};

for counter = 1:length(settingsToCheck)
    try
        loadstruct = load([programPath filesep 'initSettings.mat']);
        settingValue = eval(['loadstruct.settings.' settingsToCheck{counter,1} '.' settingsToCheck{counter,2}]);
        checkSettingsConsistency(errorFreeSettings,settingValue,settingsToCheck{counter,2});
        settingString = ['errorFreeSettings.' settingsToCheck{counter,1} '.' settingsToCheck{counter,2}];
        writeString = [settingString ' = settingValue;'];
        eval(writeString);
    end
end
setappdata(hFigMain,'settings',errorFreeSettings);

未完待续......

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值