Mercurial > hg > ltpda
diff m-toolbox/classes/@ltpda_uoh/setProperties.m @ 0:f0afece42f48
Import.
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 23 Nov 2011 19:22:13 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m-toolbox/classes/@ltpda_uoh/setProperties.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,87 @@ +% SETPROPERTIES set different properties of an object. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DESCRIPTION: set different properties of an object. It is possible to define +% the property/value pairs in a plist or direct as the input. +% +% CALL: obj = setProperties(obj, 'prop1', val1, 'prop2', val2); +% obj = setProperties(obj, pl); +% +% VERSION: $Id: setProperties.m,v 1.18 2011/07/07 11:05:31 mauro Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function varargout = setProperties(varargin) + + % Collect all user objects with history + [objs, ao_invars, rest] = utils.helper.collect_objects(varargin(:), 'ltpda_uoh'); + [pl, pl_invars, rest] = utils.helper.collect_objects(rest(:), 'plist'); + + if numel(pl) > 0 && numel(rest) > 0 + error('### I Don''t know what do do. If a parameter should contain a plist then specify the property and the value in a plist'); + end + + % Decide on a deep copy or a modify + objs = copy(objs, nargout); + + % Combine the rest of the inputs to the plist + while length(rest) >= 2 + prop = upper(rest{1}); + val = rest{2}; + rest = rest(3:end); + + if ischar(prop) + pl = combine(plist(prop, val), pl); + else + error('### The input property must be a char but it is a [%s] object', class(prop)); + end + end + + for ii = 1:numel(objs) + + obj_class = class(objs(ii)); + mthds = methods(obj_class); + + for jj = 1:pl.nparams + + cmd = ['set' pl.params(jj).key(1) lower(pl.params(jj).key(2:end))]; + + % Special case for the timespan class because the set methos for the + % 'startT' and 'endT' properties ends with a capital letter + if isa(objs, 'timespan') && ... + (strcmpi(pl.params(jj).key, 'endT') ||... + strcmpi(pl.params(jj).key, 'startT')) + cmd(end) = 'T'; + end + + if utils.helper.ismember(cmd, mthds) + %%%%%%%%%% It exists a set method to set the property %%%%%%%%%% + try + if iscell(pl.params(jj).getVal) && length(pl.params(jj).getVal) == length(objs) + %%% Set the value in the cell + feval(cmd, objs(ii), pl.params(jj).getVal{ii}); + %%% Reset the value in the plistUset to this single value + objs(ii).hist.plistUsed.pset(pl.params(jj).key, pl.params(jj).getVal{ii}); + else + %%% Set the value + feval(cmd, objs(ii), pl.params(jj).getVal); + end + %%% Deprecation warning + warning('!!! Setting property ''%s'' which is not in the default plist is now deprecated and will be removed in future versions. Please use dedicated setter methods', ... + pl.params(jj).key); + catch ME + fprintf(2, '%s\n\n', ME.message); + warning(utils.const.warnings.METHOD_NOT_FOUND, '!!! Can not set the the property [%s] because the setter-method fails.', lower(pl.params(jj).key)); + end + elseif objs(ii).isprop(lower(pl.params(jj).key)) + warning(utils.const.warnings.METHOD_NOT_FOUND, '!!! The Object has the property [%s] but there doesn''t exist a public set method', lower(pl.params(jj).key)); + end + + end % End loop over params + + end % for-loop over all objects + + % Set output + varargout = utils.helper.setoutputs(nargout, objs); + +end