banner



Import Csv In App Designer Matlab

Six years ago, I exposed the fact that *.fig files are simply MAT files in disguise. This information, in addition to the data format that I explained in that article, can help us to introspect and modify FIG files without having to actually display the figure onscreen.
Matlab has changed significantly since 2010, and one of the exciting new additions is the AppDesigner, Matlab's new GUI layout designer/editor. Unfortunately, AppDesigner still has quite a few limitations in functionality and behavior. I expect that this will improve in upcoming releases since AppDesigner is undergoing active development. But in the meantime, it makes sense to see whether we could directly introspect and potentially manipulate AppDesigner's output (*.mlapp files), as we could with GUIDE's output (*.fig files).
A situation for checking this was recently raised by a reader on the Answers forum: apparently AppDesigner becomes increasingly sluggish when the figure's code has more than a few hundred lines of code (i.e., a very simplistic GUI). In today's post I intend to show how we can explore the resulting *.mlapp file, and possibly manipulate it in a text editor outside AppDesigner.

Matlab's new AppDesigner (a somewhat outdated screenshot)
Matlab's new AppDesigner (a somewhat outdated screenshot)

The MLAPP file format

Apparently, *.mlapp files are simply ZIP files in disguise (note: not MAT files as for *.fig files). A typical MLAPP's zipped contents contains the following files (note that this might be a bit different on different Matlab releases):

  • [Content_Types].xml – this seems to be application-independent:
                                          <?xml                    version="1.0"                    encoding="UTF-8"                    standalone="true"                    ?>                                                        <types                    xmlns="http://schemas.openxmlformats.org/package/2006/content-types"                    >                                                        <default                    Extension="mat"                    ContentType="application/vnd.mathworks.matlab.appDesigner.appModel+mat"                    />                                                        <default                    Extension="rels"                    ContentType="application/vnd.openxmlformats-package.relationships+xml"                    />                                                        <default                    Extension="xml"                    ContentType="application/vnd.mathworks.matlab.code.document+xml;plaincode=true"                    />                                                        <override                    ContentType="application/vnd.openxmlformats-package.core-properties+xml"                    PartName="/metadata/coreProperties.xml"                    />                                                        <override                    ContentType="application/vnd.mathworks.package.coreProperties+xml"                    PartName="/metadata/mwcoreProperties.xml"                    />                                                        <override                    ContentType="application/vnd.mathworks.package.corePropertiesExtension+xml"                    PartName="/metadata/mwcorePropertiesExtension.xml"                    />                                                        </types>                                                      

    <?xml version="1.0" encoding="UTF-8" standalone="true"?> <types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"> <default Extension="mat" ContentType="application/vnd.mathworks.matlab.appDesigner.appModel+mat"/> <default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/> <default Extension="xml" ContentType="application/vnd.mathworks.matlab.code.document+xml;plaincode=true"/> <override ContentType="application/vnd.openxmlformats-package.core-properties+xml" PartName="/metadata/coreProperties.xml"/> <override ContentType="application/vnd.mathworks.package.coreProperties+xml" PartName="/metadata/mwcoreProperties.xml"/> <override ContentType="application/vnd.mathworks.package.corePropertiesExtension+xml" PartName="/metadata/mwcorePropertiesExtension.xml"/> </types>

  • _rels/.rels – also application-independent:
                                          <?xml                    version="1.0"                    encoding="UTF-8"                    standalone="true"                    ?>                                                        <relationships                    xmlns="http://schemas.openxmlformats.org/package/2006/relationships"                    >                                                        <relationship                    Type="http://schemas.mathworks.com/matlab/code/2013/relationships/document"                    Target="matlab/document.xml"                    Id="rId1"                    />                                                        <relationship                    Type="http://schemas.mathworks.com/package/2012/relationships/coreProperties"                    Target="metadata/mwcoreProperties.xml"                    Id="rId2"                    />                                                        <relationship                    Type="http://schemas.mathworks.com/package/2014/relationships/corePropertiesExtension"                    Target="metadata/mwcorePropertiesExtension.xml"                    Id="rId3"                    />                                                        <relationship                    Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties"                    Target="metadata/coreProperties.xml"                    Id="rId4"                    />                                                        <relationship                    Type="http://schemas.mathworks.com/appDesigner/app/2014/relationships/appModel"                    Target="appdesigner/appModel.mat"                    Id="rId5"                    />                                                        </relationships>                                                      

    <?xml version="1.0" encoding="UTF-8" standalone="true"?> <relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"> <relationship Type="http://schemas.mathworks.com/matlab/code/2013/relationships/document" Target="matlab/document.xml" Id="rId1"/> <relationship Type="http://schemas.mathworks.com/package/2012/relationships/coreProperties" Target="metadata/mwcoreProperties.xml" Id="rId2"/> <relationship Type="http://schemas.mathworks.com/package/2014/relationships/corePropertiesExtension" Target="metadata/mwcorePropertiesExtension.xml" Id="rId3"/> <relationship Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="metadata/coreProperties.xml" Id="rId4"/> <relationship Type="http://schemas.mathworks.com/appDesigner/app/2014/relationships/appModel" Target="appdesigner/appModel.mat" Id="rId5"/> </relationships>

  • metadata/coreProperties.xml – contains the timestamp of figure creation and last update:
                                          <?xml                    version="1.0"                    encoding="UTF-8"                    standalone="true"                    ?>                                                        <cp:coreProperties                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"                    xmlns:dcterms="http://purl.org/dc/terms/"                    xmlns:dcmitype="http://purl.org/dc/dcmitype/"                    xmlns:dc="http://purl.org/dc/elements/1.1/"                    xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties"                    >                                                        <dcterms:created                    xsi:type="dcterms:W3CDTF"                    >                  2016-08-01T18:20:26Z                    </dcterms:created>                                                                            <dcterms:modified                    xsi:type="dcterms:W3CDTF"                    >                  2016-08-01T18:20:27Z                    </dcterms:modified>                                                                            </cp:coreProperties>                                                      

    <?xml version="1.0" encoding="UTF-8" standalone="true"?> <cp:coreProperties xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties"> <dcterms:created xsi:type="dcterms:W3CDTF">2016-08-01T18:20:26Z</dcterms:created> <dcterms:modified xsi:type="dcterms:W3CDTF">2016-08-01T18:20:27Z</dcterms:modified> </cp:coreProperties>

  • metadata/mwcoreProperties.xml – contains information on the generating Matlab release:
                                          <?xml                    version="1.0"                    encoding="UTF-8"                    standalone="true"                    ?>                                                        <mwcoreProperties                    xmlns="http://schemas.mathworks.com/package/2012/coreProperties"                    >                                                        <contentType>                                      application/vnd.mathworks.matlab.app                    </contentType>                                                                            <contentTypeFriendlyName>                                      MATLAB App                    </contentTypeFriendlyName>                                                                            <matlabRelease>                                      R2016a                    </matlabRelease>                                                                            </mwcoreProperties>                                                      

    <?xml version="1.0" encoding="UTF-8" standalone="true"?> <mwcoreProperties xmlns="http://schemas.mathworks.com/package/2012/coreProperties"> <contentType>application/vnd.mathworks.matlab.app</contentType> <contentTypeFriendlyName>MATLAB App</contentTypeFriendlyName> <matlabRelease>R2016a</matlabRelease> </mwcoreProperties>

  • metadata/mwcorePropertiesExtension.xml – more information about the generating Matlab release. Note that the version number is not exactly the same as the main Matlab version number: here we have 9.0.0.328027 whereas the main Matlab version number is 9.0.0.341360. I do not know whether this is checked anywhere.
                                          <?xml                    version="1.0"                    encoding="UTF-8"                    standalone="true"                    ?>                                                        <mwcoreProperties                    xmlns="http://schemas.mathworks.com/package/2014/corePropertiesExtension"                    >                                                        <matlabVersion>                                      9.0.0.328027                    </matlabVersion>                                                                            </mwcoreProperties>                                                      

    <?xml version="1.0" encoding="UTF-8" standalone="true"?> <mwcoreProperties xmlns="http://schemas.mathworks.com/package/2014/corePropertiesExtension"> <matlabVersion>9.0.0.328027</matlabVersion> </mwcoreProperties>

  • appdesigner/appModel.mat – This is a simple MAT file that holds a single Matlab object called "appData" (of type appdesigner.internal.serialization.app.AppData) the information about the uifigure , similar in concept to the *.fig files generated by the old GUIDE:
    >> d =                  load                  (                  'C:\Yair\App3\appdesigner\appModel.mat'                  )                  Warning: Functionality not supported with figures created with the uifigure                  function.                  For                  more                  information, see Graphics Support in App Designer.                  (                  Type                  "warning                  off MATLAB:ui:uifigure:UnsupportedAppDesignerFunctionality" to suppress this                  warning.)                  d =     appData:                  [1x1 appdesigner.internal.serialization.app.AppData                  ]                  >> d.appData                  ans                  =   AppData with properties:       UIFigure:                  [1x1                  Figure                  ]                  CodeData:                  [1x1 appdesigner.internal.codegeneration.model.CodeData                  ]                  Metadata:                  [1x1 appdesigner.internal.serialization.app.AppMetadata                  ]                  ToolboxVer:                  '2016a'                  >> d.appData.CodeData                  ans                  =   CodeData with properties:     GeneratedClassName:                  'App3'                  Callbacks:                  [0x0 appdesigner.internal.codegeneration.model.AppCallback                  ]                  StartupFcn:                  [1x1 appdesigner.internal.codegeneration.model.AppCallback                  ]                  EditableSection:                  [1x1 appdesigner.internal.codegeneration.model.CodeSection                  ]                  ToolboxVer:                  '2016a'                  >> d.appData.Metadata                  ans                  =   AppMetadata with properties:     GroupHierarchy:                  {                  }                  ToolboxVer:                  '2016a'                

    >> d = load('C:\Yair\App3\appdesigner\appModel.mat') Warning: Functionality not supported with figures created with the uifigure function. For more information, see Graphics Support in App Designer. (Type "warning off MATLAB:ui:uifigure:UnsupportedAppDesignerFunctionality" to suppress this warning.) d = appData: [1x1 appdesigner.internal.serialization.app.AppData] >> d.appData ans = AppData with properties: UIFigure: [1x1 Figure] CodeData: [1x1 appdesigner.internal.codegeneration.model.CodeData] Metadata: [1x1 appdesigner.internal.serialization.app.AppMetadata] ToolboxVer: '2016a' >> d.appData.CodeData ans = CodeData with properties: GeneratedClassName: 'App3' Callbacks: [0x0 appdesigner.internal.codegeneration.model.AppCallback] StartupFcn: [1x1 appdesigner.internal.codegeneration.model.AppCallback] EditableSection: [1x1 appdesigner.internal.codegeneration.model.CodeSection] ToolboxVer: '2016a' >> d.appData.Metadata ans = AppMetadata with properties: GroupHierarchy: {} ToolboxVer: '2016a'

  • matlab/document.xml – this file contains a copy of the figure's classdef code in plain-text XML:
                                          <?xml                    version="1.0"                    encoding="UTF-8"                    ?>                                                        <w:document                    xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"                    >                                                        <w:body>                                                                            <w:p>                                                                            <w:pPr>                                                                            <w:pStyle                    w:val="code"                    />                                                        </w:pPr>                                                                            <w:r>                                                                            <w:t>                                                        <![CDATA[classdef App2 < matlab.apps.AppBase % Properties that correspond to app components properties (Access = public) UIFigure matlab.ui.Figure UIAxes matlab.ui.control.UIAxes Button matlab.ui.control.Button CheckBox matlab.ui.control.CheckBox ListBoxLabel matlab.ui.control.Label ListBox matlab.ui.control.ListBox end methods (Access = public) function results = func(app) % Yair 1/8/2016 end end % App initialization and construction methods (Access = private) % Create UIFigure and components function createComponents(app) % Create UIFigure app.UIFigure = uifigure; app.UIFigure.Position = [100 100 640 480]; app.UIFigure.Name = 'UI Figure'; setAutoResize(app, app.UIFigure, true) % Create UIAxes app.UIAxes = uiaxes(app.UIFigure); title(app.UIAxes, 'Axes'); xlabel(app.UIAxes, 'X'); ylabel(app.UIAxes, 'Y'); app.UIAxes.Position = [23 273 300 185]; % Create Button app.Button = uibutton(app.UIFigure, 'push'); app.Button.Position = [491 378 100 22]; % Create CheckBox app.CheckBox = uicheckbox(app.UIFigure); app.CheckBox.Position = [491 304 76 15]; % Create ListBoxLabel app.ListBoxLabel = uilabel(app.UIFigure); app.ListBoxLabel.HorizontalAlignment = 'right'; app.ListBoxLabel.Position = [359 260 43 15]; app.ListBoxLabel.Text = 'List Box'; % Create ListBox app.ListBox = uilistbox(app.UIFigure); app.ListBox.Position = [417 203 100 74]; end end methods (Access = public) % Construct app function app = App2() % Create and configure components createComponents(app) % Register the app with App Designer registerApp(app, app.UIFigure) if nargout == 0 clear app end end % Code that executes before app deletion function delete(app) % Delete UIFigure when app is deleted delete(app.UIFigure) end end end]]>                                      </w:t>                                                                            </w:r>                                                                            </w:p>                                                                            </w:body>                                                                            </w:document>                                                      

    <?xml version="1.0" encoding="UTF-8"?> <w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> <w:body> <w:p> <w:pPr> <w:pStyle w:val="code"/> </w:pPr> <w:r> <w:t> <![CDATA[classdef App2 < matlab.apps.AppBase % Properties that correspond to app components properties (Access = public) UIFigure matlab.ui.Figure UIAxes matlab.ui.control.UIAxes Button matlab.ui.control.Button CheckBox matlab.ui.control.CheckBox ListBoxLabel matlab.ui.control.Label ListBox matlab.ui.control.ListBox end methods (Access = public) function results = func(app) % Yair 1/8/2016 end end % App initialization and construction methods (Access = private) % Create UIFigure and components function createComponents(app) % Create UIFigure app.UIFigure = uifigure; app.UIFigure.Position = [100 100 640 480]; app.UIFigure.Name = 'UI Figure'; setAutoResize(app, app.UIFigure, true) % Create UIAxes app.UIAxes = uiaxes(app.UIFigure); title(app.UIAxes, 'Axes'); xlabel(app.UIAxes, 'X'); ylabel(app.UIAxes, 'Y'); app.UIAxes.Position = [23 273 300 185]; % Create Button app.Button = uibutton(app.UIFigure, 'push'); app.Button.Position = [491 378 100 22]; % Create CheckBox app.CheckBox = uicheckbox(app.UIFigure); app.CheckBox.Position = [491 304 76 15]; % Create ListBoxLabel app.ListBoxLabel = uilabel(app.UIFigure); app.ListBoxLabel.HorizontalAlignment = 'right'; app.ListBoxLabel.Position = [359 260 43 15]; app.ListBoxLabel.Text = 'List Box'; % Create ListBox app.ListBox = uilistbox(app.UIFigure); app.ListBox.Position = [417 203 100 74]; end end methods (Access = public) % Construct app function app = App2() % Create and configure components createComponents(app) % Register the app with App Designer registerApp(app, app.UIFigure) if nargout == 0 clear app end end % Code that executes before app deletion function delete(app) % Delete UIFigure when app is deleted delete(app.UIFigure) end end end]]> </w:t> </w:r> </w:p> </w:body> </w:document>

