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