从一个现有的模型来理解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);
未完待续......