I do not know why the code is duplicated, both in document.xml and (twice!) in appModel.mat. On the face of it, this does not seem to be a wise design decision.

Editing MLAPP files outside AppDesigner

We can presumably edit the app in an external editor as follow:

  1. Open the *.mlapp file in your favorite zip viewer (e.g., winzip or winrar). You may need to rename/copy the file as *.zip.
  2. Edit the contents of the contained matlab/document.xml file in your favorite text editor (Matlab's editor for example)
  3. Load appdesigner/appModel.mat into Matlab workspace.
  4. Go to appData.CodeData.EditableSection.Code and update the cell array with the lines of your updated code (one cell element per user-code line).
  5. Do the same with appData.CodeData.GeneratedCode (if existing), which holds the same data as appData.CodeData.EditableSection.Code but also including the AppDesigner-generated [non-editable] code.
  6. Save the modified appData struct back into appdesigner/appModel.mat
  7. Update the zip file (*.mlapp) with the updated appModel.mat and document.xml

In theory, it is enough to extract the classdef code and same it in a simple *.m file, but then you would not be able to continue using AppDesigner to make layout modifications, and you would need to make all the changes manually in the m-file. If you wish to continue using AppDesigner after you modified the code, then you need to save it back into the *.mlapp file as explained above.
If you think this is not worth all the effort, then you're probably right. But you must admit that it's a bit fun to poke around…
One day maybe I'll create wrapper utilities ( mlapp2m and m2mlapp ) that do all this automatically, in both directions. Or maybe one of my readers here will pick up the glove and do it sooner – are you up for the challenge?

Caveat Emptor

Note that the MLAPP file format is deeply undocumented and subject to change without prior notice in upcoming Matlab releases. In fact, MathWorker Chris Portal warns us that:

A word of caution for anyone that tries this undocumented/unsupported poking into their MLAPP file. Taking this approach will almost certainly guarantee your app to not load in one of the subsequent releases. Just something to consider in your off-roading expedition!

Then again, the same could have been said about the FIG and other binary file formats used by Matlab, which remained essentially the same for the past decade: Some internal field values may have changed but not the general format, and in any case the newer releases still accept files created with previous releases. For this reason, I speculate that future AppDesigners will accept MLAPP files created by older releases, possibly even hand-modified MLAPP files. Perhaps a CRC hash code of some sort will be expected, but I believe that any MLAPP that we modify today will still work in future releases. However, I could well be mistaken, so please be very careful with this knowledge. I trust that you can make up your own mind about whether it is worth the risk (and fun) or not.
AppDesigner is destined to gradually replace the aging GUIDE over the upcoming years. They currently coexist since AppDesigner (and its web-based uifigures) still does not contain all the functionality that GUIDE (and JFrame-based figures) provides (a few examples). I already posted a few short posts about AppDesigner (use the AppDesigner tag to list them), and today's article is another in that series. Over the next few years I intend to publish more on AppDesigner and its associated new GUI framework (uifigures).

Zurich visit, 21-31 Aug 2016

I will be traveling to Zürich for a business trip between August 21-31. If you are in the Zürich area and wish to meet me to discuss how I could bring value to your work, then please email me (altmany at gmail).

Import Csv In App Designer Matlab

Source: https://undocumentedmatlab.com/articles/appdesigner-mlapp-file-format

Posted by: buttontintles.blogspot.com

0 Response to "Import Csv In App Designer Matlab"

Post a Comment

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel