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

    function out=propertypage(obj,action,varargin)
% PROPERTYPAGE  Create a property gui for CandidateSet
%
%
%   This should be overloaded by child classes
%
%   Interface:  Lyt=propertypage(cs,'layout',fig);
%               Lyt=propertypage(cs,'update',lyt,p_cs,model);
%               Lyt=propertypage(cs,'enable',lyt,enstate);

%  Copyright 2000-2015 The MathWorks, Inc. and Ford Global Technologies, Inc.


switch lower(action)
    case 'layout'
        out=i_createlyt(obj, varargin{:});
    case 'update'
        out=i_update(varargin{:});
    case 'enable'
        out=i_setenable(varargin{:});
end


function lyt = i_createlyt(obj, figh,varargin)

% create new layout in figure
pUD = xregGui.RunTimePointer;
ud.pointer = [];
ud.figure = figh;
ud.model = [];
ud.callback = '';
for n=1:2:length(varargin)
    switch lower(varargin{n})
        case 'callback'
            ud.callback = varargin{n+1};
    end
end

ud.cpedt=mbcgui.widget.Spinner('Parent', figh,...
    'Min',1,...
    'Max',20,...
    'ClickIncrement',1,...
    'Rule','int', ...
    'Callback',{@i_cpchng,pUD});
ud.cptxt=xregGui.labelcontrol('parent',figh,...
    'LabelSizeMode','absolute',...
    'LabelSize',130,...
    'ControlSizeMode','absolute',...
    'ControlSize',70,...
    'gap',5,...
    'string','Number of center points:',...
    'Control',ud.cpedt);
[ud.RangeTable, ud.RangeTableUpdate] = pRangeEditor(obj, figh, ...
    ud.pointer, ud.model, ud.callback);
ud.RangeLabel = uicontrol('Parent',figh, ...
    'Style', 'text', ...
    'HorizontalAlignment', 'left', ...
    'String', 'Range of values and custom star point location:');

ud.aopts=xregGui.rbgroup(figh,...
    'nx',1,'ny',4,...
    'value',[1; 0; 0; 0],...
    'string',{'Face center cube';'Spherical';'Rotatable';'Custom (edit values in table)'}, ...
    'callback',{@i_aopts,pUD});
ud.ALabel = uicontrol('Parent',figh, ...
    'Style', 'text', ...
    'HorizontalAlignment', 'left', ...
    'String', 'Star point position:');
ud.inscribe=uicontrol('Parent',figh,...
    'Style','checkbox',...
    'String','Inscribe star points',...
    'Callback',{@i_setinscr,pUD});

% Add a column for the custom alpha values
ud.RangeTable.ValueColumnCount = ud.RangeTable.ValueColumnCount+1;
ud.RangeTable.ValueColumnHeader = [ud.RangeTable.ValueColumnHeader, {'Alpha'}];
ud.LevelsListener = handle.listener(ud.RangeTable, 'VariableChanged', {@iAlphaChange, pUD});

lyt = xreggridbaglayout(figh, ...
    'userdata', pUD, ...
    'dimension', [9 2], ...
    'rowsizes', [20 10 15 80 10 15 10 15 -1], ...
    'colsizes', [15 -1], ...
    'mergeblock', {[1 1], [1 2]}, ...
    'mergeblock', {[3 3], [1 2]}, ...
    'mergeblock', {[6 6], [1 2]}, ...
    'mergeblock', {[8 8], [1 2]}, ...
    'mergeblock', {[9 9], [1 2]}, ...
    'elements', {ud.cptxt, [], ud.ALabel, [], [], ud.inscribe, ...
    [], ud.RangeLabel, ud.RangeTable, ...
    [], [], [], ud.aopts});

ud.layout=lyt;
pUD.info = ud;



% External update function.
function lyt=i_update(lyt,p,m)
% update current layout
pUD = get(lyt,'UserData');
ud = pUD.info;
ud.pointer = p;
ud.model = m;
ud = i_setvalues(ud);
pUD.info = ud;


function ud=i_setvalues(ud)
cs = ud.pointer.info;
set(ud.cpedt,'Value',get(cs,'numcenter'));

% Set up the range table
ud.RangeTableUpdate(ud.pointer, ud.model);

a = get(cs,'alpha');
nf = nfactors(cs);
% look for face center, spherical, rotatable
AlphaVals = cell(nf,1);
AlphaTypes = zeros(nf,1);
if all(a==1)
    set(ud.aopts,'Selected',1);
elseif all(abs(a-sqrt(nf))<1e-10)
    set(ud.aopts,'Selected',2);
elseif all(abs(a-(2^(nf/4)))<1e-10)
    % rotatable if a= 2^(nf/4)
    set(ud.aopts,'Selected',3);    
else
    set(ud.aopts,'Selected',4);
    AlphaVals = num2cell(a(:));
    AlphaTypes(:) = 1;
end
ud.RangeTable.setValueColumn('Alpha', AlphaVals, AlphaTypes);

in = get(cs,'inscribe');
if strcmp(in,'on')
    set(ud.inscribe,'Value',1);
else
    set(ud.inscribe,'Value',0);
end


function lyt=i_setenable(lyt,state)
pUD = get(lyt,'UserData');
ud = pUD.info;
set(ud.cptxt,'Enable',state);
set(ud.RangeTable, 'Enable', state);
set(ud.aopts,'Enable',state);
set(ud.inscribe,'Enable',state);


function i_cpchng(obj,nul,pUD)
ud = pUD.info;
val = get(ud.cpedt,'Value');
ud.pointer.info = set(ud.pointer.info,'numcenter',val);
pUD.info = ud;
i_firecb(ud);


function iAlphaChange(src, evt, pUD)
if ~src.isEventInColumn(evt, 'Alpha')
    return
end
a = src.getValueColumn('Alpha');
a = [a{:}];

ud = pUD.info;
if all(isfinite(a)) && all(a>=1)
    ud.pointer.info = set(ud.pointer.info,'alpha',a);
    i_firecb(ud);
else
    a = get(ud.pointer.info,'alpha');
end
AlphaVals = num2cell(a(:));
ud.RangeTable.setValueColumn('Alpha', AlphaVals);

pUD.info = ud;


function i_aopts(obj,nul,pUD)
ud = pUD.info;

cs = ud.pointer.info;
a = get(cs,'alpha');

sel = get(obj,'Selected');
if sel==4
    AlphaTypes = ones(size(a(:)));
else
    if sel==1
        val = 1;
    elseif sel==2
        val = sqrt(nfactors(ud.pointer.info));
    elseif sel==3
        val = 2^(nfactors(ud.pointer.info)/4);
    end
       
    a(:) = val;
    cs = set(cs,'alpha',a);
    ud.pointer.info = cs;
    
    AlphaTypes = zeros(size(a(:)));
end
AlphaVals = num2cell(a(:));
ud.RangeTable.setValueColumn('Alpha', AlphaVals, AlphaTypes);

i_firecb(ud);


function i_setinscr(obj,nul,pUD)
ud = pUD.info;
cs = ud.pointer.info;
sel = get(obj,'Value');
if sel
    cs = set(cs,'inscribe','on');
else
    cs = set(cs,'inscribe','off');
end
ud.pointer.info = cs;
i_firecb(ud);


function i_firecb(ud)
xregcallback(ud.callback,ud.layout,[]);