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

    function out = propertypage(obj,action,varargin) %#ok<INUSL>
%PROPERTYPAGE Create a property gui for CSET_GRDLATT
%
%  PROPERTYPAGE(CS, ACTION, ARGS) creates a property page that can be
%  embedded within a figure.  See CANDIDATESET/PROPEDIT for more
%  information.

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



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



function lyt=i_createlyt(figh,varargin)
ud.pointer=[];
ud.figure=figh;
ud.model=[];
ud.callback='';
if nargin>1
    for n=1:2:length(varargin)
        switch lower(varargin{n})
            case 'callback'
                ud.callback=varargin{n+1};
        end
    end
end

SC = xregGui.SystemColorsDbl;

ud.lstbox=uicontrol('Parent',figh,...
    'BackgroundColor',SC.WINDOW_BG,...
    'Value',1,...
    'Style','listbox',...
    'UserData',cset_grdlatt);
ud.grltrb=xregGui.rbgroup('parent', figh, ...
    'position',[0 0 140 20],...
    'nx',2,'ny',1,...
    'string',{'Grid','Lattice'},'value',[0 1]);
ud.lattszedt=mbcgui.widget.Spinner('Parent', figh,...
    'Min',2,...
    'Max',1e6,...
    'ClickIncrement',10,...
    'Rule','int');
lattsz = xregGui.labelcontrol('parent', figh, ...
    'string', 'Lattice size:', ...
    'LabelSizeMode', 'absolute', ...
    'LabelSize', 70, ...
    'ControlSizeMode', 'absolute', ....
    'ControlSize', 70, ...
    'Control', ud.lattszedt);


frame = mbcgui.container.layoutpanel('Parent', figh, ...
    'BorderType', 'etchedin', ...
    'LayoutBorder', [5 5 5 5]);
ud.minedt=uicontrol('Parent',frame,...
    'Style','edit',...
    'BackgroundColor', SC.WINDOW_BG,...
    'Interruptible','off');
ud.maxedt=uicontrol('Parent',frame,...
    'Style','edit',...
    'BackgroundColor',SC.WINDOW_BG,...
    'Interruptible','off');
ud.mintxt=xregGui.labelcontrol('parent',frame,...
    'ControlSizeMode', 'absolute', ....
    'ControlSize', 70, ...
    'LabelSizeMode', 'absolute', ...
    'LabelSize', 130, ...
    'Control', ud.minedt);
ud.maxtxt=xregGui.labelcontrol('parent',frame,...
    'ControlSizeMode', 'absolute', ....
    'ControlSize', 70, ...
    'LabelSizeMode', 'absolute', ...
    'LabelSize', 130, ...
    'Control', ud.maxedt);

ud.nlvledt=mbcgui.widget.Spinner('Parent', frame,...
    'Min',2,...
    'Max',1000,...
    'ClickIncrement',1,...
    'Rule','int');
ud.nlvltxt=xregGui.labelcontrol('parent',frame,...
    'ControlSizeMode', 'absolute', ....
    'ControlSize', 70, ...
    'LabelSizeMode', 'absolute', ...
    'LabelSize', 130, ...
    'Control', ud.nlvledt);

ud.rbg=xregGui.rbgroup('parent', frame,...
    'nx',1,'ny',2,...
    'string', {'Equally spaced levels'; 'User-specified levels'}, ...
    'value',[1; 0], ...
    'gapy',85);

ud.lvledt=uicontrol('Parent',frame,...
    'Style','edit',...
    'BackgroundColor', SC.WINDOW_BG,...
    'Enable','off',...
    'HorizontalAlignment','left');

udh=ud.lstbox;
% callbacks
set(ud.lstbox,'Callback',{@i_factchng,udh});
set(ud.lattszedt,'Callback',{@i_Nchng,udh});
set(ud.minedt,'Callback',{@i_minchng,udh});
set(ud.maxedt,'Callback',{@i_maxchng,udh});
set(ud.nlvledt,'Callback',{@i_nlvlchng,udh});
set(ud.lvledt,'Callback',{@i_lvlchng,udh});
set(ud.rbg,'Callback',{@i_gridmeth,udh});
set(ud.grltrb,'Callback',{@i_grltchng,udh});


ud.grlay = xreggridbaglayout(frame, ...
    'packstatus', 'off', ...
    'dimension', [7, 2], ...
    'rowsizes', [15 20 20 20 0 15 20], ...
    'colsizes', [20 -1], ...
    'gapy', 5, ...
    'mergeblock', {[1 6], [1 2]}, ...
    'elements', {ud.rbg, [], [], [], [], [], [], ...
    [], ud.mintxt, ud.maxtxt, ud.nlvltxt, [], [], ud.lvledt});

