www.gusucode.com > mbcdesign 工具箱 matlab 源码程序 > mbcdesign/@contable1/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',...
    @iGetZ,...
    @iSetZ,...
    'vector','',...
    'Table constraint');

p = addprop(p,'Breakpoints',...
    @iGetX,...
    @iSetX,...
    'vector','',...
    'Breakpoints for rows');

cif = getInputFactors( c );
fact = getSymbols( cif );
p = addprop(p,'Inequality',...
    @iGetlt,...
    @iSetlt,...
    'enum',{'<=','>='},...
    'Relational Operator');

p = addprop(p,'InputFactor',...
    @iGetXFactor,...
    @iSetXFactor,...
    'enum',fact,...
    'Column input symbol');

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

function v = iGetZ(con)

v = con.table;

function con = iSetZ(con,v)

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



function con = iSetX(con,v)

if length(v)<length(con.table)
    con.table = con.table(1:length(v));
else
    con.table(length(con.table+1):length(v)) =  con.table(end);
end
con.breakcols = v(:)';

function v = iGetX(con)

v = con.breakcols;


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

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

function v = iGetXFactor(con)

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

function con = iSetXFactor(con,v)

con = iChangeFactor(con,1,v);


function v = iGetZFactor(con)

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


function con = iSetZFactor(con,v)

con = iChangeFactor(con,2,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:2)~=Index));
        FactIndex(factind2) = avail(1);
    end
    FactIndex(Index) = NewIndex;
    
    obj = setActiveIndices(obj, FactIndex);

    % now sort out table for new factors
    [xB, 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
                [~, ineq] = getRelation( obj );
                if ineq==1
                    zV = repmat(R(2,n), size(zV));
                else
                    zV = repmat(R(1,n), size(zV));
                end
        end
    end
    obj = setTable(obj, xB, zV);
end