Initial commit
[pftoolbox.git] / expressions / @xsymbolic / set.m
blob9cdc5ef247f2f7f28907ba07e82f6ac2565e12f5
1 function objout = set(obj,varargin)\r
2 % Sets the properties of an object.\r
3 %\r
4 % set(obj, 'propertyname', value) sets the property 'propertyname' of the object 'obj'\r
5 % to the value 'value'. \r
6 %\r
7 % An equivalent syntax is obj.propertyname = value.\r
8 %\r
9 % set(obj, 'property1', value1, 'property2', value2, ...) sets multiple property values.\r
10 % set(obj, 'property') displays legitimate values for the specified property of 'obj'.\r
11 % set(obj) displays all properties of 'obj' and their admissible values.\r
12 %\r
13 % If an output argument is specified, the modified object will be assigned to this and\r
14 % no modifications will be done to the input object.\r
15 %\r
16 % Type 'props(obj)' for more details on the properties of the object 'obj'.\r
18 % Toolbox for nonlinear filtering.\r
19 % Copyright (C) 2005  Jakob Rosén <jakob.rosen@gmail.com>\r
20 %\r
21 % This program is free software; you can redistribute it and/or\r
22 % modify it under the terms of the GNU General Public License\r
23 % as published by the Free Software Foundation; either version 2\r
24 % of the License, or (at your option) any later version.\r
25 %\r
26 % This program is distributed in the hope that it will be useful,\r
27 % but WITHOUT ANY WARRANTY; without even the implied warranty of\r
28 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
29 % GNU General Public License for more details.\r
30 %\r
31 % You should have received a copy of the GNU General Public License\r
32 % along with this program; if not, write to the Free Software\r
33 % Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\r
35 if nargin==1\r
36         % Only 'obj' is supplied. Display the list of properties.\r
37         displayprops(obj);\r
38 elseif nargin==2;\r
39         % A parameter was given, but no value. Display information about the property.\r
40         prop_name = varargin{1};\r
41         [props,rprops]=pnames;\r
42         if findcstr(props,prop_name)||findcstr(rprops,prop_name)\r
43                 disp(pformat(get(obj,prop_name)));\r
44         else\r
45                 error('Unknown property');\r
46         end\r
47 else\r
48         if isempty(inputname(1))&&nargout<1\r
49                 error('The first argument must be a named variable if no output argument is given.')\r
50         elseif rem(nargin-1,2)~=0,\r
51                 error('Property/value pairs must come in even number.')\r
52         end\r
54         property_argin = varargin;\r
55         while length(property_argin) >= 2,\r
56                 prop_name = property_argin{1};\r
57                 v = property_argin{2};\r
58                 property_argin = property_argin(3:end);\r
59                 switch prop_name\r
61                 % <custom>\r
62                 % Here we handle properties that need custom treatment (or need to be \r
63                 % processed really fast)\r
65                 case 'gradx'\r
66                         % Write a method for this, please!\r
67                         if isa(v,'cell')\r
68                                 obj.gradx=char2oneline(ext2int(v',obj.xvars,'x',obj.wvars,obj.wchar,obj.uvars,'u')');\r
69                         elseif isa(v,'char')\r
70                                 obj.gradx=inline(v,'x','t','w','u');\r
71                         end\r
73                 case 'gradw'\r
74                         % Write a method for this, please!\r
75                         if isa(v,'cell')\r
76                                 obj.gradw=char2oneline(ext2int(v',obj.xvars,'x',obj.wvars,obj.wchar,obj.uvars,'u')');\r
77                         elseif isa(v,'char')\r
78                                 obj.gradw=inline(v,'x','t','w','u');\r
79                         end\r
81                 case 'expression'\r
82                         obj.expression=v;\r
83                         obj=refresh(obj);       % Update the internal, str expressions\r
84                 case 'str'\r
85                         obj.expression=str2expr(v);\r
86                         obj=refresh(obj);       % Update the internal, str expressions\r
87                 case {'xvars','uvars'}\r
88                         obj.(prop_name)=v;\r
89                         obj=refresh(obj);       % Update the internal expression\r
90                 case 'wvars'\r
91                         obj.(prop_name)=v;\r
92                         obj.wvars_auto=false;\r
93                         obj=refresh(obj);       % Update the internal expression\r
94                 case 'wchar'\r
95                         obj.wchar=v;\r
96                         if obj.wvars_auto\r
97                                 charexpr=convert2char(obj.expression);\r
98                                 obj.wvars=getvars(charexpr,'w');\r
99                         end\r
100                         obj=refresh(obj);       % Update the internal expression\r
102                 % </custom>\r
104                 otherwise\r
105                         [props,rprops]=pnames;\r
106                         if findcstr(props,prop_name)\r
107                                 eval(strcat('obj.',prop_name,'=v;'));\r
108                         elseif findcstr(rprops,prop_name)\r
109                                 error([prop_name,' is a read-only property'])\r
110                         else\r
111                                 error([prop_name,' is not a valid property'])\r
112                         end\r
113                 end\r
114         end\r
116         if nargout==0\r
117                 % No output variable was specified by the user.\r
118                 % We'll do the assignment manually in the caller's workspace.\r
119                 objname = inputname(1);\r
120                 assignin('caller',objname,obj)\r
121         else\r
122                 objout=obj;\r
123         end;\r
124 end\r