ud.ltlay = xreggridbaglayout(frame, ...
    'dimension', [3, 1], ...
    'rowsizes', [20 20 20], ...
    'gapy', 5, ...
    'elements', {ud.mintxt, ud.maxtxt, ud.nlvltxt});

ud.crd=xregcardlayout(frame, ...
    'numcards',2, ...
    'currentcard',2);
attach(ud.crd,ud.grlay,1);
attach(ud.crd,ud.ltlay,2);
set(frame, 'LayoutComponent', ud.crd);

lyt = xreggridbaglayout(figh, ...
    'dimension', [4, 3], ...
    'rowsizes', [20 10 20 -1], ...
    'colsizes', [-1 -1 -1], ...
    'colratios', [.25 .4 .35], ...
    'gapx', 15, ...
    'mergeblock', {[1 1], [1 3]}, ...
    'mergeblock', {[4 4], [2 3]}, ...
    'mergeblock', {[3 4], [1 1]}, ...
    'elements', {lattsz, [], ud.lstbox, [], [], [], ud.grltrb, frame});

ud.layout=lyt;
set(udh,'UserData',ud);




%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% External update function.  Finds udh the dirty way %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function lyt=i_update(lyt,p,m)
% Get listbox
el = get(lyt, 'elements');
el = el{3};
ud=get(el,'UserData');
ud.pointer=p;
ud.model=m;
ud=i_setvalues(ud);
set(ud.lstbox,'UserData',ud);


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Set all strings, values etc from data in udh %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function ud=i_setvalues(ud)
cs=ud.pointer.info;

fact=get(ud.model,'symbol');
set(ud.lstbox,'String',fact);
factnum=get(ud.lstbox,'Value');
fact=fact{factnum};

% set lattice size
set(ud.lattszedt,'Value',get(cs,'N'));

grddims=get(cs,'griddims');
ltdims=get(cs,'latticedims');
vis= get(ud.crd,'Visible');  set(ud.crd,'Visible','off');
% decide which option to show for this factor
if ismember(factnum,grddims)
    % grid
    set([ud.mintxt;ud.maxtxt;ud.nlvltxt],{'String'},...
        {['Minimum ' fact ' value:'];['Maximum ' fact ' value:'];['Number of levels for ' fact ':']});
    gridnum= grddims==factnum;
    lvls=get(cs,'levels');
    lvl=invcode(ud.model,lvls{gridnum}(:),factnum)';
    set([ud.minedt;ud.maxedt],{'String'},...
        {min(lvl);max(lvl)});
    set(ud.nlvledt,'Rule','int','Value',length(lvl),'Max',1000);
    str=prettify(lvl);
    set(ud.lvledt,'String',str);
    % decide if the str represents a number of equal levels
    SC = xregGui.SystemColorsDbl;
    if (length(strfind(str,':'))<=2 && isempty(strfind(str,' '))) || length(lvl)==2
        % use set levels
        set(ud.rbg,'Value',[1; 0]);
        % set enable statuses
        set(ud.lvledt,'Enable','off', 'BackgroundColor', SC.CTRL_BG);
        set([ud.mintxt;ud.maxtxt;ud.nlvltxt],'Enable','on');
    else
        set(ud.rbg,'Value',[0; 1]);
        set(ud.lvledt,'Enable','on', 'BackgroundColor', SC.WINDOW_BG);
        set([ud.mintxt;ud.maxtxt;ud.nlvltxt],'Enable','off');
    end
    set(ud.crd,'currentcard',1);
    lyt=getcard(ud.crd,1);
    repack(lyt{1});   % Need to force redraw of min,max etc - shared with lattice view
    set(ud.grltrb,'Value',[1 0]);
else
    % lattice
    set([ud.mintxt;ud.maxtxt;ud.nlvltxt],{'String'},...
        {['Minimum ' fact ' value:'];['Maximum ' fact ' value'];['Prime number for ' fact ':']});
    set([ud.mintxt;ud.maxtxt;ud.nlvltxt],'Enable','on');
    latnum=find(ltdims==factnum);
    lims=get(cs,'limits');
    lims=invcode(ud.model,lims{latnum}(:),factnum);
    set([ud.minedt;ud.maxedt],{'String'},...
        {lims(1);lims(2)});
    set(ud.lattszedt,'Value',get(cs,'n'));
    maxg=primes(get(cs,'n'));
    maxg=maxg(end);
    g=get(cs,'g');
    set(ud.nlvledt,'Rule','prime','Max',maxg,'Value',g(latnum));
    set(ud.crd,'currentcard',2);
    lyt=getcard(ud.crd,2);
    repack(lyt{1});   % Need to force redraw of min,max etc - shared with grid view
    set(ud.grltrb,'Value',[0 1]);
