From 2d7b7393ec58cdc589b650458208546529958d4e Mon Sep 17 00:00:00 2001 From: Niklas Wahl Date: Fri, 24 May 2019 21:08:39 +0200 Subject: [PATCH 01/87] initial export with line fix --- matRadGUI_export.m | 7518 ++++++++++++++++++++++++++++++++++++++++++ matRadGUI_export.mat | Bin 0 -> 7550 bytes 2 files changed, 7518 insertions(+) create mode 100644 matRadGUI_export.m create mode 100644 matRadGUI_export.mat diff --git a/matRadGUI_export.m b/matRadGUI_export.m new file mode 100644 index 000000000..13149e2f2 --- /dev/null +++ b/matRadGUI_export.m @@ -0,0 +1,7518 @@ +function varargout = matRadGUI_export(varargin) +% matRad GUI +% +% call +% MATRADGUI_EXPORT, by itself, creates a new MATRADGUI_EXPORT or raises the existing +% singleton*. +% +% H = MATRADGUI_EXPORT returns the handle to a new MATRADGUI_EXPORT or the handle to +% the existing singleton*. +% +% MATRADGUI_EXPORT('CALLBACK',hObject,eventData,handles,...) calls the local +% function named CALLBACK in MATRADGUI_EXPORT.M with the given input arguments. +% +% MATRADGUI_EXPORT('Property','Value',...) creates a new MATRADGUI_EXPORT or raises the +% existing singleton*. Starting from the left, property value pairs are +% applied to the GUI before matRadGUI_export_OpeningFcn gets called. An +% unrecognized property name or invalid value makes property application +% stop. All inputs are passed to matRadGUI_export_OpeningFcn via varargin. +% +% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one +% instance to run (singleton)". +% +% See also: GUIDE, GUIDATA, GUIHANDLES +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Copyright 2015 the matRad development team. +% +% This file is part of the matRad project. It is subject to the license +% terms in the LICENSE file found in the top-level directory of this +% distribution and at https://github.com/e0404/matRad/LICENSES.txt. No part +% of the matRad project, including this file, may be copied, modified, +% propagated, or distributed except according to the terms contained in the +% LICENSE file. +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +if ~isdeployed + matRadRootDir = fileparts(mfilename('fullpath')); + addpath(genpath(matRadRootDir)); +end + +[env, versionString] = matRad_getEnvironment(); + +% abort for octave +switch env + case 'MATLAB' + + case 'OCTAVE' + fprintf(['matRad GUI not available for ' env ' ' versionString ' \n']); + return; + otherwise + fprintf(['not yet tested']); + end + +% Begin initialization code - DO NOT EDIT +% set platform specific look and feel +if ispc + lf = 'com.sun.java.swing.plaf.windows.WindowsLookAndFeel'; +elseif isunix + lf = 'com.jgoodies.looks.plastic.Plastic3DLookAndFeel'; +elseif ismac + lf = 'com.apple.laf.AquaLookAndFeel'; +end +javax.swing.UIManager.setLookAndFeel(lf); + +gui_Singleton = 1; +gui_State = struct('gui_Name', mfilename, ... + 'gui_Singleton', gui_Singleton, ... + 'gui_OpeningFcn', @matRadGUI_export_OpeningFcn, ... + 'gui_OutputFcn', @matRadGUI_export_OutputFcn, ... + 'gui_LayoutFcn', @matRadGUI_export_LayoutFcn, ... + 'gui_Callback', []); +if nargin && ischar(varargin{1}) + gui_State.gui_Callback = str2func(varargin{1}); +end + +if nargout + [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); +else + gui_mainfcn(gui_State, varargin{:}); +end + +% End initialization code - DO NOT EDIT + +function handles = resetGUI(hObject, handles, varargin) +% enable opengl software rendering to visualize linewidths properly +if ispc + opengl software +elseif ismac + % opengl is not supported +end + +% Choose default command line output for matRadGUI_export +handles.output = hObject; +%show matrad logo +axes(handles.axesLogo) +[im, ~, alpha] = imread('matrad_logo.png'); +f = image(im); +axis equal off +set(f, 'AlphaData', alpha); +% show dkfz logo +axes(handles.axesDKFZ) +[im, ~, alpha] = imread('DKFZ_Logo.png'); +f = image(im); +axis equal off; +set(f, 'AlphaData', alpha); + +% turn off the datacursormode (since it does not allow to set scrolling +% callbacks +handles.dcm_obj = datacursormode(handles.figure1); +set(handles.dcm_obj,'DisplayStyle','window'); +if strcmpi(get(handles.dcm_obj,'Enable'),'on') + set(handles.dcm_obj,'Enable','off'); +end +%Add the callback for the datacursor display +set(handles.dcm_obj,'UpdateFcn',@dataCursorUpdateFunction); + +% set callback for scroll wheel function +set(gcf,'WindowScrollWheelFcn',@matRadScrollWheelFcn); + +% change color of toobar but only the first time GUI is started +if handles.initialGuiStart + hToolbar = findall(hObject,'tag','uitoolbar1'); + jToolbar = get(get(hToolbar,'JavaContainer'),'ComponentPeer'); + jToolbar.setBorderPainted(false); + color = java.awt.Color.gray; + % Remove the toolbar border, to blend into figure contents + jToolbar.setBackground(color); + % Remove the separator line between toolbar and contents + warning('off','MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame'); + jFrame = get(handle(hObject),'JavaFrame'); + jFrame.showTopSeparator(false); + jtbc = jToolbar.getComponents; + for idx=1:length(jtbc) + jtbc(idx).setOpaque(false); + jtbc(idx).setBackground(color); + for childIdx = 1 : length(jtbc(idx).getComponents) + jtbc(idx).getComponent(childIdx-1).setBackground(color); + end + end +end + + +set(handles.legendTable,'String',{'no data loaded'}); +% clear VOIPlotFlag +if isfield(handles,'VOIPlotFlag') + handles = rmfield(handles,'VOIPlotFlag'); +end + +%seach for availabes machines +handles.Modalities = {'photons','protons','carbon'}; +for i = 1:length(handles.Modalities) + pattern = [handles.Modalities{1,i} '_*']; + if isdeployed + Files = dir([ctfroot filesep 'matRad' filesep pattern]); + else + Files = dir([fileparts(mfilename('fullpath')) filesep pattern]); + end + for j = 1:length(Files) + if ~isempty(Files) + MachineName = Files(j).name(numel(handles.Modalities{1,i})+2:end-4); + if isfield(handles,'Machines') + if sum(strcmp(handles.Machines,MachineName)) == 0 + handles.Machines{size(handles.Machines,2)+1} = MachineName; + end + else + handles.Machines = cell(1); + handles.Machines{1} = MachineName; + end + end + end +end +set(handles.popUpMachine,'String',handles.Machines); + + +vChar = get(handles.editGantryAngle,'String'); +if strcmp(vChar(1,1),'0') && length(vChar)==6 + set(handles.editGantryAngle,'String','0'); +end +vChar = get(handles.editCouchAngle,'String'); +if strcmp(vChar(1,1),'0') && length(vChar)==3 + set(handles.editCouchAngle,'String','0') +end +%% +% handles.State=0 no data available +% handles.State=1 ct cst and pln available; ready for dose calculation +% handles.State=2 ct cst and pln available and dij matric(s) are calculated; +% ready for optimization +% handles.State=3 plan is optimized + + +% if plan is changed go back to state 1 +% if table VOI Type or Priorities changed go to state 1 +% if objective parameters changed go back to state 2 +handles.CutOffLevel = 0.01; % relative cut off level for dose vis +handles.IsoDose.NewIsoDoseFlag = false; +handles.TableChanged = false; +handles.State = 0; +handles.doseOpacity = 0.6; +handles.IsoDose.Levels = 0; +handles.dispWindow = cell(3,2); % first dimension refers to the selected + +% do not calculate / suggest isoCenter new by default +set(handles.checkIsoCenter, 'Value', 0); +set(handles.editIsoCenter,'Enable','on') + +% suppose no ct cube in HU is available (because no ct could be available) +handles.cubeHUavailable = false; +% initial startup finished +handles.initialGuiStart = false; +guidata(hObject, handles); +% eof resetGUI + +function handles = reloadGUI(hObject, handles, ct, cst) +AllVarNames = handles.AllVarNames; + +if ismember('ct',AllVarNames) + % compute HU values + if ~isfield(ct, 'cubeHU') + ct = matRad_electronDensitiesToHU(ct); + assignin('base','ct',ct); + end + if ~isfield(ct, 'cubeHU') + handles.cubeHUavailable = false; + else + handles.cubeHUavailable = true; + end +end + +%set plan if available - if not create one +try + + if ismember('pln',AllVarNames) && handles.State > 0 + % check if you are working with a valid pln + pln = evalin('base','pln'); + if ~isfield(pln,'propStf') + handles = showWarning(handles,'GUI OpeningFunc: Overwriting outdated pln format with default GUI pln'); + evalin('base','clear pln'); + getPlnFromGUI(handles); + end + setPln(handles); + elseif handles.State > 0 + getPlnFromGUI(handles); + setPln(handles); + end + +catch + handles.State = 0; + handles = showError(handles,'GUI OpeningFunc: Could not set or get pln'); +end + +% check for dij structure +if ismember('dij',AllVarNames) + handles.State = 2; +end + +% check for optimized results +if ismember('resultGUI',AllVarNames) + handles.State = 3; +end + +% set some default values +if handles.State == 2 || handles.State == 3 + set(handles.popupDisplayOption,'String','physicalDose'); + handles.SelectedDisplayOption ='physicalDose'; + handles.SelectedDisplayOptionIdx=1; +else + handles.resultGUI = []; + set(handles.popupDisplayOption,'String','no option available'); + handles.SelectedDisplayOption=''; + handles.SelectedDisplayOptionIdx=1; +end + +% precompute iso dose lines +if handles.State == 3 + handles = updateIsoDoseLineCache(handles); +end + +%per default the first beam is selected for the profile plot +handles.selectedBeam = 1; +handles.plane = get(handles.popupPlane,'Value'); +handles.DijCalcWarning = false; + +planePermute = [2 1 3]; + +% set slice slider +if handles.State > 0 + if evalin('base','exist(''pln'',''var'')') + currPln = evalin('base','pln'); + if sum(currPln.propStf.isoCenter(:)) ~= 0 + currSlice = ceil(currPln.propStf.isoCenter(1,planePermute(handles.plane))/ct.resolution.x); + else + currSlice = ceil(ct.cubeDim(planePermute(handles.plane))/2); + end + else % no pln -> no isocenter -> use middle + currSlice = ceil(ct.cubeDim(planePermute(handles.plane))/2); + end + set(handles.sliderSlice,'Min',1,'Max',ct.cubeDim(handles.plane),... + 'Value',currSlice,... + 'SliderStep',[1/(ct.cubeDim(handles.plane)-1) 1/(ct.cubeDim(handles.plane)-1)]); + + % define context menu for structures + for i = 1:size(cst,1) + if cst{i,5}.Visible + handles.VOIPlotFlag(i) = true; + else + handles.VOIPlotFlag(i) = false; + end + end + else + % reset slider when nothing is loaded + set(handles.sliderSlice,'Min',0,'Max',1,'Value',0,'SliderStep',[1 1]); +end + +%Initialize colormaps and windows +handles.doseColorMap = 'jet'; +handles.ctColorMap = 'bone'; +handles.cMapSize = 64; +handles.cBarChanged = true; + +%Set up the colormap selection box +availableColormaps = matRad_getColormap(); +set(handles.popupmenu_chooseColormap,'String',availableColormaps); + +currentCtMapIndex = find(strcmp(availableColormaps,handles.ctColorMap)); +currentDoseMapIndex = find(strcmp(availableColormaps,handles.doseColorMap)); + +if handles.State >= 1 + set(handles.popupmenu_chooseColormap,'Value',currentCtMapIndex); +end + +if handles.State >= 3 + set(handles.popupmenu_chooseColormap,'Value',currentDoseMapIndex); +end + +% Update handles structure +handles.profileOffset = 0; +UpdateState(handles) + +axes(handles.axesFig) + +handles.rememberCurrAxes = false; +UpdatePlot(handles) +handles.rememberCurrAxes = true; +guidata(hObject, handles); +% eof reloadGUI + +% --- Executes just before matRadGUI_export is made visible. +function matRadGUI_export_OpeningFcn(hObject, ~, handles, varargin) +%#ok<*DEFNU> +%#ok<*AGROW> +% This function has no output args, see OutputFcn. +% hObject handle to figure +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +% varargin command line arguments to matRadGUI_export (see VARARGIN) + +% variable to check whether GUI is opened or just refreshed / new data +% loaded, since resetGUI needs to distinguish at one point + +handles.initialGuiStart = true; + +%If devMode is true, error dialogs will include the full stack trace of the error +%If false, only the basic error message is shown (works for errors that +%handle the MException object) +handles.devMode = true; + +set(handles.radiobtnPlan,'value',0); + +handles = resetGUI(hObject, handles); + +%% parse variables from base workspace +AllVarNames = evalin('base','who'); +handles.AllVarNames = AllVarNames; +try + if ismember('ct',AllVarNames) && ismember('cst',AllVarNames) + ct = evalin('base','ct'); + cst = evalin('base','cst'); + %cst = setCstTable(handles,cst); + cst = generateCstTable(handles,cst); + handles.State = 1; + cst = matRad_computeVoiContoursWrapper(cst,ct); + assignin('base','cst',cst); + + elseif ismember('ct',AllVarNames) && ~ismember('cst',AllVarNames) + handles = showError(handles,'GUI OpeningFunc: could not find cst file'); + elseif ~ismember('ct',AllVarNames) && ismember('cst',AllVarNames) + handles = showError(handles,'GUI OpeningFunc: could not find ct file'); + end +catch + handles = showError(handles,'GUI OpeningFunc: Could not load ct and cst file'); +end + +if ismember('ct',AllVarNames) && ismember('cst',AllVarNames) + handles = reloadGUI(hObject, handles, ct, cst); +else + handles = reloadGUI(hObject, handles); +end + +guidata(hObject, handles); + + +function Callback_StructVisibilty(source,~) + +handles = guidata(findobj('Name','matRadGUI')); + +contextUiChildren = get(get(handles.figure1,'UIContextMenu'),'Children'); + +Idx = find(strcmp(get(contextUiChildren,'Label'),get(source,'Label'))); +if strcmp(get(source,'Checked'),'on') + set(contextUiChildren(Idx),'Checked','off'); +else + set(contextUiChildren(Idx),'Checked','on'); +end +%guidata(findobj('Name','matRadGUI_export'), handles); +UpdatePlot(handles); + +Update +% --- Outputs from this function are returned to the command line. +function varargout = matRadGUI_export_OutputFcn(~, ~, handles) +% varargout cell array for returning output args (see VARARGOUT); +% hObject handle to figure +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Get default command line output from handles structure +varargout{1} = handles.output; + +% set focus on error dialog +if isfield(handles,'ErrorDlg') + figure(handles.ErrorDlg) +end + +% --- Executes on button press in btnLoadMat. +function btnLoadMat_Callback(hObject, ~, handles) +% hObject handle to btnLoadMat (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +[FileName, FilePath] = uigetfile('*.mat'); +if FileName == 0 % user pressed cancel --> do nothing. + return; +end + +handles = resetGUI(hObject, handles); + +try + + % delete existing workspace - parse variables from base workspace + AllVarNames = evalin('base','who'); + RefVarNames = {'ct','cst','pln','stf','dij','resultGUI'}; + + for i = 1:length(RefVarNames) + if sum(ismember(AllVarNames,RefVarNames{i}))>0 + evalin('base',['clear ', RefVarNames{i}]); + end + end + + % read new data + load([FilePath FileName]); + set(handles.legendTable,'String',{'no data loaded'}); + set(handles.popupDisplayOption,'String','no option available'); + +catch ME + handles = showError(handles,'LoadMatFileFnc: Could not load *.mat file',ME); + + guidata(hObject,handles); + UpdateState(handles); + UpdatePlot(handles); + return +end + +try + generateCstTable(handles,cst); + handles.TableChanged = false; + set(handles.popupTypeOfPlot,'Value',1); + cst = matRad_computeVoiContoursWrapper(cst,ct); + + assignin('base','ct',ct); + assignin('base','cst',cst); + handles.State = 1; +catch ME + handles = showError(handles,'LoadMatFileFnc: Could not load *.mat file',ME); +end + +% check if a optimized plan was loaded +if exist('stf','var') + assignin('base','stf',stf); +end +if exist('pln','var') + assignin('base','pln',pln); +end +if exist('dij','var') + assignin('base','dij',dij); +end +% if exist('stf','var') && exist('dij','var') +% handles.State = 2; +% end + +if exist('resultGUI','var') + assignin('base','resultGUI',resultGUI); + % handles.State = 3; + % handles.SelectedDisplayOption ='physicalDose'; +end + +% recheck current workspace variables +AllVarNames = evalin('base','who'); +handles.AllVarNames = AllVarNames; + +if ismember('ct',AllVarNames) && ismember('cst',AllVarNames) + handles = reloadGUI(hObject, handles, ct, cst); +else + handles = reloadGUI(hObject, handles); +end + +guidata(hObject,handles); + +% --- Executes on button press in btnLoadDicom. +function btnLoadDicom_Callback(hObject, ~, handles) +% hObject handle to btnLoadDicom (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +try + % delete existing workspace - parse variables from base workspace + set(handles.popupDisplayOption,'String','no option available'); + AllVarNames = evalin('base','who'); + RefVarNames = {'ct','cst','pln','stf','dij','resultGUI'}; + for i = 1:length(RefVarNames) + if sum(ismember(AllVarNames,RefVarNames{i}))>0 + evalin('base',['clear ', RefVarNames{i}]); + end + end + handles.State = 0; + matRad_importDicomGUI; + +catch + handles = showError(handles,'DicomImport: Could not import data'); +end +UpdateState(handles); +guidata(hObject,handles); + + +% --- Executes on button press in btn_export. +function btn_export_Callback(hObject, eventdata, handles) +% hObject handle to btn_export (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +try + matRad_exportGUI; +catch + handles = showError(handles,'Could not export data'); +end +UpdateState(handles); +guidata(hObject,handles); + +function editBixelWidth_Callback(hObject, ~, handles) +% hObject handle to editBixelWidth (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of editBixelWidth as text +% str2double(get(hObject,'String')) returns contents of editBixelWidth as a double +getPlnFromGUI(handles); +if handles.State > 0 + handles.State = 1; + UpdateState(handles); + guidata(hObject,handles); +end + +function editGantryAngle_Callback(hObject, ~, handles) +% hObject handle to editGantryAngle (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of editGantryAngle as text +% str2double(get(hObject,'String')) returns contents of editGantryAngle as a double +getPlnFromGUI(handles); +if handles.State > 0 + handles.State = 1; + UpdateState(handles); + UpdatePlot(handles); + guidata(hObject,handles); +end + +function editCouchAngle_Callback(hObject, ~, handles) +% hObject handle to editCouchAngle (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of editCouchAngle as text +% str2double(get(hObject,'String')) returns contents of editCouchAngle as a double +getPlnFromGUI(handles); +if handles.State > 0 + handles.State = 1; + UpdateState(handles); + guidata(hObject,handles); +end + +% --- Executes on selection change in popupRadMode. +function popupRadMode_Callback(hObject, eventdata, handles) +% hObject handle to popupRadMode (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +checkRadiationComposition(handles); +contents = cellstr(get(hObject,'String')); +RadIdentifier = contents{get(hObject,'Value')}; +contentPopUp = get(handles.popMenuBioOpt,'String'); +switch RadIdentifier + case 'photons' + + set(handles.popMenuBioOpt,'Enable','off'); + ix = find(strcmp(contentPopUp,'none')); + set(handles.popMenuBioOpt,'Value',ix); + set(handles.btnSetTissue,'Enable','off'); + + set(handles.btnRunSequencing,'Enable','on'); + set(handles.btnRunDAO,'Enable','on'); + set(handles.radiobutton3Dconf,'Enable','on'); + set(handles.txtSequencing,'Enable','on'); + set(handles.editSequencingLevel,'Enable','on'); + + case 'protons' + + set(handles.popMenuBioOpt,'Enable','on'); + ix = find(strcmp(contentPopUp,'const_RBExD')); + set(handles.popMenuBioOpt,'Value',ix); + set(handles.btnSetTissue,'Enable','on'); + + set(handles.btnSetTissue,'Enable','off'); + set(handles.btnRunSequencing,'Enable','off'); + set(handles.btnRunDAO,'Enable','off'); + set(handles.radiobutton3Dconf,'Enable','off'); + set(handles.txtSequencing,'Enable','off'); + set(handles.editSequencingLevel,'Enable','off'); + + case 'carbon' + + set(handles.popMenuBioOpt,'Enable','on'); + ix = find(strcmp(contentPopUp,'LEMIV_RBExD')); + set(handles.popMenuBioOpt,'Value',ix); + set(handles.btnSetTissue,'Enable','on'); + + set(handles.btnRunSequencing,'Enable','off'); + set(handles.btnRunDAO,'Enable','off'); + set(handles.radiobutton3Dconf,'Enable','off'); + set(handles.txtSequencing,'Enable','off'); + set(handles.editSequencingLevel,'Enable','off'); +end + +if handles.State > 0 + pln = evalin('base','pln'); + if handles.State > 0 && ~strcmp(contents(get(hObject,'Value')),pln.radiationMode) + + % new radiation modality is photons -> just keep physicalDose + if strcmp(contents(get(hObject,'Value')),'photons') + try + AllVarNames = evalin('base','who'); + if ismember('resultGUI',AllVarNames) + resultGUI = evalin('base','resultGUI'); + if isfield(resultGUI,'alpha'); resultGUI = rmfield(resultGUI,'alpha'); end + if isfield(resultGUI,'beta'); resultGUI = rmfield(resultGUI,'beta'); end + if isfield(resultGUI,'RBExDose'); resultGUI = rmfield(resultGUI,'RBExDose');end + if isfield(resultGUI,'RBE'); resultGUI = rmfield(resultGUI,'RBE'); end + assignin('base','resultGUI',resultGUI); + handles = updateIsoDoseLineCache(handles); + end + catch + end + elseif strcmp(contents(get(hObject,'Value')),'protons') + try + AllVarNames = evalin('base','who'); + if ismember('resultGUI',AllVarNames) + resultGUI = evalin('base','resultGUI'); + if isfield(resultGUI,'alpha'); resultGUI = rmfield(resultGUI,'alpha');end + if isfield(resultGUI,'beta'); resultGUI = rmfield(resultGUI,'beta'); end + if isfield(resultGUI,'RBE'); resultGUI = rmfield(resultGUI,'RBE'); end + assignin('base','resultGUI',resultGUI); + handles = updateIsoDoseLineCache(handles); + end + catch + end + end + + guidata(hObject,handles); + UpdatePlot(handles); + + getPlnFromGUI(handles); + handles.State = 1; + UpdateState(handles); + + end + +guidata(hObject,handles); + +end + + +% --- Executes on button press in btnCalcDose. +function btnCalcDose_Callback(hObject, ~, handles) +% hObject handle to btnCalcDose (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% http://stackoverflow.com/questions/24703962/trigger-celleditcallback-before-button-callback +% http://www.mathworks.com/matlabcentral/newsreader/view_thread/332613 +% wait some time until the CallEditCallback is finished +% Callback triggers the cst saving mechanism from GUI +try + % indicate that matRad is busy + % change mouse pointer to hour glass + Figures = gcf;%findobj('type','figure'); + set(Figures, 'pointer', 'watch'); + drawnow; + % disable all active objects + InterfaceObj = findobj(Figures,'Enable','on'); + set(InterfaceObj,'Enable','off'); + + %pause(0.1); + %uiTable_CellEditCallback(hObject,[],handles); + %pause(0.3); + + %% get cst from table + %if ~getCstTable(handles) + % return + %end + % read plan from gui and save it to workspace + % gets also IsoCenter from GUI if checkbox is not checked + getPlnFromGUI(handles); + + % get default iso center as center of gravity of all targets if not + % already defined + pln = evalin('base','pln'); + + if length(pln.propStf.gantryAngles) ~= length(pln.propStf.couchAngles) + handles = showWarning(handles,'number of gantryAngles != number of couchAngles'); + end + %% + if ~checkRadiationComposition(handles); + fileName = [pln.radiationMode '_' pln.machine]; + handles = showError(handles,errordlg(['Could not find the following machine file: ' fileName ])); + guidata(hObject,handles); + return; + end + + %% check if isocenter is already set + if ~isfield(pln.propStf,'isoCenter') + handles = showWarning(handles,'no iso center set - using center of gravity based on structures defined as TARGET'); + pln.propStf.isoCenter = ones(pln.propStf.numOfBeams,1) * matRad_getIsoCenter(evalin('base','cst'),evalin('base','ct')); + assignin('base','pln',pln); + elseif ~get(handles.checkIsoCenter,'Value') + if ~strcmp(get(handles.editIsoCenter,'String'),'multiple isoCenter') + pln.propStf.isoCenter = ones(pln.propStf.numOfBeams,1)*str2num(get(handles.editIsoCenter,'String')); + end + end + +catch ME + handles = showError(handles,'CalcDoseCallback: Error in preprocessing!',ME); + % change state from busy to normal + set(Figures, 'pointer', 'arrow'); + set(InterfaceObj,'Enable','on'); + guidata(hObject,handles); + return; +end + +% generate steering file +try + currPln = evalin('base','pln'); + % if we run 3d conf opt -> hijack runDao to trigger computation of + % connected bixels + if strcmp(pln.radiationMode,'photons') && get(handles.radiobutton3Dconf,'Value') + currpln.propOpt.runDAO = true; + end + stf = matRad_generateStf(evalin('base','ct'),... + evalin('base','cst'),... + currPln); + assignin('base','stf',stf); +catch ME + handles = showError(handles,'CalcDoseCallback: Error in steering file generation!',ME); + % change state from busy to normal + set(Figures, 'pointer', 'arrow'); + set(InterfaceObj,'Enable','on'); + guidata(hObject,handles); + return; +end + +% carry out dose calculation +try + if strcmp(pln.radiationMode,'photons') + dij = matRad_calcPhotonDose(evalin('base','ct'),stf,pln,evalin('base','cst')); + elseif strcmp(pln.radiationMode,'protons') || strcmp(pln.radiationMode,'carbon') + dij = matRad_calcParticleDose(evalin('base','ct'),stf,pln,evalin('base','cst')); + end + + % assign results to base worksapce + assignin('base','dij',dij); + handles.State = 2; + handles.TableChanged = false; + UpdateState(handles); + UpdatePlot(handles); + guidata(hObject,handles); +catch ME + handles = showError(handles,'CalcDoseCallback: Error in dose calculation!',ME); + % change state from busy to normal + set(Figures, 'pointer', 'arrow'); + set(InterfaceObj,'Enable','on'); + guidata(hObject,handles); + return; +end + +% change state from busy to normal +set(Figures, 'pointer', 'arrow'); +set(InterfaceObj,'Enable','on'); + +guidata(hObject,handles); + + + +%% plots ct and distributions +function UpdatePlot(handles) + +%profile on; + +axes(handles.axesFig); + +% this is necessary to prevent multiple callbacks of update plot drawing on +% top of each other in matlab <2014 +drawnow; + +defaultFontSize = 8; +currAxes = axis(handles.axesFig); +AxesHandlesCT_Dose = gobjects(0); +AxesHandlesVOI = cell(0); +AxesHandlesIsoDose = gobjects(0); + +if handles.State == 0 + cla reset + return +elseif handles.State > 0 + ct = evalin('base','ct'); + cst = evalin('base','cst'); + pln = evalin('base','pln'); +end + +%% state 3 indicates that a optimization has been performed + AllVarNames = evalin('base','who'); +if ismember('resultGUI',AllVarNames) + Result = evalin('base','resultGUI'); +end + +if exist('Result','var') + if ~isempty(Result) && ~isempty(ct.cubeHU) && ~isfield(handles,'DispInfo') + + DispInfo = fieldnames(Result); + + for i = 1:size(DispInfo,1) + + % delete weight vectors in Result struct for plotting + if isstruct(Result.(DispInfo{i,1})) || isvector(Result.(DispInfo{i,1})) + Result = rmfield(Result,DispInfo{i,1}); + DispInfo{i,2}=false; + else + %second dimension indicates if it should be plotted + DispInfo{i,2} = true; + % determine units + if strfind(DispInfo{i,1},'physicalDose') + DispInfo{i,3} = '[Gy]'; + elseif strfind(DispInfo{i,1},'alpha') + DispInfo{i,3} = '[Gy^{-1}]'; + elseif strfind(DispInfo{i,1},'beta') + DispInfo{i,3} = '[Gy^{-2}]'; + elseif strfind(DispInfo{i,1},'RBExD') + DispInfo{i,3} = '[Gy(RBE)]'; + elseif strfind(DispInfo{i,1},'LET') + DispInfo{i,3} = '[keV/um]'; + else + DispInfo{i,3} = '[a.u.]'; + end + DispInfo{i,4} = []; % optional for the future: color range for plotting + DispInfo{i,5} = []; % optional for the future: min max values + end + end + + set(handles.popupDisplayOption,'String',fieldnames(Result)); + if sum(strcmp(handles.SelectedDisplayOption,fieldnames(Result))) == 0 + handles.SelectedDisplayOption = DispInfo{find([DispInfo{:,2}],1,'first'),1}; + end + set(handles.popupDisplayOption,'Value',find(strcmp(handles.SelectedDisplayOption,fieldnames(Result)))); + + end +end + +%% set and get required variables +plane = get(handles.popupPlane,'Value'); +slice = round(get(handles.sliderSlice,'Value')); +hold(handles.axesFig,'on'); +if get(handles.popupTypeOfPlot,'Value')==1 + set(handles.axesFig,'YDir','Reverse'); +end + +%% Remove colorbar? +plotColorbarSelection = get(handles.popupmenu_chooseColorData,'Value'); + +if get(handles.popupTypeOfPlot,'Value')==2 || plotColorbarSelection == 1 + if isfield(handles,'cBarHandel') + delete(handles.cBarHandel); + end + %The following seems to be necessary as MATLAB messes up some stuff + %with the handle storage + ch = findall(gcf,'tag','Colorbar'); + if ~isempty(ch) + delete(ch); + end +end + +selectIx = get(handles.popupmenu_chooseColorData,'Value'); + +cla(handles.axesFig); +%% plot ct - if a ct cube is available and type of plot is set to 1 and not 2; 1 indicate cube plotting and 2 profile plotting +if ~isempty(ct) && get(handles.popupTypeOfPlot,'Value')==1 + + if selectIx == 3 + ctIx = 2; + else + ctIx = selectIx; + end + + if isfield(ct, 'cube') + plotCtCube = ct.cube; + else + plotCtCube = ct.cubeHU; + end + + ctMap = matRad_getColormap(handles.ctColorMap,handles.cMapSize); + + if isempty(handles.dispWindow{ctIx,2}) + handles.dispWindow{ctIx,2} = [min(reshape([ct.cubeHU{:}],[],1)) max(reshape([ct.cubeHU{:}],[],1))]; + end + + if get(handles.radiobtnCT,'Value') + [AxesHandlesCT_Dose(end+1),~,handles.dispWindow{ctIx,1}] = matRad_plotCtSlice(handles.axesFig,plotCtCube,1,plane,slice,ctMap,handles.dispWindow{ctIx,1}); + + % plot colorbar? If 1 the user asked for the CT + if plotColorbarSelection == 2 && handles.cBarChanged + %Plot the colorbar + handles.cBarHandel = matRad_plotColorbar(handles.axesFig,ctMap,handles.dispWindow{ctIx,1},'fontsize',defaultFontSize); + %adjust lables + if isfield(ct,'cubeHU') + set(get(handles.cBarHandel,'ylabel'),'String', 'Hounsfield Units','fontsize',defaultFontSize); + else + set(get(handles.cBarHandel,'ylabel'),'String', 'Electron Density','fontsize',defaultFontSize); + end + % do not interprete as tex syntax + set(get(handles.cBarHandel,'ylabel'),'interpreter','none'); + end + end +end + +%% plot dose cube +if handles.State >= 1 && get(handles.popupTypeOfPlot,'Value')== 1 && exist('Result','var') + doseMap = matRad_getColormap(handles.doseColorMap,handles.cMapSize); + doseIx = 3; + % if the selected display option doesn't exist then simply display + % the first cube of the Result struct + if ~isfield(Result,handles.SelectedDisplayOption) + CubeNames = fieldnames(Result); + handles.SelectedDisplayOption = CubeNames{1,1}; + end + + dose = Result.(handles.SelectedDisplayOption); + + % dose colorwash + if ~isempty(dose) && ~isvector(dose) + + if isempty(handles.dispWindow{doseIx,2}) + handles.dispWindow{doseIx,2} = [min(dose(:)) max(dose(:))]; % set min and max dose values + end + + if get(handles.radiobtnDose,'Value') + [doseHandle,~,handles.dispWindow{doseIx,1}] = matRad_plotDoseSlice(handles.axesFig,dose,plane,slice,handles.CutOffLevel,handles.doseOpacity,doseMap,handles.dispWindow{doseIx,1}); + AxesHandlesCT_Dose(end+1) = doseHandle; + end + + % plot colorbar? + if plotColorbarSelection > 2 && handles.cBarChanged + %Plot the colorbar + handles.cBarHandel = matRad_plotColorbar(handles.axesFig,doseMap,handles.dispWindow{selectIx,1},'fontsize',defaultFontSize); + %adjust lables + Idx = find(strcmp(handles.SelectedDisplayOption,DispInfo(:,1))); + set(get(handles.cBarHandel,'ylabel'),'String', [DispInfo{Idx,1} ' ' DispInfo{Idx,3} ],'fontsize',defaultFontSize); + % do not interprete as tex syntax + set(get(handles.cBarHandel,'ylabel'),'interpreter','none'); + end + end + + + %% plot iso dose lines + if get(handles.radiobtnIsoDoseLines,'Value') + plotLabels = get(handles.radiobtnIsoDoseLinesLabels,'Value') == 1; + + %Sanity Check for Contours, which actually should have been + %computed before calling UpdatePlot + if ~isfield(handles.IsoDose,'Contours') + try + handles.IsoDose.Contours = matRad_computeIsoDoseContours(dose,handles.IsoDose.Levels); + catch + %If the computation didn't work, we set the field to + %empty, which will force matRad_plotIsoDoseLines to use + %matlabs contour function instead of repeating the + %failing computation every time + handles.IsoDose.Contours = []; + warning('Could not compute isodose lines! Will try slower contour function!'); + end + end + AxesHandlesIsoDose = matRad_plotIsoDoseLines(handles.axesFig,dose,handles.IsoDose.Contours,handles.IsoDose.Levels,plotLabels,plane,slice,doseMap,handles.dispWindow{doseIx,1},'LineWidth',1.5); + end +end + +selectIx = get(handles.popupmenu_chooseColorData,'Value'); +set(handles.txtMinVal,'String',num2str(handles.dispWindow{selectIx,2}(1,1))); +set(handles.txtMaxVal,'String',num2str(handles.dispWindow{selectIx,2}(1,2))); + +%% plot VOIs +if get(handles.radiobtnContour,'Value') && get(handles.popupTypeOfPlot,'Value')==1 && handles.State>0 + AxesHandlesVOI = [AxesHandlesVOI matRad_plotVoiContourSlice(handles.axesFig,cst,ct,1,handles.VOIPlotFlag,plane,slice,[],'LineWidth',2)]; +end + +%% Set axis labels and plot iso center +matRad_plotAxisLabels(handles.axesFig,ct,plane,slice,defaultFontSize); + +if get(handles.radioBtnIsoCenter,'Value') == 1 && get(handles.popupTypeOfPlot,'Value') == 1 && ~isempty(pln) + hIsoCenterCross = matRad_plotIsoCenterMarker(handles.axesFig,pln,ct,plane,slice); +end + +if get(handles.radiobtnPlan,'value') == 1 && ~isempty(pln) + matRad_plotProjectedGantryAngles(handles.axesFig,pln,ct,plane); +end + +% the following line ensures the plotting order (optional) +% set(gca,'Children',[AxesHandlesCT_Dose hIsoCenterCross AxesHandlesIsoDose AxesHandlesVOI ]); + +%set axis ratio +ratios = [1/ct.resolution.x 1/ct.resolution.y 1/ct.resolution.z]; +set(handles.axesFig,'DataAspectRatioMode','manual'); +if plane == 1 + res = [ratios(3) ratios(2)]./max([ratios(3) ratios(2)]); + set(handles.axesFig,'DataAspectRatio',[res 1]) +elseif plane == 2 % sagittal plane + res = [ratios(3) ratios(1)]./max([ratios(3) ratios(1)]); + set(handles.axesFig,'DataAspectRatio',[res 1]) +elseif plane == 3 % Axial plane + res = [ratios(2) ratios(1)]./max([ratios(2) ratios(1)]); + set(handles.axesFig,'DataAspectRatio',[res 1]) +end + + +%% profile plot +if get(handles.popupTypeOfPlot,'Value') == 2 && exist('Result','var') + % set SAD + fileName = [pln.radiationMode '_' pln.machine]; + try + load(fileName); + SAD = machine.meta.SAD; + catch + error(['Could not find the following machine file: ' fileName ]); + end + + % clear view and initialize some values + cla(handles.axesFig,'reset') + set(gca,'YDir','normal'); + ylabel('{\color{black}dose [Gy]}') + cColor={'black','green','magenta','cyan','yellow','red','blue'}; + + % Rotate the system into the beam. + % passive rotation & row vector multiplication & inverted rotation requires triple matrix transpose + rotMat_system_T = transpose(matRad_getRotationMatrix(pln.propStf.gantryAngles(handles.selectedBeam),pln.propStf.couchAngles(handles.selectedBeam))); + + if strcmp(handles.ProfileType,'longitudinal') + sourcePointBEV = [handles.profileOffset -SAD 0]; + targetPointBEV = [handles.profileOffset SAD 0]; + elseif strcmp(handles.ProfileType,'lateral') + sourcePointBEV = [-SAD handles.profileOffset 0]; + targetPointBEV = [ SAD handles.profileOffset 0]; + end + + rotSourcePointBEV = sourcePointBEV * rotMat_system_T; + rotTargetPointBEV = targetPointBEV * rotMat_system_T; + + % perform raytracing on the central axis of the selected beam, use unit + % electron density for plotting against the geometrical depth + [~,l,rho,~,ix] = matRad_siddonRayTracer(pln.propStf.isoCenter(handles.selectedBeam,:),ct.resolution,rotSourcePointBEV,rotTargetPointBEV,{0*ct.cubeHU{1}+1}); + d = [0 l .* rho{1}]; + % Calculate accumulated d sum. + vX = cumsum(d(1:end-1)); + + % this step is necessary if visualization is set to profile plot + % and another optimization is carried out - set focus on GUI + figHandles = get(0,'Children'); + idxHandle = []; + if ~isempty(figHandles) + v=version; + if str2double(v(1:3))>= 8.5 + idxHandle = strcmp({figHandles(:).Name},'matRadGUI'); + else + idxHandle = strcmp(get(figHandles,'Name'),'matRadGUI'); + end + end + figure(figHandles(idxHandle)); + + % plot physical dose + Content = get(handles.popupDisplayOption,'String'); + SelectedCube = Content{get(handles.popupDisplayOption,'Value')}; + if sum(strcmp(SelectedCube,{'physicalDose','effect','RBExDose','alpha','beta','RBE'})) > 0 + Suffix = ''; + else + Idx = find(SelectedCube == '_'); + Suffix = SelectedCube(Idx:end); + end + + mPhysDose = Result.(['physicalDose' Suffix]); + PlotHandles{1} = plot(handles.axesFig,vX,mPhysDose(ix),'color',cColor{1,1},'LineWidth',3); hold on; + PlotHandles{1,2} ='physicalDose'; + ylabel(handles.axesFig,'dose in [Gy]'); + set(handles.axesFig,'FontSize',defaultFontSize); + + % plot counter + Cnt=2; + + if isfield(Result,['RBE' Suffix]) + + %disbale specific plots + %DispInfo{6,2}=0; + %DispInfo{5,2}=0; + %DispInfo{2,2}=0; + + % generate two lines for ylabel + StringYLabel1 = '\fontsize{8}{\color{red}RBE x dose [Gy(RBE)] \color{black}dose [Gy] '; + StringYLabel2 = ''; + for i=1:1:size(DispInfo,1) + if DispInfo{i,2} && sum(strcmp(DispInfo{i,1},{['effect' Suffix],['alpha' Suffix],['beta' Suffix]})) > 0 + %physicalDose is already plotted and RBExD vs RBE is plotted later with plotyy + if ~strcmp(DispInfo{i,1},['RBExDose' Suffix]) &&... + ~strcmp(DispInfo{i,1},['RBE' Suffix]) && ... + ~strcmp(DispInfo{i,1},['physicalDose' Suffix]) + + mCube = Result.([DispInfo{i,1}]); + PlotHandles{Cnt,1} = plot(handles.axesFig,vX,mCube(ix),'color',cColor{1,Cnt},'LineWidth',3);hold on; + PlotHandles{Cnt,2} = DispInfo{i,1}; + StringYLabel2 = [StringYLabel2 ' \color{' cColor{1,Cnt} '}' DispInfo{i,1} ' [' DispInfo{i,3} ']']; + Cnt = Cnt+1; + end + end + end + StringYLabel2 = [StringYLabel2 '}']; + % always plot RBExD against RBE + mRBExDose = Result.(['RBExDose' Suffix]); + vBED = mRBExDose(ix); + mRBE = Result.(['RBE' Suffix]); + vRBE = mRBE(ix); + + % plot biological dose against RBE + [ax, PlotHandles{Cnt,1}, PlotHandles{Cnt+1,1}]=plotyy(handles.axesFig,vX,vBED,vX,vRBE,'plot');hold on; + PlotHandles{Cnt,2}='RBExDose'; + PlotHandles{Cnt+1,2}='RBE'; + + % set plotyy properties + set(get(ax(2),'Ylabel'),'String','RBE [a.u.]','FontSize',8); + ylabel({StringYLabel1;StringYLabel2}) + set(PlotHandles{Cnt,1},'Linewidth',4,'color','r'); + set(PlotHandles{Cnt+1,1},'Linewidth',3,'color','b'); + set(ax(1),'ycolor','r') + set(ax(2),'ycolor','b') + set(ax,'FontSize',8); + Cnt=Cnt+2; + end + + % asses target coordinates + tmpPrior = intmax; + tmpSize = 0; + for i=1:size(cst,1) + if strcmp(cst{i,3},'TARGET') && tmpPrior >= cst{i,5}.Priority && tmpSize 0 + AllVarNames = evalin('base','who'); + if ismember('resultGUI',AllVarNames) + Result = evalin('base','resultGUI'); + end + + if ismember('stf',AllVarNames) + stf = evalin('base','stf'); + else + stf = []; + end + + ct = evalin('base','ct'); + cst = evalin('base','cst'); + pln = evalin('base','pln'); +end + +oldView = get(axesFig3D,'View'); + +cla(axesFig3D); +%delete(allchild(axesFig3D)); + +%test = allchild(axesFig3D); + +plane = get(handles.popupPlane,'Value'); +slice = round(get(handles.sliderSlice,'Value')); +defaultFontSize = 8; + +%Check if we need to precompute the surface data +if size(cst,2) < 8 + cst = matRad_computeAllVoiSurfaces(ct,cst); + assignin('base','cst',cst); +end + +set(fig3D,'Color',0.5*[1 1 1]); +set(axesFig3D,'Color',1*[0 0 0]); + +%% Plot 3D structures +hold(axesFig3D,'on'); +if get(handles.radiobtnContour,'Value') && handles.State>0 + voiPatches = matRad_plotVois3D(axesFig3D,ct,cst,handles.VOIPlotFlag,colorcube); +end + +%% plot the CT slice +if get(handles.radiobtnCT,'Value') + window = handles.dispWindow{2,1}; %(2 for ct) + ctMap = matRad_getColormap(handles.ctColorMap,handles.cMapSize); + ctHandle = matRad_plotCtSlice3D(axesFig3D,ct,1,plane,slice,ctMap,window); +end + +%% plot the dose slice +if handles.State >= 1 && exist('Result','var') + doseMap = matRad_getColormap(handles.doseColorMap,handles.cMapSize); + doseIx = 3; + % if the selected display option doesn't exist then simply display + % the first cube of the Result struct + if ~isfield(Result,handles.SelectedDisplayOption) + CubeNames = fieldnames(Result); + handles.SelectedDisplayOption = CubeNames{1,1}; + end + + dose = Result.(handles.SelectedDisplayOption); + + % dose colorwash + if ~isempty(dose) && ~isvector(dose) + + if isempty(handles.dispWindow{doseIx,2}) + handles.dispWindow{doseIx,2} = [min(dose(:)) max(dose(:))]; % set min and max dose values + end + + if get(handles.radiobtnDose,'Value') + [doseHandle,~,handles.dispWindow{doseIx,1}] = matRad_plotDoseSlice3D(axesFig3D,ct,dose,plane,slice,handles.CutOffLevel,handles.doseOpacity,doseMap,handles.dispWindow{doseIx,1}); + end + if get(handles.radiobtnIsoDoseLines,'Value') + matRad_plotIsoDoseLines3D(axesFig3D,ct,dose,handles.IsoDose.Contours,handles.IsoDose.Levels,plane,slice,doseMap,handles.dispWindow{doseIx,1},'LineWidth',1.5); + end + end +end + +if get(handles.radiobtnPlan,'Value') + matRad_plotPlan3D(axesFig3D,pln,stf); +end + +%hLight = light('Parent',axesFig3D); +%camlight(hLight,'left'); +%lighting('gouraud'); + +xlabel(axesFig3D,'x [voxels]','FontSize',defaultFontSize) +ylabel(axesFig3D,'y [voxels]','FontSize',defaultFontSize) +zlabel(axesFig3D,'z [voxels]','FontSize',defaultFontSize) +title(axesFig3D,'matRad 3D view'); + +% set axis ratio +ratios = [1 1 1]; %[1/ct.resolution.x 1/ct.resolution.y 1/ct.resolution.z]; +ratios = ratios([2 1 3]); +set(axesFig3D,'DataAspectRatioMode','manual'); +set(axesFig3D,'DataAspectRatio',ratios./max(ratios)); + +set(axesFig3D,'Ydir','reverse'); + +set(axesFig3D,'view',oldView); + + +% --- Executes on selection change in popupPlane. +function popupPlane_Callback(hObject, ~, handles) +% hObject handle to popupPlane (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: contents = cellstr(get(hObject,'String')) returns popupPlane contents as cell array +% contents{get(hObject,'Value')} returns selected item from popupPlane + +% set slice slider +handles.plane = get(handles.popupPlane,'value'); +try + if handles.State > 0 + ct = evalin('base', 'ct'); + set(handles.sliderSlice,'Min',1,'Max',ct.cubeDim(handles.plane),... + 'SliderStep',[1/(ct.cubeDim(handles.plane)-1) 1/(ct.cubeDim(handles.plane)-1)]); + if handles.State < 3 + set(handles.sliderSlice,'Value',round(ct.cubeDim(handles.plane)/2)); + else + pln = evalin('base','pln'); + + if handles.plane == 1 + set(handles.sliderSlice,'Value',ceil(pln.propStf.isoCenter(1,2)/ct.resolution.x)); + elseif handles.plane == 2 + set(handles.sliderSlice,'Value',ceil(pln.propStf.isoCenter(1,1)/ct.resolution.y)); + elseif handles.plane == 3 + set(handles.sliderSlice,'Value',ceil(pln.propStf.isoCenter(1,3)/ct.resolution.z)); + end + + end + end +catch +end + +handles.rememberCurrAxes = false; +UpdatePlot(handles); +handles.rememberCurrAxes = true; +guidata(hObject,handles); + +% --- Executes on slider movement. +function sliderSlice_Callback(~, ~, handles) +% hObject handle to sliderSlice (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider +UpdatePlot(handles) + +% --- Executes on button press in radiobtnContour. +function radiobtnContour_Callback(~, ~, handles) +% hObject handle to radiobtnContour (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hint: get(hObject,'Value') returns toggle state of radiobtnContour +UpdatePlot(handles) + +% --- Executes on button press in radiobtnDose. +function radiobtnDose_Callback(~, ~, handles) +% hObject handle to radiobtnDose (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hint: get(hObject,'Value') returns toggle state of radiobtnDose +UpdatePlot(handles) + +% --- Executes on button press in radiobtnIsoDoseLines. +function radiobtnIsoDoseLines_Callback(~, ~, handles) +% hObject handle to radiobtnIsoDoseLines (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hint: get(hObject,'Value') returns toggle state of radiobtnIsoDoseLines +UpdatePlot(handles) + +% --- Executes on button press in btnOptimize. +function btnOptimize_Callback(hObject, eventdata, handles) +% hObject handle to btnOptimize (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +try + % indicate that matRad is busy + % change mouse pointer to hour glass + Figures = gcf;%findobj('type','figure'); + set(Figures, 'pointer', 'watch'); + drawnow; + % disable all active objects + InterfaceObj = findobj(Figures,'Enable','on'); + set(InterfaceObj,'Enable','off'); + % wait until the table is updated + btnTableSave_Callback([],[],handles); %We don't need it? + + + % if a critical change to the cst has been made which affects the dij matrix + if handles.DijCalcWarning == true + + choice = questdlg('Overlap priorites of OAR constraints have been edited, a new OAR VOI was added or a critical row constraint was deleted. A new Dij calculation might be necessary.', ... + 'Title','Cancel','Calculate Dij then Optimize','Optimze directly','Optimze directly'); + + switch choice + case 'Cancel' + set(Figures, 'pointer', 'arrow'); + set(InterfaceObj,'Enable','on'); + guidata(hObject,handles); + return; + case 'Calculate dij again and optimize' + handles.DijCalcWarning = false; + btnCalcDose_Callback(hObject, eventdata, handles) + case 'Optimze directly' + handles.DijCalcWarning = false; + end + end + + pln = evalin('base','pln'); + ct = evalin('base','ct'); + + % optimize + if get(handles.radiobutton3Dconf,'Value') && strcmp(handles.Modalities{get(handles.popupRadMode,'Value')},'photons') + % conformal plan if photons and 3d conformal + if ~matRad_checkForConnectedBixelRows(evalin('base','stf')) + error('disconnetced dose influence data in BEV - run dose calculation again with consistent settings'); + end + [resultGUIcurrentRun,usedOptimizer] = matRad_fluenceOptimization(matRad_collapseDij(evalin('base','dij')),evalin('base','cst'),pln); + resultGUIcurrentRun.w = resultGUIcurrentRun.w * ones(evalin('base','dij.totalNumOfBixels'),1); + resultGUIcurrentRun.wUnsequenced = resultGUIcurrentRun.w; + else + if pln.propOpt.runDAO + if ~matRad_checkForConnectedBixelRows(evalin('base','stf')) + error('disconnetced dose influence data in BEV - run dose calculation again with consistent settings'); + end + end + + [resultGUIcurrentRun,usedOptimizer] = matRad_fluenceOptimization(evalin('base','dij'),evalin('base','cst'),pln); + end + + %if resultGUI already exists then overwrite the "standard" fields + AllVarNames = evalin('base','who'); + if ismember('resultGUI',AllVarNames) + resultGUI = evalin('base','resultGUI'); + sNames = fieldnames(resultGUIcurrentRun); + oldNames = fieldnames(resultGUI); + if(length(oldNames) > length(sNames)) + for j = 1:length(oldNames) + if strfind(oldNames{j}, 'beam') + resultGUI = rmfield(resultGUI, oldNames{j}); + end + end + end + for j = 1:length(sNames) + resultGUI.(sNames{j}) = resultGUIcurrentRun.(sNames{j}); + end + else + resultGUI = resultGUIcurrentRun; + end + assignin('base','resultGUI',resultGUI); + + % set some values + if handles.plane == 1 + set(handles.sliderSlice,'Value',ceil(pln.propStf.isoCenter(1,2)/ct.resolution.x)); + elseif handles.plane == 2 + set(handles.sliderSlice,'Value',ceil(pln.propStf.isoCenter(1,1)/ct.resolution.y)); + elseif handles.plane == 3 + set(handles.sliderSlice,'Value',ceil(pln.propStf.isoCenter(1,3)/ct.resolution.z)); + end + + handles.State = 3; + handles.SelectedDisplayOptionIdx = 1; + if strcmp(pln.radiationMode,'carbon') || (strcmp(pln.radiationMode,'protons') && strcmp(pln.propOpt.bioOptimization,'const_RBExD')) + handles.SelectedDisplayOption = 'RBExDose'; + else + handles.SelectedDisplayOption = 'physicalDose'; + end + handles.selectedBeam = 1; + % check IPOPT status and return message for GUI user if no DAO or + % particles + if ~pln.propOpt.runDAO || ~strcmp(pln.radiationMode,'photons') + CheckOptimizerStatus(usedOptimizer,'Fluence') + end + +catch ME + handles = showError(handles,'OptimizeCallback: Could not optimize!',ME); + % change state from busy to normal + set(Figures, 'pointer', 'arrow'); + set(InterfaceObj,'Enable','on'); + guidata(hObject,handles); + return; +end + +% perform sequencing and DAO +try + + %% sequencing + if strcmp(pln.radiationMode,'photons') && (pln.propOpt.runSequencing || pln.propOpt.runDAO) + % resultGUI = matRad_xiaLeafSequencing(resultGUI,evalin('base','stf'),evalin('base','dij')... + % ,get(handles.editSequencingLevel,'Value')); + % resultGUI = matRad_engelLeafSequencing(resultGUI,evalin('base','stf'),evalin('base','dij')... + % ,str2double(get(handles.editSequencingLevel,'String'))); + resultGUI = matRad_siochiLeafSequencing(resultGUI,evalin('base','stf'),evalin('base','dij')... + ,str2double(get(handles.editSequencingLevel,'String'))); + + assignin('base','resultGUI',resultGUI); + end + +catch ME + handles = showError(handles,'OptimizeCallback: Could not perform sequencing',ME); + % change state from busy to normal + set(Figures, 'pointer', 'arrow'); + set(InterfaceObj,'Enable','on'); + guidata(hObject,handles); + return; +end + +try + %% DAO + if strcmp(pln.radiationMode,'photons') && pln.propOpt.runDAO + handles = showWarning(handles,['Observe: You are running direct aperture optimization' filesep 'This is experimental code that has not been thoroughly debugged - especially in combination with constrained optimization.']); + [resultGUI,usedOptimizer] = matRad_directApertureOptimization(evalin('base','dij'),evalin('base','cst'),... + resultGUI.apertureInfo,resultGUI,pln); + assignin('base','resultGUI',resultGUI); + % check IPOPT status and return message for GUI user + CheckOptimizerStatus(usedOptimizer,'DAO'); + end + + if strcmp(pln.radiationMode,'photons') && (pln.propOpt.runSequencing || pln.propOpt.runDAO) + matRad_visApertureInfo(resultGUI.apertureInfo); + end + +catch ME + handles = showError(handles,'OptimizeCallback: Could not perform direct aperture optimization',ME); + % change state from busy to normal + set(Figures, 'pointer', 'arrow'); + set(InterfaceObj,'Enable','on'); + guidata(hObject,handles); + return; +end + +% change state from busy to normal +set(Figures, 'pointer', 'arrow'); +set(InterfaceObj,'Enable','on'); +handles.dispWindow{3,1} = []; % reset dose ranges +handles.dispWindow{3,2} = []; % reset min max dose values +handles.rememberCurrAxes = false; +handles.IsoDose.Levels = 0; % ensure to use default iso dose line spacing +handles.cBarChanged = true; + +guidata(hObject,handles); +handles = updateIsoDoseLineCache(handles); +UpdateState(handles); +UpdatePlot(handles); +handles.rememberCurrAxes = true; +guidata(hObject,handles); + + +% the function CheckValidityPln checks if the provided plan is valid so +% that it can be used further on for optimization +function FlagValid = CheckValidityPln(cst) + +FlagValid = true; +%check if mean constraint is always used in combination +for i = 1:size(cst,1) + if ~isempty(cst{i,6}) + if ~isempty(strfind([cst{i,6}.type],'mean')) && isempty(strfind([cst{i,6}.type],'square')) + FlagValid = false; + warndlg('mean constraint needs to be defined in addition to a second constraint (e.g. squared deviation)'); + break + end + end +end + + +% --- Executes on selection change in popupTypeOfPlot +function popupTypeOfPlot_Callback(hObject, ~, handles) + + % intensity plot +if get(hObject,'Value') == 1 + + set(handles.sliderBeamSelection,'Enable','off') + set(handles.sliderOffset,'Enable','off') + set(handles.popupDisplayOption,'Enable','on') + set(handles.btnProfileType,'Enable','off'); + set(handles.popupPlane,'Enable','on'); + set(handles.radiobtnCT,'Enable','on'); + set(handles.radiobtnContour,'Enable','on'); + set(handles.radiobtnDose,'Enable','on'); + set(handles.radiobtnIsoDoseLines,'Enable','on'); + set(handles.radiobtnIsoDoseLinesLabels,'Enable','on'); + set(handles.sliderSlice,'Enable','on'); + +% profile plot +elseif get(hObject,'Value') == 2 + + if handles.State > 0 + if length(parseStringAsNum(get(handles.editGantryAngle,'String'),true)) > 1 + + set(handles.sliderBeamSelection,'Enable','on'); + handles.selectedBeam = 1; + pln = evalin('base','pln'); + set(handles.sliderBeamSelection,'Min',handles.selectedBeam,'Max',pln.propStf.numOfBeams,... + 'Value',handles.selectedBeam,... + 'SliderStep',[1/(pln.propStf.numOfBeams-1) 1/(pln.propStf.numOfBeams-1)],... + 'Enable','on'); + + else + handles.selectedBeam = 1; + end + + handles.profileOffset = get(handles.sliderOffset,'Value'); + + vMinMax = [-100 100]; + vRange = sum(abs(vMinMax)); + + ct = evalin('base','ct'); + if strcmp(get(handles.btnProfileType,'String'),'lateral') + SliderStep = vRange/ct.resolution.x; + else + SliderStep = vRange/ct.resolution.y; + end + + set(handles.sliderOffset,'Min',vMinMax(1),'Max',vMinMax(2),... + 'Value',handles.profileOffset,... + 'SliderStep',[1/SliderStep 1/SliderStep],... + 'Enable','on'); + end + + + set(handles.popupDisplayOption,'Enable','on'); + set(handles.btnProfileType,'Enable','on'); + set(handles.popupPlane,'Enable','off'); + set(handles.radiobtnCT,'Enable','off'); + set(handles.radiobtnContour,'Enable','off'); + set(handles.radiobtnDose,'Enable','off'); + set(handles.radiobtnIsoDoseLines,'Enable','off'); + set(handles.sliderSlice,'Enable','off'); + set(handles.radiobtnIsoDoseLinesLabels,'Enable','off'); + + + set(handles.btnProfileType,'Enable','on') + + if strcmp(get(handles.btnProfileType,'String'),'lateral') + handles.ProfileType = 'longitudinal'; + else + handles.ProfileType = 'lateral'; + end + +end + +handles.cBarChanged = true; + +handles.rememberCurrAxes = false; +cla(handles.axesFig,'reset'); +UpdatePlot(handles); +handles.rememberCurrAxes = true; +guidata(hObject, handles); + +% --- Executes on selection change in popupDisplayOption. +function popupDisplayOption_Callback(hObject, ~, handles) +content = get(hObject,'String'); +handles.SelectedDisplayOption = content{get(hObject,'Value'),1}; +handles.SelectedDisplayOptionIdx = get(hObject,'Value'); +%handles.dispWindow{3,1} = []; handles.dispWindow{3,2} = []; + +if ~isfield(handles,'colormapLocked') || ~handles.colormapLocked + handles.dispWindow{3,1} = []; handles.dispWindow{3,2} = []; +end + +handles = updateIsoDoseLineCache(handles); +handles.cBarChanged = true; +guidata(hObject, handles); +UpdatePlot(handles); +guidata(hObject, handles); + +% --- Executes on slider movement. +function sliderBeamSelection_Callback(hObject, ~, handles) +% hObject handle to sliderBeamSelection (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +handles.selectedBeam = round(get(hObject,'Value')); +set(hObject, 'Value', handles.selectedBeam); +handles.rememberCurrAxes = false; +UpdatePlot(handles); +handles.rememberCurrAxes = true; +guidata(hObject,handles); + +% --- Executes on button press in btnProfileType. +function btnProfileType_Callback(hObject, ~, handles) +% hObject handle to btnProfileType (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +if strcmp(get(hObject,'Enable') ,'on') + if strcmp(handles.ProfileType,'lateral') + handles.ProfileType = 'longitudinal'; + set(hObject,'String','lateral'); + else + handles.ProfileType = 'lateral'; + set(hObject,'String','longitudinal'); + end + + handles.rememberCurrAxes = false; + UpdatePlot(handles); + handles.rememberCurrAxes = true; + + guidata(hObject, handles); + +end + + + +function Flag = getCstTable (handles) + +data = get(handles.uiTable,'Data'); +OldCst = evalin('base','cst'); +NewCst=[]; +Cnt=1; +FlagValidParameters = true; + +%% generate new cst from GUI +for i = 1:size(OldCst,1) + CntObjF = 1; + FlagFound = false; + for j = 1:size(data,1) + + if strcmp(OldCst{i,2},data{j,1}) + FlagFound = true; + + if CntObjF == 1 + %VOI + if isempty(data{j,1}) || ~isempty(strfind(data{j,1}, 'Select')) + FlagValidParameters=false; + else + NewCst{Cnt,1}=data{j,1}; + end + %VOI Type + if isempty(data{j,2})|| ~isempty(strfind(data{j,2}, 'Select')) + FlagValidParameters=false; + else + NewCst{Cnt,2}=data{j,2}; + end + %Priority + if isempty(data{j,3}) + FlagValidParameters=false; + else + NewCst{Cnt,3}=data{j,3}; + end + end + + % Obj Func / constraint + if isempty(data{j,4}) ||~isempty(strfind(data{j,4}, 'Select')) + FlagValidParameters=false; + else + NewCst{Cnt,4}(CntObjF,1).type = data{j,4}; + end + + % get further parameter + if FlagValidParameters + + NewCst{Cnt,4}(CntObjF,1).dose = data{j,6}; + NewCst{Cnt,4}(CntObjF,1).penalty = data{j,5}; + NewCst{Cnt,4}(CntObjF,1).EUD = data{j,7}; + NewCst{Cnt,4}(CntObjF,1).volume = data{j,8}; + NewCst{Cnt,4}(CntObjF,1).robustness = data{j,9}; + + end + + CntObjF = CntObjF+1; + + end + + end + + if FlagFound == true + Cnt = Cnt +1; + end + +end + +if FlagValidParameters + + for m=1:size(OldCst,1) + VOIexist = OldCst(m,2); + boolChanged = false; + + for n = 1:size(NewCst,1) + + VOIGUI = NewCst(n,1); + + if strcmp(VOIexist,VOIGUI) + % overite existing objectives + boolChanged = true; + OldCst(m,6) = NewCst(n,4); + OldCst(m,3) = NewCst(n,2); + OldCst{m,5}.Priority = NewCst{n,3}; + break; + end + end + + if ~boolChanged + OldCst{m,6}=[]; + end + + end + assignin('base','cst',OldCst); + Flag = true; + +else + warndlg('not all values are set - cannot start dose calculation'); + Flag = false; +end + + +% --- Executes on button press in btnuiTableAdd. +function btnuiTableAdd_Callback(hObject, ~, handles) +% hObject handle to btnuiTableAdd (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +data = get(handles.uiTable, 'data'); +sEnd = size(data,1); +data{sEnd+1,1} = 'Select VOI'; +data{sEnd+1,2} = 'Select VOI Type'; +data{sEnd+1,4} = 'Select obj func/constraint'; +data{sEnd+1,9} = 'none'; + +set(handles.uiTable,'data',data); + +%handles.State=1; +guidata(hObject,handles); +UpdateState(handles); + + +% --- Executes on button press in btnuiTableDel. +function btnuiTableDel_Callback(hObject, eventdata, handles) +% hObject handle to btnuiTableDel (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +data = get(handles.uiTable, 'data'); +Index = get(handles.uiTable,'UserData'); +mask = (1:size(data,1))'; +mask(Index(:,1))=[]; +cst = evalin('base','cst'); +% if all rows have been deleted or a target voi was removed +if size(data,1)==1 || strcmp(data(Index(1),2),'TARGET') + handles.State=1; +end + +try + Idx = find(strcmp(cst(:,2),data(Index(1),1))); + % if OAR was removed then show a warning + if strcmp(data(Index(1),2),'OAR') && length(cst{Idx,6})<=1 + handles.DijCalcWarning =true; + end +catch +end +data=data(mask,:); +set(handles.uiTable,'data',data); +guidata(hObject,handles); +UpdateState(handles); +btnTableSave_Callback(hObject, eventdata, handles); + +% --- Executes when selected cell(s) is changed in uiTable. +function uiTable_CellSelectionCallback(hObject, eventdata, ~) +% hObject handle to uiTable (see GCBO) +% eventdata structure with the following fields (see MATLAB.UI.CONTROL.TABLE) +% Indices: row and column indices of the cell(s) currently selecteds +% handles structure with handles and user data (see GUIDATA) +index = eventdata.Indices; + if any(index) %loop necessary to surpress unimportant errors. + set(hObject,'UserData',index); + end + + +% --- Executes when entered data in editable cell(s) in uiTable. +function uiTable_CellEditCallback(hObject, eventdata, handles) +% hObject handle to uiTable (see GCBO) +% eventdata structure with the following fields (see MATLAB.UI.CONTROL.TABLE) +% Indices: row and column indices of the cell(s) edited +% PreviousData: previous data for the cell(s) edited +% EditData: string(s) entered by the user +% NewData: EditData or its converted form set on the Data property. Empty if Data was not changed +% Error: error string when failed to convert EditData to appropriate value for Data +% handles structure with handles and user data (see GUIDATA) + +Placeholder = NaN; +PlaceholderRob = 'none'; + +% get table data and current index of cell +if isempty(eventdata) + data = get(handles.uiTable,'Data'); + Index = get(handles.uiTable,'UserData'); + + if ~isempty(Index) && size(Index,1)==1 + % if this callback was invoked by calculate dij button, eventdata is empty + % and needs to be set manually + try + % if row gots deleted then index is pointing to non existing + % data + if size(data,1) check if objective function still makes sense +if eventdata.Indices(2) == 2 + + if strcmp(eventdata.NewData,'OAR') + + if sum(strcmp({'square deviation','square underdosing'},data{eventdata.Indices(1),4}))>0 + data{eventdata.Indices(1),4} = 'square overdosing'; + end + + else + + if sum(strcmp({'EUD','mean'},data{eventdata.Indices(1),4}))>0 + data{eventdata.Indices(1),4} = 'square deviation'; + end + + end +end +%% if objective function was changed -> check if VOI Type still makes sense +if eventdata.Indices(2) == 4 + ObjFunction = eventdata.NewData; +else + ObjFunction = data{eventdata.Indices(1),4}; +end + + +if eventdata.Indices(2) == 4 + if sum(strcmp(eventdata.NewData,{'square deviation','square underdosing','min dose constraint',... + 'min mean dose constraint','min DVH constraint','min DVH objective'})) > 0 + + if strcmp('OAR',data{eventdata.Indices(1),2}) + data{eventdata.Indices(1),4} = 'square overdosing'; + ObjFunction = 'square overdosing'; + if isnan(data{eventdata.Indices(1),5}) + data{eventdata.Indices(1),5} = 1; + end + end + + tmpDose = parseStringAsNum(data{eventdata.Indices(1),6},true); + if numel(tmpDose) == 2 + data{eventdata.Indices(1),6} = num2str(tmpDose(1)); + end + + elseif strcmp(eventdata.NewData,'mean') + + if strcmp('TARGET',data{eventdata.Indices(1),2}) + data{eventdata.Indices(1),4} = 'square deviation'; + end + + end +end + +%% set fields to NaN according to objective function + +if sum(strcmp(ObjFunction, {'square underdosing','square overdosing','square deviation'})) > 0 + + for k = [5 6] + if isnan(data{eventdata.Indices(1),k}) + data{eventdata.Indices(1),k} = 1; + end + end + data{eventdata.Indices(1),7} = Placeholder; + data{eventdata.Indices(1),8} = Placeholder; + data{eventdata.Indices(1),9} = PlaceholderRob; + +elseif strcmp(ObjFunction,'mean') + + if isnan(data{eventdata.Indices(1),5}) + data{eventdata.Indices(1),5} = 1; + end + data{eventdata.Indices(1),6} = Placeholder; + data{eventdata.Indices(1),7} = Placeholder; + data{eventdata.Indices(1),8} = Placeholder; + data{eventdata.Indices(1),9} = PlaceholderRob; + +elseif strcmp(ObjFunction,'EUD') + + for k = [5 7] + if isnan(data{eventdata.Indices(1),k}) + data{eventdata.Indices(1),k} = 1; + end + end + data{eventdata.Indices(1),6} = Placeholder; + data{eventdata.Indices(1),8} = Placeholder; + data{eventdata.Indices(1),9} = PlaceholderRob; + +elseif sum(strcmp(ObjFunction,{'min dose constraint','max dose constraint'... + 'min mean dose constraint','max mean dose constraint'}))> 0 + + if isnan(data{eventdata.Indices(1),6}) + data{eventdata.Indices(1),6} = 1; + end + data{eventdata.Indices(1),5} = Placeholder; + data{eventdata.Indices(1),7} = Placeholder; + data{eventdata.Indices(1),8} = Placeholder; + data{eventdata.Indices(1),9} = PlaceholderRob; + +elseif sum(strcmp(ObjFunction,{'min EUD constraint','max EUD constraint'}) ) > 0 + + if isnan(data{eventdata.Indices(1),7}) + data{eventdata.Indices(1),7} = 1; + end + data{eventdata.Indices(1),5} = Placeholder; + data{eventdata.Indices(1),6} = Placeholder; + data{eventdata.Indices(1),8} = Placeholder; + data{eventdata.Indices(1),9} = PlaceholderRob; + +elseif sum(strcmp(ObjFunction,{'min DVH constraint','max DVH constraint'}) ) > 0 + + for k = [6 8] + if isnan(data{eventdata.Indices(1),k}) + data{eventdata.Indices(1),k} = 1; + end + end + data{eventdata.Indices(1),5} = Placeholder; + data{eventdata.Indices(1),7} = Placeholder; + data{eventdata.Indices(1),9} = PlaceholderRob; + +elseif sum(strcmp(ObjFunction,{'min DVH objective','max DVH objective'}) ) > 0 + + for k = [5 6 8] + if isnan(data{eventdata.Indices(1),k}) + data{eventdata.Indices(1),k} = 1; + end + end + data{eventdata.Indices(1),7} = Placeholder; + data{eventdata.Indices(1),9} = PlaceholderRob; + +end + +%% check if input is a valid +%check if overlap, penalty and and parameters are numbers +if (eventdata.Indices(2) == 3 || eventdata.Indices(2) == 5 || eventdata.Indices(2) == 6 || eventdata.Indices(2) == 7 || eventdata.Indices(2) == 8) ... + && ~isempty(eventdata.NewData) + if CheckValidity(eventdata.NewData) == false + data{eventdata.Indices(1),eventdata.Indices(2)} = eventdata.PreviousData; + end +end + + +%% if VOI was changed then change VOI type and overlap according to new VOI +if eventdata.Indices(2) == 1 && eventdata.Indices(1) == size(data,1) + for i = 1:size(data,1) + if strcmp(eventdata.NewData,data{i,1}) + data{eventdata.Indices(1),2}=data{i,2}; + data{eventdata.Indices(1),3}=data{i,3}; + end + end + +end + +%% set VOI type and priority according to existing definitions +for i=1:size(data,1) + if i~=eventdata.Indices(1) && strcmp(data(i,1),data(eventdata.Indices(1))) + data{i,2} = data{eventdata.Indices(1),2}; + data{i,3} = data{eventdata.Indices(1),3}; + end +end + + +if isnan(eventdata.NewData) + data{eventdata.Indices(1),eventdata.Indices(2)} = eventdata.PreviousData; +end + + +set(handles.txtInfo,'String','plan changed'); +set(handles.uiTable,'data',data); +guidata(hObject, handles); +UpdateState(handles); + +% enables/ disables buttons according to the current state +function UpdateState(handles) + +if handles.State > 0 + pln = evalin('base','pln'); + + if strcmp(pln.radiationMode,'carbon') + set(handles.popMenuBioOpt,'Enable','on'); + set(handles.btnSetTissue,'Enable','on'); + elseif strcmp(pln.radiationMode,'protons') + set(handles.popMenuBioOpt,'Enable','on'); + set(handles.btnSetTissue,'Enable','off'); + else + set(handles.popMenuBioOpt,'Enable','off'); + set(handles.btnSetTissue,'Enable','off'); + end + + cMapControls = allchild(handles.uipanel_colormapOptions); + for runHandles = cMapControls + set(runHandles,'Enable','on'); + end +end + +if handles.cubeHUavailable + cMapOptionsSelectList = {'None','CT (HU)','Result (i.e. dose)'}; + set(handles.popupmenu_windowPreset,'Visible','on'); + set(handles.text_windowPreset,'String','Window Preset'); +else + cMapOptionsSelectList = {'None','CT (ED)','Result (i.e. dose)'}; + set(handles.popupmenu_windowPreset,'Visible','off'); + set(handles.text_windowPreset,'String','No available Window Presets'); +end +handles.cBarChanged = true; + + switch handles.State + + case 0 + + set(handles.txtInfo,'String','no data loaded'); + set(handles.btnCalcDose,'Enable','off'); + set(handles.btnOptimize ,'Enable','off'); + set(handles.pushbutton_recalc,'Enable','off'); + set(handles.btnSaveToGUI,'Enable','off'); + set(handles.btnDVH,'Enable','off'); + set(handles.importDoseButton,'Enable','off'); + set(handles.btn_export,'Enable','off'); + set(handles.btn3Dview,'Enable','off'); + + cMapControls = allchild(handles.uipanel_colormapOptions); + for runHandles = cMapControls + set(runHandles,'Enable','off'); + end + + set(handles.popupmenu_chooseColorData,'String',cMapOptionsSelectList{1}) + set(handles.popupmenu_chooseColorData,'Value',1); + + case 1 + + set(handles.txtInfo,'String','ready for dose calculation'); + set(handles.btnCalcDose,'Enable','on'); + set(handles.btnOptimize ,'Enable','off'); + set(handles.pushbutton_recalc,'Enable','off'); + set(handles.btnSaveToGUI,'Enable','off'); + set(handles.btnDVH,'Enable','off'); + set(handles.importDoseButton,'Enable','off'); + set(handles.btn_export,'Enable','on'); + set(handles.btn3Dview,'Enable','on'); + + set(handles.popupmenu_chooseColorData,'String',cMapOptionsSelectList(1:2)) + set(handles.popupmenu_chooseColorData,'Value',2); + AllVarNames = evalin('base','who'); + if ~isempty(AllVarNames) + if ismember('resultGUI',AllVarNames) + set(handles.pushbutton_recalc,'Enable','on'); + set(handles.btnSaveToGUI,'Enable','on'); + set(handles.btnDVH,'Enable','on'); + set(handles.popupmenu_chooseColorData,'String',cMapOptionsSelectList(1:3)) + set(handles.popupmenu_chooseColorData,'Value',3); + end + end + + case 2 + + set(handles.txtInfo,'String','ready for optimization'); + set(handles.btnCalcDose,'Enable','on'); + set(handles.btnOptimize ,'Enable','on'); + set(handles.pushbutton_recalc,'Enable','off'); + set(handles.btnSaveToGUI,'Enable','off'); + set(handles.btnDVH,'Enable','off'); + set(handles.importDoseButton,'Enable','off'); + set(handles.btn_export,'Enable','on'); + set(handles.btn3Dview,'Enable','on'); + set(handles.popupmenu_chooseColorData,'String',cMapOptionsSelectList(1:2)) + set(handles.popupmenu_chooseColorData,'Value',2); + AllVarNames = evalin('base','who'); + + if ~isempty(AllVarNames) + if ismember('resultGUI',AllVarNames) + set(handles.pushbutton_recalc,'Enable','on'); + set(handles.btnSaveToGUI,'Enable','on'); + set(handles.btnDVH,'Enable','on'); + set(handles.popupmenu_chooseColorData,'String',cMapOptionsSelectList(1:3)) + set(handles.popupmenu_chooseColorData,'Value',3); + end + end + + case 3 + set(handles.txtInfo,'String','plan is optimized'); + set(handles.btnCalcDose,'Enable','on'); + set(handles.btnOptimize ,'Enable','on'); + set(handles.pushbutton_recalc,'Enable','on'); + set(handles.btnSaveToGUI,'Enable','on'); + set(handles.btnDVH,'Enable','on'); + set(handles.btn_export,'Enable','on'); + set(handles.btn3Dview,'Enable','on'); + % resultGUI struct needs to be available to import dose + % otherwise inconsistent states can be achieved + set(handles.importDoseButton,'Enable','on'); + set(handles.popupmenu_chooseColorData,'String',cMapOptionsSelectList(1:3)) + set(handles.popupmenu_chooseColorData,'Value',3); + end + +guidata(handles.figure1,handles); + +% fill GUI elements with plan information +function setPln(handles) +pln = evalin('base','pln'); +% sanity check of isoCenter +if size(pln.propStf.isoCenter,1) ~= pln.propStf.numOfBeams && size(pln.propStf.isoCenter,1) == 1 + pln.propStf.isoCenter = ones(pln.propStf.numOfBeams,1) * pln.propStf.isoCenter(1,:); +elseif size(pln.propStf.isoCenter,1) ~= pln.propStf.numOfBeams && size(pln.propStf.isoCenter,1) ~= 1 + error('Isocenter in plan file are incosistent.'); +end +set(handles.editBixelWidth,'String',num2str(pln.propStf.bixelWidth)); +set(handles.editFraction,'String',num2str(pln.numOfFractions)); + +if isfield(pln.propStf,'isoCenter') + if size(unique(pln.propStf.isoCenter,'rows'),1) == 1 + set(handles.editIsoCenter,'String',regexprep(num2str((round(pln.propStf.isoCenter(1,:)*10))./10), '\s+', ' ')); + set(handles.editIsoCenter,'Enable','on'); + set(handles.checkIsoCenter,'Enable','on'); + else + set(handles.editIsoCenter,'String','multiple isoCenter'); + set(handles.editIsoCenter,'Enable','off'); + set(handles.checkIsoCenter,'Value',0); + set(handles.checkIsoCenter,'Enable','off'); + end +end +set(handles.editGantryAngle,'String',num2str((pln.propStf.gantryAngles))); +set(handles.editCouchAngle,'String',num2str((pln.propStf.couchAngles))); +set(handles.popupRadMode,'Value',find(strcmp(get(handles.popupRadMode,'String'),pln.radiationMode))); +set(handles.popUpMachine,'Value',find(strcmp(get(handles.popUpMachine,'String'),pln.machine))); + +if ~strcmp(pln.propOpt.bioOptimization,'none') + set(handles.popMenuBioOpt,'Enable','on'); + contentPopUp = get(handles.popMenuBioOpt,'String'); + ix = find(strcmp(pln.propOpt.bioOptimization,contentPopUp)); + set(handles.popMenuBioOpt,'Value',ix); + set(handles.btnSetTissue,'Enable','on'); +else + set(handles.popMenuBioOpt,'Enable','off'); + set(handles.btnSetTissue,'Enable','off'); +end +%% enable sequencing and DAO button if radiation mode is set to photons +if strcmp(pln.radiationMode,'photons') && pln.propOpt.runSequencing + set(handles.btnRunSequencing,'Enable','on'); + set(handles.btnRunSequencing,'Value',1); +elseif strcmp(pln.radiationMode,'photons') && ~pln.propOpt.runSequencing + set(handles.btnRunSequencing,'Enable','on'); + set(handles.btnRunSequencing,'Value',0); +else + set(handles.btnRunSequencing,'Enable','off'); +end +%% enable DAO button if radiation mode is set to photons +if strcmp(pln.radiationMode,'photons') && pln.propOpt.runDAO + set(handles.btnRunDAO,'Enable','on'); + set(handles.btnRunDAO,'Value',1); +elseif strcmp(pln.radiationMode,'photons') && ~pln.propOpt.runDAO + set(handles.btnRunDAO,'Enable','on'); + set(handles.btnRunDAO,'Value',0); +else + set(handles.btnRunDAO,'Enable','off'); +end +%% enable stratification level input if radiation mode is set to photons +if strcmp(pln.radiationMode,'photons') + set(handles.txtSequencing,'Enable','on'); + set(handles.radiobutton3Dconf,'Enable','on'); + set(handles.editSequencingLevel,'Enable','on'); +else + set(handles.txtSequencing,'Enable','off'); + set(handles.radiobutton3Dconf,'Enable','off'); + set(handles.editSequencingLevel,'Enable','off'); +end + +% --- Executes on button press in btnTableSave. +function btnTableSave_Callback(~, ~, handles) +% hObject handle to btnTableSave (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +%getCstTable(handles); +if get(handles.checkIsoCenter,'Value') + pln = evalin('base','pln'); + pln.propStf.isoCenter = ones(pln.propStf.numOfBeams,1) * matRad_getIsoCenter(evalin('base','cst'),evalin('base','ct')); + set(handles.editIsoCenter,'String',regexprep(num2str((round(pln.propStf.isoCenter(1,:) * 10))./10), '\s+', ' ')); + assignin('base','pln',pln); +end +getPlnFromGUI(handles); + +% --- Executes on selection change in listBoxCmd. +function listBoxCmd_Callback(hObject, ~, ~) +numLines = size(get(hObject,'String'),1); +set(hObject, 'ListboxTop', numLines); + +% --- Executes on slider movement. +function sliderOffset_Callback(hObject, ~, handles) +handles.profileOffset = get(hObject,'Value'); +UpdatePlot(handles); + + +%% HELPER FUNCTIONS +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% check validity of input for cst +function flagValidity = CheckValidity(Val) + +flagValidity = true; + +if ischar(Val) + Val = str2num(Val); +end + +if length(Val) > 2 + warndlg('invalid input!'); +end + +if isempty(Val) + warndlg('Input not a number!'); + flagValidity = false; +end + +if any(Val < 0) + warndlg('Input not a positive number!'); + flagValidity = false; +end + +% return IPOPT status as message box +function CheckOptimizerStatus(usedOptimizer,OptCase) + +[statusmsg,statusflag] = usedOptimizer.GetStatus(); + +if statusflag == 0 || statusflag == 1 + status = 'none'; +else + status = 'warn'; +end + +msgbox(['Optimizer finished with status ' num2str(statusflag) ' (' statusmsg ')'],'Optimizer',status,'modal'); + +% get pln file form GUI +function getPlnFromGUI(handles) + +% evalin pln (if existant) in order to decide whether isoCenter should be calculated +% automatically +if evalin('base','exist(''pln'',''var'')') + pln = evalin('base','pln'); +end + +pln.propStf.bixelWidth = parseStringAsNum(get(handles.editBixelWidth,'String'),false); % [mm] / also corresponds to lateral spot spacing for particles +pln.propStf.gantryAngles = parseStringAsNum(get(handles.editGantryAngle,'String'),true); % [???] +pln.propStf.couchAngles = parseStringAsNum(get(handles.editCouchAngle,'String'),true); % [???] +pln.propStf.numOfBeams = numel(pln.propStf.gantryAngles); +try + ct = evalin('base','ct'); + pln.numOfVoxels = prod(ct.cubeDim); + pln.voxelDimensions = ct.cubeDim; +catch +end +pln.numOfFractions = parseStringAsNum(get(handles.editFraction,'String'),false); +contents = get(handles.popupRadMode,'String'); +pln.radiationMode = contents{get(handles.popupRadMode,'Value')}; % either photons / protons / carbon +contents = get(handles.popUpMachine,'String'); +pln.machine = contents{get(handles.popUpMachine,'Value')}; + +if (~strcmp(pln.radiationMode,'photons')) + contentBioOpt = get(handles.popMenuBioOpt,'String'); + pln.propOpt.bioOptimization = contentBioOpt{get(handles.popMenuBioOpt,'Value'),:}; +else + pln.propOpt.bioOptimization = 'none'; +end + +pln.propOpt.runSequencing = logical(get(handles.btnRunSequencing,'Value')); +pln.propOpt.runDAO = logical(get(handles.btnRunDAO,'Value')); + +try + cst = evalin('base','cst'); + if (sum(strcmp('TARGET',cst(:,3))) > 0 && get(handles.checkIsoCenter,'Value')) || ... + (sum(strcmp('TARGET',cst(:,3))) > 0 && ~isfield(pln.propStf,'isoCenter')) + pln.propStf.isoCenter = ones(pln.propStf.numOfBeams,1) * matRad_getIsoCenter(cst,ct); + set(handles.checkIsoCenter,'Value',1); + else + if ~strcmp(get(handles.editIsoCenter,'String'),'multiple isoCenter') + pln.propStf.isoCenter = ones(pln.propStf.numOfBeams,1) * str2num(get(handles.editIsoCenter,'String')); + end + end +catch + warning('couldnt set isocenter in getPln function') +end + +handles.pln = pln; +assignin('base','pln',pln); + +% parsing a string as number array +function number = parseStringAsNum(stringIn,isVector) +if isnumeric(stringIn) + number = stringIn; +else + number = str2num(stringIn); + if isempty(number) || length(number) > 1 && ~isVector + warndlg(['could not parse all parameters (pln, optimization parameter)']); + number = NaN; + elseif isVector && iscolumn(number) + number = number'; + end +end + + +% show error +function handles = showError(handles,Message,ME) + +if nargin == 3 + %Add exception message + if isfield(handles,'devMode') && handles.devMode + meType = 'extended'; + else + meType = 'basic'; + end + Message = {Message,ME.getReport(meType,'hyperlinks','off')}; +end + +if isfield(handles,'ErrorDlg') + if ishandle(handles.ErrorDlg) + close(handles.ErrorDlg); + end +end +handles.ErrorDlg = errordlg(Message); + +% show warning +function handles = showWarning(handles,Message,ME) + +if nargin == 3 + %Add exception message + if isfield(handles,'devMode') && handles.devMode + meType = 'extended'; + else + meType = 'basic'; + end + Message = {Message,ME.getReport(meType,'hyperlinks','off')}; +end + +if isfield(handles,'WarnDlg') + if ishandle(handles.WarnDlg) + close(handles.WarnDlg); + end +end +handles.WarnDlg = warndlg(Message); + +% check for valid machine data input file +function flag = checkRadiationComposition(handles) +flag = true; +contents = cellstr(get(handles.popUpMachine,'String')); +Machine = contents{get(handles.popUpMachine,'Value')}; +contents = cellstr(get(handles.popupRadMode,'String')); +radMod = contents{get(handles.popupRadMode,'Value')}; + +if isdeployed + FoundFile = dir([ctfroot filesep 'matRad' filesep radMod '_' Machine '.mat']); +else + FoundFile = dir([fileparts(mfilename('fullpath')) filesep radMod '_' Machine '.mat']); +end +if isempty(FoundFile) + warndlg(['No base data available for machine: ' Machine]); + flag = false; +end + +function matRadScrollWheelFcn(src,event) + +% get handles +handles = guidata(src); + +% compute new slice +currSlice = round(get(handles.sliderSlice,'Value')); +newSlice = currSlice - event.VerticalScrollCount; + +% project to allowed set +newSlice = min(newSlice,get(handles.sliderSlice,'Max')); +newSlice = max(newSlice,get(handles.sliderSlice,'Min')); + +% update slider +set(handles.sliderSlice,'Value',newSlice); + +% update handles object +guidata(src,handles); + +% update plot +UpdatePlot(handles); + + + + +%% CALLBACKS +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% button: show DVH +function btnDVH_Callback(~, ~, handles) + +resultGUI = evalin('base','resultGUI'); +Content = get(handles.popupDisplayOption,'String'); +SelectedCube = Content{get(handles.popupDisplayOption,'Value')}; + +pln = evalin('base','pln'); +resultGUI_SelectedCube.physicalDose = resultGUI.(SelectedCube); + +if ~strcmp(pln.propOpt.bioOptimization,'none') + + %check if one of the default fields is selected + if sum(strcmp(SelectedCube,{'physicalDose','effect','RBE,','RBExDose','alpha','beta'})) > 0 + resultGUI_SelectedCube.physicalDose = resultGUI.physicalDose; + resultGUI_SelectedCube.RBExDose = resultGUI.RBExDose; + else + Idx = find(SelectedCube == '_'); + SelectedSuffix = SelectedCube(Idx(1):end); + resultGUI_SelectedCube.physicalDose = resultGUI.(['physicalDose' SelectedSuffix]); + resultGUI_SelectedCube.RBExDose = resultGUI.(['RBExDose' SelectedSuffix]); + end +end + +%adapt visibilty +cst = evalin('base','cst'); +for i = 1:size(cst,1) + cst{i,5}.Visible = handles.VOIPlotFlag(i); +end + +matRad_indicatorWrapper(cst,pln,resultGUI_SelectedCube); + +assignin('base','cst',cst); + +% radio button: plot isolines labels +function radiobtnIsoDoseLinesLabels_Callback(~, ~, handles) +UpdatePlot(handles); + +% button: refresh +function btnRefresh_Callback(hObject, ~, handles) + +handles = resetGUI(hObject, handles); + +%% parse variables from base workspace +AllVarNames = evalin('base','who'); +handles.AllVarNames = AllVarNames; +try + if ismember('ct',AllVarNames) && ismember('cst',AllVarNames) + ct = evalin('base','ct'); + cst = evalin('base','cst'); + %cst = setCstTable(handles,cst); + generateCstTable(handles,cst); + handles.State = 1; + cst = matRad_computeVoiContoursWrapper(cst,ct); + assignin('base','cst',cst); + elseif ismember('ct',AllVarNames) && ~ismember('cst',AllVarNames) + handles = showError(handles,'GUI OpeningFunc: could not find cst file'); + elseif ~ismember('ct',AllVarNames) && ismember('cst',AllVarNames) + handles = showError(handles,'GUI OpeningFunc: could not find ct file'); + end +catch + handles = showError(handles,'GUI OpeningFunc: Could not load ct and cst file'); +end + +if ismember('ct',AllVarNames) && ismember('cst',AllVarNames) + handles = reloadGUI(hObject, handles, ct, cst); +else + handles = reloadGUI(hObject, handles); +end +guidata(hObject, handles); + + +% text box: # fractions +function editFraction_Callback(hObject, ~, handles) +getPlnFromGUI(handles); +guidata(hObject,handles); + +% text box: stratification levels +function editSequencingLevel_Callback(~, ~, ~) + +% text box: isoCenter in [mm] +function editIsoCenter_Callback(hObject, ~, handles) + +pln = evalin('base','pln'); +tmpIsoCenter = str2num(get(hObject,'String')); + +if length(tmpIsoCenter) == 3 + if sum(any(unique(pln.propStf.isoCenter,'rows')~=tmpIsoCenter)) + pln.propStf.isoCenter = ones(pln.propStf.numOfBeams,1)*tmpIsoCenter; + handles.State = 1; + UpdateState(handles); + end +else + handles = showError(handles,'EditIsoCenterCallback: Could not set iso center'); +end + +assignin('base','pln',pln); +guidata(hObject,handles); + +% check box: iso center auto +function checkIsoCenter_Callback(hObject, ~, handles) + +W = evalin('base','whos'); +doesPlnExist = ismember('pln',{W(:).name}); + +if get(hObject,'Value') && doesPlnExist + pln = evalin('base','pln'); + if ~isfield(pln.propStf,'isoCenter') + pln.propStf.isoCenter = NaN; + end + tmpIsoCenter = matRad_getIsoCenter(evalin('base','cst'),evalin('base','ct')); + if ~isequal(tmpIsoCenter,pln.propStf.isoCenter) + pln.propStf.isoCenter = ones(pln.propStf.numOfBeams,1)*tmpIsoCenter; + handles.State = 1; + UpdateState(handles); + end + set(handles.editIsoCenter,'String',regexprep(num2str((round(tmpIsoCenter*10))./10), '\s+', ' ')); + set(handles.editIsoCenter,'Enable','off') + assignin('base','pln',pln); +else + set(handles.editIsoCenter,'Enable','on') +end + +% radio button: run sequencing +function btnRunSequencing_Callback(~, ~, handles) +getPlnFromGUI(handles); + +% radio button: run direct aperture optimization +function btnRunDAO_Callback(~, ~, handles) +getPlnFromGUI(handles); + +% button: set iso dose levels +function btnSetIsoDoseLevels_Callback(hObject, ~, handles) +prompt = {['Enter iso dose levels in [Gy]. Enter space-separated numbers, e.g. 1.5 2 3 4.98. Enter 0 to use default values']}; +if isequal(handles.IsoDose.Levels,0) || ~isvector(handles.IsoDose.Levels) || any(~isnumeric(handles.IsoDose.Levels)) || any(isnan(handles.IsoDose.Levels)) + defaultLine = {'1 2 3 '}; +else + if isrow(handles.IsoDose.Levels) + defaultLine = cellstr(num2str(handles.IsoDose.Levels,'%.2g ')); + else + defaultLine = cellstr(num2str(handles.IsoDose.Levels','%.2g ')); + end +end + +try + Input = inputdlg(prompt,'Set iso dose levels ', [1 70],defaultLine); + if ~isempty(Input) + handles.IsoDose.Levels = (sort(str2num(Input{1}))); + if length(handles.IsoDose.Levels) == 1 && (handles.IsoDose.Levels(1) ~= 0) + handles.IsoDose.Levels = [handles.IsoDose.Levels handles.IsoDose.Levels]; + end + handles.IsoDose.NewIsoDoseFlag = true; + end +catch + warning('Couldnt parse iso dose levels - using default values'); + handles.IsoDose.Levels = 0; +end +handles = updateIsoDoseLineCache(handles); +handles.IsoDose.NewIsoDoseFlag = false; +UpdatePlot(handles); +guidata(hObject,handles); + + +% popup menu: machine +function popUpMachine_Callback(hObject, ~, handles) +contents = cellstr(get(hObject,'String')); +checkRadiationComposition(handles); +if handles.State > 0 + pln = evalin('base','pln'); + if handles.State > 0 && ~strcmp(contents(get(hObject,'Value')),pln.machine) + handles.State = 1; + UpdateState(handles); + guidata(hObject,handles); + end + getPlnFromGUI(handles); +end + +% toolbar load button +function toolbarLoad_ClickedCallback(hObject, eventdata, handles) +btnLoadMat_Callback(hObject, eventdata, handles); + +% toolbar save button +function toolbarSave_ClickedCallback(hObject, eventdata, handles) + +btnTableSave_Callback(hObject, eventdata, handles); + +try + + if handles.State > 0 + ct = evalin('base','ct'); + cst = evalin('base','cst'); + pln = evalin('base','pln'); + end + + if handles.State > 1 + stf = evalin('base','stf'); + dij = evalin('base','dij'); + end + + if handles.State > 2 + resultGUI = evalin('base','resultGUI'); + end + + switch handles.State + case 1 + uisave({'cst','ct','pln'}); + case 2 + uisave({'cst','ct','pln','stf','dij'}); + case 3 + uisave({'cst','ct','pln','stf','dij','resultGUI'}); + end + +catch + handles = showWarning(handles,'Could not save files'); +end +guidata(hObject,handles); + +% button: about +function btnAbout_Callback(hObject, eventdata, handles) + +msgbox({'https://github.com/e0404/matRad/' 'email: matrad@dkfz.de'},'About'); + +% button: close +function figure1_CloseRequestFcn(hObject, ~, ~) +set(0,'DefaultUicontrolBackgroundColor',[0.5 0.5 0.5]); +selection = questdlg('Do you really want to close matRad?',... + 'Close matRad',... + 'Yes','No','Yes'); + +%BackgroundColor',[0.5 0.5 0.5] + switch selection + case 'Yes', + delete(hObject); + case 'No' + return + end + +% --- Executes on button press in pushbutton_recalc. +function pushbutton_recalc_Callback(hObject, ~, handles) + +% recalculation only makes sense if ... +if evalin('base','exist(''pln'',''var'')') && ... + evalin('base','exist(''stf'',''var'')') && ... + evalin('base','exist(''ct'',''var'')') && ... + evalin('base','exist(''cst'',''var'')') && ... + evalin('base','exist(''resultGUI'',''var'')') + +try + + % indicate that matRad is busy + % change mouse pointer to hour glass + Figures = gcf;%findobj('type','figure'); + set(Figures, 'pointer', 'watch'); + drawnow; + % disable all active objects + InterfaceObj = findobj(Figures,'Enable','on'); + set(InterfaceObj,'Enable','off'); + + % get all data from workspace + pln = evalin('base','pln'); + stf = evalin('base','stf'); + ct = evalin('base','ct'); + cst = evalin('base','cst'); + resultGUI = evalin('base','resultGUI'); + + % get weights of the selected cube + Content = get(handles.popupDisplayOption,'String'); + SelectedCube = Content{get(handles.popupDisplayOption,'Value')}; + Suffix = strsplit(SelectedCube,'_'); + if length(Suffix)>1 + Suffix = ['_' Suffix{2}]; + else + Suffix = ''; + end + + if sum([stf.totalNumOfBixels]) ~= length(resultGUI.(['w' Suffix])) + warndlg('weight vector does not corresponding to current steering file'); + return + end + + % change isocenter if that was changed and do _not_ recreate steering + % information + for i = 1:numel(pln.propStf.gantryAngles) + stf(i).isoCenter = pln.propStf.isoCenter(i,:); + end + + % recalculate influence matrix + if strcmp(pln.radiationMode,'photons') + dij = matRad_calcPhotonDose(ct,stf,pln,cst); + elseif strcmp(pln.radiationMode,'protons') || strcmp(pln.radiationMode,'carbon') + dij = matRad_calcParticleDose(ct,stf,pln,cst); + end + + % recalculate cubes in resultGUI + resultGUIreCalc = matRad_calcCubes(resultGUI.(['w' Suffix]),dij,cst); + + % delete old variables to avoid confusion + if isfield(resultGUI,'effect') + resultGUI = rmfield(resultGUI,'effect'); + resultGUI = rmfield(resultGUI,'RBExDose'); + resultGUI = rmfield(resultGUI,'RBE'); + resultGUI = rmfield(resultGUI,'alpha'); + resultGUI = rmfield(resultGUI,'beta'); + end + + % overwrite the "standard" fields + sNames = fieldnames(resultGUIreCalc); + for j = 1:length(sNames) + resultGUI.(sNames{j}) = resultGUIreCalc.(sNames{j}); + end + + % assign results to base worksapce + assignin('base','dij',dij); + assignin('base','resultGUI',resultGUI); + + handles.State = 3; + + % show physicalDose of newly computed state + handles.SelectedDisplayOption = 'physicalDose'; + set(handles.popupDisplayOption,'Value',find(strcmp('physicalDose',Content))); + + % change state from busy to normal + set(Figures, 'pointer', 'arrow'); + set(InterfaceObj,'Enable','on'); + + handles.cBarChanged = true; + + handles = updateIsoDoseLineCache(handles); + + UpdateState(handles); + + handles.rememberCurrAxes = false; + UpdatePlot(handles); + handles.rememberCurrAxes = true; + + guidata(hObject,handles); + +catch ME + handles = showError(handles,'CalcDoseCallback: Error in dose recalculation!',ME); + + % change state from busy to normal + set(Figures, 'pointer', 'arrow'); + set(InterfaceObj,'Enable','on'); + + guidata(hObject,handles); + return; + +end + +end + + +% --- Executes on button press in btnSetTissue. +function btnSetTissue_Callback(hObject, ~, handles) + +%check if patient is loaded +if handles.State == 0 + return +end + +%parse variables from base-workspace +cst = evalin('base','cst'); +pln = evalin('base','pln'); + +fileName = [pln.radiationMode '_' pln.machine]; +load(fileName); + +% check for available cell types characterized by alphaX and betaX +for i = 1:size(machine.data(1).alphaX,2) + CellType{i} = [num2str(machine.data(1).alphaX(i)) ' ' num2str(machine.data(1).betaX(i))]; +end + +%fill table data array +for i = 1:size(cst,1) + data{i,1} = cst{i,2}; + data{i,2} = [num2str(cst{i,5}.alphaX) ' ' num2str(cst{i,5}.betaX)]; + data{i,3} = (cst{i,5}.alphaX / cst{i,5}.betaX ); +end + +Width = 400; +Height = 200 + 20*size(data,1); +ScreenSize = get(0,'ScreenSize'); +% show "set tissue parameter" window +figHandles = get(0,'Children'); +if ~isempty(figHandles) + IdxHandle = strcmp(get(figHandles,'Name'),'Set Tissue Parameters'); +else + IdxHandle = []; +end + +%check if window is already exists +if any(IdxHandle) + IdxTable = find(strcmp({figHandles(IdxHandle).Children.Type},'uitable')); + set(figHandles(IdxHandle).Children(IdxTable), 'Data', []); + figTissue = figHandles(IdxHandle); + %set focus + figure(figTissue); +else + figTissue = figure('Name','Set Tissue Parameters','Color',[.5 .5 .5],'NumberTitle','off','Position',... + [ceil(ScreenSize(3)/2) ceil(ScreenSize(4)/2) Width Height]); +end + +% define the tissue parameter table +cNames = {'VOI','alphaX betaX','alpha beta ratio'}; +columnformat = {'char',CellType,'numeric'}; + +tissueTable = uitable('Parent', figTissue,'Data', data,'ColumnEditable',[false true false],... + 'ColumnName',cNames, 'ColumnFormat',columnformat,'Position',[50 150 10 10]); +set(tissueTable,'CellEditCallback',@tissueTable_CellEditCallback); +% set width and height +currTablePos = get(tissueTable,'Position'); +currTableExt = get(tissueTable,'Extent'); +currTablePos(3) = currTableExt(3); +currTablePos(4) = currTableExt(4); +set(tissueTable,'Position',currTablePos); + +% define two buttons with callbacks +uicontrol('Parent', figTissue,'Style', 'pushbutton', 'String', 'Save&Close',... + 'Position', [Width-(0.25*Width) 0.1 * Height 70 30],... + 'Callback', @(hpb,eventdata)SaveTissueParameters(hpb,eventdata,handles)); + +uicontrol('Parent', figTissue,'Style', 'pushbutton', 'String', 'Cancel&Close',... + 'Position', [Width-(0.5*Width) 0.1 * Height 80 30],... + 'Callback', 'close'); + +guidata(hObject,handles); +UpdateState(handles); + + +function SaveTissueParameters(~, ~, handles) +cst = evalin('base','cst'); +% get handle to uiTable +figHandles = get(0,'Children'); +IdxHandle = find(strcmp(get(figHandles,'Name'),'Set Tissue Parameters')); +% find table in window + +figHandleChildren = get(figHandles(IdxHandle),'Children'); +IdxTable = find(strcmp(get(figHandleChildren,'Type'),'uitable')); +uiTable = figHandleChildren(IdxTable); +% retrieve data from uitable +data = get(uiTable,'data'); + +for i = 1:size(cst,1) + for j = 1:size(data,1) + if strcmp(cst{i,2},data{j,1}) + alphaXBetaX = str2num(data{j,2}); + cst{i,5}.alphaX = alphaXBetaX(1); + cst{i,5}.betaX = alphaXBetaX(2); + end + end +end +assignin('base','cst',cst); +close +handles.State = 2; +UpdateState(handles); + + + +function tissueTable_CellEditCallback(hObject, eventdata, ~) +if eventdata.Indices(2) == 2 + alphaXBetaX = str2num(eventdata.NewData); + data = get(hObject,'Data'); + data{eventdata.Indices(1),3} = alphaXBetaX(1)/alphaXBetaX(2); + set(hObject,'Data',data); +end + +% --- Executes on button press in btnSaveToGUI. +function btnSaveToGUI_Callback(hObject, ~, handles) + +Width = 400; +Height = 200; +ScreenSize = get(0,'ScreenSize'); + +% show "Provide result name" window +figHandles = get(0,'Children'); +if ~isempty(figHandles) + IdxHandle = strcmp(get(figHandles,'Name'),'Provide result name'); +else + IdxHandle = []; +end + +%check if window is already exists +if any(IdxHandle) + figDialog = figHandles(IdxHandle); + %set focus + figure(figDialog); +else + figDialog = dialog('Position',[ceil(ScreenSize(3)/2) ceil(ScreenSize(4)/2) Width Height],'Name','Provide result name','Color',[0.5 0.5 0.5]); + + uicontrol('Parent',figDialog,... + 'Style','text',... + 'Position',[20 Height - (0.35*Height) 350 60],... + 'String','Please provide a decriptive name for your optimization result:','FontSize',10,'BackgroundColor',[0.5 0.5 0.5]); + + uicontrol('Parent',figDialog,... + 'Style','edit',... + 'Position',[30 60 350 60],... + 'String','Please enter name here...','FontSize',10,'BackgroundColor',[0.55 0.55 0.55]); + + uicontrol('Parent', figDialog,'Style', 'pushbutton', 'String', 'Save','FontSize',10,... + 'Position', [0.42*Width 0.1 * Height 70 30],... + 'Callback', @(hpb,eventdata)SaveResultToGUI(hpb,eventdata,guidata(hpb))); +end + +uiwait(figDialog); +guidata(hObject, handles); +UpdateState(handles) +UpdatePlot(handles) + + +function SaveResultToGUI(~, ~, ~) +AllFigHandles = get(0,'Children'); +ixHandle = strcmp(get(AllFigHandles,'Name'),'Provide result name'); +uiEdit = get(AllFigHandles(ixHandle),'Children'); + +if strcmp(get(uiEdit(2),'String'),'Please enter name here...') + + formatOut = 'mmddyyHHMM'; + Suffix = ['_' datestr(now,formatOut)]; +else + % delete special characters + Suffix = get(uiEdit(2),'String'); + logIx = isstrprop(Suffix,'alphanum'); + Suffix = ['_' Suffix(logIx)]; +end + +pln = evalin('base','pln'); +resultGUI = evalin('base','resultGUI'); + +if isfield(resultGUI,'physicalDose') + resultGUI.(['physicalDose' Suffix]) = resultGUI.physicalDose; +end +if isfield(resultGUI,'w') + resultGUI.(['w' Suffix]) = resultGUI.w; +end + + +if ~strcmp(pln.propOpt.bioOptimization,'none') + + if isfield(resultGUI,'RBExDose') + resultGUI.(['RBExDose' Suffix]) = resultGUI.RBExDose; + end + + if strcmp(pln.radiationMode,'carbon') == 1 + if isfield(resultGUI,'effect') + resultGUI.(['effect' Suffix])= resultGUI.effect; + end + + if isfield(resultGUI,'RBE') + resultGUI.(['RBE' Suffix]) = resultGUI.RBE; + end + if isfield(resultGUI,'alpha') + resultGUI.(['alpha' Suffix]) = resultGUI.alpha; + end + if isfield(resultGUI,'beta') + resultGUI.(['beta' Suffix]) = resultGUI.beta; + end + end +end + +close(AllFigHandles(ixHandle)); +assignin('base','resultGUI',resultGUI); + +% precompute contours of VOIs +function cst = precomputeContours(ct,cst) +mask = zeros(ct.cubeDim); % create zero cube with same dimeonsions like dose cube +for s = 1:size(cst,1) + cst{s,7} = cell(max(ct.cubeDim(:)),3); + mask(:) = 0; + mask(cst{s,4}{1}) = 1; + for slice = 1:ct.cubeDim(1) + if sum(sum(mask(slice,:,:))) > 0 + cst{s,7}{slice,1} = contourc(squeeze(mask(slice,:,:)),.5*[1 1]); + end + end + for slice = 1:ct.cubeDim(2) + if sum(sum(mask(:,slice,:))) > 0 + cst{s,7}{slice,2} = contourc(squeeze(mask(:,slice,:)),.5*[1 1]); + end + end + for slice = 1:ct.cubeDim(3) + if sum(sum(mask(:,:,slice))) > 0 + cst{s,7}{slice,3} = contourc(squeeze(mask(:,:,slice)),.5*[1 1]); + end + end +end + +%Update IsodoseLines +function handles = updateIsoDoseLineCache(handles) +resultGUI = evalin('base','resultGUI'); +% select first cube if selected option does not exist +if ~isfield(resultGUI,handles.SelectedDisplayOption) + CubeNames = fieldnames(resultGUI); + dose = resultGUI.(CubeNames{1,1}); +else + dose = resultGUI.(handles.SelectedDisplayOption); +end + +%if function is called for the first time then set display parameters +if isempty(handles.dispWindow{3,2}) + handles.dispWindow{3,1} = [min(dose(:)) max(dose(:))]; % set default dose range + handles.dispWindow{3,2} = [min(dose(:)) max(dose(:))]; % set min max values +end + +minMaxRange = handles.dispWindow{3,1}; +% if upper colorrange is defined then use it otherwise 120% iso dose + upperMargin = 1; +if abs((max(dose(:)) - handles.dispWindow{3,1}(1,2))) < 0.01 * max(dose(:)) + upperMargin = 1.2; +end + +if (length(handles.IsoDose.Levels) == 1 && handles.IsoDose.Levels(1,1) == 0) || ~handles.IsoDose.NewIsoDoseFlag + vLevels = [0.1:0.1:0.9 0.95:0.05:upperMargin]; + referenceDose = (minMaxRange(1,2))/(upperMargin); + handles.IsoDose.Levels = minMaxRange(1,1) + (referenceDose-minMaxRange(1,1)) * vLevels; +end +handles.IsoDose.Contours = matRad_computeIsoDoseContours(dose,handles.IsoDose.Levels); + + + +%% CREATE FUNCTIONS +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% popup menu: machine +function popUpMachine_CreateFcn(hObject, ~, ~) +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + +% text box: max value +function txtMaxVal_CreateFcn(hObject, ~, ~) + +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + +% text box: edit iso center +function editIsoCenter_CreateFcn(hObject, ~, ~) +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + +% text box: stratification levels +function editSequencingLevel_CreateFcn(hObject, ~, ~) +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + +function slicerPrecision_CreateFcn(hObject, ~, ~) +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + +function editBixelWidth_CreateFcn(hObject, ~, ~) +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + +function editGantryAngle_CreateFcn(hObject, ~, ~) +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + +function editCouchAngle_CreateFcn(hObject, ~, ~) +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + +function popupRadMode_CreateFcn(hObject, ~, ~) +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + +function editFraction_CreateFcn(hObject, ~, ~) +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + +function popupPlane_CreateFcn(hObject, ~, ~) +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + +function sliderSlice_CreateFcn(hObject, ~, ~) +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + +function popupTypeOfPlot_CreateFcn(hObject, ~, ~) +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + +function popupDisplayOption_CreateFcn(hObject, ~, ~) +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + +function sliderBeamSelection_CreateFcn(hObject, ~, ~) +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + +function listBoxCmd_CreateFcn(hObject, ~, ~) +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + +function sliderOffset_CreateFcn(hObject, ~, ~) +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + +% --- Executes on selection change in legendTable. +function legendTable_Callback(hObject, eventdata, handles) +% hObject handle to legendTable (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: contents = cellstr(get(hObject,'String')) returns legendTable contents as cell array +% contents{get(hObject,'Value')} returns selected item from legendTable +cst = evalin('base','cst'); + +idx = get(hObject,'Value'); +clr = dec2hex(round(cst{idx,5}.visibleColor(:)*255),2)'; +clr = ['#';clr(:)]'; + +%Get the string entries +tmpString = get(handles.legendTable,'String'); + +if handles.VOIPlotFlag(idx) + handles.VOIPlotFlag(idx) = false; + cst{idx,5}.Visible = false; + tmpString{idx} = ['
',cst{idx,2},'
']; +elseif ~handles.VOIPlotFlag(idx) + handles.VOIPlotFlag(idx) = true; + cst{idx,5}.Visible = true; + tmpString{idx} = ['
',cst{idx,2},'
']; +end +set(handles.legendTable,'String',tmpString); + +% update cst in workspace accordingly +assignin('base','cst',cst) + +guidata(hObject, handles); +UpdatePlot(handles) + +% --- Executes during object creation, after setting all properties. +function legendTable_CreateFcn(hObject, eventdata, handles) +% hObject handle to legendTable (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: listbox controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on button press in importDoseButton. +function importDoseButton_Callback(hObject,eventdata, handles) +% hObject handle to importDoseButton (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +extensions{1} = '*.nrrd'; +[filenames,filepath,~] = uigetfile(extensions,'MultiSelect','on'); + +if ~iscell(filenames) + tmp = filenames; + filenames = cell(1); + filenames{1} = tmp; +end + +ct = evalin('base','ct'); +resultGUI = evalin('base','resultGUI'); + +for filename = filenames + [~,name,~] = fileparts(filename{1}); + [cube,~] = matRad_readCube(fullfile(filepath,filename{1})); + if ~isequal(ct.cubeDim, size(cube)) + errordlg('Dimensions of the imported cube do not match with ct','Import failed!','modal'); + continue; + end + + fieldname = ['import_' matlab.lang.makeValidName(name, 'ReplacementStyle','delete')]; + resultGUI.(fieldname) = cube; +end + +assignin('base','resultGUI',resultGUI); +btnRefresh_Callback(hObject, eventdata, handles) + +% --- Executes on button press in pushbutton_importFromBinary. +function pushbutton_importFromBinary_Callback(hObject, eventdata, handles) +% hObject handle to pushbutton_importFromBinary (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +try + % delete existing workspace - parse variables from base workspace + set(handles.popupDisplayOption,'String','no option available'); + AllVarNames = evalin('base','who'); + RefVarNames = {'ct','cst','pln','stf','dij','resultGUI'}; + for i = 1:length(RefVarNames) + if sum(ismember(AllVarNames,RefVarNames{i}))>0 + evalin('base',['clear ', RefVarNames{i}]); + end + end + handles.State = 0; + + %call the gui + uiwait(matRad_importGUI); + + %Check if we have the variables in the workspace + if evalin('base','exist(''cst'',''var'')') == 1 && evalin('base','exist(''ct'',''var'')') == 1 + cst = evalin('base','cst'); + ct = evalin('base','ct'); + %setCstTable(handles,cst); + generateCstTable(hanles,cst); + handles.TableChanged = false; + set(handles.popupTypeOfPlot,'Value',1); + + % compute HU values + if ~isfield(ct, 'cubeHU') + ct = matRad_electronDensitiesToHU(ct); + assignin('base','ct',ct); + end + if ~isfield(ct, 'cubeHU') + handles.cubeHUavailable = false; + else + handles.cubeHUavailable = true; + end + + % precompute contours + cst = precomputeContours(ct,cst); + + assignin('base','ct',ct); + assignin('base','cst',cst); + + if evalin('base','exist(''pln'',''var'')') + assignin('base','pln',pln); + setPln(handles); + else + getPlnFromGUI(handles); + setPln(handles); + end + handles.State = 1; + end + + % set slice slider + handles.plane = get(handles.popupPlane,'value'); + if handles.State >0 + set(handles.sliderSlice,'Min',1,'Max',ct.cubeDim(handles.plane),... + 'Value',round(ct.cubeDim(handles.plane)/2),... + 'SliderStep',[1/(ct.cubeDim(handles.plane)-1) 1/(ct.cubeDim(handles.plane)-1)]); + end + + if handles.State > 0 + % define context menu for structures + for i = 1:size(cst,1) + if cst{i,5}.Visible + handles.VOIPlotFlag(i) = true; + else + handles.VOIPlotFlag(i) = false; + end + end + end + + handles.dispWindow = cell(3,2); + handles.cBarChanged = true; + + UpdateState(handles); + handles.rememberCurrAxes = false; + UpdatePlot(handles); + handles.rememberCurrAxes = true; +catch + handles = showError(handles,'Binary Patient Import: Could not import data'); + UpdateState(handles); +end + +guidata(hObject,handles); + +% --- Executes on button press in radioBtnIsoCenter. +function radioBtnIsoCenter_Callback(hObject, eventdata, handles) +% hObject handle to radioBtnIsoCenter (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +UpdatePlot(handles) +% Hint: get(hObject,'Value') returns toggle state of radioBtnIsoCenter + +% -------------------------------------------------------------------- +function uipushtool_screenshot_ClickedCallback(hObject, eventdata, handles) +% hObject handle to uipushtool_screenshot (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + + +tmpFig = figure('position',[100 100 700 600],'Visible','off','name','Current View'); +cBarHandle = findobj(handles.figure1,'Type','colorbar'); +if ~isempty(cBarHandle) + new_handle = copyobj([handles.axesFig cBarHandle],tmpFig); +else + new_handle = copyobj(handles.axesFig,tmpFig); +end + +oldPos = get(handles.axesFig,'Position'); +set(new_handle(1),'units','normalized', 'Position',oldPos); + +if ~isfield(handles,'lastStoragePath') || exist(handles.lastStoragePath,'dir') ~= 7 + handles.lastStoragePath = []; +end + +[filename, pathname] = uiputfile({'*.jpg;*.tif;*.png;*.gif','All Image Files'; '*.fig','MATLAB figure file'},'Save current view',[handles.lastStoragePath 'screenshot.png']); + +handles.lastStoragePath = pathname; + +if ~isequal(filename,0) && ~isequal(pathname,0) + set(gcf, 'pointer', 'watch'); + saveas(tmpFig,fullfile(pathname,filename)); + set(gcf, 'pointer', 'arrow'); + close(tmpFig); + uiwait(msgbox('Current view has been succesfully saved!')); +else + uiwait(msgbox('Aborted saving, showing figure instead!')); + set(tmpFig,'Visible','on'); +end + +guidata(hObject,handles); + + +%% Callbacks & Functions for color setting +function UpdateColormapOptions(handles) + +if isfield(handles,'colormapLocked') && handles.colormapLocked + return; +end + +selectionIndex = get(handles.popupmenu_chooseColorData,'Value'); + +cMapSelectionIndex = get(handles.popupmenu_chooseColormap,'Value'); +cMapStrings = get(handles.popupmenu_chooseColormap,'String'); + +if selectionIndex > 1 + set(handles.uitoggletool8,'State','on'); +else + set(handles.uitoggletool8,'State','off'); +end + +try + if selectionIndex == 2 + ct = evalin('base','ct'); + currentMap = handles.ctColorMap; + window = handles.dispWindow{selectionIndex,1}; + if isfield(ct, 'cube') + minMax = [min(ct.cube{1}(:)) max(ct.cube{1}(:))]; + else + minMax = [min(ct.cubeHU{1}(:)) max(ct.cubeHU{1}(:))]; + end + % adjust value for custom window to current + handles.windowPresets(1).width = max(window) - min(window); + handles.windowPresets(1).center = mean(window); + % update full window information + handles.windowPresets(2).width = minMax(2) - minMax(1); + handles.windowPresets(2).center = mean(minMax); + elseif selectionIndex == 3 + result = evalin('base','resultGUI'); + dose = result.(handles.SelectedDisplayOption); + currentMap = handles.doseColorMap; + minMax = [min(dose(:)) max(dose(:))]; + window = handles.dispWindow{selectionIndex,1}; + else + window = [0 1]; + minMax = window; + currentMap = 'bone'; + end +catch + window = [0 1]; + minMax = window; + currentMap = 'bone'; +end + +valueRange = minMax(2) - minMax(1); + +windowWidth = window(2) - window(1); +windowCenter = mean(window); + +%This are some arbritrary settings to configure the sliders +sliderCenterMinMax = [minMax(1)-valueRange/2 minMax(2)+valueRange/2]; +sliderWidthMinMax = [0 valueRange*2]; + +%if we have selected a value outside this range, we adapt the slider +%windows +if windowCenter < sliderCenterMinMax(1) + sliderCenterMinMax(1) = windowCenter; +end +if windowCenter > sliderCenterMinMax(2) + sliderCenterMinMax(2) = windowCenter; +end +if windowWidth < sliderWidthMinMax(1) + sliderWidthMinMax(1) = windowWidth; +end +if windowCenter > sliderCenterMinMax(2) + sliderWidthMinMax(2) = windowWidth; +end + + +set(handles.edit_windowCenter,'String',num2str(windowCenter,3)); +set(handles.edit_windowWidth,'String',num2str(windowWidth,3)); +set(handles.edit_windowRange,'String',num2str(window,4)); +set(handles.slider_windowCenter,'Min',sliderCenterMinMax(1),'Max',sliderCenterMinMax(2),'Value',windowCenter); +set(handles.slider_windowWidth,'Min',sliderWidthMinMax(1),'Max',sliderWidthMinMax(2),'Value',windowWidth); + +cMapPopupIndex = find(strcmp(currentMap,cMapStrings)); +set(handles.popupmenu_chooseColormap,'Value',cMapPopupIndex); + +guidata(gcf,handles); + +% --- Executes on selection change in popupmenu_chooseColorData. +function popupmenu_chooseColorData_Callback(hObject, eventdata, handles) +% hObject handle to popupmenu_chooseColorData (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu_chooseColorData contents as cell array +% contents{get(hObject,'Value')} returns selected item from popupmenu_chooseColorData + +%index = get(hObject,'Value') - 1; + +handles.cBarChanged = true; + +guidata(hObject,handles); +UpdatePlot(handles); + + +% --- Executes during object creation, after setting all properties. +function popupmenu_chooseColorData_CreateFcn(hObject, eventdata, handles) +% hObject handle to popupmenu_chooseColorData (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: popupmenu controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on slider movement. +function slider_windowCenter_Callback(hObject, eventdata, handles) +% hObject handle to slider_windowCenter (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + +newCenter = get(hObject,'Value'); +range = get(handles.slider_windowWidth,'Value'); +selectionIndex = get(handles.popupmenu_chooseColorData,'Value'); + +handles.dispWindow{selectionIndex,1} = [newCenter-range/2 newCenter+range/2]; +handles.cBarChanged = true; + +guidata(hObject,handles); +UpdatePlot(handles); + +% --- Executes during object creation, after setting all properties. +function slider_windowCenter_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider_windowCenter (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + +set(hObject,'Value',0.5); + +% --- Executes on slider movement. +function slider_windowWidth_Callback(hObject, eventdata, handles) +% hObject handle to slider_windowWidth (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + +newWidth = get(hObject,'Value'); +center = get(handles.slider_windowCenter,'Value'); +selectionIndex = get(handles.popupmenu_chooseColorData,'Value'); +handles.dispWindow{selectionIndex,1} = [center-newWidth/2 center+newWidth/2]; +handles.cBarChanged = true; + +guidata(hObject,handles); +UpdatePlot(handles); + +% --- Executes during object creation, after setting all properties. +function slider_windowWidth_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider_windowWidth (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + +set(hObject,'Value',1.0); + + +% --- Executes on selection change in popupmenu_chooseColormap. +function popupmenu_chooseColormap_Callback(hObject, eventdata, handles) +% hObject handle to popupmenu_chooseColormap (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu_chooseColormap contents as cell array +% contents{get(hObject,'Value')} returns selected item from popupmenu_chooseColormap + +index = get(hObject,'Value'); +strings = get(hObject,'String'); + +selectionIndex = get(handles.popupmenu_chooseColorData,'Value'); + +switch selectionIndex + case 2 + handles.ctColorMap = strings{index}; + case 3 + handles.doseColorMap = strings{index}; + otherwise +end + +handles.cBarChanged = true; + +guidata(hObject,handles); +UpdatePlot(handles); + +% --- Executes during object creation, after setting all properties. +function popupmenu_chooseColormap_CreateFcn(hObject, eventdata, handles) +% hObject handle to popupmenu_chooseColormap (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: popupmenu controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +function edit_windowRange_Callback(hObject, eventdata, handles) +% hObject handle to edit_windowRange (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit_windowRange as text +% str2double(get(hObject,'String')) returns contents of edit_windowRange as a double + +selectionIndex = get(handles.popupmenu_chooseColorData,'Value'); +vRange = str2num(get(hObject,'String')); +% matlab adds a zero in the beginning when text field is changed +if numel(vRange) == 3 + vRange = vRange(vRange~=0); +end + +handles.dispWindow{selectionIndex,1} = sort(vRange); + +handles.cBarChanged = true; + + % compute new iso dose lines +if selectionIndex > 2 + guidata(hObject,handles); + handles = updateIsoDoseLineCache(handles); +end + +guidata(hObject,handles); +UpdatePlot(handles); + +% --- Executes during object creation, after setting all properties. +function edit_windowRange_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit_windowRange (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + +set(hObject,'String','0 1'); + + +function edit_windowCenter_Callback(hObject, eventdata, handles) +% hObject handle to edit_windowCenter (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit_windowCenter as text +% str2double(get(hObject,'String')) returns contents of edit_windowCenter as a double + +newCenter = str2double(get(hObject,'String')); +width = get(handles.slider_windowWidth,'Value'); +selectionIndex = get(handles.popupmenu_chooseColorData,'Value'); +handles.dispWindow{selectionIndex,1} = [newCenter-width/2 newCenter+width/2]; +handles.cBarChanged = true; +guidata(hObject,handles); +UpdatePlot(handles); + +% --- Executes during object creation, after setting all properties. +function edit_windowCenter_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit_windowCenter (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit_windowWidth_Callback(hObject, eventdata, handles) +% hObject handle to edit_windowWidth (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit_windowWidth as text +% str2double(get(hObject,'String')) returns contents of edit_windowWidth as a double + +newWidth = str2double(get(hObject,'String')); +center = get(handles.slider_windowCenter,'Value'); +selectionIndex = get(handles.popupmenu_chooseColorData,'Value'); +handles.dispWindow{selectionIndex,1} = [center-newWidth/2 center+newWidth/2]; +handles.cBarChanged = true; +guidata(hObject,handles); +UpdatePlot(handles); + + +% --- Executes during object creation, after setting all properties. +function edit_windowWidth_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit_windowWidth (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% -------------------------------------------------------------------- +function uitoggletool8_ClickedCallback(hObject, eventdata, handles) +% hObject handle to uitoggletool8 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +%Check if on or off +val = strcmp(get(hObject,'State'),'on'); + +%Now we have to apply the new selection to our colormap options panel +if ~val + newSelection = 1; +else + %Chooses the selection from the highest state + selections = get(handles.popupmenu_chooseColorData,'String'); + newSelection = numel(selections); +end +set(handles.popupmenu_chooseColorData,'Value',newSelection); + +handles.cBarChanged = true; +guidata(hObject,handles); +UpdatePlot(handles); + +% --- Executes on slider movement. +function sliderOpacity_Callback(hObject, eventdata, handles) +% hObject handle to sliderOpacity (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +handles.doseOpacity = get(hObject,'Value'); +guidata(hObject,handles); +UpdatePlot(handles); + +% --- Executes during object creation, after setting all properties. +function sliderOpacity_CreateFcn(hObject, eventdata, handles) +% hObject handle to sliderOpacity (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + +%% Data Cursors +function cursorText = dataCursorUpdateFunction(obj,event_obj) +% Display the position of the data cursor +% obj Currently not used (empty) +% event_obj Handle to event object +% output_txt Data cursor text string (string or cell array of strings). + +target = findall(0,'Name','matRadGUI'); + +% Get GUI data (maybe there is another way?) +handles = guidata(target); + +% position of the data point to label +pos = get(event_obj,'Position'); + +%Different behavior for image and profile plot +if get(handles.popupTypeOfPlot,'Value')==1 %Image view + cursorText = cell(0,1); + try + if handles.State >= 1 + plane = get(handles.popupPlane,'Value'); + slice = round(get(handles.sliderSlice,'Value')); + + %Get the CT values + ct = evalin('base','ct'); + + %We differentiate between pos and ix, since the user may put + %the datatip on an isoline which returns a continous position + cubePos = zeros(1,3); + cubePos(plane) = slice; + cubePos(1:end ~= plane) = fliplr(pos); + cubeIx = round(cubePos); + + %Here comes the index permutation stuff + %Cube Index + cursorText{end+1,1} = ['Cube Index: ' mat2str(cubeIx)]; + %Space Coordinates + coords = zeros(1,3); + coords(1) = cubePos(2)*ct.resolution.y; + coords(2) = cubePos(1)*ct.resolution.x; + coords(3) = cubePos(3)*ct.resolution.z; + cursorText{end+1,1} = ['Space Coordinates: ' mat2str(coords,5) ' mm']; + + ctVal = ct.cubeHU{1}(cubeIx(1),cubeIx(2),cubeIx(3)); + cursorText{end+1,1} = ['HU Value: ' num2str(ctVal,3)]; + end + + %Add dose information if available + if handles.State == 3 + %get result structure + result = evalin('base','resultGUI'); + + %Get all result names from popup + resultNames = get(handles.popupDisplayOption,'String'); + + %Display all values of fields found in the resultGUI struct + for runResult = 1:numel(resultNames) + name = resultNames{runResult}; + if isfield(result,name) + field = result.(name); + val = field(cubeIx(1),cubeIx(2),cubeIx(3)); + cursorText{end+1,1} = [name ': ' num2str(val,3)]; + end + end + end + catch + cursorText{end+1,1} = 'Error while retreiving Data!'; + end +else %Profile view + cursorText = cell(2,1); + cursorText{1} = ['Radiological Depth: ' num2str(pos(1),3) ' mm']; + cursorText{2} = [get(target,'DisplayName') ': ' num2str(pos(2),3)]; +end + + + +% --- Executes on selection change in popMenuBioOpt. +function popMenuBioOpt_Callback(hObject, ~, handles) +pln = evalin('base','pln'); +contentBioOpt = get(handles.popMenuBioOpt,'String'); +NewBioOptimization = contentBioOpt(get(handles.popMenuBioOpt,'Value'),:); + +if handles.State > 0 + if (strcmp(pln.propOpt.bioOptimization,'LEMIV_effect') && strcmp(NewBioOptimization,'LEMIV_RBExD')) ||... + (strcmp(pln.propOpt.bioOptimization,'LEMIV_RBExD') && strcmp(NewBioOptimization,'LEMIV_effect')) + % do nothing - re-optimization is still possible + elseif ((strcmp(pln.propOpt.bioOptimization,'const_RBE') && strcmp(NewBioOptimization,'none')) ||... + (strcmp(pln.propOpt.bioOptimization,'none') && strcmp(NewBioOptimization,'const_RBE'))) && isequal(pln.radiationMode,'protons') + % do nothing - re-optimization is still possible + else + handles.State = 1; + end +end +getPlnFromGUI(handles); + +UpdateState(handles); +guidata(hObject,handles); + +% --- Executes during object creation, after setting all properties. +function popMenuBioOpt_CreateFcn(hObject, eventdata, handles) +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + +% --- Executes on button press in btn3Dview. +function btn3Dview_Callback(hObject, eventdata, handles) +% hObject handle to btn3Dview (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +if ~isfield(handles,'axesFig3D') || ~isfield(handles,'axesFig3D') || ~isgraphics(handles.axesFig3D) + handles.fig3D = figure('Name','matRad 3D View'); + handles.axesFig3D = axes('Parent',handles.fig3D); + view(handles.axesFig3D,3); +end +%end + +UpdatePlot(handles); + +guidata(hObject,handles); + +% --- Executes on button press in radiobtnCT. +function radiobtnCT_Callback(hObject, eventdata, handles) +% hObject handle to radiobtnCT (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hint: get(hObject,'Value') returns toggle state of radiobtnCT +UpdatePlot(handles) + +% --- Executes on button press in radiobtnPlan. +function radiobtnPlan_Callback(hObject, eventdata, handles) +% hObject handle to radiobtnPlan (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hint: get(hObject,'Value') returns toggle state of radiobtnPlan +UpdatePlot(handles) + + +% --- Executes on selection change in popupmenu_windowPreset. +function popupmenu_windowPreset_Callback(hObject, eventdata, handles) +% hObject handle to popupmenu_windowPreset (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu_windowPreset contents as cell array +% contents{get(hObject,'Value')} returns selected item from popupmenu_windowPreset + +selectionIndexCube = 2; % working on ct only +selectionIndexWindow = get(handles.popupmenu_windowPreset,'Value'); +newCenter = handles.windowPresets(selectionIndexWindow).center; +newWidth = handles.windowPresets(selectionIndexWindow).width; + +handles.dispWindow{selectionIndexCube,1} = [newCenter - newWidth/2 newCenter + newWidth/2]; +handles.cBarChanged = true; +guidata(hObject,handles); +UpdatePlot(handles); +UpdateColormapOptions(handles); + + +% --- Executes during object creation, after setting all properties. +function popupmenu_windowPreset_CreateFcn(hObject, eventdata, handles) +% hObject handle to popupmenu_windowPreset (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: popupmenu controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + +% setup ct window list +% data and values from CERR https://github.com/adityaapte/CERR +windowNames = {'Custom','Full','Abd/Med', 'Head', 'Liver', 'Lung', 'Spine', 'Vrt/Bone'}; +windowCenter = {NaN, NaN, -10, 45, 80, -500, 30, 400}; +windowWidth = {NaN, NaN, 330, 125, 305, 1500, 300, 1500}; +windowPresets = cell2struct([windowNames', windowCenter', windowWidth'], {'name', 'center', 'width'},2); + + +handles.windowPresets = windowPresets; + +selectionList = {windowPresets(:).name}; +set(hObject,'String',selectionList(:)); +set(hObject,'Value',1); + + +guidata(hObject,handles); + +% --- Executes on button press in checkbox_lockColormap. +function checkbox_lockColormap_Callback(hObject, eventdata, handles) +% hObject handle to checkbox_lockColormap (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hint: get(hObject,'Value') returns toggle state of checkbox_lockColormap +handles.colormapLocked = get(hObject,'Value'); + +if handles.colormapLocked + state = 'Off'; %'Inactive'; +else + state = 'On'; +end + +set(handles.popupmenu_chooseColorData,'Enable',state); +set(handles.popupmenu_windowPreset,'Enable',state); +set(handles.slider_windowWidth,'Enable',state); +set(handles.slider_windowCenter,'Enable',state); +set(handles.edit_windowWidth,'Enable',state); +set(handles.edit_windowCenter,'Enable',state); +set(handles.edit_windowRange,'Enable',state); +set(handles.popupmenu_chooseColormap,'Enable',state); + + +guidata(hObject,handles); + + +function cst = updateStructureTable(handles,cst) +colorAssigned = true; + +% check whether all structures have an assigned color +for i = 1:size(cst,1) + if ~isfield(cst{i,5},'visibleColor') + colorAssigned = false; + break; + elseif isempty(cst{i,5}.visibleColor) + colorAssigned = false; + break; + end +end + +% assign color if color assignment is not already present or inconsistent +if colorAssigned == false + m = 64; + colorStep = ceil(m/size(cst,1)); + colors = colorcube(colorStep*size(cst,1)); + % spread individual VOI colors in the colorcube color palette + colors = colors(1:colorStep:end,:); + + for i = 1:size(cst,1) + cst{i,5}.visibleColor = colors(i,:); + end +end + +for s = 1:size(cst,1) + handles.VOIPlotFlag(s) = cst{s,5}.Visible; + clr = dec2hex(round(cst{s,5}.visibleColor(:)*255),2)'; + clr = ['#';clr(:)]'; + if handles.VOIPlotFlag(s) + tmpString{s} = ['
',cst{s,2},'
']; + else + tmpString{s} = ['
',cst{s,2},'
']; + end +end +set(handles.legendTable,'String',tmpString); + +%-- generates the CST table +function cst = generateCstTable(handles,cst) + +cst = updateStructureTable(handles,cst); + +cstPanel = handles.uipanel3; + +cstPanelPos = getpixelposition(cstPanel); + +%Parameters for line height +objHeight = 22; +lineHeight = 25; %Height of a table line +fieldSep = 2; %Separation between fields horizontally +yTopSep = 40; %Separation of the first line from the top +tableViewHeight = cstPanelPos(4) - yTopSep; %Full height of the view + +%Widths of the fields +buttonW = objHeight; +nameW = 90; +typeW = 70; +opW = objHeight; +functionW = 120; +penaltyW = 40; +paramTitleW = 120; +paramW = 30; + + +%Scrollbar +cstVertTableScroll = findobj(cstPanel.Children,'Style','slider'); +if isempty(cstVertTableScroll) + sliderPos = 0; +else + sliderPos = cstVertTableScroll.Max - cstVertTableScroll.Value; +end +%disp(num2str(sliderPos)); +ypos = @(c) tableViewHeight - c*lineHeight + sliderPos; + +delete(cstPanel.Children); + +%Creates a dummy axis to allow for the use of textboxes instead of uicontrol to be able to use the (la)tex interpreter +tmpAxes = axes('Parent',cstPanel,'units','normalized','position',[0 0 1 1],'visible','off'); + +organTypes = {'OAR', 'TARGET'}; + +%columnname = {'VOI name','VOI type','priority','obj. / const.'};%,'penalty','dose', 'EUD','volume','robustness'}; + +%Get all Classes & classNames +mpkgObjectives = meta.package.fromName('DoseObjectives'); +mpkgConstraints = meta.package.fromName('DoseConstraints'); +classList = [mpkgObjectives.ClassList; mpkgConstraints.ClassList]; + +classList = classList(not([classList.Abstract])); + +%Now get the "internal" name from the properties +classNames = cell(2,numel(classList)); +for clIx = 1:numel(classList) + cl = classList(clIx); + pList = cl.PropertyList; %Get List of all properties + pNameIx = arrayfun(@(p) strcmp(p.Name,'name'),pList); %get index of the "name" property + p = pList(pNameIx); %select name property + pName = p.DefaultValue; % get value / name + classNames(:,clIx) = {cl.Name; pName}; %Store class name and display name +end + +% Collect Class-File & Display Names +%classNames = {classList.Name; p.DefaultValue}; + +%columnformat = {cst(:,2)',{'OAR','TARGET'},'numeric',... +% AllObjectiveFunction,... +% 'numeric','numeric','numeric','numeric',{'none','WC','prob'}}; + +numOfObjectives = 0; +for i = 1:size(cst,1) + if ~isempty(cst{i,6}) + numOfObjectives = numOfObjectives + numel(cst{i,6}); + end +end + +cnt = 0; + +newline = '\n'; + +%Setup Headlines +xPos = 5; +h = uicontrol(cstPanel,'Style','text','String','+/-','Position',[xPos ypos(cnt) buttonW objHeight],'TooltipString','Remove or add Constraint or Objective'); +xPos = xPos + h.Position(3) + fieldSep; +h = uicontrol(cstPanel,'Style','text','String','VOI name','Position',[xPos ypos(cnt) nameW objHeight],'TooltipString','Name of the structure with objective/constraint'); +xPos = xPos + h.Position(3) + fieldSep; +h = uicontrol(cstPanel,'Style','text','String','VOI type','Position',[xPos ypos(cnt) typeW objHeight],'TooltipString','Segmentation Classification'); +xPos = xPos + h.Position(3) + fieldSep; +h = uicontrol(cstPanel,'Style','text','String','OP','Position',[xPos ypos(cnt) opW objHeight],'TooltipString',['Overlap Priority' char(10) '(Smaller number overlaps higher number)']); +xPos = xPos + h.Position(3) + fieldSep; +h = uicontrol(cstPanel,'Style','text','String','Function','Position',[xPos ypos(cnt) functionW objHeight],'TooltipString','Objective/Constraint function type'); +xPos = xPos + h.Position(3) + fieldSep; +h = uicontrol(cstPanel,'Style','text','String','p','Position',[xPos ypos(cnt) penaltyW objHeight],'TooltipString','Optimization penalty'); +xPos = xPos + h.Position(3) + fieldSep; +h = uicontrol(cstPanel,'Style','text','String','| Parameters','Position',[xPos ypos(cnt) paramTitleW objHeight],'TooltipString','List of parameters','HorizontalAlignment','left'); +xPos = xPos + h.Position(3) + fieldSep; +cnt = cnt + 1; + +%Create Objectives / Constraints controls +for i = 1:size(cst,1) + if strcmp(cst(i,3),'IGNORED')~=1 + for j=1:numel(cst{i,6}) + + obj = cst{i,6}{j}; + + %Convert to class if not + if ~isa(obj,'matRad_DoseOptimizationFunction') + try + obj = matRad_DoseOptimizationFunction.createInstanceFromStruct(obj); + catch + warning('Objective/Constraint not valid!') + continue; + end + end + + %VOI + %data{Counter,1} = cst{i,2}; + %ypos = cstPanelPos(4) - (yTopSep + cnt*lineHeight); + xPos = 5; + + %h = uicontrol(cstPanel,'Style','popupmenu','String',cst(:,2)','Position',[xPos ypos 100 objHeight]); + %h.Value = i; + h = uicontrol(cstPanel,'Style','pushbutton','String','-','Position',[xPos ypos(cnt) buttonW objHeight],'TooltipString','Remove Objective/Constraint','Callback',{@btObjRemove_Callback,handles},... + 'UserData',[i,j]); + xPos = xPos + h.Position(3) + fieldSep; + h = uicontrol(cstPanel','Style','edit','String',cst{i,2},'Position',[xPos ypos(cnt) nameW objHeight],'TooltipString','Name',... + 'Enable','inactive',... %Disable editing of name atm + 'UserData',[i,2],'Callback',{@editCstParams_Callback,handles}); %Callback added, however, editing is disabled atm + xPos = xPos + h.Position(3) + fieldSep; + h = uicontrol(cstPanel,'Style','popupmenu','String',organTypes','Value',find(strcmp(cst{i,3},organTypes)),'Position',[xPos ypos(cnt) typeW objHeight],'TooltipString','Segmentation Classification',... + 'UserData',[i,3],'Callback',{@editCstParams_Callback,handles}); + xPos = xPos + h.Position(3) + fieldSep; + h = uicontrol(cstPanel,'Style','edit','String',num2str(cst{i,5}.Priority),'Position',[xPos ypos(cnt) opW objHeight],'TooltipString',['Overlap Priority' newline '(Smaller number overlaps higher number)'],... + 'UserData',[i,5],'Callback',{@editCstParams_Callback,handles}); + xPos = xPos + h.Position(3) + fieldSep; + + h = uicontrol(cstPanel,'Style','popupmenu','String',classNames(2,:)','Value',find(strcmp(obj.name,classNames(2,:))),'Position',[xPos ypos(cnt) functionW objHeight],'TooltipString','Select Objective/Constraint',... + 'UserData',{[i,j],classNames(1,:)},'Callback',{@changeObjFunction_Callback,handles}); + xPos = xPos + h.Position(3) + fieldSep; + + %Check if we have an objective to display penalty + if isa(obj,'DoseObjectives.matRad_DoseObjective') + h = uicontrol(cstPanel,'Style','edit','String',num2str(obj.penalty),'Position',[xPos ypos(cnt) penaltyW objHeight],'TooltipString','Objective Penalty','UserData',[i,j,0],'Callback',{@editObjParam_Callback,handles}); + else + h = uicontrol(cstPanel,'Style','edit','String','----','Position',[xPos ypos(cnt) penaltyW objHeight],'Enable','off'); + end + xPos = xPos + h.Position(3) + fieldSep; + + for p = 1:numel(obj.parameterNames) + %h = uicontrol(cstPanel,'Style','edit','String',obj.parameters{1,p},'Position',[xPos ypos(cnt) 100 objHeight],'Enable','inactive'); + %xPos = xPos + h.Position(3) + fieldSep; + h = text('Parent',tmpAxes,'String',['| ' obj.parameterNames{p} ':'],'VerticalAlignment','middle','units','pix','Position',[xPos ypos(cnt)+lineHeight/2],'Interpreter','tex','FontWeight','normal',... + 'FontSize',cstPanel.FontSize,'FontName',cstPanel.FontName,'FontUnits',cstPanel.FontUnits,'FontWeight','normal');%[xPos ypos(cnt) 100 objHeight]); + xPos = xPos + h.Extent(3) + fieldSep; + %h = annotation(cstPanel,'textbox','String',obj.parameters{1,p},'Units','pix','Position', [xPos ypos(cnt) 100 objHeight],'Interpreter','Tex'); + + %Check if we have a cell and therefore a parameter list + if iscell(obj.parameterTypes{p}) + h = uicontrol(cstPanel,'Style','popupmenu','String',obj.parameterTypes{p}','Value',obj.parameters{p},'TooltipString',obj.parameterNames{p},'Position',[xPos ypos(cnt) paramW*2 objHeight],'UserData',[i,j,p],'Callback',{@editObjParam_Callback,handles}); + else + h = uicontrol(cstPanel,'Style','edit','String',num2str(obj.parameters{p}),'TooltipString',obj.parameterNames{p},'Position',[xPos ypos(cnt) paramW objHeight],'UserData',[i,j,p],'Callback',{@editObjParam_Callback,handles}); + end + + xPos = xPos + h.Position(3) + fieldSep; + end + + cnt = cnt +1; + end + end +end +xPos = 5; +hAdd = uicontrol(cstPanel,'Style','pushbutton','String','+','Position',[xPos ypos(cnt) buttonW objHeight],'TooltipString','Add Objective/Constraint','Callback',{@btObjAdd_Callback,handles}); +xPos = xPos + hAdd.Position(3) + fieldSep; +h = uicontrol(cstPanel,'Style','popupmenu','String',cst(:,2)','Position',[xPos ypos(cnt) nameW objHeight]); +hAdd.UserData = h; + +%Calculate Scrollbar +lastPos = ypos(cnt); +firstPos = ypos(0); +tableHeight = abs(firstPos - lastPos); + +exceedFac = tableHeight / tableViewHeight; +if exceedFac > 1 + sliderFac = exceedFac - 1; + uicontrol(cstPanel,'Style','slider','Units','normalized','Position',[0.975 0 0.025 1],'Min',0,'Max',ceil(sliderFac)*tableViewHeight,'SliderStep',[lineHeight tableViewHeight] ./ (ceil(sliderFac)*tableViewHeight),'Value',ceil(sliderFac)*tableViewHeight - sliderPos,'Callback',{@cstTableSlider_Callback,handles}); +end + + + + +%set(handles.uiTable,'ColumnName',columnname); +%set(handles.uiTable,'ColumnFormat',columnformat); +%set(handles.uiTable,'ColumnEditable',[true true true true true true true true true true]); +%set(handles.uiTable,'Data',data); + + +% --- Executes when uipanel3 is resized. +function uipanel3_SizeChangedFcn(hObject, eventdata, handles) +% hObject handle to uipanel3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +try + generateCstTable(handles,evalin('base','cst')); +catch +end + +function btObjAdd_Callback(hObject, ~, handles) +% hObject handle to btnuiTableAdd (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +popupHandle = hObject.UserData; +cstIndex = popupHandle.Value; + +cst = evalin('base','cst'); +%Add Standard Objective +if strcmp(cst{cstIndex,3},'TARGET') + cst{cstIndex,6}{end+1} = struct(DoseObjectives.matRad_SquaredDeviation); +else + cst{cstIndex,6}{end+1} = struct(DoseObjectives.matRad_SquaredOverdosing); +end + +assignin('base','cst',cst); + +%set(handles.uiTable,'data',data); + +%handles.State=1; +%guidata(hObject,handles); +%UpdateState(handles); + +generateCstTable(handles,cst); + +function btObjRemove_Callback(hObject, ~, handles) +% hObject handle to btnuiTableAdd (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +ix = hObject.UserData; + +cst = evalin('base','cst'); +%Add Standard Objective + +cst{ix(1),6}(ix(2)) = []; + +assignin('base','cst',cst); + +%set(handles.uiTable,'data',data); + +%handles.State=1; +%guidata(hObject,handles); +%UpdateState(handles); + +generateCstTable(handles,cst); + +function editObjParam_Callback(hObject, ~, handles) +% hObject handle to btnuiTableAdd (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +ix = hObject.UserData; + +cst = evalin('base','cst'); +%Add Standard Objective + +%if the third index is 0 we changed the penalty +%if we have a popupmenu selection we use value +%otherwise we use the edit string + +%{ +%obj = cst{ix(1),6}{ix(2)}; +%Convert to class if not +if ~isa(obj,'matRad_DoseOptimizationFunction') + try + eval([obj.className '(obj)']); + catch + warning('Objective/Constraint not valid!') + return; + end +end +%} + +if ix(3) == 0 + cst{ix(1),6}{ix(2)}.penalty = str2double(hObject.String); +elseif isequal(hObject.Style,'popupmenu') + cst{ix(1),6}{ix(2)}.parameters{ix(3)} = hObject.Value; +else + cst{ix(1),6}{ix(2)}.parameters{ix(3)} = str2double(hObject.String); +end + +assignin('base','cst',cst); + +%set(handles.uiTable,'data',data); + +%handles.State=1; +%guidata(hObject,handles); +%UpdateState(handles); + +generateCstTable(handles,cst); + +function changeObjFunction_Callback(hObject, ~, handles) +% hObject handle to btnuiTableAdd (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +data = hObject.UserData; +ix = data{1}; +classNames = data{2}; +classToCreate = classNames{hObject.Value}; + +cst = evalin('base','cst'); +%Add Standard Objective + +%We just check if the user really wanted to change the objective to be +%user-friendly +currentObj = cst{ix(1),6}{ix(2)}; +currentClass = class(currentObj); +if ~strcmp(currentClass,classToCreate) + newObj = eval(classToCreate); + + % Only if we have a penalty value for optimization, apply the new one + % Maybe this check should be more exact? + if (isfield(currentObj,'penalty') || isprop(currentObj,'penalty')) && isprop(newObj,'penalty') + newObj.penalty = currentObj.penalty; + end + + cst{ix(1),6}{ix(2)} = struct(newObj); + + assignin('base','cst',cst); + + %set(handles.uiTable,'data',data); + + %handles.State=1; + %guidata(hObject,handles); + %UpdateState(handles); + + generateCstTable(handles,cst); +end + +function editCstParams_Callback(hObject,~,handles) +data = hObject.UserData; +ix = data(1); +col = data(2); + +cst = evalin('base','cst'); + +switch col + case 2 + cst{ix,col} = hObject.String; + case 3 + cst{ix,col} = hObject.String{hObject.Value}; + case 5 + cst{ix,col}.Priority = uint32(str2double(hObject.String)); + otherwise + warning('Wrong column assignment in GUI based cst setting'); +end + +assignin('base','cst',cst); + +generateCstTable(handles,cst); + + +% --- Executes on button press in radiobutton3Dconf. +function radiobutton3Dconf_Callback(hObject, eventdata, handles) +% hObject handle to radiobutton3Dconf (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hint: get(hObject,'Value') returns toggle state of radiobutton3Dconf + +function x = matRad_checkForConnectedBixelRows(stf) + +x = true; + +for i = 1:size(stf,2) + + bixelPos = reshape([stf(i).ray.rayPos_bev],3,[]); + + rowCoords = unique(bixelPos(3,:)); + + for j = 1:numel(rowCoords) + + increments = diff(bixelPos(1,rowCoords(j) == bixelPos(3,:))); + + % if we find one not connected row -> return false + if numel(unique(increments)) > 1 + x = false; + return; + end + end + +end + +% --- Executes on slider movement. +function cstTableSlider_Callback(hObject, eventdata, handles) +% hObject handle to cstTableSlider (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider +generateCstTable(handles,evalin('base','cst')); + +% --- Executes during object creation, after setting all properties. +function cstTableSlider_CreateFcn(hObject, eventdata, handles) +% hObject handle to cstTableSlider (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + + + +% --- Creates and returns a handle to the GUI figure. +function h1 = matRadGUI_export_LayoutFcn(policy) +% policy - create a new figure or use a singleton. 'new' or 'reuse'. + +persistent hsingleton; +if strcmpi(policy, 'reuse') & ishandle(hsingleton) + h1 = hsingleton; + return; +end +load matRadGUI_export.mat + + +appdata = []; +appdata.GUIDEOptions = mat{1}; +appdata.lastValidTag = 'figure1'; +appdata.UsedByGUIData_m = struct(... + 'windowPresets', struct(... + 'name', 'Custom', ... + 'center', NaN, ... + 'width', NaN)); +appdata.GUIDELayoutEditor = []; +appdata.initTags = struct(... + 'handle', [], ... + 'tag', 'figure1'); + +h1 = figure(... +'PaperUnits',get(0,'defaultfigurePaperUnits'),... +'Units','characters',... +'Position',[138.4 -7.38461538461539 273.4 59.5384615384615],... +'Visible','on',... +'Color',[0.501960784313725 0.501960784313725 0.501960784313725],... +'CloseRequestFcn',@(hObject,eventdata)matRadGUI_export('figure1_CloseRequestFcn',hObject,eventdata,guidata(hObject)),... +'IntegerHandle','off',... +'Colormap',[0 0 0.5625;0 0 0.625;0 0 0.6875;0 0 0.75;0 0 0.8125;0 0 0.875;0 0 0.9375;0 0 1;0 0.0625 1;0 0.125 1;0 0.1875 1;0 0.25 1;0 0.3125 1;0 0.375 1;0 0.4375 1;0 0.5 1;0 0.5625 1;0 0.625 1;0 0.6875 1;0 0.75 1;0 0.8125 1;0 0.875 1;0 0.9375 1;0 1 1;0.0625 1 1;0.125 1 0.9375;0.1875 1 0.875;0.25 1 0.8125;0.3125 1 0.75;0.375 1 0.6875;0.4375 1 0.625;0.5 1 0.5625;0.5625 1 0.5;0.625 1 0.4375;0.6875 1 0.375;0.75 1 0.3125;0.8125 1 0.25;0.875 1 0.1875;0.9375 1 0.125;1 1 0.0625;1 1 0;1 0.9375 0;1 0.875 0;1 0.8125 0;1 0.75 0;1 0.6875 0;1 0.625 0;1 0.5625 0;1 0.5 0;1 0.4375 0;1 0.375 0;1 0.3125 0;1 0.25 0;1 0.1875 0;1 0.125 0;1 0.0625 0;1 0 0;0.9375 0 0;0.875 0 0;0.8125 0 0;0.75 0 0;0.6875 0 0;0.625 0 0;0.5625 0 0],... +'MenuBar','none',... +'Name','matRadGUI',... +'NumberTitle','off',... +'Tag','figure1',... +'UserData',[],... +'PaperPosition',get(0,'defaultfigurePaperPosition'),... +'PaperSize',[20.99999864 29.69999902],... +'PaperType',get(0,'defaultfigurePaperType'),... +'InvertHardcopy',get(0,'defaultfigureInvertHardcopy'),... +'ScreenPixelsPerInchMode','manual',... +'HandleVisibility','callback',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'axesLogo'; + +h2 = axes(... +'Parent',h1,... +'FontUnits',get(0,'defaultaxesFontUnits'),... +'Units',get(0,'defaultaxesUnits'),... +'CameraPosition',[0.5 0.5 9.16025403784439],... +'CameraPositionMode',get(0,'defaultaxesCameraPositionMode'),... +'CameraTarget',[0.5 0.5 0.5],... +'CameraTargetMode',get(0,'defaultaxesCameraTargetMode'),... +'CameraViewAngle',6.60861036031192,... +'CameraViewAngleMode',get(0,'defaultaxesCameraViewAngleMode'),... +'PlotBoxAspectRatio',[1 0.288951841359773 0.288951841359773],... +'PlotBoxAspectRatioMode',get(0,'defaultaxesPlotBoxAspectRatioMode'),... +'FontName','CMU Serif',... +'Colormap',[0 0 0.5625;0 0 0.625;0 0 0.6875;0 0 0.75;0 0 0.8125;0 0 0.875;0 0 0.9375;0 0 1;0 0.0625 1;0 0.125 1;0 0.1875 1;0 0.25 1;0 0.3125 1;0 0.375 1;0 0.4375 1;0 0.5 1;0 0.5625 1;0 0.625 1;0 0.6875 1;0 0.75 1;0 0.8125 1;0 0.875 1;0 0.9375 1;0 1 1;0.0625 1 1;0.125 1 0.9375;0.1875 1 0.875;0.25 1 0.8125;0.3125 1 0.75;0.375 1 0.6875;0.4375 1 0.625;0.5 1 0.5625;0.5625 1 0.5;0.625 1 0.4375;0.6875 1 0.375;0.75 1 0.3125;0.8125 1 0.25;0.875 1 0.1875;0.9375 1 0.125;1 1 0.0625;1 1 0;1 0.9375 0;1 0.875 0;1 0.8125 0;1 0.75 0;1 0.6875 0;1 0.625 0;1 0.5625 0;1 0.5 0;1 0.4375 0;1 0.375 0;1 0.3125 0;1 0.25 0;1 0.1875 0;1 0.125 0;1 0.0625 0;1 0 0;0.9375 0 0;0.875 0 0;0.8125 0 0;0.75 0 0;0.6875 0 0;0.625 0 0;0.5625 0 0],... +'ColormapMode',get(0,'defaultaxesColormapMode'),... +'Alphamap',[0 0.0159 0.0317 0.0476 0.0635 0.0794 0.0952 0.1111 0.127 0.1429 0.1587 0.1746 0.1905 0.2063 0.2222 0.2381 0.254 0.2698 0.2857 0.3016 0.3175 0.3333 0.3492 0.3651 0.381 0.3968 0.4127 0.4286 0.4444 0.4603 0.4762 0.4921 0.5079 0.5238 0.5397 0.5556 0.5714 0.5873 0.6032 0.619 0.6349 0.6508 0.6667 0.6825 0.6984 0.7143 0.7302 0.746 0.7619 0.7778 0.7937 0.8095 0.8254 0.8413 0.8571 0.873 0.8889 0.9048 0.9206 0.9365 0.9524 0.9683 0.9841 1],... +'AlphamapMode',get(0,'defaultaxesAlphamapMode'),... +'XTick',[0 0.2 0.4 0.6 0.8 1],... +'XTickMode',get(0,'defaultaxesXTickMode'),... +'XTickLabel',{ '0'; '0.2'; '0.4'; '0.6'; '0.8'; '1' },... +'XTickLabelMode',get(0,'defaultaxesXTickLabelMode'),... +'YTick',[0 0.5 1],... +'YTickMode',get(0,'defaultaxesYTickMode'),... +'YTickLabel',{ '0'; '0.5'; '1' },... +'YTickLabelMode',get(0,'defaultaxesYTickLabelMode'),... +'Color',get(0,'defaultaxesColor'),... +'CameraMode',get(0,'defaultaxesCameraMode'),... +'DataSpaceMode',get(0,'defaultaxesDataSpaceMode'),... +'ColorSpaceMode',get(0,'defaultaxesColorSpaceMode'),... +'DecorationContainerMode',get(0,'defaultaxesDecorationContainerMode'),... +'ChildContainerMode',get(0,'defaultaxesChildContainerMode'),... +'XRulerMode',get(0,'defaultaxesXRulerMode'),... +'YRulerMode',get(0,'defaultaxesYRulerMode'),... +'ZRulerMode',get(0,'defaultaxesZRulerMode'),... +'AmbientLightSourceMode',get(0,'defaultaxesAmbientLightSourceMode'),... +'Tag','axesLogo',... +'Position',[0.444874274661509 0.893725992317542 0.184397163120567 0.0998719590268886],... +'ActivePositionProperty','position',... +'ActivePositionPropertyMode',get(0,'defaultaxesActivePositionPropertyMode'),... +'LooseInset',[0.182759687929063 0.112926163636008 0.133555156563546 0.0769951115700055],... +'FontSize',9.63,... +'SortMethod','childorder',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +h3 = get(h2,'title'); + +set(h3,... +'Parent',h2,... +'Units','data',... +'FontUnits','points',... +'DecorationContainer',[],... +'DecorationContainerMode','auto',... +'Color',[0 0 0],... +'ColorMode','auto',... +'Position',[0.500002778623327 1.02596323529412 0.5],... +'PositionMode','auto',... +'String',blanks(0),... +'Interpreter','tex',... +'Rotation',0,... +'RotationMode','auto',... +'FontName','CMU Serif',... +'FontSize',10.593,... +'FontSizeMode','auto',... +'FontAngle','normal',... +'FontWeight','bold',... +'HorizontalAlignment','center',... +'HorizontalAlignmentMode','auto',... +'VerticalAlignment','bottom',... +'VerticalAlignmentMode','auto',... +'EdgeColor','none',... +'LineStyle','-',... +'LineWidth',0.5,... +'BackgroundColor','none',... +'Margin',3,... +'Clipping','off',... +'Layer','middle',... +'LayerMode','auto',... +'FontSmoothing','on',... +'FontSmoothingMode','auto',... +'DisplayName',blanks(0),... +'IncludeRenderer','on',... +'IsContainer','off',... +'IsContainerMode','auto',... +'HelpTopicKey',blanks(0),... +'ButtonDownFcn',blanks(0),... +'BusyAction','queue',... +'Interruptible','on',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... +'DeleteFcn',blanks(0),... +'Tag',blanks(0),... +'HitTest','on',... +'PickableParts','visible',... +'PickablePartsMode','auto',... +'DimensionNames',{ 'X' 'Y' 'Z' },... +'DimensionNamesMode','auto',... +'XLimInclude','on',... +'YLimInclude','on',... +'ZLimInclude','on',... +'CLimInclude','on',... +'ALimInclude','on',... +'Description','Axes Title',... +'DescriptionMode','auto',... +'Visible','on',... +'Serializable','on',... +'HandleVisibility','off',... +'TransformForPrintFcnImplicitInvoke','on',... +'TransformForPrintFcnImplicitInvokeMode','auto'); + +h4 = get(h2,'xlabel'); + +set(h4,... +'Parent',h2,... +'Units','data',... +'FontUnits','points',... +'DecorationContainer',[],... +'DecorationContainerMode','auto',... +'Color',[0.15 0.15 0.15],... +'ColorMode','auto',... +'Position',[0.500000476837158 -0.277303926477245 0],... +'PositionMode','auto',... +'String',blanks(0),... +'Interpreter','tex',... +'Rotation',0,... +'RotationMode','auto',... +'FontName','CMU Serif',... +'FontSize',10.593,... +'FontSizeMode','auto',... +'FontAngle','normal',... +'FontWeight','normal',... +'HorizontalAlignment','center',... +'HorizontalAlignmentMode','auto',... +'VerticalAlignment','top',... +'VerticalAlignmentMode','auto',... +'EdgeColor','none',... +'LineStyle','-',... +'LineWidth',0.5,... +'BackgroundColor','none',... +'Margin',3,... +'Clipping','off',... +'Layer','back',... +'LayerMode','auto',... +'FontSmoothing','on',... +'FontSmoothingMode','auto',... +'DisplayName',blanks(0),... +'IncludeRenderer','on',... +'IsContainer','off',... +'IsContainerMode','auto',... +'HelpTopicKey',blanks(0),... +'ButtonDownFcn',blanks(0),... +'BusyAction','queue',... +'Interruptible','on',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... +'DeleteFcn',blanks(0),... +'Tag',blanks(0),... +'HitTest','on',... +'PickableParts','visible',... +'PickablePartsMode','auto',... +'DimensionNames',{ 'X' 'Y' 'Z' },... +'DimensionNamesMode','auto',... +'XLimInclude','on',... +'YLimInclude','on',... +'ZLimInclude','on',... +'CLimInclude','on',... +'ALimInclude','on',... +'Description','AxisRulerBase Label',... +'DescriptionMode','auto',... +'Visible','on',... +'Serializable','on',... +'HandleVisibility','off',... +'TransformForPrintFcnImplicitInvoke','on',... +'TransformForPrintFcnImplicitInvokeMode','auto'); + +h5 = get(h2,'ylabel'); + +set(h5,... +'Parent',h2,... +'Units','data',... +'FontUnits','points',... +'DecorationContainer',[],... +'DecorationContainerMode','auto',... +'Color',[0.15 0.15 0.15],... +'ColorMode','auto',... +'Position',[-0.0943626077857305 0.500000476837158 0],... +'PositionMode','auto',... +'String',blanks(0),... +'Interpreter','tex',... +'Rotation',90,... +'RotationMode','auto',... +'FontName','CMU Serif',... +'FontSize',10.593,... +'FontSizeMode','auto',... +'FontAngle','normal',... +'FontWeight','normal',... +'HorizontalAlignment','center',... +'HorizontalAlignmentMode','auto',... +'VerticalAlignment','bottom',... +'VerticalAlignmentMode','auto',... +'EdgeColor','none',... +'LineStyle','-',... +'LineWidth',0.5,... +'BackgroundColor','none',... +'Margin',3,... +'Clipping','off',... +'Layer','back',... +'LayerMode','auto',... +'FontSmoothing','on',... +'FontSmoothingMode','auto',... +'DisplayName',blanks(0),... +'IncludeRenderer','on',... +'IsContainer','off',... +'IsContainerMode','auto',... +'HelpTopicKey',blanks(0),... +'ButtonDownFcn',blanks(0),... +'BusyAction','queue',... +'Interruptible','on',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... +'DeleteFcn',blanks(0),... +'Tag',blanks(0),... +'HitTest','on',... +'PickableParts','visible',... +'PickablePartsMode','auto',... +'DimensionNames',{ 'X' 'Y' 'Z' },... +'DimensionNamesMode','auto',... +'XLimInclude','on',... +'YLimInclude','on',... +'ZLimInclude','on',... +'CLimInclude','on',... +'ALimInclude','on',... +'Description','AxisRulerBase Label',... +'DescriptionMode','auto',... +'Visible','on',... +'Serializable','on',... +'HandleVisibility','off',... +'TransformForPrintFcnImplicitInvoke','on',... +'TransformForPrintFcnImplicitInvokeMode','auto'); + +h6 = get(h2,'zlabel'); + +set(h6,... +'Parent',h2,... +'Units','data',... +'FontUnits','points',... +'DecorationContainer',[],... +'DecorationContainerMode','auto',... +'Color',[0.15 0.15 0.15],... +'ColorMode','auto',... +'Position',[0 0 0],... +'PositionMode','auto',... +'String',blanks(0),... +'Interpreter','tex',... +'Rotation',0,... +'RotationMode','auto',... +'FontName','CMU Serif',... +'FontSize',10,... +'FontSizeMode','auto',... +'FontAngle','normal',... +'FontWeight','normal',... +'HorizontalAlignment','left',... +'HorizontalAlignmentMode','auto',... +'VerticalAlignment','middle',... +'VerticalAlignmentMode','auto',... +'EdgeColor','none',... +'LineStyle','-',... +'LineWidth',0.5,... +'BackgroundColor','none',... +'Margin',3,... +'Clipping','off',... +'Layer','middle',... +'LayerMode','auto',... +'FontSmoothing','on',... +'FontSmoothingMode','auto',... +'DisplayName',blanks(0),... +'IncludeRenderer','on',... +'IsContainer','off',... +'IsContainerMode','auto',... +'HelpTopicKey',blanks(0),... +'ButtonDownFcn',blanks(0),... +'BusyAction','queue',... +'Interruptible','on',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... +'DeleteFcn',blanks(0),... +'Tag',blanks(0),... +'HitTest','on',... +'PickableParts','visible',... +'PickablePartsMode','auto',... +'DimensionNames',{ 'X' 'Y' 'Z' },... +'DimensionNamesMode','auto',... +'XLimInclude','on',... +'YLimInclude','on',... +'ZLimInclude','on',... +'CLimInclude','on',... +'ALimInclude','on',... +'Description','AxisRulerBase Label',... +'DescriptionMode','auto',... +'Visible','off',... +'Serializable','on',... +'HandleVisibility','off',... +'TransformForPrintFcnImplicitInvoke','on',... +'TransformForPrintFcnImplicitInvokeMode','auto'); + +appdata = []; +appdata.lastValidTag = 'axesDKFZ'; + +h7 = axes(... +'Parent',h1,... +'FontUnits',get(0,'defaultaxesFontUnits'),... +'Units',get(0,'defaultaxesUnits'),... +'CameraPosition',[0.5 0.5 9.16025403784439],... +'CameraPositionMode',get(0,'defaultaxesCameraPositionMode'),... +'CameraTarget',[0.5 0.5 0.5],... +'CameraTargetMode',get(0,'defaultaxesCameraTargetMode'),... +'CameraViewAngle',6.60861036031192,... +'CameraViewAngleMode',get(0,'defaultaxesCameraViewAngleMode'),... +'PlotBoxAspectRatio',[1 0.145161290322581 0.145161290322581],... +'PlotBoxAspectRatioMode',get(0,'defaultaxesPlotBoxAspectRatioMode'),... +'FontName','CMU Serif',... +'Colormap',[0 0 0.5625;0 0 0.625;0 0 0.6875;0 0 0.75;0 0 0.8125;0 0 0.875;0 0 0.9375;0 0 1;0 0.0625 1;0 0.125 1;0 0.1875 1;0 0.25 1;0 0.3125 1;0 0.375 1;0 0.4375 1;0 0.5 1;0 0.5625 1;0 0.625 1;0 0.6875 1;0 0.75 1;0 0.8125 1;0 0.875 1;0 0.9375 1;0 1 1;0.0625 1 1;0.125 1 0.9375;0.1875 1 0.875;0.25 1 0.8125;0.3125 1 0.75;0.375 1 0.6875;0.4375 1 0.625;0.5 1 0.5625;0.5625 1 0.5;0.625 1 0.4375;0.6875 1 0.375;0.75 1 0.3125;0.8125 1 0.25;0.875 1 0.1875;0.9375 1 0.125;1 1 0.0625;1 1 0;1 0.9375 0;1 0.875 0;1 0.8125 0;1 0.75 0;1 0.6875 0;1 0.625 0;1 0.5625 0;1 0.5 0;1 0.4375 0;1 0.375 0;1 0.3125 0;1 0.25 0;1 0.1875 0;1 0.125 0;1 0.0625 0;1 0 0;0.9375 0 0;0.875 0 0;0.8125 0 0;0.75 0 0;0.6875 0 0;0.625 0 0;0.5625 0 0],... +'ColormapMode',get(0,'defaultaxesColormapMode'),... +'Alphamap',[0 0.0159 0.0317 0.0476 0.0635 0.0794 0.0952 0.1111 0.127 0.1429 0.1587 0.1746 0.1905 0.2063 0.2222 0.2381 0.254 0.2698 0.2857 0.3016 0.3175 0.3333 0.3492 0.3651 0.381 0.3968 0.4127 0.4286 0.4444 0.4603 0.4762 0.4921 0.5079 0.5238 0.5397 0.5556 0.5714 0.5873 0.6032 0.619 0.6349 0.6508 0.6667 0.6825 0.6984 0.7143 0.7302 0.746 0.7619 0.7778 0.7937 0.8095 0.8254 0.8413 0.8571 0.873 0.8889 0.9048 0.9206 0.9365 0.9524 0.9683 0.9841 1],... +'AlphamapMode',get(0,'defaultaxesAlphamapMode'),... +'XTick',[0 0.2 0.4 0.6 0.8 1],... +'XTickMode',get(0,'defaultaxesXTickMode'),... +'XTickLabel',{ '0'; '0.2'; '0.4'; '0.6'; '0.8'; '1' },... +'XTickLabelMode',get(0,'defaultaxesXTickLabelMode'),... +'YTick',[0 0.5 1],... +'YTickMode',get(0,'defaultaxesYTickMode'),... +'YTickLabel',{ '0'; '0.5'; '1' },... +'YTickLabelMode',get(0,'defaultaxesYTickLabelMode'),... +'Color',get(0,'defaultaxesColor'),... +'CameraMode',get(0,'defaultaxesCameraMode'),... +'DataSpaceMode',get(0,'defaultaxesDataSpaceMode'),... +'ColorSpaceMode',get(0,'defaultaxesColorSpaceMode'),... +'DecorationContainerMode',get(0,'defaultaxesDecorationContainerMode'),... +'ChildContainerMode',get(0,'defaultaxesChildContainerMode'),... +'XRulerMode',get(0,'defaultaxesXRulerMode'),... +'YRulerMode',get(0,'defaultaxesYRulerMode'),... +'ZRulerMode',get(0,'defaultaxesZRulerMode'),... +'AmbientLightSourceMode',get(0,'defaultaxesAmbientLightSourceMode'),... +'Tag','axesDKFZ',... +'Position',[0.652482269503546 0.903969270166453 0.259187620889749 0.0717029449423816],... +'ActivePositionProperty','position',... +'ActivePositionPropertyMode',get(0,'defaultaxesActivePositionPropertyMode'),... +'LooseInset',[0.13 0.11 0.0950000000000001 0.0749999999999999],... +'FontSize',9.63,... +'SortMethod','childorder',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +h8 = get(h7,'title'); + +set(h8,... +'Parent',h7,... +'Units','data',... +'FontUnits','points',... +'DecorationContainer',[],... +'DecorationContainerMode','auto',... +'Color',[0 0 0],... +'ColorMode','auto',... +'Position',[0.500002880250254 1.03678125 0.500000000000007],... +'PositionMode','auto',... +'String',blanks(0),... +'Interpreter','tex',... +'Rotation',0,... +'RotationMode','auto',... +'FontName','CMU Serif',... +'FontSize',10.593,... +'FontSizeMode','auto',... +'FontAngle','normal',... +'FontWeight','bold',... +'HorizontalAlignment','center',... +'HorizontalAlignmentMode','auto',... +'VerticalAlignment','bottom',... +'VerticalAlignmentMode','auto',... +'EdgeColor','none',... +'LineStyle','-',... +'LineWidth',0.5,... +'BackgroundColor','none',... +'Margin',3,... +'Clipping','off',... +'Layer','middle',... +'LayerMode','auto',... +'FontSmoothing','on',... +'FontSmoothingMode','auto',... +'DisplayName',blanks(0),... +'IncludeRenderer','on',... +'IsContainer','off',... +'IsContainerMode','auto',... +'HelpTopicKey',blanks(0),... +'ButtonDownFcn',blanks(0),... +'BusyAction','queue',... +'Interruptible','on',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... +'DeleteFcn',blanks(0),... +'Tag',blanks(0),... +'HitTest','on',... +'PickableParts','visible',... +'PickablePartsMode','auto',... +'DimensionNames',{ 'X' 'Y' 'Z' },... +'DimensionNamesMode','auto',... +'XLimInclude','on',... +'YLimInclude','on',... +'ZLimInclude','on',... +'CLimInclude','on',... +'ALimInclude','on',... +'Description','Axes Title',... +'DescriptionMode','auto',... +'Visible','on',... +'Serializable','on',... +'HandleVisibility','off',... +'TransformForPrintFcnImplicitInvoke','on',... +'TransformForPrintFcnImplicitInvokeMode','auto'); + +h9 = get(h7,'xlabel'); + +set(h9,... +'Parent',h7,... +'Units','data',... +'FontUnits','points',... +'DecorationContainer',[],... +'DecorationContainerMode','auto',... +'Color',[0.15 0.15 0.15],... +'ColorMode','auto',... +'Position',[0.500000476837158 -0.392847229176095 7.105427357601e-15],... +'PositionMode','auto',... +'String',blanks(0),... +'Interpreter','tex',... +'Rotation',0,... +'RotationMode','auto',... +'FontName','CMU Serif',... +'FontSize',10.593,... +'FontSizeMode','auto',... +'FontAngle','normal',... +'FontWeight','normal',... +'HorizontalAlignment','center',... +'HorizontalAlignmentMode','auto',... +'VerticalAlignment','top',... +'VerticalAlignmentMode','auto',... +'EdgeColor','none',... +'LineStyle','-',... +'LineWidth',0.5,... +'BackgroundColor','none',... +'Margin',3,... +'Clipping','off',... +'Layer','back',... +'LayerMode','auto',... +'FontSmoothing','on',... +'FontSmoothingMode','auto',... +'DisplayName',blanks(0),... +'IncludeRenderer','on',... +'IsContainer','off',... +'IsContainerMode','auto',... +'HelpTopicKey',blanks(0),... +'ButtonDownFcn',blanks(0),... +'BusyAction','queue',... +'Interruptible','on',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... +'DeleteFcn',blanks(0),... +'Tag',blanks(0),... +'HitTest','on',... +'PickableParts','visible',... +'PickablePartsMode','auto',... +'DimensionNames',{ 'X' 'Y' 'Z' },... +'DimensionNamesMode','auto',... +'XLimInclude','on',... +'YLimInclude','on',... +'ZLimInclude','on',... +'CLimInclude','on',... +'ALimInclude','on',... +'Description','AxisRulerBase Label',... +'DescriptionMode','auto',... +'Visible','on',... +'Serializable','on',... +'HandleVisibility','off',... +'TransformForPrintFcnImplicitInvoke','on',... +'TransformForPrintFcnImplicitInvokeMode','auto'); + +h10 = get(h7,'ylabel'); + +set(h10,... +'Parent',h7,... +'Units','data',... +'FontUnits','points',... +'DecorationContainer',[],... +'DecorationContainerMode','auto',... +'Color',[0.15 0.15 0.15],... +'ColorMode','auto',... +'Position',[-0.0671572591700866 0.50000047683716 7.105427357601e-15],... +'PositionMode','auto',... +'String',blanks(0),... +'Interpreter','tex',... +'Rotation',90,... +'RotationMode','auto',... +'FontName','CMU Serif',... +'FontSize',10.593,... +'FontSizeMode','auto',... +'FontAngle','normal',... +'FontWeight','normal',... +'HorizontalAlignment','center',... +'HorizontalAlignmentMode','auto',... +'VerticalAlignment','bottom',... +'VerticalAlignmentMode','auto',... +'EdgeColor','none',... +'LineStyle','-',... +'LineWidth',0.5,... +'BackgroundColor','none',... +'Margin',3,... +'Clipping','off',... +'Layer','back',... +'LayerMode','auto',... +'FontSmoothing','on',... +'FontSmoothingMode','auto',... +'DisplayName',blanks(0),... +'IncludeRenderer','on',... +'IsContainer','off',... +'IsContainerMode','auto',... +'HelpTopicKey',blanks(0),... +'ButtonDownFcn',blanks(0),... +'BusyAction','queue',... +'Interruptible','on',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... +'DeleteFcn',blanks(0),... +'Tag',blanks(0),... +'HitTest','on',... +'PickableParts','visible',... +'PickablePartsMode','auto',... +'DimensionNames',{ 'X' 'Y' 'Z' },... +'DimensionNamesMode','auto',... +'XLimInclude','on',... +'YLimInclude','on',... +'ZLimInclude','on',... +'CLimInclude','on',... +'ALimInclude','on',... +'Description','AxisRulerBase Label',... +'DescriptionMode','auto',... +'Visible','on',... +'Serializable','on',... +'HandleVisibility','off',... +'TransformForPrintFcnImplicitInvoke','on',... +'TransformForPrintFcnImplicitInvokeMode','auto'); + +h11 = get(h7,'zlabel'); + +set(h11,... +'Parent',h7,... +'Units','data',... +'FontUnits','points',... +'DecorationContainer',[],... +'DecorationContainerMode','auto',... +'Color',[0.15 0.15 0.15],... +'ColorMode','auto',... +'Position',[0 0 0],... +'PositionMode','auto',... +'String',blanks(0),... +'Interpreter','tex',... +'Rotation',0,... +'RotationMode','auto',... +'FontName','CMU Serif',... +'FontSize',10,... +'FontSizeMode','auto',... +'FontAngle','normal',... +'FontWeight','normal',... +'HorizontalAlignment','left',... +'HorizontalAlignmentMode','auto',... +'VerticalAlignment','middle',... +'VerticalAlignmentMode','auto',... +'EdgeColor','none',... +'LineStyle','-',... +'LineWidth',0.5,... +'BackgroundColor','none',... +'Margin',3,... +'Clipping','off',... +'Layer','middle',... +'LayerMode','auto',... +'FontSmoothing','on',... +'FontSmoothingMode','auto',... +'DisplayName',blanks(0),... +'IncludeRenderer','on',... +'IsContainer','off',... +'IsContainerMode','auto',... +'HelpTopicKey',blanks(0),... +'ButtonDownFcn',blanks(0),... +'BusyAction','queue',... +'Interruptible','on',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... +'DeleteFcn',blanks(0),... +'Tag',blanks(0),... +'HitTest','on',... +'PickableParts','visible',... +'PickablePartsMode','auto',... +'DimensionNames',{ 'X' 'Y' 'Z' },... +'DimensionNamesMode','auto',... +'XLimInclude','on',... +'YLimInclude','on',... +'ZLimInclude','on',... +'CLimInclude','on',... +'ALimInclude','on',... +'Description','AxisRulerBase Label',... +'DescriptionMode','auto',... +'Visible','off',... +'Serializable','on',... +'HandleVisibility','off',... +'TransformForPrintFcnImplicitInvoke','on',... +'TransformForPrintFcnImplicitInvokeMode','auto'); + +appdata = []; +appdata.lastValidTag = 'uipanel1'; + +h12 = uipanel(... +'Parent',h1,... +'FontUnits',get(0,'defaultuipanelFontUnits'),... +'Units',get(0,'defaultuipanelUnits'),... +'ShadowColor',get(0,'defaultuipanelShadowColor'),... +'Title','Plan',... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Tag','uipanel1',... +'UserData',[],... +'Clipping','off',... +'Position',[0.00451321727917473 0.527528809218956 0.430689877498388 0.272727272727273],... +'FontName','Helvetica',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'txtBixelWidth'; + +h13 = uicontrol(... +'Parent',h12,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','bixel width in [mm]',... +'Style','text',... +'Position',[0.0347043701799486 0.859315589353612 0.17866323907455 0.0950570342205324],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','txtBixelWidth',... +'UserData',[],... +'FontName','Helvetica',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'editBixelWidth'; + +h14 = uicontrol(... +'Parent',h12,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','5',... +'Style','edit',... +'Position',[0.219794344473008 0.889733840304182 0.161953727506427 0.0836501901140684],... +'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... +'Callback',@(hObject,eventdata)matRadGUI_export('editBixelWidth_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('editBixelWidth_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','editBixelWidth',... +'FontWeight','bold'); + +appdata = []; +appdata.lastValidTag = 'txtGantryAngle'; + +h15 = uicontrol(... +'Parent',h12,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','Gantry Angle in °',... +'Style','text',... +'Position',[0.032133676092545 0.752851711026616 0.176092544987147 0.0950570342205324],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','txtGantryAngle',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'editGantryAngle'; + +h16 = uicontrol(... +'Parent',h12,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','0',... +'Style','edit',... +'Position',[0.219794344473008 0.779467680608365 0.161953727506427 0.0836501901140684],... +'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... +'Callback',@(hObject,eventdata)matRadGUI_export('editGantryAngle_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('editGantryAngle_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','editGantryAngle',... +'FontWeight','bold'); + +appdata = []; +appdata.lastValidTag = 'txtCouchAngle'; + +h17 = uicontrol(... +'Parent',h12,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','Couch Angle in °',... +'Style','text',... +'Position',[0.0347043701799486 0.64638783269962 0.173521850899743 0.0950570342205324],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','txtCouchAngle',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'editCouchAngle'; + +h18 = uicontrol(... +'Parent',h12,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','0',... +'Style','edit',... +'Position',[0.219794344473008 0.669201520912547 0.161953727506427 0.0836501901140685],... +'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... +'Callback',@(hObject,eventdata)matRadGUI_export('editCouchAngle_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('editCouchAngle_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','editCouchAngle',... +'FontWeight','bold'); + +appdata = []; +appdata.lastValidTag = 'popupRadMode'; + +h19 = uicontrol(... +'Parent',h12,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String',{ 'photons'; 'protons'; 'carbon' },... +'Style','popupmenu',... +'Value',1,... +'Position',[0.219794344473008 0.52851711026616 0.161953727506427 0.114068441064639],... +'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... +'Callback',@(hObject,eventdata)matRadGUI_export('popupRadMode_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('popupRadMode_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','popupRadMode',... +'FontWeight','bold'); + +appdata = []; +appdata.lastValidTag = 'txtRadMode'; + +h20 = uicontrol(... +'Parent',h12,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','Radiation Mode',... +'Style','text',... +'Position',[0.051413881748072 0.539923954372624 0.146529562982005 0.0950570342205324],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','txtRadMode',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'txtNumOfFractions'; + +h21 = uicontrol(... +'Parent',h12,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','# Fractions',... +'Style','text',... +'Position',[0.051413881748072 0.209125475285171 0.143958868894602 0.106463878326996],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','txtNumOfFractions',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'editFraction'; + +h22 = uicontrol(... +'Parent',h12,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','30',... +'Style','edit',... +'Position',[0.219794344473008 0.228136882129278 0.161953727506427 0.0836501901140684],... +'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... +'Callback',@(hObject,eventdata)matRadGUI_export('editFraction_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('editFraction_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','editFraction',... +'FontWeight','bold'); + +appdata = []; +appdata.lastValidTag = 'txtIsoCenter'; + +h23 = uicontrol(... +'Parent',h12,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','IsoCenter in [mm]',... +'Style','text',... +'Position',[0.0282776349614396 0.330798479087452 0.201799485861183 0.091254752851711],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','txtIsoCenter',... +'UserData',[],... +'FontName','Helvetica',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'editIsoCenter'; + +h24 = uicontrol(... +'Parent',h12,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','0 0 0',... +'Style','edit',... +'Position',[0.219794344473008 0.338403041825095 0.161953727506427 0.0836501901140684],... +'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... +'Callback',@(hObject,eventdata)matRadGUI_export('editIsoCenter_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Enable','off',... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('editIsoCenter_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','editIsoCenter',... +'FontWeight','bold'); + +appdata = []; +appdata.lastValidTag = 'checkIsoCenter'; + +h25 = uicontrol(... +'Parent',h12,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','Auto.',... +'Style','checkbox',... +'Value',1,... +'Position',[0.38560411311054 0.338403041825095 0.0809768637532133 0.091254752851711],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Callback',@(hObject,eventdata)matRadGUI_export('checkIsoCenter_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','checkIsoCenter',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'btnRunSequencing'; + +h26 = uicontrol(... +'Parent',h12,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','Run Sequencing',... +'Style','radiobutton',... +'Position',[0.553984575835475 0.628020880324805 0.173521850899743 0.140684410646388],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Callback',@(hObject,eventdata)matRadGUI_export('btnRunSequencing_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Enable','off',... +'Tag','btnRunSequencing',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'btnRunDAO'; + +h27 = uicontrol(... +'Parent',h12,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','Run Direct Aperture Optimization',... +'Style','radiobutton',... +'Position',[0.553984575835475 0.32003608945028 0.294344473007712 0.140684410646388],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Callback',@(hObject,eventdata)matRadGUI_export('btnRunDAO_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Enable','off',... +'Tag','btnRunDAO',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'txtSequencing'; + +h28 = uicontrol(... +'Parent',h12,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','Stratification Levels',... +'Style','text',... +'Position',[0.553984575835475 0.502545595153702 0.179948586118252 0.102661596958175],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','txtSequencing',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'editSequencingLevel'; + +h29 = uicontrol(... +'Parent',h12,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','7',... +'Style','edit',... +'Position',[0.58611825192802 0.449313655990204 0.0668380462724936 0.0836501901140685],... +'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... +'Callback',@(hObject,eventdata)matRadGUI_export('editSequencingLevel_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Enable','off',... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('editSequencingLevel_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','editSequencingLevel',... +'FontWeight','bold'); + +appdata = []; +appdata.lastValidTag = 'popUpMachine'; + +h30 = uicontrol(... +'Parent',h12,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String',['Generic';' '],... +'Style','popupmenu',... +'Value',1,... +'Position',[0.219794344473008 0.418250950570342 0.161953727506427 0.114068441064639],... +'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... +'Callback',@(hObject,eventdata)matRadGUI_export('popUpMachine_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('popUpMachine_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','popUpMachine',... +'FontWeight','bold'); + +appdata = []; +appdata.lastValidTag = 'txtMachine'; + +h31 = uicontrol(... +'Parent',h12,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','Machine',... +'Style','text',... +'Position',[0.0732647814910026 0.433460076045627 0.106683804627249 0.0950570342205323],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','txtMachine',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'btnSetTissue'; + +h32 = uicontrol(... +'Parent',h12,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','Set Tissue',... +'Position',[0.401028277634961 0.110266159695817 0.109254498714653 0.0874524714828897],... +'BackgroundColor',[0.8 0.8 0.8],... +'Callback',@(hObject,eventdata)matRadGUI_export('btnSetTissue_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Enable','off',... +'Tag','btnSetTissue',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'popMenuBioOpt'; + +h33 = uicontrol(... +'Parent',h12,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String',{ 'none'; 'const_RBExD'; 'LEMIV_effect'; 'LEMIV_RBExD' },... +'Style','popupmenu',... +'Value',1,... +'Position',[0.219794344473008 0.0760456273764259 0.165809768637532 0.11787072243346],... +'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... +'Callback',@(hObject,eventdata)matRadGUI_export('popMenuBioOpt_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('popMenuBioOpt_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','popMenuBioOpt',... +'FontWeight','bold'); + +appdata = []; +appdata.lastValidTag = 'text38'; + +h34 = uicontrol(... +'Parent',h12,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','Type of optimization',... +'Style','text',... +'Position',[0.0102827763496144 0.0988593155893536 0.201799485861183 0.091254752851711],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Interruptible','off',... +'Tag','text38',... +'UserData',[],... +'FontName','Helvetica',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'radiobutton3Dconf'; + +h35 = uicontrol(... +'Parent',h12,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','3D conformal',... +'Style','radiobutton',... +'Position',[0.553224553224553 0.757869249394673 0.212121212121212 0.0847457627118644],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Callback',@(hObject,eventdata)matRadGUI_export('radiobutton3Dconf_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Enable','off',... +'Tag','radiobutton3Dconf',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'uipanel2'; + +h36 = uipanel(... +'Parent',h1,... +'FontUnits',get(0,'defaultuipanelFontUnits'),... +'Units',get(0,'defaultuipanelUnits'),... +'ShadowColor',get(0,'defaultuipanelShadowColor'),... +'Title',{ 'Visualization'; ' ' },... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Tag','uipanel2',... +'UserData',[],... +'Clipping','off',... +'Position',[0.00451321727917473 0.0460947503201024 0.430689877498388 0.203585147247119],... +'FontName','Helvetica',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'popupPlane'; + +h37 = uicontrol(... +'Parent',h36,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String',{ 'coronal'; 'sagital'; 'axial' },... +'Style','popupmenu',... +'Value',3,... +'Position',[0.465315808689303 0.582191780821918 0.113636363636364 0.143835616438356],... +'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... +'Callback',@(hObject,eventdata)matRadGUI_export('popupPlane_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('popupPlane_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','popupPlane',... +'FontWeight','bold'); + +appdata = []; +appdata.lastValidTag = 'sliderSlice'; + +h38 = uicontrol(... +'Parent',h36,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String',{ 'Slider' },... +'Style','slider',... +'Position',[0.134961439588689 0.796610169491525 0.167095115681234 0.096045197740113],... +'BackgroundColor',[0.9 0.9 0.9],... +'Callback',@(hObject,eventdata)matRadGUI_export('sliderSlice_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'BusyAction','cancel',... +'Interruptible','off',... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('sliderSlice_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','sliderSlice'); + +appdata = []; +appdata.lastValidTag = 'txtPlanSelection'; + +h39 = uicontrol(... +'Parent',h36,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'HorizontalAlignment','left',... +'String','Plane Selection',... +'Style','text',... +'Position',[0.34258853596203 0.589041095890411 0.11969696969697 0.116438356164384],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','txtPlanSelection',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'text9'; + +h40 = uicontrol(... +'Parent',h36,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'HorizontalAlignment','left',... +'String','Slice Selection',... +'Style','text',... +'Position',[0.00909090909090909 0.808219178082192 0.113636363636364 0.116438356164384],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','text9',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'radiobtnContour'; + +h41 = uicontrol(... +'Parent',h36,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','plot contour',... +'Style','radiobutton',... +'Value',1,... +'Position',[0.780445969125214 0.733212341197822 0.169811320754717 0.117241379310345],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Callback',@(hObject,eventdata)matRadGUI_export('radiobtnContour_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','radiobtnContour',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'radiobtnDose'; + +h42 = uicontrol(... +'Parent',h36,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','plot dose',... +'Style','radiobutton',... +'Value',1,... +'Position',[0.780445969125214 0.466969147005444 0.169811320754717 0.117241379310345],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Callback',@(hObject,eventdata)matRadGUI_export('radiobtnDose_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','radiobtnDose',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'radiobtnIsoDoseLines'; + +h43 = uicontrol(... +'Parent',h36,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','plot isolines',... +'Style','radiobutton',... +'Value',1,... +'Position',[0.780445969125214 0.600907441016334 0.150943396226415 0.117241379310345],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Callback',@(hObject,eventdata)matRadGUI_export('radiobtnIsoDoseLines_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','radiobtnIsoDoseLines',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'txtTypeOfPlot'; + +h44 = uicontrol(... +'Parent',h36,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'HorizontalAlignment','left',... +'String','Type of plot',... +'Style','text',... +'Position',[0.343053173241852 0.793103448275862 0.108061749571183 0.124137931034483],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','txtTypeOfPlot',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'popupTypeOfPlot'; + +h45 = uicontrol(... +'Parent',h36,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String',{ 'intensity'; 'profile' },... +'Style','popupmenu',... +'Value',1,... +'Position',[0.465315808689303 0.801369863013699 0.113636363636364 0.143835616438356],... +'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... +'Callback',@(hObject,eventdata)matRadGUI_export('popupTypeOfPlot_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('popupTypeOfPlot_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','popupTypeOfPlot',... +'FontWeight','bold'); + +appdata = []; +appdata.lastValidTag = 'txtDisplayOption'; + +h46 = uicontrol(... +'Parent',h36,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'HorizontalAlignment','left',... +'String','Display option',... +'Style','text',... +'Position',[0.34258853596203 0.39041095890411 0.128787878787879 0.102739726027397],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','txtDisplayOption',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'popupDisplayOption'; + +h47 = uicontrol(... +'Parent',h36,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','Please select ... ',... +'Style','popupmenu',... +'Value',1,... +'Position',[0.465315808689303 0.36986301369863 0.196969696969697 0.136986301369863],... +'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... +'Callback',@(hObject,eventdata)matRadGUI_export('popupDisplayOption_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('popupDisplayOption_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','popupDisplayOption',... +'FontWeight','bold'); + +appdata = []; +appdata.lastValidTag = 'txtBeamSelection'; + +h48 = uicontrol(... +'Parent',h36,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'HorizontalAlignment','left',... +'String','Beam Selection',... +'Style','text',... +'Position',[0.00857632933104631 0.503448275862069 0.118353344768439 0.186206896551724],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','txtBeamSelection',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'sliderBeamSelection'; + +h49 = uicontrol(... +'Parent',h36,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','SliderBeamSelection',... +'Style','slider',... +'Position',[0.134961439588689 0.542372881355932 0.167095115681234 0.096045197740113],... +'BackgroundColor',[0.9 0.9 0.9],... +'Callback',@(hObject,eventdata)matRadGUI_export('sliderBeamSelection_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Enable','off',... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('sliderBeamSelection_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','sliderBeamSelection'); + +appdata = []; +appdata.lastValidTag = 'btnProfileType'; + +h50 = uicontrol(... +'Parent',h36,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','lateral',... +'Position',[0.658025928757913 0.794520547945205 0.0863636363636364 0.157534246575343],... +'BackgroundColor',[0.8 0.8 0.8],... +'Callback',@(hObject,eventdata)matRadGUI_export('btnProfileType_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Enable','off',... +'Tag','btnProfileType',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'text16'; + +h51 = uicontrol(... +'Parent',h36,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','GoTo',... +'Style','text',... +'Position',[0.604795511376553 0.801369863013698 0.0454545454545454 0.123287671232877],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','text16',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'btnDVH'; + +h52 = uicontrol(... +'Parent',h36,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','Show DVH/QI',... +'Position',[0.51413881748072 0.0677966101694915 0.123393316195373 0.129943502824859],... +'BackgroundColor',[0.8 0.8 0.8],... +'Callback',@(hObject,eventdata)matRadGUI_export('btnDVH_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Enable','off',... +'Tag','btnDVH',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'radiobtnIsoDoseLinesLabels'; + +h53 = uicontrol(... +'Parent',h36,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','plot isolines labels',... +'Style','radiobutton',... +'Position',[0.780445969125214 0.343557168784029 0.202401372212693 0.117241379310345],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Callback',@(hObject,eventdata)matRadGUI_export('radiobtnIsoDoseLinesLabels_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','radiobtnIsoDoseLinesLabels',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'textOffset'; + +h54 = uicontrol(... +'Parent',h36,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'HorizontalAlignment','left',... +'String','Offset',... +'Style','text',... +'Position',[0.00909090909090909 0.287104393008975 0.118181818181818 0.123287671232877],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','textOffset',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'sliderOffset'; + +h55 = uicontrol(... +'Parent',h36,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','SliderOffset',... +'Style','slider',... +'Position',[0.134961439588689 0.271186440677966 0.167095115681234 0.096045197740113],... +'BackgroundColor',[0.9 0.9 0.9],... +'Callback',@(hObject,eventdata)matRadGUI_export('sliderOffset_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Enable','off',... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('sliderOffset_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','sliderOffset'); + +appdata = []; +appdata.lastValidTag = 'radioBtnIsoCenter'; + +h56 = uicontrol(... +'Parent',h36,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','plot iso center',... +'Style','radiobutton',... +'Value',1,... +'Position',[0.780445969125214 0.205989110707804 0.169811320754717 0.117241379310345],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Callback',@(hObject,eventdata)matRadGUI_export('radioBtnIsoCenter_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','radioBtnIsoCenter',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'btn3Dview'; + +h57 = uicontrol(... +'Parent',h36,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','Open 3D-View',... +'Position',[0.595848595848596 0.578947368421053 0.148962148962149 0.157894736842105],... +'BackgroundColor',[0.8 0.8 0.8],... +'Callback',@(hObject,eventdata)matRadGUI_export('btn3Dview_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Enable','off',... +'Tag','btn3Dview',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'radiobtnCT'; + +h58 = uicontrol(... +'Parent',h36,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','plot CT',... +'Style','radiobutton',... +'Value',1,... +'Position',[0.780445969125214 0.864791288566243 0.169811320754717 0.117241379310345],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Callback',@(hObject,eventdata)matRadGUI_export('radiobtnCT_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','radiobtnCT',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'radiobtnPlan'; + +h59 = uicontrol(... +'Parent',h36,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','visualize plan / beams',... +'Style','radiobutton',... +'Value',1,... +'Position',[0.78021978021978 0.0736842105263158 0.2002442002442 0.115789473684211],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Callback',@(hObject,eventdata)matRadGUI_export('radiobtnPlan_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','radiobtnPlan',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'uitoolbar1'; + +h60 = uitoolbar(... +'Parent',h1,... +'Tag','uitoolbar1',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.toolid = 'Standard.FileOpen'; +appdata.CallbackInUse = struct(... + 'ClickedCallback', 'matRadGUI(''toolbarLoad_ClickedCallback'',gcbo,[],guidata(gcbo))'); +appdata.lastValidTag = 'toolbarLoad'; + +h61 = uipushtool(... +'Parent',h60,... +'Children',[],... +'BusyAction','cancel',... +'Interruptible','off',... +'Tag','toolbarLoad',... +'CData',mat{2},... +'ClickedCallback',@(hObject,eventdata)matRadGUI_export('toolbarLoad_ClickedCallback',hObject,eventdata,guidata(hObject)),... +'Separator','on',... +'TooltipString','Open File',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.toolid = 'Standard.SaveFigure'; +appdata.CallbackInUse = struct(... + 'ClickedCallback', 'matRadGUI(''toolbarSave_ClickedCallback'',gcbo,[],guidata(gcbo))'); +appdata.lastValidTag = 'toolbarSave'; + +h62 = uipushtool(... +'Parent',h60,... +'Children',[],... +'BusyAction','cancel',... +'Interruptible','off',... +'Tag','toolbarSave',... +'CData',mat{3},... +'ClickedCallback',@(hObject,eventdata)matRadGUI_export('toolbarSave_ClickedCallback',hObject,eventdata,guidata(hObject)),... +'Separator','on',... +'TooltipString','Save Figure',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.toolid = []; +appdata.lastValidTag = 'uipushtool_screenshot'; + +h63 = uipushtool(... +'Parent',h60,... +'Children',[],... +'Tag','uipushtool_screenshot',... +'CData',mat{4},... +'ClickedCallback',@(hObject,eventdata)matRadGUI_export('uipushtool_screenshot_ClickedCallback',hObject,eventdata,guidata(hObject)),... +'TooltipString','Take a screenshot of the current dose or profile plot',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.toolid = 'Exploration.ZoomIn'; +appdata.CallbackInUse = struct(... + 'ClickedCallback', '%default'); +appdata.lastValidTag = 'toolbarZoomIn'; + +h64 = uitoggletool(... +'Parent',h60,... +'Children',[],... +'Tag','toolbarZoomIn',... +'CData',mat{5},... +'ClickedCallback','%default',... +'Separator','on',... +'TooltipString','Zoom In',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.toolid = 'Exploration.ZoomOut'; +appdata.CallbackInUse = struct(... + 'ClickedCallback', '%default'); +appdata.lastValidTag = 'toolbarZoomOut'; + +h65 = uitoggletool(... +'Parent',h60,... +'Children',[],... +'Tag','toolbarZoomOut',... +'CData',mat{6},... +'ClickedCallback','%default',... +'Separator','on',... +'TooltipString','Zoom Out',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.toolid = 'Exploration.Pan'; +appdata.CallbackInUse = struct(... + 'ClickedCallback', '%default'); +appdata.lastValidTag = 'toolbarPan'; + +h66 = uitoggletool(... +'Parent',h60,... +'Children',[],... +'Tag','toolbarPan',... +'CData',mat{7},... +'ClickedCallback','%default',... +'Separator','on',... +'TooltipString','Pan',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.toolid = 'Exploration.DataCursor'; +appdata.CallbackInUse = struct(... + 'ClickedCallback', '%default'); +appdata.lastValidTag = 'toolbarCursor'; + +h67 = uitoggletool(... +'Parent',h60,... +'Children',[],... +'Tag','toolbarCursor',... +'CData',mat{8},... +'ClickedCallback','%default',... +'Separator','on',... +'TooltipString','Data Cursor',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.toolid = 'Annotation.InsertLegend'; +appdata.CallbackInUse = struct(... + 'ClickedCallback', '%default'); +appdata.lastValidTag = 'toolbarLegend'; + +h68 = uitoggletool(... +'Parent',h60,... +'Children',[],... +'Tag','toolbarLegend',... +'CData',mat{9},... +'ClickedCallback','%default',... +'Separator','on',... +'TooltipString','Insert Legend',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.toolid = 'Annotation.InsertColorbar'; +appdata.CallbackInUse = struct(... + 'ClickedCallback', 'matRadGUI(''uitoggletool8_ClickedCallback'',gcbo,[],guidata(gcbo))'); +appdata.lastValidTag = 'uitoggletool8'; + +h69 = uitoggletool(... +'Parent',h60,... +'Children',[],... +'Tag','uitoggletool8',... +'CData',mat{10},... +'ClickedCallback',@(hObject,eventdata)matRadGUI_export('uitoggletool8_ClickedCallback',hObject,eventdata,guidata(hObject)),... +'Separator','on',... +'TooltipString','Insert Colorbar',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'uipanel3'; + +h70 = uipanel(... +'Parent',h1,... +'FontUnits',get(0,'defaultuipanelFontUnits'),... +'Units',get(0,'defaultuipanelUnits'),... +'ShadowColor',get(0,'defaultuipanelShadowColor'),... +'Title',{ 'Objectives & constraints'; ' '; ' ' },... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Tag','uipanel3',... +'UserData',[],... +'Clipping','off',... +'Position',[0.00451321727917473 0.257362355953905 0.430689877498388 0.259923175416133],... +'FontName','Helvetica',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'uipanel4'; + +h71 = uipanel(... +'Parent',h1,... +'FontUnits',get(0,'defaultuipanelFontUnits'),... +'Units',get(0,'defaultuipanelUnits'),... +'ShadowColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Title','Workflow',... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Tag','uipanel4',... +'UserData',[],... +'Clipping','off',... +'Position',[0.00451321727917473 0.810499359795134 0.430045132172792 0.170294494238156],... +'FontName','Helvetica',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'text13'; + +h72 = uicontrol(... +'Parent',h71,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','Status:',... +'Style','text',... +'Position',[0.318250377073907 0.107438016528926 0.120663650075415 0.12396694214876],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','text13',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'txtInfo'; + +h73 = uicontrol(... +'Parent',h71,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','no data loaded',... +'Style','text',... +'Position',[0.414781297134238 0.0247933884297521 0.371040723981901 0.214876033057851],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','txtInfo',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'btnLoadMat'; + +h74 = uicontrol(... +'Parent',h71,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','Load *.mat data',... +'Position',[0.151866151866152 0.810126582278481 0.178893178893179 0.145569620253165],... +'BackgroundColor',[0.8 0.8 0.8],... +'Callback',@(hObject,eventdata)matRadGUI_export('btnLoadMat_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','btnLoadMat',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'btnCalcDose'; + +h75 = uicontrol(... +'Parent',h71,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','Calc. influence Mx',... +'Position',[0.35006435006435 0.810126582278481 0.178893178893179 0.145569620253165],... +'BackgroundColor',[0.8 0.8 0.8],... +'Callback',@(hObject,eventdata)matRadGUI_export('btnCalcDose_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','btnCalcDose',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'btnOptimize'; + +h76 = uicontrol(... +'Parent',h71,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','Optimize',... +'Position',[0.544401544401541 0.810126582278481 0.178893178893179 0.145569620253165],... +'BackgroundColor',[0.8 0.8 0.8],... +'Callback',@(hObject,eventdata)matRadGUI_export('btnOptimize_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','btnOptimize',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'btnLoadDicom'; + +h77 = uicontrol(... +'Parent',h71,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','Load DICOM',... +'Position',[0.151866151866152 0.60126582278481 0.177606177606178 0.145569620253165],... +'BackgroundColor',[0.8 0.8 0.8],... +'Callback',@(hObject,eventdata)matRadGUI_export('btnLoadDicom_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','btnLoadDicom',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'btnRefresh'; + +h78 = uicontrol(... +'Parent',h71,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','Refresh',... +'Position',[0.0154440154440154 0.810126582278481 0.0849420849420849 0.145569620253165],... +'BackgroundColor',[0.8 0.8 0.8],... +'Callback',@(hObject,eventdata)matRadGUI_export('btnRefresh_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','btnRefresh',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'pushbutton_recalc'; + +h79 = uicontrol(... +'Parent',h71,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','Recalc',... +'Position',[0.543114543114543 0.60126582278481 0.178893178893179 0.145569620253165],... +'BackgroundColor',[0.8 0.8 0.8],... +'Callback',@(hObject,eventdata)matRadGUI_export('pushbutton_recalc_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','pushbutton_recalc',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'btnSaveToGUI'; + +h80 = uicontrol(... +'Parent',h71,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','Save to GUI',... +'Position',[0.738738738738737 0.810126582278481 0.178893178893179 0.145569620253165],... +'BackgroundColor',[0.8 0.8 0.8],... +'Callback',@(hObject,eventdata)matRadGUI_export('btnSaveToGUI_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','btnSaveToGUI',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'btn_export'; + +h81 = uicontrol(... +'Parent',h71,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','Export',... +'Position',[0.74002574002574 0.60126582278481 0.178893178893179 0.145569620253165],... +'BackgroundColor',[0.8 0.8 0.8],... +'Callback',@(hObject,eventdata)matRadGUI_export('btn_export_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','btn_export',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'importDoseButton'; + +h82 = uicontrol(... +'Parent',h71,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','Import Dose',... +'Position',[0.738738738738738 0.392405063291139 0.178893178893179 0.145569620253165],... +'BackgroundColor',[0.8 0.8 0.8],... +'Callback',@(hObject,eventdata)matRadGUI_export('importDoseButton_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','importDoseButton',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'pushbutton_importFromBinary'; + +h83 = uicontrol(... +'Parent',h71,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','Import from Binary',... +'Position',[0.151866151866152 0.392405063291139 0.177606177606178 0.145569620253165],... +'BackgroundColor',[0.8 0.8 0.8],... +'Callback',@(hObject,eventdata)matRadGUI_export('pushbutton_importFromBinary_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'TooltipString','Imports a patient data set from binary datafiles describing CT and segmentations',... +'Tag','pushbutton_importFromBinary',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'text24'; + +h84 = uicontrol(... +'Parent',h1,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','min value:',... +'Style','text',... +'Position',[0.899701069855255 0.87145643693108 0.0420862177470107 0.0253576072821847],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','text24',... +'FontSize',10,... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'btnSetIsoDoseLevels'; + +h85 = uicontrol(... +'Parent',h1,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','Set IsoDose Levels',... +'Position',[0.910792951541851 0.814995131450828 0.071035242290749 0.0223953261927945],... +'BackgroundColor',[0.8 0.8 0.8],... +'Callback',@(hObject,eventdata)matRadGUI_export('btnSetIsoDoseLevels_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','btnSetIsoDoseLevels',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'uipanel10'; + +h86 = uipanel(... +'Parent',h1,... +'FontUnits',get(0,'defaultuipanelFontUnits'),... +'Units',get(0,'defaultuipanelUnits'),... +'Title','Structure Visibilty',... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Tag','uipanel10',... +'Clipping','off',... +'Position',[0.896397105097545 0.175812743823147 0.0991189427312775 0.304291287386216],... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'legendTable'; + +h87 = uicontrol(... +'Parent',h86,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'Style','listbox',... +'Value',1,... +'Position',[0.02 0.01 0.97 0.98],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Callback',@(hObject,eventdata)matRadGUI_export('legendTable_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('legendTable_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','legendTable'); + +appdata = []; +appdata.lastValidTag = 'uipanel11'; + +h88 = uipanel(... +'Parent',h1,... +'FontUnits',get(0,'defaultuipanelFontUnits'),... +'Units',get(0,'defaultuipanelUnits'),... +'Title','Viewing',... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Tag','uipanel11',... +'Clipping','off',... +'Position',[0.437782076079949 0.0460947503201025 0.451321727917473 0.842509603072983],... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'axesFig'; + +h89 = axes(... +'Parent',h88,... +'FontUnits',get(0,'defaultaxesFontUnits'),... +'Units',get(0,'defaultaxesUnits'),... +'CameraPosition',[0.5 0.5 9.16025403784439],... +'CameraPositionMode',get(0,'defaultaxesCameraPositionMode'),... +'CameraTarget',[0.5 0.5 0.5],... +'CameraTargetMode',get(0,'defaultaxesCameraTargetMode'),... +'CameraViewAngle',6.60861036031192,... +'CameraViewAngleMode',get(0,'defaultaxesCameraViewAngleMode'),... +'PlotBoxAspectRatio',[1 0.994838709677419 0.994838709677419],... +'PlotBoxAspectRatioMode',get(0,'defaultaxesPlotBoxAspectRatioMode'),... +'FontName','CMU Serif',... +'Colormap',[0 0 0.5625;0 0 0.625;0 0 0.6875;0 0 0.75;0 0 0.8125;0 0 0.875;0 0 0.9375;0 0 1;0 0.0625 1;0 0.125 1;0 0.1875 1;0 0.25 1;0 0.3125 1;0 0.375 1;0 0.4375 1;0 0.5 1;0 0.5625 1;0 0.625 1;0 0.6875 1;0 0.75 1;0 0.8125 1;0 0.875 1;0 0.9375 1;0 1 1;0.0625 1 1;0.125 1 0.9375;0.1875 1 0.875;0.25 1 0.8125;0.3125 1 0.75;0.375 1 0.6875;0.4375 1 0.625;0.5 1 0.5625;0.5625 1 0.5;0.625 1 0.4375;0.6875 1 0.375;0.75 1 0.3125;0.8125 1 0.25;0.875 1 0.1875;0.9375 1 0.125;1 1 0.0625;1 1 0;1 0.9375 0;1 0.875 0;1 0.8125 0;1 0.75 0;1 0.6875 0;1 0.625 0;1 0.5625 0;1 0.5 0;1 0.4375 0;1 0.375 0;1 0.3125 0;1 0.25 0;1 0.1875 0;1 0.125 0;1 0.0625 0;1 0 0;0.9375 0 0;0.875 0 0;0.8125 0 0;0.75 0 0;0.6875 0 0;0.625 0 0;0.5625 0 0],... +'ColormapMode',get(0,'defaultaxesColormapMode'),... +'Alphamap',[0 0.0159 0.0317 0.0476 0.0635 0.0794 0.0952 0.1111 0.127 0.1429 0.1587 0.1746 0.1905 0.2063 0.2222 0.2381 0.254 0.2698 0.2857 0.3016 0.3175 0.3333 0.3492 0.3651 0.381 0.3968 0.4127 0.4286 0.4444 0.4603 0.4762 0.4921 0.5079 0.5238 0.5397 0.5556 0.5714 0.5873 0.6032 0.619 0.6349 0.6508 0.6667 0.6825 0.6984 0.7143 0.7302 0.746 0.7619 0.7778 0.7937 0.8095 0.8254 0.8413 0.8571 0.873 0.8889 0.9048 0.9206 0.9365 0.9524 0.9683 0.9841 1],... +'AlphamapMode',get(0,'defaultaxesAlphamapMode'),... +'GridLineStyle',get(0,'defaultaxesGridLineStyle'),... +'XTick',[0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1],... +'XTickMode',get(0,'defaultaxesXTickMode'),... +'XTickLabel',{ '0'; '0.1'; '0.2'; '0.3'; '0.4'; '0.5'; '0.6'; '0.7'; '0.8'; '0.9'; '1' },... +'XTickLabelMode',get(0,'defaultaxesXTickLabelMode'),... +'YTick',[0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1],... +'YTickMode',get(0,'defaultaxesYTickMode'),... +'YTickLabel',{ '0'; '0.1'; '0.2'; '0.3'; '0.4'; '0.5'; '0.6'; '0.7'; '0.8'; '0.9'; '1' },... +'YTickLabelMode',get(0,'defaultaxesYTickLabelMode'),... +'Color',get(0,'defaultaxesColor'),... +'CameraMode',get(0,'defaultaxesCameraMode'),... +'DataSpaceMode',get(0,'defaultaxesDataSpaceMode'),... +'ColorSpaceMode',get(0,'defaultaxesColorSpaceMode'),... +'DecorationContainerMode',get(0,'defaultaxesDecorationContainerMode'),... +'ChildContainerMode',get(0,'defaultaxesChildContainerMode'),... +'XRulerMode',get(0,'defaultaxesXRulerMode'),... +'YRulerMode',get(0,'defaultaxesYRulerMode'),... +'ZRulerMode',get(0,'defaultaxesZRulerMode'),... +'AmbientLightSourceMode',get(0,'defaultaxesAmbientLightSourceMode'),... +'ButtonDownFcn',@(hObject,eventdata)matRadGUI_export('axesFig_ButtonDownFcn',hObject,eventdata,guidata(hObject)),... +'Tag','axesFig',... +'UserData',[],... +'Position',[0.0718390804597701 0.0354391371340524 0.902298850574712 0.929121725731895],... +'ActivePositionProperty','position',... +'ActivePositionPropertyMode',get(0,'defaultaxesActivePositionPropertyMode'),... +'LooseInset',[0.199881557553276 0.118695547917832 0.146067292058163 0.0809287826712493],... +'FontSize',9.63,... +'SortMethod','childorder',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +h90 = get(h89,'title'); + +set(h90,... +'Parent',h89,... +'Units','data',... +'FontUnits','points',... +'DecorationContainer',[],... +'DecorationContainerMode','auto',... +'Color',[0 0 0],... +'ColorMode','auto',... +'Position',[0.500000554361651 1.00343482490272 0.5],... +'PositionMode','auto',... +'String',blanks(0),... +'Interpreter','tex',... +'Rotation',0,... +'RotationMode','auto',... +'FontName','Helvetica',... +'FontSize',10.593,... +'FontSizeMode','auto',... +'FontAngle','normal',... +'FontWeight','normal',... +'HorizontalAlignment','center',... +'HorizontalAlignmentMode','auto',... +'VerticalAlignment','bottom',... +'VerticalAlignmentMode','auto',... +'EdgeColor','none',... +'LineStyle','-',... +'LineWidth',0.5,... +'BackgroundColor','none',... +'Margin',2,... +'Clipping','off',... +'Layer','middle',... +'LayerMode','auto',... +'FontSmoothing','on',... +'FontSmoothingMode','auto',... +'DisplayName',blanks(0),... +'IncludeRenderer','on',... +'IsContainer','off',... +'IsContainerMode','auto',... +'HelpTopicKey',blanks(0),... +'ButtonDownFcn',blanks(0),... +'BusyAction','queue',... +'Interruptible','on',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... +'DeleteFcn',blanks(0),... +'Tag',blanks(0),... +'HitTest','on',... +'PickableParts','visible',... +'PickablePartsMode','auto',... +'DimensionNames',{ 'X' 'Y' 'Z' },... +'DimensionNamesMode','auto',... +'XLimInclude','on',... +'YLimInclude','on',... +'ZLimInclude','on',... +'CLimInclude','on',... +'ALimInclude','on',... +'Description','Axes Title',... +'DescriptionMode','auto',... +'Visible','on',... +'Serializable','on',... +'HandleVisibility','off',... +'TransformForPrintFcnImplicitInvoke','on',... +'TransformForPrintFcnImplicitInvokeMode','auto'); + +h91 = get(h89,'xlabel'); + +set(h91,... +'Parent',h89,... +'Units','data',... +'FontUnits','points',... +'DecorationContainer',[],... +'DecorationContainerMode','auto',... +'Color',[0.15 0.15 0.15],... +'ColorMode','auto',... +'Position',[0.500000476837158 -0.0366861225689741 0],... +'PositionMode','auto',... +'String',blanks(0),... +'Interpreter','tex',... +'Rotation',0,... +'RotationMode','auto',... +'FontName','CMU Serif',... +'FontSize',10.593,... +'FontSizeMode','auto',... +'FontAngle','normal',... +'FontWeight','normal',... +'HorizontalAlignment','center',... +'HorizontalAlignmentMode','auto',... +'VerticalAlignment','top',... +'VerticalAlignmentMode','auto',... +'EdgeColor','none',... +'LineStyle','-',... +'LineWidth',0.5,... +'BackgroundColor','none',... +'Margin',3,... +'Clipping','off',... +'Layer','back',... +'LayerMode','auto',... +'FontSmoothing','on',... +'FontSmoothingMode','auto',... +'DisplayName',blanks(0),... +'IncludeRenderer','on',... +'IsContainer','off',... +'IsContainerMode','auto',... +'HelpTopicKey',blanks(0),... +'ButtonDownFcn',blanks(0),... +'BusyAction','queue',... +'Interruptible','on',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... +'DeleteFcn',blanks(0),... +'Tag',blanks(0),... +'HitTest','on',... +'PickableParts','visible',... +'PickablePartsMode','auto',... +'DimensionNames',{ 'X' 'Y' 'Z' },... +'DimensionNamesMode','auto',... +'XLimInclude','on',... +'YLimInclude','on',... +'ZLimInclude','on',... +'CLimInclude','on',... +'ALimInclude','on',... +'Description','AxisRulerBase Label',... +'DescriptionMode','auto',... +'Visible','on',... +'Serializable','on',... +'HandleVisibility','off',... +'TransformForPrintFcnImplicitInvoke','on',... +'TransformForPrintFcnImplicitInvokeMode','auto'); + +h92 = get(h89,'ylabel'); + +set(h92,... +'Parent',h89,... +'Units','data',... +'FontUnits','points',... +'DecorationContainer',[],... +'DecorationContainerMode','auto',... +'Color',[0.15 0.15 0.15],... +'ColorMode','auto',... +'Position',[-0.0429806458688552 0.500000476837158 0],... +'PositionMode','auto',... +'String',blanks(0),... +'Interpreter','tex',... +'Rotation',90,... +'RotationMode','auto',... +'FontName','CMU Serif',... +'FontSize',10.593,... +'FontSizeMode','auto',... +'FontAngle','normal',... +'FontWeight','normal',... +'HorizontalAlignment','center',... +'HorizontalAlignmentMode','auto',... +'VerticalAlignment','bottom',... +'VerticalAlignmentMode','auto',... +'EdgeColor','none',... +'LineStyle','-',... +'LineWidth',0.5,... +'BackgroundColor','none',... +'Margin',3,... +'Clipping','off',... +'Layer','back',... +'LayerMode','auto',... +'FontSmoothing','on',... +'FontSmoothingMode','auto',... +'DisplayName',blanks(0),... +'IncludeRenderer','on',... +'IsContainer','off',... +'IsContainerMode','auto',... +'HelpTopicKey',blanks(0),... +'ButtonDownFcn',blanks(0),... +'BusyAction','queue',... +'Interruptible','on',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... +'DeleteFcn',blanks(0),... +'Tag',blanks(0),... +'HitTest','on',... +'PickableParts','visible',... +'PickablePartsMode','auto',... +'DimensionNames',{ 'X' 'Y' 'Z' },... +'DimensionNamesMode','auto',... +'XLimInclude','on',... +'YLimInclude','on',... +'ZLimInclude','on',... +'CLimInclude','on',... +'ALimInclude','on',... +'Description','AxisRulerBase Label',... +'DescriptionMode','auto',... +'Visible','on',... +'Serializable','on',... +'HandleVisibility','off',... +'TransformForPrintFcnImplicitInvoke','on',... +'TransformForPrintFcnImplicitInvokeMode','auto'); + +h93 = get(h89,'zlabel'); + +set(h93,... +'Parent',h89,... +'Units','data',... +'FontUnits','points',... +'DecorationContainer',[],... +'DecorationContainerMode','auto',... +'Color',[0.15 0.15 0.15],... +'ColorMode','auto',... +'Position',[0 0 0],... +'PositionMode','auto',... +'String',blanks(0),... +'Interpreter','tex',... +'Rotation',0,... +'RotationMode','auto',... +'FontName','CMU Serif',... +'FontSize',10,... +'FontSizeMode','auto',... +'FontAngle','normal',... +'FontWeight','normal',... +'HorizontalAlignment','left',... +'HorizontalAlignmentMode','auto',... +'VerticalAlignment','middle',... +'VerticalAlignmentMode','auto',... +'EdgeColor','none',... +'LineStyle','-',... +'LineWidth',0.5,... +'BackgroundColor','none',... +'Margin',3,... +'Clipping','off',... +'Layer','middle',... +'LayerMode','auto',... +'FontSmoothing','on',... +'FontSmoothingMode','auto',... +'DisplayName',blanks(0),... +'IncludeRenderer','on',... +'IsContainer','off',... +'IsContainerMode','auto',... +'HelpTopicKey',blanks(0),... +'ButtonDownFcn',blanks(0),... +'BusyAction','queue',... +'Interruptible','on',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... +'DeleteFcn',blanks(0),... +'Tag',blanks(0),... +'HitTest','on',... +'PickableParts','visible',... +'PickablePartsMode','auto',... +'DimensionNames',{ 'X' 'Y' 'Z' },... +'DimensionNamesMode','auto',... +'XLimInclude','on',... +'YLimInclude','on',... +'ZLimInclude','on',... +'CLimInclude','on',... +'ALimInclude','on',... +'Description','AxisRulerBase Label',... +'DescriptionMode','auto',... +'Visible','off',... +'Serializable','on',... +'HandleVisibility','off',... +'TransformForPrintFcnImplicitInvoke','on',... +'TransformForPrintFcnImplicitInvokeMode','auto'); + +appdata = []; +appdata.lastValidTag = 'uipanel12'; + +h94 = uipanel(... +'Parent',h1,... +'FontUnits',get(0,'defaultuipanelFontUnits'),... +'Units',get(0,'defaultuipanelUnits'),... +'Title','Info',... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Tag','uipanel12',... +'Clipping','off',... +'Position',[0.896276240708709 0.0448143405889885 0.0991189427312775 0.12932138284251],... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'btnAbout'; + +h95 = uicontrol(... +'Parent',h94,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','About',... +'Position',[0.238095238095238 0.134831460674157 0.563492063492063 0.280898876404494],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Callback',@(hObject,eventdata)matRadGUI_export('btnAbout_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','btnAbout',... +'FontSize',7,... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'text15'; + +h96 = uicontrol(... +'Parent',h94,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','v3.0.0',... +'Style','text',... +'Position',[0.227106227106227 0.752808988764045 0.523809523809524 0.191011235955056],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','text15',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'text31'; + +h97 = uicontrol(... +'Parent',h94,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','github.com/e0404/matRad',... +'Style','text',... +'Position',[0.0384615384615385 0.528089887640449 0.942307692307693 0.168539325842697],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','text31',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'uipanel_colormapOptions'; + +h98 = uipanel(... +'Parent',h1,... +'FontUnits',get(0,'defaultuipanelFontUnits'),... +'Units',get(0,'defaultuipanelUnits'),... +'Title','Viewer Options',... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Tag','uipanel_colormapOptions',... +'Clipping','off',... +'Position',[0.896397105097545 0.484330299089727 0.0991189427312775 0.318660598179457],... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'text_windowCenter'; + +h99 = uicontrol(... +'Parent',h98,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'HorizontalAlignment','left',... +'String','Window Center:',... +'Style','text',... +'Position',[0.0466666666666666 0.682461750109027 0.673333333333333 0.0699999999999998],... +'BackgroundColor',get(0,'defaultuicontrolBackgroundColor'),... +'Children',[],... +'Tag','text_windowCenter',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'textDoseOpacity'; + +h100 = uicontrol(... +'Parent',h98,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'HorizontalAlignment','left',... +'String','Dose opacity:',... +'Style','text',... +'Position',[0.0466666666666667 0.0706370831711431 0.847328244274809 0.0714285714285714],... +'BackgroundColor',get(0,'defaultuicontrolBackgroundColor'),... +'Children',[],... +'Tag','textDoseOpacity',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'popupmenu_chooseColorData'; + +h101 = uicontrol(... +'Parent',h98,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String',{ 'None'; 'CT (ED)'; 'Dose' },... +'Style','popupmenu',... +'Value',1,... +'Position',[0.0486486486486487 0.899328859060403 0.940540540540541 0.11744966442953],... +'BackgroundColor',[1 1 1],... +'Callback',@(hObject,eventdata)matRadGUI_export('popupmenu_chooseColorData_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('popupmenu_chooseColorData_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','popupmenu_chooseColorData'); + +appdata = []; +appdata.lastValidTag = 'slider_windowCenter'; + +h102 = uicontrol(... +'Parent',h98,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'SliderStep',[0.01 0.05],... +'String','slider',... +'Style','slider',... +'Value',0.5,... +'Position',[0.0432432432432432 0.63758389261745 0.697297297297297 0.0536912751677853],... +'BackgroundColor',[0.9 0.9 0.9],... +'Callback',@(hObject,eventdata)matRadGUI_export('slider_windowCenter_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('slider_windowCenter_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','slider_windowCenter'); + +appdata = []; +appdata.lastValidTag = 'text_windowWidth'; + +h103 = uicontrol(... +'Parent',h98,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'HorizontalAlignment','left',... +'String','Window Width:',... +'Style','text',... +'Position',[0.0466666666666667 0.545761302394105 0.673333333333333 0.0700000000000001],... +'BackgroundColor',get(0,'defaultuicontrolBackgroundColor'),... +'Children',[],... +'Tag','text_windowWidth',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'popupmenu_chooseColormap'; + +h104 = uicontrol(... +'Parent',h98,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','Choose Colormap...',... +'Style','popupmenu',... +'Value',1,... +'Position',[0.0362903225806452 0.278843516266481 0.939516129032258 0.0844686648501362],... +'BackgroundColor',[1 1 1],... +'Callback',@(hObject,eventdata)matRadGUI_export('popupmenu_chooseColormap_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('popupmenu_chooseColormap_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','popupmenu_chooseColormap'); + +appdata = []; +appdata.lastValidTag = 'text_windowRange'; + +h105 = uicontrol(... +'Parent',h98,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'HorizontalAlignment','left',... +'String','Range:',... +'Style','text',... +'Position',[0.0403225806451613 0.387807911050966 0.274193548387097 0.0708446866485015],... +'BackgroundColor',get(0,'defaultuicontrolBackgroundColor'),... +'Children',[],... +'Tag','text_windowRange',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'edit_windowRange'; + +h106 = uicontrol(... +'Parent',h98,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','0 1',... +'Style','edit',... +'Position',[0.323863636363636 0.399846781328902 0.653409090909091 0.0707395498392283],... +'BackgroundColor',[1 1 1],... +'Callback',@(hObject,eventdata)matRadGUI_export('edit_windowRange_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('edit_windowRange_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','edit_windowRange'); + +appdata = []; +appdata.lastValidTag = 'edit_windowCenter'; + +h107 = uicontrol(... +'Parent',h98,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','0.5',... +'Style','edit',... +'Value',1,... +'Position',[0.767567567567568 0.63758389261745 0.205405405405405 0.0704697986577181],... +'BackgroundColor',[1 1 1],... +'Callback',@(hObject,eventdata)matRadGUI_export('edit_windowCenter_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('edit_windowCenter_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','edit_windowCenter'); + +appdata = []; +appdata.lastValidTag = 'edit_windowWidth'; + +h108 = uicontrol(... +'Parent',h98,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','1.0',... +'Style','edit',... +'Position',[0.772727272727273 0.518256759964609 0.204545454545455 0.0707395498392284],... +'BackgroundColor',[1 1 1],... +'Callback',@(hObject,eventdata)matRadGUI_export('edit_windowWidth_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('edit_windowWidth_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','edit_windowWidth'); + +appdata = []; +appdata.lastValidTag = 'sliderOpacity'; + +h109 = uicontrol(... +'Parent',h98,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'SliderStep',[0.01 0.05],... +'String','slider',... +'Style','slider',... +'Value',0.6,... +'Position',[0.147727272727273 0.0257234726688103 0.75 0.0546623794212219],... +'BackgroundColor',[0.9 0.9 0.9],... +'Callback',@(hObject,eventdata)matRadGUI_export('sliderOpacity_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('sliderOpacity_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','sliderOpacity'); + +appdata = []; +appdata.lastValidTag = 'txtDoseOpacity0Indicator'; + +h110 = uicontrol(... +'Parent',h98,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'HorizontalAlignment','left',... +'String','0',... +'Style','text',... +'Position',[0.0466666666666666 0.00599285798906697 0.0810810810810811 0.072463768115942],... +'BackgroundColor',get(0,'defaultuicontrolBackgroundColor'),... +'Children',[],... +'Tag','txtDoseOpacity0Indicator',... +'UserData',[],... +'FontName','Helvetica',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'txtDoseOpacity1Indicator'; + +h111 = uicontrol(... +'Parent',h98,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'HorizontalAlignment','right',... +'String','1',... +'Style','text',... +'Position',[0.8963482566536 0.00864864051690258 0.0810810810810811 0.072463768115942],... +'BackgroundColor',get(0,'defaultuicontrolBackgroundColor'),... +'Children',[],... +'Tag','txtDoseOpacity1Indicator',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'text_windowPreset'; + +h112 = uicontrol(... +'Parent',h98,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'HorizontalAlignment','left',... +'String','Window Presets N/A',... +'Style','text',... +'Position',[0.0540540540540541 0.842281879194631 0.697297297297297 0.0704697986577181],... +'BackgroundColor',get(0,'defaultuicontrolBackgroundColor'),... +'Children',[],... +'Tag','text_windowPreset',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'popupmenu_windowPreset'; + +h113 = uicontrol(... +'Parent',h98,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String',{ 'Custom'; 'Full'; 'Abd/Med'; 'Head'; 'Liver'; 'Lung'; 'Spine'; 'Vrt/Bone' },... +'Style','popupmenu',... +'Value',1,... +'Position',[0.0486486486486487 0.73489932885906 0.940540540540541 0.11744966442953],... +'BackgroundColor',[1 1 1],... +'Callback',@(hObject,eventdata)matRadGUI_export('popupmenu_windowPreset_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Visible','off',... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('popupmenu_windowPreset_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','popupmenu_windowPreset'); + +appdata = []; +appdata.lastValidTag = 'slider_windowWidth'; + +h114 = uicontrol(... +'Parent',h98,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'SliderStep',[0.01 0.05],... +'String','slider',... +'Style','slider',... +'Value',1,... +'Position',[0.0454545454545455 0.51140507995425 0.698863636363636 0.0546623794212219],... +'BackgroundColor',[0.9 0.9 0.9],... +'Callback',@(hObject,eventdata)matRadGUI_export('slider_windowWidth_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('slider_windowWidth_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','slider_windowWidth'); + +appdata = []; +appdata.lastValidTag = 'checkbox_lockColormap'; + +h115 = uicontrol(... +'Parent',h98,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','Lock Settings',... +'Style','checkbox',... +'Position',[0.0486486486486487 0.151006711409396 0.940540540540541 0.0838926174496644],... +'BackgroundColor',[0.502 0.502 0.502],... +'Callback',@(hObject,eventdata)matRadGUI_export('checkbox_lockColormap_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','checkbox_lockColormap',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'text39'; + +h116 = uicontrol(... +'Parent',h1,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','max value:',... +'Style','text',... +'Position',[0.901903713027061 0.85370611183355 0.0420862177470107 0.0245123537061118],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','text39',... +'FontSize',10,... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'txtMinVal'; + +h117 = uicontrol(... +'Parent',h1,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','-',... +'Style','text',... +'Position',[0.955789804908748 0.879908972691808 0.0271397105097546 0.0160598179453836],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','txtMinVal',... +'FontSize',10,... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'txtMaxVal'; + +h118 = uicontrol(... +'Parent',h1,... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Units','normalized',... +'String','-',... +'Style','text',... +'Position',[0.955789804908748 0.863003901170351 0.0271397105097546 0.0177503250975293],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','txtMaxVal',... +'FontSize',10,... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + + +hsingleton = h1; + + +% --- Set application data first then calling the CreateFcn. +function local_CreateFcn(hObject, eventdata, createfcn, appdata) + +if ~isempty(appdata) + names = fieldnames(appdata); + for i=1:length(names) + name = char(names(i)); + setappdata(hObject, name, getfield(appdata,name)); + end +end + +if ~isempty(createfcn) + if isa(createfcn,'function_handle') + createfcn(hObject, eventdata); + else + eval(createfcn); + end +end + + +% --- Handles default GUIDE GUI creation and callback dispatch +function varargout = gui_mainfcn(gui_State, varargin) + +gui_StateFields = {'gui_Name' + 'gui_Singleton' + 'gui_OpeningFcn' + 'gui_OutputFcn' + 'gui_LayoutFcn' + 'gui_Callback'}; +gui_Mfile = ''; +for i=1:length(gui_StateFields) + if ~isfield(gui_State, gui_StateFields{i}) + error(message('MATLAB:guide:StateFieldNotFound', gui_StateFields{ i }, gui_Mfile)); + elseif isequal(gui_StateFields{i}, 'gui_Name') + gui_Mfile = [gui_State.(gui_StateFields{i}), '.m']; + end +end + +numargin = length(varargin); + +if numargin == 0 + % MATRADGUI_EXPORT + % create the GUI only if we are not in the process of loading it + % already + gui_Create = true; +elseif local_isInvokeActiveXCallback(gui_State, varargin{:}) + % MATRADGUI_EXPORT(ACTIVEX,...) + vin{1} = gui_State.gui_Name; + vin{2} = [get(varargin{1}.Peer, 'Tag'), '_', varargin{end}]; + vin{3} = varargin{1}; + vin{4} = varargin{end-1}; + vin{5} = guidata(varargin{1}.Peer); + feval(vin{:}); + return; +elseif local_isInvokeHGCallback(gui_State, varargin{:}) + % MATRADGUI_EXPORT('CALLBACK',hObject,eventData,handles,...) + gui_Create = false; +else + % MATRADGUI_EXPORT(...) + % create the GUI and hand varargin to the openingfcn + gui_Create = true; +end + +if ~gui_Create + % In design time, we need to mark all components possibly created in + % the coming callback evaluation as non-serializable. This way, they + % will not be brought into GUIDE and not be saved in the figure file + % when running/saving the GUI from GUIDE. + designEval = false; + if (numargin>1 && ishghandle(varargin{2})) + fig = varargin{2}; + while ~isempty(fig) && ~ishghandle(fig,'figure') + fig = get(fig,'parent'); + end + + designEval = isappdata(0,'CreatingGUIDEFigure') || (isscalar(fig)&&isprop(fig,'GUIDEFigure')); + end + + if designEval + beforeChildren = findall(fig); + end + + % evaluate the callback now + varargin{1} = gui_State.gui_Callback; + if nargout + [varargout{1:nargout}] = feval(varargin{:}); + else + feval(varargin{:}); + end + + % Set serializable of objects created in the above callback to off in + % design time. Need to check whether figure handle is still valid in + % case the figure is deleted during the callback dispatching. + if designEval && ishghandle(fig) + set(setdiff(findall(fig),beforeChildren), 'Serializable','off'); + end +else + if gui_State.gui_Singleton + gui_SingletonOpt = 'reuse'; + else + gui_SingletonOpt = 'new'; + end + + % Check user passing 'visible' P/V pair first so that its value can be + % used by oepnfig to prevent flickering + gui_Visible = 'auto'; + gui_VisibleInput = ''; + for index=1:2:length(varargin) + if length(varargin) == index || ~ischar(varargin{index}) + break; + end + + % Recognize 'visible' P/V pair + len1 = min(length('visible'),length(varargin{index})); + len2 = min(length('off'),length(varargin{index+1})); + if ischar(varargin{index+1}) && strncmpi(varargin{index},'visible',len1) && len2 > 1 + if strncmpi(varargin{index+1},'off',len2) + gui_Visible = 'invisible'; + gui_VisibleInput = 'off'; + elseif strncmpi(varargin{index+1},'on',len2) + gui_Visible = 'visible'; + gui_VisibleInput = 'on'; + end + end + end + + % Open fig file with stored settings. Note: This executes all component + % specific CreateFunctions with an empty HANDLES structure. + + + % Do feval on layout code in m-file if it exists + gui_Exported = ~isempty(gui_State.gui_LayoutFcn); + % this application data is used to indicate the running mode of a GUIDE + % GUI to distinguish it from the design mode of the GUI in GUIDE. it is + % only used by actxproxy at this time. + setappdata(0,genvarname(['OpenGuiWhenRunning_', gui_State.gui_Name]),1); + if gui_Exported + gui_hFigure = feval(gui_State.gui_LayoutFcn, gui_SingletonOpt); + + % make figure invisible here so that the visibility of figure is + % consistent in OpeningFcn in the exported GUI case + if isempty(gui_VisibleInput) + gui_VisibleInput = get(gui_hFigure,'Visible'); + end + set(gui_hFigure,'Visible','off') + + % openfig (called by local_openfig below) does this for guis without + % the LayoutFcn. Be sure to do it here so guis show up on screen. + movegui(gui_hFigure,'onscreen'); + else + gui_hFigure = local_openfig(gui_State.gui_Name, gui_SingletonOpt, gui_Visible); + % If the figure has InGUIInitialization it was not completely created + % on the last pass. Delete this handle and try again. + if isappdata(gui_hFigure, 'InGUIInitialization') + delete(gui_hFigure); + gui_hFigure = local_openfig(gui_State.gui_Name, gui_SingletonOpt, gui_Visible); + end + end + if isappdata(0, genvarname(['OpenGuiWhenRunning_', gui_State.gui_Name])) + rmappdata(0,genvarname(['OpenGuiWhenRunning_', gui_State.gui_Name])); + end + + % Set flag to indicate starting GUI initialization + setappdata(gui_hFigure,'InGUIInitialization',1); + + % Fetch GUIDE Application options + gui_Options = getappdata(gui_hFigure,'GUIDEOptions'); + % Singleton setting in the GUI MATLAB code file takes priority if different + gui_Options.singleton = gui_State.gui_Singleton; + + if ~isappdata(gui_hFigure,'GUIOnScreen') + % Adjust background color + if gui_Options.syscolorfig + set(gui_hFigure,'Color', get(0,'DefaultUicontrolBackgroundColor')); + end + + % Generate HANDLES structure and store with GUIDATA. If there is + % user set GUI data already, keep that also. + data = guidata(gui_hFigure); + handles = guihandles(gui_hFigure); + if ~isempty(handles) + if isempty(data) + data = handles; + else + names = fieldnames(handles); + for k=1:length(names) + data.(char(names(k)))=handles.(char(names(k))); + end + end + end + guidata(gui_hFigure, data); + end + + % Apply input P/V pairs other than 'visible' + for index=1:2:length(varargin) + if length(varargin) == index || ~ischar(varargin{index}) + break; + end + + len1 = min(length('visible'),length(varargin{index})); + if ~strncmpi(varargin{index},'visible',len1) + try set(gui_hFigure, varargin{index}, varargin{index+1}), catch break, end + end + end + + % If handle visibility is set to 'callback', turn it on until finished + % with OpeningFcn + gui_HandleVisibility = get(gui_hFigure,'HandleVisibility'); + if strcmp(gui_HandleVisibility, 'callback') + set(gui_hFigure,'HandleVisibility', 'on'); + end + + feval(gui_State.gui_OpeningFcn, gui_hFigure, [], guidata(gui_hFigure), varargin{:}); + + if isscalar(gui_hFigure) && ishghandle(gui_hFigure) + % Handle the default callbacks of predefined toolbar tools in this + % GUI, if any + guidemfile('restoreToolbarToolPredefinedCallback',gui_hFigure); + + % Update handle visibility + set(gui_hFigure,'HandleVisibility', gui_HandleVisibility); + + % Call openfig again to pick up the saved visibility or apply the + % one passed in from the P/V pairs + if ~gui_Exported + gui_hFigure = local_openfig(gui_State.gui_Name, 'reuse',gui_Visible); + elseif ~isempty(gui_VisibleInput) + set(gui_hFigure,'Visible',gui_VisibleInput); + end + if strcmpi(get(gui_hFigure, 'Visible'), 'on') + figure(gui_hFigure); + + if gui_Options.singleton + setappdata(gui_hFigure,'GUIOnScreen', 1); + end + end + + % Done with GUI initialization + if isappdata(gui_hFigure,'InGUIInitialization') + rmappdata(gui_hFigure,'InGUIInitialization'); + end + + % If handle visibility is set to 'callback', turn it on until + % finished with OutputFcn + gui_HandleVisibility = get(gui_hFigure,'HandleVisibility'); + if strcmp(gui_HandleVisibility, 'callback') + set(gui_hFigure,'HandleVisibility', 'on'); + end + gui_Handles = guidata(gui_hFigure); + else + gui_Handles = []; + end + + if nargout + [varargout{1:nargout}] = feval(gui_State.gui_OutputFcn, gui_hFigure, [], gui_Handles); + else + feval(gui_State.gui_OutputFcn, gui_hFigure, [], gui_Handles); + end + + if isscalar(gui_hFigure) && ishghandle(gui_hFigure) + set(gui_hFigure,'HandleVisibility', gui_HandleVisibility); + end +end + +function gui_hFigure = local_openfig(name, singleton, visible) + +% openfig with three arguments was new from R13. Try to call that first, if +% failed, try the old openfig. +if nargin('openfig') == 2 + % OPENFIG did not accept 3rd input argument until R13, + % toggle default figure visible to prevent the figure + % from showing up too soon. + gui_OldDefaultVisible = get(0,'defaultFigureVisible'); + set(0,'defaultFigureVisible','off'); + gui_hFigure = matlab.hg.internal.openfigLegacy(name, singleton); + set(0,'defaultFigureVisible',gui_OldDefaultVisible); +else + % Call version of openfig that accepts 'auto' option" + gui_hFigure = matlab.hg.internal.openfigLegacy(name, singleton, visible); +% %workaround for CreateFcn not called to create ActiveX +% peers=findobj(findall(allchild(gui_hFigure)),'type','uicontrol','style','text'); +% for i=1:length(peers) +% if isappdata(peers(i),'Control') +% actxproxy(peers(i)); +% end +% end +end + +function result = local_isInvokeActiveXCallback(gui_State, varargin) + +try + result = ispc && iscom(varargin{1}) ... + && isequal(varargin{1},gcbo); +catch + result = false; +end + +function result = local_isInvokeHGCallback(gui_State, varargin) + +try + fhandle = functions(gui_State.gui_Callback); + result = ~isempty(findstr(gui_State.gui_Name,fhandle.file)) || ... + (ischar(varargin{1}) ... + && isequal(ishghandle(varargin{2}), 1) ... + && (~isempty(strfind(varargin{1},[get(varargin{2}, 'Tag'), '_'])) || ... + ~isempty(strfind(varargin{1}, '_CreateFcn'))) ); +catch + result = false; +end + + diff --git a/matRadGUI_export.mat b/matRadGUI_export.mat new file mode 100644 index 0000000000000000000000000000000000000000..0bfd94999f28558ea5f10d178a7467a1b68e2862 GIT binary patch literal 7550 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 Z>h~&Dxxd0b`f$jT<=uT)e(evO`Crfu@iPDb literal 0 HcmV?d00001 From 65a91caa9344c206427b4cbda965a8cb91804e70 Mon Sep 17 00:00:00 2001 From: Niklas Wahl Date: Tue, 4 Jun 2019 12:50:54 +0200 Subject: [PATCH 02/87] script to remove unnecessary options for graphics options --- tools/matRad_fixExportedGUI.m | 39 +++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 tools/matRad_fixExportedGUI.m diff --git a/tools/matRad_fixExportedGUI.m b/tools/matRad_fixExportedGUI.m new file mode 100644 index 000000000..8d5cddbdd --- /dev/null +++ b/tools/matRad_fixExportedGUI.m @@ -0,0 +1,39 @@ +fid = fopen('matRadGUI_export.m','r'); +f=fread(fid,'*char')'; +fclose(fid); + + +f = regexprep(f,'\n''Alphamap'',\[[\s.;0-9]*?\](,\.\.\.|\))',''); +f = regexprep(f,'\n''DecorationContainer'',\[[\s.;0-9]*?\](,\.\.\.|\))',''); +f = regexprep(f,'\n''Layer'',''(back|middle|front)''(,\.\.\.|\))',''); +f = regexprep(f,'\n''DisplayName'',blanks\(0\)(,\.\.\.|\))',''); +f = regexprep(f,'\n''HelpTopicKey'',blanks\(0\)(,\.\.\.|\))',''); +f = regexprep(f,'\n''DimensionNames'',{[\s\w'']*?}(,\.\.\.|\))',''); +f = regexprep(f,'\n''Description'',''[\w\s]*?''(,\.\.\.|\))',''); + +%On/Off properties +expr = {'FontSmoothing','CLimInclude','ALimInclude','IncludeRenderer','IsContainer','IsContainer','Serializable','TransformForPrintFcnImplicitInvoke'}; +expr = strjoin(expr,'|'); +expr = ['\n''(' expr ')'',''(on|off)''(,\.\.\.|\))']; +f = regexprep(f,expr,''); +edit +%Mode sets +modestrings = {'ScreenPixelsPerInch','DecorationContainer','Color','FontSize','Layer','FontSmoothing','IsContainer','PickableParts','DimensionNames','Description','TransformForPrintFcnImplicitInvoke'}; +modestrings = strjoin(modestrings,'|'); +expr = ['\n''(' modestrings ')Mode'',''\w*?''(,\.\.\.|\))']; +f = regexprep(f,expr,''); + + +%Mode gets +modestrings = {'Colormap','Alphamap','Camera','DataSpace','ColorSpace','DecorationContainer','ChildContainer','XRuler','YRuler','ZRuler','AmbientLightSource','ActivePositionProperty'}; +modestrings = strjoin(modestrings,'|'); +expr = ['\n''(' modestrings ')Mode'',get\(0,''defaultaxes(' modestrings ')Mode''\)(,\.\.\.|\))']; +f = regexprep(f,expr,''); + +%Fix whitespaces +f = regexprep(f,'(,\.\.\.)\s*?;',');'); + + +fid = fopen('matRadGUI_export2.m','w'); +fprintf(fid,'%s',f); +fclose(fid); \ No newline at end of file From ecbcbc1be95146bbac3fec62c0381d0466d9bbf0 Mon Sep 17 00:00:00 2001 From: Niklas Wahl Date: Wed, 12 Jun 2019 23:28:26 +0200 Subject: [PATCH 03/87] fides to the exported GUI --- matRadGUI_export.m | 396 +++++----------------------------- tools/matRad_fixExportedGUI.m | 46 ++-- 2 files changed, 82 insertions(+), 360 deletions(-) diff --git a/matRadGUI_export.m b/matRadGUI_export.m index 13149e2f2..a97510e6d 100644 --- a/matRadGUI_export.m +++ b/matRadGUI_export.m @@ -47,8 +47,8 @@ case 'MATLAB' case 'OCTAVE' - fprintf(['matRad GUI not available for ' env ' ' versionString ' \n']); - return; + fprintf(['matRad GUI not fully supported for ' env ' ' versionString ' \n']); + otherwise fprintf(['not yet tested']); end @@ -62,7 +62,7 @@ elseif ismac lf = 'com.apple.laf.AquaLookAndFeel'; end -javax.swing.UIManager.setLookAndFeel(lf); +try, javax.swing.UIManager.setLookAndFeel(lf);, catch, fprintf('javax not supported\n'), end gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... @@ -84,9 +84,9 @@ % End initialization code - DO NOT EDIT function handles = resetGUI(hObject, handles, varargin) -% enable opengl software rendering to visualize linewidths properly +% enable try, opengl software, catch, fprintf('opengl not supported\n'), end rendering to visualize linewidths properly if ispc - opengl software + try, opengl software, catch, fprintf('opengl not supported\n'), end elseif ismac % opengl is not supported end @@ -95,19 +95,20 @@ handles.output = hObject; %show matrad logo axes(handles.axesLogo) -[im, ~, alpha] = imread('matrad_logo.png'); +[im, ~, alpha] = imread('gui/matrad_logo.png'); f = image(im); axis equal off set(f, 'AlphaData', alpha); % show dkfz logo axes(handles.axesDKFZ) -[im, ~, alpha] = imread('DKFZ_Logo.png'); +[im, ~, alpha] = imread('gui/DKFZ_Logo.png'); f = image(im); axis equal off; set(f, 'AlphaData', alpha); % turn off the datacursormode (since it does not allow to set scrolling % callbacks +try handles.dcm_obj = datacursormode(handles.figure1); set(handles.dcm_obj,'DisplayStyle','window'); if strcmpi(get(handles.dcm_obj,'Enable'),'on') @@ -115,11 +116,13 @@ end %Add the callback for the datacursor display set(handles.dcm_obj,'UpdateFcn',@dataCursorUpdateFunction); - +catch +end % set callback for scroll wheel function set(gcf,'WindowScrollWheelFcn',@matRadScrollWheelFcn); % change color of toobar but only the first time GUI is started +try if handles.initialGuiStart hToolbar = findall(hObject,'tag','uitoolbar1'); jToolbar = get(get(hToolbar,'JavaContainer'),'ComponentPeer'); @@ -140,6 +143,8 @@ end end end +catch +end set(handles.legendTable,'String',{'no data loaded'}); @@ -388,8 +393,8 @@ function matRadGUI_export_OpeningFcn(hObject, ~, handles, varargin) elseif ~ismember('ct',AllVarNames) && ismember('cst',AllVarNames) handles = showError(handles,'GUI OpeningFunc: could not find ct file'); end -catch - handles = showError(handles,'GUI OpeningFunc: Could not load ct and cst file'); +catch MEexception + handles = showError(handles,['GUI OpeningFunc: Could not load ct and cst file: ' MEexception.message]); end if ismember('ct',AllVarNames) && ismember('cst',AllVarNames) @@ -830,9 +835,9 @@ function UpdatePlot(handles) defaultFontSize = 8; currAxes = axis(handles.axesFig); -AxesHandlesCT_Dose = gobjects(0); +AxesHandlesCT_Dose = [];%gobjects(0); AxesHandlesVOI = cell(0); -AxesHandlesIsoDose = gobjects(0); +AxesHandlesIsoDose = [];%gobjects(0); if handles.State == 0 cla reset @@ -4154,7 +4159,13 @@ function checkbox_lockColormap_Callback(hObject, eventdata, handles) cstPanel = handles.uipanel3; -cstPanelPos = getpixelposition(cstPanel); +try + cstPanelPos = getpixelposition(cstPanel); +catch + set(cstPanel,'Units','pixels'); + cstPanelPos = get(cstPanel,'Position'); + set(cstPanel,'Units','normalized'); +end %Parameters for line height objHeight = 22; @@ -4175,7 +4186,7 @@ function checkbox_lockColormap_Callback(hObject, eventdata, handles) %Scrollbar -cstVertTableScroll = findobj(cstPanel.Children,'Style','slider'); +cstVertTableScroll = findobj(get(cstPanel,'Children'),'Style','slider'); if isempty(cstVertTableScroll) sliderPos = 0; else @@ -4184,7 +4195,7 @@ function checkbox_lockColormap_Callback(hObject, eventdata, handles) %disp(num2str(sliderPos)); ypos = @(c) tableViewHeight - c*lineHeight + sliderPos; -delete(cstPanel.Children); +delete(get(cstPanel,'Children')); %Creates a dummy axis to allow for the use of textboxes instead of uicontrol to be able to use the (la)tex interpreter tmpAxes = axes('Parent',cstPanel,'units','normalized','position',[0 0 1 1],'visible','off'); @@ -4192,7 +4203,7 @@ function checkbox_lockColormap_Callback(hObject, eventdata, handles) organTypes = {'OAR', 'TARGET'}; %columnname = {'VOI name','VOI type','priority','obj. / const.'};%,'penalty','dose', 'EUD','volume','robustness'}; - +try %Get all Classes & classNames mpkgObjectives = meta.package.fromName('DoseObjectives'); mpkgConstraints = meta.package.fromName('DoseConstraints'); @@ -4336,7 +4347,9 @@ function checkbox_lockColormap_Callback(hObject, eventdata, handles) uicontrol(cstPanel,'Style','slider','Units','normalized','Position',[0.975 0 0.025 1],'Min',0,'Max',ceil(sliderFac)*tableViewHeight,'SliderStep',[lineHeight tableViewHeight] ./ (ceil(sliderFac)*tableViewHeight),'Value',ceil(sliderFac)*tableViewHeight - sliderPos,'Callback',{@cstTableSlider_Callback,handles}); end - +catch + +end %set(handles.uiTable,'ColumnName',columnname); @@ -4604,7 +4617,6 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'PaperSize',[20.99999864 29.69999902],... 'PaperType',get(0,'defaultfigurePaperType'),... 'InvertHardcopy',get(0,'defaultfigureInvertHardcopy'),... -'ScreenPixelsPerInchMode','manual',... 'HandleVisibility','callback',... 'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); @@ -4625,9 +4637,6 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'PlotBoxAspectRatioMode',get(0,'defaultaxesPlotBoxAspectRatioMode'),... 'FontName','CMU Serif',... 'Colormap',[0 0 0.5625;0 0 0.625;0 0 0.6875;0 0 0.75;0 0 0.8125;0 0 0.875;0 0 0.9375;0 0 1;0 0.0625 1;0 0.125 1;0 0.1875 1;0 0.25 1;0 0.3125 1;0 0.375 1;0 0.4375 1;0 0.5 1;0 0.5625 1;0 0.625 1;0 0.6875 1;0 0.75 1;0 0.8125 1;0 0.875 1;0 0.9375 1;0 1 1;0.0625 1 1;0.125 1 0.9375;0.1875 1 0.875;0.25 1 0.8125;0.3125 1 0.75;0.375 1 0.6875;0.4375 1 0.625;0.5 1 0.5625;0.5625 1 0.5;0.625 1 0.4375;0.6875 1 0.375;0.75 1 0.3125;0.8125 1 0.25;0.875 1 0.1875;0.9375 1 0.125;1 1 0.0625;1 1 0;1 0.9375 0;1 0.875 0;1 0.8125 0;1 0.75 0;1 0.6875 0;1 0.625 0;1 0.5625 0;1 0.5 0;1 0.4375 0;1 0.375 0;1 0.3125 0;1 0.25 0;1 0.1875 0;1 0.125 0;1 0.0625 0;1 0 0;0.9375 0 0;0.875 0 0;0.8125 0 0;0.75 0 0;0.6875 0 0;0.625 0 0;0.5625 0 0],... -'ColormapMode',get(0,'defaultaxesColormapMode'),... -'Alphamap',[0 0.0159 0.0317 0.0476 0.0635 0.0794 0.0952 0.1111 0.127 0.1429 0.1587 0.1746 0.1905 0.2063 0.2222 0.2381 0.254 0.2698 0.2857 0.3016 0.3175 0.3333 0.3492 0.3651 0.381 0.3968 0.4127 0.4286 0.4444 0.4603 0.4762 0.4921 0.5079 0.5238 0.5397 0.5556 0.5714 0.5873 0.6032 0.619 0.6349 0.6508 0.6667 0.6825 0.6984 0.7143 0.7302 0.746 0.7619 0.7778 0.7937 0.8095 0.8254 0.8413 0.8571 0.873 0.8889 0.9048 0.9206 0.9365 0.9524 0.9683 0.9841 1],... -'AlphamapMode',get(0,'defaultaxesAlphamapMode'),... 'XTick',[0 0.2 0.4 0.6 0.8 1],... 'XTickMode',get(0,'defaultaxesXTickMode'),... 'XTickLabel',{ '0'; '0.2'; '0.4'; '0.6'; '0.8'; '1' },... @@ -4637,19 +4646,9 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'YTickLabel',{ '0'; '0.5'; '1' },... 'YTickLabelMode',get(0,'defaultaxesYTickLabelMode'),... 'Color',get(0,'defaultaxesColor'),... -'CameraMode',get(0,'defaultaxesCameraMode'),... -'DataSpaceMode',get(0,'defaultaxesDataSpaceMode'),... -'ColorSpaceMode',get(0,'defaultaxesColorSpaceMode'),... -'DecorationContainerMode',get(0,'defaultaxesDecorationContainerMode'),... -'ChildContainerMode',get(0,'defaultaxesChildContainerMode'),... -'XRulerMode',get(0,'defaultaxesXRulerMode'),... -'YRulerMode',get(0,'defaultaxesYRulerMode'),... -'ZRulerMode',get(0,'defaultaxesZRulerMode'),... -'AmbientLightSourceMode',get(0,'defaultaxesAmbientLightSourceMode'),... 'Tag','axesLogo',... 'Position',[0.444874274661509 0.893725992317542 0.184397163120567 0.0998719590268886],... 'ActivePositionProperty','position',... -'ActivePositionPropertyMode',get(0,'defaultaxesActivePositionPropertyMode'),... 'LooseInset',[0.182759687929063 0.112926163636008 0.133555156563546 0.0769951115700055],... 'FontSize',9.63,... 'SortMethod','childorder',... @@ -4661,10 +4660,7 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'Parent',h2,... 'Units','data',... 'FontUnits','points',... -'DecorationContainer',[],... -'DecorationContainerMode','auto',... 'Color',[0 0 0],... -'ColorMode','auto',... 'Position',[0.500002778623327 1.02596323529412 0.5],... 'PositionMode','auto',... 'String',blanks(0),... @@ -4673,7 +4669,6 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'RotationMode','auto',... 'FontName','CMU Serif',... 'FontSize',10.593,... -'FontSizeMode','auto',... 'FontAngle','normal',... 'FontWeight','bold',... 'HorizontalAlignment','center',... @@ -4686,15 +4681,6 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'BackgroundColor','none',... 'Margin',3,... 'Clipping','off',... -'Layer','middle',... -'LayerMode','auto',... -'FontSmoothing','on',... -'FontSmoothingMode','auto',... -'DisplayName',blanks(0),... -'IncludeRenderer','on',... -'IsContainer','off',... -'IsContainerMode','auto',... -'HelpTopicKey',blanks(0),... 'ButtonDownFcn',blanks(0),... 'BusyAction','queue',... 'Interruptible','on',... @@ -4703,21 +4689,11 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'Tag',blanks(0),... 'HitTest','on',... 'PickableParts','visible',... -'PickablePartsMode','auto',... -'DimensionNames',{ 'X' 'Y' 'Z' },... -'DimensionNamesMode','auto',... 'XLimInclude','on',... 'YLimInclude','on',... 'ZLimInclude','on',... -'CLimInclude','on',... -'ALimInclude','on',... -'Description','Axes Title',... -'DescriptionMode','auto',... 'Visible','on',... -'Serializable','on',... -'HandleVisibility','off',... -'TransformForPrintFcnImplicitInvoke','on',... -'TransformForPrintFcnImplicitInvokeMode','auto'); +'HandleVisibility','off'); h4 = get(h2,'xlabel'); @@ -4725,10 +4701,7 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'Parent',h2,... 'Units','data',... 'FontUnits','points',... -'DecorationContainer',[],... -'DecorationContainerMode','auto',... 'Color',[0.15 0.15 0.15],... -'ColorMode','auto',... 'Position',[0.500000476837158 -0.277303926477245 0],... 'PositionMode','auto',... 'String',blanks(0),... @@ -4737,7 +4710,6 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'RotationMode','auto',... 'FontName','CMU Serif',... 'FontSize',10.593,... -'FontSizeMode','auto',... 'FontAngle','normal',... 'FontWeight','normal',... 'HorizontalAlignment','center',... @@ -4750,15 +4722,6 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'BackgroundColor','none',... 'Margin',3,... 'Clipping','off',... -'Layer','back',... -'LayerMode','auto',... -'FontSmoothing','on',... -'FontSmoothingMode','auto',... -'DisplayName',blanks(0),... -'IncludeRenderer','on',... -'IsContainer','off',... -'IsContainerMode','auto',... -'HelpTopicKey',blanks(0),... 'ButtonDownFcn',blanks(0),... 'BusyAction','queue',... 'Interruptible','on',... @@ -4767,21 +4730,11 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'Tag',blanks(0),... 'HitTest','on',... 'PickableParts','visible',... -'PickablePartsMode','auto',... -'DimensionNames',{ 'X' 'Y' 'Z' },... -'DimensionNamesMode','auto',... 'XLimInclude','on',... 'YLimInclude','on',... 'ZLimInclude','on',... -'CLimInclude','on',... -'ALimInclude','on',... -'Description','AxisRulerBase Label',... -'DescriptionMode','auto',... 'Visible','on',... -'Serializable','on',... -'HandleVisibility','off',... -'TransformForPrintFcnImplicitInvoke','on',... -'TransformForPrintFcnImplicitInvokeMode','auto'); +'HandleVisibility','off'); h5 = get(h2,'ylabel'); @@ -4789,10 +4742,7 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'Parent',h2,... 'Units','data',... 'FontUnits','points',... -'DecorationContainer',[],... -'DecorationContainerMode','auto',... 'Color',[0.15 0.15 0.15],... -'ColorMode','auto',... 'Position',[-0.0943626077857305 0.500000476837158 0],... 'PositionMode','auto',... 'String',blanks(0),... @@ -4801,7 +4751,6 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'RotationMode','auto',... 'FontName','CMU Serif',... 'FontSize',10.593,... -'FontSizeMode','auto',... 'FontAngle','normal',... 'FontWeight','normal',... 'HorizontalAlignment','center',... @@ -4814,15 +4763,6 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'BackgroundColor','none',... 'Margin',3,... 'Clipping','off',... -'Layer','back',... -'LayerMode','auto',... -'FontSmoothing','on',... -'FontSmoothingMode','auto',... -'DisplayName',blanks(0),... -'IncludeRenderer','on',... -'IsContainer','off',... -'IsContainerMode','auto',... -'HelpTopicKey',blanks(0),... 'ButtonDownFcn',blanks(0),... 'BusyAction','queue',... 'Interruptible','on',... @@ -4831,21 +4771,11 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'Tag',blanks(0),... 'HitTest','on',... 'PickableParts','visible',... -'PickablePartsMode','auto',... -'DimensionNames',{ 'X' 'Y' 'Z' },... -'DimensionNamesMode','auto',... 'XLimInclude','on',... 'YLimInclude','on',... 'ZLimInclude','on',... -'CLimInclude','on',... -'ALimInclude','on',... -'Description','AxisRulerBase Label',... -'DescriptionMode','auto',... 'Visible','on',... -'Serializable','on',... -'HandleVisibility','off',... -'TransformForPrintFcnImplicitInvoke','on',... -'TransformForPrintFcnImplicitInvokeMode','auto'); +'HandleVisibility','off'); h6 = get(h2,'zlabel'); @@ -4853,10 +4783,7 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'Parent',h2,... 'Units','data',... 'FontUnits','points',... -'DecorationContainer',[],... -'DecorationContainerMode','auto',... 'Color',[0.15 0.15 0.15],... -'ColorMode','auto',... 'Position',[0 0 0],... 'PositionMode','auto',... 'String',blanks(0),... @@ -4865,7 +4792,6 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'RotationMode','auto',... 'FontName','CMU Serif',... 'FontSize',10,... -'FontSizeMode','auto',... 'FontAngle','normal',... 'FontWeight','normal',... 'HorizontalAlignment','left',... @@ -4878,15 +4804,6 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'BackgroundColor','none',... 'Margin',3,... 'Clipping','off',... -'Layer','middle',... -'LayerMode','auto',... -'FontSmoothing','on',... -'FontSmoothingMode','auto',... -'DisplayName',blanks(0),... -'IncludeRenderer','on',... -'IsContainer','off',... -'IsContainerMode','auto',... -'HelpTopicKey',blanks(0),... 'ButtonDownFcn',blanks(0),... 'BusyAction','queue',... 'Interruptible','on',... @@ -4895,21 +4812,11 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'Tag',blanks(0),... 'HitTest','on',... 'PickableParts','visible',... -'PickablePartsMode','auto',... -'DimensionNames',{ 'X' 'Y' 'Z' },... -'DimensionNamesMode','auto',... 'XLimInclude','on',... 'YLimInclude','on',... 'ZLimInclude','on',... -'CLimInclude','on',... -'ALimInclude','on',... -'Description','AxisRulerBase Label',... -'DescriptionMode','auto',... 'Visible','off',... -'Serializable','on',... -'HandleVisibility','off',... -'TransformForPrintFcnImplicitInvoke','on',... -'TransformForPrintFcnImplicitInvokeMode','auto'); +'HandleVisibility','off'); appdata = []; appdata.lastValidTag = 'axesDKFZ'; @@ -4928,9 +4835,6 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'PlotBoxAspectRatioMode',get(0,'defaultaxesPlotBoxAspectRatioMode'),... 'FontName','CMU Serif',... 'Colormap',[0 0 0.5625;0 0 0.625;0 0 0.6875;0 0 0.75;0 0 0.8125;0 0 0.875;0 0 0.9375;0 0 1;0 0.0625 1;0 0.125 1;0 0.1875 1;0 0.25 1;0 0.3125 1;0 0.375 1;0 0.4375 1;0 0.5 1;0 0.5625 1;0 0.625 1;0 0.6875 1;0 0.75 1;0 0.8125 1;0 0.875 1;0 0.9375 1;0 1 1;0.0625 1 1;0.125 1 0.9375;0.1875 1 0.875;0.25 1 0.8125;0.3125 1 0.75;0.375 1 0.6875;0.4375 1 0.625;0.5 1 0.5625;0.5625 1 0.5;0.625 1 0.4375;0.6875 1 0.375;0.75 1 0.3125;0.8125 1 0.25;0.875 1 0.1875;0.9375 1 0.125;1 1 0.0625;1 1 0;1 0.9375 0;1 0.875 0;1 0.8125 0;1 0.75 0;1 0.6875 0;1 0.625 0;1 0.5625 0;1 0.5 0;1 0.4375 0;1 0.375 0;1 0.3125 0;1 0.25 0;1 0.1875 0;1 0.125 0;1 0.0625 0;1 0 0;0.9375 0 0;0.875 0 0;0.8125 0 0;0.75 0 0;0.6875 0 0;0.625 0 0;0.5625 0 0],... -'ColormapMode',get(0,'defaultaxesColormapMode'),... -'Alphamap',[0 0.0159 0.0317 0.0476 0.0635 0.0794 0.0952 0.1111 0.127 0.1429 0.1587 0.1746 0.1905 0.2063 0.2222 0.2381 0.254 0.2698 0.2857 0.3016 0.3175 0.3333 0.3492 0.3651 0.381 0.3968 0.4127 0.4286 0.4444 0.4603 0.4762 0.4921 0.5079 0.5238 0.5397 0.5556 0.5714 0.5873 0.6032 0.619 0.6349 0.6508 0.6667 0.6825 0.6984 0.7143 0.7302 0.746 0.7619 0.7778 0.7937 0.8095 0.8254 0.8413 0.8571 0.873 0.8889 0.9048 0.9206 0.9365 0.9524 0.9683 0.9841 1],... -'AlphamapMode',get(0,'defaultaxesAlphamapMode'),... 'XTick',[0 0.2 0.4 0.6 0.8 1],... 'XTickMode',get(0,'defaultaxesXTickMode'),... 'XTickLabel',{ '0'; '0.2'; '0.4'; '0.6'; '0.8'; '1' },... @@ -4940,19 +4844,9 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'YTickLabel',{ '0'; '0.5'; '1' },... 'YTickLabelMode',get(0,'defaultaxesYTickLabelMode'),... 'Color',get(0,'defaultaxesColor'),... -'CameraMode',get(0,'defaultaxesCameraMode'),... -'DataSpaceMode',get(0,'defaultaxesDataSpaceMode'),... -'ColorSpaceMode',get(0,'defaultaxesColorSpaceMode'),... -'DecorationContainerMode',get(0,'defaultaxesDecorationContainerMode'),... -'ChildContainerMode',get(0,'defaultaxesChildContainerMode'),... -'XRulerMode',get(0,'defaultaxesXRulerMode'),... -'YRulerMode',get(0,'defaultaxesYRulerMode'),... -'ZRulerMode',get(0,'defaultaxesZRulerMode'),... -'AmbientLightSourceMode',get(0,'defaultaxesAmbientLightSourceMode'),... 'Tag','axesDKFZ',... 'Position',[0.652482269503546 0.903969270166453 0.259187620889749 0.0717029449423816],... 'ActivePositionProperty','position',... -'ActivePositionPropertyMode',get(0,'defaultaxesActivePositionPropertyMode'),... 'LooseInset',[0.13 0.11 0.0950000000000001 0.0749999999999999],... 'FontSize',9.63,... 'SortMethod','childorder',... @@ -4964,10 +4858,7 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'Parent',h7,... 'Units','data',... 'FontUnits','points',... -'DecorationContainer',[],... -'DecorationContainerMode','auto',... 'Color',[0 0 0],... -'ColorMode','auto',... 'Position',[0.500002880250254 1.03678125 0.500000000000007],... 'PositionMode','auto',... 'String',blanks(0),... @@ -4976,7 +4867,6 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'RotationMode','auto',... 'FontName','CMU Serif',... 'FontSize',10.593,... -'FontSizeMode','auto',... 'FontAngle','normal',... 'FontWeight','bold',... 'HorizontalAlignment','center',... @@ -4989,15 +4879,6 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'BackgroundColor','none',... 'Margin',3,... 'Clipping','off',... -'Layer','middle',... -'LayerMode','auto',... -'FontSmoothing','on',... -'FontSmoothingMode','auto',... -'DisplayName',blanks(0),... -'IncludeRenderer','on',... -'IsContainer','off',... -'IsContainerMode','auto',... -'HelpTopicKey',blanks(0),... 'ButtonDownFcn',blanks(0),... 'BusyAction','queue',... 'Interruptible','on',... @@ -5006,21 +4887,11 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'Tag',blanks(0),... 'HitTest','on',... 'PickableParts','visible',... -'PickablePartsMode','auto',... -'DimensionNames',{ 'X' 'Y' 'Z' },... -'DimensionNamesMode','auto',... 'XLimInclude','on',... 'YLimInclude','on',... 'ZLimInclude','on',... -'CLimInclude','on',... -'ALimInclude','on',... -'Description','Axes Title',... -'DescriptionMode','auto',... 'Visible','on',... -'Serializable','on',... -'HandleVisibility','off',... -'TransformForPrintFcnImplicitInvoke','on',... -'TransformForPrintFcnImplicitInvokeMode','auto'); +'HandleVisibility','off'); h9 = get(h7,'xlabel'); @@ -5028,10 +4899,7 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'Parent',h7,... 'Units','data',... 'FontUnits','points',... -'DecorationContainer',[],... -'DecorationContainerMode','auto',... 'Color',[0.15 0.15 0.15],... -'ColorMode','auto',... 'Position',[0.500000476837158 -0.392847229176095 7.105427357601e-15],... 'PositionMode','auto',... 'String',blanks(0),... @@ -5040,7 +4908,6 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'RotationMode','auto',... 'FontName','CMU Serif',... 'FontSize',10.593,... -'FontSizeMode','auto',... 'FontAngle','normal',... 'FontWeight','normal',... 'HorizontalAlignment','center',... @@ -5053,15 +4920,6 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'BackgroundColor','none',... 'Margin',3,... 'Clipping','off',... -'Layer','back',... -'LayerMode','auto',... -'FontSmoothing','on',... -'FontSmoothingMode','auto',... -'DisplayName',blanks(0),... -'IncludeRenderer','on',... -'IsContainer','off',... -'IsContainerMode','auto',... -'HelpTopicKey',blanks(0),... 'ButtonDownFcn',blanks(0),... 'BusyAction','queue',... 'Interruptible','on',... @@ -5070,21 +4928,11 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'Tag',blanks(0),... 'HitTest','on',... 'PickableParts','visible',... -'PickablePartsMode','auto',... -'DimensionNames',{ 'X' 'Y' 'Z' },... -'DimensionNamesMode','auto',... 'XLimInclude','on',... 'YLimInclude','on',... 'ZLimInclude','on',... -'CLimInclude','on',... -'ALimInclude','on',... -'Description','AxisRulerBase Label',... -'DescriptionMode','auto',... 'Visible','on',... -'Serializable','on',... -'HandleVisibility','off',... -'TransformForPrintFcnImplicitInvoke','on',... -'TransformForPrintFcnImplicitInvokeMode','auto'); +'HandleVisibility','off'); h10 = get(h7,'ylabel'); @@ -5092,10 +4940,7 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'Parent',h7,... 'Units','data',... 'FontUnits','points',... -'DecorationContainer',[],... -'DecorationContainerMode','auto',... 'Color',[0.15 0.15 0.15],... -'ColorMode','auto',... 'Position',[-0.0671572591700866 0.50000047683716 7.105427357601e-15],... 'PositionMode','auto',... 'String',blanks(0),... @@ -5104,7 +4949,6 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'RotationMode','auto',... 'FontName','CMU Serif',... 'FontSize',10.593,... -'FontSizeMode','auto',... 'FontAngle','normal',... 'FontWeight','normal',... 'HorizontalAlignment','center',... @@ -5117,15 +4961,6 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'BackgroundColor','none',... 'Margin',3,... 'Clipping','off',... -'Layer','back',... -'LayerMode','auto',... -'FontSmoothing','on',... -'FontSmoothingMode','auto',... -'DisplayName',blanks(0),... -'IncludeRenderer','on',... -'IsContainer','off',... -'IsContainerMode','auto',... -'HelpTopicKey',blanks(0),... 'ButtonDownFcn',blanks(0),... 'BusyAction','queue',... 'Interruptible','on',... @@ -5134,21 +4969,11 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'Tag',blanks(0),... 'HitTest','on',... 'PickableParts','visible',... -'PickablePartsMode','auto',... -'DimensionNames',{ 'X' 'Y' 'Z' },... -'DimensionNamesMode','auto',... 'XLimInclude','on',... 'YLimInclude','on',... 'ZLimInclude','on',... -'CLimInclude','on',... -'ALimInclude','on',... -'Description','AxisRulerBase Label',... -'DescriptionMode','auto',... 'Visible','on',... -'Serializable','on',... -'HandleVisibility','off',... -'TransformForPrintFcnImplicitInvoke','on',... -'TransformForPrintFcnImplicitInvokeMode','auto'); +'HandleVisibility','off'); h11 = get(h7,'zlabel'); @@ -5156,10 +4981,7 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'Parent',h7,... 'Units','data',... 'FontUnits','points',... -'DecorationContainer',[],... -'DecorationContainerMode','auto',... 'Color',[0.15 0.15 0.15],... -'ColorMode','auto',... 'Position',[0 0 0],... 'PositionMode','auto',... 'String',blanks(0),... @@ -5168,7 +4990,6 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'RotationMode','auto',... 'FontName','CMU Serif',... 'FontSize',10,... -'FontSizeMode','auto',... 'FontAngle','normal',... 'FontWeight','normal',... 'HorizontalAlignment','left',... @@ -5181,15 +5002,6 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'BackgroundColor','none',... 'Margin',3,... 'Clipping','off',... -'Layer','middle',... -'LayerMode','auto',... -'FontSmoothing','on',... -'FontSmoothingMode','auto',... -'DisplayName',blanks(0),... -'IncludeRenderer','on',... -'IsContainer','off',... -'IsContainerMode','auto',... -'HelpTopicKey',blanks(0),... 'ButtonDownFcn',blanks(0),... 'BusyAction','queue',... 'Interruptible','on',... @@ -5198,21 +5010,11 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'Tag',blanks(0),... 'HitTest','on',... 'PickableParts','visible',... -'PickablePartsMode','auto',... -'DimensionNames',{ 'X' 'Y' 'Z' },... -'DimensionNamesMode','auto',... 'XLimInclude','on',... 'YLimInclude','on',... 'ZLimInclude','on',... -'CLimInclude','on',... -'ALimInclude','on',... -'Description','AxisRulerBase Label',... -'DescriptionMode','auto',... 'Visible','off',... -'Serializable','on',... -'HandleVisibility','off',... -'TransformForPrintFcnImplicitInvoke','on',... -'TransformForPrintFcnImplicitInvokeMode','auto'); +'HandleVisibility','off'); appdata = []; appdata.lastValidTag = 'uipanel1'; @@ -5624,7 +5426,7 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'FontUnits',get(0,'defaultuipanelFontUnits'),... 'Units',get(0,'defaultuipanelUnits'),... 'ShadowColor',get(0,'defaultuipanelShadowColor'),... -'Title',{ 'Visualization'; ' ' },... +'Title',strtrim(strjoin({ 'Visualization'; ' ' })),... 'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... 'Tag','uipanel2',... 'UserData',[],... @@ -6181,7 +5983,7 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'FontUnits',get(0,'defaultuipanelFontUnits'),... 'Units',get(0,'defaultuipanelUnits'),... 'ShadowColor',get(0,'defaultuipanelShadowColor'),... -'Title',{ 'Objectives & constraints'; ' '; ' ' },... +'Title',strtrim(strjoin({ 'Objectives & constraints'; ' '; ' ' })),... 'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... 'Tag','uipanel3',... 'UserData',[],... @@ -6497,9 +6299,6 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'PlotBoxAspectRatioMode',get(0,'defaultaxesPlotBoxAspectRatioMode'),... 'FontName','CMU Serif',... 'Colormap',[0 0 0.5625;0 0 0.625;0 0 0.6875;0 0 0.75;0 0 0.8125;0 0 0.875;0 0 0.9375;0 0 1;0 0.0625 1;0 0.125 1;0 0.1875 1;0 0.25 1;0 0.3125 1;0 0.375 1;0 0.4375 1;0 0.5 1;0 0.5625 1;0 0.625 1;0 0.6875 1;0 0.75 1;0 0.8125 1;0 0.875 1;0 0.9375 1;0 1 1;0.0625 1 1;0.125 1 0.9375;0.1875 1 0.875;0.25 1 0.8125;0.3125 1 0.75;0.375 1 0.6875;0.4375 1 0.625;0.5 1 0.5625;0.5625 1 0.5;0.625 1 0.4375;0.6875 1 0.375;0.75 1 0.3125;0.8125 1 0.25;0.875 1 0.1875;0.9375 1 0.125;1 1 0.0625;1 1 0;1 0.9375 0;1 0.875 0;1 0.8125 0;1 0.75 0;1 0.6875 0;1 0.625 0;1 0.5625 0;1 0.5 0;1 0.4375 0;1 0.375 0;1 0.3125 0;1 0.25 0;1 0.1875 0;1 0.125 0;1 0.0625 0;1 0 0;0.9375 0 0;0.875 0 0;0.8125 0 0;0.75 0 0;0.6875 0 0;0.625 0 0;0.5625 0 0],... -'ColormapMode',get(0,'defaultaxesColormapMode'),... -'Alphamap',[0 0.0159 0.0317 0.0476 0.0635 0.0794 0.0952 0.1111 0.127 0.1429 0.1587 0.1746 0.1905 0.2063 0.2222 0.2381 0.254 0.2698 0.2857 0.3016 0.3175 0.3333 0.3492 0.3651 0.381 0.3968 0.4127 0.4286 0.4444 0.4603 0.4762 0.4921 0.5079 0.5238 0.5397 0.5556 0.5714 0.5873 0.6032 0.619 0.6349 0.6508 0.6667 0.6825 0.6984 0.7143 0.7302 0.746 0.7619 0.7778 0.7937 0.8095 0.8254 0.8413 0.8571 0.873 0.8889 0.9048 0.9206 0.9365 0.9524 0.9683 0.9841 1],... -'AlphamapMode',get(0,'defaultaxesAlphamapMode'),... 'GridLineStyle',get(0,'defaultaxesGridLineStyle'),... 'XTick',[0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1],... 'XTickMode',get(0,'defaultaxesXTickMode'),... @@ -6510,21 +6309,11 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'YTickLabel',{ '0'; '0.1'; '0.2'; '0.3'; '0.4'; '0.5'; '0.6'; '0.7'; '0.8'; '0.9'; '1' },... 'YTickLabelMode',get(0,'defaultaxesYTickLabelMode'),... 'Color',get(0,'defaultaxesColor'),... -'CameraMode',get(0,'defaultaxesCameraMode'),... -'DataSpaceMode',get(0,'defaultaxesDataSpaceMode'),... -'ColorSpaceMode',get(0,'defaultaxesColorSpaceMode'),... -'DecorationContainerMode',get(0,'defaultaxesDecorationContainerMode'),... -'ChildContainerMode',get(0,'defaultaxesChildContainerMode'),... -'XRulerMode',get(0,'defaultaxesXRulerMode'),... -'YRulerMode',get(0,'defaultaxesYRulerMode'),... -'ZRulerMode',get(0,'defaultaxesZRulerMode'),... -'AmbientLightSourceMode',get(0,'defaultaxesAmbientLightSourceMode'),... 'ButtonDownFcn',@(hObject,eventdata)matRadGUI_export('axesFig_ButtonDownFcn',hObject,eventdata,guidata(hObject)),... 'Tag','axesFig',... 'UserData',[],... 'Position',[0.0718390804597701 0.0354391371340524 0.902298850574712 0.929121725731895],... 'ActivePositionProperty','position',... -'ActivePositionPropertyMode',get(0,'defaultaxesActivePositionPropertyMode'),... 'LooseInset',[0.199881557553276 0.118695547917832 0.146067292058163 0.0809287826712493],... 'FontSize',9.63,... 'SortMethod','childorder',... @@ -6536,10 +6325,7 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'Parent',h89,... 'Units','data',... 'FontUnits','points',... -'DecorationContainer',[],... -'DecorationContainerMode','auto',... 'Color',[0 0 0],... -'ColorMode','auto',... 'Position',[0.500000554361651 1.00343482490272 0.5],... 'PositionMode','auto',... 'String',blanks(0),... @@ -6548,7 +6334,6 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'RotationMode','auto',... 'FontName','Helvetica',... 'FontSize',10.593,... -'FontSizeMode','auto',... 'FontAngle','normal',... 'FontWeight','normal',... 'HorizontalAlignment','center',... @@ -6561,15 +6346,6 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'BackgroundColor','none',... 'Margin',2,... 'Clipping','off',... -'Layer','middle',... -'LayerMode','auto',... -'FontSmoothing','on',... -'FontSmoothingMode','auto',... -'DisplayName',blanks(0),... -'IncludeRenderer','on',... -'IsContainer','off',... -'IsContainerMode','auto',... -'HelpTopicKey',blanks(0),... 'ButtonDownFcn',blanks(0),... 'BusyAction','queue',... 'Interruptible','on',... @@ -6578,21 +6354,11 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'Tag',blanks(0),... 'HitTest','on',... 'PickableParts','visible',... -'PickablePartsMode','auto',... -'DimensionNames',{ 'X' 'Y' 'Z' },... -'DimensionNamesMode','auto',... 'XLimInclude','on',... 'YLimInclude','on',... 'ZLimInclude','on',... -'CLimInclude','on',... -'ALimInclude','on',... -'Description','Axes Title',... -'DescriptionMode','auto',... 'Visible','on',... -'Serializable','on',... -'HandleVisibility','off',... -'TransformForPrintFcnImplicitInvoke','on',... -'TransformForPrintFcnImplicitInvokeMode','auto'); +'HandleVisibility','off'); h91 = get(h89,'xlabel'); @@ -6600,10 +6366,7 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'Parent',h89,... 'Units','data',... 'FontUnits','points',... -'DecorationContainer',[],... -'DecorationContainerMode','auto',... 'Color',[0.15 0.15 0.15],... -'ColorMode','auto',... 'Position',[0.500000476837158 -0.0366861225689741 0],... 'PositionMode','auto',... 'String',blanks(0),... @@ -6612,7 +6375,6 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'RotationMode','auto',... 'FontName','CMU Serif',... 'FontSize',10.593,... -'FontSizeMode','auto',... 'FontAngle','normal',... 'FontWeight','normal',... 'HorizontalAlignment','center',... @@ -6625,15 +6387,6 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'BackgroundColor','none',... 'Margin',3,... 'Clipping','off',... -'Layer','back',... -'LayerMode','auto',... -'FontSmoothing','on',... -'FontSmoothingMode','auto',... -'DisplayName',blanks(0),... -'IncludeRenderer','on',... -'IsContainer','off',... -'IsContainerMode','auto',... -'HelpTopicKey',blanks(0),... 'ButtonDownFcn',blanks(0),... 'BusyAction','queue',... 'Interruptible','on',... @@ -6642,21 +6395,11 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'Tag',blanks(0),... 'HitTest','on',... 'PickableParts','visible',... -'PickablePartsMode','auto',... -'DimensionNames',{ 'X' 'Y' 'Z' },... -'DimensionNamesMode','auto',... 'XLimInclude','on',... 'YLimInclude','on',... 'ZLimInclude','on',... -'CLimInclude','on',... -'ALimInclude','on',... -'Description','AxisRulerBase Label',... -'DescriptionMode','auto',... 'Visible','on',... -'Serializable','on',... -'HandleVisibility','off',... -'TransformForPrintFcnImplicitInvoke','on',... -'TransformForPrintFcnImplicitInvokeMode','auto'); +'HandleVisibility','off'); h92 = get(h89,'ylabel'); @@ -6664,10 +6407,7 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'Parent',h89,... 'Units','data',... 'FontUnits','points',... -'DecorationContainer',[],... -'DecorationContainerMode','auto',... 'Color',[0.15 0.15 0.15],... -'ColorMode','auto',... 'Position',[-0.0429806458688552 0.500000476837158 0],... 'PositionMode','auto',... 'String',blanks(0),... @@ -6676,7 +6416,6 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'RotationMode','auto',... 'FontName','CMU Serif',... 'FontSize',10.593,... -'FontSizeMode','auto',... 'FontAngle','normal',... 'FontWeight','normal',... 'HorizontalAlignment','center',... @@ -6689,15 +6428,6 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'BackgroundColor','none',... 'Margin',3,... 'Clipping','off',... -'Layer','back',... -'LayerMode','auto',... -'FontSmoothing','on',... -'FontSmoothingMode','auto',... -'DisplayName',blanks(0),... -'IncludeRenderer','on',... -'IsContainer','off',... -'IsContainerMode','auto',... -'HelpTopicKey',blanks(0),... 'ButtonDownFcn',blanks(0),... 'BusyAction','queue',... 'Interruptible','on',... @@ -6706,21 +6436,11 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'Tag',blanks(0),... 'HitTest','on',... 'PickableParts','visible',... -'PickablePartsMode','auto',... -'DimensionNames',{ 'X' 'Y' 'Z' },... -'DimensionNamesMode','auto',... 'XLimInclude','on',... 'YLimInclude','on',... 'ZLimInclude','on',... -'CLimInclude','on',... -'ALimInclude','on',... -'Description','AxisRulerBase Label',... -'DescriptionMode','auto',... 'Visible','on',... -'Serializable','on',... -'HandleVisibility','off',... -'TransformForPrintFcnImplicitInvoke','on',... -'TransformForPrintFcnImplicitInvokeMode','auto'); +'HandleVisibility','off'); h93 = get(h89,'zlabel'); @@ -6728,10 +6448,7 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'Parent',h89,... 'Units','data',... 'FontUnits','points',... -'DecorationContainer',[],... -'DecorationContainerMode','auto',... 'Color',[0.15 0.15 0.15],... -'ColorMode','auto',... 'Position',[0 0 0],... 'PositionMode','auto',... 'String',blanks(0),... @@ -6740,7 +6457,6 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'RotationMode','auto',... 'FontName','CMU Serif',... 'FontSize',10,... -'FontSizeMode','auto',... 'FontAngle','normal',... 'FontWeight','normal',... 'HorizontalAlignment','left',... @@ -6753,15 +6469,6 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'BackgroundColor','none',... 'Margin',3,... 'Clipping','off',... -'Layer','middle',... -'LayerMode','auto',... -'FontSmoothing','on',... -'FontSmoothingMode','auto',... -'DisplayName',blanks(0),... -'IncludeRenderer','on',... -'IsContainer','off',... -'IsContainerMode','auto',... -'HelpTopicKey',blanks(0),... 'ButtonDownFcn',blanks(0),... 'BusyAction','queue',... 'Interruptible','on',... @@ -6770,21 +6477,11 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) 'Tag',blanks(0),... 'HitTest','on',... 'PickableParts','visible',... -'PickablePartsMode','auto',... -'DimensionNames',{ 'X' 'Y' 'Z' },... -'DimensionNamesMode','auto',... 'XLimInclude','on',... 'YLimInclude','on',... 'ZLimInclude','on',... -'CLimInclude','on',... -'ALimInclude','on',... -'Description','AxisRulerBase Label',... -'DescriptionMode','auto',... 'Visible','off',... -'Serializable','on',... -'HandleVisibility','off',... -'TransformForPrintFcnImplicitInvoke','on',... -'TransformForPrintFcnImplicitInvokeMode','auto'); +'HandleVisibility','off'); appdata = []; appdata.lastValidTag = 'uipanel12'; @@ -7353,7 +7050,7 @@ function local_CreateFcn(hObject, eventdata, createfcn, appdata) % openfig (called by local_openfig below) does this for guis without % the LayoutFcn. Be sure to do it here so guis show up on screen. - movegui(gui_hFigure,'onscreen'); + try, movegui(gui_hFigure,'onscreen');, catch, fprintf('movegui not supported\n'), end else gui_hFigure = local_openfig(gui_State.gui_Name, gui_SingletonOpt, gui_Visible); % If the figure has InGUIInitialization it was not completely created @@ -7422,7 +7119,10 @@ try set(gui_hFigure, varargin{index}, varargin{index+1}), catch break, end if isscalar(gui_hFigure) && ishghandle(gui_hFigure) % Handle the default callbacks of predefined toolbar tools in this % GUI, if any + try guidemfile('restoreToolbarToolPredefinedCallback',gui_hFigure); + catch + end % Update handle visibility set(gui_hFigure,'HandleVisibility', gui_HandleVisibility); diff --git a/tools/matRad_fixExportedGUI.m b/tools/matRad_fixExportedGUI.m index 8d5cddbdd..9e56c30d8 100644 --- a/tools/matRad_fixExportedGUI.m +++ b/tools/matRad_fixExportedGUI.m @@ -2,37 +2,59 @@ f=fread(fid,'*char')'; fclose(fid); - -f = regexprep(f,'\n''Alphamap'',\[[\s.;0-9]*?\](,\.\.\.|\))',''); -f = regexprep(f,'\n''DecorationContainer'',\[[\s.;0-9]*?\](,\.\.\.|\))',''); -f = regexprep(f,'\n''Layer'',''(back|middle|front)''(,\.\.\.|\))',''); -f = regexprep(f,'\n''DisplayName'',blanks\(0\)(,\.\.\.|\))',''); -f = regexprep(f,'\n''HelpTopicKey'',blanks\(0\)(,\.\.\.|\))',''); -f = regexprep(f,'\n''DimensionNames'',{[\s\w'']*?}(,\.\.\.|\))',''); -f = regexprep(f,'\n''Description'',''[\w\s]*?''(,\.\.\.|\))',''); +if ispc + nl = '\r\n';%newline; +else + nl = '\n'; +end + +f = regexprep(f,[nl '''Alphamap'',\[[\s.;0-9]*?\](,\.\.\.|\))'],''); +f = regexprep(f,[nl '''DecorationContainer'',\[[\s.;0-9]*?\](,\.\.\.|\))'],''); +f = regexprep(f,[nl '''Layer'',''(back|middle|front)''(,\.\.\.|\))'],''); +f = regexprep(f,[nl '''DisplayName'',blanks\(0\)(,\.\.\.|\))'],''); +f = regexprep(f,[nl '''HelpTopicKey'',blanks\(0\)(,\.\.\.|\))'],''); +f = regexprep(f,[nl '''DimensionNames'',{[\s\w'']*?}(,\.\.\.|\))'],''); +f = regexprep(f,[nl '''Description'',''[\w\s]*?''(,\.\.\.|\))'],''); %On/Off properties expr = {'FontSmoothing','CLimInclude','ALimInclude','IncludeRenderer','IsContainer','IsContainer','Serializable','TransformForPrintFcnImplicitInvoke'}; expr = strjoin(expr,'|'); -expr = ['\n''(' expr ')'',''(on|off)''(,\.\.\.|\))']; +expr = [nl '''(' expr ')'',''(on|off)''(,\.\.\.|\))']; f = regexprep(f,expr,''); -edit + %Mode sets modestrings = {'ScreenPixelsPerInch','DecorationContainer','Color','FontSize','Layer','FontSmoothing','IsContainer','PickableParts','DimensionNames','Description','TransformForPrintFcnImplicitInvoke'}; modestrings = strjoin(modestrings,'|'); -expr = ['\n''(' modestrings ')Mode'',''\w*?''(,\.\.\.|\))']; +expr = [nl '''(' modestrings ')Mode'',''\w*?''(,\.\.\.|\))']; f = regexprep(f,expr,''); %Mode gets modestrings = {'Colormap','Alphamap','Camera','DataSpace','ColorSpace','DecorationContainer','ChildContainer','XRuler','YRuler','ZRuler','AmbientLightSource','ActivePositionProperty'}; modestrings = strjoin(modestrings,'|'); -expr = ['\n''(' modestrings ')Mode'',get\(0,''defaultaxes(' modestrings ')Mode''\)(,\.\.\.|\))']; +expr = [nl '''(' modestrings ')Mode'',get\(0,''defaultaxes(' modestrings ')Mode''\)(,\.\.\.|\))']; f = regexprep(f,expr,''); %Fix whitespaces f = regexprep(f,'(,\.\.\.)\s*?;',');'); +%Disable compability error +f = regexprep(f,'(matRad GUI not available for)(.*?)(return;)','matRad GUI not fully supported for$2'); + +%Fix Javax +f = regexprep(f,'(javax\.swing\.UIManager\.setLookAndFeel\(lf\);)','try, $1, catch, fprintf(''javax not supported\\n''), end'); + +%Fix Movegui +f = regexprep(f,'(movegui\(gui_hFigure,''onscreen''\);)','try, $1, catch, fprintf(''movegui not supported\\n''), end'); + +%Fix OpenGL +f = regexprep(f,'(opengl software)','try, $1, catch, fprintf(''opengl not supported\\n''), end'); + +%Fix Logos +f = regexprep(f,'(matrad\_logo\.png|DKFZ\_Logo\.png)','gui/$1'); + +%Fix cell array titles +f = regexprep(f,'(''Title'',)({.*?})','$1strtrim(strjoin($2))'); fid = fopen('matRadGUI_export2.m','w'); fprintf(fid,'%s',f); From df2ca61b9dfe6d3c72020b6b2481bdeb90ca52f6 Mon Sep 17 00:00:00 2001 From: Niklas Wahl Date: Thu, 8 Aug 2019 12:10:56 +0200 Subject: [PATCH 04/87] octave compatible dicom import --- .../matRad_checkEnvDicomRequirements.m | 42 +++++++++++++++++++ dicomImport/matRad_createCst.m | 11 ++--- dicomImport/matRad_importDicom.m | 13 ++++-- dicomImport/matRad_importDicomCt.m | 20 +++++++-- dicomImport/matRad_importDicomRTPlan.m | 7 +++- dicomImport/matRad_importDicomRtss.m | 7 +++- .../matRad_importDicomSteeringParticles.m | 6 ++- dicomImport/matRad_interpDicomDoseCube.m | 8 +++- dicomImport/matRad_scanDicomImportFolder.m | 12 ++++-- 9 files changed, 104 insertions(+), 22 deletions(-) create mode 100644 dicomImport/matRad_checkEnvDicomRequirements.m diff --git a/dicomImport/matRad_checkEnvDicomRequirements.m b/dicomImport/matRad_checkEnvDicomRequirements.m new file mode 100644 index 000000000..9f30ea75a --- /dev/null +++ b/dicomImport/matRad_checkEnvDicomRequirements.m @@ -0,0 +1,42 @@ +function matRad_checkEnvDicomRequirements(env) +% matRad function to check if requirements for dicom import / export are +% given. Throws an error if requirements not met +% +% call +% matRad_checkEnvDicomRequirements(env) +% +% input +% env: folder to be scanned +% +% References +% - +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Copyright 2015 the matRad development team. +% +% This file is part of the matRad project. It is subject to the license +% terms in the LICENSE file found in the top-level directory of this +% distribution and at https://github.com/e0404/matRad/LICENSES.txt. No part +% of the matRad project, including this file, may be copied, modified, +% propagated, or distributed except according to the terms contained in the +% LICENSE file. +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +if strcmp(env,'OCTAVE') + try + pkg load dicom; + pkg load image; + catch + error('Octave needs dicom and image packages from Octave Forge for dicom import!'); + end +else + if ~license('checkout','image_toolbox') + error('image processing toolbox and/or corresponding licence not available'); + end +end + +end + diff --git a/dicomImport/matRad_createCst.m b/dicomImport/matRad_createCst.m index 0495ebafe..70b988407 100755 --- a/dicomImport/matRad_createCst.m +++ b/dicomImport/matRad_createCst.m @@ -47,12 +47,9 @@ cst{i,5}.Priority = 1; % default objectives for targets - cst{i,6}(1).type = 'square deviation'; - cst{i,6}(1).penalty = 800; - cst{i,6}(1).dose = 30; - cst{i,6}(1).EUD = NaN; - cst{i,6}(1).volume = NaN; - cst{i,6}(1).robustness = 'none'; + cst{i,6}{1}.type = 'DoseObjectives.matRad_SquaredDeviation'; + cst{i,6}{1}.penalty = 800; + cst{i,6}{1}.parameters{1} = 60; else @@ -60,7 +57,7 @@ cst{i,5}.Priority = 2; - cst{i,6} = []; % define no OAR dummy objcetives + %cst{i,6} = []; % define no OAR dummy objcetives end diff --git a/dicomImport/matRad_importDicom.m b/dicomImport/matRad_importDicom.m index 390264ded..ecf4c4cea 100755 --- a/dicomImport/matRad_importDicom.m +++ b/dicomImport/matRad_importDicom.m @@ -33,7 +33,12 @@ % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -[env, ~] = matRad_getEnvironment(); +env = matRad_getEnvironment(); + +matRad_checkEnvDicomRequirements(env); + +isOctave = strcmp(env,'OCTAVE'); + %% if ~exist('dicomMetaBool','var') @@ -52,7 +57,7 @@ resolution.z = files.resz; % [mm] / lps coordinate system if files.useDoseGrid && isfield(files,'rtdose') % get grid from dose cube - if verLessThan('matlab','9') + if isOctave || verLessThan('matlab','9') doseInfo = dicominfo(files.rtdose{1,1}); else doseInfo = dicominfo(files.rtdose{1,1},'UseDictionaryVR',true); @@ -158,9 +163,11 @@ switch env case 'MATLAB' clearvars -except ct cst pln stf resultGUI FileName PathName; + save([PathName, FileName], '-regexp', '^(?!(FileName|PathName)$).','-v7'); case 'OCTAVE' clear -x ct cst pln stf resultGUI FileName PathName; + save([PathName, FileName],'-v6'); end % save all except FileName and PathName - save([PathName, FileName], '-regexp', '^(?!(FileName|PathName)$).','-v7.3'); + end diff --git a/dicomImport/matRad_importDicomCt.m b/dicomImport/matRad_importDicomCt.m index 70ee882d4..412f1d1da 100755 --- a/dicomImport/matRad_importDicomCt.m +++ b/dicomImport/matRad_importDicomCt.m @@ -41,12 +41,19 @@ visBool = 0; end +env = matRad_getEnvironment(); + +matRad_checkEnvDicomRequirements(env); + +isOctave = strcmp(env,'OCTAVE'); + + % creation of ctInfo list numOfSlices = size(ctList,1); fprintf('\ncreating info...') for i = 1:numOfSlices - if verLessThan('matlab','9') + if isOctave ||verLessThan('matlab','9') tmpDicomInfo = dicominfo(ctList{i,1}); else tmpDicomInfo = dicominfo(ctList{i,1},'UseDictionaryVR',true); @@ -61,8 +68,8 @@ ctInfo(i).PatientPosition = tmpDicomInfo.PatientPosition; ctInfo(i).Rows = tmpDicomInfo.Rows; ctInfo(i).Columns = tmpDicomInfo.Columns; - ctInfo(i).Width = tmpDicomInfo.Width; - ctInfo(i).Height = tmpDicomInfo.Height; + ctInfo(i).Width = tmpDicomInfo.Columns;%tmpDicomInfo.Width; + ctInfo(i).Height = tmpDicomInfo.Rows;%tmpDicomInfo.Height; ctInfo(i).RescaleSlope = tmpDicomInfo.RescaleSlope; ctInfo(i).RescaleIntercept = tmpDicomInfo.RescaleIntercept; @@ -125,7 +132,12 @@ origCt = zeros(ctInfo(1).Height, ctInfo(1).Width, numOfSlices); for i = 1:numOfSlices currentFilename = ctList{i}; - [currentImage, map] = dicomread(currentFilename); + if isOctave + currentImage = dicomread(currentFilename); + map = []; + else + [currentImage, map] = dicomread(currentFilename); + end origCt(:,:,i) = currentImage(:,:); % creation of the ct cube % draw current ct-slice diff --git a/dicomImport/matRad_importDicomRTPlan.m b/dicomImport/matRad_importDicomRTPlan.m index 2c4377608..5187c1262 100644 --- a/dicomImport/matRad_importDicomRTPlan.m +++ b/dicomImport/matRad_importDicomRTPlan.m @@ -29,6 +29,11 @@ % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +env = matRad_getEnvironment(); +matRad_checkEnvDicomRequirements(env); +isOctave = strcmp(env,'OCTAVE'); + %% load plan file % check size of RT Plan if size(rtPlanFiles,1) ~= 1 @@ -36,7 +41,7 @@ end % read information out of the RT file -if verLessThan('matlab','9') +if isOctave || verLessThan('matlab','9') planInfo = dicominfo(rtPlanFiles{1}); else planInfo = dicominfo(rtPlanFiles{1},'UseDictionaryVR',true); diff --git a/dicomImport/matRad_importDicomRtss.m b/dicomImport/matRad_importDicomRtss.m index 2cb512994..3519e1c09 100755 --- a/dicomImport/matRad_importDicomRtss.m +++ b/dicomImport/matRad_importDicomRtss.m @@ -37,8 +37,13 @@ visBool = 0; end +env = matRad_getEnvironment(); +matRad_checkEnvDicomRequirements(env); +isOctave = strcmp(env,'OCTAVE'); + + % read dicom info (this includes already all data for the rtss) -if verLessThan('matlab','9') +if isOctave || verLessThan('matlab','9') structInfo = dicominfo(filename); else % apply 'UseVRHeuristic' option when available to use a to help read certain % noncompliant files which switch value representation (VR) modes incorrectly diff --git a/dicomImport/matRad_importDicomSteeringParticles.m b/dicomImport/matRad_importDicomSteeringParticles.m index e890a1c88..23225e1c6 100644 --- a/dicomImport/matRad_importDicomSteeringParticles.m +++ b/dicomImport/matRad_importDicomSteeringParticles.m @@ -36,6 +36,10 @@ %% load plan file % load machine data +env = matRad_getEnvironment(); +matRad_checkEnvDicomRequirements(env); +isOctave = strcmp(env,'OCTAVE'); + dlgBaseDataText = ['Import steering information from DICOM Plan.','Choose corresponding matRad base data for ', ... pln.radiationMode, '.']; % messagebox only necessary for non windows users @@ -49,7 +53,7 @@ pln.machine = fileName(ix(1)+1:end-4); % RT Plan consists only on meta information -if verLessThan('matlab','9') +if isOctave || verLessThan('matlab','9') rtPlanInfo = dicominfo(rtPlanFile{1}); else rtPlanInfo = dicominfo(rtPlanFile{1},'UseDictionaryVR',true); diff --git a/dicomImport/matRad_interpDicomDoseCube.m b/dicomImport/matRad_interpDicomDoseCube.m index 2dc32126d..f8f07182c 100644 --- a/dicomImport/matRad_interpDicomDoseCube.m +++ b/dicomImport/matRad_interpDicomDoseCube.m @@ -29,8 +29,14 @@ % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % read information out of the RT file + +env = matRad_getEnvironment(); +matRad_checkEnvDicomRequirements(env); +isOctave = strcmp(env,'OCTAVE'); + dosefile = currDose{1}; -if verLessThan('matlab','9') + +if isOctave || verLessThan('matlab','9') doseInfo = dicominfo(dosefile); else doseInfo = dicominfo(dosefile,'UseDictionaryVR',true); diff --git a/dicomImport/matRad_scanDicomImportFolder.m b/dicomImport/matRad_scanDicomImportFolder.m index 07d7e92eb..2bfab1830 100755 --- a/dicomImport/matRad_scanDicomImportFolder.m +++ b/dicomImport/matRad_scanDicomImportFolder.m @@ -38,9 +38,13 @@ %% get all files in search directory % dicom import needs image processing toolbox -> check if available -if ~license('checkout','image_toolbox') - error('image processing toolbox and/or corresponding licence not available'); -end + +env = matRad_getEnvironment(); + +matRad_checkEnvDicomRequirements(env); + +isOctave = strcmp(env,'OCTAVE'); + fileList = matRad_listAllFiles(patDir); @@ -53,7 +57,7 @@ for i = numOfFiles:-1:1 waitbar((numOfFiles+1-i) / steps) try % try to get DicomInfo - if verLessThan('matlab','9') + if isOctave || verLessThan('matlab','9') info = dicominfo(fileList{i}); else info = dicominfo(fileList{i},'UseDictionaryVR',true); From fa937eebf6376dd759b52dd562d931a4c4b2183f Mon Sep 17 00:00:00 2001 From: Niklas Wahl Date: Fri, 9 Aug 2019 14:04:03 +0200 Subject: [PATCH 05/87] improves matRadGUI compability and fixes display of the new obejctive table --- matRadGUI.m | 255 ++++++++++++++++++++++++++++------------------------ 1 file changed, 139 insertions(+), 116 deletions(-) diff --git a/matRadGUI.m b/matRadGUI.m index 73bef818f..4e1a16712 100644 --- a/matRadGUI.m +++ b/matRadGUI.m @@ -42,17 +42,6 @@ [env, versionString] = matRad_getEnvironment(); -% abort for octave -switch env - case 'MATLAB' - - case 'OCTAVE' - fprintf(['matRad GUI not available for ' env ' ' versionString ' \n']); - return; - otherwise - fprintf(['not yet tested']); - end - % Begin initialization code - DO NOT EDIT % set platform specific look and feel if ispc @@ -62,7 +51,28 @@ elseif ismac lf = 'com.apple.laf.AquaLookAndFeel'; end -javax.swing.UIManager.setLookAndFeel(lf); + +% handle environment +switch env + case 'MATLAB' + javax.swing.UIManager.setLookAndFeel(lf); + case 'OCTAVE' + verSplit = strsplit(versionString,'.'); + if str2double(verSplit{1}) < 5 + fprintf('matRad GUI not supported for %s %s\n',env,versionString); + return; + else + warning('matRad GUI experimental for %s %s\n',env,versionString); + end + otherwise + warning('matRad GUI never tested for %s %s\n',env,versionString); +end + + + + + + gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... @@ -84,63 +94,73 @@ % End initialization code - DO NOT EDIT function handles = resetGUI(hObject, handles, varargin) -% enable opengl software rendering to visualize linewidths properly -if ispc - opengl software -elseif ismac - % opengl is not supported + +[env, versionString] = matRad_getEnvironment(); + +if strcmp(env,'MATLAB') + %OpenGL only works for pc (maybe also for linux?) + if ispc + opengl software + end end +handles.guiFilePath = mfilename('fullpath'); +handles.guiFilePath = fileparts(handles.guiFilePath); + % Choose default command line output for matRadGUI handles.output = hObject; %show matrad logo axes(handles.axesLogo) -[im, ~, alpha] = imread('matrad_logo.png'); +[im, ~, alpha] = imread([handles.guiFilePath filesep 'gfx' filesep 'matrad_logo.png']); f = image(im); axis equal off set(f, 'AlphaData', alpha); % show dkfz logo axes(handles.axesDKFZ) -[im, ~, alpha] = imread('DKFZ_Logo.png'); +[im, ~, alpha] = imread([handles.guiFilePath filesep 'gfx' filesep 'DKFZ_Logo.png']); f = image(im); axis equal off; set(f, 'AlphaData', alpha); -% turn off the datacursormode (since it does not allow to set scrolling -% callbacks -handles.dcm_obj = datacursormode(handles.figure1); -set(handles.dcm_obj,'DisplayStyle','window'); -if strcmpi(get(handles.dcm_obj,'Enable'),'on') - set(handles.dcm_obj,'Enable','off'); +if strcmp(env,'MATLAB') + % turn off the datacursormode (since it does not allow to set scrolling + % callbacks + handles.dcm_obj = datacursormode(handles.figure1); + set(handles.dcm_obj,'DisplayStyle','window'); + if strcmpi(get(handles.dcm_obj,'Enable'),'on') + set(handles.dcm_obj,'Enable','off'); + end + %Add the callback for the datacursor display + set(handles.dcm_obj,'UpdateFcn',@dataCursorUpdateFunction); end -%Add the callback for the datacursor display -set(handles.dcm_obj,'UpdateFcn',@dataCursorUpdateFunction); - % set callback for scroll wheel function set(gcf,'WindowScrollWheelFcn',@matRadScrollWheelFcn); -% change color of toobar but only the first time GUI is started -if handles.initialGuiStart - hToolbar = findall(hObject,'tag','uitoolbar1'); - jToolbar = get(get(hToolbar,'JavaContainer'),'ComponentPeer'); - jToolbar.setBorderPainted(false); - color = java.awt.Color.gray; - % Remove the toolbar border, to blend into figure contents - jToolbar.setBackground(color); - % Remove the separator line between toolbar and contents - warning('off','MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame'); - jFrame = get(handle(hObject),'JavaFrame'); - jFrame.showTopSeparator(false); - jtbc = jToolbar.getComponents; - for idx=1:length(jtbc) - jtbc(idx).setOpaque(false); - jtbc(idx).setBackground(color); - for childIdx = 1 : length(jtbc(idx).getComponents) - jtbc(idx).getComponent(childIdx-1).setBackground(color); - end - end +if strcmp(env,'MATLAB') + % change color of toobar but only the first time GUI is started + if handles.initialGuiStart + hToolbar = findall(hObject,'tag','uitoolbar1'); + jToolbar = get(get(hToolbar,'JavaContainer'),'ComponentPeer'); + jToolbar.setBorderPainted(false); + color = java.awt.Color.gray; + % Remove the toolbar border, to blend into figure contents + jToolbar.setBackground(color); + % Remove the separator line between toolbar and contents + warning('off','MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame'); + jFrame = get(handle(hObject),'JavaFrame'); + jFrame.showTopSeparator(false); + jtbc = jToolbar.getComponents; + for idx=1:length(jtbc) + jtbc(idx).setOpaque(false); + jtbc(idx).setBackground(color); + for childIdx = 1 : length(jtbc(idx).getComponents) + jtbc(idx).getComponent(childIdx-1).setBackground(color); + end + end + end end +set(handles.uipanel3,'SizeChangedFcn',@(hObject,eventdata)matRadGUI('uipanel3_SizeChangedFcn',hObject,eventdata,guidata(hObject))); set(handles.legendTable,'String',{'no data loaded'}); % clear VOIPlotFlag @@ -830,9 +850,10 @@ function UpdatePlot(handles) defaultFontSize = 8; currAxes = axis(handles.axesFig); -AxesHandlesCT_Dose = gobjects(0); AxesHandlesVOI = cell(0); -AxesHandlesIsoDose = gobjects(0); + +AxesHandlesCT_Dose = cell(0); +AxesHandlesIsoDose = cell(0); if handles.State == 0 cla reset @@ -939,7 +960,7 @@ function UpdatePlot(handles) end if get(handles.radiobtnCT,'Value') - [AxesHandlesCT_Dose(end+1),~,handles.dispWindow{ctIx,1}] = matRad_plotCtSlice(handles.axesFig,plotCtCube,1,plane,slice,ctMap,handles.dispWindow{ctIx,1}); + [AxesHandlesCT_Dose{end+1},~,handles.dispWindow{ctIx,1}] = matRad_plotCtSlice(handles.axesFig,plotCtCube,1,plane,slice,ctMap,handles.dispWindow{ctIx,1}); % plot colorbar? If 1 the user asked for the CT if plotColorbarSelection == 2 && handles.cBarChanged @@ -979,7 +1000,7 @@ function UpdatePlot(handles) if get(handles.radiobtnDose,'Value') [doseHandle,~,handles.dispWindow{doseIx,1}] = matRad_plotDoseSlice(handles.axesFig,dose,plane,slice,handles.CutOffLevel,handles.doseOpacity,doseMap,handles.dispWindow{doseIx,1}); - AxesHandlesCT_Dose(end+1) = doseHandle; + AxesHandlesCT_Dose{end+1} = doseHandle; end % plot colorbar? @@ -4154,25 +4175,33 @@ function checkbox_lockColormap_Callback(hObject, eventdata, handles) cstPanel = handles.uipanel3; -cstPanelPos = getpixelposition(cstPanel); + + +cstPanelPos = get(cstPanel,'Position'); +cstPanelPosUnit = get(cstPanel,'Units'); +set(cstPanel,'Units','pixels'); +cstPanelPosPix = get(cstPanel,'Position'); +set(cstPanel,'Units',cstPanelPosUnit); + +aspectRatio = cstPanelPosPix(3) / cstPanelPosPix(4); %Parameters for line height -objHeight = 22; -lineHeight = 25; %Height of a table line -fieldSep = 2; %Separation between fields horizontally -yTopSep = 40; %Separation of the first line from the top -tableViewHeight = cstPanelPos(4) - yTopSep; %Full height of the view +objHeight = 0.095;% 22; +lineHeight = 0.1; %25; %Height of a table line +yTopSep = 0.12;%40; %Separation of the first line from the top +%tableViewHeight = cstPanelPos(4) - yTopSep; %Full height of the view +tableViewHeight = 1 - yTopSep; %Widths of the fields -buttonW = objHeight; -nameW = 90; -typeW = 70; -opW = objHeight; -functionW = 120; -penaltyW = 40; -paramTitleW = 120; -paramW = 30; - +buttonW = objHeight / aspectRatio; % Make button squared +nameW = 3.5*buttonW;%60; +typeW = 3*buttonW;%70; +opW = buttonW;%objHeight; +functionW = 6*buttonW;%120; +penaltyW = 2*buttonW;%40; +paramTitleW = 4*buttonW;%120; +paramW = 2*buttonW;%30; +fieldSep = 0.25*buttonW; %Separation between fields horizontally %Scrollbar cstVertTableScroll = findobj(cstPanel.Children,'Style','slider'); @@ -4194,23 +4223,7 @@ function checkbox_lockColormap_Callback(hObject, eventdata, handles) %columnname = {'VOI name','VOI type','priority','obj. / const.'};%,'penalty','dose', 'EUD','volume','robustness'}; %Get all Classes & classNames -mpkgObjectives = meta.package.fromName('DoseObjectives'); -mpkgConstraints = meta.package.fromName('DoseConstraints'); -classList = [mpkgObjectives.ClassList; mpkgConstraints.ClassList]; - -classList = classList(not([classList.Abstract])); - -%Now get the "internal" name from the properties -classNames = cell(2,numel(classList)); -for clIx = 1:numel(classList) - cl = classList(clIx); - pList = cl.PropertyList; %Get List of all properties - pNameIx = arrayfun(@(p) strcmp(p.Name,'name'),pList); %get index of the "name" property - p = pList(pNameIx); %select name property - pName = p.DefaultValue; % get value / name - classNames(:,clIx) = {cl.Name; pName}; %Store class name and display name -end - +classNames = matRad_getObjectivesAndConstraints(); % Collect Class-File & Display Names %classNames = {classList.Name; p.DefaultValue}; @@ -4230,20 +4243,21 @@ function checkbox_lockColormap_Callback(hObject, eventdata, handles) newline = '\n'; %Setup Headlines -xPos = 5; -h = uicontrol(cstPanel,'Style','text','String','+/-','Position',[xPos ypos(cnt) buttonW objHeight],'TooltipString','Remove or add Constraint or Objective'); +xPos = 0.01; %5 + +h = uicontrol(cstPanel,'Style','text','String','+/-','Units','normalized','Position',[xPos ypos(cnt) buttonW objHeight],'TooltipString','Remove or add Constraint or Objective'); xPos = xPos + h.Position(3) + fieldSep; -h = uicontrol(cstPanel,'Style','text','String','VOI name','Position',[xPos ypos(cnt) nameW objHeight],'TooltipString','Name of the structure with objective/constraint'); +h = uicontrol(cstPanel,'Style','text','String','VOI name','Units','normalized','Position',[xPos ypos(cnt) nameW objHeight],'TooltipString','Name of the structure with objective/constraint'); xPos = xPos + h.Position(3) + fieldSep; -h = uicontrol(cstPanel,'Style','text','String','VOI type','Position',[xPos ypos(cnt) typeW objHeight],'TooltipString','Segmentation Classification'); +h = uicontrol(cstPanel,'Style','text','String','VOI type','Units','normalized','Position',[xPos ypos(cnt) typeW objHeight],'TooltipString','Segmentation Classification'); xPos = xPos + h.Position(3) + fieldSep; -h = uicontrol(cstPanel,'Style','text','String','OP','Position',[xPos ypos(cnt) opW objHeight],'TooltipString',['Overlap Priority' char(10) '(Smaller number overlaps higher number)']); +h = uicontrol(cstPanel,'Style','text','String','OP','Units','normalized','Position',[xPos ypos(cnt) opW objHeight],'TooltipString',['Overlap Priority' char(10) '(Smaller number overlaps higher number)']); xPos = xPos + h.Position(3) + fieldSep; -h = uicontrol(cstPanel,'Style','text','String','Function','Position',[xPos ypos(cnt) functionW objHeight],'TooltipString','Objective/Constraint function type'); +h = uicontrol(cstPanel,'Style','text','String','Function','Units','normalized','Position',[xPos ypos(cnt) functionW objHeight],'TooltipString','Objective/Constraint function type'); xPos = xPos + h.Position(3) + fieldSep; -h = uicontrol(cstPanel,'Style','text','String','p','Position',[xPos ypos(cnt) penaltyW objHeight],'TooltipString','Optimization penalty'); +h = uicontrol(cstPanel,'Style','text','String','p','Units','normalized','Position',[xPos ypos(cnt) penaltyW objHeight],'TooltipString','Optimization penalty'); xPos = xPos + h.Position(3) + fieldSep; -h = uicontrol(cstPanel,'Style','text','String','| Parameters','Position',[xPos ypos(cnt) paramTitleW objHeight],'TooltipString','List of parameters','HorizontalAlignment','left'); +h = uicontrol(cstPanel,'Style','text','String','| Parameters','Units','normalized','Position',[xPos ypos(cnt) paramTitleW objHeight],'TooltipString','List of parameters','HorizontalAlignment','left'); xPos = xPos + h.Position(3) + fieldSep; cnt = cnt + 1; @@ -4263,66 +4277,75 @@ function checkbox_lockColormap_Callback(hObject, eventdata, handles) continue; end end - + %VOI %data{Counter,1} = cst{i,2}; %ypos = cstPanelPos(4) - (yTopSep + cnt*lineHeight); - xPos = 5; + xPos = 0.01;%5; %h = uicontrol(cstPanel,'Style','popupmenu','String',cst(:,2)','Position',[xPos ypos 100 objHeight]); %h.Value = i; - h = uicontrol(cstPanel,'Style','pushbutton','String','-','Position',[xPos ypos(cnt) buttonW objHeight],'TooltipString','Remove Objective/Constraint','Callback',{@btObjRemove_Callback,handles},... + h = uicontrol(cstPanel,'Style','pushbutton','String','-','Units','normalized','Position',[xPos ypos(cnt) buttonW objHeight],'TooltipString','Remove Objective/Constraint','Callback',{@btObjRemove_Callback,handles},... 'UserData',[i,j]); - xPos = xPos + h.Position(3) + fieldSep; - h = uicontrol(cstPanel','Style','edit','String',cst{i,2},'Position',[xPos ypos(cnt) nameW objHeight],'TooltipString','Name',... + tmp_pos = get(h,'Position'); + xPos = xPos + tmp_pos(3) + fieldSep; + h = uicontrol(cstPanel','Style','edit','String',cst{i,2},'Units','normalized','Position',[xPos ypos(cnt) nameW objHeight],'TooltipString','Name',... 'Enable','inactive',... %Disable editing of name atm 'UserData',[i,2],'Callback',{@editCstParams_Callback,handles}); %Callback added, however, editing is disabled atm - xPos = xPos + h.Position(3) + fieldSep; - h = uicontrol(cstPanel,'Style','popupmenu','String',organTypes','Value',find(strcmp(cst{i,3},organTypes)),'Position',[xPos ypos(cnt) typeW objHeight],'TooltipString','Segmentation Classification',... + tmp_pos = get(h,'Position'); + xPos = xPos + tmp_pos(3) + fieldSep; + h = uicontrol(cstPanel,'Style','popupmenu','String',organTypes','Value',find(strcmp(cst{i,3},organTypes)),'Units','normalized','Position',[xPos ypos(cnt) typeW objHeight],'TooltipString','Segmentation Classification',... 'UserData',[i,3],'Callback',{@editCstParams_Callback,handles}); - xPos = xPos + h.Position(3) + fieldSep; - h = uicontrol(cstPanel,'Style','edit','String',num2str(cst{i,5}.Priority),'Position',[xPos ypos(cnt) opW objHeight],'TooltipString',['Overlap Priority' newline '(Smaller number overlaps higher number)'],... + tmp_pos = get(h,'Position'); + xPos = xPos + tmp_pos(3) + fieldSep; + h = uicontrol(cstPanel,'Style','edit','String',num2str(cst{i,5}.Priority),'Units','normalized','Position',[xPos ypos(cnt) opW objHeight],'TooltipString',['Overlap Priority' newline '(Smaller number overlaps higher number)'],... 'UserData',[i,5],'Callback',{@editCstParams_Callback,handles}); - xPos = xPos + h.Position(3) + fieldSep; + tmp_pos = get(h,'Position'); + xPos = xPos + tmp_pos(3) + fieldSep; - h = uicontrol(cstPanel,'Style','popupmenu','String',classNames(2,:)','Value',find(strcmp(obj.name,classNames(2,:))),'Position',[xPos ypos(cnt) functionW objHeight],'TooltipString','Select Objective/Constraint',... + h = uicontrol(cstPanel,'Style','popupmenu','String',classNames(2,:)','Value',find(strcmp(obj.name,classNames(2,:))),'Units','normalized','Position',[xPos ypos(cnt) functionW objHeight],'TooltipString','Select Objective/Constraint',... 'UserData',{[i,j],classNames(1,:)},'Callback',{@changeObjFunction_Callback,handles}); - xPos = xPos + h.Position(3) + fieldSep; + tmp_pos = get(h,'Position'); + xPos = xPos + tmp_pos(3) + fieldSep; %Check if we have an objective to display penalty if isa(obj,'DoseObjectives.matRad_DoseObjective') - h = uicontrol(cstPanel,'Style','edit','String',num2str(obj.penalty),'Position',[xPos ypos(cnt) penaltyW objHeight],'TooltipString','Objective Penalty','UserData',[i,j,0],'Callback',{@editObjParam_Callback,handles}); + h = uicontrol(cstPanel,'Style','edit','String',num2str(obj.penalty),'Units','normalized','Position',[xPos ypos(cnt) penaltyW objHeight],'TooltipString','Objective Penalty','UserData',[i,j,0],'Callback',{@editObjParam_Callback,handles}); else - h = uicontrol(cstPanel,'Style','edit','String','----','Position',[xPos ypos(cnt) penaltyW objHeight],'Enable','off'); + h = uicontrol(cstPanel,'Style','edit','String','----','Units','normalized','Position',[xPos ypos(cnt) penaltyW objHeight],'Enable','off'); end - xPos = xPos + h.Position(3) + fieldSep; + tmp_pos = get(h,'Position'); + xPos = xPos + tmp_pos(3) + fieldSep; for p = 1:numel(obj.parameterNames) %h = uicontrol(cstPanel,'Style','edit','String',obj.parameters{1,p},'Position',[xPos ypos(cnt) 100 objHeight],'Enable','inactive'); %xPos = xPos + h.Position(3) + fieldSep; - h = text('Parent',tmpAxes,'String',['| ' obj.parameterNames{p} ':'],'VerticalAlignment','middle','units','pix','Position',[xPos ypos(cnt)+lineHeight/2],'Interpreter','tex','FontWeight','normal',... + h = text('Parent',tmpAxes,'String',['| ' obj.parameterNames{p} ':'],'VerticalAlignment','middle','Units','normalized','Position',[xPos ypos(cnt)+lineHeight/2],'Interpreter','tex','FontWeight','normal',... 'FontSize',cstPanel.FontSize,'FontName',cstPanel.FontName,'FontUnits',cstPanel.FontUnits,'FontWeight','normal');%[xPos ypos(cnt) 100 objHeight]); - xPos = xPos + h.Extent(3) + fieldSep; + tmp_pos = get(h,'Extent'); + xPos = xPos + tmp_pos(3) + fieldSep; %h = annotation(cstPanel,'textbox','String',obj.parameters{1,p},'Units','pix','Position', [xPos ypos(cnt) 100 objHeight],'Interpreter','Tex'); %Check if we have a cell and therefore a parameter list if iscell(obj.parameterTypes{p}) - h = uicontrol(cstPanel,'Style','popupmenu','String',obj.parameterTypes{p}','Value',obj.parameters{p},'TooltipString',obj.parameterNames{p},'Position',[xPos ypos(cnt) paramW*2 objHeight],'UserData',[i,j,p],'Callback',{@editObjParam_Callback,handles}); + h = uicontrol(cstPanel,'Style','popupmenu','String',obj.parameterTypes{p}','Value',obj.parameters{p},'TooltipString',obj.parameterNames{p},'Units','normalized','Position',[xPos ypos(cnt) paramW*2 objHeight],'UserData',[i,j,p],'Callback',{@editObjParam_Callback,handles}); else - h = uicontrol(cstPanel,'Style','edit','String',num2str(obj.parameters{p}),'TooltipString',obj.parameterNames{p},'Position',[xPos ypos(cnt) paramW objHeight],'UserData',[i,j,p],'Callback',{@editObjParam_Callback,handles}); + h = uicontrol(cstPanel,'Style','edit','String',num2str(obj.parameters{p}),'TooltipString',obj.parameterNames{p},'Units','normalized','Position',[xPos ypos(cnt) paramW objHeight],'UserData',[i,j,p],'Callback',{@editObjParam_Callback,handles}); end - xPos = xPos + h.Position(3) + fieldSep; + tmp_pos = get(h,'Extent'); + xPos = xPos + tmp_pos(3) + fieldSep; end cnt = cnt +1; end end end -xPos = 5; -hAdd = uicontrol(cstPanel,'Style','pushbutton','String','+','Position',[xPos ypos(cnt) buttonW objHeight],'TooltipString','Add Objective/Constraint','Callback',{@btObjAdd_Callback,handles}); -xPos = xPos + hAdd.Position(3) + fieldSep; -h = uicontrol(cstPanel,'Style','popupmenu','String',cst(:,2)','Position',[xPos ypos(cnt) nameW objHeight]); +xPos = 0.01; %5 +hAdd = uicontrol(cstPanel,'Style','pushbutton','String','+','Units','normalized','Position',[xPos ypos(cnt) buttonW objHeight],'TooltipString','Add Objective/Constraint','Callback',{@btObjAdd_Callback,handles}); +tmp_pos = get(hAdd,'Position'); +xPos = xPos + tmp_pos(3) + fieldSep; +h = uicontrol(cstPanel,'Style','popupmenu','String',cst(:,2)','Units','normalized','Position',[xPos ypos(cnt) nameW objHeight]); hAdd.UserData = h; %Calculate Scrollbar From 78fd92747ae61dcea08895f4a5000b48d973fa25 Mon Sep 17 00:00:00 2001 From: Niklas Wahl Date: Fri, 9 Aug 2019 18:38:16 +0200 Subject: [PATCH 06/87] changes to the GUI so that exported main and layout fcn are used --- {dicomImport => gfx}/DKFZ_Logo.png | Bin {dicomImport => gfx}/matrad_logo.png | Bin gui/matRadGUI_LayoutFcn.m | 2348 +++++ gui/matRadGUI_gui_mainFcn.m | 291 + matRadGUI.m | 74 +- matRadGUI_export.m | 7518 ----------------- matRadGUI_export.mat | Bin 7550 -> 0 bytes .../matRad_getObjectivesAndConstraints.m | 96 + plotting/matRad_plotColorbar.m | 4 +- plotting/matRad_plotIsoDoseLines.m | 9 +- tools/matRad_fixExportedGUI.m | 89 +- 11 files changed, 2858 insertions(+), 7571 deletions(-) rename {dicomImport => gfx}/DKFZ_Logo.png (100%) mode change 100755 => 100644 rename {dicomImport => gfx}/matrad_logo.png (100%) mode change 100755 => 100644 create mode 100644 gui/matRadGUI_LayoutFcn.m create mode 100644 gui/matRadGUI_gui_mainFcn.m delete mode 100644 matRadGUI_export.m delete mode 100644 matRadGUI_export.mat create mode 100644 optimization/matRad_getObjectivesAndConstraints.m diff --git a/dicomImport/DKFZ_Logo.png b/gfx/DKFZ_Logo.png old mode 100755 new mode 100644 similarity index 100% rename from dicomImport/DKFZ_Logo.png rename to gfx/DKFZ_Logo.png diff --git a/dicomImport/matrad_logo.png b/gfx/matrad_logo.png old mode 100755 new mode 100644 similarity index 100% rename from dicomImport/matrad_logo.png rename to gfx/matrad_logo.png diff --git a/gui/matRadGUI_LayoutFcn.m b/gui/matRadGUI_LayoutFcn.m new file mode 100644 index 000000000..9017006a9 --- /dev/null +++ b/gui/matRadGUI_LayoutFcn.m @@ -0,0 +1,2348 @@ +% --- Creates and returns a handle to the GUI figure. +function h1 = matRadGUI_LayoutFcn(policy) +% policy - create a new figure or use a singleton. 'new' or 'reuse'. + +persistent hsingleton; +if strcmpi(policy, 'reuse') & ishandle(hsingleton) + h1 = hsingleton; + return; +end +load matRadGUI.mat + + +appdata = []; +appdata.GUIDEOptions = mat{1}; +appdata.lastValidTag = 'figure1'; +appdata.UsedByGUIData_m = struct(... + 'windowPresets', struct(... + 'name', 'Custom', ... + 'center', NaN, ... + 'width', NaN)); +appdata.GUIDELayoutEditor = []; +appdata.initTags = struct(... + 'handle', [], ... + 'tag', 'figure1'); + +h1 = figure(... +'PaperUnits',get(0,'defaultfigurePaperUnits'),... +'Units','characters',... +'Position',[138.4 -7.38461538461539 273.4 59.5384615384615],... +'Visible','on',... +'Color',[0.501960784313725 0.501960784313725 0.501960784313725],... +'CloseRequestFcn',@(hObject,eventdata)matRadGUI('figure1_CloseRequestFcn',hObject,eventdata,guidata(hObject)),... +'IntegerHandle','off',... +'Colormap',[0 0 0.5625;0 0 0.625;0 0 0.6875;0 0 0.75;0 0 0.8125;0 0 0.875;0 0 0.9375;0 0 1;0 0.0625 1;0 0.125 1;0 0.1875 1;0 0.25 1;0 0.3125 1;0 0.375 1;0 0.4375 1;0 0.5 1;0 0.5625 1;0 0.625 1;0 0.6875 1;0 0.75 1;0 0.8125 1;0 0.875 1;0 0.9375 1;0 1 1;0.0625 1 1;0.125 1 0.9375;0.1875 1 0.875;0.25 1 0.8125;0.3125 1 0.75;0.375 1 0.6875;0.4375 1 0.625;0.5 1 0.5625;0.5625 1 0.5;0.625 1 0.4375;0.6875 1 0.375;0.75 1 0.3125;0.8125 1 0.25;0.875 1 0.1875;0.9375 1 0.125;1 1 0.0625;1 1 0;1 0.9375 0;1 0.875 0;1 0.8125 0;1 0.75 0;1 0.6875 0;1 0.625 0;1 0.5625 0;1 0.5 0;1 0.4375 0;1 0.375 0;1 0.3125 0;1 0.25 0;1 0.1875 0;1 0.125 0;1 0.0625 0;1 0 0;0.9375 0 0;0.875 0 0;0.8125 0 0;0.75 0 0;0.6875 0 0;0.625 0 0;0.5625 0 0],... +'MenuBar','none',... +'Name','matRadGUI',... +'NumberTitle','off',... +'HandleVisibility','callback',... +'Tag','figure1',... +'UserData',[],... +'PaperPosition',get(0,'defaultfigurePaperPosition'),... +'PaperSize',[20.99999864 29.69999902],... +'PaperType',get(0,'defaultfigurePaperType'),... +'InvertHardcopy',get(0,'defaultfigureInvertHardcopy'),... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'axesLogo'; + +h2 = axes(... +'Parent',h1,... +'FontUnits',get(0,'defaultaxesFontUnits'),... +'Units',get(0,'defaultaxesUnits'),... +'CameraPosition',[0.5 0.5 9.16025403784439],... +'CameraPositionMode',get(0,'defaultaxesCameraPositionMode'),... +'CameraTarget',[0.5 0.5 0.5],... +'CameraTargetMode',get(0,'defaultaxesCameraTargetMode'),... +'CameraViewAngle',6.60861036031192,... +'CameraViewAngleMode',get(0,'defaultaxesCameraViewAngleMode'),... +'PlotBoxAspectRatio',[1 0.305555555555556 0.305555555555556],... +'PlotBoxAspectRatioMode',get(0,'defaultaxesPlotBoxAspectRatioMode'),... +'FontName','CMU Serif',... +'Colormap',[0 0 0.5625;0 0 0.625;0 0 0.6875;0 0 0.75;0 0 0.8125;0 0 0.875;0 0 0.9375;0 0 1;0 0.0625 1;0 0.125 1;0 0.1875 1;0 0.25 1;0 0.3125 1;0 0.375 1;0 0.4375 1;0 0.5 1;0 0.5625 1;0 0.625 1;0 0.6875 1;0 0.75 1;0 0.8125 1;0 0.875 1;0 0.9375 1;0 1 1;0.0625 1 1;0.125 1 0.9375;0.1875 1 0.875;0.25 1 0.8125;0.3125 1 0.75;0.375 1 0.6875;0.4375 1 0.625;0.5 1 0.5625;0.5625 1 0.5;0.625 1 0.4375;0.6875 1 0.375;0.75 1 0.3125;0.8125 1 0.25;0.875 1 0.1875;0.9375 1 0.125;1 1 0.0625;1 1 0;1 0.9375 0;1 0.875 0;1 0.8125 0;1 0.75 0;1 0.6875 0;1 0.625 0;1 0.5625 0;1 0.5 0;1 0.4375 0;1 0.375 0;1 0.3125 0;1 0.25 0;1 0.1875 0;1 0.125 0;1 0.0625 0;1 0 0;0.9375 0 0;0.875 0 0;0.8125 0 0;0.75 0 0;0.6875 0 0;0.625 0 0;0.5625 0 0],... +'XTick',[0 0.2 0.4 0.6 0.8 1],... +'XTickMode',get(0,'defaultaxesXTickMode'),... +'XTickLabel',{ '0'; '0.2'; '0.4'; '0.6'; '0.8'; '1' },... +'XTickLabelMode',get(0,'defaultaxesXTickLabelMode'),... +'YTick',[0 0.5 1],... +'YTickMode',get(0,'defaultaxesYTickMode'),... +'YTickLabel',{ '0'; '0.5'; '1' },... +'YTickLabelMode',get(0,'defaultaxesYTickLabelMode'),... +'Color',get(0,'defaultaxesColor'),... +'Position',[0.444874274661509 0.893725992317542 0.184397163120567 0.0998719590268886],... +'ActivePositionProperty','position',... +'LooseInset',[0.182759687929063 0.112926163636008 0.133555156563546 0.0769951115700055],... +'FontSize',9.63,... +'SortMethod','childorder',... +'Tag','axesLogo',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +h3 = get(h2,'title'); + +set(h3,... +'Parent',h2,... +'Units','data',... +'FontUnits','points',... +'Color',[0 0 0],... +'Position',[0.500002781550089 1.03439285714286 0.500000000000007],... +'PositionMode','auto',... +'String',blanks(0),... +'Interpreter','tex',... +'Rotation',0,... +'RotationMode','auto',... +'FontName','CMU Serif',... +'FontSize',10.593,... +'FontAngle','normal',... +'FontWeight','bold',... +'HorizontalAlignment','center',... +'HorizontalAlignmentMode','auto',... +'VerticalAlignment','bottom',... +'VerticalAlignmentMode','auto',... +'EdgeColor','none',... +'LineStyle','-',... +'LineWidth',0.5,... +'BackgroundColor','none',... +'Margin',3,... +'Clipping','off',... +'XLimInclude','on',... +'YLimInclude','on',... +'ZLimInclude','on',... +'Visible','on',... +'HandleVisibility','off',... +'ButtonDownFcn',blanks(0),... +'BusyAction','queue',... +'Interruptible','on',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... +'DeleteFcn',blanks(0),... +'Tag',blanks(0),... +'HitTest','on',... +'PickableParts','visible'); + +h4 = get(h2,'xlabel'); + +set(h4,... +'Parent',h2,... +'Units','data',... +'FontUnits','points',... +'Color',[0.15 0.15 0.15],... +'Position',[0.500000476837158 -0.283480513287831 7.105427357601e-15],... +'PositionMode','auto',... +'String',blanks(0),... +'Interpreter','tex',... +'Rotation',0,... +'RotationMode','auto',... +'FontName','CMU Serif',... +'FontSize',10.593,... +'FontAngle','normal',... +'FontWeight','normal',... +'HorizontalAlignment','center',... +'HorizontalAlignmentMode','auto',... +'VerticalAlignment','top',... +'VerticalAlignmentMode','auto',... +'EdgeColor','none',... +'LineStyle','-',... +'LineWidth',0.5,... +'BackgroundColor','none',... +'Margin',3,... +'Clipping','off',... +'XLimInclude','on',... +'YLimInclude','on',... +'ZLimInclude','on',... +'Visible','on',... +'HandleVisibility','off',... +'ButtonDownFcn',blanks(0),... +'BusyAction','queue',... +'Interruptible','on',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... +'DeleteFcn',blanks(0),... +'Tag',blanks(0),... +'HitTest','on',... +'PickableParts','visible'); + +h5 = get(h2,'ylabel'); + +set(h5,... +'Parent',h2,... +'Units','data',... +'FontUnits','points',... +'Color',[0.15 0.15 0.15],... +'Position',[-0.104158728029993 0.500000476837158 7.105427357601e-15],... +'PositionMode','auto',... +'String',blanks(0),... +'Interpreter','tex',... +'Rotation',90,... +'RotationMode','auto',... +'FontName','CMU Serif',... +'FontSize',10.593,... +'FontAngle','normal',... +'FontWeight','normal',... +'HorizontalAlignment','center',... +'HorizontalAlignmentMode','auto',... +'VerticalAlignment','bottom',... +'VerticalAlignmentMode','auto',... +'EdgeColor','none',... +'LineStyle','-',... +'LineWidth',0.5,... +'BackgroundColor','none',... +'Margin',3,... +'Clipping','off',... +'XLimInclude','on',... +'YLimInclude','on',... +'ZLimInclude','on',... +'Visible','on',... +'HandleVisibility','off',... +'ButtonDownFcn',blanks(0),... +'BusyAction','queue',... +'Interruptible','on',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... +'DeleteFcn',blanks(0),... +'Tag',blanks(0),... +'HitTest','on',... +'PickableParts','visible'); + +h6 = get(h2,'zlabel'); + +set(h6,... +'Parent',h2,... +'Units','data',... +'FontUnits','points',... +'Color',[0.15 0.15 0.15],... +'Position',[0 0 0],... +'PositionMode','auto',... +'String',blanks(0),... +'Interpreter','tex',... +'Rotation',0,... +'RotationMode','auto',... +'FontName','CMU Serif',... +'FontSize',10,... +'FontAngle','normal',... +'FontWeight','normal',... +'HorizontalAlignment','left',... +'HorizontalAlignmentMode','auto',... +'VerticalAlignment','middle',... +'VerticalAlignmentMode','auto',... +'EdgeColor','none',... +'LineStyle','-',... +'LineWidth',0.5,... +'BackgroundColor','none',... +'Margin',3,... +'Clipping','off',... +'XLimInclude','on',... +'YLimInclude','on',... +'ZLimInclude','on',... +'Visible','off',... +'HandleVisibility','off',... +'ButtonDownFcn',blanks(0),... +'BusyAction','queue',... +'Interruptible','on',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... +'DeleteFcn',blanks(0),... +'Tag',blanks(0),... +'HitTest','on',... +'PickableParts','visible'); + +appdata = []; +appdata.lastValidTag = 'axesDKFZ'; + +h7 = axes(... +'Parent',h1,... +'FontUnits',get(0,'defaultaxesFontUnits'),... +'Units',get(0,'defaultaxesUnits'),... +'CameraPosition',[0.5 0.5 9.16025403784439],... +'CameraPositionMode',get(0,'defaultaxesCameraPositionMode'),... +'CameraTarget',[0.5 0.5 0.5],... +'CameraTargetMode',get(0,'defaultaxesCameraTargetMode'),... +'CameraViewAngle',6.60861036031192,... +'CameraViewAngleMode',get(0,'defaultaxesCameraViewAngleMode'),... +'PlotBoxAspectRatio',[1 0.155367231638418 0.155367231638418],... +'PlotBoxAspectRatioMode',get(0,'defaultaxesPlotBoxAspectRatioMode'),... +'FontName','CMU Serif',... +'Colormap',[0 0 0.5625;0 0 0.625;0 0 0.6875;0 0 0.75;0 0 0.8125;0 0 0.875;0 0 0.9375;0 0 1;0 0.0625 1;0 0.125 1;0 0.1875 1;0 0.25 1;0 0.3125 1;0 0.375 1;0 0.4375 1;0 0.5 1;0 0.5625 1;0 0.625 1;0 0.6875 1;0 0.75 1;0 0.8125 1;0 0.875 1;0 0.9375 1;0 1 1;0.0625 1 1;0.125 1 0.9375;0.1875 1 0.875;0.25 1 0.8125;0.3125 1 0.75;0.375 1 0.6875;0.4375 1 0.625;0.5 1 0.5625;0.5625 1 0.5;0.625 1 0.4375;0.6875 1 0.375;0.75 1 0.3125;0.8125 1 0.25;0.875 1 0.1875;0.9375 1 0.125;1 1 0.0625;1 1 0;1 0.9375 0;1 0.875 0;1 0.8125 0;1 0.75 0;1 0.6875 0;1 0.625 0;1 0.5625 0;1 0.5 0;1 0.4375 0;1 0.375 0;1 0.3125 0;1 0.25 0;1 0.1875 0;1 0.125 0;1 0.0625 0;1 0 0;0.9375 0 0;0.875 0 0;0.8125 0 0;0.75 0 0;0.6875 0 0;0.625 0 0;0.5625 0 0],... +'XTick',[0 0.2 0.4 0.6 0.8 1],... +'XTickMode',get(0,'defaultaxesXTickMode'),... +'XTickLabel',{ '0'; '0.2'; '0.4'; '0.6'; '0.8'; '1' },... +'XTickLabelMode',get(0,'defaultaxesXTickLabelMode'),... +'YTick',[0 0.5 1],... +'YTickMode',get(0,'defaultaxesYTickMode'),... +'YTickLabel',{ '0'; '0.5'; '1' },... +'YTickLabelMode',get(0,'defaultaxesYTickLabelMode'),... +'Color',get(0,'defaultaxesColor'),... +'Position',[0.652482269503546 0.903969270166453 0.259187620889749 0.0717029449423816],... +'ActivePositionProperty','position',... +'LooseInset',[0.13 0.11 0.0950000000000001 0.0749999999999999],... +'FontSize',9.63,... +'SortMethod','childorder',... +'Tag','axesDKFZ',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +h8 = get(h7,'title'); + +set(h8,... +'Parent',h7,... +'Units','data',... +'FontUnits','points',... +'Color',[0 0 0],... +'Position',[0.500002882574911 1.04815 0.5],... +'PositionMode','auto',... +'String',blanks(0),... +'Interpreter','tex',... +'Rotation',0,... +'RotationMode','auto',... +'FontName','CMU Serif',... +'FontSize',10.593,... +'FontAngle','normal',... +'FontWeight','bold',... +'HorizontalAlignment','center',... +'HorizontalAlignmentMode','auto',... +'VerticalAlignment','bottom',... +'VerticalAlignmentMode','auto',... +'EdgeColor','none',... +'LineStyle','-',... +'LineWidth',0.5,... +'BackgroundColor','none',... +'Margin',3,... +'Clipping','off',... +'XLimInclude','on',... +'YLimInclude','on',... +'ZLimInclude','on',... +'Visible','on',... +'HandleVisibility','off',... +'ButtonDownFcn',blanks(0),... +'BusyAction','queue',... +'Interruptible','on',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... +'DeleteFcn',blanks(0),... +'Tag',blanks(0),... +'HitTest','on',... +'PickableParts','visible'); + +h9 = get(h7,'xlabel'); + +set(h9,... +'Parent',h7,... +'Units','data',... +'FontUnits','points',... +'Color',[0.15 0.15 0.15],... +'Position',[0.500000476837158 -0.396872718602964 0],... +'PositionMode','auto',... +'String',blanks(0),... +'Interpreter','tex',... +'Rotation',0,... +'RotationMode','auto',... +'FontName','CMU Serif',... +'FontSize',10.593,... +'FontAngle','normal',... +'FontWeight','normal',... +'HorizontalAlignment','center',... +'HorizontalAlignmentMode','auto',... +'VerticalAlignment','top',... +'VerticalAlignmentMode','auto',... +'EdgeColor','none',... +'LineStyle','-',... +'LineWidth',0.5,... +'BackgroundColor','none',... +'Margin',3,... +'Clipping','off',... +'XLimInclude','on',... +'YLimInclude','on',... +'ZLimInclude','on',... +'Visible','on',... +'HandleVisibility','off',... +'ButtonDownFcn',blanks(0),... +'BusyAction','queue',... +'Interruptible','on',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... +'DeleteFcn',blanks(0),... +'Tag',blanks(0),... +'HitTest','on',... +'PickableParts','visible'); + +h10 = get(h7,'ylabel'); + +set(h10,... +'Parent',h7,... +'Units','data',... +'FontUnits','points',... +'Color',[0.15 0.15 0.15],... +'Position',[-0.074146891139995 0.500000476837156 0],... +'PositionMode','auto',... +'String',blanks(0),... +'Interpreter','tex',... +'Rotation',90,... +'RotationMode','auto',... +'FontName','CMU Serif',... +'FontSize',10.593,... +'FontAngle','normal',... +'FontWeight','normal',... +'HorizontalAlignment','center',... +'HorizontalAlignmentMode','auto',... +'VerticalAlignment','bottom',... +'VerticalAlignmentMode','auto',... +'EdgeColor','none',... +'LineStyle','-',... +'LineWidth',0.5,... +'BackgroundColor','none',... +'Margin',3,... +'Clipping','off',... +'XLimInclude','on',... +'YLimInclude','on',... +'ZLimInclude','on',... +'Visible','on',... +'HandleVisibility','off',... +'ButtonDownFcn',blanks(0),... +'BusyAction','queue',... +'Interruptible','on',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... +'DeleteFcn',blanks(0),... +'Tag',blanks(0),... +'HitTest','on',... +'PickableParts','visible'); + +h11 = get(h7,'zlabel'); + +set(h11,... +'Parent',h7,... +'Units','data',... +'FontUnits','points',... +'Color',[0.15 0.15 0.15],... +'Position',[0 0 0],... +'PositionMode','auto',... +'String',blanks(0),... +'Interpreter','tex',... +'Rotation',0,... +'RotationMode','auto',... +'FontName','CMU Serif',... +'FontSize',10,... +'FontAngle','normal',... +'FontWeight','normal',... +'HorizontalAlignment','left',... +'HorizontalAlignmentMode','auto',... +'VerticalAlignment','middle',... +'VerticalAlignmentMode','auto',... +'EdgeColor','none',... +'LineStyle','-',... +'LineWidth',0.5,... +'BackgroundColor','none',... +'Margin',3,... +'Clipping','off',... +'XLimInclude','on',... +'YLimInclude','on',... +'ZLimInclude','on',... +'Visible','off',... +'HandleVisibility','off',... +'ButtonDownFcn',blanks(0),... +'BusyAction','queue',... +'Interruptible','on',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... +'DeleteFcn',blanks(0),... +'Tag',blanks(0),... +'HitTest','on',... +'PickableParts','visible'); + +appdata = []; +appdata.lastValidTag = 'uipanel1'; + +h12 = uipanel(... +'Parent',h1,... +'FontUnits',get(0,'defaultuipanelFontUnits'),... +'Units',get(0,'defaultuipanelUnits'),... +'ShadowColor',get(0,'defaultuipanelShadowColor'),... +'Title','Plan',... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Tag','uipanel1',... +'UserData',[],... +'Clipping','off',... +'Position',[0.00451321727917473 0.527528809218956 0.430689877498388 0.272727272727273],... +'FontName','Helvetica',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'txtBixelWidth'; + +h13 = uicontrol(... +'Parent',h12,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','bixel width in [mm]',... +'Style','text',... +'Position',[0.0347043701799486 0.859315589353612 0.17866323907455 0.0950570342205324],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','txtBixelWidth',... +'UserData',[],... +'FontName','Helvetica',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'editBixelWidth'; + +h14 = uicontrol(... +'Parent',h12,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','5',... +'Style','edit',... +'Position',[0.219794344473008 0.889733840304182 0.161953727506427 0.0836501901140684],... +'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... +'Callback',@(hObject,eventdata)matRadGUI('editBixelWidth_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI('editBixelWidth_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','editBixelWidth',... +'FontWeight','bold'); + +appdata = []; +appdata.lastValidTag = 'txtGantryAngle'; + +h15 = uicontrol(... +'Parent',h12,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','Gantry Angle in °',... +'Style','text',... +'Position',[0.032133676092545 0.752851711026616 0.176092544987147 0.0950570342205324],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','txtGantryAngle',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'editGantryAngle'; + +h16 = uicontrol(... +'Parent',h12,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','0',... +'Style','edit',... +'Position',[0.219794344473008 0.779467680608365 0.161953727506427 0.0836501901140684],... +'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... +'Callback',@(hObject,eventdata)matRadGUI('editGantryAngle_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI('editGantryAngle_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','editGantryAngle',... +'FontWeight','bold'); + +appdata = []; +appdata.lastValidTag = 'txtCouchAngle'; + +h17 = uicontrol(... +'Parent',h12,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','Couch Angle in °',... +'Style','text',... +'Position',[0.0347043701799486 0.64638783269962 0.173521850899743 0.0950570342205324],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','txtCouchAngle',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'editCouchAngle'; + +h18 = uicontrol(... +'Parent',h12,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','0',... +'Style','edit',... +'Position',[0.219794344473008 0.669201520912547 0.161953727506427 0.0836501901140685],... +'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... +'Callback',@(hObject,eventdata)matRadGUI('editCouchAngle_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI('editCouchAngle_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','editCouchAngle',... +'FontWeight','bold'); + +appdata = []; +appdata.lastValidTag = 'popupRadMode'; + +h19 = uicontrol(... +'Parent',h12,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String',{ 'photons'; 'protons'; 'carbon' },... +'Style','popupmenu',... +'Value',1,... +'Position',[0.219794344473008 0.52851711026616 0.161953727506427 0.114068441064639],... +'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... +'Callback',@(hObject,eventdata)matRadGUI('popupRadMode_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI('popupRadMode_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','popupRadMode',... +'FontWeight','bold'); + +appdata = []; +appdata.lastValidTag = 'txtRadMode'; + +h20 = uicontrol(... +'Parent',h12,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','Radiation Mode',... +'Style','text',... +'Position',[0.051413881748072 0.539923954372624 0.146529562982005 0.0950570342205324],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','txtRadMode',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'txtNumOfFractions'; + +h21 = uicontrol(... +'Parent',h12,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','# Fractions',... +'Style','text',... +'Position',[0.051413881748072 0.209125475285171 0.143958868894602 0.106463878326996],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','txtNumOfFractions',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'editFraction'; + +h22 = uicontrol(... +'Parent',h12,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','30',... +'Style','edit',... +'Position',[0.219794344473008 0.228136882129278 0.161953727506427 0.0836501901140684],... +'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... +'Callback',@(hObject,eventdata)matRadGUI('editFraction_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI('editFraction_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','editFraction',... +'FontWeight','bold'); + +appdata = []; +appdata.lastValidTag = 'txtIsoCenter'; + +h23 = uicontrol(... +'Parent',h12,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','IsoCenter in [mm]',... +'Style','text',... +'Position',[0.0282776349614396 0.330798479087452 0.201799485861183 0.091254752851711],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','txtIsoCenter',... +'UserData',[],... +'FontName','Helvetica',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'editIsoCenter'; + +h24 = uicontrol(... +'Parent',h12,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','0 0 0',... +'Style','edit',... +'Position',[0.219794344473008 0.338403041825095 0.161953727506427 0.0836501901140684],... +'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... +'Callback',@(hObject,eventdata)matRadGUI('editIsoCenter_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Enable','off',... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI('editIsoCenter_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','editIsoCenter',... +'FontWeight','bold'); + +appdata = []; +appdata.lastValidTag = 'checkIsoCenter'; + +h25 = uicontrol(... +'Parent',h12,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','Auto.',... +'Style','checkbox',... +'Value',1,... +'Position',[0.38560411311054 0.338403041825095 0.0809768637532133 0.091254752851711],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Callback',@(hObject,eventdata)matRadGUI('checkIsoCenter_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','checkIsoCenter',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'btnRunSequencing'; + +h26 = uicontrol(... +'Parent',h12,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','Run Sequencing',... +'Style','radiobutton',... +'Position',[0.553984575835475 0.628020880324805 0.173521850899743 0.140684410646388],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Callback',@(hObject,eventdata)matRadGUI('btnRunSequencing_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Enable','off',... +'Tag','btnRunSequencing',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'btnRunDAO'; + +h27 = uicontrol(... +'Parent',h12,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','Run Direct Aperture Optimization',... +'Style','radiobutton',... +'Position',[0.553984575835475 0.32003608945028 0.294344473007712 0.140684410646388],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Callback',@(hObject,eventdata)matRadGUI('btnRunDAO_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Enable','off',... +'Tag','btnRunDAO',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'txtSequencing'; + +h28 = uicontrol(... +'Parent',h12,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','Stratification Levels',... +'Style','text',... +'Position',[0.553984575835475 0.502545595153702 0.179948586118252 0.102661596958175],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','txtSequencing',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'editSequencingLevel'; + +h29 = uicontrol(... +'Parent',h12,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','7',... +'Style','edit',... +'Position',[0.58611825192802 0.449313655990204 0.0668380462724936 0.0836501901140685],... +'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... +'Callback',@(hObject,eventdata)matRadGUI('editSequencingLevel_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Enable','off',... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI('editSequencingLevel_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','editSequencingLevel',... +'FontWeight','bold'); + +appdata = []; +appdata.lastValidTag = 'popUpMachine'; + +h30 = uicontrol(... +'Parent',h12,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String',['Generic';' '],... +'Style','popupmenu',... +'Value',1,... +'Position',[0.219794344473008 0.418250950570342 0.161953727506427 0.114068441064639],... +'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... +'Callback',@(hObject,eventdata)matRadGUI('popUpMachine_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI('popUpMachine_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','popUpMachine',... +'FontWeight','bold'); + +appdata = []; +appdata.lastValidTag = 'txtMachine'; + +h31 = uicontrol(... +'Parent',h12,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','Machine',... +'Style','text',... +'Position',[0.0732647814910026 0.433460076045627 0.106683804627249 0.0950570342205323],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','txtMachine',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'btnSetTissue'; + +h32 = uicontrol(... +'Parent',h12,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','Set Tissue',... +'Position',[0.401028277634961 0.110266159695817 0.109254498714653 0.0874524714828897],... +'BackgroundColor',[0.8 0.8 0.8],... +'Callback',@(hObject,eventdata)matRadGUI('btnSetTissue_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Enable','off',... +'Tag','btnSetTissue',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'popMenuBioOpt'; + +h33 = uicontrol(... +'Parent',h12,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String',{ 'none'; 'const_RBExD'; 'LEMIV_effect'; 'LEMIV_RBExD' },... +'Style','popupmenu',... +'Value',1,... +'Position',[0.219794344473008 0.0760456273764259 0.165809768637532 0.11787072243346],... +'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... +'Callback',@(hObject,eventdata)matRadGUI('popMenuBioOpt_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI('popMenuBioOpt_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','popMenuBioOpt',... +'FontWeight','bold'); + +appdata = []; +appdata.lastValidTag = 'text38'; + +h34 = uicontrol(... +'Parent',h12,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','Type of optimization',... +'Style','text',... +'Position',[0.0102827763496144 0.0988593155893536 0.201799485861183 0.091254752851711],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Interruptible','off',... +'Tag','text38',... +'UserData',[],... +'FontName','Helvetica',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'radiobutton3Dconf'; + +h35 = uicontrol(... +'Parent',h12,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','3D conformal',... +'Style','radiobutton',... +'Position',[0.553224553224553 0.757869249394673 0.212121212121212 0.0847457627118644],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Callback',@(hObject,eventdata)matRadGUI('radiobutton3Dconf_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Enable','off',... +'Tag','radiobutton3Dconf',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'uipanel2'; + +h36 = uipanel(... +'Parent',h1,... +'FontUnits',get(0,'defaultuipanelFontUnits'),... +'Units',get(0,'defaultuipanelUnits'),... +'ShadowColor',get(0,'defaultuipanelShadowColor'),... +'Title',strtrim(strjoin({ 'Visualization'; ' ' })),... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Tag','uipanel2',... +'UserData',[],... +'Clipping','off',... +'Position',[0.00451321727917473 0.0460947503201024 0.430689877498388 0.203585147247119],... +'FontName','Helvetica',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'popupPlane'; + +h37 = uicontrol(... +'Parent',h36,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String',{ 'coronal'; 'sagital'; 'axial' },... +'Style','popupmenu',... +'Value',3,... +'Position',[0.465315808689303 0.582191780821918 0.113636363636364 0.143835616438356],... +'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... +'Callback',@(hObject,eventdata)matRadGUI('popupPlane_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI('popupPlane_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','popupPlane',... +'FontWeight','bold'); + +appdata = []; +appdata.lastValidTag = 'sliderSlice'; + +h38 = uicontrol(... +'Parent',h36,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String',{ 'Slider' },... +'Style','slider',... +'Position',[0.134961439588689 0.796610169491525 0.167095115681234 0.096045197740113],... +'BackgroundColor',[0.9 0.9 0.9],... +'Callback',@(hObject,eventdata)matRadGUI('sliderSlice_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'BusyAction','cancel',... +'Interruptible','off',... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI('sliderSlice_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','sliderSlice'); + +appdata = []; +appdata.lastValidTag = 'txtPlanSelection'; + +h39 = uicontrol(... +'Parent',h36,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'HorizontalAlignment','left',... +'String','Plane Selection',... +'Style','text',... +'Position',[0.34258853596203 0.589041095890411 0.11969696969697 0.116438356164384],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','txtPlanSelection',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'text9'; + +h40 = uicontrol(... +'Parent',h36,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'HorizontalAlignment','left',... +'String','Slice Selection',... +'Style','text',... +'Position',[0.00909090909090909 0.808219178082192 0.113636363636364 0.116438356164384],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','text9',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'radiobtnContour'; + +h41 = uicontrol(... +'Parent',h36,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','plot contour',... +'Style','radiobutton',... +'Value',1,... +'Position',[0.780445969125214 0.733212341197822 0.169811320754717 0.117241379310345],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Callback',@(hObject,eventdata)matRadGUI('radiobtnContour_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','radiobtnContour',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'radiobtnDose'; + +h42 = uicontrol(... +'Parent',h36,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','plot dose',... +'Style','radiobutton',... +'Value',1,... +'Position',[0.780445969125214 0.466969147005444 0.169811320754717 0.117241379310345],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Callback',@(hObject,eventdata)matRadGUI('radiobtnDose_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','radiobtnDose',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'radiobtnIsoDoseLines'; + +h43 = uicontrol(... +'Parent',h36,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','plot isolines',... +'Style','radiobutton',... +'Value',1,... +'Position',[0.780445969125214 0.600907441016334 0.150943396226415 0.117241379310345],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Callback',@(hObject,eventdata)matRadGUI('radiobtnIsoDoseLines_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','radiobtnIsoDoseLines',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'txtTypeOfPlot'; + +h44 = uicontrol(... +'Parent',h36,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'HorizontalAlignment','left',... +'String','Type of plot',... +'Style','text',... +'Position',[0.343053173241852 0.793103448275862 0.108061749571183 0.124137931034483],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','txtTypeOfPlot',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'popupTypeOfPlot'; + +h45 = uicontrol(... +'Parent',h36,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String',{ 'intensity'; 'profile' },... +'Style','popupmenu',... +'Value',1,... +'Position',[0.465315808689303 0.801369863013699 0.113636363636364 0.143835616438356],... +'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... +'Callback',@(hObject,eventdata)matRadGUI('popupTypeOfPlot_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI('popupTypeOfPlot_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','popupTypeOfPlot',... +'FontWeight','bold'); + +appdata = []; +appdata.lastValidTag = 'txtDisplayOption'; + +h46 = uicontrol(... +'Parent',h36,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'HorizontalAlignment','left',... +'String','Display option',... +'Style','text',... +'Position',[0.34258853596203 0.39041095890411 0.128787878787879 0.102739726027397],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','txtDisplayOption',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'popupDisplayOption'; + +h47 = uicontrol(... +'Parent',h36,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','Please select ... ',... +'Style','popupmenu',... +'Value',1,... +'Position',[0.465315808689303 0.36986301369863 0.196969696969697 0.136986301369863],... +'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... +'Callback',@(hObject,eventdata)matRadGUI('popupDisplayOption_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI('popupDisplayOption_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','popupDisplayOption',... +'FontWeight','bold'); + +appdata = []; +appdata.lastValidTag = 'txtBeamSelection'; + +h48 = uicontrol(... +'Parent',h36,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'HorizontalAlignment','left',... +'String','Beam Selection',... +'Style','text',... +'Position',[0.00857632933104631 0.503448275862069 0.118353344768439 0.186206896551724],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','txtBeamSelection',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'sliderBeamSelection'; + +h49 = uicontrol(... +'Parent',h36,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','SliderBeamSelection',... +'Style','slider',... +'Position',[0.134961439588689 0.542372881355932 0.167095115681234 0.096045197740113],... +'BackgroundColor',[0.9 0.9 0.9],... +'Callback',@(hObject,eventdata)matRadGUI('sliderBeamSelection_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Enable','off',... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI('sliderBeamSelection_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','sliderBeamSelection'); + +appdata = []; +appdata.lastValidTag = 'btnProfileType'; + +h50 = uicontrol(... +'Parent',h36,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','lateral',... +'Position',[0.658025928757913 0.794520547945205 0.0863636363636364 0.157534246575343],... +'BackgroundColor',[0.8 0.8 0.8],... +'Callback',@(hObject,eventdata)matRadGUI('btnProfileType_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Enable','off',... +'Tag','btnProfileType',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'text16'; + +h51 = uicontrol(... +'Parent',h36,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','GoTo',... +'Style','text',... +'Position',[0.604795511376553 0.801369863013698 0.0454545454545454 0.123287671232877],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','text16',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'btnDVH'; + +h52 = uicontrol(... +'Parent',h36,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','Show DVH/QI',... +'Position',[0.51413881748072 0.0677966101694915 0.123393316195373 0.129943502824859],... +'BackgroundColor',[0.8 0.8 0.8],... +'Callback',@(hObject,eventdata)matRadGUI('btnDVH_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Enable','off',... +'Tag','btnDVH',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'radiobtnIsoDoseLinesLabels'; + +h53 = uicontrol(... +'Parent',h36,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','plot isolines labels',... +'Style','radiobutton',... +'Position',[0.780445969125214 0.343557168784029 0.202401372212693 0.117241379310345],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Callback',@(hObject,eventdata)matRadGUI('radiobtnIsoDoseLinesLabels_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','radiobtnIsoDoseLinesLabels',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'textOffset'; + +h54 = uicontrol(... +'Parent',h36,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'HorizontalAlignment','left',... +'String','Offset',... +'Style','text',... +'Position',[0.00909090909090909 0.287104393008975 0.118181818181818 0.123287671232877],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','textOffset',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'sliderOffset'; + +h55 = uicontrol(... +'Parent',h36,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','SliderOffset',... +'Style','slider',... +'Position',[0.134961439588689 0.271186440677966 0.167095115681234 0.096045197740113],... +'BackgroundColor',[0.9 0.9 0.9],... +'Callback',@(hObject,eventdata)matRadGUI('sliderOffset_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Enable','off',... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI('sliderOffset_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','sliderOffset'); + +appdata = []; +appdata.lastValidTag = 'radioBtnIsoCenter'; + +h56 = uicontrol(... +'Parent',h36,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','plot iso center',... +'Style','radiobutton',... +'Value',1,... +'Position',[0.780445969125214 0.205989110707804 0.169811320754717 0.117241379310345],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Callback',@(hObject,eventdata)matRadGUI('radioBtnIsoCenter_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','radioBtnIsoCenter',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'btn3Dview'; + +h57 = uicontrol(... +'Parent',h36,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','Open 3D-View',... +'Position',[0.595848595848596 0.578947368421053 0.148962148962149 0.157894736842105],... +'BackgroundColor',[0.8 0.8 0.8],... +'Callback',@(hObject,eventdata)matRadGUI('btn3Dview_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Enable','off',... +'Tag','btn3Dview',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'radiobtnCT'; + +h58 = uicontrol(... +'Parent',h36,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','plot CT',... +'Style','radiobutton',... +'Value',1,... +'Position',[0.780445969125214 0.864791288566243 0.169811320754717 0.117241379310345],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Callback',@(hObject,eventdata)matRadGUI('radiobtnCT_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','radiobtnCT',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'radiobtnPlan'; + +h59 = uicontrol(... +'Parent',h36,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','visualize plan / beams',... +'Style','radiobutton',... +'Value',1,... +'Position',[0.78021978021978 0.0736842105263158 0.2002442002442 0.115789473684211],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Callback',@(hObject,eventdata)matRadGUI('radiobtnPlan_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','radiobtnPlan',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'uitoolbar1'; + +h60 = uitoolbar(... +'Parent',h1,... +'Tag','uitoolbar1',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.toolid = 'Standard.FileOpen'; +appdata.CallbackInUse = struct(... + 'ClickedCallback', 'matRadGUI(''toolbarLoad_ClickedCallback'',gcbo,[],guidata(gcbo))'); +appdata.lastValidTag = 'toolbarLoad'; + +h61 = uipushtool(... +'Parent',h60,... +'Children',[],... +'BusyAction','cancel',... +'Interruptible','off',... +'Tag','toolbarLoad',... +'CData',mat{2},... +'ClickedCallback',@(hObject,eventdata)matRadGUI('toolbarLoad_ClickedCallback',hObject,eventdata,guidata(hObject)),... +'Separator','on',... +'TooltipString','Open File',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.toolid = 'Standard.SaveFigure'; +appdata.CallbackInUse = struct(... + 'ClickedCallback', 'matRadGUI(''toolbarSave_ClickedCallback'',gcbo,[],guidata(gcbo))'); +appdata.lastValidTag = 'toolbarSave'; + +h62 = uipushtool(... +'Parent',h60,... +'Children',[],... +'BusyAction','cancel',... +'Interruptible','off',... +'Tag','toolbarSave',... +'CData',mat{3},... +'ClickedCallback',@(hObject,eventdata)matRadGUI('toolbarSave_ClickedCallback',hObject,eventdata,guidata(hObject)),... +'Separator','on',... +'TooltipString','Save Figure',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.toolid = []; +appdata.lastValidTag = 'uipushtool_screenshot'; + +h63 = uipushtool(... +'Parent',h60,... +'Children',[],... +'Tag','uipushtool_screenshot',... +'CData',mat{4},... +'ClickedCallback',@(hObject,eventdata)matRadGUI('uipushtool_screenshot_ClickedCallback',hObject,eventdata,guidata(hObject)),... +'TooltipString','Take a screenshot of the current dose or profile plot',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.toolid = 'Exploration.ZoomIn'; +appdata.CallbackInUse = struct(... + 'ClickedCallback', '%default'); +appdata.lastValidTag = 'toolbarZoomIn'; + +h64 = uitoggletool(... +'Parent',h60,... +'Children',[],... +'Tag','toolbarZoomIn',... +'CData',mat{5},... +'ClickedCallback','%default',... +'Separator','on',... +'TooltipString','Zoom In',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.toolid = 'Exploration.ZoomOut'; +appdata.CallbackInUse = struct(... + 'ClickedCallback', '%default'); +appdata.lastValidTag = 'toolbarZoomOut'; + +h65 = uitoggletool(... +'Parent',h60,... +'Children',[],... +'Tag','toolbarZoomOut',... +'CData',mat{6},... +'ClickedCallback','%default',... +'Separator','on',... +'TooltipString','Zoom Out',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.toolid = 'Exploration.Pan'; +appdata.CallbackInUse = struct(... + 'ClickedCallback', '%default'); +appdata.lastValidTag = 'toolbarPan'; + +h66 = uitoggletool(... +'Parent',h60,... +'Children',[],... +'Tag','toolbarPan',... +'CData',mat{7},... +'ClickedCallback','%default',... +'Separator','on',... +'TooltipString','Pan',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.toolid = 'Exploration.DataCursor'; +appdata.CallbackInUse = struct(... + 'ClickedCallback', '%default'); +appdata.lastValidTag = 'toolbarCursor'; + +h67 = uitoggletool(... +'Parent',h60,... +'Children',[],... +'Tag','toolbarCursor',... +'CData',mat{8},... +'ClickedCallback','%default',... +'Separator','on',... +'TooltipString','Data Cursor',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.toolid = 'Annotation.InsertLegend'; +appdata.CallbackInUse = struct(... + 'ClickedCallback', '%default'); +appdata.lastValidTag = 'toolbarLegend'; + +h68 = uitoggletool(... +'Parent',h60,... +'Children',[],... +'Tag','toolbarLegend',... +'CData',mat{9},... +'ClickedCallback','%default',... +'Separator','on',... +'TooltipString','Insert Legend',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.toolid = 'Annotation.InsertColorbar'; +appdata.CallbackInUse = struct(... + 'ClickedCallback', 'matRadGUI(''uitoggletool8_ClickedCallback'',gcbo,[],guidata(gcbo))'); +appdata.lastValidTag = 'uitoggletool8'; + +h69 = uitoggletool(... +'Parent',h60,... +'Children',[],... +'Tag','uitoggletool8',... +'CData',mat{10},... +'ClickedCallback',@(hObject,eventdata)matRadGUI('uitoggletool8_ClickedCallback',hObject,eventdata,guidata(hObject)),... +'Separator','on',... +'TooltipString','Insert Colorbar',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'uipanel3'; + +h70 = uipanel(... +'Parent',h1,... +'FontUnits',get(0,'defaultuipanelFontUnits'),... +'Units',get(0,'defaultuipanelUnits'),... +'ShadowColor',get(0,'defaultuipanelShadowColor'),... +'Title',strtrim(strjoin({ 'Objectives & constraints'; ' '; ' ' })),... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Tag','uipanel3',... +'UserData',[],... +'Clipping','off',... +'Position',[0.00451321727917473 0.257362355953905 0.430689877498388 0.259923175416133],... +'FontName','Helvetica',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'uipanel4'; + +h71 = uipanel(... +'Parent',h1,... +'FontUnits',get(0,'defaultuipanelFontUnits'),... +'Units',get(0,'defaultuipanelUnits'),... +'ShadowColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Title','Workflow',... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Tag','uipanel4',... +'UserData',[],... +'Clipping','off',... +'Position',[0.00451321727917473 0.810499359795134 0.430045132172792 0.170294494238156],... +'FontName','Helvetica',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'text13'; + +h72 = uicontrol(... +'Parent',h71,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','Status:',... +'Style','text',... +'Position',[0.318250377073907 0.107438016528926 0.120663650075415 0.12396694214876],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','text13',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'txtInfo'; + +h73 = uicontrol(... +'Parent',h71,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','no data loaded',... +'Style','text',... +'Position',[0.414781297134238 0.0247933884297521 0.371040723981901 0.214876033057851],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','txtInfo',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'btnLoadMat'; + +h74 = uicontrol(... +'Parent',h71,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','Load *.mat data',... +'Position',[0.151866151866152 0.810126582278481 0.178893178893179 0.145569620253165],... +'BackgroundColor',[0.8 0.8 0.8],... +'Callback',@(hObject,eventdata)matRadGUI('btnLoadMat_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','btnLoadMat',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'btnCalcDose'; + +h75 = uicontrol(... +'Parent',h71,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','Calc. influence Mx',... +'Position',[0.35006435006435 0.810126582278481 0.178893178893179 0.145569620253165],... +'BackgroundColor',[0.8 0.8 0.8],... +'Callback',@(hObject,eventdata)matRadGUI('btnCalcDose_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','btnCalcDose',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'btnOptimize'; + +h76 = uicontrol(... +'Parent',h71,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','Optimize',... +'Position',[0.544401544401541 0.810126582278481 0.178893178893179 0.145569620253165],... +'BackgroundColor',[0.8 0.8 0.8],... +'Callback',@(hObject,eventdata)matRadGUI('btnOptimize_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','btnOptimize',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'btnLoadDicom'; + +h77 = uicontrol(... +'Parent',h71,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','Load DICOM',... +'Position',[0.151866151866152 0.60126582278481 0.177606177606178 0.145569620253165],... +'BackgroundColor',[0.8 0.8 0.8],... +'Callback',@(hObject,eventdata)matRadGUI('btnLoadDicom_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','btnLoadDicom',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'btnRefresh'; + +h78 = uicontrol(... +'Parent',h71,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','Refresh',... +'Position',[0.0154440154440154 0.810126582278481 0.0849420849420849 0.145569620253165],... +'BackgroundColor',[0.8 0.8 0.8],... +'Callback',@(hObject,eventdata)matRadGUI('btnRefresh_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','btnRefresh',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'pushbutton_recalc'; + +h79 = uicontrol(... +'Parent',h71,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','Recalc',... +'Position',[0.543114543114543 0.60126582278481 0.178893178893179 0.145569620253165],... +'BackgroundColor',[0.8 0.8 0.8],... +'Callback',@(hObject,eventdata)matRadGUI('pushbutton_recalc_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','pushbutton_recalc',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'btnSaveToGUI'; + +h80 = uicontrol(... +'Parent',h71,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','Save to GUI',... +'Position',[0.738738738738737 0.810126582278481 0.178893178893179 0.145569620253165],... +'BackgroundColor',[0.8 0.8 0.8],... +'Callback',@(hObject,eventdata)matRadGUI('btnSaveToGUI_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','btnSaveToGUI',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'btn_export'; + +h81 = uicontrol(... +'Parent',h71,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','Export',... +'Position',[0.74002574002574 0.60126582278481 0.178893178893179 0.145569620253165],... +'BackgroundColor',[0.8 0.8 0.8],... +'Callback',@(hObject,eventdata)matRadGUI('btn_export_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','btn_export',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'importDoseButton'; + +h82 = uicontrol(... +'Parent',h71,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','Import Dose',... +'Position',[0.738738738738738 0.392405063291139 0.178893178893179 0.145569620253165],... +'BackgroundColor',[0.8 0.8 0.8],... +'Callback',@(hObject,eventdata)matRadGUI('importDoseButton_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','importDoseButton',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'pushbutton_importFromBinary'; + +h83 = uicontrol(... +'Parent',h71,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','Import from Binary',... +'Position',[0.151866151866152 0.392405063291139 0.177606177606178 0.145569620253165],... +'BackgroundColor',[0.8 0.8 0.8],... +'Callback',@(hObject,eventdata)matRadGUI('pushbutton_importFromBinary_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'TooltipString','Imports a patient data set from binary datafiles describing CT and segmentations',... +'Tag','pushbutton_importFromBinary',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'text24'; + +h84 = uicontrol(... +'Parent',h1,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','min value:',... +'Style','text',... +'Position',[0.899701069855255 0.87145643693108 0.0420862177470107 0.0253576072821847],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','text24',... +'FontSize',10,... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'btnSetIsoDoseLevels'; + +h85 = uicontrol(... +'Parent',h1,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','Set IsoDose Levels',... +'Position',[0.910792951541851 0.814995131450828 0.071035242290749 0.0223953261927945],... +'BackgroundColor',[0.8 0.8 0.8],... +'Callback',@(hObject,eventdata)matRadGUI('btnSetIsoDoseLevels_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','btnSetIsoDoseLevels',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'uipanel10'; + +h86 = uipanel(... +'Parent',h1,... +'FontUnits',get(0,'defaultuipanelFontUnits'),... +'Units',get(0,'defaultuipanelUnits'),... +'Title','Structure Visibilty',... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Tag','uipanel10',... +'Clipping','off',... +'Position',[0.896397105097545 0.175812743823147 0.0991189427312775 0.304291287386216],... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'legendTable'; + +h87 = uicontrol(... +'Parent',h86,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'Style','listbox',... +'Value',1,... +'Position',[0.02 0.01 0.97 0.98],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Callback',@(hObject,eventdata)matRadGUI('legendTable_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI('legendTable_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','legendTable'); + +appdata = []; +appdata.lastValidTag = 'uipanel11'; + +h88 = uipanel(... +'Parent',h1,... +'FontUnits',get(0,'defaultuipanelFontUnits'),... +'Units',get(0,'defaultuipanelUnits'),... +'Title','Viewing',... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Tag','uipanel11',... +'Clipping','off',... +'Position',[0.437782076079949 0.0460947503201025 0.451321727917473 0.842509603072983],... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'axesFig'; + +h89 = axes(... +'Parent',h88,... +'FontUnits',get(0,'defaultaxesFontUnits'),... +'Units',get(0,'defaultaxesUnits'),... +'CameraPosition',[0.5 0.5 9.16025403784439],... +'CameraPositionMode',get(0,'defaultaxesCameraPositionMode'),... +'CameraTarget',[0.5 0.5 0.5],... +'CameraTargetMode',get(0,'defaultaxesCameraTargetMode'),... +'CameraViewAngle',6.60861036031192,... +'CameraViewAngleMode',get(0,'defaultaxesCameraViewAngleMode'),... +'PlotBoxAspectRatio',[0.946917808219178 1 0.946917808219178],... +'PlotBoxAspectRatioMode',get(0,'defaultaxesPlotBoxAspectRatioMode'),... +'FontName','CMU Serif',... +'Colormap',[0 0 0.5625;0 0 0.625;0 0 0.6875;0 0 0.75;0 0 0.8125;0 0 0.875;0 0 0.9375;0 0 1;0 0.0625 1;0 0.125 1;0 0.1875 1;0 0.25 1;0 0.3125 1;0 0.375 1;0 0.4375 1;0 0.5 1;0 0.5625 1;0 0.625 1;0 0.6875 1;0 0.75 1;0 0.8125 1;0 0.875 1;0 0.9375 1;0 1 1;0.0625 1 1;0.125 1 0.9375;0.1875 1 0.875;0.25 1 0.8125;0.3125 1 0.75;0.375 1 0.6875;0.4375 1 0.625;0.5 1 0.5625;0.5625 1 0.5;0.625 1 0.4375;0.6875 1 0.375;0.75 1 0.3125;0.8125 1 0.25;0.875 1 0.1875;0.9375 1 0.125;1 1 0.0625;1 1 0;1 0.9375 0;1 0.875 0;1 0.8125 0;1 0.75 0;1 0.6875 0;1 0.625 0;1 0.5625 0;1 0.5 0;1 0.4375 0;1 0.375 0;1 0.3125 0;1 0.25 0;1 0.1875 0;1 0.125 0;1 0.0625 0;1 0 0;0.9375 0 0;0.875 0 0;0.8125 0 0;0.75 0 0;0.6875 0 0;0.625 0 0;0.5625 0 0],... +'GridLineStyle',get(0,'defaultaxesGridLineStyle'),... +'XTick',[0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1],... +'XTickMode',get(0,'defaultaxesXTickMode'),... +'XTickLabel',{ '0'; '0.1'; '0.2'; '0.3'; '0.4'; '0.5'; '0.6'; '0.7'; '0.8'; '0.9'; '1' },... +'XTickLabelMode',get(0,'defaultaxesXTickLabelMode'),... +'YTick',[0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1],... +'YTickMode',get(0,'defaultaxesYTickMode'),... +'YTickLabel',{ '0'; '0.1'; '0.2'; '0.3'; '0.4'; '0.5'; '0.6'; '0.7'; '0.8'; '0.9'; '1' },... +'YTickLabelMode',get(0,'defaultaxesYTickLabelMode'),... +'Color',get(0,'defaultaxesColor'),... +'Position',[0.0718390804597701 0.0354391371340524 0.902298850574712 0.929121725731895],... +'ActivePositionProperty','position',... +'LooseInset',[0.199881557553276 0.118695547917832 0.146067292058163 0.0809287826712493],... +'FontSize',9.63,... +'SortMethod','childorder',... +'ButtonDownFcn',@(hObject,eventdata)matRadGUI('axesFig_ButtonDownFcn',hObject,eventdata,guidata(hObject)),... +'Tag','axesFig',... +'UserData',[],... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +h90 = get(h89,'title'); + +set(h90,... +'Parent',h89,... +'Units','data',... +'FontUnits','points',... +'Color',[0 0 0],... +'Position',[0.500000554441759 1.00453467465753 0.5],... +'PositionMode','auto',... +'String',blanks(0),... +'Interpreter','tex',... +'Rotation',0,... +'RotationMode','auto',... +'FontName','Helvetica',... +'FontSize',10.593,... +'FontAngle','normal',... +'FontWeight','normal',... +'HorizontalAlignment','center',... +'HorizontalAlignmentMode','auto',... +'VerticalAlignment','bottom',... +'VerticalAlignmentMode','auto',... +'EdgeColor','none',... +'LineStyle','-',... +'LineWidth',0.5,... +'BackgroundColor','none',... +'Margin',2,... +'Clipping','off',... +'XLimInclude','on',... +'YLimInclude','on',... +'ZLimInclude','on',... +'Visible','on',... +'HandleVisibility','off',... +'ButtonDownFcn',blanks(0),... +'BusyAction','queue',... +'Interruptible','on',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... +'DeleteFcn',blanks(0),... +'Tag',blanks(0),... +'HitTest','on',... +'PickableParts','visible'); + +h91 = get(h89,'xlabel'); + +set(h91,... +'Parent',h89,... +'Units','data',... +'FontUnits','points',... +'Color',[0.15 0.15 0.15],... +'Position',[0.500000476837158 -0.0373767115122652 0],... +'PositionMode','auto',... +'String',blanks(0),... +'Interpreter','tex',... +'Rotation',0,... +'RotationMode','auto',... +'FontName','CMU Serif',... +'FontSize',10.593,... +'FontAngle','normal',... +'FontWeight','normal',... +'HorizontalAlignment','center',... +'HorizontalAlignmentMode','auto',... +'VerticalAlignment','top',... +'VerticalAlignmentMode','auto',... +'EdgeColor','none',... +'LineStyle','-',... +'LineWidth',0.5,... +'BackgroundColor','none',... +'Margin',3,... +'Clipping','off',... +'XLimInclude','on',... +'YLimInclude','on',... +'ZLimInclude','on',... +'Visible','on',... +'HandleVisibility','off',... +'ButtonDownFcn',blanks(0),... +'BusyAction','queue',... +'Interruptible','on',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... +'DeleteFcn',blanks(0),... +'Tag',blanks(0),... +'HitTest','on',... +'PickableParts','visible'); + +h92 = get(h89,'ylabel'); + +set(h92,... +'Parent',h89,... +'Units','data',... +'FontUnits','points',... +'Color',[0.15 0.15 0.15],... +'Position',[-0.0474647368237942 0.500000476837158 0],... +'PositionMode','auto',... +'String',blanks(0),... +'Interpreter','tex',... +'Rotation',90,... +'RotationMode','auto',... +'FontName','CMU Serif',... +'FontSize',10.593,... +'FontAngle','normal',... +'FontWeight','normal',... +'HorizontalAlignment','center',... +'HorizontalAlignmentMode','auto',... +'VerticalAlignment','bottom',... +'VerticalAlignmentMode','auto',... +'EdgeColor','none',... +'LineStyle','-',... +'LineWidth',0.5,... +'BackgroundColor','none',... +'Margin',3,... +'Clipping','off',... +'XLimInclude','on',... +'YLimInclude','on',... +'ZLimInclude','on',... +'Visible','on',... +'HandleVisibility','off',... +'ButtonDownFcn',blanks(0),... +'BusyAction','queue',... +'Interruptible','on',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... +'DeleteFcn',blanks(0),... +'Tag',blanks(0),... +'HitTest','on',... +'PickableParts','visible'); + +h93 = get(h89,'zlabel'); + +set(h93,... +'Parent',h89,... +'Units','data',... +'FontUnits','points',... +'Color',[0.15 0.15 0.15],... +'Position',[0 0 0],... +'PositionMode','auto',... +'String',blanks(0),... +'Interpreter','tex',... +'Rotation',0,... +'RotationMode','auto',... +'FontName','CMU Serif',... +'FontSize',10,... +'FontAngle','normal',... +'FontWeight','normal',... +'HorizontalAlignment','left',... +'HorizontalAlignmentMode','auto',... +'VerticalAlignment','middle',... +'VerticalAlignmentMode','auto',... +'EdgeColor','none',... +'LineStyle','-',... +'LineWidth',0.5,... +'BackgroundColor','none',... +'Margin',3,... +'Clipping','off',... +'XLimInclude','on',... +'YLimInclude','on',... +'ZLimInclude','on',... +'Visible','off',... +'HandleVisibility','off',... +'ButtonDownFcn',blanks(0),... +'BusyAction','queue',... +'Interruptible','on',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... +'DeleteFcn',blanks(0),... +'Tag',blanks(0),... +'HitTest','on',... +'PickableParts','visible'); + +appdata = []; +appdata.lastValidTag = 'uipanel12'; + +h94 = uipanel(... +'Parent',h1,... +'FontUnits',get(0,'defaultuipanelFontUnits'),... +'Units',get(0,'defaultuipanelUnits'),... +'Title','Info',... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Tag','uipanel12',... +'Clipping','off',... +'Position',[0.896276240708709 0.0448143405889885 0.0991189427312775 0.12932138284251],... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'btnAbout'; + +h95 = uicontrol(... +'Parent',h94,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','About',... +'Position',[0.238095238095238 0.134831460674157 0.563492063492063 0.280898876404494],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Callback',@(hObject,eventdata)matRadGUI('btnAbout_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','btnAbout',... +'FontSize',7,... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'text15'; + +h96 = uicontrol(... +'Parent',h94,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','v3.0.0',... +'Style','text',... +'Position',[0.227106227106227 0.752808988764045 0.523809523809524 0.191011235955056],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','text15',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'text31'; + +h97 = uicontrol(... +'Parent',h94,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','github.com/e0404/matRad',... +'Style','text',... +'Position',[0.0384615384615385 0.528089887640449 0.942307692307693 0.168539325842697],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','text31',... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'uipanel_colormapOptions'; + +h98 = uipanel(... +'Parent',h1,... +'FontUnits',get(0,'defaultuipanelFontUnits'),... +'Units',get(0,'defaultuipanelUnits'),... +'Title','Viewer Options',... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Tag','uipanel_colormapOptions',... +'Clipping','off',... +'Position',[0.896397105097545 0.484330299089727 0.0991189427312775 0.318660598179457],... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'text_windowCenter'; + +h99 = uicontrol(... +'Parent',h98,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'HorizontalAlignment','left',... +'String','Window Center:',... +'Style','text',... +'Position',[0.0466666666666666 0.682461750109027 0.673333333333333 0.0699999999999998],... +'BackgroundColor',get(0,'defaultuicontrolBackgroundColor'),... +'Children',[],... +'Tag','text_windowCenter',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'textDoseOpacity'; + +h100 = uicontrol(... +'Parent',h98,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'HorizontalAlignment','left',... +'String','Dose opacity:',... +'Style','text',... +'Position',[0.0466666666666667 0.0706370831711431 0.847328244274809 0.0714285714285714],... +'BackgroundColor',get(0,'defaultuicontrolBackgroundColor'),... +'Children',[],... +'Tag','textDoseOpacity',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'popupmenu_chooseColorData'; + +h101 = uicontrol(... +'Parent',h98,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String',{ 'None'; 'CT (ED)'; 'Dose' },... +'Style','popupmenu',... +'Value',1,... +'Position',[0.0486486486486487 0.899328859060403 0.940540540540541 0.11744966442953],... +'BackgroundColor',[1 1 1],... +'Callback',@(hObject,eventdata)matRadGUI('popupmenu_chooseColorData_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI('popupmenu_chooseColorData_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','popupmenu_chooseColorData'); + +appdata = []; +appdata.lastValidTag = 'slider_windowCenter'; + +h102 = uicontrol(... +'Parent',h98,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'SliderStep',[0.01 0.05],... +'String','slider',... +'Style','slider',... +'Value',0.5,... +'Position',[0.0432432432432432 0.63758389261745 0.697297297297297 0.0536912751677853],... +'BackgroundColor',[0.9 0.9 0.9],... +'Callback',@(hObject,eventdata)matRadGUI('slider_windowCenter_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI('slider_windowCenter_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','slider_windowCenter'); + +appdata = []; +appdata.lastValidTag = 'text_windowWidth'; + +h103 = uicontrol(... +'Parent',h98,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'HorizontalAlignment','left',... +'String','Window Width:',... +'Style','text',... +'Position',[0.0466666666666667 0.545761302394105 0.673333333333333 0.0700000000000001],... +'BackgroundColor',get(0,'defaultuicontrolBackgroundColor'),... +'Children',[],... +'Tag','text_windowWidth',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'popupmenu_chooseColormap'; + +h104 = uicontrol(... +'Parent',h98,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','Choose Colormap...',... +'Style','popupmenu',... +'Value',1,... +'Position',[0.0362903225806452 0.278843516266481 0.939516129032258 0.0844686648501362],... +'BackgroundColor',[1 1 1],... +'Callback',@(hObject,eventdata)matRadGUI('popupmenu_chooseColormap_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI('popupmenu_chooseColormap_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','popupmenu_chooseColormap'); + +appdata = []; +appdata.lastValidTag = 'text_windowRange'; + +h105 = uicontrol(... +'Parent',h98,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'HorizontalAlignment','left',... +'String','Range:',... +'Style','text',... +'Position',[0.0403225806451613 0.387807911050966 0.274193548387097 0.0708446866485015],... +'BackgroundColor',get(0,'defaultuicontrolBackgroundColor'),... +'Children',[],... +'Tag','text_windowRange',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'edit_windowRange'; + +h106 = uicontrol(... +'Parent',h98,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','0 1',... +'Style','edit',... +'Position',[0.323863636363636 0.399846781328902 0.653409090909091 0.0707395498392283],... +'BackgroundColor',[1 1 1],... +'Callback',@(hObject,eventdata)matRadGUI('edit_windowRange_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI('edit_windowRange_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','edit_windowRange'); + +appdata = []; +appdata.lastValidTag = 'edit_windowCenter'; + +h107 = uicontrol(... +'Parent',h98,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','0.5',... +'Style','edit',... +'Value',1,... +'Position',[0.767567567567568 0.63758389261745 0.205405405405405 0.0704697986577181],... +'BackgroundColor',[1 1 1],... +'Callback',@(hObject,eventdata)matRadGUI('edit_windowCenter_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI('edit_windowCenter_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','edit_windowCenter'); + +appdata = []; +appdata.lastValidTag = 'edit_windowWidth'; + +h108 = uicontrol(... +'Parent',h98,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','1.0',... +'Style','edit',... +'Position',[0.772727272727273 0.518256759964609 0.204545454545455 0.0707395498392284],... +'BackgroundColor',[1 1 1],... +'Callback',@(hObject,eventdata)matRadGUI('edit_windowWidth_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI('edit_windowWidth_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','edit_windowWidth'); + +appdata = []; +appdata.lastValidTag = 'sliderOpacity'; + +h109 = uicontrol(... +'Parent',h98,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'SliderStep',[0.01 0.05],... +'String','slider',... +'Style','slider',... +'Value',0.6,... +'Position',[0.147727272727273 0.0257234726688103 0.75 0.0546623794212219],... +'BackgroundColor',[0.9 0.9 0.9],... +'Callback',@(hObject,eventdata)matRadGUI('sliderOpacity_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI('sliderOpacity_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','sliderOpacity'); + +appdata = []; +appdata.lastValidTag = 'txtDoseOpacity0Indicator'; + +h110 = uicontrol(... +'Parent',h98,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'HorizontalAlignment','left',... +'String','0',... +'Style','text',... +'Position',[0.0466666666666666 0.00599285798906697 0.0810810810810811 0.072463768115942],... +'BackgroundColor',get(0,'defaultuicontrolBackgroundColor'),... +'Children',[],... +'Tag','txtDoseOpacity0Indicator',... +'UserData',[],... +'FontName','Helvetica',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'txtDoseOpacity1Indicator'; + +h111 = uicontrol(... +'Parent',h98,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'HorizontalAlignment','right',... +'String','1',... +'Style','text',... +'Position',[0.8963482566536 0.00864864051690258 0.0810810810810811 0.072463768115942],... +'BackgroundColor',get(0,'defaultuicontrolBackgroundColor'),... +'Children',[],... +'Tag','txtDoseOpacity1Indicator',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'text_windowPreset'; + +h112 = uicontrol(... +'Parent',h98,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'HorizontalAlignment','left',... +'String','Window Presets N/A',... +'Style','text',... +'Position',[0.0540540540540541 0.842281879194631 0.697297297297297 0.0704697986577181],... +'BackgroundColor',get(0,'defaultuicontrolBackgroundColor'),... +'Children',[],... +'Tag','text_windowPreset',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'popupmenu_windowPreset'; + +h113 = uicontrol(... +'Parent',h98,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String',{ 'Custom'; 'Full'; 'Abd/Med'; 'Head'; 'Liver'; 'Lung'; 'Spine'; 'Vrt/Bone' },... +'Style','popupmenu',... +'Value',1,... +'Position',[0.0486486486486487 0.73489932885906 0.940540540540541 0.11744966442953],... +'BackgroundColor',[1 1 1],... +'Callback',@(hObject,eventdata)matRadGUI('popupmenu_windowPreset_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Visible','off',... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI('popupmenu_windowPreset_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','popupmenu_windowPreset'); + +appdata = []; +appdata.lastValidTag = 'slider_windowWidth'; + +h114 = uicontrol(... +'Parent',h98,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'SliderStep',[0.01 0.05],... +'String','slider',... +'Style','slider',... +'Value',1,... +'Position',[0.0454545454545455 0.51140507995425 0.698863636363636 0.0546623794212219],... +'BackgroundColor',[0.9 0.9 0.9],... +'Callback',@(hObject,eventdata)matRadGUI('slider_windowWidth_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI('slider_windowWidth_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... +'Tag','slider_windowWidth'); + +appdata = []; +appdata.lastValidTag = 'checkbox_lockColormap'; + +h115 = uicontrol(... +'Parent',h98,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','Lock Settings',... +'Style','checkbox',... +'Position',[0.0486486486486487 0.151006711409396 0.940540540540541 0.0838926174496644],... +'BackgroundColor',[0.502 0.502 0.502],... +'Callback',@(hObject,eventdata)matRadGUI('checkbox_lockColormap_Callback',hObject,eventdata,guidata(hObject)),... +'Children',[],... +'Tag','checkbox_lockColormap',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'text39'; + +h116 = uicontrol(... +'Parent',h1,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','max value:',... +'Style','text',... +'Position',[0.901903713027061 0.85370611183355 0.0420862177470107 0.0245123537061118],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','text39',... +'FontSize',10,... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'txtMinVal'; + +h117 = uicontrol(... +'Parent',h1,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','-',... +'Style','text',... +'Position',[0.955789804908748 0.879908972691808 0.0271397105097546 0.0160598179453836],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','txtMinVal',... +'FontSize',10,... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + +appdata = []; +appdata.lastValidTag = 'txtMaxVal'; + +h118 = uicontrol(... +'Parent',h1,... +'Units','normalized',... +'FontUnits',get(0,'defaultuicontrolFontUnits'),... +'String','-',... +'Style','text',... +'Position',[0.955789804908748 0.863003901170351 0.0271397105097546 0.0177503250975293],... +'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... +'Children',[],... +'Tag','txtMaxVal',... +'FontSize',10,... +'FontWeight','bold',... +'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); + + +hsingleton = h1; + + +% --- Set application data first then calling the CreateFcn. +function local_CreateFcn(hObject, eventdata, createfcn, appdata) + +if ~isempty(appdata) + names = fieldnames(appdata); + for i=1:length(names) + name = char(names(i)); + setappdata(hObject, name, getfield(appdata,name)); + end +end + +if ~isempty(createfcn) + if isa(createfcn,'function_handle') + createfcn(hObject, eventdata); + else + eval(createfcn); + end +end + + diff --git a/gui/matRadGUI_gui_mainFcn.m b/gui/matRadGUI_gui_mainFcn.m new file mode 100644 index 000000000..b2f4f3a51 --- /dev/null +++ b/gui/matRadGUI_gui_mainFcn.m @@ -0,0 +1,291 @@ +% --- Handles default GUIDE GUI creation and callback dispatch +function varargout = matRadGUI_gui_mainFcn(gui_State, varargin) + +gui_StateFields = {'gui_Name' + 'gui_Singleton' + 'gui_OpeningFcn' + 'gui_OutputFcn' + 'gui_LayoutFcn' + 'gui_Callback'}; +gui_Mfile = ''; +for i=1:length(gui_StateFields) + if ~isfield(gui_State, gui_StateFields{i}) + error(message('MATLAB:guide:StateFieldNotFound', gui_StateFields{ i }, gui_Mfile)); + elseif isequal(gui_StateFields{i}, 'gui_Name') + gui_Mfile = [gui_State.(gui_StateFields{i}), '.m']; + end +end + +numargin = length(varargin); + +if numargin == 0 + % MATRADGUI + % create the GUI only if we are not in the process of loading it + % already + gui_Create = true; +elseif local_isInvokeActiveXCallback(gui_State, varargin{:}) + % MATRADGUI(ACTIVEX,...) + vin{1} = gui_State.gui_Name; + vin{2} = [get(varargin{1}.Peer, 'Tag'), '_', varargin{end}]; + vin{3} = varargin{1}; + vin{4} = varargin{end-1}; + vin{5} = guidata(varargin{1}.Peer); + feval(vin{:}); + return; +elseif local_isInvokeHGCallback(gui_State, varargin{:}) + % MATRADGUI('CALLBACK',hObject,eventData,handles,...) + gui_Create = false; +else + % MATRADGUI(...) + % create the GUI and hand varargin to the openingfcn + gui_Create = true; +end + +if ~gui_Create + % In design time, we need to mark all components possibly created in + % the coming callback evaluation as non-serializable. This way, they + % will not be brought into GUIDE and not be saved in the figure file + % when running/saving the GUI from GUIDE. + designEval = false; + if (numargin>1 && isgraphics(varargin{2})) + fig = varargin{2}; + while ~isempty(fig) && ~isgraphics(fig,'figure') + fig = get(fig,'parent'); + end + + designEval = isappdata(0,'CreatingGUIDEFigure') || (isscalar(fig)&&isprop(fig,'GUIDEFigure')); + end + + if designEval + beforeChildren = findall(fig); + end + + % evaluate the callback now + varargin{1} = gui_State.gui_Callback; + if nargout + [varargout{1:nargout}] = feval(varargin{:}); + else + feval(varargin{:}); + end + + % Set serializable of objects created in the above callback to off in + % design time. Need to check whether figure handle is still valid in + % case the figure is deleted during the callback dispatching. + if designEval && isgraphics(fig) + set(setdiff(findall(fig),beforeChildren), 'Serializable','off'); + end +else + if gui_State.gui_Singleton + gui_SingletonOpt = 'reuse'; + else + gui_SingletonOpt = 'new'; + end + + % Check user passing 'visible' P/V pair first so that its value can be + % used by oepnfig to prevent flickering + gui_Visible = 'auto'; + gui_VisibleInput = ''; + for index=1:2:length(varargin) + if length(varargin) == index || ~ischar(varargin{index}) + break; + end + + % Recognize 'visible' P/V pair + len1 = min(length('visible'),length(varargin{index})); + len2 = min(length('off'),length(varargin{index+1})); + if ischar(varargin{index+1}) && strncmpi(varargin{index},'visible',len1) && len2 > 1 + if strncmpi(varargin{index+1},'off',len2) + gui_Visible = 'invisible'; + gui_VisibleInput = 'off'; + elseif strncmpi(varargin{index+1},'on',len2) + gui_Visible = 'visible'; + gui_VisibleInput = 'on'; + end + end + end + + % Open fig file with stored settings. Note: This executes all component + % specific CreateFunctions with an empty HANDLES structure. + + + % Do feval on layout code in m-file if it exists + gui_Exported = ~isempty(gui_State.gui_LayoutFcn); + % this application data is used to indicate the running mode of a GUIDE + % GUI to distinguish it from the design mode of the GUI in GUIDE. it is + % only used by actxproxy at this time. + setappdata(0,genvarname(['OpenGuiWhenRunning_', gui_State.gui_Name]),1); + if gui_Exported + gui_hFigure = feval(gui_State.gui_LayoutFcn, gui_SingletonOpt); + + % make figure invisible here so that the visibility of figure is + % consistent in OpeningFcn in the exported GUI case + if isempty(gui_VisibleInput) + gui_VisibleInput = get(gui_hFigure,'Visible'); + end + set(gui_hFigure,'Visible','off') + + % openfig (called by local_openfig below) does this for guis without + % the LayoutFcn. Be sure to do it here so guis show up on screen. + movegui(gui_hFigure,'onscreen'); + else + gui_hFigure = local_openfig(gui_State.gui_Name, gui_SingletonOpt, gui_Visible); + % If the figure has InGUIInitialization it was not completely created + % on the last pass. Delete this handle and try again. + if isappdata(gui_hFigure, 'InGUIInitialization') + delete(gui_hFigure); + gui_hFigure = local_openfig(gui_State.gui_Name, gui_SingletonOpt, gui_Visible); + end + end + if isappdata(0, genvarname(['OpenGuiWhenRunning_', gui_State.gui_Name])) + rmappdata(0,genvarname(['OpenGuiWhenRunning_', gui_State.gui_Name])); + end + + % Set flag to indicate starting GUI initialization + setappdata(gui_hFigure,'InGUIInitialization',1); + + % Fetch GUIDE Application options + gui_Options = getappdata(gui_hFigure,'GUIDEOptions'); + % Singleton setting in the GUI MATLAB code file takes priority if different + gui_Options.singleton = gui_State.gui_Singleton; + + if ~isappdata(gui_hFigure,'GUIOnScreen') + % Adjust background color + if gui_Options.syscolorfig + set(gui_hFigure,'Color', get(0,'DefaultUicontrolBackgroundColor')); + end + + % Generate HANDLES structure and store with GUIDATA. If there is + % user set GUI data already, keep that also. + data = guidata(gui_hFigure); + handles = guihandles(gui_hFigure); + if ~isempty(handles) + if isempty(data) + data = handles; + else + names = fieldnames(handles); + for k=1:length(names) + data.(char(names(k)))=handles.(char(names(k))); + end + end + end + guidata(gui_hFigure, data); + end + + % Apply input P/V pairs other than 'visible' + for index=1:2:length(varargin) + if length(varargin) == index || ~ischar(varargin{index}) + break; + end + + len1 = min(length('visible'),length(varargin{index})); + if ~strncmpi(varargin{index},'visible',len1) + try set(gui_hFigure, varargin{index}, varargin{index+1}), catch break, end + end + end + + % If handle visibility is set to 'callback', turn it on until finished + % with OpeningFcn + gui_HandleVisibility = get(gui_hFigure,'HandleVisibility'); + if strcmp(gui_HandleVisibility, 'callback') + set(gui_hFigure,'HandleVisibility', 'on'); + end + + feval(gui_State.gui_OpeningFcn, gui_hFigure, [], guidata(gui_hFigure), varargin{:}); + + if isscalar(gui_hFigure) && isgraphics(gui_hFigure) + % Handle the default callbacks of predefined toolbar tools in this + % GUI, if any + %guidemfile('restoreToolbarToolPredefinedCallback',gui_hFigure); + + % Update handle visibility + set(gui_hFigure,'HandleVisibility', gui_HandleVisibility); + + % Call openfig again to pick up the saved visibility or apply the + % one passed in from the P/V pairs + if ~gui_Exported + gui_hFigure = local_openfig(gui_State.gui_Name, 'reuse',gui_Visible); + elseif ~isempty(gui_VisibleInput) + set(gui_hFigure,'Visible',gui_VisibleInput); + end + if strcmpi(get(gui_hFigure, 'Visible'), 'on') + figure(gui_hFigure); + + if gui_Options.singleton + setappdata(gui_hFigure,'GUIOnScreen', 1); + end + end + + % Done with GUI initialization + if isappdata(gui_hFigure,'InGUIInitialization') + rmappdata(gui_hFigure,'InGUIInitialization'); + end + + % If handle visibility is set to 'callback', turn it on until + % finished with OutputFcn + gui_HandleVisibility = get(gui_hFigure,'HandleVisibility'); + if strcmp(gui_HandleVisibility, 'callback') + set(gui_hFigure,'HandleVisibility', 'on'); + end + gui_Handles = guidata(gui_hFigure); + else + gui_Handles = []; + end + + if nargout + [varargout{1:nargout}] = feval(gui_State.gui_OutputFcn, gui_hFigure, [], gui_Handles); + else + feval(gui_State.gui_OutputFcn, gui_hFigure, [], gui_Handles); + end + + if isscalar(gui_hFigure) && isgraphics(gui_hFigure) + set(gui_hFigure,'HandleVisibility', gui_HandleVisibility); + end +end + +function gui_hFigure = local_openfig(name, singleton, visible) + +% openfig with three arguments was new from R13. Try to call that first, if +% failed, try the old openfig. +if nargin('openfig') == 2 + % OPENFIG did not accept 3rd input argument until R13, + % toggle default figure visible to prevent the figure + % from showing up too soon. + gui_OldDefaultVisible = get(0,'defaultFigureVisible'); + set(0,'defaultFigureVisible','off'); + gui_hFigure = matlab.hg.internal.openfigLegacy(name, singleton); + set(0,'defaultFigureVisible',gui_OldDefaultVisible); +else + % Call version of openfig that accepts 'auto' option" + gui_hFigure = matlab.hg.internal.openfigLegacy(name, singleton, visible); +% %workaround for CreateFcn not called to create ActiveX +% peers=findobj(findall(allchild(gui_hFigure)),'type','uicontrol','style','text'); +% for i=1:length(peers) +% if isappdata(peers(i),'Control') +% actxproxy(peers(i)); +% end +% end +end + +function result = local_isInvokeActiveXCallback(gui_State, varargin) + +try + result = ispc && iscom(varargin{1}) ... + && isequal(varargin{1},gcbo); +catch + result = false; +end + +function result = local_isInvokeHGCallback(gui_State, varargin) + +try + fhandle = functions(gui_State.gui_Callback); + result = ~isempty(findstr(gui_State.gui_Name,fhandle.file)) || ... + (ischar(varargin{1}) ... + && isequal(isgraphics(varargin{2}), 1) ... + && (~isempty(strfind(varargin{1},[get(varargin{2}, 'Tag'), '_'])) || ... + ~isempty(strfind(varargin{1}, '_CreateFcn'))) ); +catch + result = false; +end + + diff --git a/matRadGUI.m b/matRadGUI.m index 4e1a16712..4948b936b 100644 --- a/matRadGUI.m +++ b/matRadGUI.m @@ -62,7 +62,14 @@ fprintf('matRad GUI not supported for %s %s\n',env,versionString); return; else - warning('matRad GUI experimental for %s %s\n',env,versionString); + persistent octaveWarningIssued; + if isempty(octaveWarningIssued) + octaveWarningIssued = false; + end + if ~octaveWarningIssued + warning('matRad GUI experimental for %s %s\n',env,versionString); + octaveWarningIssued = true; + end end otherwise warning('matRad GUI never tested for %s %s\n',env,versionString); @@ -79,16 +86,16 @@ 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @matRadGUI_OpeningFcn, ... 'gui_OutputFcn', @matRadGUI_OutputFcn, ... - 'gui_LayoutFcn', [] , ... + 'gui_LayoutFcn', @matRadGUI_LayoutFcn, ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout - [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); + [varargout{1:nargout}] = matRadGUI_gui_mainFcn(gui_State, varargin{:}); else - gui_mainfcn(gui_State, varargin{:}); + matRadGUI_gui_mainFcn(gui_State, varargin{:}); end % End initialization code - DO NOT EDIT @@ -2538,7 +2545,7 @@ function getPlnFromGUI(handles) else meType = 'basic'; end - Message = {Message,ME.getReport(meType,'hyperlinks','off')}; + Message = {Message,ME.message};%{Message,ME.getReport(meType,'hyperlinks','off')}; end if isfield(handles,'ErrorDlg') @@ -2558,7 +2565,7 @@ function getPlnFromGUI(handles) else meType = 'basic'; end - Message = {Message,ME.getReport(meType,'hyperlinks','off')}; + Message = {Message,ME.message};%{Message,ME.getReport(meType,'hyperlinks','off')}; end if isfield(handles,'WarnDlg') @@ -4204,16 +4211,17 @@ function checkbox_lockColormap_Callback(hObject, eventdata, handles) fieldSep = 0.25*buttonW; %Separation between fields horizontally %Scrollbar -cstVertTableScroll = findobj(cstPanel.Children,'Style','slider'); +cstPanelChildren = get(cstPanel,'Children'); +cstVertTableScroll = findobj(cstPanelChildren,'Style','slider'); if isempty(cstVertTableScroll) sliderPos = 0; else - sliderPos = cstVertTableScroll.Max - cstVertTableScroll.Value; + sliderPos = get(cstVertTableScroll,'Max') - get(cstVertTableScroll,'Value'); end %disp(num2str(sliderPos)); ypos = @(c) tableViewHeight - c*lineHeight + sliderPos; -delete(cstPanel.Children); +delete(cstPanelChildren); %Creates a dummy axis to allow for the use of textboxes instead of uicontrol to be able to use the (la)tex interpreter tmpAxes = axes('Parent',cstPanel,'units','normalized','position',[0 0 1 1],'visible','off'); @@ -4246,19 +4254,26 @@ function checkbox_lockColormap_Callback(hObject, eventdata, handles) xPos = 0.01; %5 h = uicontrol(cstPanel,'Style','text','String','+/-','Units','normalized','Position',[xPos ypos(cnt) buttonW objHeight],'TooltipString','Remove or add Constraint or Objective'); -xPos = xPos + h.Position(3) + fieldSep; +tmp_pos = get(h,'Position'); +xPos = xPos + tmp_pos(3) + fieldSep; h = uicontrol(cstPanel,'Style','text','String','VOI name','Units','normalized','Position',[xPos ypos(cnt) nameW objHeight],'TooltipString','Name of the structure with objective/constraint'); -xPos = xPos + h.Position(3) + fieldSep; +tmp_pos = get(h,'Position'); +xPos = xPos + tmp_pos(3) + fieldSep; h = uicontrol(cstPanel,'Style','text','String','VOI type','Units','normalized','Position',[xPos ypos(cnt) typeW objHeight],'TooltipString','Segmentation Classification'); -xPos = xPos + h.Position(3) + fieldSep; +tmp_pos = get(h,'Position'); +xPos = xPos + tmp_pos(3) + fieldSep; h = uicontrol(cstPanel,'Style','text','String','OP','Units','normalized','Position',[xPos ypos(cnt) opW objHeight],'TooltipString',['Overlap Priority' char(10) '(Smaller number overlaps higher number)']); -xPos = xPos + h.Position(3) + fieldSep; +tmp_pos = get(h,'Position'); +xPos = xPos + tmp_pos(3) + fieldSep; h = uicontrol(cstPanel,'Style','text','String','Function','Units','normalized','Position',[xPos ypos(cnt) functionW objHeight],'TooltipString','Objective/Constraint function type'); -xPos = xPos + h.Position(3) + fieldSep; +tmp_pos = get(h,'Position'); +xPos = xPos + tmp_pos(3) + fieldSep; h = uicontrol(cstPanel,'Style','text','String','p','Units','normalized','Position',[xPos ypos(cnt) penaltyW objHeight],'TooltipString','Optimization penalty'); -xPos = xPos + h.Position(3) + fieldSep; +tmp_pos = get(h,'Position'); +xPos = xPos + tmp_pos(3) + fieldSep; h = uicontrol(cstPanel,'Style','text','String','| Parameters','Units','normalized','Position',[xPos ypos(cnt) paramTitleW objHeight],'TooltipString','List of parameters','HorizontalAlignment','left'); -xPos = xPos + h.Position(3) + fieldSep; +tmp_pos = get(h,'Position'); +xPos = xPos + tmp_pos(3) + fieldSep; cnt = cnt + 1; %Create Objectives / Constraints controls @@ -4321,7 +4336,7 @@ function checkbox_lockColormap_Callback(hObject, eventdata, handles) %h = uicontrol(cstPanel,'Style','edit','String',obj.parameters{1,p},'Position',[xPos ypos(cnt) 100 objHeight],'Enable','inactive'); %xPos = xPos + h.Position(3) + fieldSep; h = text('Parent',tmpAxes,'String',['| ' obj.parameterNames{p} ':'],'VerticalAlignment','middle','Units','normalized','Position',[xPos ypos(cnt)+lineHeight/2],'Interpreter','tex','FontWeight','normal',... - 'FontSize',cstPanel.FontSize,'FontName',cstPanel.FontName,'FontUnits',cstPanel.FontUnits,'FontWeight','normal');%[xPos ypos(cnt) 100 objHeight]); + 'FontSize',get(cstPanel,'FontSize'),'FontName',get(cstPanel,'FontName'),'FontUnits',get(cstPanel,'FontUnits'),'FontWeight','normal');%[xPos ypos(cnt) 100 objHeight]); tmp_pos = get(h,'Extent'); xPos = xPos + tmp_pos(3) + fieldSep; %h = annotation(cstPanel,'textbox','String',obj.parameters{1,p},'Units','pix','Position', [xPos ypos(cnt) 100 objHeight],'Interpreter','Tex'); @@ -4346,7 +4361,7 @@ function checkbox_lockColormap_Callback(hObject, eventdata, handles) tmp_pos = get(hAdd,'Position'); xPos = xPos + tmp_pos(3) + fieldSep; h = uicontrol(cstPanel,'Style','popupmenu','String',cst(:,2)','Units','normalized','Position',[xPos ypos(cnt) nameW objHeight]); -hAdd.UserData = h; +set(hAdd,'UserData',h); %Calculate Scrollbar lastPos = ypos(cnt); @@ -4383,8 +4398,8 @@ function btObjAdd_Callback(hObject, ~, handles) % hObject handle to btnuiTableAdd (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) -popupHandle = hObject.UserData; -cstIndex = popupHandle.Value; +popupHandle = get(hObject,'UserData'); +cstIndex = get(popupHandle,'Value'); cst = evalin('base','cst'); %Add Standard Objective @@ -4408,7 +4423,7 @@ function btObjRemove_Callback(hObject, ~, handles) % hObject handle to btnuiTableAdd (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) -ix = hObject.UserData; +ix = get(hObject,'UserData'); cst = evalin('base','cst'); %Add Standard Objective @@ -4429,7 +4444,7 @@ function editObjParam_Callback(hObject, ~, handles) % hObject handle to btnuiTableAdd (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) -ix = hObject.UserData; +ix = get(hObject,'UserData'); cst = evalin('base','cst'); %Add Standard Objective @@ -4473,10 +4488,10 @@ function changeObjFunction_Callback(hObject, ~, handles) % hObject handle to btnuiTableAdd (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) -data = hObject.UserData; +data = get(hObject,'UserData'); ix = data{1}; classNames = data{2}; -classToCreate = classNames{hObject.Value}; +classToCreate = classNames{get(hObject,'Value')}; cst = evalin('base','cst'); %Add Standard Objective @@ -4514,13 +4529,16 @@ function editCstParams_Callback(hObject,~,handles) cst = evalin('base','cst'); +str = get(hObject,'String'); +val = get(hObject,'Value'); + switch col case 2 - cst{ix,col} = hObject.String; + cst{ix,col} = str; case 3 - cst{ix,col} = hObject.String{hObject.Value}; + cst{ix,col} = str{val}; case 5 - cst{ix,col}.Priority = uint32(str2double(hObject.String)); + cst{ix,col}.Priority = uint32(str2double(str)); otherwise warning('Wrong column assignment in GUI based cst setting'); end @@ -4582,3 +4600,5 @@ function cstTableSlider_CreateFcn(hObject, eventdata, handles) set(hObject,'BackgroundColor',[.9 .9 .9]); end + + diff --git a/matRadGUI_export.m b/matRadGUI_export.m deleted file mode 100644 index 13149e2f2..000000000 --- a/matRadGUI_export.m +++ /dev/null @@ -1,7518 +0,0 @@ -function varargout = matRadGUI_export(varargin) -% matRad GUI -% -% call -% MATRADGUI_EXPORT, by itself, creates a new MATRADGUI_EXPORT or raises the existing -% singleton*. -% -% H = MATRADGUI_EXPORT returns the handle to a new MATRADGUI_EXPORT or the handle to -% the existing singleton*. -% -% MATRADGUI_EXPORT('CALLBACK',hObject,eventData,handles,...) calls the local -% function named CALLBACK in MATRADGUI_EXPORT.M with the given input arguments. -% -% MATRADGUI_EXPORT('Property','Value',...) creates a new MATRADGUI_EXPORT or raises the -% existing singleton*. Starting from the left, property value pairs are -% applied to the GUI before matRadGUI_export_OpeningFcn gets called. An -% unrecognized property name or invalid value makes property application -% stop. All inputs are passed to matRadGUI_export_OpeningFcn via varargin. -% -% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one -% instance to run (singleton)". -% -% See also: GUIDE, GUIDATA, GUIHANDLES -% -% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Copyright 2015 the matRad development team. -% -% This file is part of the matRad project. It is subject to the license -% terms in the LICENSE file found in the top-level directory of this -% distribution and at https://github.com/e0404/matRad/LICENSES.txt. No part -% of the matRad project, including this file, may be copied, modified, -% propagated, or distributed except according to the terms contained in the -% LICENSE file. -% -% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -if ~isdeployed - matRadRootDir = fileparts(mfilename('fullpath')); - addpath(genpath(matRadRootDir)); -end - -[env, versionString] = matRad_getEnvironment(); - -% abort for octave -switch env - case 'MATLAB' - - case 'OCTAVE' - fprintf(['matRad GUI not available for ' env ' ' versionString ' \n']); - return; - otherwise - fprintf(['not yet tested']); - end - -% Begin initialization code - DO NOT EDIT -% set platform specific look and feel -if ispc - lf = 'com.sun.java.swing.plaf.windows.WindowsLookAndFeel'; -elseif isunix - lf = 'com.jgoodies.looks.plastic.Plastic3DLookAndFeel'; -elseif ismac - lf = 'com.apple.laf.AquaLookAndFeel'; -end -javax.swing.UIManager.setLookAndFeel(lf); - -gui_Singleton = 1; -gui_State = struct('gui_Name', mfilename, ... - 'gui_Singleton', gui_Singleton, ... - 'gui_OpeningFcn', @matRadGUI_export_OpeningFcn, ... - 'gui_OutputFcn', @matRadGUI_export_OutputFcn, ... - 'gui_LayoutFcn', @matRadGUI_export_LayoutFcn, ... - 'gui_Callback', []); -if nargin && ischar(varargin{1}) - gui_State.gui_Callback = str2func(varargin{1}); -end - -if nargout - [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); -else - gui_mainfcn(gui_State, varargin{:}); -end - -% End initialization code - DO NOT EDIT - -function handles = resetGUI(hObject, handles, varargin) -% enable opengl software rendering to visualize linewidths properly -if ispc - opengl software -elseif ismac - % opengl is not supported -end - -% Choose default command line output for matRadGUI_export -handles.output = hObject; -%show matrad logo -axes(handles.axesLogo) -[im, ~, alpha] = imread('matrad_logo.png'); -f = image(im); -axis equal off -set(f, 'AlphaData', alpha); -% show dkfz logo -axes(handles.axesDKFZ) -[im, ~, alpha] = imread('DKFZ_Logo.png'); -f = image(im); -axis equal off; -set(f, 'AlphaData', alpha); - -% turn off the datacursormode (since it does not allow to set scrolling -% callbacks -handles.dcm_obj = datacursormode(handles.figure1); -set(handles.dcm_obj,'DisplayStyle','window'); -if strcmpi(get(handles.dcm_obj,'Enable'),'on') - set(handles.dcm_obj,'Enable','off'); -end -%Add the callback for the datacursor display -set(handles.dcm_obj,'UpdateFcn',@dataCursorUpdateFunction); - -% set callback for scroll wheel function -set(gcf,'WindowScrollWheelFcn',@matRadScrollWheelFcn); - -% change color of toobar but only the first time GUI is started -if handles.initialGuiStart - hToolbar = findall(hObject,'tag','uitoolbar1'); - jToolbar = get(get(hToolbar,'JavaContainer'),'ComponentPeer'); - jToolbar.setBorderPainted(false); - color = java.awt.Color.gray; - % Remove the toolbar border, to blend into figure contents - jToolbar.setBackground(color); - % Remove the separator line between toolbar and contents - warning('off','MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame'); - jFrame = get(handle(hObject),'JavaFrame'); - jFrame.showTopSeparator(false); - jtbc = jToolbar.getComponents; - for idx=1:length(jtbc) - jtbc(idx).setOpaque(false); - jtbc(idx).setBackground(color); - for childIdx = 1 : length(jtbc(idx).getComponents) - jtbc(idx).getComponent(childIdx-1).setBackground(color); - end - end -end - - -set(handles.legendTable,'String',{'no data loaded'}); -% clear VOIPlotFlag -if isfield(handles,'VOIPlotFlag') - handles = rmfield(handles,'VOIPlotFlag'); -end - -%seach for availabes machines -handles.Modalities = {'photons','protons','carbon'}; -for i = 1:length(handles.Modalities) - pattern = [handles.Modalities{1,i} '_*']; - if isdeployed - Files = dir([ctfroot filesep 'matRad' filesep pattern]); - else - Files = dir([fileparts(mfilename('fullpath')) filesep pattern]); - end - for j = 1:length(Files) - if ~isempty(Files) - MachineName = Files(j).name(numel(handles.Modalities{1,i})+2:end-4); - if isfield(handles,'Machines') - if sum(strcmp(handles.Machines,MachineName)) == 0 - handles.Machines{size(handles.Machines,2)+1} = MachineName; - end - else - handles.Machines = cell(1); - handles.Machines{1} = MachineName; - end - end - end -end -set(handles.popUpMachine,'String',handles.Machines); - - -vChar = get(handles.editGantryAngle,'String'); -if strcmp(vChar(1,1),'0') && length(vChar)==6 - set(handles.editGantryAngle,'String','0'); -end -vChar = get(handles.editCouchAngle,'String'); -if strcmp(vChar(1,1),'0') && length(vChar)==3 - set(handles.editCouchAngle,'String','0') -end -%% -% handles.State=0 no data available -% handles.State=1 ct cst and pln available; ready for dose calculation -% handles.State=2 ct cst and pln available and dij matric(s) are calculated; -% ready for optimization -% handles.State=3 plan is optimized - - -% if plan is changed go back to state 1 -% if table VOI Type or Priorities changed go to state 1 -% if objective parameters changed go back to state 2 -handles.CutOffLevel = 0.01; % relative cut off level for dose vis -handles.IsoDose.NewIsoDoseFlag = false; -handles.TableChanged = false; -handles.State = 0; -handles.doseOpacity = 0.6; -handles.IsoDose.Levels = 0; -handles.dispWindow = cell(3,2); % first dimension refers to the selected - -% do not calculate / suggest isoCenter new by default -set(handles.checkIsoCenter, 'Value', 0); -set(handles.editIsoCenter,'Enable','on') - -% suppose no ct cube in HU is available (because no ct could be available) -handles.cubeHUavailable = false; -% initial startup finished -handles.initialGuiStart = false; -guidata(hObject, handles); -% eof resetGUI - -function handles = reloadGUI(hObject, handles, ct, cst) -AllVarNames = handles.AllVarNames; - -if ismember('ct',AllVarNames) - % compute HU values - if ~isfield(ct, 'cubeHU') - ct = matRad_electronDensitiesToHU(ct); - assignin('base','ct',ct); - end - if ~isfield(ct, 'cubeHU') - handles.cubeHUavailable = false; - else - handles.cubeHUavailable = true; - end -end - -%set plan if available - if not create one -try - - if ismember('pln',AllVarNames) && handles.State > 0 - % check if you are working with a valid pln - pln = evalin('base','pln'); - if ~isfield(pln,'propStf') - handles = showWarning(handles,'GUI OpeningFunc: Overwriting outdated pln format with default GUI pln'); - evalin('base','clear pln'); - getPlnFromGUI(handles); - end - setPln(handles); - elseif handles.State > 0 - getPlnFromGUI(handles); - setPln(handles); - end - -catch - handles.State = 0; - handles = showError(handles,'GUI OpeningFunc: Could not set or get pln'); -end - -% check for dij structure -if ismember('dij',AllVarNames) - handles.State = 2; -end - -% check for optimized results -if ismember('resultGUI',AllVarNames) - handles.State = 3; -end - -% set some default values -if handles.State == 2 || handles.State == 3 - set(handles.popupDisplayOption,'String','physicalDose'); - handles.SelectedDisplayOption ='physicalDose'; - handles.SelectedDisplayOptionIdx=1; -else - handles.resultGUI = []; - set(handles.popupDisplayOption,'String','no option available'); - handles.SelectedDisplayOption=''; - handles.SelectedDisplayOptionIdx=1; -end - -% precompute iso dose lines -if handles.State == 3 - handles = updateIsoDoseLineCache(handles); -end - -%per default the first beam is selected for the profile plot -handles.selectedBeam = 1; -handles.plane = get(handles.popupPlane,'Value'); -handles.DijCalcWarning = false; - -planePermute = [2 1 3]; - -% set slice slider -if handles.State > 0 - if evalin('base','exist(''pln'',''var'')') - currPln = evalin('base','pln'); - if sum(currPln.propStf.isoCenter(:)) ~= 0 - currSlice = ceil(currPln.propStf.isoCenter(1,planePermute(handles.plane))/ct.resolution.x); - else - currSlice = ceil(ct.cubeDim(planePermute(handles.plane))/2); - end - else % no pln -> no isocenter -> use middle - currSlice = ceil(ct.cubeDim(planePermute(handles.plane))/2); - end - set(handles.sliderSlice,'Min',1,'Max',ct.cubeDim(handles.plane),... - 'Value',currSlice,... - 'SliderStep',[1/(ct.cubeDim(handles.plane)-1) 1/(ct.cubeDim(handles.plane)-1)]); - - % define context menu for structures - for i = 1:size(cst,1) - if cst{i,5}.Visible - handles.VOIPlotFlag(i) = true; - else - handles.VOIPlotFlag(i) = false; - end - end - else - % reset slider when nothing is loaded - set(handles.sliderSlice,'Min',0,'Max',1,'Value',0,'SliderStep',[1 1]); -end - -%Initialize colormaps and windows -handles.doseColorMap = 'jet'; -handles.ctColorMap = 'bone'; -handles.cMapSize = 64; -handles.cBarChanged = true; - -%Set up the colormap selection box -availableColormaps = matRad_getColormap(); -set(handles.popupmenu_chooseColormap,'String',availableColormaps); - -currentCtMapIndex = find(strcmp(availableColormaps,handles.ctColorMap)); -currentDoseMapIndex = find(strcmp(availableColormaps,handles.doseColorMap)); - -if handles.State >= 1 - set(handles.popupmenu_chooseColormap,'Value',currentCtMapIndex); -end - -if handles.State >= 3 - set(handles.popupmenu_chooseColormap,'Value',currentDoseMapIndex); -end - -% Update handles structure -handles.profileOffset = 0; -UpdateState(handles) - -axes(handles.axesFig) - -handles.rememberCurrAxes = false; -UpdatePlot(handles) -handles.rememberCurrAxes = true; -guidata(hObject, handles); -% eof reloadGUI - -% --- Executes just before matRadGUI_export is made visible. -function matRadGUI_export_OpeningFcn(hObject, ~, handles, varargin) -%#ok<*DEFNU> -%#ok<*AGROW> -% This function has no output args, see OutputFcn. -% hObject handle to figure -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) -% varargin command line arguments to matRadGUI_export (see VARARGIN) - -% variable to check whether GUI is opened or just refreshed / new data -% loaded, since resetGUI needs to distinguish at one point - -handles.initialGuiStart = true; - -%If devMode is true, error dialogs will include the full stack trace of the error -%If false, only the basic error message is shown (works for errors that -%handle the MException object) -handles.devMode = true; - -set(handles.radiobtnPlan,'value',0); - -handles = resetGUI(hObject, handles); - -%% parse variables from base workspace -AllVarNames = evalin('base','who'); -handles.AllVarNames = AllVarNames; -try - if ismember('ct',AllVarNames) && ismember('cst',AllVarNames) - ct = evalin('base','ct'); - cst = evalin('base','cst'); - %cst = setCstTable(handles,cst); - cst = generateCstTable(handles,cst); - handles.State = 1; - cst = matRad_computeVoiContoursWrapper(cst,ct); - assignin('base','cst',cst); - - elseif ismember('ct',AllVarNames) && ~ismember('cst',AllVarNames) - handles = showError(handles,'GUI OpeningFunc: could not find cst file'); - elseif ~ismember('ct',AllVarNames) && ismember('cst',AllVarNames) - handles = showError(handles,'GUI OpeningFunc: could not find ct file'); - end -catch - handles = showError(handles,'GUI OpeningFunc: Could not load ct and cst file'); -end - -if ismember('ct',AllVarNames) && ismember('cst',AllVarNames) - handles = reloadGUI(hObject, handles, ct, cst); -else - handles = reloadGUI(hObject, handles); -end - -guidata(hObject, handles); - - -function Callback_StructVisibilty(source,~) - -handles = guidata(findobj('Name','matRadGUI')); - -contextUiChildren = get(get(handles.figure1,'UIContextMenu'),'Children'); - -Idx = find(strcmp(get(contextUiChildren,'Label'),get(source,'Label'))); -if strcmp(get(source,'Checked'),'on') - set(contextUiChildren(Idx),'Checked','off'); -else - set(contextUiChildren(Idx),'Checked','on'); -end -%guidata(findobj('Name','matRadGUI_export'), handles); -UpdatePlot(handles); - -Update -% --- Outputs from this function are returned to the command line. -function varargout = matRadGUI_export_OutputFcn(~, ~, handles) -% varargout cell array for returning output args (see VARARGOUT); -% hObject handle to figure -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Get default command line output from handles structure -varargout{1} = handles.output; - -% set focus on error dialog -if isfield(handles,'ErrorDlg') - figure(handles.ErrorDlg) -end - -% --- Executes on button press in btnLoadMat. -function btnLoadMat_Callback(hObject, ~, handles) -% hObject handle to btnLoadMat (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -[FileName, FilePath] = uigetfile('*.mat'); -if FileName == 0 % user pressed cancel --> do nothing. - return; -end - -handles = resetGUI(hObject, handles); - -try - - % delete existing workspace - parse variables from base workspace - AllVarNames = evalin('base','who'); - RefVarNames = {'ct','cst','pln','stf','dij','resultGUI'}; - - for i = 1:length(RefVarNames) - if sum(ismember(AllVarNames,RefVarNames{i}))>0 - evalin('base',['clear ', RefVarNames{i}]); - end - end - - % read new data - load([FilePath FileName]); - set(handles.legendTable,'String',{'no data loaded'}); - set(handles.popupDisplayOption,'String','no option available'); - -catch ME - handles = showError(handles,'LoadMatFileFnc: Could not load *.mat file',ME); - - guidata(hObject,handles); - UpdateState(handles); - UpdatePlot(handles); - return -end - -try - generateCstTable(handles,cst); - handles.TableChanged = false; - set(handles.popupTypeOfPlot,'Value',1); - cst = matRad_computeVoiContoursWrapper(cst,ct); - - assignin('base','ct',ct); - assignin('base','cst',cst); - handles.State = 1; -catch ME - handles = showError(handles,'LoadMatFileFnc: Could not load *.mat file',ME); -end - -% check if a optimized plan was loaded -if exist('stf','var') - assignin('base','stf',stf); -end -if exist('pln','var') - assignin('base','pln',pln); -end -if exist('dij','var') - assignin('base','dij',dij); -end -% if exist('stf','var') && exist('dij','var') -% handles.State = 2; -% end - -if exist('resultGUI','var') - assignin('base','resultGUI',resultGUI); - % handles.State = 3; - % handles.SelectedDisplayOption ='physicalDose'; -end - -% recheck current workspace variables -AllVarNames = evalin('base','who'); -handles.AllVarNames = AllVarNames; - -if ismember('ct',AllVarNames) && ismember('cst',AllVarNames) - handles = reloadGUI(hObject, handles, ct, cst); -else - handles = reloadGUI(hObject, handles); -end - -guidata(hObject,handles); - -% --- Executes on button press in btnLoadDicom. -function btnLoadDicom_Callback(hObject, ~, handles) -% hObject handle to btnLoadDicom (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) -try - % delete existing workspace - parse variables from base workspace - set(handles.popupDisplayOption,'String','no option available'); - AllVarNames = evalin('base','who'); - RefVarNames = {'ct','cst','pln','stf','dij','resultGUI'}; - for i = 1:length(RefVarNames) - if sum(ismember(AllVarNames,RefVarNames{i}))>0 - evalin('base',['clear ', RefVarNames{i}]); - end - end - handles.State = 0; - matRad_importDicomGUI; - -catch - handles = showError(handles,'DicomImport: Could not import data'); -end -UpdateState(handles); -guidata(hObject,handles); - - -% --- Executes on button press in btn_export. -function btn_export_Callback(hObject, eventdata, handles) -% hObject handle to btn_export (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -try - matRad_exportGUI; -catch - handles = showError(handles,'Could not export data'); -end -UpdateState(handles); -guidata(hObject,handles); - -function editBixelWidth_Callback(hObject, ~, handles) -% hObject handle to editBixelWidth (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hints: get(hObject,'String') returns contents of editBixelWidth as text -% str2double(get(hObject,'String')) returns contents of editBixelWidth as a double -getPlnFromGUI(handles); -if handles.State > 0 - handles.State = 1; - UpdateState(handles); - guidata(hObject,handles); -end - -function editGantryAngle_Callback(hObject, ~, handles) -% hObject handle to editGantryAngle (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hints: get(hObject,'String') returns contents of editGantryAngle as text -% str2double(get(hObject,'String')) returns contents of editGantryAngle as a double -getPlnFromGUI(handles); -if handles.State > 0 - handles.State = 1; - UpdateState(handles); - UpdatePlot(handles); - guidata(hObject,handles); -end - -function editCouchAngle_Callback(hObject, ~, handles) -% hObject handle to editCouchAngle (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hints: get(hObject,'String') returns contents of editCouchAngle as text -% str2double(get(hObject,'String')) returns contents of editCouchAngle as a double -getPlnFromGUI(handles); -if handles.State > 0 - handles.State = 1; - UpdateState(handles); - guidata(hObject,handles); -end - -% --- Executes on selection change in popupRadMode. -function popupRadMode_Callback(hObject, eventdata, handles) -% hObject handle to popupRadMode (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) -checkRadiationComposition(handles); -contents = cellstr(get(hObject,'String')); -RadIdentifier = contents{get(hObject,'Value')}; -contentPopUp = get(handles.popMenuBioOpt,'String'); -switch RadIdentifier - case 'photons' - - set(handles.popMenuBioOpt,'Enable','off'); - ix = find(strcmp(contentPopUp,'none')); - set(handles.popMenuBioOpt,'Value',ix); - set(handles.btnSetTissue,'Enable','off'); - - set(handles.btnRunSequencing,'Enable','on'); - set(handles.btnRunDAO,'Enable','on'); - set(handles.radiobutton3Dconf,'Enable','on'); - set(handles.txtSequencing,'Enable','on'); - set(handles.editSequencingLevel,'Enable','on'); - - case 'protons' - - set(handles.popMenuBioOpt,'Enable','on'); - ix = find(strcmp(contentPopUp,'const_RBExD')); - set(handles.popMenuBioOpt,'Value',ix); - set(handles.btnSetTissue,'Enable','on'); - - set(handles.btnSetTissue,'Enable','off'); - set(handles.btnRunSequencing,'Enable','off'); - set(handles.btnRunDAO,'Enable','off'); - set(handles.radiobutton3Dconf,'Enable','off'); - set(handles.txtSequencing,'Enable','off'); - set(handles.editSequencingLevel,'Enable','off'); - - case 'carbon' - - set(handles.popMenuBioOpt,'Enable','on'); - ix = find(strcmp(contentPopUp,'LEMIV_RBExD')); - set(handles.popMenuBioOpt,'Value',ix); - set(handles.btnSetTissue,'Enable','on'); - - set(handles.btnRunSequencing,'Enable','off'); - set(handles.btnRunDAO,'Enable','off'); - set(handles.radiobutton3Dconf,'Enable','off'); - set(handles.txtSequencing,'Enable','off'); - set(handles.editSequencingLevel,'Enable','off'); -end - -if handles.State > 0 - pln = evalin('base','pln'); - if handles.State > 0 && ~strcmp(contents(get(hObject,'Value')),pln.radiationMode) - - % new radiation modality is photons -> just keep physicalDose - if strcmp(contents(get(hObject,'Value')),'photons') - try - AllVarNames = evalin('base','who'); - if ismember('resultGUI',AllVarNames) - resultGUI = evalin('base','resultGUI'); - if isfield(resultGUI,'alpha'); resultGUI = rmfield(resultGUI,'alpha'); end - if isfield(resultGUI,'beta'); resultGUI = rmfield(resultGUI,'beta'); end - if isfield(resultGUI,'RBExDose'); resultGUI = rmfield(resultGUI,'RBExDose');end - if isfield(resultGUI,'RBE'); resultGUI = rmfield(resultGUI,'RBE'); end - assignin('base','resultGUI',resultGUI); - handles = updateIsoDoseLineCache(handles); - end - catch - end - elseif strcmp(contents(get(hObject,'Value')),'protons') - try - AllVarNames = evalin('base','who'); - if ismember('resultGUI',AllVarNames) - resultGUI = evalin('base','resultGUI'); - if isfield(resultGUI,'alpha'); resultGUI = rmfield(resultGUI,'alpha');end - if isfield(resultGUI,'beta'); resultGUI = rmfield(resultGUI,'beta'); end - if isfield(resultGUI,'RBE'); resultGUI = rmfield(resultGUI,'RBE'); end - assignin('base','resultGUI',resultGUI); - handles = updateIsoDoseLineCache(handles); - end - catch - end - end - - guidata(hObject,handles); - UpdatePlot(handles); - - getPlnFromGUI(handles); - handles.State = 1; - UpdateState(handles); - - end - -guidata(hObject,handles); - -end - - -% --- Executes on button press in btnCalcDose. -function btnCalcDose_Callback(hObject, ~, handles) -% hObject handle to btnCalcDose (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% http://stackoverflow.com/questions/24703962/trigger-celleditcallback-before-button-callback -% http://www.mathworks.com/matlabcentral/newsreader/view_thread/332613 -% wait some time until the CallEditCallback is finished -% Callback triggers the cst saving mechanism from GUI -try - % indicate that matRad is busy - % change mouse pointer to hour glass - Figures = gcf;%findobj('type','figure'); - set(Figures, 'pointer', 'watch'); - drawnow; - % disable all active objects - InterfaceObj = findobj(Figures,'Enable','on'); - set(InterfaceObj,'Enable','off'); - - %pause(0.1); - %uiTable_CellEditCallback(hObject,[],handles); - %pause(0.3); - - %% get cst from table - %if ~getCstTable(handles) - % return - %end - % read plan from gui and save it to workspace - % gets also IsoCenter from GUI if checkbox is not checked - getPlnFromGUI(handles); - - % get default iso center as center of gravity of all targets if not - % already defined - pln = evalin('base','pln'); - - if length(pln.propStf.gantryAngles) ~= length(pln.propStf.couchAngles) - handles = showWarning(handles,'number of gantryAngles != number of couchAngles'); - end - %% - if ~checkRadiationComposition(handles); - fileName = [pln.radiationMode '_' pln.machine]; - handles = showError(handles,errordlg(['Could not find the following machine file: ' fileName ])); - guidata(hObject,handles); - return; - end - - %% check if isocenter is already set - if ~isfield(pln.propStf,'isoCenter') - handles = showWarning(handles,'no iso center set - using center of gravity based on structures defined as TARGET'); - pln.propStf.isoCenter = ones(pln.propStf.numOfBeams,1) * matRad_getIsoCenter(evalin('base','cst'),evalin('base','ct')); - assignin('base','pln',pln); - elseif ~get(handles.checkIsoCenter,'Value') - if ~strcmp(get(handles.editIsoCenter,'String'),'multiple isoCenter') - pln.propStf.isoCenter = ones(pln.propStf.numOfBeams,1)*str2num(get(handles.editIsoCenter,'String')); - end - end - -catch ME - handles = showError(handles,'CalcDoseCallback: Error in preprocessing!',ME); - % change state from busy to normal - set(Figures, 'pointer', 'arrow'); - set(InterfaceObj,'Enable','on'); - guidata(hObject,handles); - return; -end - -% generate steering file -try - currPln = evalin('base','pln'); - % if we run 3d conf opt -> hijack runDao to trigger computation of - % connected bixels - if strcmp(pln.radiationMode,'photons') && get(handles.radiobutton3Dconf,'Value') - currpln.propOpt.runDAO = true; - end - stf = matRad_generateStf(evalin('base','ct'),... - evalin('base','cst'),... - currPln); - assignin('base','stf',stf); -catch ME - handles = showError(handles,'CalcDoseCallback: Error in steering file generation!',ME); - % change state from busy to normal - set(Figures, 'pointer', 'arrow'); - set(InterfaceObj,'Enable','on'); - guidata(hObject,handles); - return; -end - -% carry out dose calculation -try - if strcmp(pln.radiationMode,'photons') - dij = matRad_calcPhotonDose(evalin('base','ct'),stf,pln,evalin('base','cst')); - elseif strcmp(pln.radiationMode,'protons') || strcmp(pln.radiationMode,'carbon') - dij = matRad_calcParticleDose(evalin('base','ct'),stf,pln,evalin('base','cst')); - end - - % assign results to base worksapce - assignin('base','dij',dij); - handles.State = 2; - handles.TableChanged = false; - UpdateState(handles); - UpdatePlot(handles); - guidata(hObject,handles); -catch ME - handles = showError(handles,'CalcDoseCallback: Error in dose calculation!',ME); - % change state from busy to normal - set(Figures, 'pointer', 'arrow'); - set(InterfaceObj,'Enable','on'); - guidata(hObject,handles); - return; -end - -% change state from busy to normal -set(Figures, 'pointer', 'arrow'); -set(InterfaceObj,'Enable','on'); - -guidata(hObject,handles); - - - -%% plots ct and distributions -function UpdatePlot(handles) - -%profile on; - -axes(handles.axesFig); - -% this is necessary to prevent multiple callbacks of update plot drawing on -% top of each other in matlab <2014 -drawnow; - -defaultFontSize = 8; -currAxes = axis(handles.axesFig); -AxesHandlesCT_Dose = gobjects(0); -AxesHandlesVOI = cell(0); -AxesHandlesIsoDose = gobjects(0); - -if handles.State == 0 - cla reset - return -elseif handles.State > 0 - ct = evalin('base','ct'); - cst = evalin('base','cst'); - pln = evalin('base','pln'); -end - -%% state 3 indicates that a optimization has been performed - AllVarNames = evalin('base','who'); -if ismember('resultGUI',AllVarNames) - Result = evalin('base','resultGUI'); -end - -if exist('Result','var') - if ~isempty(Result) && ~isempty(ct.cubeHU) && ~isfield(handles,'DispInfo') - - DispInfo = fieldnames(Result); - - for i = 1:size(DispInfo,1) - - % delete weight vectors in Result struct for plotting - if isstruct(Result.(DispInfo{i,1})) || isvector(Result.(DispInfo{i,1})) - Result = rmfield(Result,DispInfo{i,1}); - DispInfo{i,2}=false; - else - %second dimension indicates if it should be plotted - DispInfo{i,2} = true; - % determine units - if strfind(DispInfo{i,1},'physicalDose') - DispInfo{i,3} = '[Gy]'; - elseif strfind(DispInfo{i,1},'alpha') - DispInfo{i,3} = '[Gy^{-1}]'; - elseif strfind(DispInfo{i,1},'beta') - DispInfo{i,3} = '[Gy^{-2}]'; - elseif strfind(DispInfo{i,1},'RBExD') - DispInfo{i,3} = '[Gy(RBE)]'; - elseif strfind(DispInfo{i,1},'LET') - DispInfo{i,3} = '[keV/um]'; - else - DispInfo{i,3} = '[a.u.]'; - end - DispInfo{i,4} = []; % optional for the future: color range for plotting - DispInfo{i,5} = []; % optional for the future: min max values - end - end - - set(handles.popupDisplayOption,'String',fieldnames(Result)); - if sum(strcmp(handles.SelectedDisplayOption,fieldnames(Result))) == 0 - handles.SelectedDisplayOption = DispInfo{find([DispInfo{:,2}],1,'first'),1}; - end - set(handles.popupDisplayOption,'Value',find(strcmp(handles.SelectedDisplayOption,fieldnames(Result)))); - - end -end - -%% set and get required variables -plane = get(handles.popupPlane,'Value'); -slice = round(get(handles.sliderSlice,'Value')); -hold(handles.axesFig,'on'); -if get(handles.popupTypeOfPlot,'Value')==1 - set(handles.axesFig,'YDir','Reverse'); -end - -%% Remove colorbar? -plotColorbarSelection = get(handles.popupmenu_chooseColorData,'Value'); - -if get(handles.popupTypeOfPlot,'Value')==2 || plotColorbarSelection == 1 - if isfield(handles,'cBarHandel') - delete(handles.cBarHandel); - end - %The following seems to be necessary as MATLAB messes up some stuff - %with the handle storage - ch = findall(gcf,'tag','Colorbar'); - if ~isempty(ch) - delete(ch); - end -end - -selectIx = get(handles.popupmenu_chooseColorData,'Value'); - -cla(handles.axesFig); -%% plot ct - if a ct cube is available and type of plot is set to 1 and not 2; 1 indicate cube plotting and 2 profile plotting -if ~isempty(ct) && get(handles.popupTypeOfPlot,'Value')==1 - - if selectIx == 3 - ctIx = 2; - else - ctIx = selectIx; - end - - if isfield(ct, 'cube') - plotCtCube = ct.cube; - else - plotCtCube = ct.cubeHU; - end - - ctMap = matRad_getColormap(handles.ctColorMap,handles.cMapSize); - - if isempty(handles.dispWindow{ctIx,2}) - handles.dispWindow{ctIx,2} = [min(reshape([ct.cubeHU{:}],[],1)) max(reshape([ct.cubeHU{:}],[],1))]; - end - - if get(handles.radiobtnCT,'Value') - [AxesHandlesCT_Dose(end+1),~,handles.dispWindow{ctIx,1}] = matRad_plotCtSlice(handles.axesFig,plotCtCube,1,plane,slice,ctMap,handles.dispWindow{ctIx,1}); - - % plot colorbar? If 1 the user asked for the CT - if plotColorbarSelection == 2 && handles.cBarChanged - %Plot the colorbar - handles.cBarHandel = matRad_plotColorbar(handles.axesFig,ctMap,handles.dispWindow{ctIx,1},'fontsize',defaultFontSize); - %adjust lables - if isfield(ct,'cubeHU') - set(get(handles.cBarHandel,'ylabel'),'String', 'Hounsfield Units','fontsize',defaultFontSize); - else - set(get(handles.cBarHandel,'ylabel'),'String', 'Electron Density','fontsize',defaultFontSize); - end - % do not interprete as tex syntax - set(get(handles.cBarHandel,'ylabel'),'interpreter','none'); - end - end -end - -%% plot dose cube -if handles.State >= 1 && get(handles.popupTypeOfPlot,'Value')== 1 && exist('Result','var') - doseMap = matRad_getColormap(handles.doseColorMap,handles.cMapSize); - doseIx = 3; - % if the selected display option doesn't exist then simply display - % the first cube of the Result struct - if ~isfield(Result,handles.SelectedDisplayOption) - CubeNames = fieldnames(Result); - handles.SelectedDisplayOption = CubeNames{1,1}; - end - - dose = Result.(handles.SelectedDisplayOption); - - % dose colorwash - if ~isempty(dose) && ~isvector(dose) - - if isempty(handles.dispWindow{doseIx,2}) - handles.dispWindow{doseIx,2} = [min(dose(:)) max(dose(:))]; % set min and max dose values - end - - if get(handles.radiobtnDose,'Value') - [doseHandle,~,handles.dispWindow{doseIx,1}] = matRad_plotDoseSlice(handles.axesFig,dose,plane,slice,handles.CutOffLevel,handles.doseOpacity,doseMap,handles.dispWindow{doseIx,1}); - AxesHandlesCT_Dose(end+1) = doseHandle; - end - - % plot colorbar? - if plotColorbarSelection > 2 && handles.cBarChanged - %Plot the colorbar - handles.cBarHandel = matRad_plotColorbar(handles.axesFig,doseMap,handles.dispWindow{selectIx,1},'fontsize',defaultFontSize); - %adjust lables - Idx = find(strcmp(handles.SelectedDisplayOption,DispInfo(:,1))); - set(get(handles.cBarHandel,'ylabel'),'String', [DispInfo{Idx,1} ' ' DispInfo{Idx,3} ],'fontsize',defaultFontSize); - % do not interprete as tex syntax - set(get(handles.cBarHandel,'ylabel'),'interpreter','none'); - end - end - - - %% plot iso dose lines - if get(handles.radiobtnIsoDoseLines,'Value') - plotLabels = get(handles.radiobtnIsoDoseLinesLabels,'Value') == 1; - - %Sanity Check for Contours, which actually should have been - %computed before calling UpdatePlot - if ~isfield(handles.IsoDose,'Contours') - try - handles.IsoDose.Contours = matRad_computeIsoDoseContours(dose,handles.IsoDose.Levels); - catch - %If the computation didn't work, we set the field to - %empty, which will force matRad_plotIsoDoseLines to use - %matlabs contour function instead of repeating the - %failing computation every time - handles.IsoDose.Contours = []; - warning('Could not compute isodose lines! Will try slower contour function!'); - end - end - AxesHandlesIsoDose = matRad_plotIsoDoseLines(handles.axesFig,dose,handles.IsoDose.Contours,handles.IsoDose.Levels,plotLabels,plane,slice,doseMap,handles.dispWindow{doseIx,1},'LineWidth',1.5); - end -end - -selectIx = get(handles.popupmenu_chooseColorData,'Value'); -set(handles.txtMinVal,'String',num2str(handles.dispWindow{selectIx,2}(1,1))); -set(handles.txtMaxVal,'String',num2str(handles.dispWindow{selectIx,2}(1,2))); - -%% plot VOIs -if get(handles.radiobtnContour,'Value') && get(handles.popupTypeOfPlot,'Value')==1 && handles.State>0 - AxesHandlesVOI = [AxesHandlesVOI matRad_plotVoiContourSlice(handles.axesFig,cst,ct,1,handles.VOIPlotFlag,plane,slice,[],'LineWidth',2)]; -end - -%% Set axis labels and plot iso center -matRad_plotAxisLabels(handles.axesFig,ct,plane,slice,defaultFontSize); - -if get(handles.radioBtnIsoCenter,'Value') == 1 && get(handles.popupTypeOfPlot,'Value') == 1 && ~isempty(pln) - hIsoCenterCross = matRad_plotIsoCenterMarker(handles.axesFig,pln,ct,plane,slice); -end - -if get(handles.radiobtnPlan,'value') == 1 && ~isempty(pln) - matRad_plotProjectedGantryAngles(handles.axesFig,pln,ct,plane); -end - -% the following line ensures the plotting order (optional) -% set(gca,'Children',[AxesHandlesCT_Dose hIsoCenterCross AxesHandlesIsoDose AxesHandlesVOI ]); - -%set axis ratio -ratios = [1/ct.resolution.x 1/ct.resolution.y 1/ct.resolution.z]; -set(handles.axesFig,'DataAspectRatioMode','manual'); -if plane == 1 - res = [ratios(3) ratios(2)]./max([ratios(3) ratios(2)]); - set(handles.axesFig,'DataAspectRatio',[res 1]) -elseif plane == 2 % sagittal plane - res = [ratios(3) ratios(1)]./max([ratios(3) ratios(1)]); - set(handles.axesFig,'DataAspectRatio',[res 1]) -elseif plane == 3 % Axial plane - res = [ratios(2) ratios(1)]./max([ratios(2) ratios(1)]); - set(handles.axesFig,'DataAspectRatio',[res 1]) -end - - -%% profile plot -if get(handles.popupTypeOfPlot,'Value') == 2 && exist('Result','var') - % set SAD - fileName = [pln.radiationMode '_' pln.machine]; - try - load(fileName); - SAD = machine.meta.SAD; - catch - error(['Could not find the following machine file: ' fileName ]); - end - - % clear view and initialize some values - cla(handles.axesFig,'reset') - set(gca,'YDir','normal'); - ylabel('{\color{black}dose [Gy]}') - cColor={'black','green','magenta','cyan','yellow','red','blue'}; - - % Rotate the system into the beam. - % passive rotation & row vector multiplication & inverted rotation requires triple matrix transpose - rotMat_system_T = transpose(matRad_getRotationMatrix(pln.propStf.gantryAngles(handles.selectedBeam),pln.propStf.couchAngles(handles.selectedBeam))); - - if strcmp(handles.ProfileType,'longitudinal') - sourcePointBEV = [handles.profileOffset -SAD 0]; - targetPointBEV = [handles.profileOffset SAD 0]; - elseif strcmp(handles.ProfileType,'lateral') - sourcePointBEV = [-SAD handles.profileOffset 0]; - targetPointBEV = [ SAD handles.profileOffset 0]; - end - - rotSourcePointBEV = sourcePointBEV * rotMat_system_T; - rotTargetPointBEV = targetPointBEV * rotMat_system_T; - - % perform raytracing on the central axis of the selected beam, use unit - % electron density for plotting against the geometrical depth - [~,l,rho,~,ix] = matRad_siddonRayTracer(pln.propStf.isoCenter(handles.selectedBeam,:),ct.resolution,rotSourcePointBEV,rotTargetPointBEV,{0*ct.cubeHU{1}+1}); - d = [0 l .* rho{1}]; - % Calculate accumulated d sum. - vX = cumsum(d(1:end-1)); - - % this step is necessary if visualization is set to profile plot - % and another optimization is carried out - set focus on GUI - figHandles = get(0,'Children'); - idxHandle = []; - if ~isempty(figHandles) - v=version; - if str2double(v(1:3))>= 8.5 - idxHandle = strcmp({figHandles(:).Name},'matRadGUI'); - else - idxHandle = strcmp(get(figHandles,'Name'),'matRadGUI'); - end - end - figure(figHandles(idxHandle)); - - % plot physical dose - Content = get(handles.popupDisplayOption,'String'); - SelectedCube = Content{get(handles.popupDisplayOption,'Value')}; - if sum(strcmp(SelectedCube,{'physicalDose','effect','RBExDose','alpha','beta','RBE'})) > 0 - Suffix = ''; - else - Idx = find(SelectedCube == '_'); - Suffix = SelectedCube(Idx:end); - end - - mPhysDose = Result.(['physicalDose' Suffix]); - PlotHandles{1} = plot(handles.axesFig,vX,mPhysDose(ix),'color',cColor{1,1},'LineWidth',3); hold on; - PlotHandles{1,2} ='physicalDose'; - ylabel(handles.axesFig,'dose in [Gy]'); - set(handles.axesFig,'FontSize',defaultFontSize); - - % plot counter - Cnt=2; - - if isfield(Result,['RBE' Suffix]) - - %disbale specific plots - %DispInfo{6,2}=0; - %DispInfo{5,2}=0; - %DispInfo{2,2}=0; - - % generate two lines for ylabel - StringYLabel1 = '\fontsize{8}{\color{red}RBE x dose [Gy(RBE)] \color{black}dose [Gy] '; - StringYLabel2 = ''; - for i=1:1:size(DispInfo,1) - if DispInfo{i,2} && sum(strcmp(DispInfo{i,1},{['effect' Suffix],['alpha' Suffix],['beta' Suffix]})) > 0 - %physicalDose is already plotted and RBExD vs RBE is plotted later with plotyy - if ~strcmp(DispInfo{i,1},['RBExDose' Suffix]) &&... - ~strcmp(DispInfo{i,1},['RBE' Suffix]) && ... - ~strcmp(DispInfo{i,1},['physicalDose' Suffix]) - - mCube = Result.([DispInfo{i,1}]); - PlotHandles{Cnt,1} = plot(handles.axesFig,vX,mCube(ix),'color',cColor{1,Cnt},'LineWidth',3);hold on; - PlotHandles{Cnt,2} = DispInfo{i,1}; - StringYLabel2 = [StringYLabel2 ' \color{' cColor{1,Cnt} '}' DispInfo{i,1} ' [' DispInfo{i,3} ']']; - Cnt = Cnt+1; - end - end - end - StringYLabel2 = [StringYLabel2 '}']; - % always plot RBExD against RBE - mRBExDose = Result.(['RBExDose' Suffix]); - vBED = mRBExDose(ix); - mRBE = Result.(['RBE' Suffix]); - vRBE = mRBE(ix); - - % plot biological dose against RBE - [ax, PlotHandles{Cnt,1}, PlotHandles{Cnt+1,1}]=plotyy(handles.axesFig,vX,vBED,vX,vRBE,'plot');hold on; - PlotHandles{Cnt,2}='RBExDose'; - PlotHandles{Cnt+1,2}='RBE'; - - % set plotyy properties - set(get(ax(2),'Ylabel'),'String','RBE [a.u.]','FontSize',8); - ylabel({StringYLabel1;StringYLabel2}) - set(PlotHandles{Cnt,1},'Linewidth',4,'color','r'); - set(PlotHandles{Cnt+1,1},'Linewidth',3,'color','b'); - set(ax(1),'ycolor','r') - set(ax(2),'ycolor','b') - set(ax,'FontSize',8); - Cnt=Cnt+2; - end - - % asses target coordinates - tmpPrior = intmax; - tmpSize = 0; - for i=1:size(cst,1) - if strcmp(cst{i,3},'TARGET') && tmpPrior >= cst{i,5}.Priority && tmpSize 0 - AllVarNames = evalin('base','who'); - if ismember('resultGUI',AllVarNames) - Result = evalin('base','resultGUI'); - end - - if ismember('stf',AllVarNames) - stf = evalin('base','stf'); - else - stf = []; - end - - ct = evalin('base','ct'); - cst = evalin('base','cst'); - pln = evalin('base','pln'); -end - -oldView = get(axesFig3D,'View'); - -cla(axesFig3D); -%delete(allchild(axesFig3D)); - -%test = allchild(axesFig3D); - -plane = get(handles.popupPlane,'Value'); -slice = round(get(handles.sliderSlice,'Value')); -defaultFontSize = 8; - -%Check if we need to precompute the surface data -if size(cst,2) < 8 - cst = matRad_computeAllVoiSurfaces(ct,cst); - assignin('base','cst',cst); -end - -set(fig3D,'Color',0.5*[1 1 1]); -set(axesFig3D,'Color',1*[0 0 0]); - -%% Plot 3D structures -hold(axesFig3D,'on'); -if get(handles.radiobtnContour,'Value') && handles.State>0 - voiPatches = matRad_plotVois3D(axesFig3D,ct,cst,handles.VOIPlotFlag,colorcube); -end - -%% plot the CT slice -if get(handles.radiobtnCT,'Value') - window = handles.dispWindow{2,1}; %(2 for ct) - ctMap = matRad_getColormap(handles.ctColorMap,handles.cMapSize); - ctHandle = matRad_plotCtSlice3D(axesFig3D,ct,1,plane,slice,ctMap,window); -end - -%% plot the dose slice -if handles.State >= 1 && exist('Result','var') - doseMap = matRad_getColormap(handles.doseColorMap,handles.cMapSize); - doseIx = 3; - % if the selected display option doesn't exist then simply display - % the first cube of the Result struct - if ~isfield(Result,handles.SelectedDisplayOption) - CubeNames = fieldnames(Result); - handles.SelectedDisplayOption = CubeNames{1,1}; - end - - dose = Result.(handles.SelectedDisplayOption); - - % dose colorwash - if ~isempty(dose) && ~isvector(dose) - - if isempty(handles.dispWindow{doseIx,2}) - handles.dispWindow{doseIx,2} = [min(dose(:)) max(dose(:))]; % set min and max dose values - end - - if get(handles.radiobtnDose,'Value') - [doseHandle,~,handles.dispWindow{doseIx,1}] = matRad_plotDoseSlice3D(axesFig3D,ct,dose,plane,slice,handles.CutOffLevel,handles.doseOpacity,doseMap,handles.dispWindow{doseIx,1}); - end - if get(handles.radiobtnIsoDoseLines,'Value') - matRad_plotIsoDoseLines3D(axesFig3D,ct,dose,handles.IsoDose.Contours,handles.IsoDose.Levels,plane,slice,doseMap,handles.dispWindow{doseIx,1},'LineWidth',1.5); - end - end -end - -if get(handles.radiobtnPlan,'Value') - matRad_plotPlan3D(axesFig3D,pln,stf); -end - -%hLight = light('Parent',axesFig3D); -%camlight(hLight,'left'); -%lighting('gouraud'); - -xlabel(axesFig3D,'x [voxels]','FontSize',defaultFontSize) -ylabel(axesFig3D,'y [voxels]','FontSize',defaultFontSize) -zlabel(axesFig3D,'z [voxels]','FontSize',defaultFontSize) -title(axesFig3D,'matRad 3D view'); - -% set axis ratio -ratios = [1 1 1]; %[1/ct.resolution.x 1/ct.resolution.y 1/ct.resolution.z]; -ratios = ratios([2 1 3]); -set(axesFig3D,'DataAspectRatioMode','manual'); -set(axesFig3D,'DataAspectRatio',ratios./max(ratios)); - -set(axesFig3D,'Ydir','reverse'); - -set(axesFig3D,'view',oldView); - - -% --- Executes on selection change in popupPlane. -function popupPlane_Callback(hObject, ~, handles) -% hObject handle to popupPlane (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hints: contents = cellstr(get(hObject,'String')) returns popupPlane contents as cell array -% contents{get(hObject,'Value')} returns selected item from popupPlane - -% set slice slider -handles.plane = get(handles.popupPlane,'value'); -try - if handles.State > 0 - ct = evalin('base', 'ct'); - set(handles.sliderSlice,'Min',1,'Max',ct.cubeDim(handles.plane),... - 'SliderStep',[1/(ct.cubeDim(handles.plane)-1) 1/(ct.cubeDim(handles.plane)-1)]); - if handles.State < 3 - set(handles.sliderSlice,'Value',round(ct.cubeDim(handles.plane)/2)); - else - pln = evalin('base','pln'); - - if handles.plane == 1 - set(handles.sliderSlice,'Value',ceil(pln.propStf.isoCenter(1,2)/ct.resolution.x)); - elseif handles.plane == 2 - set(handles.sliderSlice,'Value',ceil(pln.propStf.isoCenter(1,1)/ct.resolution.y)); - elseif handles.plane == 3 - set(handles.sliderSlice,'Value',ceil(pln.propStf.isoCenter(1,3)/ct.resolution.z)); - end - - end - end -catch -end - -handles.rememberCurrAxes = false; -UpdatePlot(handles); -handles.rememberCurrAxes = true; -guidata(hObject,handles); - -% --- Executes on slider movement. -function sliderSlice_Callback(~, ~, handles) -% hObject handle to sliderSlice (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hints: get(hObject,'Value') returns position of slider -% get(hObject,'Min') and get(hObject,'Max') to determine range of slider -UpdatePlot(handles) - -% --- Executes on button press in radiobtnContour. -function radiobtnContour_Callback(~, ~, handles) -% hObject handle to radiobtnContour (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hint: get(hObject,'Value') returns toggle state of radiobtnContour -UpdatePlot(handles) - -% --- Executes on button press in radiobtnDose. -function radiobtnDose_Callback(~, ~, handles) -% hObject handle to radiobtnDose (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hint: get(hObject,'Value') returns toggle state of radiobtnDose -UpdatePlot(handles) - -% --- Executes on button press in radiobtnIsoDoseLines. -function radiobtnIsoDoseLines_Callback(~, ~, handles) -% hObject handle to radiobtnIsoDoseLines (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hint: get(hObject,'Value') returns toggle state of radiobtnIsoDoseLines -UpdatePlot(handles) - -% --- Executes on button press in btnOptimize. -function btnOptimize_Callback(hObject, eventdata, handles) -% hObject handle to btnOptimize (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -try - % indicate that matRad is busy - % change mouse pointer to hour glass - Figures = gcf;%findobj('type','figure'); - set(Figures, 'pointer', 'watch'); - drawnow; - % disable all active objects - InterfaceObj = findobj(Figures,'Enable','on'); - set(InterfaceObj,'Enable','off'); - % wait until the table is updated - btnTableSave_Callback([],[],handles); %We don't need it? - - - % if a critical change to the cst has been made which affects the dij matrix - if handles.DijCalcWarning == true - - choice = questdlg('Overlap priorites of OAR constraints have been edited, a new OAR VOI was added or a critical row constraint was deleted. A new Dij calculation might be necessary.', ... - 'Title','Cancel','Calculate Dij then Optimize','Optimze directly','Optimze directly'); - - switch choice - case 'Cancel' - set(Figures, 'pointer', 'arrow'); - set(InterfaceObj,'Enable','on'); - guidata(hObject,handles); - return; - case 'Calculate dij again and optimize' - handles.DijCalcWarning = false; - btnCalcDose_Callback(hObject, eventdata, handles) - case 'Optimze directly' - handles.DijCalcWarning = false; - end - end - - pln = evalin('base','pln'); - ct = evalin('base','ct'); - - % optimize - if get(handles.radiobutton3Dconf,'Value') && strcmp(handles.Modalities{get(handles.popupRadMode,'Value')},'photons') - % conformal plan if photons and 3d conformal - if ~matRad_checkForConnectedBixelRows(evalin('base','stf')) - error('disconnetced dose influence data in BEV - run dose calculation again with consistent settings'); - end - [resultGUIcurrentRun,usedOptimizer] = matRad_fluenceOptimization(matRad_collapseDij(evalin('base','dij')),evalin('base','cst'),pln); - resultGUIcurrentRun.w = resultGUIcurrentRun.w * ones(evalin('base','dij.totalNumOfBixels'),1); - resultGUIcurrentRun.wUnsequenced = resultGUIcurrentRun.w; - else - if pln.propOpt.runDAO - if ~matRad_checkForConnectedBixelRows(evalin('base','stf')) - error('disconnetced dose influence data in BEV - run dose calculation again with consistent settings'); - end - end - - [resultGUIcurrentRun,usedOptimizer] = matRad_fluenceOptimization(evalin('base','dij'),evalin('base','cst'),pln); - end - - %if resultGUI already exists then overwrite the "standard" fields - AllVarNames = evalin('base','who'); - if ismember('resultGUI',AllVarNames) - resultGUI = evalin('base','resultGUI'); - sNames = fieldnames(resultGUIcurrentRun); - oldNames = fieldnames(resultGUI); - if(length(oldNames) > length(sNames)) - for j = 1:length(oldNames) - if strfind(oldNames{j}, 'beam') - resultGUI = rmfield(resultGUI, oldNames{j}); - end - end - end - for j = 1:length(sNames) - resultGUI.(sNames{j}) = resultGUIcurrentRun.(sNames{j}); - end - else - resultGUI = resultGUIcurrentRun; - end - assignin('base','resultGUI',resultGUI); - - % set some values - if handles.plane == 1 - set(handles.sliderSlice,'Value',ceil(pln.propStf.isoCenter(1,2)/ct.resolution.x)); - elseif handles.plane == 2 - set(handles.sliderSlice,'Value',ceil(pln.propStf.isoCenter(1,1)/ct.resolution.y)); - elseif handles.plane == 3 - set(handles.sliderSlice,'Value',ceil(pln.propStf.isoCenter(1,3)/ct.resolution.z)); - end - - handles.State = 3; - handles.SelectedDisplayOptionIdx = 1; - if strcmp(pln.radiationMode,'carbon') || (strcmp(pln.radiationMode,'protons') && strcmp(pln.propOpt.bioOptimization,'const_RBExD')) - handles.SelectedDisplayOption = 'RBExDose'; - else - handles.SelectedDisplayOption = 'physicalDose'; - end - handles.selectedBeam = 1; - % check IPOPT status and return message for GUI user if no DAO or - % particles - if ~pln.propOpt.runDAO || ~strcmp(pln.radiationMode,'photons') - CheckOptimizerStatus(usedOptimizer,'Fluence') - end - -catch ME - handles = showError(handles,'OptimizeCallback: Could not optimize!',ME); - % change state from busy to normal - set(Figures, 'pointer', 'arrow'); - set(InterfaceObj,'Enable','on'); - guidata(hObject,handles); - return; -end - -% perform sequencing and DAO -try - - %% sequencing - if strcmp(pln.radiationMode,'photons') && (pln.propOpt.runSequencing || pln.propOpt.runDAO) - % resultGUI = matRad_xiaLeafSequencing(resultGUI,evalin('base','stf'),evalin('base','dij')... - % ,get(handles.editSequencingLevel,'Value')); - % resultGUI = matRad_engelLeafSequencing(resultGUI,evalin('base','stf'),evalin('base','dij')... - % ,str2double(get(handles.editSequencingLevel,'String'))); - resultGUI = matRad_siochiLeafSequencing(resultGUI,evalin('base','stf'),evalin('base','dij')... - ,str2double(get(handles.editSequencingLevel,'String'))); - - assignin('base','resultGUI',resultGUI); - end - -catch ME - handles = showError(handles,'OptimizeCallback: Could not perform sequencing',ME); - % change state from busy to normal - set(Figures, 'pointer', 'arrow'); - set(InterfaceObj,'Enable','on'); - guidata(hObject,handles); - return; -end - -try - %% DAO - if strcmp(pln.radiationMode,'photons') && pln.propOpt.runDAO - handles = showWarning(handles,['Observe: You are running direct aperture optimization' filesep 'This is experimental code that has not been thoroughly debugged - especially in combination with constrained optimization.']); - [resultGUI,usedOptimizer] = matRad_directApertureOptimization(evalin('base','dij'),evalin('base','cst'),... - resultGUI.apertureInfo,resultGUI,pln); - assignin('base','resultGUI',resultGUI); - % check IPOPT status and return message for GUI user - CheckOptimizerStatus(usedOptimizer,'DAO'); - end - - if strcmp(pln.radiationMode,'photons') && (pln.propOpt.runSequencing || pln.propOpt.runDAO) - matRad_visApertureInfo(resultGUI.apertureInfo); - end - -catch ME - handles = showError(handles,'OptimizeCallback: Could not perform direct aperture optimization',ME); - % change state from busy to normal - set(Figures, 'pointer', 'arrow'); - set(InterfaceObj,'Enable','on'); - guidata(hObject,handles); - return; -end - -% change state from busy to normal -set(Figures, 'pointer', 'arrow'); -set(InterfaceObj,'Enable','on'); -handles.dispWindow{3,1} = []; % reset dose ranges -handles.dispWindow{3,2} = []; % reset min max dose values -handles.rememberCurrAxes = false; -handles.IsoDose.Levels = 0; % ensure to use default iso dose line spacing -handles.cBarChanged = true; - -guidata(hObject,handles); -handles = updateIsoDoseLineCache(handles); -UpdateState(handles); -UpdatePlot(handles); -handles.rememberCurrAxes = true; -guidata(hObject,handles); - - -% the function CheckValidityPln checks if the provided plan is valid so -% that it can be used further on for optimization -function FlagValid = CheckValidityPln(cst) - -FlagValid = true; -%check if mean constraint is always used in combination -for i = 1:size(cst,1) - if ~isempty(cst{i,6}) - if ~isempty(strfind([cst{i,6}.type],'mean')) && isempty(strfind([cst{i,6}.type],'square')) - FlagValid = false; - warndlg('mean constraint needs to be defined in addition to a second constraint (e.g. squared deviation)'); - break - end - end -end - - -% --- Executes on selection change in popupTypeOfPlot -function popupTypeOfPlot_Callback(hObject, ~, handles) - - % intensity plot -if get(hObject,'Value') == 1 - - set(handles.sliderBeamSelection,'Enable','off') - set(handles.sliderOffset,'Enable','off') - set(handles.popupDisplayOption,'Enable','on') - set(handles.btnProfileType,'Enable','off'); - set(handles.popupPlane,'Enable','on'); - set(handles.radiobtnCT,'Enable','on'); - set(handles.radiobtnContour,'Enable','on'); - set(handles.radiobtnDose,'Enable','on'); - set(handles.radiobtnIsoDoseLines,'Enable','on'); - set(handles.radiobtnIsoDoseLinesLabels,'Enable','on'); - set(handles.sliderSlice,'Enable','on'); - -% profile plot -elseif get(hObject,'Value') == 2 - - if handles.State > 0 - if length(parseStringAsNum(get(handles.editGantryAngle,'String'),true)) > 1 - - set(handles.sliderBeamSelection,'Enable','on'); - handles.selectedBeam = 1; - pln = evalin('base','pln'); - set(handles.sliderBeamSelection,'Min',handles.selectedBeam,'Max',pln.propStf.numOfBeams,... - 'Value',handles.selectedBeam,... - 'SliderStep',[1/(pln.propStf.numOfBeams-1) 1/(pln.propStf.numOfBeams-1)],... - 'Enable','on'); - - else - handles.selectedBeam = 1; - end - - handles.profileOffset = get(handles.sliderOffset,'Value'); - - vMinMax = [-100 100]; - vRange = sum(abs(vMinMax)); - - ct = evalin('base','ct'); - if strcmp(get(handles.btnProfileType,'String'),'lateral') - SliderStep = vRange/ct.resolution.x; - else - SliderStep = vRange/ct.resolution.y; - end - - set(handles.sliderOffset,'Min',vMinMax(1),'Max',vMinMax(2),... - 'Value',handles.profileOffset,... - 'SliderStep',[1/SliderStep 1/SliderStep],... - 'Enable','on'); - end - - - set(handles.popupDisplayOption,'Enable','on'); - set(handles.btnProfileType,'Enable','on'); - set(handles.popupPlane,'Enable','off'); - set(handles.radiobtnCT,'Enable','off'); - set(handles.radiobtnContour,'Enable','off'); - set(handles.radiobtnDose,'Enable','off'); - set(handles.radiobtnIsoDoseLines,'Enable','off'); - set(handles.sliderSlice,'Enable','off'); - set(handles.radiobtnIsoDoseLinesLabels,'Enable','off'); - - - set(handles.btnProfileType,'Enable','on') - - if strcmp(get(handles.btnProfileType,'String'),'lateral') - handles.ProfileType = 'longitudinal'; - else - handles.ProfileType = 'lateral'; - end - -end - -handles.cBarChanged = true; - -handles.rememberCurrAxes = false; -cla(handles.axesFig,'reset'); -UpdatePlot(handles); -handles.rememberCurrAxes = true; -guidata(hObject, handles); - -% --- Executes on selection change in popupDisplayOption. -function popupDisplayOption_Callback(hObject, ~, handles) -content = get(hObject,'String'); -handles.SelectedDisplayOption = content{get(hObject,'Value'),1}; -handles.SelectedDisplayOptionIdx = get(hObject,'Value'); -%handles.dispWindow{3,1} = []; handles.dispWindow{3,2} = []; - -if ~isfield(handles,'colormapLocked') || ~handles.colormapLocked - handles.dispWindow{3,1} = []; handles.dispWindow{3,2} = []; -end - -handles = updateIsoDoseLineCache(handles); -handles.cBarChanged = true; -guidata(hObject, handles); -UpdatePlot(handles); -guidata(hObject, handles); - -% --- Executes on slider movement. -function sliderBeamSelection_Callback(hObject, ~, handles) -% hObject handle to sliderBeamSelection (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hints: get(hObject,'Value') returns position of slider -% get(hObject,'Min') and get(hObject,'Max') to determine range of slider - - -handles.selectedBeam = round(get(hObject,'Value')); -set(hObject, 'Value', handles.selectedBeam); -handles.rememberCurrAxes = false; -UpdatePlot(handles); -handles.rememberCurrAxes = true; -guidata(hObject,handles); - -% --- Executes on button press in btnProfileType. -function btnProfileType_Callback(hObject, ~, handles) -% hObject handle to btnProfileType (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) -if strcmp(get(hObject,'Enable') ,'on') - if strcmp(handles.ProfileType,'lateral') - handles.ProfileType = 'longitudinal'; - set(hObject,'String','lateral'); - else - handles.ProfileType = 'lateral'; - set(hObject,'String','longitudinal'); - end - - handles.rememberCurrAxes = false; - UpdatePlot(handles); - handles.rememberCurrAxes = true; - - guidata(hObject, handles); - -end - - - -function Flag = getCstTable (handles) - -data = get(handles.uiTable,'Data'); -OldCst = evalin('base','cst'); -NewCst=[]; -Cnt=1; -FlagValidParameters = true; - -%% generate new cst from GUI -for i = 1:size(OldCst,1) - CntObjF = 1; - FlagFound = false; - for j = 1:size(data,1) - - if strcmp(OldCst{i,2},data{j,1}) - FlagFound = true; - - if CntObjF == 1 - %VOI - if isempty(data{j,1}) || ~isempty(strfind(data{j,1}, 'Select')) - FlagValidParameters=false; - else - NewCst{Cnt,1}=data{j,1}; - end - %VOI Type - if isempty(data{j,2})|| ~isempty(strfind(data{j,2}, 'Select')) - FlagValidParameters=false; - else - NewCst{Cnt,2}=data{j,2}; - end - %Priority - if isempty(data{j,3}) - FlagValidParameters=false; - else - NewCst{Cnt,3}=data{j,3}; - end - end - - % Obj Func / constraint - if isempty(data{j,4}) ||~isempty(strfind(data{j,4}, 'Select')) - FlagValidParameters=false; - else - NewCst{Cnt,4}(CntObjF,1).type = data{j,4}; - end - - % get further parameter - if FlagValidParameters - - NewCst{Cnt,4}(CntObjF,1).dose = data{j,6}; - NewCst{Cnt,4}(CntObjF,1).penalty = data{j,5}; - NewCst{Cnt,4}(CntObjF,1).EUD = data{j,7}; - NewCst{Cnt,4}(CntObjF,1).volume = data{j,8}; - NewCst{Cnt,4}(CntObjF,1).robustness = data{j,9}; - - end - - CntObjF = CntObjF+1; - - end - - end - - if FlagFound == true - Cnt = Cnt +1; - end - -end - -if FlagValidParameters - - for m=1:size(OldCst,1) - VOIexist = OldCst(m,2); - boolChanged = false; - - for n = 1:size(NewCst,1) - - VOIGUI = NewCst(n,1); - - if strcmp(VOIexist,VOIGUI) - % overite existing objectives - boolChanged = true; - OldCst(m,6) = NewCst(n,4); - OldCst(m,3) = NewCst(n,2); - OldCst{m,5}.Priority = NewCst{n,3}; - break; - end - end - - if ~boolChanged - OldCst{m,6}=[]; - end - - end - assignin('base','cst',OldCst); - Flag = true; - -else - warndlg('not all values are set - cannot start dose calculation'); - Flag = false; -end - - -% --- Executes on button press in btnuiTableAdd. -function btnuiTableAdd_Callback(hObject, ~, handles) -% hObject handle to btnuiTableAdd (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) -data = get(handles.uiTable, 'data'); -sEnd = size(data,1); -data{sEnd+1,1} = 'Select VOI'; -data{sEnd+1,2} = 'Select VOI Type'; -data{sEnd+1,4} = 'Select obj func/constraint'; -data{sEnd+1,9} = 'none'; - -set(handles.uiTable,'data',data); - -%handles.State=1; -guidata(hObject,handles); -UpdateState(handles); - - -% --- Executes on button press in btnuiTableDel. -function btnuiTableDel_Callback(hObject, eventdata, handles) -% hObject handle to btnuiTableDel (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) -data = get(handles.uiTable, 'data'); -Index = get(handles.uiTable,'UserData'); -mask = (1:size(data,1))'; -mask(Index(:,1))=[]; -cst = evalin('base','cst'); -% if all rows have been deleted or a target voi was removed -if size(data,1)==1 || strcmp(data(Index(1),2),'TARGET') - handles.State=1; -end - -try - Idx = find(strcmp(cst(:,2),data(Index(1),1))); - % if OAR was removed then show a warning - if strcmp(data(Index(1),2),'OAR') && length(cst{Idx,6})<=1 - handles.DijCalcWarning =true; - end -catch -end -data=data(mask,:); -set(handles.uiTable,'data',data); -guidata(hObject,handles); -UpdateState(handles); -btnTableSave_Callback(hObject, eventdata, handles); - -% --- Executes when selected cell(s) is changed in uiTable. -function uiTable_CellSelectionCallback(hObject, eventdata, ~) -% hObject handle to uiTable (see GCBO) -% eventdata structure with the following fields (see MATLAB.UI.CONTROL.TABLE) -% Indices: row and column indices of the cell(s) currently selecteds -% handles structure with handles and user data (see GUIDATA) -index = eventdata.Indices; - if any(index) %loop necessary to surpress unimportant errors. - set(hObject,'UserData',index); - end - - -% --- Executes when entered data in editable cell(s) in uiTable. -function uiTable_CellEditCallback(hObject, eventdata, handles) -% hObject handle to uiTable (see GCBO) -% eventdata structure with the following fields (see MATLAB.UI.CONTROL.TABLE) -% Indices: row and column indices of the cell(s) edited -% PreviousData: previous data for the cell(s) edited -% EditData: string(s) entered by the user -% NewData: EditData or its converted form set on the Data property. Empty if Data was not changed -% Error: error string when failed to convert EditData to appropriate value for Data -% handles structure with handles and user data (see GUIDATA) - -Placeholder = NaN; -PlaceholderRob = 'none'; - -% get table data and current index of cell -if isempty(eventdata) - data = get(handles.uiTable,'Data'); - Index = get(handles.uiTable,'UserData'); - - if ~isempty(Index) && size(Index,1)==1 - % if this callback was invoked by calculate dij button, eventdata is empty - % and needs to be set manually - try - % if row gots deleted then index is pointing to non existing - % data - if size(data,1) check if objective function still makes sense -if eventdata.Indices(2) == 2 - - if strcmp(eventdata.NewData,'OAR') - - if sum(strcmp({'square deviation','square underdosing'},data{eventdata.Indices(1),4}))>0 - data{eventdata.Indices(1),4} = 'square overdosing'; - end - - else - - if sum(strcmp({'EUD','mean'},data{eventdata.Indices(1),4}))>0 - data{eventdata.Indices(1),4} = 'square deviation'; - end - - end -end -%% if objective function was changed -> check if VOI Type still makes sense -if eventdata.Indices(2) == 4 - ObjFunction = eventdata.NewData; -else - ObjFunction = data{eventdata.Indices(1),4}; -end - - -if eventdata.Indices(2) == 4 - if sum(strcmp(eventdata.NewData,{'square deviation','square underdosing','min dose constraint',... - 'min mean dose constraint','min DVH constraint','min DVH objective'})) > 0 - - if strcmp('OAR',data{eventdata.Indices(1),2}) - data{eventdata.Indices(1),4} = 'square overdosing'; - ObjFunction = 'square overdosing'; - if isnan(data{eventdata.Indices(1),5}) - data{eventdata.Indices(1),5} = 1; - end - end - - tmpDose = parseStringAsNum(data{eventdata.Indices(1),6},true); - if numel(tmpDose) == 2 - data{eventdata.Indices(1),6} = num2str(tmpDose(1)); - end - - elseif strcmp(eventdata.NewData,'mean') - - if strcmp('TARGET',data{eventdata.Indices(1),2}) - data{eventdata.Indices(1),4} = 'square deviation'; - end - - end -end - -%% set fields to NaN according to objective function - -if sum(strcmp(ObjFunction, {'square underdosing','square overdosing','square deviation'})) > 0 - - for k = [5 6] - if isnan(data{eventdata.Indices(1),k}) - data{eventdata.Indices(1),k} = 1; - end - end - data{eventdata.Indices(1),7} = Placeholder; - data{eventdata.Indices(1),8} = Placeholder; - data{eventdata.Indices(1),9} = PlaceholderRob; - -elseif strcmp(ObjFunction,'mean') - - if isnan(data{eventdata.Indices(1),5}) - data{eventdata.Indices(1),5} = 1; - end - data{eventdata.Indices(1),6} = Placeholder; - data{eventdata.Indices(1),7} = Placeholder; - data{eventdata.Indices(1),8} = Placeholder; - data{eventdata.Indices(1),9} = PlaceholderRob; - -elseif strcmp(ObjFunction,'EUD') - - for k = [5 7] - if isnan(data{eventdata.Indices(1),k}) - data{eventdata.Indices(1),k} = 1; - end - end - data{eventdata.Indices(1),6} = Placeholder; - data{eventdata.Indices(1),8} = Placeholder; - data{eventdata.Indices(1),9} = PlaceholderRob; - -elseif sum(strcmp(ObjFunction,{'min dose constraint','max dose constraint'... - 'min mean dose constraint','max mean dose constraint'}))> 0 - - if isnan(data{eventdata.Indices(1),6}) - data{eventdata.Indices(1),6} = 1; - end - data{eventdata.Indices(1),5} = Placeholder; - data{eventdata.Indices(1),7} = Placeholder; - data{eventdata.Indices(1),8} = Placeholder; - data{eventdata.Indices(1),9} = PlaceholderRob; - -elseif sum(strcmp(ObjFunction,{'min EUD constraint','max EUD constraint'}) ) > 0 - - if isnan(data{eventdata.Indices(1),7}) - data{eventdata.Indices(1),7} = 1; - end - data{eventdata.Indices(1),5} = Placeholder; - data{eventdata.Indices(1),6} = Placeholder; - data{eventdata.Indices(1),8} = Placeholder; - data{eventdata.Indices(1),9} = PlaceholderRob; - -elseif sum(strcmp(ObjFunction,{'min DVH constraint','max DVH constraint'}) ) > 0 - - for k = [6 8] - if isnan(data{eventdata.Indices(1),k}) - data{eventdata.Indices(1),k} = 1; - end - end - data{eventdata.Indices(1),5} = Placeholder; - data{eventdata.Indices(1),7} = Placeholder; - data{eventdata.Indices(1),9} = PlaceholderRob; - -elseif sum(strcmp(ObjFunction,{'min DVH objective','max DVH objective'}) ) > 0 - - for k = [5 6 8] - if isnan(data{eventdata.Indices(1),k}) - data{eventdata.Indices(1),k} = 1; - end - end - data{eventdata.Indices(1),7} = Placeholder; - data{eventdata.Indices(1),9} = PlaceholderRob; - -end - -%% check if input is a valid -%check if overlap, penalty and and parameters are numbers -if (eventdata.Indices(2) == 3 || eventdata.Indices(2) == 5 || eventdata.Indices(2) == 6 || eventdata.Indices(2) == 7 || eventdata.Indices(2) == 8) ... - && ~isempty(eventdata.NewData) - if CheckValidity(eventdata.NewData) == false - data{eventdata.Indices(1),eventdata.Indices(2)} = eventdata.PreviousData; - end -end - - -%% if VOI was changed then change VOI type and overlap according to new VOI -if eventdata.Indices(2) == 1 && eventdata.Indices(1) == size(data,1) - for i = 1:size(data,1) - if strcmp(eventdata.NewData,data{i,1}) - data{eventdata.Indices(1),2}=data{i,2}; - data{eventdata.Indices(1),3}=data{i,3}; - end - end - -end - -%% set VOI type and priority according to existing definitions -for i=1:size(data,1) - if i~=eventdata.Indices(1) && strcmp(data(i,1),data(eventdata.Indices(1))) - data{i,2} = data{eventdata.Indices(1),2}; - data{i,3} = data{eventdata.Indices(1),3}; - end -end - - -if isnan(eventdata.NewData) - data{eventdata.Indices(1),eventdata.Indices(2)} = eventdata.PreviousData; -end - - -set(handles.txtInfo,'String','plan changed'); -set(handles.uiTable,'data',data); -guidata(hObject, handles); -UpdateState(handles); - -% enables/ disables buttons according to the current state -function UpdateState(handles) - -if handles.State > 0 - pln = evalin('base','pln'); - - if strcmp(pln.radiationMode,'carbon') - set(handles.popMenuBioOpt,'Enable','on'); - set(handles.btnSetTissue,'Enable','on'); - elseif strcmp(pln.radiationMode,'protons') - set(handles.popMenuBioOpt,'Enable','on'); - set(handles.btnSetTissue,'Enable','off'); - else - set(handles.popMenuBioOpt,'Enable','off'); - set(handles.btnSetTissue,'Enable','off'); - end - - cMapControls = allchild(handles.uipanel_colormapOptions); - for runHandles = cMapControls - set(runHandles,'Enable','on'); - end -end - -if handles.cubeHUavailable - cMapOptionsSelectList = {'None','CT (HU)','Result (i.e. dose)'}; - set(handles.popupmenu_windowPreset,'Visible','on'); - set(handles.text_windowPreset,'String','Window Preset'); -else - cMapOptionsSelectList = {'None','CT (ED)','Result (i.e. dose)'}; - set(handles.popupmenu_windowPreset,'Visible','off'); - set(handles.text_windowPreset,'String','No available Window Presets'); -end -handles.cBarChanged = true; - - switch handles.State - - case 0 - - set(handles.txtInfo,'String','no data loaded'); - set(handles.btnCalcDose,'Enable','off'); - set(handles.btnOptimize ,'Enable','off'); - set(handles.pushbutton_recalc,'Enable','off'); - set(handles.btnSaveToGUI,'Enable','off'); - set(handles.btnDVH,'Enable','off'); - set(handles.importDoseButton,'Enable','off'); - set(handles.btn_export,'Enable','off'); - set(handles.btn3Dview,'Enable','off'); - - cMapControls = allchild(handles.uipanel_colormapOptions); - for runHandles = cMapControls - set(runHandles,'Enable','off'); - end - - set(handles.popupmenu_chooseColorData,'String',cMapOptionsSelectList{1}) - set(handles.popupmenu_chooseColorData,'Value',1); - - case 1 - - set(handles.txtInfo,'String','ready for dose calculation'); - set(handles.btnCalcDose,'Enable','on'); - set(handles.btnOptimize ,'Enable','off'); - set(handles.pushbutton_recalc,'Enable','off'); - set(handles.btnSaveToGUI,'Enable','off'); - set(handles.btnDVH,'Enable','off'); - set(handles.importDoseButton,'Enable','off'); - set(handles.btn_export,'Enable','on'); - set(handles.btn3Dview,'Enable','on'); - - set(handles.popupmenu_chooseColorData,'String',cMapOptionsSelectList(1:2)) - set(handles.popupmenu_chooseColorData,'Value',2); - AllVarNames = evalin('base','who'); - if ~isempty(AllVarNames) - if ismember('resultGUI',AllVarNames) - set(handles.pushbutton_recalc,'Enable','on'); - set(handles.btnSaveToGUI,'Enable','on'); - set(handles.btnDVH,'Enable','on'); - set(handles.popupmenu_chooseColorData,'String',cMapOptionsSelectList(1:3)) - set(handles.popupmenu_chooseColorData,'Value',3); - end - end - - case 2 - - set(handles.txtInfo,'String','ready for optimization'); - set(handles.btnCalcDose,'Enable','on'); - set(handles.btnOptimize ,'Enable','on'); - set(handles.pushbutton_recalc,'Enable','off'); - set(handles.btnSaveToGUI,'Enable','off'); - set(handles.btnDVH,'Enable','off'); - set(handles.importDoseButton,'Enable','off'); - set(handles.btn_export,'Enable','on'); - set(handles.btn3Dview,'Enable','on'); - set(handles.popupmenu_chooseColorData,'String',cMapOptionsSelectList(1:2)) - set(handles.popupmenu_chooseColorData,'Value',2); - AllVarNames = evalin('base','who'); - - if ~isempty(AllVarNames) - if ismember('resultGUI',AllVarNames) - set(handles.pushbutton_recalc,'Enable','on'); - set(handles.btnSaveToGUI,'Enable','on'); - set(handles.btnDVH,'Enable','on'); - set(handles.popupmenu_chooseColorData,'String',cMapOptionsSelectList(1:3)) - set(handles.popupmenu_chooseColorData,'Value',3); - end - end - - case 3 - set(handles.txtInfo,'String','plan is optimized'); - set(handles.btnCalcDose,'Enable','on'); - set(handles.btnOptimize ,'Enable','on'); - set(handles.pushbutton_recalc,'Enable','on'); - set(handles.btnSaveToGUI,'Enable','on'); - set(handles.btnDVH,'Enable','on'); - set(handles.btn_export,'Enable','on'); - set(handles.btn3Dview,'Enable','on'); - % resultGUI struct needs to be available to import dose - % otherwise inconsistent states can be achieved - set(handles.importDoseButton,'Enable','on'); - set(handles.popupmenu_chooseColorData,'String',cMapOptionsSelectList(1:3)) - set(handles.popupmenu_chooseColorData,'Value',3); - end - -guidata(handles.figure1,handles); - -% fill GUI elements with plan information -function setPln(handles) -pln = evalin('base','pln'); -% sanity check of isoCenter -if size(pln.propStf.isoCenter,1) ~= pln.propStf.numOfBeams && size(pln.propStf.isoCenter,1) == 1 - pln.propStf.isoCenter = ones(pln.propStf.numOfBeams,1) * pln.propStf.isoCenter(1,:); -elseif size(pln.propStf.isoCenter,1) ~= pln.propStf.numOfBeams && size(pln.propStf.isoCenter,1) ~= 1 - error('Isocenter in plan file are incosistent.'); -end -set(handles.editBixelWidth,'String',num2str(pln.propStf.bixelWidth)); -set(handles.editFraction,'String',num2str(pln.numOfFractions)); - -if isfield(pln.propStf,'isoCenter') - if size(unique(pln.propStf.isoCenter,'rows'),1) == 1 - set(handles.editIsoCenter,'String',regexprep(num2str((round(pln.propStf.isoCenter(1,:)*10))./10), '\s+', ' ')); - set(handles.editIsoCenter,'Enable','on'); - set(handles.checkIsoCenter,'Enable','on'); - else - set(handles.editIsoCenter,'String','multiple isoCenter'); - set(handles.editIsoCenter,'Enable','off'); - set(handles.checkIsoCenter,'Value',0); - set(handles.checkIsoCenter,'Enable','off'); - end -end -set(handles.editGantryAngle,'String',num2str((pln.propStf.gantryAngles))); -set(handles.editCouchAngle,'String',num2str((pln.propStf.couchAngles))); -set(handles.popupRadMode,'Value',find(strcmp(get(handles.popupRadMode,'String'),pln.radiationMode))); -set(handles.popUpMachine,'Value',find(strcmp(get(handles.popUpMachine,'String'),pln.machine))); - -if ~strcmp(pln.propOpt.bioOptimization,'none') - set(handles.popMenuBioOpt,'Enable','on'); - contentPopUp = get(handles.popMenuBioOpt,'String'); - ix = find(strcmp(pln.propOpt.bioOptimization,contentPopUp)); - set(handles.popMenuBioOpt,'Value',ix); - set(handles.btnSetTissue,'Enable','on'); -else - set(handles.popMenuBioOpt,'Enable','off'); - set(handles.btnSetTissue,'Enable','off'); -end -%% enable sequencing and DAO button if radiation mode is set to photons -if strcmp(pln.radiationMode,'photons') && pln.propOpt.runSequencing - set(handles.btnRunSequencing,'Enable','on'); - set(handles.btnRunSequencing,'Value',1); -elseif strcmp(pln.radiationMode,'photons') && ~pln.propOpt.runSequencing - set(handles.btnRunSequencing,'Enable','on'); - set(handles.btnRunSequencing,'Value',0); -else - set(handles.btnRunSequencing,'Enable','off'); -end -%% enable DAO button if radiation mode is set to photons -if strcmp(pln.radiationMode,'photons') && pln.propOpt.runDAO - set(handles.btnRunDAO,'Enable','on'); - set(handles.btnRunDAO,'Value',1); -elseif strcmp(pln.radiationMode,'photons') && ~pln.propOpt.runDAO - set(handles.btnRunDAO,'Enable','on'); - set(handles.btnRunDAO,'Value',0); -else - set(handles.btnRunDAO,'Enable','off'); -end -%% enable stratification level input if radiation mode is set to photons -if strcmp(pln.radiationMode,'photons') - set(handles.txtSequencing,'Enable','on'); - set(handles.radiobutton3Dconf,'Enable','on'); - set(handles.editSequencingLevel,'Enable','on'); -else - set(handles.txtSequencing,'Enable','off'); - set(handles.radiobutton3Dconf,'Enable','off'); - set(handles.editSequencingLevel,'Enable','off'); -end - -% --- Executes on button press in btnTableSave. -function btnTableSave_Callback(~, ~, handles) -% hObject handle to btnTableSave (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -%getCstTable(handles); -if get(handles.checkIsoCenter,'Value') - pln = evalin('base','pln'); - pln.propStf.isoCenter = ones(pln.propStf.numOfBeams,1) * matRad_getIsoCenter(evalin('base','cst'),evalin('base','ct')); - set(handles.editIsoCenter,'String',regexprep(num2str((round(pln.propStf.isoCenter(1,:) * 10))./10), '\s+', ' ')); - assignin('base','pln',pln); -end -getPlnFromGUI(handles); - -% --- Executes on selection change in listBoxCmd. -function listBoxCmd_Callback(hObject, ~, ~) -numLines = size(get(hObject,'String'),1); -set(hObject, 'ListboxTop', numLines); - -% --- Executes on slider movement. -function sliderOffset_Callback(hObject, ~, handles) -handles.profileOffset = get(hObject,'Value'); -UpdatePlot(handles); - - -%% HELPER FUNCTIONS -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -% check validity of input for cst -function flagValidity = CheckValidity(Val) - -flagValidity = true; - -if ischar(Val) - Val = str2num(Val); -end - -if length(Val) > 2 - warndlg('invalid input!'); -end - -if isempty(Val) - warndlg('Input not a number!'); - flagValidity = false; -end - -if any(Val < 0) - warndlg('Input not a positive number!'); - flagValidity = false; -end - -% return IPOPT status as message box -function CheckOptimizerStatus(usedOptimizer,OptCase) - -[statusmsg,statusflag] = usedOptimizer.GetStatus(); - -if statusflag == 0 || statusflag == 1 - status = 'none'; -else - status = 'warn'; -end - -msgbox(['Optimizer finished with status ' num2str(statusflag) ' (' statusmsg ')'],'Optimizer',status,'modal'); - -% get pln file form GUI -function getPlnFromGUI(handles) - -% evalin pln (if existant) in order to decide whether isoCenter should be calculated -% automatically -if evalin('base','exist(''pln'',''var'')') - pln = evalin('base','pln'); -end - -pln.propStf.bixelWidth = parseStringAsNum(get(handles.editBixelWidth,'String'),false); % [mm] / also corresponds to lateral spot spacing for particles -pln.propStf.gantryAngles = parseStringAsNum(get(handles.editGantryAngle,'String'),true); % [???] -pln.propStf.couchAngles = parseStringAsNum(get(handles.editCouchAngle,'String'),true); % [???] -pln.propStf.numOfBeams = numel(pln.propStf.gantryAngles); -try - ct = evalin('base','ct'); - pln.numOfVoxels = prod(ct.cubeDim); - pln.voxelDimensions = ct.cubeDim; -catch -end -pln.numOfFractions = parseStringAsNum(get(handles.editFraction,'String'),false); -contents = get(handles.popupRadMode,'String'); -pln.radiationMode = contents{get(handles.popupRadMode,'Value')}; % either photons / protons / carbon -contents = get(handles.popUpMachine,'String'); -pln.machine = contents{get(handles.popUpMachine,'Value')}; - -if (~strcmp(pln.radiationMode,'photons')) - contentBioOpt = get(handles.popMenuBioOpt,'String'); - pln.propOpt.bioOptimization = contentBioOpt{get(handles.popMenuBioOpt,'Value'),:}; -else - pln.propOpt.bioOptimization = 'none'; -end - -pln.propOpt.runSequencing = logical(get(handles.btnRunSequencing,'Value')); -pln.propOpt.runDAO = logical(get(handles.btnRunDAO,'Value')); - -try - cst = evalin('base','cst'); - if (sum(strcmp('TARGET',cst(:,3))) > 0 && get(handles.checkIsoCenter,'Value')) || ... - (sum(strcmp('TARGET',cst(:,3))) > 0 && ~isfield(pln.propStf,'isoCenter')) - pln.propStf.isoCenter = ones(pln.propStf.numOfBeams,1) * matRad_getIsoCenter(cst,ct); - set(handles.checkIsoCenter,'Value',1); - else - if ~strcmp(get(handles.editIsoCenter,'String'),'multiple isoCenter') - pln.propStf.isoCenter = ones(pln.propStf.numOfBeams,1) * str2num(get(handles.editIsoCenter,'String')); - end - end -catch - warning('couldnt set isocenter in getPln function') -end - -handles.pln = pln; -assignin('base','pln',pln); - -% parsing a string as number array -function number = parseStringAsNum(stringIn,isVector) -if isnumeric(stringIn) - number = stringIn; -else - number = str2num(stringIn); - if isempty(number) || length(number) > 1 && ~isVector - warndlg(['could not parse all parameters (pln, optimization parameter)']); - number = NaN; - elseif isVector && iscolumn(number) - number = number'; - end -end - - -% show error -function handles = showError(handles,Message,ME) - -if nargin == 3 - %Add exception message - if isfield(handles,'devMode') && handles.devMode - meType = 'extended'; - else - meType = 'basic'; - end - Message = {Message,ME.getReport(meType,'hyperlinks','off')}; -end - -if isfield(handles,'ErrorDlg') - if ishandle(handles.ErrorDlg) - close(handles.ErrorDlg); - end -end -handles.ErrorDlg = errordlg(Message); - -% show warning -function handles = showWarning(handles,Message,ME) - -if nargin == 3 - %Add exception message - if isfield(handles,'devMode') && handles.devMode - meType = 'extended'; - else - meType = 'basic'; - end - Message = {Message,ME.getReport(meType,'hyperlinks','off')}; -end - -if isfield(handles,'WarnDlg') - if ishandle(handles.WarnDlg) - close(handles.WarnDlg); - end -end -handles.WarnDlg = warndlg(Message); - -% check for valid machine data input file -function flag = checkRadiationComposition(handles) -flag = true; -contents = cellstr(get(handles.popUpMachine,'String')); -Machine = contents{get(handles.popUpMachine,'Value')}; -contents = cellstr(get(handles.popupRadMode,'String')); -radMod = contents{get(handles.popupRadMode,'Value')}; - -if isdeployed - FoundFile = dir([ctfroot filesep 'matRad' filesep radMod '_' Machine '.mat']); -else - FoundFile = dir([fileparts(mfilename('fullpath')) filesep radMod '_' Machine '.mat']); -end -if isempty(FoundFile) - warndlg(['No base data available for machine: ' Machine]); - flag = false; -end - -function matRadScrollWheelFcn(src,event) - -% get handles -handles = guidata(src); - -% compute new slice -currSlice = round(get(handles.sliderSlice,'Value')); -newSlice = currSlice - event.VerticalScrollCount; - -% project to allowed set -newSlice = min(newSlice,get(handles.sliderSlice,'Max')); -newSlice = max(newSlice,get(handles.sliderSlice,'Min')); - -% update slider -set(handles.sliderSlice,'Value',newSlice); - -% update handles object -guidata(src,handles); - -% update plot -UpdatePlot(handles); - - - - -%% CALLBACKS -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -% button: show DVH -function btnDVH_Callback(~, ~, handles) - -resultGUI = evalin('base','resultGUI'); -Content = get(handles.popupDisplayOption,'String'); -SelectedCube = Content{get(handles.popupDisplayOption,'Value')}; - -pln = evalin('base','pln'); -resultGUI_SelectedCube.physicalDose = resultGUI.(SelectedCube); - -if ~strcmp(pln.propOpt.bioOptimization,'none') - - %check if one of the default fields is selected - if sum(strcmp(SelectedCube,{'physicalDose','effect','RBE,','RBExDose','alpha','beta'})) > 0 - resultGUI_SelectedCube.physicalDose = resultGUI.physicalDose; - resultGUI_SelectedCube.RBExDose = resultGUI.RBExDose; - else - Idx = find(SelectedCube == '_'); - SelectedSuffix = SelectedCube(Idx(1):end); - resultGUI_SelectedCube.physicalDose = resultGUI.(['physicalDose' SelectedSuffix]); - resultGUI_SelectedCube.RBExDose = resultGUI.(['RBExDose' SelectedSuffix]); - end -end - -%adapt visibilty -cst = evalin('base','cst'); -for i = 1:size(cst,1) - cst{i,5}.Visible = handles.VOIPlotFlag(i); -end - -matRad_indicatorWrapper(cst,pln,resultGUI_SelectedCube); - -assignin('base','cst',cst); - -% radio button: plot isolines labels -function radiobtnIsoDoseLinesLabels_Callback(~, ~, handles) -UpdatePlot(handles); - -% button: refresh -function btnRefresh_Callback(hObject, ~, handles) - -handles = resetGUI(hObject, handles); - -%% parse variables from base workspace -AllVarNames = evalin('base','who'); -handles.AllVarNames = AllVarNames; -try - if ismember('ct',AllVarNames) && ismember('cst',AllVarNames) - ct = evalin('base','ct'); - cst = evalin('base','cst'); - %cst = setCstTable(handles,cst); - generateCstTable(handles,cst); - handles.State = 1; - cst = matRad_computeVoiContoursWrapper(cst,ct); - assignin('base','cst',cst); - elseif ismember('ct',AllVarNames) && ~ismember('cst',AllVarNames) - handles = showError(handles,'GUI OpeningFunc: could not find cst file'); - elseif ~ismember('ct',AllVarNames) && ismember('cst',AllVarNames) - handles = showError(handles,'GUI OpeningFunc: could not find ct file'); - end -catch - handles = showError(handles,'GUI OpeningFunc: Could not load ct and cst file'); -end - -if ismember('ct',AllVarNames) && ismember('cst',AllVarNames) - handles = reloadGUI(hObject, handles, ct, cst); -else - handles = reloadGUI(hObject, handles); -end -guidata(hObject, handles); - - -% text box: # fractions -function editFraction_Callback(hObject, ~, handles) -getPlnFromGUI(handles); -guidata(hObject,handles); - -% text box: stratification levels -function editSequencingLevel_Callback(~, ~, ~) - -% text box: isoCenter in [mm] -function editIsoCenter_Callback(hObject, ~, handles) - -pln = evalin('base','pln'); -tmpIsoCenter = str2num(get(hObject,'String')); - -if length(tmpIsoCenter) == 3 - if sum(any(unique(pln.propStf.isoCenter,'rows')~=tmpIsoCenter)) - pln.propStf.isoCenter = ones(pln.propStf.numOfBeams,1)*tmpIsoCenter; - handles.State = 1; - UpdateState(handles); - end -else - handles = showError(handles,'EditIsoCenterCallback: Could not set iso center'); -end - -assignin('base','pln',pln); -guidata(hObject,handles); - -% check box: iso center auto -function checkIsoCenter_Callback(hObject, ~, handles) - -W = evalin('base','whos'); -doesPlnExist = ismember('pln',{W(:).name}); - -if get(hObject,'Value') && doesPlnExist - pln = evalin('base','pln'); - if ~isfield(pln.propStf,'isoCenter') - pln.propStf.isoCenter = NaN; - end - tmpIsoCenter = matRad_getIsoCenter(evalin('base','cst'),evalin('base','ct')); - if ~isequal(tmpIsoCenter,pln.propStf.isoCenter) - pln.propStf.isoCenter = ones(pln.propStf.numOfBeams,1)*tmpIsoCenter; - handles.State = 1; - UpdateState(handles); - end - set(handles.editIsoCenter,'String',regexprep(num2str((round(tmpIsoCenter*10))./10), '\s+', ' ')); - set(handles.editIsoCenter,'Enable','off') - assignin('base','pln',pln); -else - set(handles.editIsoCenter,'Enable','on') -end - -% radio button: run sequencing -function btnRunSequencing_Callback(~, ~, handles) -getPlnFromGUI(handles); - -% radio button: run direct aperture optimization -function btnRunDAO_Callback(~, ~, handles) -getPlnFromGUI(handles); - -% button: set iso dose levels -function btnSetIsoDoseLevels_Callback(hObject, ~, handles) -prompt = {['Enter iso dose levels in [Gy]. Enter space-separated numbers, e.g. 1.5 2 3 4.98. Enter 0 to use default values']}; -if isequal(handles.IsoDose.Levels,0) || ~isvector(handles.IsoDose.Levels) || any(~isnumeric(handles.IsoDose.Levels)) || any(isnan(handles.IsoDose.Levels)) - defaultLine = {'1 2 3 '}; -else - if isrow(handles.IsoDose.Levels) - defaultLine = cellstr(num2str(handles.IsoDose.Levels,'%.2g ')); - else - defaultLine = cellstr(num2str(handles.IsoDose.Levels','%.2g ')); - end -end - -try - Input = inputdlg(prompt,'Set iso dose levels ', [1 70],defaultLine); - if ~isempty(Input) - handles.IsoDose.Levels = (sort(str2num(Input{1}))); - if length(handles.IsoDose.Levels) == 1 && (handles.IsoDose.Levels(1) ~= 0) - handles.IsoDose.Levels = [handles.IsoDose.Levels handles.IsoDose.Levels]; - end - handles.IsoDose.NewIsoDoseFlag = true; - end -catch - warning('Couldnt parse iso dose levels - using default values'); - handles.IsoDose.Levels = 0; -end -handles = updateIsoDoseLineCache(handles); -handles.IsoDose.NewIsoDoseFlag = false; -UpdatePlot(handles); -guidata(hObject,handles); - - -% popup menu: machine -function popUpMachine_Callback(hObject, ~, handles) -contents = cellstr(get(hObject,'String')); -checkRadiationComposition(handles); -if handles.State > 0 - pln = evalin('base','pln'); - if handles.State > 0 && ~strcmp(contents(get(hObject,'Value')),pln.machine) - handles.State = 1; - UpdateState(handles); - guidata(hObject,handles); - end - getPlnFromGUI(handles); -end - -% toolbar load button -function toolbarLoad_ClickedCallback(hObject, eventdata, handles) -btnLoadMat_Callback(hObject, eventdata, handles); - -% toolbar save button -function toolbarSave_ClickedCallback(hObject, eventdata, handles) - -btnTableSave_Callback(hObject, eventdata, handles); - -try - - if handles.State > 0 - ct = evalin('base','ct'); - cst = evalin('base','cst'); - pln = evalin('base','pln'); - end - - if handles.State > 1 - stf = evalin('base','stf'); - dij = evalin('base','dij'); - end - - if handles.State > 2 - resultGUI = evalin('base','resultGUI'); - end - - switch handles.State - case 1 - uisave({'cst','ct','pln'}); - case 2 - uisave({'cst','ct','pln','stf','dij'}); - case 3 - uisave({'cst','ct','pln','stf','dij','resultGUI'}); - end - -catch - handles = showWarning(handles,'Could not save files'); -end -guidata(hObject,handles); - -% button: about -function btnAbout_Callback(hObject, eventdata, handles) - -msgbox({'https://github.com/e0404/matRad/' 'email: matrad@dkfz.de'},'About'); - -% button: close -function figure1_CloseRequestFcn(hObject, ~, ~) -set(0,'DefaultUicontrolBackgroundColor',[0.5 0.5 0.5]); -selection = questdlg('Do you really want to close matRad?',... - 'Close matRad',... - 'Yes','No','Yes'); - -%BackgroundColor',[0.5 0.5 0.5] - switch selection - case 'Yes', - delete(hObject); - case 'No' - return - end - -% --- Executes on button press in pushbutton_recalc. -function pushbutton_recalc_Callback(hObject, ~, handles) - -% recalculation only makes sense if ... -if evalin('base','exist(''pln'',''var'')') && ... - evalin('base','exist(''stf'',''var'')') && ... - evalin('base','exist(''ct'',''var'')') && ... - evalin('base','exist(''cst'',''var'')') && ... - evalin('base','exist(''resultGUI'',''var'')') - -try - - % indicate that matRad is busy - % change mouse pointer to hour glass - Figures = gcf;%findobj('type','figure'); - set(Figures, 'pointer', 'watch'); - drawnow; - % disable all active objects - InterfaceObj = findobj(Figures,'Enable','on'); - set(InterfaceObj,'Enable','off'); - - % get all data from workspace - pln = evalin('base','pln'); - stf = evalin('base','stf'); - ct = evalin('base','ct'); - cst = evalin('base','cst'); - resultGUI = evalin('base','resultGUI'); - - % get weights of the selected cube - Content = get(handles.popupDisplayOption,'String'); - SelectedCube = Content{get(handles.popupDisplayOption,'Value')}; - Suffix = strsplit(SelectedCube,'_'); - if length(Suffix)>1 - Suffix = ['_' Suffix{2}]; - else - Suffix = ''; - end - - if sum([stf.totalNumOfBixels]) ~= length(resultGUI.(['w' Suffix])) - warndlg('weight vector does not corresponding to current steering file'); - return - end - - % change isocenter if that was changed and do _not_ recreate steering - % information - for i = 1:numel(pln.propStf.gantryAngles) - stf(i).isoCenter = pln.propStf.isoCenter(i,:); - end - - % recalculate influence matrix - if strcmp(pln.radiationMode,'photons') - dij = matRad_calcPhotonDose(ct,stf,pln,cst); - elseif strcmp(pln.radiationMode,'protons') || strcmp(pln.radiationMode,'carbon') - dij = matRad_calcParticleDose(ct,stf,pln,cst); - end - - % recalculate cubes in resultGUI - resultGUIreCalc = matRad_calcCubes(resultGUI.(['w' Suffix]),dij,cst); - - % delete old variables to avoid confusion - if isfield(resultGUI,'effect') - resultGUI = rmfield(resultGUI,'effect'); - resultGUI = rmfield(resultGUI,'RBExDose'); - resultGUI = rmfield(resultGUI,'RBE'); - resultGUI = rmfield(resultGUI,'alpha'); - resultGUI = rmfield(resultGUI,'beta'); - end - - % overwrite the "standard" fields - sNames = fieldnames(resultGUIreCalc); - for j = 1:length(sNames) - resultGUI.(sNames{j}) = resultGUIreCalc.(sNames{j}); - end - - % assign results to base worksapce - assignin('base','dij',dij); - assignin('base','resultGUI',resultGUI); - - handles.State = 3; - - % show physicalDose of newly computed state - handles.SelectedDisplayOption = 'physicalDose'; - set(handles.popupDisplayOption,'Value',find(strcmp('physicalDose',Content))); - - % change state from busy to normal - set(Figures, 'pointer', 'arrow'); - set(InterfaceObj,'Enable','on'); - - handles.cBarChanged = true; - - handles = updateIsoDoseLineCache(handles); - - UpdateState(handles); - - handles.rememberCurrAxes = false; - UpdatePlot(handles); - handles.rememberCurrAxes = true; - - guidata(hObject,handles); - -catch ME - handles = showError(handles,'CalcDoseCallback: Error in dose recalculation!',ME); - - % change state from busy to normal - set(Figures, 'pointer', 'arrow'); - set(InterfaceObj,'Enable','on'); - - guidata(hObject,handles); - return; - -end - -end - - -% --- Executes on button press in btnSetTissue. -function btnSetTissue_Callback(hObject, ~, handles) - -%check if patient is loaded -if handles.State == 0 - return -end - -%parse variables from base-workspace -cst = evalin('base','cst'); -pln = evalin('base','pln'); - -fileName = [pln.radiationMode '_' pln.machine]; -load(fileName); - -% check for available cell types characterized by alphaX and betaX -for i = 1:size(machine.data(1).alphaX,2) - CellType{i} = [num2str(machine.data(1).alphaX(i)) ' ' num2str(machine.data(1).betaX(i))]; -end - -%fill table data array -for i = 1:size(cst,1) - data{i,1} = cst{i,2}; - data{i,2} = [num2str(cst{i,5}.alphaX) ' ' num2str(cst{i,5}.betaX)]; - data{i,3} = (cst{i,5}.alphaX / cst{i,5}.betaX ); -end - -Width = 400; -Height = 200 + 20*size(data,1); -ScreenSize = get(0,'ScreenSize'); -% show "set tissue parameter" window -figHandles = get(0,'Children'); -if ~isempty(figHandles) - IdxHandle = strcmp(get(figHandles,'Name'),'Set Tissue Parameters'); -else - IdxHandle = []; -end - -%check if window is already exists -if any(IdxHandle) - IdxTable = find(strcmp({figHandles(IdxHandle).Children.Type},'uitable')); - set(figHandles(IdxHandle).Children(IdxTable), 'Data', []); - figTissue = figHandles(IdxHandle); - %set focus - figure(figTissue); -else - figTissue = figure('Name','Set Tissue Parameters','Color',[.5 .5 .5],'NumberTitle','off','Position',... - [ceil(ScreenSize(3)/2) ceil(ScreenSize(4)/2) Width Height]); -end - -% define the tissue parameter table -cNames = {'VOI','alphaX betaX','alpha beta ratio'}; -columnformat = {'char',CellType,'numeric'}; - -tissueTable = uitable('Parent', figTissue,'Data', data,'ColumnEditable',[false true false],... - 'ColumnName',cNames, 'ColumnFormat',columnformat,'Position',[50 150 10 10]); -set(tissueTable,'CellEditCallback',@tissueTable_CellEditCallback); -% set width and height -currTablePos = get(tissueTable,'Position'); -currTableExt = get(tissueTable,'Extent'); -currTablePos(3) = currTableExt(3); -currTablePos(4) = currTableExt(4); -set(tissueTable,'Position',currTablePos); - -% define two buttons with callbacks -uicontrol('Parent', figTissue,'Style', 'pushbutton', 'String', 'Save&Close',... - 'Position', [Width-(0.25*Width) 0.1 * Height 70 30],... - 'Callback', @(hpb,eventdata)SaveTissueParameters(hpb,eventdata,handles)); - -uicontrol('Parent', figTissue,'Style', 'pushbutton', 'String', 'Cancel&Close',... - 'Position', [Width-(0.5*Width) 0.1 * Height 80 30],... - 'Callback', 'close'); - -guidata(hObject,handles); -UpdateState(handles); - - -function SaveTissueParameters(~, ~, handles) -cst = evalin('base','cst'); -% get handle to uiTable -figHandles = get(0,'Children'); -IdxHandle = find(strcmp(get(figHandles,'Name'),'Set Tissue Parameters')); -% find table in window - -figHandleChildren = get(figHandles(IdxHandle),'Children'); -IdxTable = find(strcmp(get(figHandleChildren,'Type'),'uitable')); -uiTable = figHandleChildren(IdxTable); -% retrieve data from uitable -data = get(uiTable,'data'); - -for i = 1:size(cst,1) - for j = 1:size(data,1) - if strcmp(cst{i,2},data{j,1}) - alphaXBetaX = str2num(data{j,2}); - cst{i,5}.alphaX = alphaXBetaX(1); - cst{i,5}.betaX = alphaXBetaX(2); - end - end -end -assignin('base','cst',cst); -close -handles.State = 2; -UpdateState(handles); - - - -function tissueTable_CellEditCallback(hObject, eventdata, ~) -if eventdata.Indices(2) == 2 - alphaXBetaX = str2num(eventdata.NewData); - data = get(hObject,'Data'); - data{eventdata.Indices(1),3} = alphaXBetaX(1)/alphaXBetaX(2); - set(hObject,'Data',data); -end - -% --- Executes on button press in btnSaveToGUI. -function btnSaveToGUI_Callback(hObject, ~, handles) - -Width = 400; -Height = 200; -ScreenSize = get(0,'ScreenSize'); - -% show "Provide result name" window -figHandles = get(0,'Children'); -if ~isempty(figHandles) - IdxHandle = strcmp(get(figHandles,'Name'),'Provide result name'); -else - IdxHandle = []; -end - -%check if window is already exists -if any(IdxHandle) - figDialog = figHandles(IdxHandle); - %set focus - figure(figDialog); -else - figDialog = dialog('Position',[ceil(ScreenSize(3)/2) ceil(ScreenSize(4)/2) Width Height],'Name','Provide result name','Color',[0.5 0.5 0.5]); - - uicontrol('Parent',figDialog,... - 'Style','text',... - 'Position',[20 Height - (0.35*Height) 350 60],... - 'String','Please provide a decriptive name for your optimization result:','FontSize',10,'BackgroundColor',[0.5 0.5 0.5]); - - uicontrol('Parent',figDialog,... - 'Style','edit',... - 'Position',[30 60 350 60],... - 'String','Please enter name here...','FontSize',10,'BackgroundColor',[0.55 0.55 0.55]); - - uicontrol('Parent', figDialog,'Style', 'pushbutton', 'String', 'Save','FontSize',10,... - 'Position', [0.42*Width 0.1 * Height 70 30],... - 'Callback', @(hpb,eventdata)SaveResultToGUI(hpb,eventdata,guidata(hpb))); -end - -uiwait(figDialog); -guidata(hObject, handles); -UpdateState(handles) -UpdatePlot(handles) - - -function SaveResultToGUI(~, ~, ~) -AllFigHandles = get(0,'Children'); -ixHandle = strcmp(get(AllFigHandles,'Name'),'Provide result name'); -uiEdit = get(AllFigHandles(ixHandle),'Children'); - -if strcmp(get(uiEdit(2),'String'),'Please enter name here...') - - formatOut = 'mmddyyHHMM'; - Suffix = ['_' datestr(now,formatOut)]; -else - % delete special characters - Suffix = get(uiEdit(2),'String'); - logIx = isstrprop(Suffix,'alphanum'); - Suffix = ['_' Suffix(logIx)]; -end - -pln = evalin('base','pln'); -resultGUI = evalin('base','resultGUI'); - -if isfield(resultGUI,'physicalDose') - resultGUI.(['physicalDose' Suffix]) = resultGUI.physicalDose; -end -if isfield(resultGUI,'w') - resultGUI.(['w' Suffix]) = resultGUI.w; -end - - -if ~strcmp(pln.propOpt.bioOptimization,'none') - - if isfield(resultGUI,'RBExDose') - resultGUI.(['RBExDose' Suffix]) = resultGUI.RBExDose; - end - - if strcmp(pln.radiationMode,'carbon') == 1 - if isfield(resultGUI,'effect') - resultGUI.(['effect' Suffix])= resultGUI.effect; - end - - if isfield(resultGUI,'RBE') - resultGUI.(['RBE' Suffix]) = resultGUI.RBE; - end - if isfield(resultGUI,'alpha') - resultGUI.(['alpha' Suffix]) = resultGUI.alpha; - end - if isfield(resultGUI,'beta') - resultGUI.(['beta' Suffix]) = resultGUI.beta; - end - end -end - -close(AllFigHandles(ixHandle)); -assignin('base','resultGUI',resultGUI); - -% precompute contours of VOIs -function cst = precomputeContours(ct,cst) -mask = zeros(ct.cubeDim); % create zero cube with same dimeonsions like dose cube -for s = 1:size(cst,1) - cst{s,7} = cell(max(ct.cubeDim(:)),3); - mask(:) = 0; - mask(cst{s,4}{1}) = 1; - for slice = 1:ct.cubeDim(1) - if sum(sum(mask(slice,:,:))) > 0 - cst{s,7}{slice,1} = contourc(squeeze(mask(slice,:,:)),.5*[1 1]); - end - end - for slice = 1:ct.cubeDim(2) - if sum(sum(mask(:,slice,:))) > 0 - cst{s,7}{slice,2} = contourc(squeeze(mask(:,slice,:)),.5*[1 1]); - end - end - for slice = 1:ct.cubeDim(3) - if sum(sum(mask(:,:,slice))) > 0 - cst{s,7}{slice,3} = contourc(squeeze(mask(:,:,slice)),.5*[1 1]); - end - end -end - -%Update IsodoseLines -function handles = updateIsoDoseLineCache(handles) -resultGUI = evalin('base','resultGUI'); -% select first cube if selected option does not exist -if ~isfield(resultGUI,handles.SelectedDisplayOption) - CubeNames = fieldnames(resultGUI); - dose = resultGUI.(CubeNames{1,1}); -else - dose = resultGUI.(handles.SelectedDisplayOption); -end - -%if function is called for the first time then set display parameters -if isempty(handles.dispWindow{3,2}) - handles.dispWindow{3,1} = [min(dose(:)) max(dose(:))]; % set default dose range - handles.dispWindow{3,2} = [min(dose(:)) max(dose(:))]; % set min max values -end - -minMaxRange = handles.dispWindow{3,1}; -% if upper colorrange is defined then use it otherwise 120% iso dose - upperMargin = 1; -if abs((max(dose(:)) - handles.dispWindow{3,1}(1,2))) < 0.01 * max(dose(:)) - upperMargin = 1.2; -end - -if (length(handles.IsoDose.Levels) == 1 && handles.IsoDose.Levels(1,1) == 0) || ~handles.IsoDose.NewIsoDoseFlag - vLevels = [0.1:0.1:0.9 0.95:0.05:upperMargin]; - referenceDose = (minMaxRange(1,2))/(upperMargin); - handles.IsoDose.Levels = minMaxRange(1,1) + (referenceDose-minMaxRange(1,1)) * vLevels; -end -handles.IsoDose.Contours = matRad_computeIsoDoseContours(dose,handles.IsoDose.Levels); - - - -%% CREATE FUNCTIONS -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -% popup menu: machine -function popUpMachine_CreateFcn(hObject, ~, ~) -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - -% text box: max value -function txtMaxVal_CreateFcn(hObject, ~, ~) - -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - -% text box: edit iso center -function editIsoCenter_CreateFcn(hObject, ~, ~) -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - -% text box: stratification levels -function editSequencingLevel_CreateFcn(hObject, ~, ~) -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - -function slicerPrecision_CreateFcn(hObject, ~, ~) -if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor',[.9 .9 .9]); -end - -function editBixelWidth_CreateFcn(hObject, ~, ~) -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - -function editGantryAngle_CreateFcn(hObject, ~, ~) -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - -function editCouchAngle_CreateFcn(hObject, ~, ~) -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - -function popupRadMode_CreateFcn(hObject, ~, ~) -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - -function editFraction_CreateFcn(hObject, ~, ~) -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - -function popupPlane_CreateFcn(hObject, ~, ~) -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - -function sliderSlice_CreateFcn(hObject, ~, ~) -if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor',[.9 .9 .9]); -end - -function popupTypeOfPlot_CreateFcn(hObject, ~, ~) -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - -function popupDisplayOption_CreateFcn(hObject, ~, ~) -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - -function sliderBeamSelection_CreateFcn(hObject, ~, ~) -if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor',[.9 .9 .9]); -end - -function listBoxCmd_CreateFcn(hObject, ~, ~) -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - -function sliderOffset_CreateFcn(hObject, ~, ~) -if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor',[.9 .9 .9]); -end - -% --- Executes on selection change in legendTable. -function legendTable_Callback(hObject, eventdata, handles) -% hObject handle to legendTable (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hints: contents = cellstr(get(hObject,'String')) returns legendTable contents as cell array -% contents{get(hObject,'Value')} returns selected item from legendTable -cst = evalin('base','cst'); - -idx = get(hObject,'Value'); -clr = dec2hex(round(cst{idx,5}.visibleColor(:)*255),2)'; -clr = ['#';clr(:)]'; - -%Get the string entries -tmpString = get(handles.legendTable,'String'); - -if handles.VOIPlotFlag(idx) - handles.VOIPlotFlag(idx) = false; - cst{idx,5}.Visible = false; - tmpString{idx} = ['
',cst{idx,2},'
']; -elseif ~handles.VOIPlotFlag(idx) - handles.VOIPlotFlag(idx) = true; - cst{idx,5}.Visible = true; - tmpString{idx} = ['
',cst{idx,2},'
']; -end -set(handles.legendTable,'String',tmpString); - -% update cst in workspace accordingly -assignin('base','cst',cst) - -guidata(hObject, handles); -UpdatePlot(handles) - -% --- Executes during object creation, after setting all properties. -function legendTable_CreateFcn(hObject, eventdata, handles) -% hObject handle to legendTable (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles empty - handles not created until after all CreateFcns called - -% Hint: listbox controls usually have a white background on Windows. -% See ISPC and COMPUTER. -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - - -% --- Executes on button press in importDoseButton. -function importDoseButton_Callback(hObject,eventdata, handles) -% hObject handle to importDoseButton (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) -extensions{1} = '*.nrrd'; -[filenames,filepath,~] = uigetfile(extensions,'MultiSelect','on'); - -if ~iscell(filenames) - tmp = filenames; - filenames = cell(1); - filenames{1} = tmp; -end - -ct = evalin('base','ct'); -resultGUI = evalin('base','resultGUI'); - -for filename = filenames - [~,name,~] = fileparts(filename{1}); - [cube,~] = matRad_readCube(fullfile(filepath,filename{1})); - if ~isequal(ct.cubeDim, size(cube)) - errordlg('Dimensions of the imported cube do not match with ct','Import failed!','modal'); - continue; - end - - fieldname = ['import_' matlab.lang.makeValidName(name, 'ReplacementStyle','delete')]; - resultGUI.(fieldname) = cube; -end - -assignin('base','resultGUI',resultGUI); -btnRefresh_Callback(hObject, eventdata, handles) - -% --- Executes on button press in pushbutton_importFromBinary. -function pushbutton_importFromBinary_Callback(hObject, eventdata, handles) -% hObject handle to pushbutton_importFromBinary (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -try - % delete existing workspace - parse variables from base workspace - set(handles.popupDisplayOption,'String','no option available'); - AllVarNames = evalin('base','who'); - RefVarNames = {'ct','cst','pln','stf','dij','resultGUI'}; - for i = 1:length(RefVarNames) - if sum(ismember(AllVarNames,RefVarNames{i}))>0 - evalin('base',['clear ', RefVarNames{i}]); - end - end - handles.State = 0; - - %call the gui - uiwait(matRad_importGUI); - - %Check if we have the variables in the workspace - if evalin('base','exist(''cst'',''var'')') == 1 && evalin('base','exist(''ct'',''var'')') == 1 - cst = evalin('base','cst'); - ct = evalin('base','ct'); - %setCstTable(handles,cst); - generateCstTable(hanles,cst); - handles.TableChanged = false; - set(handles.popupTypeOfPlot,'Value',1); - - % compute HU values - if ~isfield(ct, 'cubeHU') - ct = matRad_electronDensitiesToHU(ct); - assignin('base','ct',ct); - end - if ~isfield(ct, 'cubeHU') - handles.cubeHUavailable = false; - else - handles.cubeHUavailable = true; - end - - % precompute contours - cst = precomputeContours(ct,cst); - - assignin('base','ct',ct); - assignin('base','cst',cst); - - if evalin('base','exist(''pln'',''var'')') - assignin('base','pln',pln); - setPln(handles); - else - getPlnFromGUI(handles); - setPln(handles); - end - handles.State = 1; - end - - % set slice slider - handles.plane = get(handles.popupPlane,'value'); - if handles.State >0 - set(handles.sliderSlice,'Min',1,'Max',ct.cubeDim(handles.plane),... - 'Value',round(ct.cubeDim(handles.plane)/2),... - 'SliderStep',[1/(ct.cubeDim(handles.plane)-1) 1/(ct.cubeDim(handles.plane)-1)]); - end - - if handles.State > 0 - % define context menu for structures - for i = 1:size(cst,1) - if cst{i,5}.Visible - handles.VOIPlotFlag(i) = true; - else - handles.VOIPlotFlag(i) = false; - end - end - end - - handles.dispWindow = cell(3,2); - handles.cBarChanged = true; - - UpdateState(handles); - handles.rememberCurrAxes = false; - UpdatePlot(handles); - handles.rememberCurrAxes = true; -catch - handles = showError(handles,'Binary Patient Import: Could not import data'); - UpdateState(handles); -end - -guidata(hObject,handles); - -% --- Executes on button press in radioBtnIsoCenter. -function radioBtnIsoCenter_Callback(hObject, eventdata, handles) -% hObject handle to radioBtnIsoCenter (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) -UpdatePlot(handles) -% Hint: get(hObject,'Value') returns toggle state of radioBtnIsoCenter - -% -------------------------------------------------------------------- -function uipushtool_screenshot_ClickedCallback(hObject, eventdata, handles) -% hObject handle to uipushtool_screenshot (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - - -tmpFig = figure('position',[100 100 700 600],'Visible','off','name','Current View'); -cBarHandle = findobj(handles.figure1,'Type','colorbar'); -if ~isempty(cBarHandle) - new_handle = copyobj([handles.axesFig cBarHandle],tmpFig); -else - new_handle = copyobj(handles.axesFig,tmpFig); -end - -oldPos = get(handles.axesFig,'Position'); -set(new_handle(1),'units','normalized', 'Position',oldPos); - -if ~isfield(handles,'lastStoragePath') || exist(handles.lastStoragePath,'dir') ~= 7 - handles.lastStoragePath = []; -end - -[filename, pathname] = uiputfile({'*.jpg;*.tif;*.png;*.gif','All Image Files'; '*.fig','MATLAB figure file'},'Save current view',[handles.lastStoragePath 'screenshot.png']); - -handles.lastStoragePath = pathname; - -if ~isequal(filename,0) && ~isequal(pathname,0) - set(gcf, 'pointer', 'watch'); - saveas(tmpFig,fullfile(pathname,filename)); - set(gcf, 'pointer', 'arrow'); - close(tmpFig); - uiwait(msgbox('Current view has been succesfully saved!')); -else - uiwait(msgbox('Aborted saving, showing figure instead!')); - set(tmpFig,'Visible','on'); -end - -guidata(hObject,handles); - - -%% Callbacks & Functions for color setting -function UpdateColormapOptions(handles) - -if isfield(handles,'colormapLocked') && handles.colormapLocked - return; -end - -selectionIndex = get(handles.popupmenu_chooseColorData,'Value'); - -cMapSelectionIndex = get(handles.popupmenu_chooseColormap,'Value'); -cMapStrings = get(handles.popupmenu_chooseColormap,'String'); - -if selectionIndex > 1 - set(handles.uitoggletool8,'State','on'); -else - set(handles.uitoggletool8,'State','off'); -end - -try - if selectionIndex == 2 - ct = evalin('base','ct'); - currentMap = handles.ctColorMap; - window = handles.dispWindow{selectionIndex,1}; - if isfield(ct, 'cube') - minMax = [min(ct.cube{1}(:)) max(ct.cube{1}(:))]; - else - minMax = [min(ct.cubeHU{1}(:)) max(ct.cubeHU{1}(:))]; - end - % adjust value for custom window to current - handles.windowPresets(1).width = max(window) - min(window); - handles.windowPresets(1).center = mean(window); - % update full window information - handles.windowPresets(2).width = minMax(2) - minMax(1); - handles.windowPresets(2).center = mean(minMax); - elseif selectionIndex == 3 - result = evalin('base','resultGUI'); - dose = result.(handles.SelectedDisplayOption); - currentMap = handles.doseColorMap; - minMax = [min(dose(:)) max(dose(:))]; - window = handles.dispWindow{selectionIndex,1}; - else - window = [0 1]; - minMax = window; - currentMap = 'bone'; - end -catch - window = [0 1]; - minMax = window; - currentMap = 'bone'; -end - -valueRange = minMax(2) - minMax(1); - -windowWidth = window(2) - window(1); -windowCenter = mean(window); - -%This are some arbritrary settings to configure the sliders -sliderCenterMinMax = [minMax(1)-valueRange/2 minMax(2)+valueRange/2]; -sliderWidthMinMax = [0 valueRange*2]; - -%if we have selected a value outside this range, we adapt the slider -%windows -if windowCenter < sliderCenterMinMax(1) - sliderCenterMinMax(1) = windowCenter; -end -if windowCenter > sliderCenterMinMax(2) - sliderCenterMinMax(2) = windowCenter; -end -if windowWidth < sliderWidthMinMax(1) - sliderWidthMinMax(1) = windowWidth; -end -if windowCenter > sliderCenterMinMax(2) - sliderWidthMinMax(2) = windowWidth; -end - - -set(handles.edit_windowCenter,'String',num2str(windowCenter,3)); -set(handles.edit_windowWidth,'String',num2str(windowWidth,3)); -set(handles.edit_windowRange,'String',num2str(window,4)); -set(handles.slider_windowCenter,'Min',sliderCenterMinMax(1),'Max',sliderCenterMinMax(2),'Value',windowCenter); -set(handles.slider_windowWidth,'Min',sliderWidthMinMax(1),'Max',sliderWidthMinMax(2),'Value',windowWidth); - -cMapPopupIndex = find(strcmp(currentMap,cMapStrings)); -set(handles.popupmenu_chooseColormap,'Value',cMapPopupIndex); - -guidata(gcf,handles); - -% --- Executes on selection change in popupmenu_chooseColorData. -function popupmenu_chooseColorData_Callback(hObject, eventdata, handles) -% hObject handle to popupmenu_chooseColorData (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu_chooseColorData contents as cell array -% contents{get(hObject,'Value')} returns selected item from popupmenu_chooseColorData - -%index = get(hObject,'Value') - 1; - -handles.cBarChanged = true; - -guidata(hObject,handles); -UpdatePlot(handles); - - -% --- Executes during object creation, after setting all properties. -function popupmenu_chooseColorData_CreateFcn(hObject, eventdata, handles) -% hObject handle to popupmenu_chooseColorData (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles empty - handles not created until after all CreateFcns called - -% Hint: popupmenu controls usually have a white background on Windows. -% See ISPC and COMPUTER. -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - - -% --- Executes on slider movement. -function slider_windowCenter_Callback(hObject, eventdata, handles) -% hObject handle to slider_windowCenter (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hints: get(hObject,'Value') returns position of slider -% get(hObject,'Min') and get(hObject,'Max') to determine range of slider - -newCenter = get(hObject,'Value'); -range = get(handles.slider_windowWidth,'Value'); -selectionIndex = get(handles.popupmenu_chooseColorData,'Value'); - -handles.dispWindow{selectionIndex,1} = [newCenter-range/2 newCenter+range/2]; -handles.cBarChanged = true; - -guidata(hObject,handles); -UpdatePlot(handles); - -% --- Executes during object creation, after setting all properties. -function slider_windowCenter_CreateFcn(hObject, eventdata, handles) -% hObject handle to slider_windowCenter (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles empty - handles not created until after all CreateFcns called - -% Hint: slider controls usually have a light gray background. -if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor',[.9 .9 .9]); -end - -set(hObject,'Value',0.5); - -% --- Executes on slider movement. -function slider_windowWidth_Callback(hObject, eventdata, handles) -% hObject handle to slider_windowWidth (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hints: get(hObject,'Value') returns position of slider -% get(hObject,'Min') and get(hObject,'Max') to determine range of slider - -newWidth = get(hObject,'Value'); -center = get(handles.slider_windowCenter,'Value'); -selectionIndex = get(handles.popupmenu_chooseColorData,'Value'); -handles.dispWindow{selectionIndex,1} = [center-newWidth/2 center+newWidth/2]; -handles.cBarChanged = true; - -guidata(hObject,handles); -UpdatePlot(handles); - -% --- Executes during object creation, after setting all properties. -function slider_windowWidth_CreateFcn(hObject, eventdata, handles) -% hObject handle to slider_windowWidth (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles empty - handles not created until after all CreateFcns called - -% Hint: slider controls usually have a light gray background. -if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor',[.9 .9 .9]); -end - -set(hObject,'Value',1.0); - - -% --- Executes on selection change in popupmenu_chooseColormap. -function popupmenu_chooseColormap_Callback(hObject, eventdata, handles) -% hObject handle to popupmenu_chooseColormap (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu_chooseColormap contents as cell array -% contents{get(hObject,'Value')} returns selected item from popupmenu_chooseColormap - -index = get(hObject,'Value'); -strings = get(hObject,'String'); - -selectionIndex = get(handles.popupmenu_chooseColorData,'Value'); - -switch selectionIndex - case 2 - handles.ctColorMap = strings{index}; - case 3 - handles.doseColorMap = strings{index}; - otherwise -end - -handles.cBarChanged = true; - -guidata(hObject,handles); -UpdatePlot(handles); - -% --- Executes during object creation, after setting all properties. -function popupmenu_chooseColormap_CreateFcn(hObject, eventdata, handles) -% hObject handle to popupmenu_chooseColormap (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles empty - handles not created until after all CreateFcns called - -% Hint: popupmenu controls usually have a white background on Windows. -% See ISPC and COMPUTER. -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - - -function edit_windowRange_Callback(hObject, eventdata, handles) -% hObject handle to edit_windowRange (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hints: get(hObject,'String') returns contents of edit_windowRange as text -% str2double(get(hObject,'String')) returns contents of edit_windowRange as a double - -selectionIndex = get(handles.popupmenu_chooseColorData,'Value'); -vRange = str2num(get(hObject,'String')); -% matlab adds a zero in the beginning when text field is changed -if numel(vRange) == 3 - vRange = vRange(vRange~=0); -end - -handles.dispWindow{selectionIndex,1} = sort(vRange); - -handles.cBarChanged = true; - - % compute new iso dose lines -if selectionIndex > 2 - guidata(hObject,handles); - handles = updateIsoDoseLineCache(handles); -end - -guidata(hObject,handles); -UpdatePlot(handles); - -% --- Executes during object creation, after setting all properties. -function edit_windowRange_CreateFcn(hObject, eventdata, handles) -% hObject handle to edit_windowRange (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles empty - handles not created until after all CreateFcns called - -% Hint: edit controls usually have a white background on Windows. -% See ISPC and COMPUTER. -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - -set(hObject,'String','0 1'); - - -function edit_windowCenter_Callback(hObject, eventdata, handles) -% hObject handle to edit_windowCenter (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hints: get(hObject,'String') returns contents of edit_windowCenter as text -% str2double(get(hObject,'String')) returns contents of edit_windowCenter as a double - -newCenter = str2double(get(hObject,'String')); -width = get(handles.slider_windowWidth,'Value'); -selectionIndex = get(handles.popupmenu_chooseColorData,'Value'); -handles.dispWindow{selectionIndex,1} = [newCenter-width/2 newCenter+width/2]; -handles.cBarChanged = true; -guidata(hObject,handles); -UpdatePlot(handles); - -% --- Executes during object creation, after setting all properties. -function edit_windowCenter_CreateFcn(hObject, eventdata, handles) -% hObject handle to edit_windowCenter (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles empty - handles not created until after all CreateFcns called - -% Hint: edit controls usually have a white background on Windows. -% See ISPC and COMPUTER. -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - - - -function edit_windowWidth_Callback(hObject, eventdata, handles) -% hObject handle to edit_windowWidth (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hints: get(hObject,'String') returns contents of edit_windowWidth as text -% str2double(get(hObject,'String')) returns contents of edit_windowWidth as a double - -newWidth = str2double(get(hObject,'String')); -center = get(handles.slider_windowCenter,'Value'); -selectionIndex = get(handles.popupmenu_chooseColorData,'Value'); -handles.dispWindow{selectionIndex,1} = [center-newWidth/2 center+newWidth/2]; -handles.cBarChanged = true; -guidata(hObject,handles); -UpdatePlot(handles); - - -% --- Executes during object creation, after setting all properties. -function edit_windowWidth_CreateFcn(hObject, eventdata, handles) -% hObject handle to edit_windowWidth (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles empty - handles not created until after all CreateFcns called - -% Hint: edit controls usually have a white background on Windows. -% See ISPC and COMPUTER. -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - - -% -------------------------------------------------------------------- -function uitoggletool8_ClickedCallback(hObject, eventdata, handles) -% hObject handle to uitoggletool8 (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -%Check if on or off -val = strcmp(get(hObject,'State'),'on'); - -%Now we have to apply the new selection to our colormap options panel -if ~val - newSelection = 1; -else - %Chooses the selection from the highest state - selections = get(handles.popupmenu_chooseColorData,'String'); - newSelection = numel(selections); -end -set(handles.popupmenu_chooseColorData,'Value',newSelection); - -handles.cBarChanged = true; -guidata(hObject,handles); -UpdatePlot(handles); - -% --- Executes on slider movement. -function sliderOpacity_Callback(hObject, eventdata, handles) -% hObject handle to sliderOpacity (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) -handles.doseOpacity = get(hObject,'Value'); -guidata(hObject,handles); -UpdatePlot(handles); - -% --- Executes during object creation, after setting all properties. -function sliderOpacity_CreateFcn(hObject, eventdata, handles) -% hObject handle to sliderOpacity (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles empty - handles not created until after all CreateFcns called - -% Hint: slider controls usually have a light gray background. -if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor',[.9 .9 .9]); -end - -%% Data Cursors -function cursorText = dataCursorUpdateFunction(obj,event_obj) -% Display the position of the data cursor -% obj Currently not used (empty) -% event_obj Handle to event object -% output_txt Data cursor text string (string or cell array of strings). - -target = findall(0,'Name','matRadGUI'); - -% Get GUI data (maybe there is another way?) -handles = guidata(target); - -% position of the data point to label -pos = get(event_obj,'Position'); - -%Different behavior for image and profile plot -if get(handles.popupTypeOfPlot,'Value')==1 %Image view - cursorText = cell(0,1); - try - if handles.State >= 1 - plane = get(handles.popupPlane,'Value'); - slice = round(get(handles.sliderSlice,'Value')); - - %Get the CT values - ct = evalin('base','ct'); - - %We differentiate between pos and ix, since the user may put - %the datatip on an isoline which returns a continous position - cubePos = zeros(1,3); - cubePos(plane) = slice; - cubePos(1:end ~= plane) = fliplr(pos); - cubeIx = round(cubePos); - - %Here comes the index permutation stuff - %Cube Index - cursorText{end+1,1} = ['Cube Index: ' mat2str(cubeIx)]; - %Space Coordinates - coords = zeros(1,3); - coords(1) = cubePos(2)*ct.resolution.y; - coords(2) = cubePos(1)*ct.resolution.x; - coords(3) = cubePos(3)*ct.resolution.z; - cursorText{end+1,1} = ['Space Coordinates: ' mat2str(coords,5) ' mm']; - - ctVal = ct.cubeHU{1}(cubeIx(1),cubeIx(2),cubeIx(3)); - cursorText{end+1,1} = ['HU Value: ' num2str(ctVal,3)]; - end - - %Add dose information if available - if handles.State == 3 - %get result structure - result = evalin('base','resultGUI'); - - %Get all result names from popup - resultNames = get(handles.popupDisplayOption,'String'); - - %Display all values of fields found in the resultGUI struct - for runResult = 1:numel(resultNames) - name = resultNames{runResult}; - if isfield(result,name) - field = result.(name); - val = field(cubeIx(1),cubeIx(2),cubeIx(3)); - cursorText{end+1,1} = [name ': ' num2str(val,3)]; - end - end - end - catch - cursorText{end+1,1} = 'Error while retreiving Data!'; - end -else %Profile view - cursorText = cell(2,1); - cursorText{1} = ['Radiological Depth: ' num2str(pos(1),3) ' mm']; - cursorText{2} = [get(target,'DisplayName') ': ' num2str(pos(2),3)]; -end - - - -% --- Executes on selection change in popMenuBioOpt. -function popMenuBioOpt_Callback(hObject, ~, handles) -pln = evalin('base','pln'); -contentBioOpt = get(handles.popMenuBioOpt,'String'); -NewBioOptimization = contentBioOpt(get(handles.popMenuBioOpt,'Value'),:); - -if handles.State > 0 - if (strcmp(pln.propOpt.bioOptimization,'LEMIV_effect') && strcmp(NewBioOptimization,'LEMIV_RBExD')) ||... - (strcmp(pln.propOpt.bioOptimization,'LEMIV_RBExD') && strcmp(NewBioOptimization,'LEMIV_effect')) - % do nothing - re-optimization is still possible - elseif ((strcmp(pln.propOpt.bioOptimization,'const_RBE') && strcmp(NewBioOptimization,'none')) ||... - (strcmp(pln.propOpt.bioOptimization,'none') && strcmp(NewBioOptimization,'const_RBE'))) && isequal(pln.radiationMode,'protons') - % do nothing - re-optimization is still possible - else - handles.State = 1; - end -end -getPlnFromGUI(handles); - -UpdateState(handles); -guidata(hObject,handles); - -% --- Executes during object creation, after setting all properties. -function popMenuBioOpt_CreateFcn(hObject, eventdata, handles) -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - -% --- Executes on button press in btn3Dview. -function btn3Dview_Callback(hObject, eventdata, handles) -% hObject handle to btn3Dview (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -if ~isfield(handles,'axesFig3D') || ~isfield(handles,'axesFig3D') || ~isgraphics(handles.axesFig3D) - handles.fig3D = figure('Name','matRad 3D View'); - handles.axesFig3D = axes('Parent',handles.fig3D); - view(handles.axesFig3D,3); -end -%end - -UpdatePlot(handles); - -guidata(hObject,handles); - -% --- Executes on button press in radiobtnCT. -function radiobtnCT_Callback(hObject, eventdata, handles) -% hObject handle to radiobtnCT (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hint: get(hObject,'Value') returns toggle state of radiobtnCT -UpdatePlot(handles) - -% --- Executes on button press in radiobtnPlan. -function radiobtnPlan_Callback(hObject, eventdata, handles) -% hObject handle to radiobtnPlan (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hint: get(hObject,'Value') returns toggle state of radiobtnPlan -UpdatePlot(handles) - - -% --- Executes on selection change in popupmenu_windowPreset. -function popupmenu_windowPreset_Callback(hObject, eventdata, handles) -% hObject handle to popupmenu_windowPreset (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu_windowPreset contents as cell array -% contents{get(hObject,'Value')} returns selected item from popupmenu_windowPreset - -selectionIndexCube = 2; % working on ct only -selectionIndexWindow = get(handles.popupmenu_windowPreset,'Value'); -newCenter = handles.windowPresets(selectionIndexWindow).center; -newWidth = handles.windowPresets(selectionIndexWindow).width; - -handles.dispWindow{selectionIndexCube,1} = [newCenter - newWidth/2 newCenter + newWidth/2]; -handles.cBarChanged = true; -guidata(hObject,handles); -UpdatePlot(handles); -UpdateColormapOptions(handles); - - -% --- Executes during object creation, after setting all properties. -function popupmenu_windowPreset_CreateFcn(hObject, eventdata, handles) -% hObject handle to popupmenu_windowPreset (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles empty - handles not created until after all CreateFcns called - -% Hint: popupmenu controls usually have a white background on Windows. -% See ISPC and COMPUTER. -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - -% setup ct window list -% data and values from CERR https://github.com/adityaapte/CERR -windowNames = {'Custom','Full','Abd/Med', 'Head', 'Liver', 'Lung', 'Spine', 'Vrt/Bone'}; -windowCenter = {NaN, NaN, -10, 45, 80, -500, 30, 400}; -windowWidth = {NaN, NaN, 330, 125, 305, 1500, 300, 1500}; -windowPresets = cell2struct([windowNames', windowCenter', windowWidth'], {'name', 'center', 'width'},2); - - -handles.windowPresets = windowPresets; - -selectionList = {windowPresets(:).name}; -set(hObject,'String',selectionList(:)); -set(hObject,'Value',1); - - -guidata(hObject,handles); - -% --- Executes on button press in checkbox_lockColormap. -function checkbox_lockColormap_Callback(hObject, eventdata, handles) -% hObject handle to checkbox_lockColormap (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hint: get(hObject,'Value') returns toggle state of checkbox_lockColormap -handles.colormapLocked = get(hObject,'Value'); - -if handles.colormapLocked - state = 'Off'; %'Inactive'; -else - state = 'On'; -end - -set(handles.popupmenu_chooseColorData,'Enable',state); -set(handles.popupmenu_windowPreset,'Enable',state); -set(handles.slider_windowWidth,'Enable',state); -set(handles.slider_windowCenter,'Enable',state); -set(handles.edit_windowWidth,'Enable',state); -set(handles.edit_windowCenter,'Enable',state); -set(handles.edit_windowRange,'Enable',state); -set(handles.popupmenu_chooseColormap,'Enable',state); - - -guidata(hObject,handles); - - -function cst = updateStructureTable(handles,cst) -colorAssigned = true; - -% check whether all structures have an assigned color -for i = 1:size(cst,1) - if ~isfield(cst{i,5},'visibleColor') - colorAssigned = false; - break; - elseif isempty(cst{i,5}.visibleColor) - colorAssigned = false; - break; - end -end - -% assign color if color assignment is not already present or inconsistent -if colorAssigned == false - m = 64; - colorStep = ceil(m/size(cst,1)); - colors = colorcube(colorStep*size(cst,1)); - % spread individual VOI colors in the colorcube color palette - colors = colors(1:colorStep:end,:); - - for i = 1:size(cst,1) - cst{i,5}.visibleColor = colors(i,:); - end -end - -for s = 1:size(cst,1) - handles.VOIPlotFlag(s) = cst{s,5}.Visible; - clr = dec2hex(round(cst{s,5}.visibleColor(:)*255),2)'; - clr = ['#';clr(:)]'; - if handles.VOIPlotFlag(s) - tmpString{s} = ['
',cst{s,2},'
']; - else - tmpString{s} = ['
',cst{s,2},'
']; - end -end -set(handles.legendTable,'String',tmpString); - -%-- generates the CST table -function cst = generateCstTable(handles,cst) - -cst = updateStructureTable(handles,cst); - -cstPanel = handles.uipanel3; - -cstPanelPos = getpixelposition(cstPanel); - -%Parameters for line height -objHeight = 22; -lineHeight = 25; %Height of a table line -fieldSep = 2; %Separation between fields horizontally -yTopSep = 40; %Separation of the first line from the top -tableViewHeight = cstPanelPos(4) - yTopSep; %Full height of the view - -%Widths of the fields -buttonW = objHeight; -nameW = 90; -typeW = 70; -opW = objHeight; -functionW = 120; -penaltyW = 40; -paramTitleW = 120; -paramW = 30; - - -%Scrollbar -cstVertTableScroll = findobj(cstPanel.Children,'Style','slider'); -if isempty(cstVertTableScroll) - sliderPos = 0; -else - sliderPos = cstVertTableScroll.Max - cstVertTableScroll.Value; -end -%disp(num2str(sliderPos)); -ypos = @(c) tableViewHeight - c*lineHeight + sliderPos; - -delete(cstPanel.Children); - -%Creates a dummy axis to allow for the use of textboxes instead of uicontrol to be able to use the (la)tex interpreter -tmpAxes = axes('Parent',cstPanel,'units','normalized','position',[0 0 1 1],'visible','off'); - -organTypes = {'OAR', 'TARGET'}; - -%columnname = {'VOI name','VOI type','priority','obj. / const.'};%,'penalty','dose', 'EUD','volume','robustness'}; - -%Get all Classes & classNames -mpkgObjectives = meta.package.fromName('DoseObjectives'); -mpkgConstraints = meta.package.fromName('DoseConstraints'); -classList = [mpkgObjectives.ClassList; mpkgConstraints.ClassList]; - -classList = classList(not([classList.Abstract])); - -%Now get the "internal" name from the properties -classNames = cell(2,numel(classList)); -for clIx = 1:numel(classList) - cl = classList(clIx); - pList = cl.PropertyList; %Get List of all properties - pNameIx = arrayfun(@(p) strcmp(p.Name,'name'),pList); %get index of the "name" property - p = pList(pNameIx); %select name property - pName = p.DefaultValue; % get value / name - classNames(:,clIx) = {cl.Name; pName}; %Store class name and display name -end - -% Collect Class-File & Display Names -%classNames = {classList.Name; p.DefaultValue}; - -%columnformat = {cst(:,2)',{'OAR','TARGET'},'numeric',... -% AllObjectiveFunction,... -% 'numeric','numeric','numeric','numeric',{'none','WC','prob'}}; - -numOfObjectives = 0; -for i = 1:size(cst,1) - if ~isempty(cst{i,6}) - numOfObjectives = numOfObjectives + numel(cst{i,6}); - end -end - -cnt = 0; - -newline = '\n'; - -%Setup Headlines -xPos = 5; -h = uicontrol(cstPanel,'Style','text','String','+/-','Position',[xPos ypos(cnt) buttonW objHeight],'TooltipString','Remove or add Constraint or Objective'); -xPos = xPos + h.Position(3) + fieldSep; -h = uicontrol(cstPanel,'Style','text','String','VOI name','Position',[xPos ypos(cnt) nameW objHeight],'TooltipString','Name of the structure with objective/constraint'); -xPos = xPos + h.Position(3) + fieldSep; -h = uicontrol(cstPanel,'Style','text','String','VOI type','Position',[xPos ypos(cnt) typeW objHeight],'TooltipString','Segmentation Classification'); -xPos = xPos + h.Position(3) + fieldSep; -h = uicontrol(cstPanel,'Style','text','String','OP','Position',[xPos ypos(cnt) opW objHeight],'TooltipString',['Overlap Priority' char(10) '(Smaller number overlaps higher number)']); -xPos = xPos + h.Position(3) + fieldSep; -h = uicontrol(cstPanel,'Style','text','String','Function','Position',[xPos ypos(cnt) functionW objHeight],'TooltipString','Objective/Constraint function type'); -xPos = xPos + h.Position(3) + fieldSep; -h = uicontrol(cstPanel,'Style','text','String','p','Position',[xPos ypos(cnt) penaltyW objHeight],'TooltipString','Optimization penalty'); -xPos = xPos + h.Position(3) + fieldSep; -h = uicontrol(cstPanel,'Style','text','String','| Parameters','Position',[xPos ypos(cnt) paramTitleW objHeight],'TooltipString','List of parameters','HorizontalAlignment','left'); -xPos = xPos + h.Position(3) + fieldSep; -cnt = cnt + 1; - -%Create Objectives / Constraints controls -for i = 1:size(cst,1) - if strcmp(cst(i,3),'IGNORED')~=1 - for j=1:numel(cst{i,6}) - - obj = cst{i,6}{j}; - - %Convert to class if not - if ~isa(obj,'matRad_DoseOptimizationFunction') - try - obj = matRad_DoseOptimizationFunction.createInstanceFromStruct(obj); - catch - warning('Objective/Constraint not valid!') - continue; - end - end - - %VOI - %data{Counter,1} = cst{i,2}; - %ypos = cstPanelPos(4) - (yTopSep + cnt*lineHeight); - xPos = 5; - - %h = uicontrol(cstPanel,'Style','popupmenu','String',cst(:,2)','Position',[xPos ypos 100 objHeight]); - %h.Value = i; - h = uicontrol(cstPanel,'Style','pushbutton','String','-','Position',[xPos ypos(cnt) buttonW objHeight],'TooltipString','Remove Objective/Constraint','Callback',{@btObjRemove_Callback,handles},... - 'UserData',[i,j]); - xPos = xPos + h.Position(3) + fieldSep; - h = uicontrol(cstPanel','Style','edit','String',cst{i,2},'Position',[xPos ypos(cnt) nameW objHeight],'TooltipString','Name',... - 'Enable','inactive',... %Disable editing of name atm - 'UserData',[i,2],'Callback',{@editCstParams_Callback,handles}); %Callback added, however, editing is disabled atm - xPos = xPos + h.Position(3) + fieldSep; - h = uicontrol(cstPanel,'Style','popupmenu','String',organTypes','Value',find(strcmp(cst{i,3},organTypes)),'Position',[xPos ypos(cnt) typeW objHeight],'TooltipString','Segmentation Classification',... - 'UserData',[i,3],'Callback',{@editCstParams_Callback,handles}); - xPos = xPos + h.Position(3) + fieldSep; - h = uicontrol(cstPanel,'Style','edit','String',num2str(cst{i,5}.Priority),'Position',[xPos ypos(cnt) opW objHeight],'TooltipString',['Overlap Priority' newline '(Smaller number overlaps higher number)'],... - 'UserData',[i,5],'Callback',{@editCstParams_Callback,handles}); - xPos = xPos + h.Position(3) + fieldSep; - - h = uicontrol(cstPanel,'Style','popupmenu','String',classNames(2,:)','Value',find(strcmp(obj.name,classNames(2,:))),'Position',[xPos ypos(cnt) functionW objHeight],'TooltipString','Select Objective/Constraint',... - 'UserData',{[i,j],classNames(1,:)},'Callback',{@changeObjFunction_Callback,handles}); - xPos = xPos + h.Position(3) + fieldSep; - - %Check if we have an objective to display penalty - if isa(obj,'DoseObjectives.matRad_DoseObjective') - h = uicontrol(cstPanel,'Style','edit','String',num2str(obj.penalty),'Position',[xPos ypos(cnt) penaltyW objHeight],'TooltipString','Objective Penalty','UserData',[i,j,0],'Callback',{@editObjParam_Callback,handles}); - else - h = uicontrol(cstPanel,'Style','edit','String','----','Position',[xPos ypos(cnt) penaltyW objHeight],'Enable','off'); - end - xPos = xPos + h.Position(3) + fieldSep; - - for p = 1:numel(obj.parameterNames) - %h = uicontrol(cstPanel,'Style','edit','String',obj.parameters{1,p},'Position',[xPos ypos(cnt) 100 objHeight],'Enable','inactive'); - %xPos = xPos + h.Position(3) + fieldSep; - h = text('Parent',tmpAxes,'String',['| ' obj.parameterNames{p} ':'],'VerticalAlignment','middle','units','pix','Position',[xPos ypos(cnt)+lineHeight/2],'Interpreter','tex','FontWeight','normal',... - 'FontSize',cstPanel.FontSize,'FontName',cstPanel.FontName,'FontUnits',cstPanel.FontUnits,'FontWeight','normal');%[xPos ypos(cnt) 100 objHeight]); - xPos = xPos + h.Extent(3) + fieldSep; - %h = annotation(cstPanel,'textbox','String',obj.parameters{1,p},'Units','pix','Position', [xPos ypos(cnt) 100 objHeight],'Interpreter','Tex'); - - %Check if we have a cell and therefore a parameter list - if iscell(obj.parameterTypes{p}) - h = uicontrol(cstPanel,'Style','popupmenu','String',obj.parameterTypes{p}','Value',obj.parameters{p},'TooltipString',obj.parameterNames{p},'Position',[xPos ypos(cnt) paramW*2 objHeight],'UserData',[i,j,p],'Callback',{@editObjParam_Callback,handles}); - else - h = uicontrol(cstPanel,'Style','edit','String',num2str(obj.parameters{p}),'TooltipString',obj.parameterNames{p},'Position',[xPos ypos(cnt) paramW objHeight],'UserData',[i,j,p],'Callback',{@editObjParam_Callback,handles}); - end - - xPos = xPos + h.Position(3) + fieldSep; - end - - cnt = cnt +1; - end - end -end -xPos = 5; -hAdd = uicontrol(cstPanel,'Style','pushbutton','String','+','Position',[xPos ypos(cnt) buttonW objHeight],'TooltipString','Add Objective/Constraint','Callback',{@btObjAdd_Callback,handles}); -xPos = xPos + hAdd.Position(3) + fieldSep; -h = uicontrol(cstPanel,'Style','popupmenu','String',cst(:,2)','Position',[xPos ypos(cnt) nameW objHeight]); -hAdd.UserData = h; - -%Calculate Scrollbar -lastPos = ypos(cnt); -firstPos = ypos(0); -tableHeight = abs(firstPos - lastPos); - -exceedFac = tableHeight / tableViewHeight; -if exceedFac > 1 - sliderFac = exceedFac - 1; - uicontrol(cstPanel,'Style','slider','Units','normalized','Position',[0.975 0 0.025 1],'Min',0,'Max',ceil(sliderFac)*tableViewHeight,'SliderStep',[lineHeight tableViewHeight] ./ (ceil(sliderFac)*tableViewHeight),'Value',ceil(sliderFac)*tableViewHeight - sliderPos,'Callback',{@cstTableSlider_Callback,handles}); -end - - - - -%set(handles.uiTable,'ColumnName',columnname); -%set(handles.uiTable,'ColumnFormat',columnformat); -%set(handles.uiTable,'ColumnEditable',[true true true true true true true true true true]); -%set(handles.uiTable,'Data',data); - - -% --- Executes when uipanel3 is resized. -function uipanel3_SizeChangedFcn(hObject, eventdata, handles) -% hObject handle to uipanel3 (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -try - generateCstTable(handles,evalin('base','cst')); -catch -end - -function btObjAdd_Callback(hObject, ~, handles) -% hObject handle to btnuiTableAdd (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) -popupHandle = hObject.UserData; -cstIndex = popupHandle.Value; - -cst = evalin('base','cst'); -%Add Standard Objective -if strcmp(cst{cstIndex,3},'TARGET') - cst{cstIndex,6}{end+1} = struct(DoseObjectives.matRad_SquaredDeviation); -else - cst{cstIndex,6}{end+1} = struct(DoseObjectives.matRad_SquaredOverdosing); -end - -assignin('base','cst',cst); - -%set(handles.uiTable,'data',data); - -%handles.State=1; -%guidata(hObject,handles); -%UpdateState(handles); - -generateCstTable(handles,cst); - -function btObjRemove_Callback(hObject, ~, handles) -% hObject handle to btnuiTableAdd (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) -ix = hObject.UserData; - -cst = evalin('base','cst'); -%Add Standard Objective - -cst{ix(1),6}(ix(2)) = []; - -assignin('base','cst',cst); - -%set(handles.uiTable,'data',data); - -%handles.State=1; -%guidata(hObject,handles); -%UpdateState(handles); - -generateCstTable(handles,cst); - -function editObjParam_Callback(hObject, ~, handles) -% hObject handle to btnuiTableAdd (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) -ix = hObject.UserData; - -cst = evalin('base','cst'); -%Add Standard Objective - -%if the third index is 0 we changed the penalty -%if we have a popupmenu selection we use value -%otherwise we use the edit string - -%{ -%obj = cst{ix(1),6}{ix(2)}; -%Convert to class if not -if ~isa(obj,'matRad_DoseOptimizationFunction') - try - eval([obj.className '(obj)']); - catch - warning('Objective/Constraint not valid!') - return; - end -end -%} - -if ix(3) == 0 - cst{ix(1),6}{ix(2)}.penalty = str2double(hObject.String); -elseif isequal(hObject.Style,'popupmenu') - cst{ix(1),6}{ix(2)}.parameters{ix(3)} = hObject.Value; -else - cst{ix(1),6}{ix(2)}.parameters{ix(3)} = str2double(hObject.String); -end - -assignin('base','cst',cst); - -%set(handles.uiTable,'data',data); - -%handles.State=1; -%guidata(hObject,handles); -%UpdateState(handles); - -generateCstTable(handles,cst); - -function changeObjFunction_Callback(hObject, ~, handles) -% hObject handle to btnuiTableAdd (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) -data = hObject.UserData; -ix = data{1}; -classNames = data{2}; -classToCreate = classNames{hObject.Value}; - -cst = evalin('base','cst'); -%Add Standard Objective - -%We just check if the user really wanted to change the objective to be -%user-friendly -currentObj = cst{ix(1),6}{ix(2)}; -currentClass = class(currentObj); -if ~strcmp(currentClass,classToCreate) - newObj = eval(classToCreate); - - % Only if we have a penalty value for optimization, apply the new one - % Maybe this check should be more exact? - if (isfield(currentObj,'penalty') || isprop(currentObj,'penalty')) && isprop(newObj,'penalty') - newObj.penalty = currentObj.penalty; - end - - cst{ix(1),6}{ix(2)} = struct(newObj); - - assignin('base','cst',cst); - - %set(handles.uiTable,'data',data); - - %handles.State=1; - %guidata(hObject,handles); - %UpdateState(handles); - - generateCstTable(handles,cst); -end - -function editCstParams_Callback(hObject,~,handles) -data = hObject.UserData; -ix = data(1); -col = data(2); - -cst = evalin('base','cst'); - -switch col - case 2 - cst{ix,col} = hObject.String; - case 3 - cst{ix,col} = hObject.String{hObject.Value}; - case 5 - cst{ix,col}.Priority = uint32(str2double(hObject.String)); - otherwise - warning('Wrong column assignment in GUI based cst setting'); -end - -assignin('base','cst',cst); - -generateCstTable(handles,cst); - - -% --- Executes on button press in radiobutton3Dconf. -function radiobutton3Dconf_Callback(hObject, eventdata, handles) -% hObject handle to radiobutton3Dconf (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hint: get(hObject,'Value') returns toggle state of radiobutton3Dconf - -function x = matRad_checkForConnectedBixelRows(stf) - -x = true; - -for i = 1:size(stf,2) - - bixelPos = reshape([stf(i).ray.rayPos_bev],3,[]); - - rowCoords = unique(bixelPos(3,:)); - - for j = 1:numel(rowCoords) - - increments = diff(bixelPos(1,rowCoords(j) == bixelPos(3,:))); - - % if we find one not connected row -> return false - if numel(unique(increments)) > 1 - x = false; - return; - end - end - -end - -% --- Executes on slider movement. -function cstTableSlider_Callback(hObject, eventdata, handles) -% hObject handle to cstTableSlider (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hints: get(hObject,'Value') returns position of slider -% get(hObject,'Min') and get(hObject,'Max') to determine range of slider -generateCstTable(handles,evalin('base','cst')); - -% --- Executes during object creation, after setting all properties. -function cstTableSlider_CreateFcn(hObject, eventdata, handles) -% hObject handle to cstTableSlider (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles empty - handles not created until after all CreateFcns called - -% Hint: slider controls usually have a light gray background. -if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor',[.9 .9 .9]); -end - - - -% --- Creates and returns a handle to the GUI figure. -function h1 = matRadGUI_export_LayoutFcn(policy) -% policy - create a new figure or use a singleton. 'new' or 'reuse'. - -persistent hsingleton; -if strcmpi(policy, 'reuse') & ishandle(hsingleton) - h1 = hsingleton; - return; -end -load matRadGUI_export.mat - - -appdata = []; -appdata.GUIDEOptions = mat{1}; -appdata.lastValidTag = 'figure1'; -appdata.UsedByGUIData_m = struct(... - 'windowPresets', struct(... - 'name', 'Custom', ... - 'center', NaN, ... - 'width', NaN)); -appdata.GUIDELayoutEditor = []; -appdata.initTags = struct(... - 'handle', [], ... - 'tag', 'figure1'); - -h1 = figure(... -'PaperUnits',get(0,'defaultfigurePaperUnits'),... -'Units','characters',... -'Position',[138.4 -7.38461538461539 273.4 59.5384615384615],... -'Visible','on',... -'Color',[0.501960784313725 0.501960784313725 0.501960784313725],... -'CloseRequestFcn',@(hObject,eventdata)matRadGUI_export('figure1_CloseRequestFcn',hObject,eventdata,guidata(hObject)),... -'IntegerHandle','off',... -'Colormap',[0 0 0.5625;0 0 0.625;0 0 0.6875;0 0 0.75;0 0 0.8125;0 0 0.875;0 0 0.9375;0 0 1;0 0.0625 1;0 0.125 1;0 0.1875 1;0 0.25 1;0 0.3125 1;0 0.375 1;0 0.4375 1;0 0.5 1;0 0.5625 1;0 0.625 1;0 0.6875 1;0 0.75 1;0 0.8125 1;0 0.875 1;0 0.9375 1;0 1 1;0.0625 1 1;0.125 1 0.9375;0.1875 1 0.875;0.25 1 0.8125;0.3125 1 0.75;0.375 1 0.6875;0.4375 1 0.625;0.5 1 0.5625;0.5625 1 0.5;0.625 1 0.4375;0.6875 1 0.375;0.75 1 0.3125;0.8125 1 0.25;0.875 1 0.1875;0.9375 1 0.125;1 1 0.0625;1 1 0;1 0.9375 0;1 0.875 0;1 0.8125 0;1 0.75 0;1 0.6875 0;1 0.625 0;1 0.5625 0;1 0.5 0;1 0.4375 0;1 0.375 0;1 0.3125 0;1 0.25 0;1 0.1875 0;1 0.125 0;1 0.0625 0;1 0 0;0.9375 0 0;0.875 0 0;0.8125 0 0;0.75 0 0;0.6875 0 0;0.625 0 0;0.5625 0 0],... -'MenuBar','none',... -'Name','matRadGUI',... -'NumberTitle','off',... -'Tag','figure1',... -'UserData',[],... -'PaperPosition',get(0,'defaultfigurePaperPosition'),... -'PaperSize',[20.99999864 29.69999902],... -'PaperType',get(0,'defaultfigurePaperType'),... -'InvertHardcopy',get(0,'defaultfigureInvertHardcopy'),... -'ScreenPixelsPerInchMode','manual',... -'HandleVisibility','callback',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'axesLogo'; - -h2 = axes(... -'Parent',h1,... -'FontUnits',get(0,'defaultaxesFontUnits'),... -'Units',get(0,'defaultaxesUnits'),... -'CameraPosition',[0.5 0.5 9.16025403784439],... -'CameraPositionMode',get(0,'defaultaxesCameraPositionMode'),... -'CameraTarget',[0.5 0.5 0.5],... -'CameraTargetMode',get(0,'defaultaxesCameraTargetMode'),... -'CameraViewAngle',6.60861036031192,... -'CameraViewAngleMode',get(0,'defaultaxesCameraViewAngleMode'),... -'PlotBoxAspectRatio',[1 0.288951841359773 0.288951841359773],... -'PlotBoxAspectRatioMode',get(0,'defaultaxesPlotBoxAspectRatioMode'),... -'FontName','CMU Serif',... -'Colormap',[0 0 0.5625;0 0 0.625;0 0 0.6875;0 0 0.75;0 0 0.8125;0 0 0.875;0 0 0.9375;0 0 1;0 0.0625 1;0 0.125 1;0 0.1875 1;0 0.25 1;0 0.3125 1;0 0.375 1;0 0.4375 1;0 0.5 1;0 0.5625 1;0 0.625 1;0 0.6875 1;0 0.75 1;0 0.8125 1;0 0.875 1;0 0.9375 1;0 1 1;0.0625 1 1;0.125 1 0.9375;0.1875 1 0.875;0.25 1 0.8125;0.3125 1 0.75;0.375 1 0.6875;0.4375 1 0.625;0.5 1 0.5625;0.5625 1 0.5;0.625 1 0.4375;0.6875 1 0.375;0.75 1 0.3125;0.8125 1 0.25;0.875 1 0.1875;0.9375 1 0.125;1 1 0.0625;1 1 0;1 0.9375 0;1 0.875 0;1 0.8125 0;1 0.75 0;1 0.6875 0;1 0.625 0;1 0.5625 0;1 0.5 0;1 0.4375 0;1 0.375 0;1 0.3125 0;1 0.25 0;1 0.1875 0;1 0.125 0;1 0.0625 0;1 0 0;0.9375 0 0;0.875 0 0;0.8125 0 0;0.75 0 0;0.6875 0 0;0.625 0 0;0.5625 0 0],... -'ColormapMode',get(0,'defaultaxesColormapMode'),... -'Alphamap',[0 0.0159 0.0317 0.0476 0.0635 0.0794 0.0952 0.1111 0.127 0.1429 0.1587 0.1746 0.1905 0.2063 0.2222 0.2381 0.254 0.2698 0.2857 0.3016 0.3175 0.3333 0.3492 0.3651 0.381 0.3968 0.4127 0.4286 0.4444 0.4603 0.4762 0.4921 0.5079 0.5238 0.5397 0.5556 0.5714 0.5873 0.6032 0.619 0.6349 0.6508 0.6667 0.6825 0.6984 0.7143 0.7302 0.746 0.7619 0.7778 0.7937 0.8095 0.8254 0.8413 0.8571 0.873 0.8889 0.9048 0.9206 0.9365 0.9524 0.9683 0.9841 1],... -'AlphamapMode',get(0,'defaultaxesAlphamapMode'),... -'XTick',[0 0.2 0.4 0.6 0.8 1],... -'XTickMode',get(0,'defaultaxesXTickMode'),... -'XTickLabel',{ '0'; '0.2'; '0.4'; '0.6'; '0.8'; '1' },... -'XTickLabelMode',get(0,'defaultaxesXTickLabelMode'),... -'YTick',[0 0.5 1],... -'YTickMode',get(0,'defaultaxesYTickMode'),... -'YTickLabel',{ '0'; '0.5'; '1' },... -'YTickLabelMode',get(0,'defaultaxesYTickLabelMode'),... -'Color',get(0,'defaultaxesColor'),... -'CameraMode',get(0,'defaultaxesCameraMode'),... -'DataSpaceMode',get(0,'defaultaxesDataSpaceMode'),... -'ColorSpaceMode',get(0,'defaultaxesColorSpaceMode'),... -'DecorationContainerMode',get(0,'defaultaxesDecorationContainerMode'),... -'ChildContainerMode',get(0,'defaultaxesChildContainerMode'),... -'XRulerMode',get(0,'defaultaxesXRulerMode'),... -'YRulerMode',get(0,'defaultaxesYRulerMode'),... -'ZRulerMode',get(0,'defaultaxesZRulerMode'),... -'AmbientLightSourceMode',get(0,'defaultaxesAmbientLightSourceMode'),... -'Tag','axesLogo',... -'Position',[0.444874274661509 0.893725992317542 0.184397163120567 0.0998719590268886],... -'ActivePositionProperty','position',... -'ActivePositionPropertyMode',get(0,'defaultaxesActivePositionPropertyMode'),... -'LooseInset',[0.182759687929063 0.112926163636008 0.133555156563546 0.0769951115700055],... -'FontSize',9.63,... -'SortMethod','childorder',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -h3 = get(h2,'title'); - -set(h3,... -'Parent',h2,... -'Units','data',... -'FontUnits','points',... -'DecorationContainer',[],... -'DecorationContainerMode','auto',... -'Color',[0 0 0],... -'ColorMode','auto',... -'Position',[0.500002778623327 1.02596323529412 0.5],... -'PositionMode','auto',... -'String',blanks(0),... -'Interpreter','tex',... -'Rotation',0,... -'RotationMode','auto',... -'FontName','CMU Serif',... -'FontSize',10.593,... -'FontSizeMode','auto',... -'FontAngle','normal',... -'FontWeight','bold',... -'HorizontalAlignment','center',... -'HorizontalAlignmentMode','auto',... -'VerticalAlignment','bottom',... -'VerticalAlignmentMode','auto',... -'EdgeColor','none',... -'LineStyle','-',... -'LineWidth',0.5,... -'BackgroundColor','none',... -'Margin',3,... -'Clipping','off',... -'Layer','middle',... -'LayerMode','auto',... -'FontSmoothing','on',... -'FontSmoothingMode','auto',... -'DisplayName',blanks(0),... -'IncludeRenderer','on',... -'IsContainer','off',... -'IsContainerMode','auto',... -'HelpTopicKey',blanks(0),... -'ButtonDownFcn',blanks(0),... -'BusyAction','queue',... -'Interruptible','on',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... -'DeleteFcn',blanks(0),... -'Tag',blanks(0),... -'HitTest','on',... -'PickableParts','visible',... -'PickablePartsMode','auto',... -'DimensionNames',{ 'X' 'Y' 'Z' },... -'DimensionNamesMode','auto',... -'XLimInclude','on',... -'YLimInclude','on',... -'ZLimInclude','on',... -'CLimInclude','on',... -'ALimInclude','on',... -'Description','Axes Title',... -'DescriptionMode','auto',... -'Visible','on',... -'Serializable','on',... -'HandleVisibility','off',... -'TransformForPrintFcnImplicitInvoke','on',... -'TransformForPrintFcnImplicitInvokeMode','auto'); - -h4 = get(h2,'xlabel'); - -set(h4,... -'Parent',h2,... -'Units','data',... -'FontUnits','points',... -'DecorationContainer',[],... -'DecorationContainerMode','auto',... -'Color',[0.15 0.15 0.15],... -'ColorMode','auto',... -'Position',[0.500000476837158 -0.277303926477245 0],... -'PositionMode','auto',... -'String',blanks(0),... -'Interpreter','tex',... -'Rotation',0,... -'RotationMode','auto',... -'FontName','CMU Serif',... -'FontSize',10.593,... -'FontSizeMode','auto',... -'FontAngle','normal',... -'FontWeight','normal',... -'HorizontalAlignment','center',... -'HorizontalAlignmentMode','auto',... -'VerticalAlignment','top',... -'VerticalAlignmentMode','auto',... -'EdgeColor','none',... -'LineStyle','-',... -'LineWidth',0.5,... -'BackgroundColor','none',... -'Margin',3,... -'Clipping','off',... -'Layer','back',... -'LayerMode','auto',... -'FontSmoothing','on',... -'FontSmoothingMode','auto',... -'DisplayName',blanks(0),... -'IncludeRenderer','on',... -'IsContainer','off',... -'IsContainerMode','auto',... -'HelpTopicKey',blanks(0),... -'ButtonDownFcn',blanks(0),... -'BusyAction','queue',... -'Interruptible','on',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... -'DeleteFcn',blanks(0),... -'Tag',blanks(0),... -'HitTest','on',... -'PickableParts','visible',... -'PickablePartsMode','auto',... -'DimensionNames',{ 'X' 'Y' 'Z' },... -'DimensionNamesMode','auto',... -'XLimInclude','on',... -'YLimInclude','on',... -'ZLimInclude','on',... -'CLimInclude','on',... -'ALimInclude','on',... -'Description','AxisRulerBase Label',... -'DescriptionMode','auto',... -'Visible','on',... -'Serializable','on',... -'HandleVisibility','off',... -'TransformForPrintFcnImplicitInvoke','on',... -'TransformForPrintFcnImplicitInvokeMode','auto'); - -h5 = get(h2,'ylabel'); - -set(h5,... -'Parent',h2,... -'Units','data',... -'FontUnits','points',... -'DecorationContainer',[],... -'DecorationContainerMode','auto',... -'Color',[0.15 0.15 0.15],... -'ColorMode','auto',... -'Position',[-0.0943626077857305 0.500000476837158 0],... -'PositionMode','auto',... -'String',blanks(0),... -'Interpreter','tex',... -'Rotation',90,... -'RotationMode','auto',... -'FontName','CMU Serif',... -'FontSize',10.593,... -'FontSizeMode','auto',... -'FontAngle','normal',... -'FontWeight','normal',... -'HorizontalAlignment','center',... -'HorizontalAlignmentMode','auto',... -'VerticalAlignment','bottom',... -'VerticalAlignmentMode','auto',... -'EdgeColor','none',... -'LineStyle','-',... -'LineWidth',0.5,... -'BackgroundColor','none',... -'Margin',3,... -'Clipping','off',... -'Layer','back',... -'LayerMode','auto',... -'FontSmoothing','on',... -'FontSmoothingMode','auto',... -'DisplayName',blanks(0),... -'IncludeRenderer','on',... -'IsContainer','off',... -'IsContainerMode','auto',... -'HelpTopicKey',blanks(0),... -'ButtonDownFcn',blanks(0),... -'BusyAction','queue',... -'Interruptible','on',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... -'DeleteFcn',blanks(0),... -'Tag',blanks(0),... -'HitTest','on',... -'PickableParts','visible',... -'PickablePartsMode','auto',... -'DimensionNames',{ 'X' 'Y' 'Z' },... -'DimensionNamesMode','auto',... -'XLimInclude','on',... -'YLimInclude','on',... -'ZLimInclude','on',... -'CLimInclude','on',... -'ALimInclude','on',... -'Description','AxisRulerBase Label',... -'DescriptionMode','auto',... -'Visible','on',... -'Serializable','on',... -'HandleVisibility','off',... -'TransformForPrintFcnImplicitInvoke','on',... -'TransformForPrintFcnImplicitInvokeMode','auto'); - -h6 = get(h2,'zlabel'); - -set(h6,... -'Parent',h2,... -'Units','data',... -'FontUnits','points',... -'DecorationContainer',[],... -'DecorationContainerMode','auto',... -'Color',[0.15 0.15 0.15],... -'ColorMode','auto',... -'Position',[0 0 0],... -'PositionMode','auto',... -'String',blanks(0),... -'Interpreter','tex',... -'Rotation',0,... -'RotationMode','auto',... -'FontName','CMU Serif',... -'FontSize',10,... -'FontSizeMode','auto',... -'FontAngle','normal',... -'FontWeight','normal',... -'HorizontalAlignment','left',... -'HorizontalAlignmentMode','auto',... -'VerticalAlignment','middle',... -'VerticalAlignmentMode','auto',... -'EdgeColor','none',... -'LineStyle','-',... -'LineWidth',0.5,... -'BackgroundColor','none',... -'Margin',3,... -'Clipping','off',... -'Layer','middle',... -'LayerMode','auto',... -'FontSmoothing','on',... -'FontSmoothingMode','auto',... -'DisplayName',blanks(0),... -'IncludeRenderer','on',... -'IsContainer','off',... -'IsContainerMode','auto',... -'HelpTopicKey',blanks(0),... -'ButtonDownFcn',blanks(0),... -'BusyAction','queue',... -'Interruptible','on',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... -'DeleteFcn',blanks(0),... -'Tag',blanks(0),... -'HitTest','on',... -'PickableParts','visible',... -'PickablePartsMode','auto',... -'DimensionNames',{ 'X' 'Y' 'Z' },... -'DimensionNamesMode','auto',... -'XLimInclude','on',... -'YLimInclude','on',... -'ZLimInclude','on',... -'CLimInclude','on',... -'ALimInclude','on',... -'Description','AxisRulerBase Label',... -'DescriptionMode','auto',... -'Visible','off',... -'Serializable','on',... -'HandleVisibility','off',... -'TransformForPrintFcnImplicitInvoke','on',... -'TransformForPrintFcnImplicitInvokeMode','auto'); - -appdata = []; -appdata.lastValidTag = 'axesDKFZ'; - -h7 = axes(... -'Parent',h1,... -'FontUnits',get(0,'defaultaxesFontUnits'),... -'Units',get(0,'defaultaxesUnits'),... -'CameraPosition',[0.5 0.5 9.16025403784439],... -'CameraPositionMode',get(0,'defaultaxesCameraPositionMode'),... -'CameraTarget',[0.5 0.5 0.5],... -'CameraTargetMode',get(0,'defaultaxesCameraTargetMode'),... -'CameraViewAngle',6.60861036031192,... -'CameraViewAngleMode',get(0,'defaultaxesCameraViewAngleMode'),... -'PlotBoxAspectRatio',[1 0.145161290322581 0.145161290322581],... -'PlotBoxAspectRatioMode',get(0,'defaultaxesPlotBoxAspectRatioMode'),... -'FontName','CMU Serif',... -'Colormap',[0 0 0.5625;0 0 0.625;0 0 0.6875;0 0 0.75;0 0 0.8125;0 0 0.875;0 0 0.9375;0 0 1;0 0.0625 1;0 0.125 1;0 0.1875 1;0 0.25 1;0 0.3125 1;0 0.375 1;0 0.4375 1;0 0.5 1;0 0.5625 1;0 0.625 1;0 0.6875 1;0 0.75 1;0 0.8125 1;0 0.875 1;0 0.9375 1;0 1 1;0.0625 1 1;0.125 1 0.9375;0.1875 1 0.875;0.25 1 0.8125;0.3125 1 0.75;0.375 1 0.6875;0.4375 1 0.625;0.5 1 0.5625;0.5625 1 0.5;0.625 1 0.4375;0.6875 1 0.375;0.75 1 0.3125;0.8125 1 0.25;0.875 1 0.1875;0.9375 1 0.125;1 1 0.0625;1 1 0;1 0.9375 0;1 0.875 0;1 0.8125 0;1 0.75 0;1 0.6875 0;1 0.625 0;1 0.5625 0;1 0.5 0;1 0.4375 0;1 0.375 0;1 0.3125 0;1 0.25 0;1 0.1875 0;1 0.125 0;1 0.0625 0;1 0 0;0.9375 0 0;0.875 0 0;0.8125 0 0;0.75 0 0;0.6875 0 0;0.625 0 0;0.5625 0 0],... -'ColormapMode',get(0,'defaultaxesColormapMode'),... -'Alphamap',[0 0.0159 0.0317 0.0476 0.0635 0.0794 0.0952 0.1111 0.127 0.1429 0.1587 0.1746 0.1905 0.2063 0.2222 0.2381 0.254 0.2698 0.2857 0.3016 0.3175 0.3333 0.3492 0.3651 0.381 0.3968 0.4127 0.4286 0.4444 0.4603 0.4762 0.4921 0.5079 0.5238 0.5397 0.5556 0.5714 0.5873 0.6032 0.619 0.6349 0.6508 0.6667 0.6825 0.6984 0.7143 0.7302 0.746 0.7619 0.7778 0.7937 0.8095 0.8254 0.8413 0.8571 0.873 0.8889 0.9048 0.9206 0.9365 0.9524 0.9683 0.9841 1],... -'AlphamapMode',get(0,'defaultaxesAlphamapMode'),... -'XTick',[0 0.2 0.4 0.6 0.8 1],... -'XTickMode',get(0,'defaultaxesXTickMode'),... -'XTickLabel',{ '0'; '0.2'; '0.4'; '0.6'; '0.8'; '1' },... -'XTickLabelMode',get(0,'defaultaxesXTickLabelMode'),... -'YTick',[0 0.5 1],... -'YTickMode',get(0,'defaultaxesYTickMode'),... -'YTickLabel',{ '0'; '0.5'; '1' },... -'YTickLabelMode',get(0,'defaultaxesYTickLabelMode'),... -'Color',get(0,'defaultaxesColor'),... -'CameraMode',get(0,'defaultaxesCameraMode'),... -'DataSpaceMode',get(0,'defaultaxesDataSpaceMode'),... -'ColorSpaceMode',get(0,'defaultaxesColorSpaceMode'),... -'DecorationContainerMode',get(0,'defaultaxesDecorationContainerMode'),... -'ChildContainerMode',get(0,'defaultaxesChildContainerMode'),... -'XRulerMode',get(0,'defaultaxesXRulerMode'),... -'YRulerMode',get(0,'defaultaxesYRulerMode'),... -'ZRulerMode',get(0,'defaultaxesZRulerMode'),... -'AmbientLightSourceMode',get(0,'defaultaxesAmbientLightSourceMode'),... -'Tag','axesDKFZ',... -'Position',[0.652482269503546 0.903969270166453 0.259187620889749 0.0717029449423816],... -'ActivePositionProperty','position',... -'ActivePositionPropertyMode',get(0,'defaultaxesActivePositionPropertyMode'),... -'LooseInset',[0.13 0.11 0.0950000000000001 0.0749999999999999],... -'FontSize',9.63,... -'SortMethod','childorder',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -h8 = get(h7,'title'); - -set(h8,... -'Parent',h7,... -'Units','data',... -'FontUnits','points',... -'DecorationContainer',[],... -'DecorationContainerMode','auto',... -'Color',[0 0 0],... -'ColorMode','auto',... -'Position',[0.500002880250254 1.03678125 0.500000000000007],... -'PositionMode','auto',... -'String',blanks(0),... -'Interpreter','tex',... -'Rotation',0,... -'RotationMode','auto',... -'FontName','CMU Serif',... -'FontSize',10.593,... -'FontSizeMode','auto',... -'FontAngle','normal',... -'FontWeight','bold',... -'HorizontalAlignment','center',... -'HorizontalAlignmentMode','auto',... -'VerticalAlignment','bottom',... -'VerticalAlignmentMode','auto',... -'EdgeColor','none',... -'LineStyle','-',... -'LineWidth',0.5,... -'BackgroundColor','none',... -'Margin',3,... -'Clipping','off',... -'Layer','middle',... -'LayerMode','auto',... -'FontSmoothing','on',... -'FontSmoothingMode','auto',... -'DisplayName',blanks(0),... -'IncludeRenderer','on',... -'IsContainer','off',... -'IsContainerMode','auto',... -'HelpTopicKey',blanks(0),... -'ButtonDownFcn',blanks(0),... -'BusyAction','queue',... -'Interruptible','on',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... -'DeleteFcn',blanks(0),... -'Tag',blanks(0),... -'HitTest','on',... -'PickableParts','visible',... -'PickablePartsMode','auto',... -'DimensionNames',{ 'X' 'Y' 'Z' },... -'DimensionNamesMode','auto',... -'XLimInclude','on',... -'YLimInclude','on',... -'ZLimInclude','on',... -'CLimInclude','on',... -'ALimInclude','on',... -'Description','Axes Title',... -'DescriptionMode','auto',... -'Visible','on',... -'Serializable','on',... -'HandleVisibility','off',... -'TransformForPrintFcnImplicitInvoke','on',... -'TransformForPrintFcnImplicitInvokeMode','auto'); - -h9 = get(h7,'xlabel'); - -set(h9,... -'Parent',h7,... -'Units','data',... -'FontUnits','points',... -'DecorationContainer',[],... -'DecorationContainerMode','auto',... -'Color',[0.15 0.15 0.15],... -'ColorMode','auto',... -'Position',[0.500000476837158 -0.392847229176095 7.105427357601e-15],... -'PositionMode','auto',... -'String',blanks(0),... -'Interpreter','tex',... -'Rotation',0,... -'RotationMode','auto',... -'FontName','CMU Serif',... -'FontSize',10.593,... -'FontSizeMode','auto',... -'FontAngle','normal',... -'FontWeight','normal',... -'HorizontalAlignment','center',... -'HorizontalAlignmentMode','auto',... -'VerticalAlignment','top',... -'VerticalAlignmentMode','auto',... -'EdgeColor','none',... -'LineStyle','-',... -'LineWidth',0.5,... -'BackgroundColor','none',... -'Margin',3,... -'Clipping','off',... -'Layer','back',... -'LayerMode','auto',... -'FontSmoothing','on',... -'FontSmoothingMode','auto',... -'DisplayName',blanks(0),... -'IncludeRenderer','on',... -'IsContainer','off',... -'IsContainerMode','auto',... -'HelpTopicKey',blanks(0),... -'ButtonDownFcn',blanks(0),... -'BusyAction','queue',... -'Interruptible','on',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... -'DeleteFcn',blanks(0),... -'Tag',blanks(0),... -'HitTest','on',... -'PickableParts','visible',... -'PickablePartsMode','auto',... -'DimensionNames',{ 'X' 'Y' 'Z' },... -'DimensionNamesMode','auto',... -'XLimInclude','on',... -'YLimInclude','on',... -'ZLimInclude','on',... -'CLimInclude','on',... -'ALimInclude','on',... -'Description','AxisRulerBase Label',... -'DescriptionMode','auto',... -'Visible','on',... -'Serializable','on',... -'HandleVisibility','off',... -'TransformForPrintFcnImplicitInvoke','on',... -'TransformForPrintFcnImplicitInvokeMode','auto'); - -h10 = get(h7,'ylabel'); - -set(h10,... -'Parent',h7,... -'Units','data',... -'FontUnits','points',... -'DecorationContainer',[],... -'DecorationContainerMode','auto',... -'Color',[0.15 0.15 0.15],... -'ColorMode','auto',... -'Position',[-0.0671572591700866 0.50000047683716 7.105427357601e-15],... -'PositionMode','auto',... -'String',blanks(0),... -'Interpreter','tex',... -'Rotation',90,... -'RotationMode','auto',... -'FontName','CMU Serif',... -'FontSize',10.593,... -'FontSizeMode','auto',... -'FontAngle','normal',... -'FontWeight','normal',... -'HorizontalAlignment','center',... -'HorizontalAlignmentMode','auto',... -'VerticalAlignment','bottom',... -'VerticalAlignmentMode','auto',... -'EdgeColor','none',... -'LineStyle','-',... -'LineWidth',0.5,... -'BackgroundColor','none',... -'Margin',3,... -'Clipping','off',... -'Layer','back',... -'LayerMode','auto',... -'FontSmoothing','on',... -'FontSmoothingMode','auto',... -'DisplayName',blanks(0),... -'IncludeRenderer','on',... -'IsContainer','off',... -'IsContainerMode','auto',... -'HelpTopicKey',blanks(0),... -'ButtonDownFcn',blanks(0),... -'BusyAction','queue',... -'Interruptible','on',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... -'DeleteFcn',blanks(0),... -'Tag',blanks(0),... -'HitTest','on',... -'PickableParts','visible',... -'PickablePartsMode','auto',... -'DimensionNames',{ 'X' 'Y' 'Z' },... -'DimensionNamesMode','auto',... -'XLimInclude','on',... -'YLimInclude','on',... -'ZLimInclude','on',... -'CLimInclude','on',... -'ALimInclude','on',... -'Description','AxisRulerBase Label',... -'DescriptionMode','auto',... -'Visible','on',... -'Serializable','on',... -'HandleVisibility','off',... -'TransformForPrintFcnImplicitInvoke','on',... -'TransformForPrintFcnImplicitInvokeMode','auto'); - -h11 = get(h7,'zlabel'); - -set(h11,... -'Parent',h7,... -'Units','data',... -'FontUnits','points',... -'DecorationContainer',[],... -'DecorationContainerMode','auto',... -'Color',[0.15 0.15 0.15],... -'ColorMode','auto',... -'Position',[0 0 0],... -'PositionMode','auto',... -'String',blanks(0),... -'Interpreter','tex',... -'Rotation',0,... -'RotationMode','auto',... -'FontName','CMU Serif',... -'FontSize',10,... -'FontSizeMode','auto',... -'FontAngle','normal',... -'FontWeight','normal',... -'HorizontalAlignment','left',... -'HorizontalAlignmentMode','auto',... -'VerticalAlignment','middle',... -'VerticalAlignmentMode','auto',... -'EdgeColor','none',... -'LineStyle','-',... -'LineWidth',0.5,... -'BackgroundColor','none',... -'Margin',3,... -'Clipping','off',... -'Layer','middle',... -'LayerMode','auto',... -'FontSmoothing','on',... -'FontSmoothingMode','auto',... -'DisplayName',blanks(0),... -'IncludeRenderer','on',... -'IsContainer','off',... -'IsContainerMode','auto',... -'HelpTopicKey',blanks(0),... -'ButtonDownFcn',blanks(0),... -'BusyAction','queue',... -'Interruptible','on',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... -'DeleteFcn',blanks(0),... -'Tag',blanks(0),... -'HitTest','on',... -'PickableParts','visible',... -'PickablePartsMode','auto',... -'DimensionNames',{ 'X' 'Y' 'Z' },... -'DimensionNamesMode','auto',... -'XLimInclude','on',... -'YLimInclude','on',... -'ZLimInclude','on',... -'CLimInclude','on',... -'ALimInclude','on',... -'Description','AxisRulerBase Label',... -'DescriptionMode','auto',... -'Visible','off',... -'Serializable','on',... -'HandleVisibility','off',... -'TransformForPrintFcnImplicitInvoke','on',... -'TransformForPrintFcnImplicitInvokeMode','auto'); - -appdata = []; -appdata.lastValidTag = 'uipanel1'; - -h12 = uipanel(... -'Parent',h1,... -'FontUnits',get(0,'defaultuipanelFontUnits'),... -'Units',get(0,'defaultuipanelUnits'),... -'ShadowColor',get(0,'defaultuipanelShadowColor'),... -'Title','Plan',... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Tag','uipanel1',... -'UserData',[],... -'Clipping','off',... -'Position',[0.00451321727917473 0.527528809218956 0.430689877498388 0.272727272727273],... -'FontName','Helvetica',... -'FontWeight','bold',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'txtBixelWidth'; - -h13 = uicontrol(... -'Parent',h12,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','bixel width in [mm]',... -'Style','text',... -'Position',[0.0347043701799486 0.859315589353612 0.17866323907455 0.0950570342205324],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Children',[],... -'Tag','txtBixelWidth',... -'UserData',[],... -'FontName','Helvetica',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'editBixelWidth'; - -h14 = uicontrol(... -'Parent',h12,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','5',... -'Style','edit',... -'Position',[0.219794344473008 0.889733840304182 0.161953727506427 0.0836501901140684],... -'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... -'Callback',@(hObject,eventdata)matRadGUI_export('editBixelWidth_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('editBixelWidth_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... -'Tag','editBixelWidth',... -'FontWeight','bold'); - -appdata = []; -appdata.lastValidTag = 'txtGantryAngle'; - -h15 = uicontrol(... -'Parent',h12,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','Gantry Angle in °',... -'Style','text',... -'Position',[0.032133676092545 0.752851711026616 0.176092544987147 0.0950570342205324],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Children',[],... -'Tag','txtGantryAngle',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'editGantryAngle'; - -h16 = uicontrol(... -'Parent',h12,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','0',... -'Style','edit',... -'Position',[0.219794344473008 0.779467680608365 0.161953727506427 0.0836501901140684],... -'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... -'Callback',@(hObject,eventdata)matRadGUI_export('editGantryAngle_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('editGantryAngle_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... -'Tag','editGantryAngle',... -'FontWeight','bold'); - -appdata = []; -appdata.lastValidTag = 'txtCouchAngle'; - -h17 = uicontrol(... -'Parent',h12,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','Couch Angle in °',... -'Style','text',... -'Position',[0.0347043701799486 0.64638783269962 0.173521850899743 0.0950570342205324],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Children',[],... -'Tag','txtCouchAngle',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'editCouchAngle'; - -h18 = uicontrol(... -'Parent',h12,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','0',... -'Style','edit',... -'Position',[0.219794344473008 0.669201520912547 0.161953727506427 0.0836501901140685],... -'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... -'Callback',@(hObject,eventdata)matRadGUI_export('editCouchAngle_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('editCouchAngle_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... -'Tag','editCouchAngle',... -'FontWeight','bold'); - -appdata = []; -appdata.lastValidTag = 'popupRadMode'; - -h19 = uicontrol(... -'Parent',h12,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String',{ 'photons'; 'protons'; 'carbon' },... -'Style','popupmenu',... -'Value',1,... -'Position',[0.219794344473008 0.52851711026616 0.161953727506427 0.114068441064639],... -'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... -'Callback',@(hObject,eventdata)matRadGUI_export('popupRadMode_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('popupRadMode_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... -'Tag','popupRadMode',... -'FontWeight','bold'); - -appdata = []; -appdata.lastValidTag = 'txtRadMode'; - -h20 = uicontrol(... -'Parent',h12,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','Radiation Mode',... -'Style','text',... -'Position',[0.051413881748072 0.539923954372624 0.146529562982005 0.0950570342205324],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Children',[],... -'Tag','txtRadMode',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'txtNumOfFractions'; - -h21 = uicontrol(... -'Parent',h12,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','# Fractions',... -'Style','text',... -'Position',[0.051413881748072 0.209125475285171 0.143958868894602 0.106463878326996],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Children',[],... -'Tag','txtNumOfFractions',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'editFraction'; - -h22 = uicontrol(... -'Parent',h12,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','30',... -'Style','edit',... -'Position',[0.219794344473008 0.228136882129278 0.161953727506427 0.0836501901140684],... -'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... -'Callback',@(hObject,eventdata)matRadGUI_export('editFraction_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('editFraction_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... -'Tag','editFraction',... -'FontWeight','bold'); - -appdata = []; -appdata.lastValidTag = 'txtIsoCenter'; - -h23 = uicontrol(... -'Parent',h12,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','IsoCenter in [mm]',... -'Style','text',... -'Position',[0.0282776349614396 0.330798479087452 0.201799485861183 0.091254752851711],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Children',[],... -'Tag','txtIsoCenter',... -'UserData',[],... -'FontName','Helvetica',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'editIsoCenter'; - -h24 = uicontrol(... -'Parent',h12,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','0 0 0',... -'Style','edit',... -'Position',[0.219794344473008 0.338403041825095 0.161953727506427 0.0836501901140684],... -'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... -'Callback',@(hObject,eventdata)matRadGUI_export('editIsoCenter_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Enable','off',... -'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('editIsoCenter_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... -'Tag','editIsoCenter',... -'FontWeight','bold'); - -appdata = []; -appdata.lastValidTag = 'checkIsoCenter'; - -h25 = uicontrol(... -'Parent',h12,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','Auto.',... -'Style','checkbox',... -'Value',1,... -'Position',[0.38560411311054 0.338403041825095 0.0809768637532133 0.091254752851711],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Callback',@(hObject,eventdata)matRadGUI_export('checkIsoCenter_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Tag','checkIsoCenter',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'btnRunSequencing'; - -h26 = uicontrol(... -'Parent',h12,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','Run Sequencing',... -'Style','radiobutton',... -'Position',[0.553984575835475 0.628020880324805 0.173521850899743 0.140684410646388],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Callback',@(hObject,eventdata)matRadGUI_export('btnRunSequencing_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Enable','off',... -'Tag','btnRunSequencing',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'btnRunDAO'; - -h27 = uicontrol(... -'Parent',h12,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','Run Direct Aperture Optimization',... -'Style','radiobutton',... -'Position',[0.553984575835475 0.32003608945028 0.294344473007712 0.140684410646388],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Callback',@(hObject,eventdata)matRadGUI_export('btnRunDAO_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Enable','off',... -'Tag','btnRunDAO',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'txtSequencing'; - -h28 = uicontrol(... -'Parent',h12,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','Stratification Levels',... -'Style','text',... -'Position',[0.553984575835475 0.502545595153702 0.179948586118252 0.102661596958175],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Children',[],... -'Tag','txtSequencing',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'editSequencingLevel'; - -h29 = uicontrol(... -'Parent',h12,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','7',... -'Style','edit',... -'Position',[0.58611825192802 0.449313655990204 0.0668380462724936 0.0836501901140685],... -'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... -'Callback',@(hObject,eventdata)matRadGUI_export('editSequencingLevel_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Enable','off',... -'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('editSequencingLevel_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... -'Tag','editSequencingLevel',... -'FontWeight','bold'); - -appdata = []; -appdata.lastValidTag = 'popUpMachine'; - -h30 = uicontrol(... -'Parent',h12,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String',['Generic';' '],... -'Style','popupmenu',... -'Value',1,... -'Position',[0.219794344473008 0.418250950570342 0.161953727506427 0.114068441064639],... -'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... -'Callback',@(hObject,eventdata)matRadGUI_export('popUpMachine_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('popUpMachine_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... -'Tag','popUpMachine',... -'FontWeight','bold'); - -appdata = []; -appdata.lastValidTag = 'txtMachine'; - -h31 = uicontrol(... -'Parent',h12,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','Machine',... -'Style','text',... -'Position',[0.0732647814910026 0.433460076045627 0.106683804627249 0.0950570342205323],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Children',[],... -'Tag','txtMachine',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'btnSetTissue'; - -h32 = uicontrol(... -'Parent',h12,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','Set Tissue',... -'Position',[0.401028277634961 0.110266159695817 0.109254498714653 0.0874524714828897],... -'BackgroundColor',[0.8 0.8 0.8],... -'Callback',@(hObject,eventdata)matRadGUI_export('btnSetTissue_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Enable','off',... -'Tag','btnSetTissue',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'popMenuBioOpt'; - -h33 = uicontrol(... -'Parent',h12,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String',{ 'none'; 'const_RBExD'; 'LEMIV_effect'; 'LEMIV_RBExD' },... -'Style','popupmenu',... -'Value',1,... -'Position',[0.219794344473008 0.0760456273764259 0.165809768637532 0.11787072243346],... -'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... -'Callback',@(hObject,eventdata)matRadGUI_export('popMenuBioOpt_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('popMenuBioOpt_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... -'Tag','popMenuBioOpt',... -'FontWeight','bold'); - -appdata = []; -appdata.lastValidTag = 'text38'; - -h34 = uicontrol(... -'Parent',h12,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','Type of optimization',... -'Style','text',... -'Position',[0.0102827763496144 0.0988593155893536 0.201799485861183 0.091254752851711],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Children',[],... -'Interruptible','off',... -'Tag','text38',... -'UserData',[],... -'FontName','Helvetica',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'radiobutton3Dconf'; - -h35 = uicontrol(... -'Parent',h12,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','3D conformal',... -'Style','radiobutton',... -'Position',[0.553224553224553 0.757869249394673 0.212121212121212 0.0847457627118644],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Callback',@(hObject,eventdata)matRadGUI_export('radiobutton3Dconf_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Enable','off',... -'Tag','radiobutton3Dconf',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'uipanel2'; - -h36 = uipanel(... -'Parent',h1,... -'FontUnits',get(0,'defaultuipanelFontUnits'),... -'Units',get(0,'defaultuipanelUnits'),... -'ShadowColor',get(0,'defaultuipanelShadowColor'),... -'Title',{ 'Visualization'; ' ' },... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Tag','uipanel2',... -'UserData',[],... -'Clipping','off',... -'Position',[0.00451321727917473 0.0460947503201024 0.430689877498388 0.203585147247119],... -'FontName','Helvetica',... -'FontWeight','bold',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'popupPlane'; - -h37 = uicontrol(... -'Parent',h36,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String',{ 'coronal'; 'sagital'; 'axial' },... -'Style','popupmenu',... -'Value',3,... -'Position',[0.465315808689303 0.582191780821918 0.113636363636364 0.143835616438356],... -'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... -'Callback',@(hObject,eventdata)matRadGUI_export('popupPlane_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('popupPlane_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... -'Tag','popupPlane',... -'FontWeight','bold'); - -appdata = []; -appdata.lastValidTag = 'sliderSlice'; - -h38 = uicontrol(... -'Parent',h36,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String',{ 'Slider' },... -'Style','slider',... -'Position',[0.134961439588689 0.796610169491525 0.167095115681234 0.096045197740113],... -'BackgroundColor',[0.9 0.9 0.9],... -'Callback',@(hObject,eventdata)matRadGUI_export('sliderSlice_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'BusyAction','cancel',... -'Interruptible','off',... -'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('sliderSlice_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... -'Tag','sliderSlice'); - -appdata = []; -appdata.lastValidTag = 'txtPlanSelection'; - -h39 = uicontrol(... -'Parent',h36,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'HorizontalAlignment','left',... -'String','Plane Selection',... -'Style','text',... -'Position',[0.34258853596203 0.589041095890411 0.11969696969697 0.116438356164384],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Children',[],... -'Tag','txtPlanSelection',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'text9'; - -h40 = uicontrol(... -'Parent',h36,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'HorizontalAlignment','left',... -'String','Slice Selection',... -'Style','text',... -'Position',[0.00909090909090909 0.808219178082192 0.113636363636364 0.116438356164384],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Children',[],... -'Tag','text9',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'radiobtnContour'; - -h41 = uicontrol(... -'Parent',h36,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','plot contour',... -'Style','radiobutton',... -'Value',1,... -'Position',[0.780445969125214 0.733212341197822 0.169811320754717 0.117241379310345],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Callback',@(hObject,eventdata)matRadGUI_export('radiobtnContour_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Tag','radiobtnContour',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'radiobtnDose'; - -h42 = uicontrol(... -'Parent',h36,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','plot dose',... -'Style','radiobutton',... -'Value',1,... -'Position',[0.780445969125214 0.466969147005444 0.169811320754717 0.117241379310345],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Callback',@(hObject,eventdata)matRadGUI_export('radiobtnDose_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Tag','radiobtnDose',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'radiobtnIsoDoseLines'; - -h43 = uicontrol(... -'Parent',h36,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','plot isolines',... -'Style','radiobutton',... -'Value',1,... -'Position',[0.780445969125214 0.600907441016334 0.150943396226415 0.117241379310345],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Callback',@(hObject,eventdata)matRadGUI_export('radiobtnIsoDoseLines_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Tag','radiobtnIsoDoseLines',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'txtTypeOfPlot'; - -h44 = uicontrol(... -'Parent',h36,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'HorizontalAlignment','left',... -'String','Type of plot',... -'Style','text',... -'Position',[0.343053173241852 0.793103448275862 0.108061749571183 0.124137931034483],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Children',[],... -'Tag','txtTypeOfPlot',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'popupTypeOfPlot'; - -h45 = uicontrol(... -'Parent',h36,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String',{ 'intensity'; 'profile' },... -'Style','popupmenu',... -'Value',1,... -'Position',[0.465315808689303 0.801369863013699 0.113636363636364 0.143835616438356],... -'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... -'Callback',@(hObject,eventdata)matRadGUI_export('popupTypeOfPlot_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('popupTypeOfPlot_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... -'Tag','popupTypeOfPlot',... -'FontWeight','bold'); - -appdata = []; -appdata.lastValidTag = 'txtDisplayOption'; - -h46 = uicontrol(... -'Parent',h36,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'HorizontalAlignment','left',... -'String','Display option',... -'Style','text',... -'Position',[0.34258853596203 0.39041095890411 0.128787878787879 0.102739726027397],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Children',[],... -'Tag','txtDisplayOption',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'popupDisplayOption'; - -h47 = uicontrol(... -'Parent',h36,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','Please select ... ',... -'Style','popupmenu',... -'Value',1,... -'Position',[0.465315808689303 0.36986301369863 0.196969696969697 0.136986301369863],... -'BackgroundColor',[0.831372549019608 0.815686274509804 0.784313725490196],... -'Callback',@(hObject,eventdata)matRadGUI_export('popupDisplayOption_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('popupDisplayOption_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... -'Tag','popupDisplayOption',... -'FontWeight','bold'); - -appdata = []; -appdata.lastValidTag = 'txtBeamSelection'; - -h48 = uicontrol(... -'Parent',h36,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'HorizontalAlignment','left',... -'String','Beam Selection',... -'Style','text',... -'Position',[0.00857632933104631 0.503448275862069 0.118353344768439 0.186206896551724],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Children',[],... -'Tag','txtBeamSelection',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'sliderBeamSelection'; - -h49 = uicontrol(... -'Parent',h36,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','SliderBeamSelection',... -'Style','slider',... -'Position',[0.134961439588689 0.542372881355932 0.167095115681234 0.096045197740113],... -'BackgroundColor',[0.9 0.9 0.9],... -'Callback',@(hObject,eventdata)matRadGUI_export('sliderBeamSelection_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Enable','off',... -'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('sliderBeamSelection_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... -'Tag','sliderBeamSelection'); - -appdata = []; -appdata.lastValidTag = 'btnProfileType'; - -h50 = uicontrol(... -'Parent',h36,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','lateral',... -'Position',[0.658025928757913 0.794520547945205 0.0863636363636364 0.157534246575343],... -'BackgroundColor',[0.8 0.8 0.8],... -'Callback',@(hObject,eventdata)matRadGUI_export('btnProfileType_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Enable','off',... -'Tag','btnProfileType',... -'FontWeight','bold',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'text16'; - -h51 = uicontrol(... -'Parent',h36,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','GoTo',... -'Style','text',... -'Position',[0.604795511376553 0.801369863013698 0.0454545454545454 0.123287671232877],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Children',[],... -'Tag','text16',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'btnDVH'; - -h52 = uicontrol(... -'Parent',h36,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','Show DVH/QI',... -'Position',[0.51413881748072 0.0677966101694915 0.123393316195373 0.129943502824859],... -'BackgroundColor',[0.8 0.8 0.8],... -'Callback',@(hObject,eventdata)matRadGUI_export('btnDVH_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Enable','off',... -'Tag','btnDVH',... -'FontWeight','bold',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'radiobtnIsoDoseLinesLabels'; - -h53 = uicontrol(... -'Parent',h36,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','plot isolines labels',... -'Style','radiobutton',... -'Position',[0.780445969125214 0.343557168784029 0.202401372212693 0.117241379310345],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Callback',@(hObject,eventdata)matRadGUI_export('radiobtnIsoDoseLinesLabels_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Tag','radiobtnIsoDoseLinesLabels',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'textOffset'; - -h54 = uicontrol(... -'Parent',h36,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'HorizontalAlignment','left',... -'String','Offset',... -'Style','text',... -'Position',[0.00909090909090909 0.287104393008975 0.118181818181818 0.123287671232877],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Children',[],... -'Tag','textOffset',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'sliderOffset'; - -h55 = uicontrol(... -'Parent',h36,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','SliderOffset',... -'Style','slider',... -'Position',[0.134961439588689 0.271186440677966 0.167095115681234 0.096045197740113],... -'BackgroundColor',[0.9 0.9 0.9],... -'Callback',@(hObject,eventdata)matRadGUI_export('sliderOffset_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Enable','off',... -'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('sliderOffset_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... -'Tag','sliderOffset'); - -appdata = []; -appdata.lastValidTag = 'radioBtnIsoCenter'; - -h56 = uicontrol(... -'Parent',h36,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','plot iso center',... -'Style','radiobutton',... -'Value',1,... -'Position',[0.780445969125214 0.205989110707804 0.169811320754717 0.117241379310345],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Callback',@(hObject,eventdata)matRadGUI_export('radioBtnIsoCenter_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Tag','radioBtnIsoCenter',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'btn3Dview'; - -h57 = uicontrol(... -'Parent',h36,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','Open 3D-View',... -'Position',[0.595848595848596 0.578947368421053 0.148962148962149 0.157894736842105],... -'BackgroundColor',[0.8 0.8 0.8],... -'Callback',@(hObject,eventdata)matRadGUI_export('btn3Dview_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Enable','off',... -'Tag','btn3Dview',... -'FontWeight','bold',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'radiobtnCT'; - -h58 = uicontrol(... -'Parent',h36,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','plot CT',... -'Style','radiobutton',... -'Value',1,... -'Position',[0.780445969125214 0.864791288566243 0.169811320754717 0.117241379310345],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Callback',@(hObject,eventdata)matRadGUI_export('radiobtnCT_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Tag','radiobtnCT',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'radiobtnPlan'; - -h59 = uicontrol(... -'Parent',h36,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','visualize plan / beams',... -'Style','radiobutton',... -'Value',1,... -'Position',[0.78021978021978 0.0736842105263158 0.2002442002442 0.115789473684211],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Callback',@(hObject,eventdata)matRadGUI_export('radiobtnPlan_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Tag','radiobtnPlan',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'uitoolbar1'; - -h60 = uitoolbar(... -'Parent',h1,... -'Tag','uitoolbar1',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.toolid = 'Standard.FileOpen'; -appdata.CallbackInUse = struct(... - 'ClickedCallback', 'matRadGUI(''toolbarLoad_ClickedCallback'',gcbo,[],guidata(gcbo))'); -appdata.lastValidTag = 'toolbarLoad'; - -h61 = uipushtool(... -'Parent',h60,... -'Children',[],... -'BusyAction','cancel',... -'Interruptible','off',... -'Tag','toolbarLoad',... -'CData',mat{2},... -'ClickedCallback',@(hObject,eventdata)matRadGUI_export('toolbarLoad_ClickedCallback',hObject,eventdata,guidata(hObject)),... -'Separator','on',... -'TooltipString','Open File',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.toolid = 'Standard.SaveFigure'; -appdata.CallbackInUse = struct(... - 'ClickedCallback', 'matRadGUI(''toolbarSave_ClickedCallback'',gcbo,[],guidata(gcbo))'); -appdata.lastValidTag = 'toolbarSave'; - -h62 = uipushtool(... -'Parent',h60,... -'Children',[],... -'BusyAction','cancel',... -'Interruptible','off',... -'Tag','toolbarSave',... -'CData',mat{3},... -'ClickedCallback',@(hObject,eventdata)matRadGUI_export('toolbarSave_ClickedCallback',hObject,eventdata,guidata(hObject)),... -'Separator','on',... -'TooltipString','Save Figure',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.toolid = []; -appdata.lastValidTag = 'uipushtool_screenshot'; - -h63 = uipushtool(... -'Parent',h60,... -'Children',[],... -'Tag','uipushtool_screenshot',... -'CData',mat{4},... -'ClickedCallback',@(hObject,eventdata)matRadGUI_export('uipushtool_screenshot_ClickedCallback',hObject,eventdata,guidata(hObject)),... -'TooltipString','Take a screenshot of the current dose or profile plot',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.toolid = 'Exploration.ZoomIn'; -appdata.CallbackInUse = struct(... - 'ClickedCallback', '%default'); -appdata.lastValidTag = 'toolbarZoomIn'; - -h64 = uitoggletool(... -'Parent',h60,... -'Children',[],... -'Tag','toolbarZoomIn',... -'CData',mat{5},... -'ClickedCallback','%default',... -'Separator','on',... -'TooltipString','Zoom In',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.toolid = 'Exploration.ZoomOut'; -appdata.CallbackInUse = struct(... - 'ClickedCallback', '%default'); -appdata.lastValidTag = 'toolbarZoomOut'; - -h65 = uitoggletool(... -'Parent',h60,... -'Children',[],... -'Tag','toolbarZoomOut',... -'CData',mat{6},... -'ClickedCallback','%default',... -'Separator','on',... -'TooltipString','Zoom Out',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.toolid = 'Exploration.Pan'; -appdata.CallbackInUse = struct(... - 'ClickedCallback', '%default'); -appdata.lastValidTag = 'toolbarPan'; - -h66 = uitoggletool(... -'Parent',h60,... -'Children',[],... -'Tag','toolbarPan',... -'CData',mat{7},... -'ClickedCallback','%default',... -'Separator','on',... -'TooltipString','Pan',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.toolid = 'Exploration.DataCursor'; -appdata.CallbackInUse = struct(... - 'ClickedCallback', '%default'); -appdata.lastValidTag = 'toolbarCursor'; - -h67 = uitoggletool(... -'Parent',h60,... -'Children',[],... -'Tag','toolbarCursor',... -'CData',mat{8},... -'ClickedCallback','%default',... -'Separator','on',... -'TooltipString','Data Cursor',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.toolid = 'Annotation.InsertLegend'; -appdata.CallbackInUse = struct(... - 'ClickedCallback', '%default'); -appdata.lastValidTag = 'toolbarLegend'; - -h68 = uitoggletool(... -'Parent',h60,... -'Children',[],... -'Tag','toolbarLegend',... -'CData',mat{9},... -'ClickedCallback','%default',... -'Separator','on',... -'TooltipString','Insert Legend',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.toolid = 'Annotation.InsertColorbar'; -appdata.CallbackInUse = struct(... - 'ClickedCallback', 'matRadGUI(''uitoggletool8_ClickedCallback'',gcbo,[],guidata(gcbo))'); -appdata.lastValidTag = 'uitoggletool8'; - -h69 = uitoggletool(... -'Parent',h60,... -'Children',[],... -'Tag','uitoggletool8',... -'CData',mat{10},... -'ClickedCallback',@(hObject,eventdata)matRadGUI_export('uitoggletool8_ClickedCallback',hObject,eventdata,guidata(hObject)),... -'Separator','on',... -'TooltipString','Insert Colorbar',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'uipanel3'; - -h70 = uipanel(... -'Parent',h1,... -'FontUnits',get(0,'defaultuipanelFontUnits'),... -'Units',get(0,'defaultuipanelUnits'),... -'ShadowColor',get(0,'defaultuipanelShadowColor'),... -'Title',{ 'Objectives & constraints'; ' '; ' ' },... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Tag','uipanel3',... -'UserData',[],... -'Clipping','off',... -'Position',[0.00451321727917473 0.257362355953905 0.430689877498388 0.259923175416133],... -'FontName','Helvetica',... -'FontWeight','bold',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'uipanel4'; - -h71 = uipanel(... -'Parent',h1,... -'FontUnits',get(0,'defaultuipanelFontUnits'),... -'Units',get(0,'defaultuipanelUnits'),... -'ShadowColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Title','Workflow',... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Tag','uipanel4',... -'UserData',[],... -'Clipping','off',... -'Position',[0.00451321727917473 0.810499359795134 0.430045132172792 0.170294494238156],... -'FontName','Helvetica',... -'FontWeight','bold',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'text13'; - -h72 = uicontrol(... -'Parent',h71,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','Status:',... -'Style','text',... -'Position',[0.318250377073907 0.107438016528926 0.120663650075415 0.12396694214876],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Children',[],... -'Tag','text13',... -'FontWeight','bold',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'txtInfo'; - -h73 = uicontrol(... -'Parent',h71,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','no data loaded',... -'Style','text',... -'Position',[0.414781297134238 0.0247933884297521 0.371040723981901 0.214876033057851],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Children',[],... -'Tag','txtInfo',... -'FontWeight','bold',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'btnLoadMat'; - -h74 = uicontrol(... -'Parent',h71,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','Load *.mat data',... -'Position',[0.151866151866152 0.810126582278481 0.178893178893179 0.145569620253165],... -'BackgroundColor',[0.8 0.8 0.8],... -'Callback',@(hObject,eventdata)matRadGUI_export('btnLoadMat_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Tag','btnLoadMat',... -'FontWeight','bold',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'btnCalcDose'; - -h75 = uicontrol(... -'Parent',h71,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','Calc. influence Mx',... -'Position',[0.35006435006435 0.810126582278481 0.178893178893179 0.145569620253165],... -'BackgroundColor',[0.8 0.8 0.8],... -'Callback',@(hObject,eventdata)matRadGUI_export('btnCalcDose_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Tag','btnCalcDose',... -'FontWeight','bold',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'btnOptimize'; - -h76 = uicontrol(... -'Parent',h71,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','Optimize',... -'Position',[0.544401544401541 0.810126582278481 0.178893178893179 0.145569620253165],... -'BackgroundColor',[0.8 0.8 0.8],... -'Callback',@(hObject,eventdata)matRadGUI_export('btnOptimize_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Tag','btnOptimize',... -'FontWeight','bold',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'btnLoadDicom'; - -h77 = uicontrol(... -'Parent',h71,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','Load DICOM',... -'Position',[0.151866151866152 0.60126582278481 0.177606177606178 0.145569620253165],... -'BackgroundColor',[0.8 0.8 0.8],... -'Callback',@(hObject,eventdata)matRadGUI_export('btnLoadDicom_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Tag','btnLoadDicom',... -'FontWeight','bold',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'btnRefresh'; - -h78 = uicontrol(... -'Parent',h71,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','Refresh',... -'Position',[0.0154440154440154 0.810126582278481 0.0849420849420849 0.145569620253165],... -'BackgroundColor',[0.8 0.8 0.8],... -'Callback',@(hObject,eventdata)matRadGUI_export('btnRefresh_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Tag','btnRefresh',... -'FontWeight','bold',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'pushbutton_recalc'; - -h79 = uicontrol(... -'Parent',h71,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','Recalc',... -'Position',[0.543114543114543 0.60126582278481 0.178893178893179 0.145569620253165],... -'BackgroundColor',[0.8 0.8 0.8],... -'Callback',@(hObject,eventdata)matRadGUI_export('pushbutton_recalc_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Tag','pushbutton_recalc',... -'FontWeight','bold',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'btnSaveToGUI'; - -h80 = uicontrol(... -'Parent',h71,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','Save to GUI',... -'Position',[0.738738738738737 0.810126582278481 0.178893178893179 0.145569620253165],... -'BackgroundColor',[0.8 0.8 0.8],... -'Callback',@(hObject,eventdata)matRadGUI_export('btnSaveToGUI_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Tag','btnSaveToGUI',... -'FontWeight','bold',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'btn_export'; - -h81 = uicontrol(... -'Parent',h71,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','Export',... -'Position',[0.74002574002574 0.60126582278481 0.178893178893179 0.145569620253165],... -'BackgroundColor',[0.8 0.8 0.8],... -'Callback',@(hObject,eventdata)matRadGUI_export('btn_export_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Tag','btn_export',... -'FontWeight','bold',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'importDoseButton'; - -h82 = uicontrol(... -'Parent',h71,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','Import Dose',... -'Position',[0.738738738738738 0.392405063291139 0.178893178893179 0.145569620253165],... -'BackgroundColor',[0.8 0.8 0.8],... -'Callback',@(hObject,eventdata)matRadGUI_export('importDoseButton_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Tag','importDoseButton',... -'FontWeight','bold',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'pushbutton_importFromBinary'; - -h83 = uicontrol(... -'Parent',h71,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','Import from Binary',... -'Position',[0.151866151866152 0.392405063291139 0.177606177606178 0.145569620253165],... -'BackgroundColor',[0.8 0.8 0.8],... -'Callback',@(hObject,eventdata)matRadGUI_export('pushbutton_importFromBinary_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'TooltipString','Imports a patient data set from binary datafiles describing CT and segmentations',... -'Tag','pushbutton_importFromBinary',... -'FontWeight','bold',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'text24'; - -h84 = uicontrol(... -'Parent',h1,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','min value:',... -'Style','text',... -'Position',[0.899701069855255 0.87145643693108 0.0420862177470107 0.0253576072821847],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Children',[],... -'Tag','text24',... -'FontSize',10,... -'FontWeight','bold',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'btnSetIsoDoseLevels'; - -h85 = uicontrol(... -'Parent',h1,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','Set IsoDose Levels',... -'Position',[0.910792951541851 0.814995131450828 0.071035242290749 0.0223953261927945],... -'BackgroundColor',[0.8 0.8 0.8],... -'Callback',@(hObject,eventdata)matRadGUI_export('btnSetIsoDoseLevels_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Tag','btnSetIsoDoseLevels',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'uipanel10'; - -h86 = uipanel(... -'Parent',h1,... -'FontUnits',get(0,'defaultuipanelFontUnits'),... -'Units',get(0,'defaultuipanelUnits'),... -'Title','Structure Visibilty',... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Tag','uipanel10',... -'Clipping','off',... -'Position',[0.896397105097545 0.175812743823147 0.0991189427312775 0.304291287386216],... -'FontWeight','bold',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'legendTable'; - -h87 = uicontrol(... -'Parent',h86,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'Style','listbox',... -'Value',1,... -'Position',[0.02 0.01 0.97 0.98],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Callback',@(hObject,eventdata)matRadGUI_export('legendTable_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('legendTable_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... -'Tag','legendTable'); - -appdata = []; -appdata.lastValidTag = 'uipanel11'; - -h88 = uipanel(... -'Parent',h1,... -'FontUnits',get(0,'defaultuipanelFontUnits'),... -'Units',get(0,'defaultuipanelUnits'),... -'Title','Viewing',... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Tag','uipanel11',... -'Clipping','off',... -'Position',[0.437782076079949 0.0460947503201025 0.451321727917473 0.842509603072983],... -'FontWeight','bold',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'axesFig'; - -h89 = axes(... -'Parent',h88,... -'FontUnits',get(0,'defaultaxesFontUnits'),... -'Units',get(0,'defaultaxesUnits'),... -'CameraPosition',[0.5 0.5 9.16025403784439],... -'CameraPositionMode',get(0,'defaultaxesCameraPositionMode'),... -'CameraTarget',[0.5 0.5 0.5],... -'CameraTargetMode',get(0,'defaultaxesCameraTargetMode'),... -'CameraViewAngle',6.60861036031192,... -'CameraViewAngleMode',get(0,'defaultaxesCameraViewAngleMode'),... -'PlotBoxAspectRatio',[1 0.994838709677419 0.994838709677419],... -'PlotBoxAspectRatioMode',get(0,'defaultaxesPlotBoxAspectRatioMode'),... -'FontName','CMU Serif',... -'Colormap',[0 0 0.5625;0 0 0.625;0 0 0.6875;0 0 0.75;0 0 0.8125;0 0 0.875;0 0 0.9375;0 0 1;0 0.0625 1;0 0.125 1;0 0.1875 1;0 0.25 1;0 0.3125 1;0 0.375 1;0 0.4375 1;0 0.5 1;0 0.5625 1;0 0.625 1;0 0.6875 1;0 0.75 1;0 0.8125 1;0 0.875 1;0 0.9375 1;0 1 1;0.0625 1 1;0.125 1 0.9375;0.1875 1 0.875;0.25 1 0.8125;0.3125 1 0.75;0.375 1 0.6875;0.4375 1 0.625;0.5 1 0.5625;0.5625 1 0.5;0.625 1 0.4375;0.6875 1 0.375;0.75 1 0.3125;0.8125 1 0.25;0.875 1 0.1875;0.9375 1 0.125;1 1 0.0625;1 1 0;1 0.9375 0;1 0.875 0;1 0.8125 0;1 0.75 0;1 0.6875 0;1 0.625 0;1 0.5625 0;1 0.5 0;1 0.4375 0;1 0.375 0;1 0.3125 0;1 0.25 0;1 0.1875 0;1 0.125 0;1 0.0625 0;1 0 0;0.9375 0 0;0.875 0 0;0.8125 0 0;0.75 0 0;0.6875 0 0;0.625 0 0;0.5625 0 0],... -'ColormapMode',get(0,'defaultaxesColormapMode'),... -'Alphamap',[0 0.0159 0.0317 0.0476 0.0635 0.0794 0.0952 0.1111 0.127 0.1429 0.1587 0.1746 0.1905 0.2063 0.2222 0.2381 0.254 0.2698 0.2857 0.3016 0.3175 0.3333 0.3492 0.3651 0.381 0.3968 0.4127 0.4286 0.4444 0.4603 0.4762 0.4921 0.5079 0.5238 0.5397 0.5556 0.5714 0.5873 0.6032 0.619 0.6349 0.6508 0.6667 0.6825 0.6984 0.7143 0.7302 0.746 0.7619 0.7778 0.7937 0.8095 0.8254 0.8413 0.8571 0.873 0.8889 0.9048 0.9206 0.9365 0.9524 0.9683 0.9841 1],... -'AlphamapMode',get(0,'defaultaxesAlphamapMode'),... -'GridLineStyle',get(0,'defaultaxesGridLineStyle'),... -'XTick',[0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1],... -'XTickMode',get(0,'defaultaxesXTickMode'),... -'XTickLabel',{ '0'; '0.1'; '0.2'; '0.3'; '0.4'; '0.5'; '0.6'; '0.7'; '0.8'; '0.9'; '1' },... -'XTickLabelMode',get(0,'defaultaxesXTickLabelMode'),... -'YTick',[0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1],... -'YTickMode',get(0,'defaultaxesYTickMode'),... -'YTickLabel',{ '0'; '0.1'; '0.2'; '0.3'; '0.4'; '0.5'; '0.6'; '0.7'; '0.8'; '0.9'; '1' },... -'YTickLabelMode',get(0,'defaultaxesYTickLabelMode'),... -'Color',get(0,'defaultaxesColor'),... -'CameraMode',get(0,'defaultaxesCameraMode'),... -'DataSpaceMode',get(0,'defaultaxesDataSpaceMode'),... -'ColorSpaceMode',get(0,'defaultaxesColorSpaceMode'),... -'DecorationContainerMode',get(0,'defaultaxesDecorationContainerMode'),... -'ChildContainerMode',get(0,'defaultaxesChildContainerMode'),... -'XRulerMode',get(0,'defaultaxesXRulerMode'),... -'YRulerMode',get(0,'defaultaxesYRulerMode'),... -'ZRulerMode',get(0,'defaultaxesZRulerMode'),... -'AmbientLightSourceMode',get(0,'defaultaxesAmbientLightSourceMode'),... -'ButtonDownFcn',@(hObject,eventdata)matRadGUI_export('axesFig_ButtonDownFcn',hObject,eventdata,guidata(hObject)),... -'Tag','axesFig',... -'UserData',[],... -'Position',[0.0718390804597701 0.0354391371340524 0.902298850574712 0.929121725731895],... -'ActivePositionProperty','position',... -'ActivePositionPropertyMode',get(0,'defaultaxesActivePositionPropertyMode'),... -'LooseInset',[0.199881557553276 0.118695547917832 0.146067292058163 0.0809287826712493],... -'FontSize',9.63,... -'SortMethod','childorder',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -h90 = get(h89,'title'); - -set(h90,... -'Parent',h89,... -'Units','data',... -'FontUnits','points',... -'DecorationContainer',[],... -'DecorationContainerMode','auto',... -'Color',[0 0 0],... -'ColorMode','auto',... -'Position',[0.500000554361651 1.00343482490272 0.5],... -'PositionMode','auto',... -'String',blanks(0),... -'Interpreter','tex',... -'Rotation',0,... -'RotationMode','auto',... -'FontName','Helvetica',... -'FontSize',10.593,... -'FontSizeMode','auto',... -'FontAngle','normal',... -'FontWeight','normal',... -'HorizontalAlignment','center',... -'HorizontalAlignmentMode','auto',... -'VerticalAlignment','bottom',... -'VerticalAlignmentMode','auto',... -'EdgeColor','none',... -'LineStyle','-',... -'LineWidth',0.5,... -'BackgroundColor','none',... -'Margin',2,... -'Clipping','off',... -'Layer','middle',... -'LayerMode','auto',... -'FontSmoothing','on',... -'FontSmoothingMode','auto',... -'DisplayName',blanks(0),... -'IncludeRenderer','on',... -'IsContainer','off',... -'IsContainerMode','auto',... -'HelpTopicKey',blanks(0),... -'ButtonDownFcn',blanks(0),... -'BusyAction','queue',... -'Interruptible','on',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... -'DeleteFcn',blanks(0),... -'Tag',blanks(0),... -'HitTest','on',... -'PickableParts','visible',... -'PickablePartsMode','auto',... -'DimensionNames',{ 'X' 'Y' 'Z' },... -'DimensionNamesMode','auto',... -'XLimInclude','on',... -'YLimInclude','on',... -'ZLimInclude','on',... -'CLimInclude','on',... -'ALimInclude','on',... -'Description','Axes Title',... -'DescriptionMode','auto',... -'Visible','on',... -'Serializable','on',... -'HandleVisibility','off',... -'TransformForPrintFcnImplicitInvoke','on',... -'TransformForPrintFcnImplicitInvokeMode','auto'); - -h91 = get(h89,'xlabel'); - -set(h91,... -'Parent',h89,... -'Units','data',... -'FontUnits','points',... -'DecorationContainer',[],... -'DecorationContainerMode','auto',... -'Color',[0.15 0.15 0.15],... -'ColorMode','auto',... -'Position',[0.500000476837158 -0.0366861225689741 0],... -'PositionMode','auto',... -'String',blanks(0),... -'Interpreter','tex',... -'Rotation',0,... -'RotationMode','auto',... -'FontName','CMU Serif',... -'FontSize',10.593,... -'FontSizeMode','auto',... -'FontAngle','normal',... -'FontWeight','normal',... -'HorizontalAlignment','center',... -'HorizontalAlignmentMode','auto',... -'VerticalAlignment','top',... -'VerticalAlignmentMode','auto',... -'EdgeColor','none',... -'LineStyle','-',... -'LineWidth',0.5,... -'BackgroundColor','none',... -'Margin',3,... -'Clipping','off',... -'Layer','back',... -'LayerMode','auto',... -'FontSmoothing','on',... -'FontSmoothingMode','auto',... -'DisplayName',blanks(0),... -'IncludeRenderer','on',... -'IsContainer','off',... -'IsContainerMode','auto',... -'HelpTopicKey',blanks(0),... -'ButtonDownFcn',blanks(0),... -'BusyAction','queue',... -'Interruptible','on',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... -'DeleteFcn',blanks(0),... -'Tag',blanks(0),... -'HitTest','on',... -'PickableParts','visible',... -'PickablePartsMode','auto',... -'DimensionNames',{ 'X' 'Y' 'Z' },... -'DimensionNamesMode','auto',... -'XLimInclude','on',... -'YLimInclude','on',... -'ZLimInclude','on',... -'CLimInclude','on',... -'ALimInclude','on',... -'Description','AxisRulerBase Label',... -'DescriptionMode','auto',... -'Visible','on',... -'Serializable','on',... -'HandleVisibility','off',... -'TransformForPrintFcnImplicitInvoke','on',... -'TransformForPrintFcnImplicitInvokeMode','auto'); - -h92 = get(h89,'ylabel'); - -set(h92,... -'Parent',h89,... -'Units','data',... -'FontUnits','points',... -'DecorationContainer',[],... -'DecorationContainerMode','auto',... -'Color',[0.15 0.15 0.15],... -'ColorMode','auto',... -'Position',[-0.0429806458688552 0.500000476837158 0],... -'PositionMode','auto',... -'String',blanks(0),... -'Interpreter','tex',... -'Rotation',90,... -'RotationMode','auto',... -'FontName','CMU Serif',... -'FontSize',10.593,... -'FontSizeMode','auto',... -'FontAngle','normal',... -'FontWeight','normal',... -'HorizontalAlignment','center',... -'HorizontalAlignmentMode','auto',... -'VerticalAlignment','bottom',... -'VerticalAlignmentMode','auto',... -'EdgeColor','none',... -'LineStyle','-',... -'LineWidth',0.5,... -'BackgroundColor','none',... -'Margin',3,... -'Clipping','off',... -'Layer','back',... -'LayerMode','auto',... -'FontSmoothing','on',... -'FontSmoothingMode','auto',... -'DisplayName',blanks(0),... -'IncludeRenderer','on',... -'IsContainer','off',... -'IsContainerMode','auto',... -'HelpTopicKey',blanks(0),... -'ButtonDownFcn',blanks(0),... -'BusyAction','queue',... -'Interruptible','on',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... -'DeleteFcn',blanks(0),... -'Tag',blanks(0),... -'HitTest','on',... -'PickableParts','visible',... -'PickablePartsMode','auto',... -'DimensionNames',{ 'X' 'Y' 'Z' },... -'DimensionNamesMode','auto',... -'XLimInclude','on',... -'YLimInclude','on',... -'ZLimInclude','on',... -'CLimInclude','on',... -'ALimInclude','on',... -'Description','AxisRulerBase Label',... -'DescriptionMode','auto',... -'Visible','on',... -'Serializable','on',... -'HandleVisibility','off',... -'TransformForPrintFcnImplicitInvoke','on',... -'TransformForPrintFcnImplicitInvokeMode','auto'); - -h93 = get(h89,'zlabel'); - -set(h93,... -'Parent',h89,... -'Units','data',... -'FontUnits','points',... -'DecorationContainer',[],... -'DecorationContainerMode','auto',... -'Color',[0.15 0.15 0.15],... -'ColorMode','auto',... -'Position',[0 0 0],... -'PositionMode','auto',... -'String',blanks(0),... -'Interpreter','tex',... -'Rotation',0,... -'RotationMode','auto',... -'FontName','CMU Serif',... -'FontSize',10,... -'FontSizeMode','auto',... -'FontAngle','normal',... -'FontWeight','normal',... -'HorizontalAlignment','left',... -'HorizontalAlignmentMode','auto',... -'VerticalAlignment','middle',... -'VerticalAlignmentMode','auto',... -'EdgeColor','none',... -'LineStyle','-',... -'LineWidth',0.5,... -'BackgroundColor','none',... -'Margin',3,... -'Clipping','off',... -'Layer','middle',... -'LayerMode','auto',... -'FontSmoothing','on',... -'FontSmoothingMode','auto',... -'DisplayName',blanks(0),... -'IncludeRenderer','on',... -'IsContainer','off',... -'IsContainerMode','auto',... -'HelpTopicKey',blanks(0),... -'ButtonDownFcn',blanks(0),... -'BusyAction','queue',... -'Interruptible','on',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ,... -'DeleteFcn',blanks(0),... -'Tag',blanks(0),... -'HitTest','on',... -'PickableParts','visible',... -'PickablePartsMode','auto',... -'DimensionNames',{ 'X' 'Y' 'Z' },... -'DimensionNamesMode','auto',... -'XLimInclude','on',... -'YLimInclude','on',... -'ZLimInclude','on',... -'CLimInclude','on',... -'ALimInclude','on',... -'Description','AxisRulerBase Label',... -'DescriptionMode','auto',... -'Visible','off',... -'Serializable','on',... -'HandleVisibility','off',... -'TransformForPrintFcnImplicitInvoke','on',... -'TransformForPrintFcnImplicitInvokeMode','auto'); - -appdata = []; -appdata.lastValidTag = 'uipanel12'; - -h94 = uipanel(... -'Parent',h1,... -'FontUnits',get(0,'defaultuipanelFontUnits'),... -'Units',get(0,'defaultuipanelUnits'),... -'Title','Info',... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Tag','uipanel12',... -'Clipping','off',... -'Position',[0.896276240708709 0.0448143405889885 0.0991189427312775 0.12932138284251],... -'FontWeight','bold',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'btnAbout'; - -h95 = uicontrol(... -'Parent',h94,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','About',... -'Position',[0.238095238095238 0.134831460674157 0.563492063492063 0.280898876404494],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Callback',@(hObject,eventdata)matRadGUI_export('btnAbout_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Tag','btnAbout',... -'FontSize',7,... -'FontWeight','bold',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'text15'; - -h96 = uicontrol(... -'Parent',h94,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','v3.0.0',... -'Style','text',... -'Position',[0.227106227106227 0.752808988764045 0.523809523809524 0.191011235955056],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Children',[],... -'Tag','text15',... -'FontWeight','bold',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'text31'; - -h97 = uicontrol(... -'Parent',h94,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','github.com/e0404/matRad',... -'Style','text',... -'Position',[0.0384615384615385 0.528089887640449 0.942307692307693 0.168539325842697],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Children',[],... -'Tag','text31',... -'FontWeight','bold',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'uipanel_colormapOptions'; - -h98 = uipanel(... -'Parent',h1,... -'FontUnits',get(0,'defaultuipanelFontUnits'),... -'Units',get(0,'defaultuipanelUnits'),... -'Title','Viewer Options',... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Tag','uipanel_colormapOptions',... -'Clipping','off',... -'Position',[0.896397105097545 0.484330299089727 0.0991189427312775 0.318660598179457],... -'FontWeight','bold',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'text_windowCenter'; - -h99 = uicontrol(... -'Parent',h98,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'HorizontalAlignment','left',... -'String','Window Center:',... -'Style','text',... -'Position',[0.0466666666666666 0.682461750109027 0.673333333333333 0.0699999999999998],... -'BackgroundColor',get(0,'defaultuicontrolBackgroundColor'),... -'Children',[],... -'Tag','text_windowCenter',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'textDoseOpacity'; - -h100 = uicontrol(... -'Parent',h98,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'HorizontalAlignment','left',... -'String','Dose opacity:',... -'Style','text',... -'Position',[0.0466666666666667 0.0706370831711431 0.847328244274809 0.0714285714285714],... -'BackgroundColor',get(0,'defaultuicontrolBackgroundColor'),... -'Children',[],... -'Tag','textDoseOpacity',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'popupmenu_chooseColorData'; - -h101 = uicontrol(... -'Parent',h98,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String',{ 'None'; 'CT (ED)'; 'Dose' },... -'Style','popupmenu',... -'Value',1,... -'Position',[0.0486486486486487 0.899328859060403 0.940540540540541 0.11744966442953],... -'BackgroundColor',[1 1 1],... -'Callback',@(hObject,eventdata)matRadGUI_export('popupmenu_chooseColorData_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('popupmenu_chooseColorData_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... -'Tag','popupmenu_chooseColorData'); - -appdata = []; -appdata.lastValidTag = 'slider_windowCenter'; - -h102 = uicontrol(... -'Parent',h98,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'SliderStep',[0.01 0.05],... -'String','slider',... -'Style','slider',... -'Value',0.5,... -'Position',[0.0432432432432432 0.63758389261745 0.697297297297297 0.0536912751677853],... -'BackgroundColor',[0.9 0.9 0.9],... -'Callback',@(hObject,eventdata)matRadGUI_export('slider_windowCenter_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('slider_windowCenter_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... -'Tag','slider_windowCenter'); - -appdata = []; -appdata.lastValidTag = 'text_windowWidth'; - -h103 = uicontrol(... -'Parent',h98,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'HorizontalAlignment','left',... -'String','Window Width:',... -'Style','text',... -'Position',[0.0466666666666667 0.545761302394105 0.673333333333333 0.0700000000000001],... -'BackgroundColor',get(0,'defaultuicontrolBackgroundColor'),... -'Children',[],... -'Tag','text_windowWidth',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'popupmenu_chooseColormap'; - -h104 = uicontrol(... -'Parent',h98,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','Choose Colormap...',... -'Style','popupmenu',... -'Value',1,... -'Position',[0.0362903225806452 0.278843516266481 0.939516129032258 0.0844686648501362],... -'BackgroundColor',[1 1 1],... -'Callback',@(hObject,eventdata)matRadGUI_export('popupmenu_chooseColormap_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('popupmenu_chooseColormap_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... -'Tag','popupmenu_chooseColormap'); - -appdata = []; -appdata.lastValidTag = 'text_windowRange'; - -h105 = uicontrol(... -'Parent',h98,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'HorizontalAlignment','left',... -'String','Range:',... -'Style','text',... -'Position',[0.0403225806451613 0.387807911050966 0.274193548387097 0.0708446866485015],... -'BackgroundColor',get(0,'defaultuicontrolBackgroundColor'),... -'Children',[],... -'Tag','text_windowRange',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'edit_windowRange'; - -h106 = uicontrol(... -'Parent',h98,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','0 1',... -'Style','edit',... -'Position',[0.323863636363636 0.399846781328902 0.653409090909091 0.0707395498392283],... -'BackgroundColor',[1 1 1],... -'Callback',@(hObject,eventdata)matRadGUI_export('edit_windowRange_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('edit_windowRange_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... -'Tag','edit_windowRange'); - -appdata = []; -appdata.lastValidTag = 'edit_windowCenter'; - -h107 = uicontrol(... -'Parent',h98,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','0.5',... -'Style','edit',... -'Value',1,... -'Position',[0.767567567567568 0.63758389261745 0.205405405405405 0.0704697986577181],... -'BackgroundColor',[1 1 1],... -'Callback',@(hObject,eventdata)matRadGUI_export('edit_windowCenter_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('edit_windowCenter_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... -'Tag','edit_windowCenter'); - -appdata = []; -appdata.lastValidTag = 'edit_windowWidth'; - -h108 = uicontrol(... -'Parent',h98,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','1.0',... -'Style','edit',... -'Position',[0.772727272727273 0.518256759964609 0.204545454545455 0.0707395498392284],... -'BackgroundColor',[1 1 1],... -'Callback',@(hObject,eventdata)matRadGUI_export('edit_windowWidth_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('edit_windowWidth_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... -'Tag','edit_windowWidth'); - -appdata = []; -appdata.lastValidTag = 'sliderOpacity'; - -h109 = uicontrol(... -'Parent',h98,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'SliderStep',[0.01 0.05],... -'String','slider',... -'Style','slider',... -'Value',0.6,... -'Position',[0.147727272727273 0.0257234726688103 0.75 0.0546623794212219],... -'BackgroundColor',[0.9 0.9 0.9],... -'Callback',@(hObject,eventdata)matRadGUI_export('sliderOpacity_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('sliderOpacity_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... -'Tag','sliderOpacity'); - -appdata = []; -appdata.lastValidTag = 'txtDoseOpacity0Indicator'; - -h110 = uicontrol(... -'Parent',h98,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'HorizontalAlignment','left',... -'String','0',... -'Style','text',... -'Position',[0.0466666666666666 0.00599285798906697 0.0810810810810811 0.072463768115942],... -'BackgroundColor',get(0,'defaultuicontrolBackgroundColor'),... -'Children',[],... -'Tag','txtDoseOpacity0Indicator',... -'UserData',[],... -'FontName','Helvetica',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'txtDoseOpacity1Indicator'; - -h111 = uicontrol(... -'Parent',h98,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'HorizontalAlignment','right',... -'String','1',... -'Style','text',... -'Position',[0.8963482566536 0.00864864051690258 0.0810810810810811 0.072463768115942],... -'BackgroundColor',get(0,'defaultuicontrolBackgroundColor'),... -'Children',[],... -'Tag','txtDoseOpacity1Indicator',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'text_windowPreset'; - -h112 = uicontrol(... -'Parent',h98,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'HorizontalAlignment','left',... -'String','Window Presets N/A',... -'Style','text',... -'Position',[0.0540540540540541 0.842281879194631 0.697297297297297 0.0704697986577181],... -'BackgroundColor',get(0,'defaultuicontrolBackgroundColor'),... -'Children',[],... -'Tag','text_windowPreset',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'popupmenu_windowPreset'; - -h113 = uicontrol(... -'Parent',h98,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String',{ 'Custom'; 'Full'; 'Abd/Med'; 'Head'; 'Liver'; 'Lung'; 'Spine'; 'Vrt/Bone' },... -'Style','popupmenu',... -'Value',1,... -'Position',[0.0486486486486487 0.73489932885906 0.940540540540541 0.11744966442953],... -'BackgroundColor',[1 1 1],... -'Callback',@(hObject,eventdata)matRadGUI_export('popupmenu_windowPreset_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Visible','off',... -'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('popupmenu_windowPreset_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... -'Tag','popupmenu_windowPreset'); - -appdata = []; -appdata.lastValidTag = 'slider_windowWidth'; - -h114 = uicontrol(... -'Parent',h98,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'SliderStep',[0.01 0.05],... -'String','slider',... -'Style','slider',... -'Value',1,... -'Position',[0.0454545454545455 0.51140507995425 0.698863636363636 0.0546623794212219],... -'BackgroundColor',[0.9 0.9 0.9],... -'Callback',@(hObject,eventdata)matRadGUI_export('slider_windowWidth_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'CreateFcn', {@local_CreateFcn, @(hObject,eventdata)matRadGUI_export('slider_windowWidth_CreateFcn',hObject,eventdata,guidata(hObject)), appdata} ,... -'Tag','slider_windowWidth'); - -appdata = []; -appdata.lastValidTag = 'checkbox_lockColormap'; - -h115 = uicontrol(... -'Parent',h98,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','Lock Settings',... -'Style','checkbox',... -'Position',[0.0486486486486487 0.151006711409396 0.940540540540541 0.0838926174496644],... -'BackgroundColor',[0.502 0.502 0.502],... -'Callback',@(hObject,eventdata)matRadGUI_export('checkbox_lockColormap_Callback',hObject,eventdata,guidata(hObject)),... -'Children',[],... -'Tag','checkbox_lockColormap',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'text39'; - -h116 = uicontrol(... -'Parent',h1,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','max value:',... -'Style','text',... -'Position',[0.901903713027061 0.85370611183355 0.0420862177470107 0.0245123537061118],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Children',[],... -'Tag','text39',... -'FontSize',10,... -'FontWeight','bold',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'txtMinVal'; - -h117 = uicontrol(... -'Parent',h1,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','-',... -'Style','text',... -'Position',[0.955789804908748 0.879908972691808 0.0271397105097546 0.0160598179453836],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Children',[],... -'Tag','txtMinVal',... -'FontSize',10,... -'FontWeight','bold',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - -appdata = []; -appdata.lastValidTag = 'txtMaxVal'; - -h118 = uicontrol(... -'Parent',h1,... -'FontUnits',get(0,'defaultuicontrolFontUnits'),... -'Units','normalized',... -'String','-',... -'Style','text',... -'Position',[0.955789804908748 0.863003901170351 0.0271397105097546 0.0177503250975293],... -'BackgroundColor',[0.501960784313725 0.501960784313725 0.501960784313725],... -'Children',[],... -'Tag','txtMaxVal',... -'FontSize',10,... -'FontWeight','bold',... -'CreateFcn', {@local_CreateFcn, blanks(0), appdata} ); - - -hsingleton = h1; - - -% --- Set application data first then calling the CreateFcn. -function local_CreateFcn(hObject, eventdata, createfcn, appdata) - -if ~isempty(appdata) - names = fieldnames(appdata); - for i=1:length(names) - name = char(names(i)); - setappdata(hObject, name, getfield(appdata,name)); - end -end - -if ~isempty(createfcn) - if isa(createfcn,'function_handle') - createfcn(hObject, eventdata); - else - eval(createfcn); - end -end - - -% --- Handles default GUIDE GUI creation and callback dispatch -function varargout = gui_mainfcn(gui_State, varargin) - -gui_StateFields = {'gui_Name' - 'gui_Singleton' - 'gui_OpeningFcn' - 'gui_OutputFcn' - 'gui_LayoutFcn' - 'gui_Callback'}; -gui_Mfile = ''; -for i=1:length(gui_StateFields) - if ~isfield(gui_State, gui_StateFields{i}) - error(message('MATLAB:guide:StateFieldNotFound', gui_StateFields{ i }, gui_Mfile)); - elseif isequal(gui_StateFields{i}, 'gui_Name') - gui_Mfile = [gui_State.(gui_StateFields{i}), '.m']; - end -end - -numargin = length(varargin); - -if numargin == 0 - % MATRADGUI_EXPORT - % create the GUI only if we are not in the process of loading it - % already - gui_Create = true; -elseif local_isInvokeActiveXCallback(gui_State, varargin{:}) - % MATRADGUI_EXPORT(ACTIVEX,...) - vin{1} = gui_State.gui_Name; - vin{2} = [get(varargin{1}.Peer, 'Tag'), '_', varargin{end}]; - vin{3} = varargin{1}; - vin{4} = varargin{end-1}; - vin{5} = guidata(varargin{1}.Peer); - feval(vin{:}); - return; -elseif local_isInvokeHGCallback(gui_State, varargin{:}) - % MATRADGUI_EXPORT('CALLBACK',hObject,eventData,handles,...) - gui_Create = false; -else - % MATRADGUI_EXPORT(...) - % create the GUI and hand varargin to the openingfcn - gui_Create = true; -end - -if ~gui_Create - % In design time, we need to mark all components possibly created in - % the coming callback evaluation as non-serializable. This way, they - % will not be brought into GUIDE and not be saved in the figure file - % when running/saving the GUI from GUIDE. - designEval = false; - if (numargin>1 && ishghandle(varargin{2})) - fig = varargin{2}; - while ~isempty(fig) && ~ishghandle(fig,'figure') - fig = get(fig,'parent'); - end - - designEval = isappdata(0,'CreatingGUIDEFigure') || (isscalar(fig)&&isprop(fig,'GUIDEFigure')); - end - - if designEval - beforeChildren = findall(fig); - end - - % evaluate the callback now - varargin{1} = gui_State.gui_Callback; - if nargout - [varargout{1:nargout}] = feval(varargin{:}); - else - feval(varargin{:}); - end - - % Set serializable of objects created in the above callback to off in - % design time. Need to check whether figure handle is still valid in - % case the figure is deleted during the callback dispatching. - if designEval && ishghandle(fig) - set(setdiff(findall(fig),beforeChildren), 'Serializable','off'); - end -else - if gui_State.gui_Singleton - gui_SingletonOpt = 'reuse'; - else - gui_SingletonOpt = 'new'; - end - - % Check user passing 'visible' P/V pair first so that its value can be - % used by oepnfig to prevent flickering - gui_Visible = 'auto'; - gui_VisibleInput = ''; - for index=1:2:length(varargin) - if length(varargin) == index || ~ischar(varargin{index}) - break; - end - - % Recognize 'visible' P/V pair - len1 = min(length('visible'),length(varargin{index})); - len2 = min(length('off'),length(varargin{index+1})); - if ischar(varargin{index+1}) && strncmpi(varargin{index},'visible',len1) && len2 > 1 - if strncmpi(varargin{index+1},'off',len2) - gui_Visible = 'invisible'; - gui_VisibleInput = 'off'; - elseif strncmpi(varargin{index+1},'on',len2) - gui_Visible = 'visible'; - gui_VisibleInput = 'on'; - end - end - end - - % Open fig file with stored settings. Note: This executes all component - % specific CreateFunctions with an empty HANDLES structure. - - - % Do feval on layout code in m-file if it exists - gui_Exported = ~isempty(gui_State.gui_LayoutFcn); - % this application data is used to indicate the running mode of a GUIDE - % GUI to distinguish it from the design mode of the GUI in GUIDE. it is - % only used by actxproxy at this time. - setappdata(0,genvarname(['OpenGuiWhenRunning_', gui_State.gui_Name]),1); - if gui_Exported - gui_hFigure = feval(gui_State.gui_LayoutFcn, gui_SingletonOpt); - - % make figure invisible here so that the visibility of figure is - % consistent in OpeningFcn in the exported GUI case - if isempty(gui_VisibleInput) - gui_VisibleInput = get(gui_hFigure,'Visible'); - end - set(gui_hFigure,'Visible','off') - - % openfig (called by local_openfig below) does this for guis without - % the LayoutFcn. Be sure to do it here so guis show up on screen. - movegui(gui_hFigure,'onscreen'); - else - gui_hFigure = local_openfig(gui_State.gui_Name, gui_SingletonOpt, gui_Visible); - % If the figure has InGUIInitialization it was not completely created - % on the last pass. Delete this handle and try again. - if isappdata(gui_hFigure, 'InGUIInitialization') - delete(gui_hFigure); - gui_hFigure = local_openfig(gui_State.gui_Name, gui_SingletonOpt, gui_Visible); - end - end - if isappdata(0, genvarname(['OpenGuiWhenRunning_', gui_State.gui_Name])) - rmappdata(0,genvarname(['OpenGuiWhenRunning_', gui_State.gui_Name])); - end - - % Set flag to indicate starting GUI initialization - setappdata(gui_hFigure,'InGUIInitialization',1); - - % Fetch GUIDE Application options - gui_Options = getappdata(gui_hFigure,'GUIDEOptions'); - % Singleton setting in the GUI MATLAB code file takes priority if different - gui_Options.singleton = gui_State.gui_Singleton; - - if ~isappdata(gui_hFigure,'GUIOnScreen') - % Adjust background color - if gui_Options.syscolorfig - set(gui_hFigure,'Color', get(0,'DefaultUicontrolBackgroundColor')); - end - - % Generate HANDLES structure and store with GUIDATA. If there is - % user set GUI data already, keep that also. - data = guidata(gui_hFigure); - handles = guihandles(gui_hFigure); - if ~isempty(handles) - if isempty(data) - data = handles; - else - names = fieldnames(handles); - for k=1:length(names) - data.(char(names(k)))=handles.(char(names(k))); - end - end - end - guidata(gui_hFigure, data); - end - - % Apply input P/V pairs other than 'visible' - for index=1:2:length(varargin) - if length(varargin) == index || ~ischar(varargin{index}) - break; - end - - len1 = min(length('visible'),length(varargin{index})); - if ~strncmpi(varargin{index},'visible',len1) - try set(gui_hFigure, varargin{index}, varargin{index+1}), catch break, end - end - end - - % If handle visibility is set to 'callback', turn it on until finished - % with OpeningFcn - gui_HandleVisibility = get(gui_hFigure,'HandleVisibility'); - if strcmp(gui_HandleVisibility, 'callback') - set(gui_hFigure,'HandleVisibility', 'on'); - end - - feval(gui_State.gui_OpeningFcn, gui_hFigure, [], guidata(gui_hFigure), varargin{:}); - - if isscalar(gui_hFigure) && ishghandle(gui_hFigure) - % Handle the default callbacks of predefined toolbar tools in this - % GUI, if any - guidemfile('restoreToolbarToolPredefinedCallback',gui_hFigure); - - % Update handle visibility - set(gui_hFigure,'HandleVisibility', gui_HandleVisibility); - - % Call openfig again to pick up the saved visibility or apply the - % one passed in from the P/V pairs - if ~gui_Exported - gui_hFigure = local_openfig(gui_State.gui_Name, 'reuse',gui_Visible); - elseif ~isempty(gui_VisibleInput) - set(gui_hFigure,'Visible',gui_VisibleInput); - end - if strcmpi(get(gui_hFigure, 'Visible'), 'on') - figure(gui_hFigure); - - if gui_Options.singleton - setappdata(gui_hFigure,'GUIOnScreen', 1); - end - end - - % Done with GUI initialization - if isappdata(gui_hFigure,'InGUIInitialization') - rmappdata(gui_hFigure,'InGUIInitialization'); - end - - % If handle visibility is set to 'callback', turn it on until - % finished with OutputFcn - gui_HandleVisibility = get(gui_hFigure,'HandleVisibility'); - if strcmp(gui_HandleVisibility, 'callback') - set(gui_hFigure,'HandleVisibility', 'on'); - end - gui_Handles = guidata(gui_hFigure); - else - gui_Handles = []; - end - - if nargout - [varargout{1:nargout}] = feval(gui_State.gui_OutputFcn, gui_hFigure, [], gui_Handles); - else - feval(gui_State.gui_OutputFcn, gui_hFigure, [], gui_Handles); - end - - if isscalar(gui_hFigure) && ishghandle(gui_hFigure) - set(gui_hFigure,'HandleVisibility', gui_HandleVisibility); - end -end - -function gui_hFigure = local_openfig(name, singleton, visible) - -% openfig with three arguments was new from R13. Try to call that first, if -% failed, try the old openfig. -if nargin('openfig') == 2 - % OPENFIG did not accept 3rd input argument until R13, - % toggle default figure visible to prevent the figure - % from showing up too soon. - gui_OldDefaultVisible = get(0,'defaultFigureVisible'); - set(0,'defaultFigureVisible','off'); - gui_hFigure = matlab.hg.internal.openfigLegacy(name, singleton); - set(0,'defaultFigureVisible',gui_OldDefaultVisible); -else - % Call version of openfig that accepts 'auto' option" - gui_hFigure = matlab.hg.internal.openfigLegacy(name, singleton, visible); -% %workaround for CreateFcn not called to create ActiveX -% peers=findobj(findall(allchild(gui_hFigure)),'type','uicontrol','style','text'); -% for i=1:length(peers) -% if isappdata(peers(i),'Control') -% actxproxy(peers(i)); -% end -% end -end - -function result = local_isInvokeActiveXCallback(gui_State, varargin) - -try - result = ispc && iscom(varargin{1}) ... - && isequal(varargin{1},gcbo); -catch - result = false; -end - -function result = local_isInvokeHGCallback(gui_State, varargin) - -try - fhandle = functions(gui_State.gui_Callback); - result = ~isempty(findstr(gui_State.gui_Name,fhandle.file)) || ... - (ischar(varargin{1}) ... - && isequal(ishghandle(varargin{2}), 1) ... - && (~isempty(strfind(varargin{1},[get(varargin{2}, 'Tag'), '_'])) || ... - ~isempty(strfind(varargin{1}, '_CreateFcn'))) ); -catch - result = false; -end - - diff --git a/matRadGUI_export.mat b/matRadGUI_export.mat deleted file mode 100644 index 0bfd94999f28558ea5f10d178a7467a1b68e2862..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7550 zcma)gc|6o_^sl9;ZzNHcgi=Jwp4}uBLiT+bOURZiV>go&vQ3hmB>P?>yCM5J)G%cm zk##T_voD|9{oU7n-GA@-<2lbC=XGA^Jm-C$vzX{w8SCB?SGg@OZlY@?>*eF`c}v{P z-!0TDFgQR%+)U5b@bMkxTjF}bo^GL@Ps9VCX^1}z_7OL6ixgK>7FSfzkiVm$q%N)~ zub?je|4A(Wmskx=c>djqA}lNsg($l{Q;`RPV3*|PFQ-_?jN*pKGiACo_gcwJ;ZlW} zvM=?G*Cv<0^d@vKVE05tTV@-f&BCR+9*o^qwwAjEcBL>DYZ-or<@Jc0s9$y;Wg#Eh zV>h0sL*VN~Ul?Lno3uNjgoyO=@+LOieOI;}WH?rOr`W~bLd0>7ypTJY!PX>wVH!6> zzt7l(?07S3i<~a9GkK2RF)HRii3BF+F!RiV zR7vnasyCmxUa;9rU7Xb?NnE@|qh#S*(d1WbkL15UG;gql`0J+2a5Q>74PEKa<}){O zu8bE<*AzdaTKDeZosX#U^xggpIHq-e&Z_@-+uZM7K0iz;>hao*bp1Pw>^;SO!xhFx{*fm=+o=ordm>WpsQ$Kaks*S#n^PZ*Lg`RFdpVXdZ3H)7Tn4WXYn zwj?AxoVw1%Zb<5$YxESn?kvFaB^8U7=USLbL{nkQY^gfRjIA6ovmt{$H`h;M<+esQ zXd*=XeHsbJx-q&F+iMc+vvqY{#J+<)sl1D6B-HTkU61=1W+X8{O4{4do745GA>fhl z;3bVC+auN-9me2!Z%zzZa!+`rqXVZ2RgAbK7`n^!5^I=00@a(2c+)}}}OS7`>UIu zmgE#NF3L}=nFBbBmG}Q1VqsK%04>o2bB}GdlUt&?w;$T)1{Wg7Zzp8vKL$IIwo<5V zn5c3%E$tUi<58<-V%Ho9gEmw*jOt(=1!xiVaKxI0Gw1dkCY~=&w?7(@2tC+J3 z16>zc&)tKjYj`p=Z@{F;FxLJ4r$&eyCG_j-1Pt`7{18Szdpu4l1|)#Tkz0y_3*Rdo za& zA%_PljS(%<_!dd#5En+kQQjGH=w^ytT5X-&Ien;Zt>kCa*`R-f``U7Ap%@$IZ#hU@ zFYc#Q){}Q-r*P88A7f^dl$CokqWHeSnA3+D2)li_1>%MbX4IRkJUx;$y9E z;!D&pGHFY=nz@$8hmnmR>O+%|9n_}9+d6whnrXml=CcpS4$*u3_=;zHuk9T#6ey8~ z5`v2l$<>fz+T|Ub7fdwoX6$NaI+6fR8Ba+hJ0-RkodZD@o2kgfFh5f(ouhBgI&DRB zA0p?Sq++1H49wOAU~68#OKs}E{-|L!pO}eEy9OeiwP(RQIg)QRaR(Fv3rj(S$2{)^ zTm)d)S&UWB&;!~ezQ$avcaT7)nXY-z-P@~%N0jCy_$ezLHHSgYw{q5W7e_!x-y!;I zcyf^QI#IbHELKJgYrR1FHa<(HN6(JMpd<AA!T_PL8Dn3IS0 za4;k$cX-@;pwhbMqTDcFf$5^yINW+aacB_#;CBq_!jzmJUdK!ubdzgwgSv^&sIxzzH?mMAqsNwB5i%a-|m5{b;P@MW{V}TIbc~!)7F|o7`=63ls*hgQLYpaaUA& zh|nv?E=mOIIWf{yca5z9fF^uN8XC3bs$>7QXO0cH zRzM5Ab9+D0oN)kI{cjnk`MYiN8%ZUrtViRSG_>|sLn4*8vnMQedYsQ&E`;F*rR#`3 zBygU(^NzX291mYkZCkBCbRC+8GOrskt{VY{cNkAIwkVX!1-rx6zZig0yhRC=-iZ6D zXKgBY(KASU87~$ULgM^RPa@ILJARCR3?4}5D}s$$z(#+--kE?Lu0=sP_Baj;vb+@Q zFNUT0OexyD@#t2w*nnr@(Y6x{E%eNbJs%GDj0I+4HGH9FLp~L<6RS*%dI`M9S2)KV z#mP{;?~h9*xHvBuwpF#f{!{)Xz*vf#Td~fZHuGyqe5)+}yp2qh)s3yP4tUGUu$o2> zwWo?j+aWn`> z_BfB>PEVq$D)QaROD2skUCus*E-rFAv1WGbk2zFu78LbnyL_g8LZ@6{^c&&Zf7GW} z)3$ABo>mBYWZuW(rYR+7U&aXg)@<19srjms4>S6|&p#uCAAlQmj?NzHX=UI>Zf=2d zKAZQvif@vWUus5n*&Y-m$GgOCxpsRZADxU<{#x+6aV}BoeylRg=X~hTmN6~eGu%81 z_j?LGg>h%rJh&>4*a_O|ea~yDe*Ug%KF|4nK9cC?(&P?wo3H+s;8yxQ@#IS?$*rWz zZp0T`XZ2lwODZxv#Or-rvYRRZ^=WCyyUjz|GLpgF35}>dVHBQOi|2 zt9c=>w=2(|mTOT~(s~5ATwl}9(vjsozAcED?kNL{;YDJ*%WCYVOIJV6qK8=Vn$5^9 zG;Y`R1SAwLod%R=LW+-=4Z(i&j)u0m5`wbuw50dZ#l;4nqb}6d#5X@XBV!|T>2`Oacgz? zpxx!O>EL1S=?Z&_Tl4KS2Rh=2?|;4nd+f9K*8G<}k;B~laz&)ZlJ$}3_$&{y_$&!(^)F`6G%5;Mdca^>pd-GBmQ_Yt2nHI&R zyr~I$+QMdGH*#=k_>?)KfVTp!+!eaX_ERsdRhVDz?~mLCNVHSG={_6O%Fp=c>9ilT zFLY5Q<1}Hnnj;bG7~^j3)Vrg{Zkx+qQPnOI1}TZTeJ?R$5vWGN5hUG7p25w| zb#MHhoY(9A+mhZ%89pJ}?FIL;flsis!1YRk%t!KrdcxnR>v;;Vp&$i^BT+iP=KF;a2F}vOYGvfNXMO3$ z&YO9eKM>_dYe_?aR@%O+t3B-M zRF*KpV$ybkPERFsA1hr=XS~ok3L?cOz&9|S)NQ`BnApD|TON#)Ab&zePR>}~l{f6v zKGbm3X~Ja!8^f~}4iTRp#tZxyX8tXEXw}0B6zzB{UV$b_4QUQ#Rl^x9JHHZ_dHB6k zJKDQ-LJzv^8eNNCZ1$@S&;<)c%u+3!z3W$R$xbNIA0YMqhLGbZ-QUKN#_0XfgKbUY z;=g}h$4{^jLY3%4IHGECkul7;y^^(*B^_owFiAQc$P4gMBs8 zh2MvH3WLpc(SvY*SRdSCSdT8~_Lp{ODikuO2D)L5_)E;O%kk)mp`ZNO-y zx0O$;B}h!P(U)z+4hMQfHWl^aQ**a4TTke>X|?wbqZQ=T(fZo@E(oGWio5Zu>rO$? zUB)+Uu~#}%JkwKDVF^jdGHO_(&RN3b5;nE1P9T7AC`#ZVa4>VJ68)*Kb{oGyziQ{y z{X8&?t`OVev=rOCqz1aH-Mpmgp&b|big=(tq&>t+B&dOUsplZ*>IR>TVsk*@thwn5 zCzYKbx>*td+f}MSRw)sg{A1Cd)o=r(Ae~f*T~>nkzcIH(E%6=xD8#steAtBCBjI?6 zI3DKsK1NKf6Vw~k>+jvT&+`$yLt{sQ@N`kChv~x$meEic3nK^e?*OojI7{cB|HOAE z_U9OVh<`g706^s}nL0uQhp}f;B)t?aso9}~cuk1p6l$yWbd| z-iYzsH#aKr8VgzUVTW1lU$Jd=3)z)H@sz9IVZcf=l$?GxcMV+d%|%Qrbx$Z432L9+ zsKymueq}V=y4GDg`(&OYcBr}9$s|HM5se>2TMptt<|uDUeGB=ubmi9U*HWie!>9GJ zz69&dCnymI>^n;B=Cme!uH%VJfnMP4D4I%Cx-ZRl`@JfQBL6Ssld?_yo8H}c<_suj$DX*YnXw%k$G+0fXBd!jPBS+KRo@!KtbWCOEx_E z?n@5*+0SOJ2n}4X52$Klp*6?w$I2z+mm>PPO^9Xu$E?=2o(IbSOoxEUxxd_m?Ofi> zoUp}0-H-8~I~Zosu*2}BwTh`Tm3N!U9QOiIB2l!_jVj0o2bz$!eoJf%%G>ifhSAJ< zO*m|M)>nP(+BOOvFRqJja`}9hV%?w?c`sAk1_H*OJW~Z-!kQSroAWn*dDK0@R^Kx< zAWizuvKuzrV^dK`nqSwl`?#Ot^#TG@KJAW*%zY!A{m<&YI(DlK?d_2G8xZIW>(vD3 zz^k|qY^RTiivKd-$%&PBr_+n`PY2_{GPbxbE_gXTh5e%V#Ge;P& z8)rh2bY_W`K-V%xwWfF`(*sN`cQl7d1%5^g++Q)uIXX0t2ov?`hJ_<3J# zrjMUL^sxNj~C>t7Ylw zHcn~+fmrYf>vH4KpNgb6i?jz$Y?CKFR-luct=|FozaU2gjeFt-|EeASxYe7NZrzHw zh0E$yteT+ZrnQ@5x{wpIT|D=fH;|n#=u}bAzzJ?lxI?7sj=IFr{`@cs2KwzAfC6|N z5(@e*Sk#&qr=V(NH}m^U&e!Pltodwc>@jP&BZPGtqtf32lshXW<+p4PGS(|xV5M|b z8s=(Arw)`g#?%+c!FctQehYN$qpXU23LfM1Hhm$!JsZV%aQjm+a9Pr%fhX~9K0mb?)MB&Y|i>EIx0kY z4E!yynGUf2pZ$l)Q$9z*1PR;nmydWG?>rcY?kjSH-7RQbZMvyz?$j1qyBbid8u0MG z>go^(wR7*kgJA|#QJiTJ(=Y2-7ygyv_++w3k;!Z2PEKcv429HS7 zhLU}7tD?O|Ods1pPY}4Xu@tYLrOU9$!GC&`3D9EnedmU9$3LJhgX`;L-!GJRk!sG+ z!DH7$@}#UVyqrAR#kE32jlVGjjqC}JnoYobub9Gw)*u8q8O`)9#e>B)aC=(2;h`U7 zCFYQBXH0K5ybYY3dWXo(qOLPNE*rAq8I_0JadqBWFNuhqKw>0di$fe~cTg%F<)DmU z0KEqi1t@As%W^dMRNzh^LF4;3FdC?UT!#|05NnMKuu`H_$ECXmluc64RWxrHqnZXQ zXI3dzVU)rB6{A4y-}$`>1L;{>F||EED{3~Xh4Fzn&a~_Trm`_#0Z~Ve57G1g)C?lJ z%&2UYVF1rI5S%1b3VW>0=JCD@P`w*_z$;jqmXaIvsKI+^8+)50@`VtIh(I3NGH8Lj z?D43k0-W2M83 z-?;D|qzx^;q4u{g%nIrQYoWWL!T--}FyKyKG80Id)SnyhdN;1sb#c|&F@|9i1AD9> za3EGFAom_x6E@{E=xw|6rjc8`bn;kcsAM2)=!!-r%h}&R1?vYT!1bW8J+Uuj-I|mf zeG*x~e(?s#JJ}TKZO$l=RDBubd-MJ20AhpJ^Vo3Vy9pX$3hbd@;*HeT86TNMqkxaQ zmRL!I0|^^gV9XXmTd-B~L`+?3W~|ySIMy=(`*}HOd`V?o-pB1)%U-Ohzt?9`monBl zeZF`K#*-Dmg9%18&=vrnmWl@2#yS2l2sd-FL&OwtI(!WA$?O^V8Dgig8G!8BG8CD? zU9$spGSPMiJqdHB)eA_Ui(y)8&SEH~Odt-U1$j3Syk;wZJ3O&5GVvVPY9kP*>rV_9ti7$jh*oR0!?O zXyXE4!d!OZ$-Pn3Xf%rp2hJ=2x(i|upkN5JLmXFozvGw7MUc!(9mXw>u|K(-d0k_~ z_42WOFF+S)+zABt=Q6@BTM|`?yr+7Y*E~Uo*qpT`n~Gq>E)2@R{7-MPn``37XU?A> z@##jAm09YQwqWT7`opLbInK!iKZ;i#)>PaH(BH1OZGFGGBlQgL;s8I&%R+V4;`tTx z6NVljV=uOH2cJxA^lG8>iG@%y zDXvK!6UWr3t9bvML~?wtHdE@`V36>pTnZPp^EYHV)U`+ai5rz#y&YH&e__9ibK7eQ zWuufHKK6rKfY}t04_y$5Gj}J9(>)&VOVw zh<*s7K8{CoP>%NY*v%V7g9ScG3w@Z$Q?zO5<~J<7aL*sxi1`XXqGewW}TY&pT<~TqDz-g^&nf|9~ zs)2-;AqY=IB5*g~G4wX?zMg}H$eL4i|GPE41FhJl0S{;`h#Us&e_*%JEpTFa9yg@B zF!+n*&m|fLq`OicOE?Y|k9h`IpEyxGpTi&D>rvR8EOKh`tLhn*liw?!L)R7^#0LW8 Z>h~&Dxxd0b`f$jT<=uT)e(evO`Crfu@iPDb diff --git a/optimization/matRad_getObjectivesAndConstraints.m b/optimization/matRad_getObjectivesAndConstraints.m new file mode 100644 index 000000000..93da8cc70 --- /dev/null +++ b/optimization/matRad_getObjectivesAndConstraints.m @@ -0,0 +1,96 @@ +function classNames = matRad_getObjectivesAndConstraints() +% matRad steering information generation +% +% call +% classNames = matRad_getObjectivesAndConstraints() +% +% +% output +% classNames: contains class names (row 1) and display descriptions +% (row 2) of all available objectives +% +% References +% - +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Copyright 2015 the matRad development team. +% +% This file is part of the matRad project. It is subject to the license +% terms in the LICENSE file found in the top-level directory of this +% distribution and at https://github.com/e0404/matRad/LICENSES.txt. No part +% of the matRad project, including this file, may be copied, modified, +% propagated, or distributed except according to the terms contained in the +% LICENSE file. +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +env = matRad_getEnvironment(); + +if strcmp(env,'MATLAB') %use the package methodology for Matlab (stable) + mpkgObjectives = meta.package.fromName('DoseObjectives'); + mpkgConstraints = meta.package.fromName('DoseConstraints'); + classList = [mpkgObjectives.ClassList; mpkgConstraints.ClassList]; + + classList = classList(not([classList.Abstract])); + + %Now get the "internal" name from the properties + classNames = cell(2,numel(classList)); + for clIx = 1:numel(classList) + cl = classList(clIx); + pList = cl.PropertyList; %Get List of all properties + pNameIx = arrayfun(@(p) strcmp(p.Name,'name'),pList); %get index of the "name" property + p = pList(pNameIx); %select name property + pName = p.DefaultValue; % get value / name + classNames(:,clIx) = {cl.Name; pName}; %Store class name and display name + end +else + currDir = fileparts(mfilename('fullpath')); + objectiveDir = [currDir filesep '+DoseObjectives']; + constraintDir = [currDir filesep '+DoseConstraints']; + + objFiles = dir(objectiveDir); + for i=1:numel(objFiles) + objFiles(i).pkgName = 'DoseObjectives'; + end + constrFiles = dir(constraintDir); + for i=1:numel(objFiles) + constrFiles(i).pkgName = 'DoseConstraints'; + end + + allFiles = [objFiles; constrFiles]; + + [defNames,dispNames] = arrayfun(@testForClass,allFiles,'UniformOutput',false); + + classNames(1,:) = defNames; + classNames(2,:) = dispNames; + + selectIx = cellfun(@isempty,classNames); + classNames = classNames(:,~selectIx(1,:)); +end +end + +function [defName,dispName] = testForClass(potentialClassFile) + + + try + fPath = potentialClassFile.folder; + [~,fName,~] = fileparts(potentialClassFile.name); + fType = potentialClassFile.pkgName; + + clTmp = meta.class.fromName([fType '.' fName]); + defName = clTmp.Name; + + pList = clTmp.PropertyList; + + pNameIx = cellfun(@(p) strcmp(p.Name,'name'),pList); + p = pList(pNameIx); + dispName = p{1}.DefaultValue ; + + + catch + defName = ''; + dispName = ''; + end +end + diff --git a/plotting/matRad_plotColorbar.m b/plotting/matRad_plotColorbar.m index a4dedfd87..f95d7e8a5 100644 --- a/plotting/matRad_plotColorbar.m +++ b/plotting/matRad_plotColorbar.m @@ -29,7 +29,7 @@ % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -v=version; +[~,v] = matRad_getEnvironment(); colormap(axesHandle,cMap); caxis(window); @@ -42,7 +42,5 @@ - - end diff --git a/plotting/matRad_plotIsoDoseLines.m b/plotting/matRad_plotIsoDoseLines.m index a73d99ccb..97e552c68 100644 --- a/plotting/matRad_plotIsoDoseLines.m +++ b/plotting/matRad_plotIsoDoseLines.m @@ -70,12 +70,7 @@ isoColorLevel(isoColorLevel > 1) = 0; colors = squeeze(ind2rgb(uint8(cMapScale*isoColorLevel),cMap)); -switch env - case 'MATLAB' - isoLineHandles = gobjects(0); - case 'OCTAVE' - isoLineHandles = []; -end +isoLineHandles = cell(0); axes(axesHandle); hold on; @@ -92,7 +87,7 @@ else color = unique(colors,'rows'); end - isoLineHandles(end+1) = line(isoContours{slice,plane}(1,lower+1:lower+steps),... + isoLineHandles{end+1} = line(isoContours{slice,plane}(1,lower+1:lower+steps),... isoContours{slice,plane}(2,lower+1:lower+steps),... 'Color',color,'Parent',axesHandle,varargin{:}); if plotLabels diff --git a/tools/matRad_fixExportedGUI.m b/tools/matRad_fixExportedGUI.m index 8d5cddbdd..e8d136bb2 100644 --- a/tools/matRad_fixExportedGUI.m +++ b/tools/matRad_fixExportedGUI.m @@ -1,39 +1,96 @@ -fid = fopen('matRadGUI_export.m','r'); +function matRad_fixExportedGUI(guiFile) + +[filepath, name, ext] = fileparts(which(guiFile)); + +copyfile(guiFile,[filepath filesep name ext '.bak']); +copyfile([filepath filesep name '.fig'],[filepath filesep name '.fig.bak']); + +fid = fopen(guiFile,'r'); f=fread(fid,'*char')'; fclose(fid); -f = regexprep(f,'\n''Alphamap'',\[[\s.;0-9]*?\](,\.\.\.|\))',''); -f = regexprep(f,'\n''DecorationContainer'',\[[\s.;0-9]*?\](,\.\.\.|\))',''); -f = regexprep(f,'\n''Layer'',''(back|middle|front)''(,\.\.\.|\))',''); -f = regexprep(f,'\n''DisplayName'',blanks\(0\)(,\.\.\.|\))',''); -f = regexprep(f,'\n''HelpTopicKey'',blanks\(0\)(,\.\.\.|\))',''); -f = regexprep(f,'\n''DimensionNames'',{[\s\w'']*?}(,\.\.\.|\))',''); -f = regexprep(f,'\n''Description'',''[\w\s]*?''(,\.\.\.|\))',''); +%fix strange newlines after string attributes +f = regexprep(f,'(String'',''\w+?)\r+?('')','$1$2'); + + +f = regexprep(f,'\r?\n''Alphamap'',\[[\s.;0-9]*?\](,\.\.\.|\))',''); +f = regexprep(f,'\r?\n''DecorationContainer'',\[[\s.;0-9]*?\](,\.\.\.|\))',''); +f = regexprep(f,'\r?\n''Layer'',''(back|middle|front)''(,\.\.\.|\))',''); +f = regexprep(f,'\r?\n''DisplayName'',blanks\(0\)(,\.\.\.|\))',''); +f = regexprep(f,'\r?\n''HelpTopicKey'',blanks\(0\)(,\.\.\.|\))',''); +f = regexprep(f,'\r?\n''DimensionNames'',{[\s\w'']*?}(,\.\.\.|\))',''); +f = regexprep(f,'\r?\n''Description'',''[\w\s]*?''(,\.\.\.|\))',''); +f = regexprep(f,'\r?\n''Tooltip'',''[\w\s]*?''(,\.\.\.|\))',''); %On/Off properties expr = {'FontSmoothing','CLimInclude','ALimInclude','IncludeRenderer','IsContainer','IsContainer','Serializable','TransformForPrintFcnImplicitInvoke'}; expr = strjoin(expr,'|'); -expr = ['\n''(' expr ')'',''(on|off)''(,\.\.\.|\))']; +expr = ['\r?\n''(' expr ')'',''(on|off)''(,\.\.\.|\))']; f = regexprep(f,expr,''); -edit + %Mode sets modestrings = {'ScreenPixelsPerInch','DecorationContainer','Color','FontSize','Layer','FontSmoothing','IsContainer','PickableParts','DimensionNames','Description','TransformForPrintFcnImplicitInvoke'}; modestrings = strjoin(modestrings,'|'); -expr = ['\n''(' modestrings ')Mode'',''\w*?''(,\.\.\.|\))']; +expr = ['\r?\n''(' modestrings ')Mode'',''\w*?''(,\.\.\.|\))']; f = regexprep(f,expr,''); %Mode gets -modestrings = {'Colormap','Alphamap','Camera','DataSpace','ColorSpace','DecorationContainer','ChildContainer','XRuler','YRuler','ZRuler','AmbientLightSource','ActivePositionProperty'}; +modestrings = {'Colormap','Alphamap','Camera','DataSpace','ColorSpace','FontSize','DecorationContainer','ChildContainer','XRuler','YRuler','ZRuler','AmbientLightSource','ActivePositionProperty'}; modestrings = strjoin(modestrings,'|'); -expr = ['\n''(' modestrings ')Mode'',get\(0,''defaultaxes(' modestrings ')Mode''\)(,\.\.\.|\))']; +expr = ['\r?\n''(' modestrings ')Mode'',get\(0,''defaultaxes(' modestrings ')Mode''\)(,\.\.\.|\))']; f = regexprep(f,expr,''); -%Fix whitespaces +%Tooltip property +f = regexprep(f,'\r?\n''TooltipMode'',get\(0,''default(uipushtool|uitoggletool|uicontrol)TooltipMode''\)(,\.\.\.|\))',''); + +%Fix remaining whitespaces f = regexprep(f,'(,\.\.\.)\s*?;',');'); +%Fix Titles +f = regexprep(f,'''Title'',{(.*?)}','''Title'',strtrim(strjoin({$1}))'); + +%Octave doesn't handle ishghandle +f = regexprep(f,'ishghandle','isgraphics'); -fid = fopen('matRadGUI_export2.m','w'); +%Octave doesn't know guidemfile +f = regexprep(f,'guidemfile','%guidemfile'); + +%rename the MainFcn +f = regexprep(f,'gui_mainfcn',[name '_gui_mainFcn']); + +%now extract the layout and mainfcn, which are added to the end of the file +%by the export +expr = '(% --- Creates and returns a handle to the GUI figure\..*?)(% --- Handles default GUIDE GUI creation and callback dispatch.*)'; +out = regexp(f,expr,'tokens'); +layoutFcn = out{1}{1}; +guiMainFcn = out{1}{2}; +%remove the functions +f = regexprep(f,expr,''); +%write the functions to files +[~,~] = mkdir([filepath filesep 'gui']); +fLayoutId = fopen([filepath filesep 'gui' filesep name '_LayoutFcn.m'],'w'); +fprintf(fLayoutId,'%s',layoutFcn); +fclose(fLayoutId); +fGuiMainFcnId = fopen([filepath filesep 'gui' filesep name '_gui_mainFcn.m'],'w'); +fprintf(fGuiMainFcnId,'%s',guiMainFcn); +fclose(fGuiMainFcnId); + +fid = fopen(guiFile,'w'); fprintf(fid,'%s',f); -fclose(fid); \ No newline at end of file +fclose(fid); + +try + mat = load([filepath filesep name '.mat']); + mat = mat.mat; + save([filepath filesep name '.mat'],'mat','-v7'); +catch + fprintf('No .mat file was exported with GUI\n'); +end + +h1 = feval([name '_LayoutFcn'],'reuse'); +savefig(h1,[filepath filesep name '.fig']); +close(h1); + +end \ No newline at end of file From e8da6d6540f575fb5588aebb1a2da2724286e7de Mon Sep 17 00:00:00 2001 From: Niklas Wahl Date: Fri, 9 Aug 2019 18:56:34 +0200 Subject: [PATCH 07/87] fix for the dicom import --- dicomImport/matRad_importDicomGUI.m | 16 ++++++++++------ tools/matRad_fixExportedGUI.m | 4 ++++ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/dicomImport/matRad_importDicomGUI.m b/dicomImport/matRad_importDicomGUI.m index 078ed32b6..88f59b638 100755 --- a/dicomImport/matRad_importDicomGUI.m +++ b/dicomImport/matRad_importDicomGUI.m @@ -22,7 +22,7 @@ % Edit the above text to modify the response to help matRad_importDicomGUI -% Last Modified by GUIDE v2.5 02-Jun-2017 00:45:04 +% Last Modified by GUIDE v2.5 09-Aug-2019 18:44:22 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % @@ -43,16 +43,16 @@ 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @matRad_importDicomGUI_OpeningFcn, ... 'gui_OutputFcn', @matRad_importDicomGUI_OutputFcn, ... - 'gui_LayoutFcn', [] , ... + 'gui_LayoutFcn', @matRad_importDicomGUI_LayoutFcn, ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end % if nargout - [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); + [varargout{1:nargout}] = matRad_importDicomGUI_gui_mainFcn(gui_State, varargin{:}); % else -% gui_mainfcn(gui_State, varargin{:}); +% matRad_importDicomGUI_gui_mainFcn(gui_State, varargin{:}); % end % End initialization code - DO NOT EDIT @@ -69,13 +69,15 @@ function matRad_importDicomGUI_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject; axes(handles.axesMatRadLogo) -[im, ~, alpha] = imread('matrad_logo.png'); +[path,name,ext] = fileparts(mfilename('fullpath')); + +[im, ~, alpha] = imread([path filesep '..' filesep 'gfx/matrad_logo.png']); q = image(im); axis equal off set(q, 'AlphaData', alpha); % show dkfz logo axes(handles.axesDKFZLogo) -[im, ~, alpha] = imread('DKFZ_Logo.png'); +[im, ~, alpha] = imread([path filesep '..' filesep 'gfx/matrad_logo.png']); p = image(im); axis equal off set(p, 'AlphaData', alpha); @@ -736,3 +738,5 @@ function checkbox3_Callback(hObject, eventdata, handles) end end + + diff --git a/tools/matRad_fixExportedGUI.m b/tools/matRad_fixExportedGUI.m index e8d136bb2..2dd417a31 100644 --- a/tools/matRad_fixExportedGUI.m +++ b/tools/matRad_fixExportedGUI.m @@ -45,6 +45,9 @@ function matRad_fixExportedGUI(guiFile) %Tooltip property f = regexprep(f,'\r?\n''TooltipMode'',get\(0,''default(uipushtool|uitoggletool|uicontrol)TooltipMode''\)(,\.\.\.|\))',''); +%Background Colormode +f = regexprep(f,'\r?\n''BackgroundColorMode'',get\(0,''default(uipushtool|uitoggletool|uicontrol)BackgroundColorMode''\)(,\.\.\.|\))',''); + %Fix remaining whitespaces f = regexprep(f,'(,\.\.\.)\s*?;',');'); @@ -70,6 +73,7 @@ function matRad_fixExportedGUI(guiFile) f = regexprep(f,expr,''); %write the functions to files [~,~] = mkdir([filepath filesep 'gui']); +addpath([filepath filesep 'gui']); fLayoutId = fopen([filepath filesep 'gui' filesep name '_LayoutFcn.m'],'w'); fprintf(fLayoutId,'%s',layoutFcn); fclose(fLayoutId); From 81332ae00554f37bdb73d544e80c62ef5fbe3351 Mon Sep 17 00:00:00 2001 From: Niklas Wahl Date: Fri, 9 Aug 2019 19:00:03 +0200 Subject: [PATCH 08/87] new figure files and backup --- dicomImport/matRad_importDicomGUI.fig | Bin 55799 -> 2604405 bytes dicomImport/matRad_importDicomGUI.fig.bak | Bin 0 -> 55799 bytes matRadGUI.fig | Bin 163773 -> 7355349 bytes matRadGUI.fig.bak | Bin 0 -> 163773 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 dicomImport/matRad_importDicomGUI.fig.bak create mode 100644 matRadGUI.fig.bak diff --git a/dicomImport/matRad_importDicomGUI.fig b/dicomImport/matRad_importDicomGUI.fig index 6d5cf04184b9b557058a9f6e70f1eadf4fc09cd7..3411f161d078e635ff94615e0af7ebfa7062ea49 100755 GIT binary patch literal 2604405 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

3p`5%VVai-yZNNNj%RC&YK*XG-JGPUZqUo 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

reD`_1D?g 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