Once again I welcome guest blogger Donn Shull, who continues his multi-part series about Matlab’s undocumented UDD objects.
Creating a new UDD package
To illustrate the construction of UDD classes with Matlab m-code, let’s create a simple class belonging to a new simple package. Our class will have two properties: a Name property of type string, and a Value property of type double. This class will have two methods that will illustrate overloading the built-in disp function, and using a dialog method to present a GUI. Our class will also have one event, to demonstrate UDD event handling.
To create this simple UDD class we need two directories and five m-files (downloadable here): The parent directory needs to be a directory on the Matlab path. A subdirectory of the parent directory is named with the symbol @ followed by our UDD package name – this is the package directory. In this example, the subdirectory is called @simple.
Within the @simple directory, place a file named schema.m, which is the package definition file. This is a very simple file, that merely calls schema.package to create a new package called ‘simple’:
function schema() %SCHEMA simple package definition function. schema.package('simple'); end |
If you place additional m-files in the package directory they will be called package function files. Those files will have package scope and can be accessed with the notation packagename.functionname
. We will not use package functions in this example, so we will only have the schema.m file shown above.
Creating a new UDD class
Next, create another subdirectory beneath @simple, named with an @ symbol followed by the UDD class name. In this example we will create the directory @object (i.e., /@simple/@object/). We place four m-files in this directory:
The first file is yet another schema.m file, which is the class-definition file:
function schema() %SCHEMA simple.object class definition function. % Get a handle to the 'simple' package simplePackage = findpackage('simple'); % Create a base UDD object simpleClass = schema.class(simplePackage, 'object'); % Define the class methods: % dialog.m method m = schema.method(simpleClass, 'dialog'); s = m.Signature; s.varargin = 'off'; s.InputTypes = {'handle'}; s.OutputTypes = {}; % disp.m method m = schema.method(simpleClass, 'disp'); s = m.Signature; s.varargin = 'off'; s.InputTypes = {'handle'}; s.OutputTypes = {}; % Define the class properties: schema.prop(simpleClass, 'Name', 'string'); schema.prop(simpleClass, 'Value', 'double'); % Define the class events: schema.event(simpleClass, 'simpleEvent'); end |
Here, we used the built-in findpackage function to identify our base package (simple
). Then we used schema.class to define a new class ‘object’ within that base package. We next defined two class methods, two properties and finally an event.
Defining class methods
It is not mandatory to define the method signatures as we have done in our class definition file. If you omit the method signature definitions, Matlab will automatically generate default signatures that will actually work in most applications. However, I believe that it is bad practice to omit the method signature definitions in a class definition file, and there are cases where your classes will not work as you have intended if you omit them.
Now, place a file named object.m in the @object directory. This file contains the class constructor method, which is executed whenever a new instance object of the simple.object
class is created:
function simpleObject = object() %OBJECT constructor for the simple.object class % % SIMPLEOBJECT = OBJECT(NAME, VALUE) creates an instance of the % simple.object class with the Name property set to NAME and the % Value property set VALUE % % SIMPLEOBJECT = OBJECT(NAME) creates an instance of the simple.object % class with the Name property set to NAME. The Value property will be % given the default value of 0. % % SIMPLEOBJECT = OBJECT creates an instance of the simple.object class % and executes the simple.object dialog method to open a GUI for editing % the Name and Value properties. % % INPUTS: % NAME : string % VALUE : double % % OUTPUTS: % SIMPLEOBJECT : simple.object instance simpleObject = simple.object; switch nargin case 0 simpleObject.dialog; case 1 simpleObject.Name = name; case 2 simpleObject.Name = name; simpleObject.Value = value; end end |
The two other m-files in the @object directory will be our class methods – a single file for each method. In our case they are disp.m and dialog.m:
function disp(self) %DISP overloaded object disp method % % DISP(SELF) or SELF.DISP uses the MATLAB builtin DISP function % to display the Name and Value properties of the object. % % INPUTS: % SELF : simple.object instance builtin('disp', sprintf(' Name: %s\n Value: %f', self.Name, self.Value)); %Alternative: fprintf('\n Name: %s\n Value: %f', self.Name, self.Value)); end |
And the dialog method (in dialog.m):
function dialog(self) %DIALOG dialog method for simple.object for use by openvar % % DIALOG(SELF) or SELF.DIALOG where self is the name of the simple.object % instance opens a gui to edit the Name and Value properties of self. % % INPUTS: % SELF : simple.object dlgValues = inputdlg({'Name:', 'Value:'}, 'simple.object', 1, {self.Name, mat2str(self.Value)}); if ~isempty(dlgValues) self.Name = dlgValues{1}; self.Value = eval(dlgValues{2}); end end |
Testing our new class
Now let’s test our new class by creating an instance without using any input arguments
a = simple.object |
This calls the object’s constructor method, which launches the input dialog GUI:
![UDD simple class GUI UDD simple class GUI](https://undocumentedmatlab.com/images/UDD_simple_object_1.jpg)
Note the default empty string value for the Name property, and the default zero value for the Value property. In one of the following articles I will show how to control property values. For now let’s assign ‘a’ to Name and 1 to Value using the GUI. Selecting OK updates our object and closes the GUI. Matlab then calls the object’s disp method to display our object in the command window:
a =
Name: a
Value: 1.000000 |
We can reopen our object’s GUI using three methods: The most obvious is to invoke the dialog method using a.dialog
or dialog(a)
. Alternately, double click on a in the workspace explorer window – Matlab will automatically call the built-in openvar function with the variable name and value as arguments. Which leads us to the third method – simply call openvar(‘a’, a) directly:
% Alternatives for programmatically displaying the GUI a.dialog(); % or simply: a.dialog dialog(a); openvar('a',a); |
Accessing UDD help
You may have noticed that in our constructor and method files we have included help text. This is good practice for all Matlab files in general, and UDD is no exception. We can access the UDD class help as follows:
> help simple.object OBJECT constructor for the simple.object class SIMPLEOBJECT = OBJECT(NAME, VALUE) creates an instance of the simple.object class with the Name property set to NAME and the Value property set VALUE SIMPLEOBJECT = OBJECT(NAME) creates an instance of the simple.object class with the Name property set to NAME. The Value property will be given the default value of 0. SIMPLEOBJECT = OBJECT creates an instance of the simple.object class and executes the simple.object dialog method to open a GUI for editing the Name and Value properties. INPUTS: NAME : string VALUE : double OUTPUTS: SIMPLEOBJECT : simple.object instance >> help simple.object.disp DISP overloaded object disp method DISP(SELF) or SELF.DISP uses the MATLAB builtin DISP function to display the Name and Value properties of the object. INPUTS: SELF : simple.object instance |
One of the best ways to learn how Matlab works is to examine code written by the Matlab development team. openvar is a good example: By looking at it we can see that if a variable is a handle object and is opaque, then openvar will check to see if it has a dialog method. If so, it will use that to open the variable for editing. With this information we can guess that MCOS, UDD and even java objects can all launch their own dialog editors simply by having an appropriate dialog method.
An excellent source of UDD information is available in the Matlab toolbox folders. The base Matlab toolbox contains sixteen different UDD packages to explore. Yummy!
In the next article of this UDD series we will look at creating hierarchical structures using our simple.object
and a unique UDD method.
[…] An easy way to do this is by setting the second argument of the schema.prop function. A detailed explanation was provided here. […]
Hi,
I’m new to Matlab and came across your very interesting website site. Could you please tell me what UDD stands for?
Universal Data Dictionary (Thanks to Yairs research)