Index: mttroot/mtt/bin/trans/m/cbg2fig.m ================================================================== --- mttroot/mtt/bin/trans/m/cbg2fig.m +++ mttroot/mtt/bin/trans/m/cbg2fig.m @@ -1,314 +1,300 @@ function cbg2fig(system_name, ... system_type, full_name, ... stroke_length, stroke_thickness, stroke_colour, ... comp_font, comp_colour_u, comp_colour_o) -% cbg2fig - converts causal bg to figure -% -% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% %%%%% Model Transformation Tools %%%%% -% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Matlab function cbg_m2fig -% Causal bond graph: mfile format to fig file format -% The resultant fig file is the original _abg.fig with -% additional causal strokes superimposed. -% cbg2fig(system_name, ... -% system_type, full_name, ... -% stroke_length, stroke_thickness, stroke_colour, ... -% comp_font, comp_colour_u, comp_colour_o) - - -% P.J.Gawthrop May 1996 -% Copyright (c) P.J.Gawthrop, 1996. - -% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% %% Version control history -% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% %% $Id$ -% %% $Log$ -% %% Revision 1.10 1998/12/14 15:27:32 peterg -% %% Added separate handling of ports ( poss zero) -% %% -% %% Revision 1.9 1998/08/25 06:43:02 peterg -% %% Revised (partially) for data strucures - needs to include graphic info -% %% in abg file. -% %% -% %% Revision 1.8 1998/04/04 10:45:01 peterg -% %% Don't do strokes on port bonds -% %% -% %% Revision 1.7 1997/08/19 09:49:19 peterg -% %% Modified to take account of the expanded vector bonds. Only displays -% %% causality corresponding to the bond connecting the first element of -% %% the vector ports. -% %% -% %% Revision 1.6 1997/08/19 09:41:47 peterg -% %% Some debugging lines added. -% %% -% %% Revision 1.5 1997/05/16 07:33:45 peterg -% %% Now checks to see if sub system is a simple component before -% %% recursion. -% %% 0 --> zero -% %% 1 --> one -% %% -% %% Revision 1.4 1996/12/07 21:34:52 peterg -% %% Tests for null string with strcmp -% %% -% %% Revision 1.3 1996/08/08 15:52:28 peter -% %% Recursive version. -% %% Fails due to octave bug - reported. -% %% -% %% Revision 1.2 1996/08/05 20:15:39 peter -% %% Prepared for recursive version. -% %% -% %% Revision 1.1 1996/08/05 18:12:25 peter -% %% Initial revision -% %% -% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - -if nargin<4 - stroke_length = 20; -end; - -if nargin<5 - stroke_thickness = 2; -end; - -if nargin<6 - stroke_colour = 1; %Blue -end; - -if nargin<7 - comp_font = 18; %Helvetica bold -end; - -if nargin<8 - comp_colour_u = 12; %Green -end; - -if nargin<9 - comp_colour_o = 4; %Red -end; - -% Create a back slash '\' character. -bs = setstr(92); - -% Create the (full) system name -if strcmp(full_name,'') - full_name = system_name; - system_type = system_name; -else - full_name = [full_name, '_', system_name]; -end; - -full_name_type = [full_name, '_', system_type]; -% $$$ fig_name = [full_name_type, '_cbg.fig']; -fig_name = [full_name, '_cbg.fig'] - -% Return if initial fig file doesn't exist -if exist(fig_name)~=2 - return -end; - -% Setup file - append to the fig file -filenum = fopen(fig_name, 'a'); - -% Get the raw and the processed bonds -eval(['[rbonds,rstrokes,rcomponents] = ', system_type, '_rbg;']); -%eval(['[bonds,components,n_ports] = ', system_type, '_abg;']); -eval(["ABG = ", system_type, "_abg;"]); -bonds=ABG.bonds; - -% Original number of bonds -[n_bonds,junk] = size(rbonds); - -% Get the causal bonds -%eval(['[cbonds,status]=', full_name, '_cbg;']); -eval(["CBG = ", full_name, "_cbg;"]); -cbonds=CBG.bonds; - -% Check sizes -[Rows,Columns] = size(rcomponents); -if (Columns ~= 13) - error('Incorrect rcomponents matrix: must have 13 columns'); -end; -M_components = Columns; - -[N_components, Columns] = size(CBG.subsystemlist); - -if struct_contains(CBG,'portlist') - [N_ports, Columns] = size(CBG.portlist); -else - N_ports = 0; -end - - -% Rotation matrix -rot = [0 -1; 1 0]; - - -% Determine coordinates of the arrow end of the bond and the other end -% and other geometry -other_end_1 = rbonds(:,1:2); -arrow_end = rbonds(:,3:4); -other_end_2 = rbonds(:,5:6); - -distance_1 = length2d(other_end_1 - arrow_end); -distance_2 = length2d(other_end_2 - arrow_end); -which_end = (distance_1>distance_2)*[1 1]; -one = ones(size(which_end)); -other_end = which_end.*other_end_1 + (one-which_end).*other_end_2; -arrow_barb = which_end.*other_end_2 + (one-which_end).*other_end_1; -arrow_vector = arrow_barb-arrow_end; -unit_arrow_vector = arrow_vector./(length2d(arrow_vector)*[1 1]); -bond_vector = (arrow_end - other_end); -unit_bond_vector = bond_vector./(length2d(bond_vector)*[1 1]); -unit_stroke_vector = (rot*unit_bond_vector')'; - -% Get indices of bonds with changed causality -- but ignore the extra bonds -% due to vector bond expansion -changed_e = bonds(1:n_bonds,1)~=cbonds(1:n_bonds,1); -changed_f = bonds(1:n_bonds,2)~=cbonds(1:n_bonds,2); -changed = changed_e|changed_f; -% Don't do port bonds -#if n_ports>0 -# port_bonds = sort(abs(components(1:n_ports,1))); -# changed(port_bonds) = zeros(n_ports,1); -# changed_e(port_bonds) = zeros(n_ports,1); -# changed_f(port_bonds) = zeros(n_ports,1); -#end - -index_e = getindex(changed_e,1)' -index_f = getindex(changed_f,1)' -index_ef = getindex(changed,1)'; - -% Print the new strokes in fig format -if index_ef(1,1)>0 - for i = index_e % Do the effort stroke - opp. side to arrow - - if cbonds(i,1)==1 % Stroke at arrow end - stroke_end_1 = arrow_end(i,:); - else - stroke_end_1 = other_end(i,:); - end; - - sig = sign(unit_arrow_vector(i,:)*unit_stroke_vector(i,:)'); - stroke_end_2 = stroke_end_1 - stroke_length*sig*unit_stroke_vector(i,:); - - - %print the fig3 format firstline spec. - polyline = 2; - firstline = fig3(polyline,stroke_thickness,stroke_colour); - fprintf(filenum, '%s\n', firstline); - - fprintf(filenum, ' %4.0f %4.0f %4.0f %4.0f \n', ... - stroke_end_1(1), stroke_end_1(2), ... - stroke_end_2(1), stroke_end_2(2) ); - end; - - for i = index_f % Do the flow stroke - same side as arrow - - if cbonds(i,2)==1 % Stroke at arrow end - stroke_end_1 = arrow_end(i,:); - else - stroke_end_1 = other_end(i,:); - end; - - sig = sign(unit_arrow_vector(i,:)*unit_stroke_vector(i,:)'); - stroke_end_2 = stroke_end_1 + stroke_length*sig*unit_stroke_vector(i,:); - - - %print the fig3 format firstline spec. - polyline = 2; - firstline = fig3(polyline,stroke_thickness,stroke_colour); - fprintf(filenum, '%s\n', firstline); - - fprintf(filenum, ' %4.0f %4.0f %4.0f %4.0f \n', ... - stroke_end_1(1), stroke_end_1(2), ... - stroke_end_2(1), stroke_end_2(2) ); - end; -end; - -% Print all the components - coloured acording to causality. -for i = 1:N_ports+N_components - if i>N_ports # Subsystem - comp_name = CBG.subsystemlist(i-N_ports,:); - eval(["comp_status = CBG.subsystems.", comp_name, ".status;"]); - else - comp_name = CBG.portlist(i,:); - eval(["comp_status = CBG.ports.", comp_name, ".status;"]); - end - - - fig_params = rcomponents(i,3:M_components); - coords = rcomponents(i,1:2); - - if comp_status==-1 %Then under causal - fig_params(3) = comp_colour_u; - fig_params(6) = comp_font; - end; - - if comp_status==1 %Then over causal - fig_params(3) = comp_colour_o; - fig_params(6) = comp_font; - end; - - - %Now print the component in fig format - eval(['[comp_type,comp_name] = ', system_type, '_cmp(i)']); - - if index(comp_name,"mtt")==1 # Its a dummy name + + ## cbg2fig - converts causal bg to figure + ## + ## %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% Model + ## Transformation Tools %%%%% + ## %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ## + ## Matlab function cbg_m2fig Causal bond graph: mfile format to fig + ## file format The resultant fig file is the original _abg.fig with + ## additional causal strokes superimposed. cbg2fig(system_name, ... + ## system_type, full_name, ... stroke_length, stroke_thickness, + ## stroke_colour, ... comp_font, comp_colour_u, comp_colour_o) + + + ## P.J.Gawthrop May 1996 + ## Copyright (c) P.J.Gawthrop, 1996. + + ## %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ## %% Version control history + ## %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ## %% $Id$ + ## %% $Log$ + ## %% Revision 1.11 2000/01/18 14:52:02 peterg + ## %% Removed recursion --- maybe put back via a flag later + ## %% + ## %% Revision 1.10 1998/12/14 15:27:32 peterg + ## %% Added separate handling of ports ( poss zero) + ## %% + ## %% Revision 1.9 1998/08/25 06:43:02 peterg + ## %% Revised (partially) for data strucures - needs to include graphic info + ## %% in abg file. + ## %% + ## %% Revision 1.8 1998/04/04 10:45:01 peterg + ## %% Don't do strokes on port bonds + ## %% + ## %% Revision 1.7 1997/08/19 09:49:19 peterg + ## %% Modified to take account of the expanded vector bonds. Only displays + ## %% causality corresponding to the bond connecting the first element of + ## %% the vector ports. + ## %% + ## %% Revision 1.6 1997/08/19 09:41:47 peterg + ## %% Some debugging lines added. + ## %% + ## %% Revision 1.5 1997/05/16 07:33:45 peterg + ## %% Now checks to see if sub system is a simple component before + ## %% recursion. + ## %% 0 --> zero + ## %% 1 --> one + ## %% + ## %% Revision 1.4 1996/12/07 21:34:52 peterg + ## %% Tests for null string with strcmp + ## %% + ## %% Revision 1.3 1996/08/08 15:52:28 peter + ## %% Recursive version. + ## %% Fails due to octave bug - reported. + ## %% + ## %% Revision 1.2 1996/08/05 20:15:39 peter + ## %% Prepared for recursive version. + ## %% + ## %% Revision 1.1 1996/08/05 18:12:25 peter + ## %% Initial revision + ## %% + ## %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + if nargin<4 + stroke_length = 20; + end; + + if nargin<5 + stroke_thickness = 2; + end; + + if nargin<6 + stroke_colour = 1; %Blue + end; + + if nargin<7 + comp_font = 18; %Helvetica bold + end; + + if nargin<8 + comp_colour_u = 12; %Green + end; + + if nargin<9 + comp_colour_o = 4; %Red + end; + + ## Create a back slash '\' character. + bs = setstr(92); + + ## Create the (full) system name + if strcmp(full_name,'') + full_name = system_name; + system_type = system_name; + else + full_name = [full_name, '_', system_name]; + end; + + full_name_type = [full_name, '_', system_type]; + ## $$$ fig_name = [full_name_type, '_cbg.fig']; + fig_name = [full_name, '_cbg.fig'] + + ## Return if initial fig file doesn't exist + if exist(fig_name)~=2 + return + end; + + ## Setup file - append to the fig file + filenum = fopen(fig_name, 'a'); + + ## Get the raw and the processed bonds + eval(['[rbonds,rstrokes,rcomponents] = ', system_type, '_rbg;']); + %eval(['[bonds,components,n_ports] = ', system_type, '_abg;']); + eval(["ABG = ", system_type, "_abg;"]); + bonds=ABG.bonds; + + ## Original number of bonds + [n_bonds,junk] = size(rbonds); + + ## Get the causal bonds + %eval(['[cbonds,status]=', full_name, '_cbg;']); + eval(["CBG = ", full_name, "_cbg;"]); + cbonds=CBG.bonds; + + ## Check sizes + [Rows,Columns] = size(rcomponents); + if (Columns ~= 13) + error('Incorrect rcomponents matrix: must have 13 columns'); + end; + M_components = Columns; + + [N_components, Columns] = size(CBG.subsystemlist); + + if struct_contains(CBG,'portlist') + [N_ports, Columns] = size(CBG.portlist); + else + N_ports = 0; + end + + + ## Rotation matrix + rot = [0 -1; 1 0]; + + + ## Determine coordinates of the arrow end of the bond and the other end + ## and other geometry + other_end_1 = rbonds(:,1:2); + arrow_end = rbonds(:,3:4); + other_end_2 = rbonds(:,5:6); + + distance_1 = length2d(other_end_1 - arrow_end); + distance_2 = length2d(other_end_2 - arrow_end); + which_end = (distance_1>distance_2)*[1 1]; + one = ones(size(which_end)); + other_end = which_end.*other_end_1 + (one-which_end).*other_end_2; + arrow_barb = which_end.*other_end_2 + (one-which_end).*other_end_1; + arrow_vector = arrow_barb-arrow_end; + unit_arrow_vector = arrow_vector./(length2d(arrow_vector)*[1 1]); + bond_vector = (arrow_end - other_end); + unit_bond_vector = bond_vector./(length2d(bond_vector)*[1 1]); + unit_stroke_vector = (rot*unit_bond_vector')'; + + ## Get indices of bonds with changed causality -- but ignore the extra bonds + ## due to vector bond expansion + changed_e = bonds(1:n_bonds,1)~=cbonds(1:n_bonds,1); + changed_f = bonds(1:n_bonds,2)~=cbonds(1:n_bonds,2); + changed = changed_e|changed_f; + ## Don't do port bonds + #if n_ports>0 + # port_bonds = sort(abs(components(1:n_ports,1))); + # changed(port_bonds) = zeros(n_ports,1); + # changed_e(port_bonds) = zeros(n_ports,1); + # changed_f(port_bonds) = zeros(n_ports,1); + #end + + index_e = getindex(changed_e,1)' + index_f = getindex(changed_f,1)' + index_ef = getindex(changed,1)'; + + ## Print the new strokes in fig format + if index_ef(1,1)>0 + for i = index_e # Do the effort stroke - opp. side to arrow + + if cbonds(i,1)==1 # Stroke at arrow end + stroke_end_1 = arrow_end(i,:); + else + stroke_end_1 = other_end(i,:); + end; + + sig = sign(unit_arrow_vector(i,:)*unit_stroke_vector(i,:)'); + stroke_end_2 = stroke_end_1 - stroke_length*sig*unit_stroke_vector(i,:); + + + ## print the fig3 format firstline spec. + polyline = 2; + firstline = fig3(polyline,stroke_thickness,stroke_colour); + fprintf(filenum, '%s\n', firstline); + + fprintf(filenum, ' %4.0f %4.0f %4.0f %4.0f \n', ... + stroke_end_1(1), stroke_end_1(2), ... + stroke_end_2(1), stroke_end_2(2) ); + end; + + for i = index_f # Do the flow stroke - same side as arrow + + if cbonds(i,2)==1 # Stroke at arrow end + stroke_end_1 = arrow_end(i,:); + else + stroke_end_1 = other_end(i,:); + end; + + sig = sign(unit_arrow_vector(i,:)*unit_stroke_vector(i,:)'); + stroke_end_2 = stroke_end_1 + stroke_length*sig*unit_stroke_vector(i,:); + + + ## print the fig3 format firstline spec. + polyline = 2; + firstline = fig3(polyline,stroke_thickness,stroke_colour); + fprintf(filenum, '%s\n', firstline); + + fprintf(filenum, ' %4.0f %4.0f %4.0f %4.0f \n', ... + stroke_end_1(1), stroke_end_1(2), ... + stroke_end_2(1), stroke_end_2(2) ); + end; + end; + + ## Print all the components - coloured acording to causality. + for i = 1:N_ports+N_components + if i>N_ports # Subsystem + comp_name = CBG.subsystemlist(i-N_ports,:); + eval(["comp_status = CBG.subsystems.", comp_name, ".status;"]); + else + comp_name = CBG.portlist(i,:); + eval(["comp_status = CBG.ports.", comp_name, ".status;"]); + end + + + fig_params = rcomponents(i,3:M_components); + coords = rcomponents(i,1:2); + + if comp_status==-1 # Then under causal + fig_params(3) = comp_colour_u; + fig_params(6) = comp_font; + end; + + if comp_status==1 # Then over causal + fig_params(3) = comp_colour_o; + fig_params(6) = comp_font; + end; + + + ## Now print the component in fig format + eval(['[comp_type,comp_name] = ', system_type, '_cmp(i)']); + + if index(comp_name,"mtt")==1 # Its a dummy name typename = comp_type; # just show type else typename = [comp_type,":",comp_name]; endif; - Terminator = [bs, '001']; - for j = 1:length(fig_params) - fprintf(filenum, '%1.0f ', fig_params(j)); - end; - - - fprintf(filenum, '%1.0f %1.0f ', coords(1), coords(2)); - fprintf(filenum, '%s%s\n', typename, Terminator); - -# % If it's a subsystem (ie not a component), do the fig file for that as -# % well -# if comp_type=='0' -# comp_type='zero'; -# endif - -# if comp_type=='1' -# comp_type='one'; -# endif - - -# if (exist([comp_type,'_cause'])==0) -# cbg2fig(comp_name, ... -# comp_type, full_name, ... -# stroke_length, stroke_thickness, stroke_colour, ... -# comp_font, comp_colour_u, comp_colour_o); -# endif - -endfor - - - - -% Close the file -fclose(filenum); -return - - - - - - - - - - - - - - + Terminator = [bs, '001']; + for j = 1:length(fig_params) + fprintf(filenum, '%1.0f ', fig_params(j)); + end; + + + fprintf(filenum, '%1.0f %1.0f ', coords(1), coords(2)); + fprintf(filenum, '%s%s\n', typename, Terminator); + + # % If it's a subsystem (ie not a component), do the fig file for that as + # % well + # if comp_type=='0' + # comp_type='zero'; + # endif + + # if comp_type=='1' + # comp_type='one'; + # endif + + + # if (exist([comp_type,'_cause'])==0) + # cbg2fig(comp_name, ... + # comp_type, full_name, ... + # stroke_length, stroke_thickness, stroke_colour, ... + # comp_font, comp_colour_u, comp_colour_o); + # endif + + endfor + + ## Close the file + fclose(filenum); + return + +endfunction