Speed up graph drawing (but still not as fast as in Scilab 4).
Jean-baptiste Silvy [Tue, 19 Aug 2008 08:18:45 +0000 (08:18 +0000)]
scilab/modules/metanet/demos/metro.sci
scilab/modules/metanet/macros/editor/ge_draw_edge.sci
scilab/modules/metanet/macros/editor/ge_draw_graph.sci
scilab/modules/metanet/macros/editor/ge_draw_node.sci
scilab/modules/metanet/macros/editor/ge_set_node_id.sci

index 1439427..d37d1ee 100644 (file)
@@ -239,7 +239,7 @@ function []=metro(demopath)
                 ' ' ;
                 'The number of changes is: '+string(EndChange);
                 string(changename);' '  ;
-                'You will go thru the following stations:';
+                'You will go through the following stations:';
                 string(routef);]);
       road=[];route=[];routef=[];changename=[];
       iter=x_choose(['yes','no'],'Another travel?');
index 8314a61..0891385 100644 (file)
@@ -12,16 +12,39 @@ function e=ge_draw_edge(n)
 
 //Construct the graphic object associated with a new edge, the first
   
-  arrowWidth=4;arrowLength=6; ArcDx=0.25;ArcDy=15;//a mettre en parametres
   Id=ge_get_edge_id(n)
+
+  // update default settings
+  a = gca();
+
+  // default settings for polylines and arcs
+  [edge_width,edge_color,style]=ge_get_edge_style(n)
+  if (edge_width <> a.thickness) then
+     a.thickness = edge_width;
+  end
+  if(edge_color <> a.foreground) then
+    a.foreground = edge_color;
+  end
+
+  // default settings for strings
+  font=ge_get_edge_font(n)
+  if (font(3) <> a.font_foreground) then
+     a.font_foreground = font(3);
+  end
+  if(font(2) <> a.font_style) then
+    a.font_style = font(2);
+  end
+  if(font(1) <> a.font_size) then
+    a.font_size = font(1);
+  end
+
   if GraphList.edges.tail(n)==GraphList.edges.head(n) then //loop arc
     
     // Draw the arc path
 
     [arc,xya,xyl,ang]=ge_profile2real(n)
     if size(arc,'*')==6 then
-      xarc(arc(1),arc(2),arc(3),arc(4),arc(5),arc(6));e1=gce(); 
-      e1.arc_drawing_method='lines"; //to make the drawin less slow
+      xarc(arc(1),arc(2),arc(3),arc(4),arc(5),arc(6));e1=gce();
     else
       xpoly(arc(:,1),arc(:,2));e1=gce();
     end
@@ -32,39 +55,28 @@ function e=ge_draw_edge(n)
     xpoly(xyc(:,1),xyc(:,2));e1=gce();
     
   end
-  [edge_width,edge_color,style]=ge_get_edge_style(n)
-  
-  //path properties
-  
-  e1.thickness=edge_width;
-  e1.foreground=edge_color;
 
   // Draw the arc arrow
   xpoly(xya(:,1),xya(:,2));e2=gce();
-  e2.thickness=edge_width;
-  e2.foreground=edge_color;
   if ~GraphList.directed then e2.visible='off',end
   
   // Draw the arc Id
-  
-  vis=Id<>[]
-  font=ge_get_edge_font(n)
-  if Id==[] then Id=' ',end
-  r = stringbox(Id, 0, 0, 0, font(2), font(1));
-  r = abs(r(1,3) - r(1,1));
-  if ang>90&ang<270 then //co negatif
+  if Id==[] then
+    Id='',
+    r = 0;
+  else
+    r = stringbox(Id, 0, 0, 0, font(2), font(1));
+    r = abs(r(1,3) - r(1,1));
+  end
+  if ang>90 & ang<270 then //co negatif
     a=ang*%pi/180
     xstring(xyl(1)+r*cos(a),xyl(2)-r*sin(a),Id,ang+180 );
   else
     xstring(xyl(1),xyl(2),Id,ang);
   end
-  e3=gce(); 
-  e3.font_foreground=font(3)
-  e3.font_style=font(2)
-  e3.font_size=font(1)
-
+  e3=gce();
   e3.user_data=r
-  if  ~vis then e3.visible='off';end
+  //if  ~vis then e3.visible='off';end
   
   //make a Compound with the arc elements
   e=glue([e1 e2 e3])
index 78d2dd0..3d87189 100644 (file)
@@ -19,10 +19,15 @@ function ge_draw_graph(GraphList)
   gindex=ge_axes_handle.user_data
   
   hnodes=[];
+  // all the constructed objects are filled
+  a = gca();
+  a.fill_mode = "on";
   for k=1:size(GraphList.nodes.graphics.x,'*'), 
     hnodes(k)=ge_draw_node(k); 
     //if modulo(k,40)==0 then drawnow();show_pixmap();drawlater(),end
   end
+  a.fill_mode = "off";
+
   hedges=[];
   for k=1:size(GraphList.edges.tail,'*'), 
     hedges(k)=ge_draw_edge(k),
index 34e1ada..9096394 100644 (file)
@@ -32,14 +32,10 @@ function e=ge_drawnode_0(n)
   node_border=ge_get_node_border(n)
   node_colors=ge_get_node_colors(n)
 
+  updateAxisForNode(node_border, node_colors(1), node_colors(2));
+
   xarc(node_x-node_diam/2,node_y+node_diam/2,node_diam,node_diam,0,360*64);
   e1=gce();
-  e1.thickness=node_border;
-  e1.fill_mode='on';
-  e1.foreground=node_colors(1);
-  e1.background=node_colors(2);
-  e1.arc_drawing_method='lines"; //to make the drawin less slow
-  
 
   // Node label
   font=ge_get_node_font(n)
@@ -65,24 +61,18 @@ function e=ge_drawnode_1(n)
   node_diam=ge_get_node_diam(n);
   node_border=ge_get_node_border(n)
   node_colors=ge_get_node_colors(n)
+
+  updateAxisForNode(node_border, node_colors(1), node_colors(2));
+  
   //circle
   xarc(node_x-node_diam/2,node_y+node_diam/2,node_diam,node_diam,0,360*64);
   e1=gce();
-  e1.thickness=node_border;
-  e1.fill_mode='on';
-  e1.foreground=node_colors(1);
-  e1.background=node_colors(2);
   
   //Big Arrow
   vx=[-1/2;-1/2;-3/4;-1;0;+1;+3/4;+1/2;+1/2;-1/2]
   vy=[1/2;3/2;1;1;5/2;1;1;3/2;1/2;1/2]-3;
   xpoly(node_x+vx*node_diam,node_y+vy*node_diam)
   e=gce();
-  e.thickness=node_border;
-  e.fill_mode='on';
-  e.foreground=node_colors(1);
-  e.background=node_colors(2);
-
   //make a Compound for node shape
   e1=glue([e1,e])
   
@@ -90,7 +80,6 @@ function e=ge_drawnode_1(n)
   font=ge_get_node_font(n)
   [Id,loc]=ge_get_node_id(n)
   e2=ge_set_node_id(Id,font,loc,node_x,node_y,node_diam,node_diam)
-  
   e=glue([e1,e2])
 endfunction
 
@@ -107,25 +96,19 @@ function e=ge_drawnode_2(n)
   node_diam=ge_get_node_diam(n);
   node_border=ge_get_node_border(n)
   node_colors=ge_get_node_colors(n)
+
+  updateAxisForNode(node_border, node_colors(1), node_colors(2));
+
   //circle
   xarc(node_x-node_diam/2,node_y+node_diam/2,node_diam,node_diam,0,360*64);
   e1=gce();
-  e1.thickness=node_border;
-  e1.fill_mode='on';
-  e1.foreground=node_colors(1);
-  e1.background=node_colors(2);
   //Big Arrow
   vx=[-1/2;-1/2;-3/4;-1;0;+1;+3/4;+1/2;+1/2;-1/2]
   vy=[1/2;3/2;1;1;5/2;1;1;3/2;1/2;1/2];
   xpoly(node_x+vx*node_diam,node_y+vy*node_diam)
   e=gce();
-  e.thickness=node_border;
-  e.fill_mode='on';
-  e.foreground=node_colors(1);
-  e.background=node_colors(2);
   //make a Compound for node shape
   e1=glue([e1,e])
-  
   // Node label
   font=ge_get_node_font(n)
   [Id,loc]=ge_get_node_id(n)
@@ -147,14 +130,11 @@ function e=ge_drawnode_3(n)
   node_diam=ge_get_node_diam(n);
   node_border=ge_get_node_border(n)
   node_colors=ge_get_node_colors(n)
+
+  updateAxisForNode(node_border, node_colors(1), node_colors(2));
+  
   xrect(node_x-node_diam/2,node_y+node_diam/2,node_diam,node_diam)
   e1=gce();
-  e1.thickness=node_border;
-  e1.fill_mode='on';
-  e1.foreground=node_colors(1);
-  e1.background=node_colors(2);
-
-
   
   // Node label
   font=ge_get_node_font(n)
@@ -164,4 +144,19 @@ function e=ge_drawnode_3(n)
   e=glue([e1,e2])
 endfunction
 
+function updateAxisForNode(thickness, foreground, background)
+
+  // modify axes default values if needed
+  a = gca();
+  if (thickness <> a.thickness) then
+     a.thickness = thickness;
+  end
+  if(foreground <> a.foreground) then
+    a.foreground = foreground;
+  end
+  if(background <> a.background) then
+    a.background = background;
+  end
+
+endfunction
 
index 91fb891..3395cef 100644 (file)
 function h=ge_set_node_id(Id,font,loc,node_x,node_y,node_w,node_h)
 //sets the string entity properties and compute its position
 //h : handle on the string entity
-  xstring(0,0,"");h=gce()
-  h.font_foreground=font(3)
-  h.font_style=font(2)
-  h.font_size=font(1)
-  if Id<>[] then 
-    r=xstringl(0,0,Id,h.font_style,font(1))
+  if (Id == []) then Id = ''; end
+
+  // modify default settings if needed
+  a = gca();
+  if (a.font_foreground <> font(3)) then
+    a.font_foreground = font(3)
+  end
+  if (a.font_style <> font(2)) then
+    a.font_style = font(2)
+  end
+  if (a.font_size <> font(1)) then
+    a.font_size = font(1)
+  end
+
+  xstring(0,0,Id);h=gce()
+  if Id<>'' then
+    r = stringbox(h);
+    width = abs(r(1,3) - r(1,1)) / 2;
+    height = abs(r(2,3) - r(2,1)) / 2;
     select loc
      case 'center'
-      h.data=[node_x-r(3)/2,node_y-r(4)/2]
+      h.data=[node_x-width,node_y-height]
      case 'right'
-      h.data=[node_x+node_w/2,node_y-r(4)/2]
+      h.data=[node_x+node_w/2,node_y-height]
      case 'left'
-      h.data=[node_x-node_w/2-r(3),node_y-r(4)/2]
+      h.data=[node_x-node_w/2- 2 * width,node_y-height]
      case 'up' 
-      h.data=[node_x-r(3)/2,node_y+node_h/2+r(4)/2]
+      h.data=[node_x-width,node_y+node_h/2+height]
      case 'down'
-      h.data=[node_x-r(3)/2,node_y-node_h/2-3*r(4)/2]
-    end            
-    h.text=Id
-    h.visible='on'
+      h.data=[node_x-width,node_y-node_h/2-3*height]
+    end
+    //h.visible='on'
   end
 endfunction