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.12 2000/09/14 08:07:00 peterg ## %% Reformated as an Octave function ## %% ## %% 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]); ## Extract directional information arrow_end_direction = [rbonds(:,7), rbonds(:,8)]; other_end_direction = [rbonds(:,9), rbonds(:,10)]; ## 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 bond_vector = arrow_end_direction(i,:); # Directional vector stroke_end_1 = arrow_end(i,:); else bond_vector = other_end_direction(i,:); # Directional vector stroke_end_1 = other_end(i,:); end; ## Work out the direction for the stroke (right angles to bond) unit_bond_vector = bond_vector./(length2d(bond_vector)*[1 1]); unit_stroke_vector = (rot*unit_bond_vector')'; sig = sign(unit_arrow_vector(i,:)*unit_stroke_vector'); stroke_end_2 = stroke_end_1 - stroke_length*sig*unit_stroke_vector; ## 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 bond_vector = arrow_end_direction(i,:); # Directional vector stroke_end_1 = arrow_end(i,:); else bond_vector = other_end_direction(i,:); # Directional vector stroke_end_1 = other_end(i,:); end; ## Work out the direction for the stroke (right angles to bond) unit_bond_vector = bond_vector./(length2d(bond_vector)*[1 1]); unit_stroke_vector = (rot*unit_bond_vector')'; sig = sign(unit_arrow_vector(i,:)*unit_stroke_vector'); stroke_end_2 = stroke_end_1 + stroke_length*sig*unit_stroke_vector; ## 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 endfunction