www.gusucode.com > mbcdata 工具箱 matlab 源码程序 > mbcdata/@cgoptim/guiFreeValueRangeEditor.m
function [optim, ok] = guiFreeValueRangeEditor(optim) %GUIFREEVALUERANGEEDITOR Dialog for editing free value ranges % % [OPTIM, OK] = GUIFREEVALUERANGEEDITOR(OPTIM) shows a dialog that lets % the user choose the range they want to optimize the free values over. % Copyright 2005-2012 The MathWorks, Inc. and Ford Global Technologies, Inc. pFree = getfreevalues(optim); Names = pveceval(pFree, @getname); HasRange = hasFreeValueRange(optim, pFree); Range = getFreeValueRange(optim, pFree); hFig = xregdialog('Name', 'Edit Free Variable Ranges', ... 'Tag', 'OptimFreeVarEditor'); xregcenterfigure(hFig, [400 300]); xregpersistfigpos(hFig); hTable = mbcwidgets.VariableEditorTable('Parent', hFig, ... 'NameColumnHeader', 'Free Variable', ... 'ValueColumnHeader', {'Use Default', 'Minimum', 'Maximum'}, ... 'ValueColumnCount', 3, ... 'ColumnWidth', 250); TableEditList = handle.listener(hTable, 'VariableChanged', @i_editvar); hOK = uicontrol('Parent', hFig, ... 'String', 'OK', ... 'Style', 'pushbutton', ... 'Callback', @i_ok); hCancel = uicontrol('Parent', hFig, ... 'String', 'Cancel', ... 'Style', 'pushbutton', ... 'Callback', @(src, evt) set(hFig, 'Visible', 'off')); hInfo = uicontrol('Parent', hFig, ... 'HorizontalAlignment','left',... 'Style', 'text'); L = xreggridbaglayout(hFig, ... 'packstatus', 'off', ... 'dimension', [3 3], ... 'rowsizes', [-1 35,25], ... 'colsizes', [-1 65 65], ... 'gap', 7, ... 'border', [7 7 7 7], ... 'mergeblock', {[1 1], [1 3]}, ... 'mergeblock', {[2 2], [1 3]}, ... 'elements', {hTable, hInfo, [],[],[],hOK,[],[], hCancel}); hFig.LayoutManager = L; set(L, 'packstatus', 'on'); i_redrawtable; ModelRangeInfo = getModelRangeInfo(optim); if ~isempty(ModelRangeInfo) % disable table and display message in range editor dialog set(hTable,'Enable','off'); set(hInfo,'String',sprintf('Ranges are determined using the model ranges of the point-by-point model %s and the operating points in the optimization.',ModelRangeInfo.Name)); end hFig.showDialog(hOK); ok = strcmpi(get(hFig, 'Tag'), 'ok'); if ok if ~all(HasRange) resetFreeValueRange(optim, pFree(~HasRange)); end if any(HasRange) setFreeValueRange(optim, pFree(HasRange), Range(HasRange, :)); end end hFig.delete; function i_redrawtable Values = cell(length(Names), 3); Values(:,1) = num2cell(~HasRange); Values(:,[2 3]) = num2cell(Range); hTable.setVariables(Names, ... repmat([5 1 1], length(Names), 1), ... Values); end function i_editvar(src, evt) R = evt.Data.Row; C = evt.Data.Column; if C==1 HasRange(R) = ~evt.Data.NewValue; if ~HasRange(R) % Get default range from the variable and display this DefR = pFree(R).getrange; if any(Range(R,:)~=DefR) Range(R, :) = pFree(R).getrange; i_redrawtable; hTable.selectCell(R,C+1); end end else % Get changed value Range(R, C-1) = evt.Data.NewValue; % Make sure the "Use default" checkbox isn't still checked if ~HasRange(R) HasRange(R) = true; i_redrawtable; hTable.selectCell(R,C+1); end end end function i_ok(src, evt) % Check to see if min < max for all variables. If not, inform the % user idx = Range(:, 1) > Range(:, 2); if any(idx) % Inform the user that the dialog cannot be closed until all % the free variable ranges are set up correctly hDlg = xregdialog('Name', 'Invalid Free Variable Ranges', ... 'MinimumSize', [250 200]); xregcenterfigure(hDlg, [250 200]); msgStr = ['The following variables have a minimum ', ... 'greater than their maximum']; hStr = uicontrol('Style', 'text', ... 'Parent', hDlg, ... 'HorizontalAlignment', 'left', ... 'String', msgStr); hList = cgtools.exprList('parent', hDlg, ... 'DisplayTypeColumn', false, ... 'DisplayHeaderRow', false, ... 'SelectionStyle', 'single', ... 'Items', pFree(idx)); hClose = uicontrol('Style', 'pushbutton', ... 'Parent', hDlg, ... 'String', 'Close', ... 'Enable', 'on', ... 'Callback', 'set(gcbf, ''tag'', ''ok'', ''visible'', ''off'');'); hLayout = xreggridbaglayout(hDlg, ... 'packstatus', 'off', ... 'dimension', [3 2], ... 'rowsizes', [30 -1 25], ... 'colsizes', [-1 65], ... 'mergeblock', {[1 1], [1 2]}, ... 'mergeblock', {[2 2], [1 2]}, ... 'gapy', 10, ... 'gapx', 7, ... 'border', [7 7 7 10], ... 'elements', {hStr, hList, [], [], [], hClose}); hDlg.ContentHandle = hLayout; set(hLayout, 'packstatus', 'on'); hDlg.showDialog(hClose); delete(hDlg); else set(hFig, 'Tag', 'ok', 'Visible', 'off'); end end end