end
set(ud.crd,'Visible',vis);


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Callbacks from each object %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function i_factchng(~,~,udh)
ud=get(udh,'UserData');
ud=i_setvalues(ud);
set(udh,'UserData',ud);


function i_Nchng(~,~,udh)
ud=get(udh,'UserData');
val=get(ud.lattszedt,'Value');
cs= set(ud.pointer.info,'n',val);

% check the g values are all below N
g=get(cs,'g');
if any(g>val)
    % Change to lower primes
    p=primes(val);
    p=p(end);
    g(g>p)=p;
    cs=set(cs,'g',g);
end

% If the current factor is a lattice one then update the value and max of
% the spinner
factnum = get(ud.lstbox,'Value');
ltnum = factnum==get(cs,'latticedims');
if any(ltnum)
    set(ud.nlvledt,'Value',g(ltnum), 'Max', val);
end

ud.pointer.info=cs;
set(udh,'UserData',ud);
i_firecb(ud);


function i_minchng(~,~,udh)
ud=get(udh,'UserData');
factnum=get(ud.lstbox,'Value');
mnval=str2double(get(ud.minedt,'String'));
mnval=code(ud.model,mnval,factnum);
cs=ud.pointer.info;
if (get(ud.grltrb,'Selected')-1)~=0
    % Lattice view
    ltnum=find(get(cs,'latticedims')==factnum);
    lims=get(cs,'limits');
    mxval=lims{ltnum}(2);
    if isempty(mnval) || length(mnval)~=1 || mnval>=mxval || isnan(mnval)
        % reset display
        lims=invcode(ud.model,lims{ltnum}(1),factnum);
        set(ud.minedt,'String',lims);
    else
        lims{ltnum}(1)=mnval;
        cs=set(cs,'limits',lims);
        ud.pointer.info=cs;
        set(udh,'UserData',ud);
        i_firecb(ud);
    end
else
    % Grid View
    grnum=find(get(cs,'griddims')==factnum);
    lvls=get(cs,'levels');
    lims=lvls{grnum};
    mxval=max(lims);
    if isempty(mnval) || length(mnval)~=1 || mnval>=mxval || isnan(mnval)
        % reset display
        lims=invcode(ud.model,min(lims(:)),factnum);
        set(ud.minedt,'String',lims);
    else
        % recreate levels vector
        nlvls=get(ud.nlvledt,'Value');
        lvls{grnum}=linspace(mnval,mxval,nlvls);
        cs=set(cs,'levels',lvls);
        set(ud.lvledt,'String',prettify(invcode(ud.model, lvls{grnum}', factnum)'));
        ud.pointer.info=cs;
        set(udh,'UserData',ud);
        i_firecb(ud);
    end
end


function i_maxchng(~,~,udh)
ud=get(udh,'UserData');
factnum=get(ud.lstbox,'Value');
mxval=str2double(get(ud.maxedt,'String'));
mxval=code(ud.model,mxval,factnum);
cs=ud.pointer.info;
if (get(ud.grltrb,'Selected')-1)~=0
    % Lattice view
    ltnum=find(get(cs,'latticedims')==factnum);
    lims=get(cs,'limits');
    mnval=lims{ltnum}(1);
    if isempty(mxval) || length(mxval)~=1 || mnval>=mxval || isnan(mxval)
        % reset display
        lims=invcode(ud.model,lims{ltnum}(2),factnum);
        set(ud.maxedt,'String',lims);
    else
        lims{ltnum}(2)=mxval;
        cs=set(cs,'limits',lims);
        ud.pointer.info=cs;
        set(udh,'UserData',ud);
        i_firecb(ud);
    end
else
    % Grid View
    grnum=find(get(cs,'griddims')==factnum);
    lvls=get(cs,'levels');
    lims=lvls{grnum};
    mnval=min(lims);
    if isempty(mxval) || length(mxval)~=1 || mnval>=mxval || isnan(mxval)
        % reset display
        lims=invcode(ud.model,max(lims(:)),factnum);
        set(ud.minedt,'String',lims);
    else
        % recreate levels vector
        nlvls=get(ud.nlvledt,'Value');
        lvls{grnum}=linspace(mnval,mxval,nlvls);
        cs=set(cs,'levels',lvls);
        set(ud.lvledt,'String',prettify(invcode(ud.model, lvls{grnum}', factnum)'));
        ud.pointer.info=cs;
        set(udh,'UserData',ud);
        i_firecb(ud);
    end
end



function i_nlvlchng(~,~,udh)
ud=get(udh,'UserData');
factnum=get(ud.lstbox,'Value');

cs=ud.pointer.info;
if (get(ud.grltrb,'Selected')-1)~=0
    % Lattice View
    ltnum = get(cs,'latticedims')==factnum;
    val=get(ud.nlvledt,'Value');
    g=get(cs,'g');
    g(ltnum)=val;
    cs=set(cs,'g',g);
    ud.pointer.info=cs;
else
    % Grid View
    grnum=find(get(cs,'griddims')==factnum);
    nlvls=get(ud.nlvledt,'Value');
    lvls=get(cs,'levels');
    mnval=min(lvls{grnum}(:));
    mxval=max(lvls{grnum}(:));
    lvls{grnum}= linspace(mnval,mxval,nlvls);
    cs=set(cs,'levels',lvls);
    ud.pointer.info=cs;
    % update levels edit box
    set(ud.lvledt,'String',prettify(invcode(ud.model, lvls{grnum}', factnum)'));
end
set(udh,'UserData',ud);
i_firecb(ud);



function i_gridmeth(obj,~,udh)
ud=get(udh,'UserData');
% switch enable status of bits
val=get(obj,'Selected');
SC = xregGui.SystemColorsDbl;
switch val
    case 1
        set(ud.lvledt,'Enable','off', 'BackgroundColor', SC.CTRL_BG);
        set([ud.mintxt;ud.maxtxt;ud.nlvltxt],'Enable','on');
        % reset levels edit box using min/max/nlevels
        i_nlvlchng(ud.nlvledt,[],udh);
    case 2
        set([ud.mintxt;ud.maxtxt;ud.nlvltxt],'Enable','off');
        set(ud.lvledt,'Enable','on', 'BackgroundColor', SC.WINDOW_BG);
end



function i_lvlchng(~,~,udh)
ud=get(udh,'UserData');
cs=ud.pointer.info;
lvl=str2num(get(ud.lvledt,'String'));
factnum=get(ud.lstbox,'Value');
grnum=find(factnum==get(cs,'griddims'));
lvls=get(cs,'levels');
if ~isempty(lvl) && isnumeric(lvl) && length(unique(lvl))>1
    lvls{grnum}=code(ud.model,lvl(:),factnum)';
    set([ud.minedt;ud.maxedt],{'String'},{min(lvl(:));max(lvl(:))});
    set(ud.nlvledt,'Value',length(lvl));
    cs=set(cs,'levels',lvls);
    ud.pointer.info=cs;
    set(udh,'UserData',ud);
    i_firecb(ud);
else
    lvl=(invcode(ud.model,lvls{grnum}(:),factnum))';
end
set(ud.lvledt,'String',prettify(lvl));



function i_grltchng(~,~,udh)
ud=get(udh,'UserData');
factnum=get(ud.lstbox,'Value');
isgr=get(ud.grltrb,'Selected')-1;
cs=ud.pointer.info;
if isgr
    % convert to lattice
    % remove from grid
    gdims=get(cs,'griddims');
    glvls=get(cs,'levels');
    gval=find(gdims==factnum);
    gdims(gval)=[];
    glvls(gval)=[];
    % add to lattice
    ldims=get(cs,'latticedims');
    g=get(cs,'g');
    [ldims i]=sort([ldims factnum]);
    lms=limits(cs);
    llims=num2cell(lms(ldims,:),2);
    
    p=primes(max(get(cs,'n')/50,30));
    p=p(5:end);
    p = p(randperm(length(p)));

    g=[g p(end)];
    g=g(i);
else
    % convert to grid
    % remove from lattice
    ldims=get(cs,'latticedims');
    g=get(cs,'g');
    llims=get(cs,'limits');
    lval=find(ldims==factnum);
    llims(lval)=[];
    g(lval)=[];
    % add to grid
    lms=limits(cs);
    gdims=get(cs,'griddims');
    glvls=get(cs,'levels');
    [gdims i]=sort([gdims factnum]);
    glvls(end+1)={linspace(lms(factnum,1),lms(factnum,2),3)};
    glvls=glvls(i);
end
% set new values
cs=set(set(cs,'griddims',gdims),'levels',glvls);
cs=set(set(cs,'limits',llims),'g',g);
ud.pointer.info=cs;
% need to update half of view anyway so use full update fcn.
ud=i_setvalues(ud);
set(udh,'UserData',ud);
i_firecb(ud);


function i_firecb(ud)
if ischar(ud.callback)
    evalin('base',ud.callback);
else
    str=[ud.callback(1) {ud.layout,[]} ud.callback(2:end)];
    feval(str{:});
end