diff m-toolbox/m/gui/gltpda/buildLibrary.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/m/gui/gltpda/buildLibrary.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,316 @@
+function buildLibrary(varargin)
+% Function to update the library with all the methods functions.
+%  $Id: buildLibrary.m,v 1.12 2009/01/22 21:40:14 nicola Exp $
+
+%   clear all
+  bdclose('all');
+  disp('=====================================================')
+  disp('Updating the LTPDA Library...');
+
+% Retrieve the list of all functions and methods:
+ltpda_versions
+
+% This creates a variable named 'versions', so structured:
+% | 1.filename | 2.functionName | 3.version | 4.date | 5.hour | 6.author | 7.folder | 8.hash | 9.category | 10.class |
+% [The 'class' is set to None if it's not a method]
+
+  origSize = size(versions,1); %#ok<NODEF>
+  disp(['The overall number of LTPDA functions is ',num2str(origSize),'.'])
+
+
+% =========================================================================
+%%              Remove functions not meant for the library:
+% =========================================================================
+
+   % Remove all test functions:
+     for i=origSize:-1:1
+         if numel(versions{i,2})>4 && strcmpi(versions{i,2}(1:5),'test_')
+             versions(i,:)=[];
+         end
+     end
+     newSize = size(versions,1);
+     disp(['--- ',num2str(origSize-newSize),' test functions ignored'])
+     origSize = newSize;
+
+   % Remove all Internal functions:
+     for i=origSize:-1:1
+         if numel(versions{i,9})>7 && strcmpi(versions{i,9}(1:8),'Internal')
+             versions(i,:)=[];
+         end
+     end
+     newSize = size(versions,1);
+     disp(['--- ',num2str(origSize-newSize),' Internal functions ignored'])
+     origSize = newSize;
+
+   % Remove all private functions:
+     for i=origSize:-1:1
+         x = numel(versions{i,10});
+         if x>8 && strcmpi(versions{i,10}(x-7:x),'/private')
+             versions(i,:)=[];
+         end
+     end
+     newSize = size(versions,1);
+     disp(['--- ',num2str(origSize-newSize),' private functions ignored'])
+     origSize = newSize;
+
+   % Remove all remaining examples:
+     for i=origSize:-1:1
+         x = numel(versions{i,7});
+         if x>10 && strcmpi(versions{i,7}(x-9:x),'/examples/')
+             versions(i,:)=[];
+         end
+     end
+     newSize = size(versions,1);
+     disp(['--- ',num2str(origSize-newSize),' examples ignored'])
+     origSize = newSize;
+
+   % Remove templates:
+     for i=origSize:-1:1
+         funcName = versions{i,2};
+         x = numel(funcName);
+         if x>9 && strcmpi(funcName(x-8:x),'_template')
+             versions(i,:)=[];
+         end
+     end
+     newSize = size(versions,1);
+     disp(['--- ',num2str(origSize-newSize),' templates ignored'])
+     origSize = newSize;
+
+   % Remove all uncategorized functions:
+     for i=origSize:-1:1
+         if isempty(versions{i,9})
+             versions(i,:)=[];
+         end
+     end
+     newSize = size(versions,1);
+     disp(['--- ',num2str(origSize-newSize),' uncategorized functions ignored'])
+     origSize = newSize;
+
+   % Remove all functions with category 'GUI function':
+     for i=origSize:-1:1
+         if strcmpi(versions{i,9},'GUI function')
+             versions(i,:)=[];
+         end
+     end
+     newSize = size(versions,1);
+     disp(['--- ',num2str(origSize-newSize),' GUI functions ignored'])
+     origSize = newSize;
+
+   % Remove all functions with no class:
+     for i=origSize:-1:1
+         if strcmp(versions{i,10},'None')
+             versions(i,:)=[];
+         end
+     end
+     newSize = size(versions,1);
+     disp(['--- ',num2str(origSize-newSize),' functions with class ''None'' ignored'])
+     origSize = newSize;
+     
+   % Remove all functions with non user classes:
+     for i=origSize:-1:1
+         if numel(versions{i,10})>5 && strncmpi(versions{i,10},'ltpda_',6)
+            versions(i,:)=[];
+         elseif numel(versions{i,10})>3 && strncmpi(versions{i,10},'data',4)
+            versions(i,:)=[];
+         end
+     end
+     newSize = size(versions,1);
+     disp(['--- ',num2str(origSize-newSize),' functions with class ''ltpda_***'' ignored'])
+     origSize = newSize;
+% =========================================================================
+%%                    Prepare the library for update:
+% =========================================================================
+
+    disp(['The number of LTPDA functions for the library is ',num2str(origSize),'.'])
+       numbFunctions = 0;
+       funcCategories = {};
+       for i=1:origSize
+           if numel(versions{i,10})>3 && strcmpi(versions{i,10}(1:4),'None')
+               numbFunctions = numbFunctions +1;
+               if ~ismember(versions{i,9},funcCategories)
+                   funcCategories = [funcCategories,versions{i,9}];
+               end
+           end
+       end
+     % These are the root level subsystems:
+       funcCategories = [funcCategories,'Methods'];
+    disp([num2str(numbFunctions),' are functions, ',num2str(origSize-numbFunctions),' are methods.'])
+    disp('=====================================================')
+   
+    load_system libraryBase.mdl
+    open ltpda_library.mdl
+    set(get_param(gcs,'Handle'),'Lock','off')
+    
+  % Delete all functions/methods folders in the root and create them anew:
+    for i=1:numel(funcCategories)
+        try %#ok<ALIGN>
+        subsystem = find_system(bdroot,'Name',funcCategories{i});
+        subsysPos = get(get_param(subsystem{1},'Handle'),'Position');
+        delete_block(subsystem);
+        catch end %#ok<CTCH>
+        SubSystemBlock = add_block('libraryBase/SubSystName',['ltpda_library/',funcCategories{i}]);
+        disp(['-- ',funcCategories{i},' updated'])
+        if ~isempty(subsystem), set(SubSystemBlock,'Position',subsysPos); end
+        set(SubSystemBlock,'LinkStatus','inactive')
+        set(SubSystemBlock,'MaskDisplay',['disp(''',funcCategories{i},''')'])
+        clear subsysPos subsystem SubSystemBlock
+    end
+
+  % Creating the Methods/<class> folder for each class anew:
+    classes = utils.helper.ltpda_classes;
+
+  % Remove improper classes:
+    for i=numel(classes):-1:1
+       if (numel(classes{i})>5 && strncmpi(classes{i},'ltpda_',6)) || (numel(classes{i})>3 && strncmpi(classes{i},'data',4)),          
+            classes(i)=[];
+       end;
+    end
+
+    for i=1:numel(classes)
+        classFolder = add_block('libraryBase/SubSystName',['ltpda_library/Methods/',classes{i}]);
+        set(classFolder,'LinkStatus','inactive')
+        set(classFolder,'MaskDisplay',['disp(''',classes{i},''')'])
+        % Cycle to set proper position:
+        x=1;y=1;
+        while ~isempty(find_system('ltpda_library/Methods','SearchDepth',1,'Position',[30+80*(y-1) , 30+80*(x-1) , 80+80*(y-1) , 80+80*(x-1)]))
+            y=y+1;
+            if y==6, x=x+1; y=1; end
+        end
+        set(classFolder,'Position',[30+80*(y-1) , 30+80*(x-1) , 80+80*(y-1) , 80+80*(x-1)])
+    end
+    
+% =========================================================================
+%%                     Rebuild the library contents:
+% =========================================================================
+
+  for i=1:origSize
+          currMethod = versions{i,2};
+          currCateg = versions{i,9};
+          currClass = versions{i,10};
+          
+          % Check to verify whether a folder for this category exists:
+            categFolder = find_system(['ltpda_library/Methods/',currClass],'SearchDepth',1,'Name',currCateg);
+            try categFolder = categFolder{1}; catch end %#ok<CTCH>
+            if isempty(categFolder)
+                categFolder = add_block('libraryBase/SubSystName',['ltpda_library/Methods/',currClass,'/',currCateg]);
+                set(categFolder,'LinkStatus','inactive')
+                set(categFolder,'MaskDisplay',['disp(''',currCateg,''')'])
+              % Cycle to set proper position:
+                x=1;y=1;
+                while ~isempty(find_system(['ltpda_library/Methods/',currClass],'SearchDepth',1,'Position',[30+80*(y-1) , 30+80*(x-1) , 80+80*(y-1) , 80+80*(x-1)]))
+                    aaa = find_system(['ltpda_library/Methods/',currClass],'SearchDepth',1,'Position',[30+80*(y-1) , 30+80*(x-1) , 80+80*(y-1) , 80+80*(x-1)]);
+                    if (strcmp(aaa{1},['ltpda_library/Methods/',currClass]) && numel(aaa)==1), break; end
+                    y=y+1;
+                    if y==5, x=x+1; y=1; end
+                end                
+                set(categFolder,'Position',[30+80*(y-1) , 30+80*(x-1) , 80+80*(y-1) , 80+80*(x-1)])
+            end
+
+          % Adding the proper method block:
+            if strcmp(currCateg,'Constructor')
+                blockH = add_block('libraryBase/constructor',['ltpda_library/Methods/',currClass,'/',currCateg,'/',currMethod]);
+            elseif strcmp(currCateg,'Output')
+                blockH = add_block('libraryBase/output',['ltpda_library/Methods/',currClass,'/',currCateg,'/',currMethod]);
+            elseif ~strcmp(currMethod,'Contents')
+                blockH = add_block('libraryBase/function',['ltpda_library/Methods/',currClass,'/',currCateg,'/',currMethod]);
+            end
+
+          % Cycle to set proper position:
+            x=1;y=1;
+            while ~isempty(find_system(['ltpda_library/Methods/',currClass,'/',currCateg],'SearchDepth',1,'Position',[30+70*(y-1) , 30+70*(x-1) , 80+70*(y-1) , 60+70*(x-1)]))
+                aaa = find_system(['ltpda_library/Methods/',currClass,'/',currCateg],'SearchDepth',1,'Position',[30+70*(y-1) , 30+70*(x-1) , 80+70*(y-1) , 60+70*(x-1)]);
+                if (strcmp(aaa{1},['ltpda_library/Methods/',currClass,'/',currCateg]) && numel(aaa)==1), break; end
+                y=y+1;
+                if y==5, x=x+1; y=1; end
+            end
+            set(blockH,'Position',[30+70*(y-1) , 30+70*(x-1) , 80+70*(y-1) , 60+70*(x-1)])
+            
+            set(blockH,'LinkStatus','inactive')
+            set(blockH,'MaskDisplay',['disp(''',currMethod,''')'])
+            set(blockH,'Tag',['method ',currClass])
+            set(blockH,'Description','')
+            maskText = eval(['help(''',currClass,'/',currMethod,''');']);
+            maskText = strtok(maskText,'%%');
+            set(blockH,'MaskDescription',maskText);
+            set(blockH,'OpenFcn','ltpdagui(''callback'',1,''redraw'',2); if (~strcmp(bdroot,''ltpda_library'') && ~isempty(findobj(''Tag'',''LTPDAGUI''))), figure(findobj(''Tag'',''LTPDAGUI'')); end');
+            set(blockH,'CopyFcn','GUIprefs = getappdata(0, ''GUIpreferences''); GUIprefs.Copied = 1; setappdata(0, ''GUIpreferences'',GUIprefs);');
+            childpath = find_system(blockH,'LookUnderMasks','all','BlockType','M-S-Function');
+            set(childpath,'Tag',currMethod)
+            set(childpath,'Name',currMethod)
+            set(childpath,'Description','')
+            
+            argsMin = str2double(versions{i,11});
+            if argsMin >1
+               setInports(blockH,argsMin);
+               set(blockH,'Position',[30+70*(y-1) , 30+70*(x-1) , 80+70*(y-1) , 60+70*(x-1)]);
+            end
+  end
+
+  % Setting proper position and size for subsystem folders in the root:
+    subsystems = find_system(bdroot,'LookUnderMasks','all','SearchDepth',1,'BlockType','SubSystem');
+    x=1; y=1;
+    for i=1:numel(subsystems)
+        set_param(subsystems{i},'Position',[30+100*(y-1) , 30+100*(x-1) , 95+100*(y-1) , 90+100*(x-1)])
+        y=y+1;
+        if y==4, x=x+1; y=1; end
+    end
+  
+    close_system libraryBase.mdl
+    
+  % Update the annotation:
+    annotationHandle = find_system(bdroot,'FindAll','on','SearchDepth',1,'type','annotation');
+    caption1 = 'LTPDA Library';
+    caption2 = ['v3.0 - ',datestr(now,1)];
+    caption = strvcat(caption1,caption2); %#ok<VCAT>
+    set_param(annotationHandle, 'HorizontalAlignment','center','Text',caption)
+
+    warning off all
+    save_system ltpda_library.mdl
+    warning on all
+    close_system ltpda_library.mdl
+
+    
+    
+    
+    %----------------------------------------------------------------------
+    function setInports(varargin)
+    % Called whenever the block to be added has argsmin>1, so it needs
+    % multiple data inputs:
+       
+       currBlock = varargin{1};
+       newInports = varargin{2};
+       prevInport  = find_system(currBlock,'SearchDepth',1,'LookUnderMasks','all','BlockType','Inport');
+       
+       % To remove previous data inport and line:
+       try %#ok<ALIGN>
+          blockLines   = get_param(prevInport,'LineHandles');
+          if (blockLines.Outport(1)~=-1 && ~isempty(blockLines.Outport(1))),   delete_line(blockLines.Outport(1)); end
+          delete_block(prevInport);
+       catch end
+       
+       % To add new inports, mux and lines:
+       if newInports>1
+          muxblock = add_block('built-in/Mux', [getfullname(currBlock),'/Mux']);
+          set(muxblock,'Position',[70 , 10 , 73 , 150])
+          set(muxblock,'Inputs',num2str(newInports))
+       end
+       for ii=1:newInports
+          newBlock = add_block('built-in/Inport', [getfullname(currBlock),'/Inport1'],'MakeNameUnique','on');
+          set_param(newBlock,'Port',num2str(ii));
+          newBlock = get_param(newBlock,'Handle');
+          set(newBlock,'Position',[10 , 10+30*(ii-1) , 30 , 30+30*(ii-1)])
+          set(newBlock,'Tag',num2str(ii))
+          add_line(currBlock,[get(newBlock,'Name'),'/1'],[get(muxblock,'Name'),'/',num2str(ii)]);
+       end
+
+       funcBlock = find_system(currBlock,'SearchDepth',1,'LookUnderMasks','all','BlockType','M-S-Function');
+       funcBlock = get_param(funcBlock,'Name');
+       add_line(currBlock,[get(muxblock,'Name'),'/1'],[funcBlock,'/1']);
+       
+              
+    end
+    %----------------------------------------------------------------------
+    
+    
+end
+