Mercurial > hg > ltpda
view m-toolbox/classes/@LTPDAworkbench/parseBlocks.m @ 2:18e956c96a1b database-connection-manager
Add LTPDADatabaseConnectionManager implementation. Matlab code
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Sun, 04 Dec 2011 21:23:09 +0100 |
parents | f0afece42f48 |
children |
line wrap: on
line source
function [cmds, rbs] = parseBlocks(blocks, wb, varID) cmds = {}; rbs = []; Nrbs = awtinvoke(blocks, 'size'); % loop over blocks for jj=1:Nrbs block = awtinvoke(blocks, 'get', jj-1); if ~block.isCommentedOut rbs = [rbs block]; bname = char(block.getName); % if exist(bname) > 1 || ~isvarname(bname) % error('The block named "%s" is not a valid variable name. \nPlease rename it.', bname); % end % if this is a MATBlock we treat it differently since it has % no plist. if isa(block, 'mpipeline.canvas.MATBlock') cmds = parseMATblock(cmds, block, varID); elseif isa(block, 'mpipeline.canvas.PipelineBlock') cmds = parsePipelineBlock(cmds, block, varID); elseif isa(block, 'mpipeline.canvas.MATfcn') cmds = parseMATfcn(cmds, block, varID); elseif isa(block, 'mpipeline.canvas.MTerminal') % Terminals are not executed. They are skipped over when asking % for source and child blocks; that's handled on the java side. elseif isa(block, 'mpipeline.canvas.MConstant') % Don't do anything, we did this at the beginning of % execution elseif isa(block, 'mpipeline.canvas.Mux') cmds = parseMux(cmds, block, varID); elseif isa(block, 'mpipeline.canvas.Demux') cmds = parseDemux(cmds, block, varID); elseif isa(block, 'mpipeline.canvas.ToWorkspace') cmds = parseToWorkspace(cmds, block, varID); else cmds = parseLTPDAblock(cmds, block, wb, varID); end % End if on block type end % End if block commented out end % End loop over blocks end %-------------------------------------------------------------------------- % Parse a ToWorkspace block % function cmds = parseToWorkspace(cmds, block, varID) % loop over inputs to make input vars inputs = block.getInputs(); % Loop over the inputs to get the variable names of the inputs for kk=0:inputs.size()-1 ip = inputs.get(kk); % get the block which is connected to this input srcblock = block.getSourceBlock(ip.getNumber); % get the port number at the source block srcportNumber = block.getSourceBlockPortNumber(ip.getNumber); if ~isempty(srcblock) varname = LTPDAworkbench.getWS_VarName(varID, srcblock, srcportNumber); % get class of the object cl = evalin('base', [ 'class(' varname ')']); % get new var name % - this means split the outvar at the last '.' nv = getVar(varname); if ismember(cl, utils.helper.ltpda_userclasses) cmd = [nv ' = copy(' varname ',1);']; else cmd = [nv ' = ' varname ';']; end cmds = [cmds {cmd}]; end end assignin('base', 'cmds', cmds); clear(); cmds = evalin('base', 'cmds'); end function nv = getVar(ov) nv = ''; for kk=length(ov):-1:1 if ov(kk) == '.' break else nv = [nv ov(kk)]; end end nv = nv(end:-1:1); end %-------------------------------------------------------------------------- % Parse a Demux block % function cmds = parseDemux(cmds, block, varID) % loop over inputs to make input vars inputs = block.getInputs(); % Demux has one input ip = inputs.get(0); % get the block which is connected to this input srcblock = block.getSourceBlock(ip.getNumber); % get the port number at the source block srcportNumber = block.getSourceBlockPortNumber(ip.getNumber); if ~isempty(srcblock) varname = LTPDAworkbench.getWS_VarName(varID, srcblock, srcportNumber); incmd = [varname]; end % make output vars outputs = block.getOutputs(); for kk=1:outputs.size() outvar = LTPDAworkbench.getWS_VarName(varID, block, kk-1); cmds = [cmds {[outvar ' = ' incmd '(' num2str(kk) ');']}]; end end %-------------------------------------------------------------------------- % Parse a Mux block % function cmds = parseMux(cmds, block, varID) % loop over inputs to make input vars inputs = block.getInputs(); incmd = '['; varnames = {}; % Loop over the inputs to get the variable names of the inputs for kk=0:inputs.size()-1 ip = inputs.get(kk); % get the block which is connected to this input srcblock = block.getSourceBlock(ip.getNumber); % get the port number at the source block srcportNumber = block.getSourceBlockPortNumber(ip.getNumber); if ~isempty(srcblock) varname = LTPDAworkbench.getWS_VarName(varID, srcblock, srcportNumber); varnames = [varnames {varname}]; incmd = [incmd varname ',']; end end if incmd(end)==',' incmd = incmd(1:end-1); end incmd = strtrim(incmd); incmd = [incmd ']']; % make output vars outputs = block.getOutputs(); if outputs.size() > 1 error('### Mux blocks should have only one output.'); elseif outputs.size() == 1 outcmd = '['; for kk=1:outputs.size() outvar = LTPDAworkbench.getWS_VarName(varID, block, kk-1); outcmd = [outcmd outvar ' ']; end outcmd = strtrim(outcmd); outcmd = [outcmd '] = ']; else outcmd = ''; end cmds = [cmds {[outcmd incmd ';']}]; end %-------------------------------------------------------------------------- % Parse a command from a MATBlock block % function cmds = parsePipelineBlock(cmds, block, varID) % get variable name outvar = LTPDAworkbench.getWS_VarName(varID, block, 0); % Get source port that this block links to sp = block.getSourcePort; % get the parent of that port sb = sp.getParent; % get var name srcvar = LTPDAworkbench.getWS_VarName(varID, sb, sp.getNumber); % build command string cmd = [outvar ' = ' srcvar ';']; % we should check if the srcvar exists try evalin('base', [srcvar ';']); catch utils.helper.errorDlg(sprintf('Source variable [%s] doesn''t exist. Did you run the required pipeline?', srcvar), 'Pipeline Source Error'); end cmds = [cmds {cmd}]; end %-------------------------------------------------------------------------- % Parse a command from a MATBlock block % function cmds = parseMATblock(cmds, block, varID) % get variable name outvar = LTPDAworkbench.getWS_VarName(varID, block, 0); % get expression exp = char(block.getExpression()); % can this expression be evaluated or is it a string? try evalin('base', [exp ';']); cmd = [outvar ' = ' exp ';']; catch cmd = [outvar ' = ''' exp ''';']; end cmds = [cmds {cmd}]; end %-------------------------------------------------------------------------- % Parse a command from an LTPDA block % function cmds = parseLTPDAblock(cmds, block, wb, varID) % We have a normal LTPDA block with a plist etc.... blockclass = char(block.getMinfo().getMclass); % build command cmd = strrep(char(block.getAlgoName), ' ', '_'); % make plist for this block jpl = block.getPlist(); pl = LTPDAworkbench.jpl2mpl(jpl); spl = string(pl); % We need to skip any PORT_# when making the inputs tks = regexpi(spl, 'PORT_(\d+)', 'tokens'); skipports = []; for kk=1:numel(tks) skipports = [skipports str2double(tks{kk}{1})]; end % skipports = skipports + 1; % loop over inputs to make input vars inputs = block.getInputs(); incmd = '('; varnames = {}; % Loop over the inputs to get the variable names of the inputs for kk=0:inputs.size()-1 ip = inputs.get(kk); if ~any(ip.getNumber==skipports) % get the block which is connected to this input srcblock = block.getSourceBlock(ip.getNumber); % get the port number at the source block srcportNumber = block.getSourceBlockPortNumber(ip.getNumber); if ~isempty(srcblock) varname = LTPDAworkbench.getWS_VarName(varID, srcblock, srcportNumber); varnames = [varnames {varname}]; incmd = [incmd varname ',']; end end end incmd = strtrim(incmd); incmd = [incmd spl ')']; % make output vars outputs = block.getOutputs(); if outputs.size() > 0 outcmd = '['; for kk=1:outputs.size() output = outputs.get(kk-1); outvar = LTPDAworkbench.getWS_VarName(varID, block, output.getNumber); bits = regexp(outvar, '\.', 'split'); if exist(outvar) > 1 && ~allAreVarNames(bits) error('The block named "%s" is not a valid variable name. \nPlease rename it.', outvar); end outcmd = [outcmd outvar ' ']; end outcmd = strtrim(outcmd); outcmd = [outcmd '] = ']; else outcmd = ''; end % Modify plist constructors looking for PORT_# for kk=1:pl.nparams if ischar(pl.params(kk).getVal) idxs = regexpi(pl.params(kk).getVal, '(PORT_\d*)', 'tokens'); repstr = pl.params(kk).getVal; for ii=1:numel(idxs) pstr = idxs{ii}{1}; % get port number [s,r] = strtok(pstr, '_'); portNumber = str2num(r(2:end)); % Now we need to find the name of the output variable at the % other end of this pipe sb = block.getSourceBlock(portNumber); if ~isa(sb, 'mpipeline.canvas.MElementWithPorts') error('### Block %s has an input PORT_%d specified in the plist, \nbut the block has no such input, or the input is not connected to a source block', char(block.getName()), portNumber); end sbp = block.getSourceBlockPortNumber(portNumber); sbpn = LTPDAworkbench.getWS_VarName(varID, sb, sbp); % replace the PORT_# string with the correct variable name repstr = strrep(repstr, pstr, char(sbpn)); end % If we modified the parameter value string, then we need to % remove the string quotes, and replace this in the string % representation of the plist (spl) if ~strcmp(repstr, pl.params(kk).getVal) repstr = strrep(repstr, '''', ''); spl = strrep(spl, ['''' pl.params(kk).getVal ''''], repstr); end % rebuild incmd incmd = '('; for ll=1:numel(varnames) incmd = [incmd varnames{ll} ',']; end incmd = strtrim(incmd); incmd = [incmd spl ')']; end end comment = ['% ' blockclass]; % We do something different if this is a modifier if block.isModifier mcmd = [cmd incmd ';' comment]; if outputs.size() > 1 error('Block %s is set as a modifier but has more than one output. This is not possible.', char(block.getName)); end cmds = [cmds {mcmd}]; for kk=1:numel(varnames) ecmd = [outvar '(' num2str(kk) ') = ' varnames{kk} ';']; cmds = [cmds {ecmd}]; end else cmds = [cmds {[outcmd cmd incmd ';' comment]}]; end % add command to set name of block if this is a constructor cat = char(block.getMinfo.getMcategory); if outputs.size() == 1 && strcmpi(cat, 'constructor') && (strcmpi(pl.find('name'), 'None') || isempty(pl.find('name'))) cmd = {[outvar '.setName(''' char(block.getName()) ''')']}; cmds = [cmds cmd]; end % add command to attach workbench if necessary if block.isAttachWorkbench % get the workbench in XML format if isa(wb, 'LTPDAworkbench') xmlout = char(wb.mp.workbenchAsXMLString); end for kk=1:outputs.size() outvar = LTPDAworkbench.getWS_VarName(varID, block, kk-1); bits = regexp(outvar, '\.', 'split'); if exist(outvar) > 1 && ~allAreVarNames(bits) error('The block named "%s" is not a valid variable name. \nPlease rename it.', outvar); end cmd = {[outvar '.setMdlfile(''' strrep(xmlout, '''', '''''') ''');']}; cmds = [cmds cmd]; end end end function res = allAreVarNames(cs) res = true; for jj=1:numel(cs) if ~isvarname(cs{jj}) res = false; break; end end end %-------------------------------------------------------------------------- % Parse a command from a MATfcn block % function cmds = parseMATfcn(cmds, block, varID) % build command cmd = char(block.getFcnName); % loop over inputs to make input vars inputs = block.getInputs(); incmd = '('; varnames = {}; % Loop over the inputs to get the variable names of the inputs for kk=0:inputs.size()-1 ip = inputs.get(kk); % get the block which is connected to this input srcblock = block.getSourceBlock(ip.getNumber); % get the port number at the source block srcportNumber = block.getSourceBlockPortNumber(ip.getNumber); if ~isempty(srcblock) varname = LTPDAworkbench.getWS_VarName(varID, srcblock, srcportNumber); varnames = [varnames {varname}]; incmd = [incmd varname ',']; end end if incmd(end)==',' incmd = incmd(1:end-1); end incmd = strtrim(incmd); incmd = [incmd ')']; % make output vars outputs = block.getOutputs(); if outputs.size() > 0 outcmd = '['; for kk=1:outputs.size() outvar = LTPDAworkbench.getWS_VarName(varID, block, kk-1); outcmd = [outcmd outvar ' ']; end outcmd = strtrim(outcmd); outcmd = [outcmd '] = ']; else outcmd = ''; end cmds = [cmds {[outcmd cmd incmd ';']}]; end