www.gusucode.com > mbcdesign 工具箱 matlab 源码程序 > mbcdesign/@contable2/designconstraint.m

    function p = designconstraint(c,p)
%DESIGNCONSTRAINT command-line design constraint properties
%
% p = designconstraint(c,p)

%  Copyright 2007-2013 The MathWorks, Inc.

p = addprop(p,'Table',...
    @iGetTableData,...
    @iSetTableData,...
    'matrix','',...
    'Table constraint');


p = addprop(p,'RowBreakpoints',...
    @iGetRowBreakpoints,...
    @iSetRowBreakpoints,...
    'vector','',...
    'Breakpoints for rows');

p = addprop(p,'ColumnBreakpoints',...
    @iGetColumnBreakpoints,...
    @iSetColumnBreakpoints,...
    'vector','',...
    'Breakpoints for columns');

p = addprop(p,'Inequality',...
    @iGetlt,...
    @iSetlt,...
    'enum',{'<=','>='},...
    'Relational operator');

cif = getInputFactors( c );
fact = getSymbols( cif );


p = addprop(p,'RowFactor',...
    @iGetRowFactor,...
    @iSetRowFactor,...
    'enum',fact,...
    'Row input symbol');

p = addprop(p,'ColumnFactor',...
    @iGetColumnFactor,...
    @iSetColumnFactor,...
    'enum',fact,...
    'Column input symbol');

p = addprop(p,'TableFactor',...
    @iGetTableFactor,...
    @iSetTableFactor,...
    'enum',fact,...
    'Table input symbol');



function v = iGetTableData(con)

v = con.table;

function con = iSetTableData(con,v)

con.table= v;
if size(v,1)~=length(con.breakrows)
    con.breakrows = linspace(con.breakrows(1),con.breakrows(end),size(v,1));
end

if size(v,2)~=length(con.breakcols)
    con.breakcols = linspace(con.breakcols(1),con.breakcols(end),size(v,2));
end


function con = iSetRowBreakpoints(con,v)

if size(con.table,1)<length(v)
    con.table = [con.table
        zeros(size(con.table)-[length(v),0])];
else
    con.table = con.table(1:length(v),:);
end
con.breakrows = v;

function v = iGetRowBreakpoints(con)

v = con.breakrows;


function v = iGetColumnBreakpoints(con)

v = con.breakcols;

function con = iSetColumnBreakpoints(con,v)
if size(con.table,2)<length(v)
    con.table = [con.table zeros(size(con.table)-[0 length(v)])];
else
    con.table = con.table(:,1:length(v));
end
con.breakcols = v;

function v = iGetlt(con)
if con.le
   v = '<='; 
else
   v = '>='; 
end

function con = iSetlt(con,v)
con.le = double(strcmp(v,'<='));

function v = iGetRowFactor(con)

cif = getActiveFactors( con );
fact = getSymbols( cif );
v = fact{ 2 };

function con = iSetRowFactor(con,v)

con = iChangeFactor(con,2,v);


function v = iGetColumnFactor(con)
cif = getActiveFactors( con );
fact = getSymbols( cif );
v = fact{ 1 };

function con = iSetColumnFactor(con,v)

con = iChangeFactor(con,1,v);


function v = iGetTableFactor(con)

cif = getActiveFactors( con );
fact = getSymbols( cif );
v = fact{ 3 };



function con = iSetTableFactor(con,v)

con = iChangeFactor(con,3,v);


function obj = iChangeFactor(obj,Index,newval)


cif = getInputFactors( obj );
nf = length(cif);
fact = getSymbols( cif );
FactIndex = getActiveIndices(obj);
OldFact = fact(FactIndex);
if ~strcmp(newval,OldFact{Index})
    NewIndex = find( strcmp( newval,fact ) );
    factind2 = find( strcmp( newval,OldFact ) );
    if ~isempty(factind2)
        % change another variable so that each factor used only once
        avail = setdiff(1:nf, FactIndex((1:3)~=Index));
        FactIndex(factind2) = avail(1);
    end
    FactIndex(Index) = NewIndex;

    obj = setActiveIndices(obj, FactIndex);

    % now sort out table for new factors
    [xB, yB, zV] = getTable(obj);
    R = getRange(cif);
    for i = 1:length(FactIndex)
        n = FactIndex(i);
        switch i
            case 1
                xB = linspace(R(1, n), R(2, n), length(xB));
            case 2
                yB = linspace(R(1, n), R(2, n), length(yB));
            case 3
                [~, ineq] = getRelation( obj );
                if ~isequal(size(zV),[length(xB),length(yB)])
                    if ineq==1
                        zV = repmat(R(2,n), [length(xB),length(yB)]);
                    else
                        zV = repmat(R(1,n),[length(xB),length(yB)]);
                    end
                end
        end
    end
    obj = setTable(obj, xB, yB, zV);
end