$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: JakeVoytko_at_[hidden]
Date: 2008-01-20 23:40:07
Author: jakevoytko
Date: 2008-01-20 23:40:06 EST (Sun, 20 Jan 2008)
New Revision: 42888
URL: http://svn.boost.org/trac/boost/changeset/42888
Log:
Changes to svg that makes the interface more consistent. For example, 
add_g_element() and get_g_element(int) are now g() and g(int). The 
element placers in svg now return references to the base classes instead 
of to the svg instance. For example my_svg.circle(,,,) returns a 
reference to circle_element. Docs will be updated thusly.
Text files modified: 
   sandbox/SOC/2007/visualization/boost/svg_plot/detail/axis_plot_frame.hpp         |   234 ++++++++------                          
   sandbox/SOC/2007/visualization/boost/svg_plot/detail/numeric_limits_handling.hpp |     2                                         
   sandbox/SOC/2007/visualization/boost/svg_plot/detail/svg_tag.hpp                 |   619 ++++++++++++++++++++++----------------- 
   sandbox/SOC/2007/visualization/boost/svg_plot/stylesheet.hpp                     |     2                                         
   sandbox/SOC/2007/visualization/boost/svg_plot/svg.hpp                            |   206 +++++-------                            
   sandbox/SOC/2007/visualization/boost/svg_plot/svg_2d_plot.hpp                    |   156 ++++-----                               
   sandbox/SOC/2007/visualization/boost/svg_plot/svg_style.hpp                      |     2                                         
   7 files changed, 641 insertions(+), 580 deletions(-)
Modified: sandbox/SOC/2007/visualization/boost/svg_plot/detail/axis_plot_frame.hpp
==============================================================================
--- sandbox/SOC/2007/visualization/boost/svg_plot/detail/axis_plot_frame.hpp	(original)
+++ sandbox/SOC/2007/visualization/boost/svg_plot/detail/axis_plot_frame.hpp	2008-01-20 23:40:06 EST (Sun, 20 Jan 2008)
@@ -25,6 +25,26 @@
 {
   namespace svg
   {
+    //JV: G++ can't resolve names in these enums in axis_plot_frame
+    //    when they are in svg_2d_plot.hpp
+
+    static const double wh = 0.7; // font text width/height ratio.
+    // Even after reading http://www.w3.org/TR/SVG/fonts.html, unclear how to
+    // determine the exact width of digits, so an
+    // arbitrary average width height ratio wh = 0.7 is used as a good approximation.
+
+    static const double sin45 = 0.707; // Use if axis value labels are sloping.
+
+    // x_axis_position_ and y_axis_position_  use these.
+    enum x_axis_intersect {bottom = -1, x_intersects_y = 0, top = +1};
+    // bottom = X-axis free below bottom of end of Y-axis (case of all Y definitely < 0).
+    // top = X-axis free above top of X-axis (case of all Y definitely > 0).
+    // x_intersects_y when Y values include zero, so X intersects the Y axis.
+
+    enum y_axis_intersect {left = -1, y_intersects_x = 0, right = +1};
+    // left = Y-axis free to left of end of X-axis (case of all X definitely < 0).
+    // right = Y-axis free to left of end of X-axis (case of all X definitely > 0).
+    // y_intersects_x when X values include zero, so intersects the X axis.
 
     enum legend_places
     {  // Placing of legend box, if requested by legend_on(true).
@@ -322,7 +342,7 @@
               { // ! use_x_ticks_on_plot_window_ = Internal - value labels just below horizontal X-axis.
                 if ((derived().x_ticks_.ticks_on_plot_window_on_ != 0) || ((value != 0) && derived().x_axis_.axis_line_on_))
                 { // Avoid a "0" below the X-axis if it would be cut through by any internal vertical Y-axis line.
-                  derived().image.get_g_element(detail::PLOT_VALUE_LABELS).text(
+                  derived().image.g(detail::PLOT_VALUE_LABELS).text(
                     x, // to centre on tick
                     y,
                     label.str(),
@@ -354,23 +374,23 @@
                 xleft -= (std::max)(derived().y_ticks_.minor_tick_length_, derived().y_ticks_.major_tick_length_);
               }
               double y = derived().x_axis_.axis_; // y = 0, (provided y range includes zero).
-              derived().image.get_g_element(PLOT_X_AXIS).line(xleft, y, xright, y);
+              derived().image.g(PLOT_X_AXIS).line(xleft, y, xright, y);
               if (derived().x_ticks_.ticks_on_plot_window_on_ < 0) 
               { // Draw a vertical line holding the ticks on the top of plot window.
-                derived().image.get_g_element(PLOT_X_AXIS).line(xleft, derived().plot_bottom_, xright, derived().plot_bottom_);
+                derived().image.g(PLOT_X_AXIS).line(xleft, derived().plot_bottom_, xright, derived().plot_bottom_);
               }
               else if (derived().x_ticks_.ticks_on_plot_window_on_ > 0) 
               {// Draw a vertical line holding the ticks on the bottom of plot window.
-                derived().image.get_g_element(PLOT_X_AXIS).line(xleft, derived().plot_top_, xright, derived().plot_top_);
+                derived().image.g(PLOT_X_AXIS).line(xleft, derived().plot_top_, xright, derived().plot_top_);
               }
             }
             else if (derived().x_axis_position_ == top)
             {
-               derived().image.get_g_element(PLOT_X_AXIS).line(xleft, derived().plot_top_, xright, derived().plot_top_);
+               derived().image.g(PLOT_X_AXIS).line(xleft, derived().plot_top_, xright, derived().plot_top_);
             }
             else if (derived().x_axis_position_ == bottom)
             {
-               derived().image.get_g_element(PLOT_X_AXIS).line(xleft, derived().plot_bottom_, xright, derived().plot_bottom_);
+               derived().image.g(PLOT_X_AXIS).line(xleft, derived().plot_bottom_, xright, derived().plot_bottom_);
             }
             else
             { // warn that things have gone wrong?
@@ -378,10 +398,10 @@
           } // x_axis_.axis_line_on_
 
           // Access the paths for the ticks & grids, ready for additions.
-          path_element& minor_tick_path = derived().image.get_g_element(PLOT_X_MINOR_TICKS).path();
-          path_element& major_tick_path = derived().image.get_g_element(PLOT_X_MAJOR_TICKS).path();
-          path_element& minor_grid_path = derived().image.get_g_element(PLOT_X_MINOR_GRID).path();
-          path_element& major_grid_path = derived().image.get_g_element(PLOT_X_MAJOR_GRID).path();
+          path_element& minor_tick_path = derived().image.g(PLOT_X_MINOR_TICKS).path();
+          path_element& major_tick_path = derived().image.g(PLOT_X_MAJOR_TICKS).path();
+          path_element& minor_grid_path = derived().image.g(PLOT_X_MINOR_GRID).path();
+          path_element& major_grid_path = derived().image.g(PLOT_X_MAJOR_GRID).path();
 
           // x_minor_jump is the interval between minor ticks.
           double x_minor_jump = derived().x_ticks_.major_interval_ /
@@ -449,7 +469,7 @@
           double y;
           y = derived().title_info_.style().font_size() * derived().text_margin_; // Leave a linespace above.
           derived().title_info_.y(y);
-          derived().image.get_g_element(PLOT_TITLE).push_back(new text_element(derived().title_info_));
+          derived().image.g(PLOT_TITLE).push_back(new text_element(derived().title_info_));
         } // void draw_title()
 
         void size_legend_box()
@@ -490,7 +510,10 @@
             } // for
             std::cout.flags(std::ios_base::dec);
             // std::cout << "\nLongest legend header or data descriptor " << longest << " chars" << std::endl;
-            derived().legend_width_ = (1 + longest) * wh * font_size;
+            derived().legend_width_ = (1 + longest) 
+                                    * ::boost::svg::wh  
+                                    * font_size;
+                                    
             // Allow for a leading space, longest text
             // & trailing space before box margin.
             if (derived().legend_lines_)
@@ -618,7 +641,7 @@
               }
 
               // Draw border box round legend.
-              g_element* g_ptr = &(derived().image.get_g_element(PLOT_LEGEND_BACKGROUND));
+              g_element* g_ptr = &(derived().image.g(PLOT_LEGEND_BACKGROUND));
               g_ptr->push_back(new
                 rect_element(derived().legend_left_, derived().legend_top_, derived().legend_width_, derived().legend_height_));
             } // if legend_on_
@@ -642,7 +665,7 @@
             double legend_height = derived().legend_height_;
 
             // Draw border box round legend.
-            g_element* g_ptr = &(derived().image.get_g_element(PLOT_LEGEND_BACKGROUND));
+            g_element* g_ptr = &(derived().image.g(PLOT_LEGEND_BACKGROUND));
             g_ptr->push_back(new
               rect_element(legend_x_start, legend_y_start, legend_width, legend_height));
 
@@ -651,20 +674,20 @@
             { // Draw the legend header text for example: "My Plot Legend".
               derived().legend_header_.x(legend_x_start + legend_width / 2.); // / 2. to center in legend box.
               derived().legend_header_.y(legend_y_pos);
-              derived().image.get_g_element(PLOT_LEGEND_TEXT).push_back(new
+              derived().image.g(PLOT_LEGEND_TEXT).push_back(new
                 text_element(derived().legend_header_));
               legend_y_pos += 2 * spacing;
             }
 
-            g_ptr = &(derived().image.get_g_element(PLOT_LEGEND_POINTS));
+            g_ptr = &(derived().image.g(PLOT_LEGEND_POINTS));
             g_element* g_inner_ptr = g_ptr;
-            g_inner_ptr = &(derived().image.get_g_element(PLOT_LEGEND_TEXT));
+            g_inner_ptr = &(derived().image.g(PLOT_LEGEND_TEXT));
 
             for(unsigned int i = 0; i < derived().series.size(); ++i)
             { // Show point marker, text info and perhaps line for all the data series.
               double legend_x_pos = legend_x_start;
               legend_x_pos += spacing; // space before point marker.
-              g_inner_ptr = &(g_ptr->add_g_element());
+              g_inner_ptr = &(g_ptr->g());
               // Use both stroke & fill colors from the point's style.
               g_inner_ptr->style().stroke_color(derived().series[i].point_style_.stroke_color_);
               g_inner_ptr->style().fill_color(derived().series[i].point_style_.fill_color_);
@@ -686,7 +709,7 @@
                 g_inner_ptr->style() // Use stroke colors from line style.
                   .stroke_color(derived().series[i].line_style_.color_);
                // g_inner_ptr->style().width(4); // Use stroke colors from line style. 
-               // == image.get_g_element(PLOT_DATA_LINES).style().stroke_width(width);
+               // == image.g(PLOT_DATA_LINES).style().stroke_width(width);
                 // but this sets width for BOTH point and line :-(
                 g_inner_ptr->push_back(new line_element(
                   legend_x_pos + spacing /2., // half space leading space
@@ -697,7 +720,7 @@
               } // legend_lines_
 
               // Legend text for each Data Series added to the plot.
-              g_inner_ptr = &(derived().image.get_g_element(PLOT_LEGEND_TEXT));
+              g_inner_ptr = &(derived().image.g(PLOT_LEGEND_TEXT));
               g_inner_ptr->push_back(new text_element(
                 legend_x_pos, // allow space for the marker.
                 legend_y_pos,
@@ -711,7 +734,7 @@
           void draw_x_label()
           {
             // color is set in constructor.
-            //image.get_g_element(detail::PLOT_X_LABEL).style().stroke_color(black);
+            //image.g(detail::PLOT_X_LABEL).style().stroke_color(black);
             // and using x_label_color(color)
 
             std::string label = derived().x_label_info_.text(); // x_axis_ label, and optional units.
@@ -729,7 +752,7 @@
               y -= derived().image_border_.margin_; // Allow a margin.
               y -= derived().x_axis_label_style_.font_size() / 2; // Allow a half font too.
             }
-            derived().image.get_g_element(PLOT_X_LABEL).push_back(new text_element(
+            derived().image.g(PLOT_X_LABEL).push_back(new text_element(
               ( // x position relative to the x-axis which is middle of plot window.
               derived().plot_right_ + derived().plot_left_) / 2,  // x coordinate - middle.
               y, // Up from image bottom edge.
@@ -795,7 +818,7 @@
             switch(sty.shape_) // from enum point_shape none, round, square, point, egg
             {
             case round:
-              g_ptr.circle(x, y, half_size);
+              g_ptr.circle(x, y, (int)half_size);
               break;
             case square:
               g_ptr.rect(x - half_size, y - half_size, size, size);
@@ -905,51 +928,51 @@
 
           void clear_background()
           {
-            derived().image.get_g_element(PLOT_BACKGROUND).clear();
+            derived().image.g(PLOT_BACKGROUND).clear();
           }
 
           void clear_title()
           {
-            derived().image.get_g_element(PLOT_TITLE).clear();
+            derived().image.g(PLOT_TITLE).clear();
           }
 
           void clear_points()
           {
-            derived().image.get_g_element(PLOT_DATA_POINTS).clear();
+            derived().image.g(PLOT_DATA_POINTS).clear();
           }
 
           void clear_plot_background()
           {
-            derived().image.get_g_element(PLOT_WINDOW_BACKGROUND).clear();
+            derived().image.g(PLOT_WINDOW_BACKGROUND).clear();
           }
 
           void clear_legend()
           {
-            derived().image.get_g_element(PLOT_LEGEND_BACKGROUND).clear();
-            derived().image.get_g_element(PLOT_LEGEND_POINTS).clear();
-            derived().image.get_g_element(PLOT_LEGEND_TEXT).clear();
+            derived().image.g(PLOT_LEGEND_BACKGROUND).clear();
+            derived().image.g(PLOT_LEGEND_POINTS).clear();
+            derived().image.g(PLOT_LEGEND_TEXT).clear();
           }
 
           void clear_x_axis()
           {
-            derived().image.get_g_element(PLOT_X_AXIS).clear();
-            derived().image.get_g_element(PLOT_X_MINOR_TICKS).clear();
-            derived().image.get_g_element(PLOT_X_MAJOR_TICKS).clear();
-            derived().image.get_g_element(PLOT_X_LABEL).clear();
-            derived().image.get_g_element(PLOT_VALUE_LABELS).clear();
+            derived().image.g(PLOT_X_AXIS).clear();
+            derived().image.g(PLOT_X_MINOR_TICKS).clear();
+            derived().image.g(PLOT_X_MAJOR_TICKS).clear();
+            derived().image.g(PLOT_X_LABEL).clear();
+            derived().image.g(PLOT_VALUE_LABELS).clear();
           }
 
           void clear_y_axis()
           {
-            derived().image.get_g_element(PLOT_Y_AXIS).clear();
+            derived().image.g(PLOT_Y_AXIS).clear();
           }
 
           void clear_grids()
           {
-            derived().image.get_g_element(PLOT_X_MAJOR_GRID).clear();
-            derived().image.get_g_element(PLOT_X_MINOR_GRID).clear();
-            derived().image.get_g_element(PLOT_Y_MAJOR_GRID).clear();
-            derived().image.get_g_element(PLOT_Y_MINOR_GRID).clear();
+            derived().image.g(PLOT_X_MAJOR_GRID).clear();
+            derived().image.g(PLOT_X_MINOR_GRID).clear();
+            derived().image.g(PLOT_Y_MAJOR_GRID).clear();
+            derived().image.g(PLOT_Y_MINOR_GRID).clear();
           }
 
         private:
@@ -1137,29 +1160,29 @@
 
           svg_color background_color()
           {
-            return derived().image.get_g_element(PLOT_BACKGROUND).style().fill_color();
+            return derived().image.g(PLOT_BACKGROUND).style().fill_color();
           }
 
           Derived& background_border_color(const svg_color& col)
           {
-            derived().image.get_g_element(PLOT_BACKGROUND).style().stroke_color(col);
+            derived().image.g(PLOT_BACKGROUND).style().stroke_color(col);
             return derived();
           }
 
           svg_color background_border_color()
           {
-            return derived().image.get_g_element(PLOT_BACKGROUND).style().stroke_color();
+            return derived().image.g(PLOT_BACKGROUND).style().stroke_color();
           }
 
           Derived& background_border_width(double w)
           {
-            derived().image.get_g_element(PLOT_BACKGROUND).style().stroke_width(w);
+            derived().image.g(PLOT_BACKGROUND).style().stroke_width(w);
             return derived();
           }
 
           double background_border_width()
           {
-            return derived().image.get_g_element(PLOT_BACKGROUND).style().stroke_width();
+            return derived().image.g(PLOT_BACKGROUND).style().stroke_width();
           }
 
           Derived& description(const std::string d)
@@ -1494,7 +1517,7 @@
             derived().legend_on_ = cmd;
             if(cmd)
             {
-              derived().image.get_g_element(detail::PLOT_LEGEND_BACKGROUND)
+              derived().image.g(detail::PLOT_LEGEND_BACKGROUND)
                 .style().fill_color(white)
                 .stroke_color(black);
             }
@@ -1527,7 +1550,7 @@
 
             if(cmd)
             { // Set plot window
-              derived().image.get_g_element(detail::PLOT_WINDOW_BACKGROUND).style()
+              derived().image.g(detail::PLOT_WINDOW_BACKGROUND).style()
                 .fill_color(derived().plot_window_border_.fill_) // background color and
                 .stroke_color(derived().plot_window_border_.stroke_); // border color.
             }
@@ -1543,24 +1566,24 @@
           Derived& plot_border_color(const svg_color& col)
           {
             derived().plot_window_border_.stroke_ = col;
-            derived().image.get_g_element(detail::PLOT_WINDOW_BACKGROUND).style().stroke_color(col);
+            derived().image.g(detail::PLOT_WINDOW_BACKGROUND).style().stroke_color(col);
             return derived();
           }
 
           svg_color plot_border_color()
           { 
-            return derived().image.get_g_element(detail::PLOT_WINDOW_BACKGROUND).style().stroke_color();
+            return derived().image.g(detail::PLOT_WINDOW_BACKGROUND).style().stroke_color();
           }
 
           double plot_border_width()
           {
-            return derived().image.get_g_element(detail::PLOT_WINDOW_BACKGROUND).style().stroke_width();
+            return derived().image.g(detail::PLOT_WINDOW_BACKGROUND).style().stroke_width();
           }
 
           Derived& plot_border_width(double w)
           {
             derived().plot_window_border_.width_ = w;
-            derived().image.get_g_element(detail::PLOT_WINDOW_BACKGROUND).style().stroke_width(w);
+            derived().image.g(detail::PLOT_WINDOW_BACKGROUND).style().stroke_width(w);
             return derived();
           }
 
@@ -1736,26 +1759,26 @@
 
           Derived& x_axis_label_color(const svg_color& col)
           { // Set BOTH stroke and fill to the same color.
-            derived().image.get_g_element(detail::PLOT_X_LABEL).style().fill_color(col);
-            derived().image.get_g_element(detail::PLOT_X_LABEL).style().stroke_color(col);
+            derived().image.g(detail::PLOT_X_LABEL).style().fill_color(col);
+            derived().image.g(detail::PLOT_X_LABEL).style().stroke_color(col);
             return *this;
           }
 
           svg_color x_axis_label_color()
           { // But only return the stroke color.
-            return derived().image.get_g_element(detail::PLOT_X_LABEL).style().stroke_color();
+            return derived().image.g(detail::PLOT_X_LABEL).style().stroke_color();
           }
 
           Derived& x_axis_value_color(const svg_color& col)
           { // Set BOTH stroke and fill to the same color.
-            derived().image.get_g_element(detail::PLOT_VALUE_LABELS).style().fill_color(col);
-            derived().image.get_g_element(detail::PLOT_VALUE_LABELS).style().stroke_color(col);
+            derived().image.g(detail::PLOT_VALUE_LABELS).style().fill_color(col);
+            derived().image.g(detail::PLOT_VALUE_LABELS).style().stroke_color(col);
             return *this;
           }
 
           svg_color x_axis_value_color()
           { // But only return the stroke color.
-            return derived().image.get_g_element(detail::PLOT_VALUE_LABELS).style().stroke_color();
+            return derived().image.g(detail::PLOT_VALUE_LABELS).style().stroke_color();
           }
 
           Derived& x_ticks_on_plot_window_on(int cmd)
@@ -1874,90 +1897,90 @@
 
           Derived& title_color(const svg_color& col)
           {
-            derived().image.get_g_element(PLOT_TITLE).style().stroke_color(col);
-            derived().image.get_g_element(PLOT_TITLE).style().fill_color(col);
+            derived().image.g(PLOT_TITLE).style().stroke_color(col);
+            derived().image.g(PLOT_TITLE).style().fill_color(col);
             return derived();
           }
 
           svg_color title_color()
           { // Function title_color sets both fill and stroke,
             // but stroke (outside) is considered 'more important'.
-            return derived().image.get_g_element(PLOT_TITLE).style().stroke_color();
+            return derived().image.g(PLOT_TITLE).style().stroke_color();
           }
 
           Derived& title_font_width(double width)
           { // width of text is effectively the boldness.
             // Not useful with current browsers, setting this may cause lower quality graphic fonts
             // perhaps because the font is created using graphics rather than a built-in font.
-            derived().image.get_g_element(PLOT_TITLE).style().stroke_width(width); 
+            derived().image.g(PLOT_TITLE).style().stroke_width(width); 
             return derived();
           }
 
           double title_font_width()
           {
-            return derived().image.get_g_element(PLOT_TITLE).style().stroke_width();
+            return derived().image.g(PLOT_TITLE).style().stroke_width();
           }
 
           Derived& legend_color(const svg_color& col)
           {
-            derived().image.get_g_element(PLOT_LEGEND_TEXT).style().stroke_color(col);
+            derived().image.g(PLOT_LEGEND_TEXT).style().stroke_color(col);
             return derived();
           }
 
           svg_color legend_color()
           { // Function legend_color sets only stroke, assuming that 'filled' text is not being used.
             // (It produces much lower quality fonts on some browsers).
-            return derived().image.get_g_element(PLOT_LEGEND_TEXT).style().stroke_color();
+            return derived().image.g(PLOT_LEGEND_TEXT).style().stroke_color();
           }
 
           Derived& legend_font_width(double width)
           { // width of text is effectively the boldness.
-            derived().image.get_g_element(PLOT_LEGEND_TEXT).style().stroke_width(width);
+            derived().image.g(PLOT_LEGEND_TEXT).style().stroke_width(width);
             return derived();
           }
 
           double legend_font_width()
           { // Probably not useful at present (se above).
-            return derived().image.get_g_element(PLOT_LEGEND_TEXT).style().stroke_width();
+            return derived().image.g(PLOT_LEGEND_TEXT).style().stroke_width();
           }
 
           Derived& background_color(const svg_color& col)
           { // 
-            derived().image.get_g_element(PLOT_BACKGROUND).style().fill_color(col);
+            derived().image.g(PLOT_BACKGROUND).style().fill_color(col);
             return derived();
           }
 
           Derived& legend_background_color(const svg_color& col)
           {
-            derived().image.get_g_element(PLOT_LEGEND_BACKGROUND).style().fill_color(col);
+            derived().image.g(PLOT_LEGEND_BACKGROUND).style().fill_color(col);
             return derived();
           }
 
           svg_color legend_background_color()
           {
-            return derived().image.get_g_element(PLOT_LEGEND_BACKGROUND).style().fill_color();
+            return derived().image.g(PLOT_LEGEND_BACKGROUND).style().fill_color();
           }
 
           Derived& legend_border_color(const svg_color& col)
           {
-            derived().image.get_g_element(PLOT_LEGEND_BACKGROUND).style().stroke_color(col);
+            derived().image.g(PLOT_LEGEND_BACKGROUND).style().stroke_color(col);
             return derived();
           }
 
           svg_color legend_border_color()
           {
-            return derived().image.get_g_element(PLOT_LEGEND_BACKGROUND).style().stroke_color();
+            return derived().image.g(PLOT_LEGEND_BACKGROUND).style().stroke_color();
           }
 
           Derived& plot_background_color(const svg_color& col)
           {
-            derived().image.get_g_element(PLOT_WINDOW_BACKGROUND).style().fill_color(col);
+            derived().image.g(PLOT_WINDOW_BACKGROUND).style().fill_color(col);
             return derived();
           }
 
           svg_color plot_background_color()
           {
-            return derived().image.get_g_element(PLOT_WINDOW_BACKGROUND).style().fill_color();
+            return derived().image.g(PLOT_WINDOW_BACKGROUND).style().fill_color();
           }
 
           const std::string x_axis_position()
@@ -1977,149 +2000,148 @@
 
           Derived& x_axis_color(const svg_color& col)
           { // Note only stroke color is set.
-            derived().image.get_g_element(PLOT_X_AXIS).style().stroke_color(col);
+            derived().image.g(PLOT_X_AXIS).style().stroke_color(col);
             return derived();
           }
 
           svg_color x_axis_color()
           { 
-            return derived().image.get_g_element(PLOT_X_AXIS).style().stroke_color();
+            return derived().image.g(PLOT_X_AXIS).style().stroke_color();
           }
 
           Derived& y_axis_color(const svg_color& col)
           {
-            derived().image.get_g_element(PLOT_Y_AXIS).style().stroke_color(col);
+            derived().image.g(PLOT_Y_AXIS).style().stroke_color(col);
             return derived();
           }
 
           svg_color y_axis_color()
           {
-            return derived().image.get_g_element(PLOT_Y_AXIS).style().stroke_color();
+            return derived().image.g(PLOT_Y_AXIS).style().stroke_color();
           }
 
           Derived& x_label_color(const svg_color& col)
           { // add fill as well PAB Oct 07
-            derived().image.get_g_element(PLOT_X_LABEL).style().fill_color(col);
-            derived().image.get_g_element(PLOT_X_LABEL).style().stroke_color(col);
+            derived().image.g(PLOT_X_LABEL).style().fill_color(col);
+            derived().image.g(PLOT_X_LABEL).style().stroke_color(col);
             return derived();
           }
 
           Derived& x_label_width(double width)
           { // width of text is effectively the boldness.
-            x_label_width_ = width;
-            derived().image.get_g_element(PLOT_X_LABEL).style().stroke_width(width);
+            derived().image.g(PLOT_X_LABEL).style().stroke_width(width);
             return derived();
           }
 
           double x_label_width()
           {
             //return x_label_width_;
-            return derived().image.get_g_element(PLOT_X_LABEL).style().stroke_width();
+            return derived().image.g(PLOT_X_LABEL).style().stroke_width();
           }
 
           svg_color x_label_color()
           {
-            return derived().image.get_g_element(PLOT_X_LABEL).style().fill_color();
+            return derived().image.g(PLOT_X_LABEL).style().fill_color();
           }
 
           Derived& y_label_color(const svg_color& col)
           {
-            derived().image.get_g_element(PLOT_Y_LABEL).style().fill_color(col);
-            derived().image.get_g_element(PLOT_Y_LABEL).style().stroke_color(col);
+            derived().image.g(PLOT_Y_LABEL).style().fill_color(col);
+            derived().image.g(PLOT_Y_LABEL).style().stroke_color(col);
             return derived();
           }
 
           svg_color y_label_color()
           {
-            return derived().image.get_g_element(PLOT_Y_LABEL).style().fill_color();
+            return derived().image.g(PLOT_Y_LABEL).style().fill_color();
           }
 
           Derived& x_major_tick_color(const svg_color& col)
           {
-            derived().image.get_g_element(PLOT_X_MAJOR_TICKS).style().stroke_color(col);
+            derived().image.g(PLOT_X_MAJOR_TICKS).style().stroke_color(col);
             return derived();
           }
 
           svg_color x_major_tick_color()
           {
-            return derived().image.get_g_element(PLOT_X_MAJOR_TICKS).style().stroke_color();
+            return derived().image.g(PLOT_X_MAJOR_TICKS).style().stroke_color();
           }
 
           Derived& x_minor_tick_color(const svg_color& col)
           {
-            derived().image.get_g_element(PLOT_X_MINOR_TICKS).style().stroke_color(col);
+            derived().image.g(PLOT_X_MINOR_TICKS).style().stroke_color(col);
             return derived();
           }
 
           svg_color x_minor_tick_color()
           {
-            return derived().image.get_g_element(PLOT_X_MINOR_TICKS).style().stroke_color();
+            return derived().image.g(PLOT_X_MINOR_TICKS).style().stroke_color();
           }
 
           Derived& x_major_grid_color(const svg_color& col)
           {
-            derived().image.get_g_element(PLOT_X_MAJOR_GRID).style().stroke_color(col);
+            derived().image.g(PLOT_X_MAJOR_GRID).style().stroke_color(col);
             return derived();
           }
 
           svg_color x_major_grid_color()
           {
-            return derived().image.get_g_element(PLOT_X_MAJOR_GRID).style().stroke_color();
+            return derived().image.g(PLOT_X_MAJOR_GRID).style().stroke_color();
           }
 
           Derived& x_major_grid_width(double w)
           {
-            derived().image.get_g_element(PLOT_X_MAJOR_GRID).style().stroke_width(w);
+            derived().image.g(PLOT_X_MAJOR_GRID).style().stroke_width(w);
             return derived();
           }
 
           double x_major_grid_width()
           {
-            return derived().image.get_g_element(PLOT_X_MAJOR_GRID).style().stroke_width();
+            return derived().image.g(PLOT_X_MAJOR_GRID).style().stroke_width();
           }
 
           Derived& x_minor_grid_color(const svg_color& col)
           {
-            derived().image.get_g_element(PLOT_X_MINOR_GRID).style().stroke_color(col);
+            derived().image.g(PLOT_X_MINOR_GRID).style().stroke_color(col);
             return derived();
           }
 
           svg_color x_minor_grid_color()
           {
-            return derived().image.get_g_element(PLOT_X_MINOR_GRID).style().stroke_color();
+            return derived().image.g(PLOT_X_MINOR_GRID).style().stroke_color();
           }
 
           Derived& x_minor_grid_width(double w)
           {
-            derived().image.get_g_element(PLOT_X_MINOR_GRID).style().stroke_width(w);
+            derived().image.g(PLOT_X_MINOR_GRID).style().stroke_width(w);
             return derived();
           }
 
           double x_minor_grid_width()
           {
-            return derived().image.get_g_element(PLOT_X_MINOR_GRID).style().stroke_width();
+            return derived().image.g(PLOT_X_MINOR_GRID).style().stroke_width();
           }
 
           Derived& x_axis_width(double width)
           {
-            derived().image.get_g_element(PLOT_X_AXIS).style().stroke_width(width);
+            derived().image.g(PLOT_X_AXIS).style().stroke_width(width);
             return derived();
           }
 
           double x_axis_width()
           {
-            return derived().image.get_g_element(PLOT_X_AXIS).style().stroke_width();
+            return derived().image.g(PLOT_X_AXIS).style().stroke_width();
           }
 
           Derived& data_lines_width(double width)
           {
-            derived().image.get_g_element(PLOT_DATA_LINES).style().stroke_width(width);
+            derived().image.g(PLOT_DATA_LINES).style().stroke_width(width);
             return derived();
           }
 
           double data_lines_width()
           {
-            return derived().image.get_g_element(PLOT_DATA_LINES).style().stroke_width();
+            return derived().image.g(PLOT_DATA_LINES).style().stroke_width();
           }
 
           Derived& x_label(const std::string& str)
@@ -2192,13 +2214,13 @@
           Derived& x_major_tick_width(double width)
           {
             derived().x_ticks_.major_tick_width_ = width; // Redundant?
-            derived().image.get_g_element(PLOT_X_MAJOR_TICKS).style().stroke_width(width);
+            derived().image.g(PLOT_X_MAJOR_TICKS).style().stroke_width(width);
             return derived();
           }
 
           double x_major_tick_width()
           {
-            return derived().image.get_g_element(PLOT_X_MAJOR_TICKS).style().stroke_width();
+            return derived().image.g(PLOT_X_MAJOR_TICKS).style().stroke_width();
           }
 
           Derived& x_minor_tick_length(double length)
@@ -2215,14 +2237,14 @@
           Derived& x_minor_tick_width(double width)
           {
             derived().x_ticks_.minor_tick_width_ = width;
-            derived().image.get_g_element(PLOT_X_MINOR_TICKS).style().stroke_width(width);
+            derived().image.g(PLOT_X_MINOR_TICKS).style().stroke_width(width);
             return derived();
           }
 
           double x_minor_tick_width()
           {
             // return derived().x_minor_tick_width_; // should be the same but store in stroke_width is definitive.
-            return derived().image.get_g_element(PLOT_X_MINOR_TICKS).style().stroke_width();
+            return derived().image.g(PLOT_X_MINOR_TICKS).style().stroke_width();
           }
 
           Derived& x_major_tick(double d)
Modified: sandbox/SOC/2007/visualization/boost/svg_plot/detail/numeric_limits_handling.hpp
==============================================================================
--- sandbox/SOC/2007/visualization/boost/svg_plot/detail/numeric_limits_handling.hpp	(original)
+++ sandbox/SOC/2007/visualization/boost/svg_plot/detail/numeric_limits_handling.hpp	2008-01-20 23:40:06 EST (Sun, 20 Jan 2008)
@@ -12,7 +12,7 @@
 #ifndef BOOST_SVG_NUMERIC_LIMITS_HANDLING_DETAIL_HPP
 #define BOOST_SVG_NUMERIC_LIMITS_HANDLING_DETAIL_HPP
 
-#include <boost\math\special_functions\fpclassify.hpp>
+#include <boost/math/special_functions/fpclassify.hpp>
 
 // TODO use the boost version instead to be more portable?
 // Since only double is used, template versions are not needed,
Modified: sandbox/SOC/2007/visualization/boost/svg_plot/detail/svg_tag.hpp
==============================================================================
--- sandbox/SOC/2007/visualization/boost/svg_plot/detail/svg_tag.hpp	(original)
+++ sandbox/SOC/2007/visualization/boost/svg_plot/detail/svg_tag.hpp	2008-01-20 23:40:06 EST (Sun, 20 Jan 2008)
@@ -12,9 +12,10 @@
 #ifndef BOOST_SVG_TAG_HPP
 #define BOOST_SVG_TAG_HPP
 
-// -------------------------------------------------------------------------------
-// This file svg_tag.hpp defines all classes that can occur in the SVG parse tree.
-// -------------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+// This file svg_tag.hpp defines all classes that can occur in the 
+// SVG parse tree.
+// -----------------------------------------------------------------------------
 
 #include <boost/ptr_container/ptr_container.hpp>
 // using boost::vec_ptr;
@@ -22,6 +23,7 @@
 // using boost::array;
 
 #include "../svg_style.hpp"
+#include "svg_style_detail.hpp"
 
 #include <ostream>
 // using std::ostream;
@@ -67,38 +69,62 @@
   // for grouping together related graphics elements, for example:
   // <g stroke="rgb(255,0,0)" <rect x="0" y="0"  width="500"  height="600"/> </g>
 
-  // -----------------------------------------------------------------------------
+  // --------------------------------------------------------------------------
   // svg_element is base class for all the leaf elements:
   // rect_element, circle_element, line_element, text_element,
-  // polygon_element, polyline_element, path_element, clip_path_element, g_element
+  // polygon_element, polyline_element, path_element, clip_path_element, 
+  // g_element
+  //
   // g_element ('g' element is a container element
   // for grouping together related graphics elements).
   // http://www.w3.org/TR/SVG/struct.html#NewDocument 5.2.1 Overview
-  // -----------------------------------------------------------------------------
+  // --------------------------------------------------------------------------
 
   class svg_element
   { // Base class 
   protected:
-    svg_style style_info; // fill, stroke, width, get by function style().
-    std::string id_name; // set & get by function id.
-    std::string clip_name; // set & get by function clip_id.
+    svg_style style_info_; // fill, stroke, width, get by function style.
+    std::string id_name_; // set & get by function id.
+    std::string class_name_; // set & get by class id.
+    std::string clip_name_; // set & get by function clip_id.
 
     void write_attributes(std::ostream& s_out)
     { // group_element id and clip-path.
-      if(id_name.size() != 0)
+      if(id_name_.size() != 0)
       { // Example: id="imageBackground"
-        s_out << " id=\"" << id_name << "\""; // Prefix with space.
+        s_out << " id=\"" << id_name_ << "\""; // Prefix with space.
       }
-      if(clip_name.size() != 0)
+      if(class_name_.size() != 0)
+      {
+        s_out << " class=\"" << class_name_ << "\"";
+      }
+      if(clip_name_.size() != 0)
       { // Example: clip-path="url(#plot_window)" 
-        s_out << " clip-path=\"url(#" << clip_name << ")\""; // Prefix with space.
+        s_out << " clip-path=\"url(#" << clip_name_ << ")\""; // Prefix with space.
       }
       // Inherited classes add other references, 5.3.1, like color, fill, stroke, gradients...
       // Example id: <g id="yMinorGrid" ></g>
+      // Example class: <g class="grid_style"></g>
       // Example URI: fill="url(#Gradient01) // local URL
     } // void write_attributes(std::ostream& s_out)
 
   public:
+
+    svg_element(const svg_style& style_info, 
+                const std::string& id_name = "",
+                const std::string& class_name = "",
+                const std::string& clip_name = "")
+                :style_info_(style_info),
+                id_name_(id_name),
+                class_name_(class_name),
+                clip_name_(clip_name)
+    {
+    }
+
+    svg_element()
+    {
+    }
+
     virtual void write(std::ostream& rhs) = 0;
     virtual ~svg_element()
     {
@@ -106,18 +132,18 @@
 
     bool operator==(const svg_element& lhs)
     { // might be useful for Boost.Test.
-      return lhs.id_name == id_name;
+      return lhs.id_name_ == id_name_;
     }
 
     // Set and get member functions.
     svg_style& style()
     {
-      return style_info;
+      return style_info_;
     }
 
     const svg_style& style() const
     { // const version.
-      return style_info;
+      return style_info_;
     }
 
     void id(const std::string& id)
@@ -135,23 +161,36 @@
       // A group of elements, as well as individual objects,
       // can be given a name using the id attribute.
       // Named groups are needed for several purposes such as animation and re-usable objects.
-      id_name = id;
+      id_name_ = id;
       // Example: id="plotBackground"
     }
 
     std::string id()
     { // Unique name for an element.
-      return id_name;
+      return id_name_;
+    }
+
+    void class_id(const std::string& class_id)
+    { // Non-unique identifier for an element.
+      // http://www.w3.org/TR/2001/REC-SVG-20010904/styling.html#ClassAttribute
+      // 6.12 Attributes common to all elements: id and xml:base
+      // Example: class="info"
+      class_name_ = class_id;
+    }
+
+    std::string class_id()
+    { // Unique name for an element.
+      return class_name_;
     }
 
     void clip_id(const std::string& id)
     { // Named clip, for example: g_ptr.clip_id(plot_window_clip_);
-      clip_name = id;
+      clip_name_ = id;
     }
 
     std::string clip_id()
     {
-      return clip_name;
+      return clip_name_;
     }
   }; // class svg_element
 
@@ -165,21 +204,32 @@
   class line_element: public svg_element
   {
   private:
-    double x1; // Line from (x1, x2) to (y1, y2)
-    double x2;
-    double y1;
-    double y2;
+    double x1_; // Line from (x1_, x2_) to (y1_, y2_)
+    double x2_;
+    double y1_;
+    double y2_;
 
   public:
     line_element(double x1, double y1, double x2,  double y2)
-      :   x1(x1), y1(y1),  x2(x2), y2(y2)
+      :   x1_(x1), y1_(y1),  x2_(x2), y2_(y2)
+    {
+    }
+
+    line_element(double x1, double y1,
+                 double x2, double y2, 
+                 const svg_style& style_info, 
+                 const std::string& id_name="", 
+                 const std::string& class_name="",
+                 const std::string& clip_name = "") 
+                : x1_(x1), y1_(y1), x2_(x2), y2_(y2),
+                  svg_element(style_info, id_name, class_name, clip_name)
     {
     }
 
     void write(std::ostream& rhs)
     {
-      rhs << "<line x1=\"" << x1 << "\" y1=\"" << y1
-          << "\" x2=\"" << x2 << "\" y2=\"" << y2 << "\"/>";
+      rhs << "<line x1=\"" << x1_ << "\" y1=\"" << y1_
+          << "\" x2=\"" << x2_ << "\" y2=\"" << y2_ << "\"/>";
       // Example: <line x1="5" y1="185" x2="340" y2="185"/>
     }
   }; // class line_element
@@ -206,6 +256,16 @@
     { // Constructor defines all private data (no defaults).
     }
 
+    rect_element(double x, double y, double w, double h,
+                 const svg_style& style_info,
+                 const std::string& id_name,
+                 const std::string& class_name,
+                 const std::string& clip_name)
+      : x_(x), y_(y), width_(w), height_(h),
+        svg_element(style_info, id_name, class_name, clip_name)
+    { // Constructor defines all private data (no defaults).
+    }
+    
     double x() const
     {
       return x_;
@@ -281,6 +341,17 @@
     { // Define all private data.
     }
 
+    circle_element(double x, double y, double radius,
+                 const svg_style& style_info,
+                 const std::string& id_name="",
+                 const std::string& class_name="",
+                 const std::string& clip_name=""
+                 )
+      : x(x), y(y), radius(radius),
+        svg_element(style_info, id_name, class_name, clip_name)
+    { // Define all private data.
+    }
+
     void write(std::ostream& rhs)
     {
       rhs << "<circle";
@@ -308,6 +379,26 @@
     { // Define all private data.
     }
 
+    ellipse_element(double cx, double cy, double rx,  double ry,
+                 const svg_style& style_info,
+                 const std::string& id_name="",
+                 const std::string& class_name="",
+                 const std::string& clip_name="")
+      : cx(cx), cy(cy), rx(rx), ry(ry), 
+        svg_element(style_info, id_name, class_name, clip_name)
+    { // Define all private data.
+    }
+
+    ellipse_element(double cx, double cy,
+                 const svg_style& style_info,
+                 const std::string& id_name="",
+                 const std::string& class_name="",
+                 const std::string& clip_name="")
+      : cx(cx), cy(cy), rx(4), ry(8), // 4 and 8 are the same defaults used above
+        svg_element(style_info, id_name, class_name, clip_name)
+    { // Define all private data.
+    }
+
     void write(std::ostream& rhs)
     {
       rhs << "<ellipse";
@@ -326,196 +417,182 @@
     left_align, right_align, center_align
   };
 
-  //enum rotate_style defined in svg_style.
-  //{ // Rotation in degrees from horizontal.
-  //  horizontal = 0, // normal left to right.
-  //  uphill = -45, // slope up.
-  //  upward = -90, // vertical writing up.
-  //  backup = -135, // slope up backwards.
-  //  downhill = 45, // slope down.
-  //  downward = 90,  // vertical writing down.
-  //  backdown = 135, // slope down backwards.
-  //  upsidedown = 180 // == -180
-  //};
-
-  class text_element: public svg_element
-  { // Holds text with position, size, font, (& styles) & orientation.
-    // Not necessarily shown correctly by all browsers, alas.
-   private: // Access only via member functions below.
-    // SVG Coordinates of 1st character EM box, see
-    // http://www.w3.org/TR/SVG/text.html#TextElement 10.2
-    // So any text with y coordinate = 0  shows only any roman lower case descenders!
-    double x_; // Left edge.
-    double y_; // Bottom of roman capital character.
-    std::string text_; // Actual text to display.
-    text_style style_; // font variants.
-    align_style align_; // left_align, right_align, center_align
-    rotate_style rotate_; // horizontal, upward, downward, upsidedown
-
-    // (Text may contain embedded xml Unicode characters
-    // for Greek, math etc, for example: Ω).
-    //int size; // " font-size = 12"
-    //// http://www.w3.org/TR/SVG/text.html#CharactersAndGlyphs
-    //std::string font;  // font-family: "Arial" | "Times New Roman" | "Verdana" | "Lucida Sans Unicode"
-    //// "sans", "serif", "times"
-    //// http://www.w3.org/TR/SVG/text.html#FontFamilyProperty
-    //// 10.10 Font selection properties
-    //std::string style_; // font-style: normal | bold | italic | oblique
-    //std::string weight; // font-weight: normal | bold | bolder | lighter | 100 | 200 .. 900
-    //std::string stretch; // font-stretch: normal | wider | narrower ...
-    //std::string decoration; // // "underline" | "overline" | "line-through"
-    //// Example:
-    //// <text x="250" y="219.5" text-anchor="middle"  font-family="verdana" font-size="12">0 </text>
 
-  public:
-    // Set and get member functions.
+class text_element: public svg_element
+{ // Holds text with position, size, font, (& styles) & orientation.
+  // Not necessarily shown correctly by all browsers, alas.
+ private: // Access only via member functions below.
+  // SVG Coordinates of 1st character EM box, see
+  // http://www.w3.org/TR/SVG/text.html#TextElement 10.2
+  // So any text with y coordinate = 0  shows only any roman lower case descenders!
+  double x_; // Left edge.
+  double y_; // Bottom of roman capital character.
+  std::string text_; // Actual text to display.
+  text_style style_; // font variants.
+  align_style align_; // left_align, right_align, center_align
+  rotate_style rotate_; // horizontal, upward, downward, upsidedown
+
+  // (Text may contain embedded xml Unicode characters
+  // for Greek, math etc, for example: Ω).
+  //int size; // " font-size = 12"
+  // http://www.w3.org/TR/SVG/text.html#CharactersAndGlyphs
+  //std::string font;  // font-family: "Arial" | "Times New Roman" | "Verdana" | "Lucida Sans Unicode"
+  // "sans", "serif", "times"
+  // http://www.w3.org/TR/SVG/text.html#FontFamilyProperty
+  // 10.10 Font selection properties
+  //std::string style_; // font-style: normal | bold | italic | oblique
+  //std::string weight; // font-weight: normal | bold | bolder | lighter | 100 | 200 .. 900
+  //std::string stretch; // font-stretch: normal | wider | narrower ...
+  //std::string decoration; // // "underline" | "overline" | "line-through"
+  // Example:
+  // <text x="250" y="219.5" text-anchor="middle"  font-family="verdana" font-size="12">0 </text>
+
+public:
+
+  text_style& style()
+  { // Access to font family, size ...
+    return style_;
+  }
 
-    text_style& style()
-    { // Access to font family, size ...
-      return style_;
-    }
+  const text_style& style() const
+  {
+    return style_;
+  }
 
-    const text_style& style() const
-    {
-      return style_;
-    }
+  void alignment(align_style a)
+  { // left_align, right_align, center_align
+    align_ = a;
+  }
 
-    void alignment(align_style a)
-    { // left_align, right_align, center_align
-      align_ = a;
-    }
+  align_style alignment()
+  { // left_align, right_align, center_align
+    return align_;
+  }
 
-    align_style alignment()
-    { // left_align, right_align, center_align
-      return align_;
-    }
+  void rotation(rotate_style rot)
+  { // Degrees: horizontal  = 0, upward = -90, downward, upsidedown
+    rotate_ = rot;
+  }
 
-    void rotation(rotate_style rot)
-    { // Degrees: horizontal  = 0, upward = -90, downward, upsidedown
-      rotate_ = rot;
-    }
+  rotate_style rotation() const
+  {
+    return rotate_;
+  }
 
-    rotate_style rotation() const
-    {
-      return rotate_;
-    }
+  void x(double x)
+  { // x coordinate of text to write.
+    x_ = x;
+  }
 
-    void x(double x)
-    { // x coordinate of text to write.
-      x_ = x;
-    }
+  double x() const
+  { // x coordinate of text to write.
+    return x_;
+  }
 
-    double x() const
-    { // x coordinate of text to write.
-      return x_;
-    }
+  void y(double y)
+  { // y coordinate of text to write.
+    y_ = y;
+  }
 
-    void y(double y)
-    { // y coordinate of text to write.
-      y_ = y;
-    }
+  double y() const
+  { // y coordinate of text to write.
+    return y_;
+  }
 
-    double y() const
-    { // y coordinate of text to write.
-      return y_;
-    }
+  void text(const std::string& t)
+  { // text to write.
+    text_ = t;
+  }
 
-    void text(const std::string& t)
-    { // text to write.
-      text_ = t;
-    }
-
-    const std::string& text()
-    {
-      return text_;
-    }
-
-    text_element(
-      // Coordinates of 1st character EM box, see
-      // http://www.w3.org/TR/SVG/text.html#TextElement 10.2
-      double x = 0., // Left edge.
-      double y = 0., // Bottom of character (roman capital).
-      // So any text with y coordinate = 0  shows only the roman lower case descenders!
-      const std::string text = "",
-      text_style ts = no_style, // Left to SVG defaults.
-      align_style align = left_align,
-      rotate_style rotate = horizontal)
-      : // Constructor.
-      x_(x), y_(y), // location.
-      text_(text),
-      //size(size), font(font), style_(style), weight(weight), stretch(stretch), decoration(decoration),
-      style_(ts),
-      align_(align),
-      rotate_(rotate)
-    { // text_element default constructor, defines defaults for all private members.
-    }
+  const std::string& text()
+  {
+    return text_;
+  }
 
-    void write(std::ostream& os)
-    { // text_element, style & attributes to stream.
-      // Changed to new convention on spaces:
-      // NO trailing space, but *start* each item with a space.
-      // For debug, may be convenient to start with newline.
-      // os << " <text x=\"" << x_ << "\" y=\"" << y_ << "\"";
-      os << "\n<text x=\"" << x_ << "\" y=\"" << y_ << "\"";
-      std::string anchor;
-      switch(align_)
-      {
-      case left_align:
-        // anchor = "start"; // This is the initial == default.
-        // so should be possible to reduce file size this by:
-        anchor = "";
-        break;
-      case right_align:
-        anchor = "end";
-        break;
-      case center_align:
-        anchor = "middle";
-        break;
-      default:
-        anchor = "";
-        break;
-      }
-      if(anchor != "")
-      {
-        os << " text-anchor=\"" << anchor << "\"";
-      }
-      if(rotate_ != 0)
-      {
-        os << " transform = \"rotate("
-          << rotate_ << " "
-          << x_ << " "
-          << y_ << " )\"";
-      }
-      if (style_.font_size() != 0)
-      {
-        os << " font-size=\"" << style_.font_size() << "\"";
-      }
-      if (style_.font_family() != "")
-      { // Example: Arial.
-        os << " font-family=\"" << style_.font_family() << "\"";
-      }
-      if (style_.font_style().size() != 0)
-      { // Example: italic.
-        os << " font-style=\"" << style_.font_style() << "\"";
-      }
-      if (style_.font_weight().size() != 0)
-      { // Example: bold.
-      os << " font-weight=\"" << style_.font_weight() << "\"";
-      }
-      if (style_.font_stretch().size() != 0)
-      {
-      os << " font-stretch=\"" << style_.font_stretch() << "\"";
-      }
-      if (style_.font_decoration().size() != 0)
-      {
-      os << " font-decoration=\"" << style_.font_decoration() << "\"";
-      }
-      os << '>' << text_ << "</text>";
-      // Example: 
-    } // void write(std::ostream& os)
+  text_element(
+    // Coordinates of 1st character EM box, see
+    // http://www.w3.org/TR/SVG/text.html#TextElement 10.2
+    double x = 0., // Left edge.
+    double y = 0., // Bottom of character (roman capital).
+    // So any text with y coordinate = 0  shows only the roman lower case descenders!
+    const std::string text = "",
+    text_style ts = no_style, // Left to SVG defaults.
+    align_style align = left_align,
+    rotate_style rotate = horizontal)
+    : // Constructor.
+    x_(x), y_(y), // location.
+    text_(text),
+    //size(size), font(font), style_(style), weight(weight), stretch(stretch), decoration(decoration),
+    style_(ts),
+    align_(align),
+    rotate_(rotate)
+  { // text_element default constructor, defines defaults for all private members.
+  }
 
-    
-  }; // class text_element
+  void write(std::ostream& os)
+  { // text_element, style & attributes to stream.
+    // Changed to new convention on spaces:
+    // NO trailing space, but *start* each item with a space.
+    // For debug, may be convenient to start with newline.
+    // os << " <text x=\"" << x_ << "\" y=\"" << y_ << "\"";
+    os << "\n<text x=\"" << x_ << "\" y=\"" << y_ << "\"";
+    std::string anchor;
+    switch(align_)
+    {
+    case left_align:
+      // anchor = "start"; // This is the initial == default.
+      // so should be possible to reduce file size this by:
+      anchor = "";
+      break;
+    case right_align:
+      anchor = "end";
+      break;
+    case center_align:
+      anchor = "middle";
+      break;
+    default:
+      anchor = "";
+      break;
+    }
+    if(anchor != "")
+    {
+      os << " text-anchor=\"" << anchor << "\"";
+    }
+    if(rotate_ != 0)
+    {
+      os << " transform = \"rotate("
+        << rotate_ << " "
+        << x_ << " "
+        << y_ << " )\"";
+    }
+    if (style_.font_size() != 0)
+    {
+      os << " font-size=\"" << style_.font_size() << "\"";
+    }
+    if (style_.font_family() != "")
+    { // Example: Arial.
+      os << " font-family=\"" << style_.font_family() << "\"";
+    }
+    if (style_.font_style().size() != 0)
+    { // Example: italic.
+      os << " font-style=\"" << style_.font_style() << "\"";
+    }
+    if (style_.font_weight().size() != 0)
+    { // Example: bold.
+    os << " font-weight=\"" << style_.font_weight() << "\"";
+    }
+    if (style_.font_stretch().size() != 0)
+    {
+    os << " font-stretch=\"" << style_.font_stretch() << "\"";
+    }
+    if (style_.font_decoration().size() != 0)
+    {
+    os << " font-decoration=\"" << style_.font_decoration() << "\"";
+    }
+    os << '>' << text_ << "</text>";
+    // Example:
+  } // void write(std::ostream& os)
+}; // class text_element_
 
   std::ostream& operator<< (std::ostream& os, text_element& t)
   {  //
@@ -528,7 +605,6 @@
     return os;
   } // std::ostream& operator<<
 
-
   class clip_path_element: public svg_element
   { // The clipping path restricts the region to which paint can be applied.
     // 14.3 Clipping paths http://www.w3.org/TR/SVG/masking.html#ClipPathProperty
@@ -842,6 +918,14 @@
       path = (const_cast<path_element&>(rhs)).path.release();
     }
 
+    path_element(const svg_style& style_info, 
+        const std::string& id_name="", 
+        const std::string& class_name="",
+        const std::string& clip_name="")
+        : svg_element(style_info, id_name, class_name, clip_name)
+    {
+    }
+
     path_element() : fill(true)
     { // TODO why is the default fill(true)?
     }
@@ -966,8 +1050,11 @@
           (*i).write(o_str); // M1,2
         }
         o_str << "\"";
+
         write_attributes(o_str); // id & clip_path
-        style_info.write(o_str); // fill, stroke, width...
+
+        style_info_.write(o_str); // fill, stroke, width...
+
         if(!fill)
         {
           o_str << " fill=\"none\"";
@@ -1102,7 +1189,7 @@
         poly_points.push_back(new poly_path_point(p.x, p.y));
       }
     }
-
+/*
     template<int n> 
     polygon_element (boost::array<const poly_path_point, n>& points, bool f = true)
       :
@@ -1131,7 +1218,7 @@
         poly_points.push_back(new poly_path_point(p.x, p.y));
       }
     }
-
+*/
     // Member function to add more points to polygon.
     polygon_element& P(double x, double y)
     { // Add another  (x, y) - absolute only.
@@ -1148,7 +1235,7 @@
       }
       o_str << "\"";
       write_attributes(o_str);
-      style_info.write(o_str);
+      style_info_.write(o_str);
       if(!fill)
       {
         o_str << " fill = \"none\"";
@@ -1256,7 +1343,7 @@
       } 
       o_str << "\"";
       write_attributes(o_str);
-      style_info.write(o_str);
+      style_info_.write(o_str);
       o_str<<"/>";
       // Example: <polyline points=" 100,100 200,100 300,200 400,400"/>
     } // void write(std::ostream& o_str)
@@ -1314,7 +1401,7 @@
 
       os << "<g"; // Do NOT need space if convention is to start following item with space.
       write_attributes(os); // id="background" (or clip_path)
-      style_info.write(os); // stroke="rgb(0,0,0)"
+      style_info_.write(os); // stroke="rgb(0,0,0)"
       os << ">" ;
       for(unsigned int i = 0; i < children.size(); ++i)
       {
@@ -1325,117 +1412,111 @@
       // <g fill="rgb(255,255,255)" id="background"><rect x="0" y="0" width="500" height="350"/></g>
     } // void write(std::ostream& rhs)
 
-    g_element& g_tag(int i)
+    g_element& g(int i)
     { // i is index of children nodes.
       return *(static_cast<g_element*>(&children[i]));
     }
 
     // Returns a reference to the new child node just created.
-    g_element& add_g_element()
+    g_element& g()
     {
-      children.push_back(new g_element);
+      children.push_back(new g_element());
       return *(static_cast<g_element*>(&children[children.size()-1]));
     }
 
-    // get ith g_element or child node.
-    g_element& get_g_element(int i)
+    line_element& line(double x1, double y1, double x2, double y2)
     {
-      return *(static_cast<g_element*>(&children[i]));
+      children.push_back(new line_element(x1, y1, x2, y2));
+      return *(static_cast<line_element*>(&children[children.size()-1])); 
     }
 
-    void push_back(svg_element* g)
+    rect_element& rect(double x1, double y1, double x2, double y2)
     {
-      children.push_back(g);
-    }
-
-    void clear()
-    {
-      children.clear();
+      children.push_back(new rect_element(x1, y1, x2, y2));
+      return *(static_cast<rect_element*>(&children[children.size()-1])); 
     }
 
-    // Push_back the several elements:
-    // circle, ellipse, rect, line, path, text, polyline, polygon.
-    g_element& circle(double x, double y, double radius = 5.)
+    circle_element& circle(double x, double y, unsigned int radius = 5)
     {
       children.push_back(new circle_element(x, y, radius));
-      return *this;
+      return *(static_cast<circle_element*>(&children[children.size()-1])); 
     }
 
-    g_element& ellipse(double x, double y, double radius_x = 3., double radius_y = 6.)
+    ellipse_element& ellipse(double rx, double ry, double cx, double cy)
     {
-      children.push_back(new ellipse_element(x, y, radius_x, radius_y));
-      return *this;
+      children.push_back(new ellipse_element(rx, ry, cx, cy));
+      return *(static_cast<ellipse_element*>(&children[children.size()-1])); 
     }
 
-    g_element& text(double x = 0., double y = 0.,
-      const std::string& text = "",
-      text_style& style = no_style, // Use svg implementation's defaults.
-      align_style align = left_align,
-      rotate_style rotate = horizontal)
+    text_element& text(double x = 0., double y = 0.,
+    const std::string& text = "",
+    const text_style& style = no_style, // Use svg implementation's defaults.
+    const align_style& align = left_align,
+    const rotate_style& rotate = horizontal)
     {
       children.push_back(new text_element(x, y, text, style, align, rotate));
-      // font, style, weight, stretch, decoration, now in text_style.
-      return *this;
+      return *(static_cast<text_element*>(&children[children.size()-1])); 
     }
 
-    g_element& rect(double x1, double y1, double x2, double y2)
+    // push_back info about polygon shapes:
+    // Polygon for shapes with many vertices.
+    polygon_element& polygon(double x, double y, bool f = true)
     {
-      children.push_back(new rect_element(x1, y1, x2, y2));
-      return *this;
+      children.push_back(new polygon_element(x, y, f));
+      return *(static_cast<polygon_element*>(&children[children.size()-1])); 
     }
 
-    g_element& line(double x1, double y1, double x2, double y2)
-    {
-      children.push_back(new line_element(x1, y1, x2, y2));
-      return *this;
+    //JVTODO: Replace with template version
+    polygon_element& polygon(std::vector<poly_path_point>& v, bool f = true)
+    { // push_back a complete many-sided polygon to the document.
+      children.push_back(new polygon_element(v, f));
+      return *(static_cast<polygon_element*>(&children[children.size()-1])); 
+    }
+    
+    //JVTODO: Replace with template version
+    polyline_element& polyline(std::vector<poly_path_point>& v)
+    { // push_back a complete many-sided polygon to the document.
+      children.push_back(new polyline_element(v));
+      return *(static_cast<polyline_element*>(&children[children.size()-1])); 
     }
 
-    // TODO should the default be fill or not?
-    g_element& polygon(double x1, double y1, bool f = true)
+    polyline_element& polyline(double x, double y) // 1st point only, add others later with .P(x, y).
     {
-      children.push_back(new polygon_element(x1, y1, f));
-      return *this;
+      children.push_back(new polyline_element(x, y));
+      return *(static_cast<polyline_element*>(&children[children.size()-1])); 
     }
 
-    g_element& polygon(std::vector<poly_path_point>& points, bool f = true)
+    void push_back(svg_element* g)
     {
-      children.push_back(new polygon_element(points, f));
-      return *this;
+      children.push_back(g);
     }
 
-    g_element& triangle(double x1, double y1, double x2, double y2, double x3, double y3, bool f = true)
+    polygon_element& triangle(double x1, double y1, double x2, double y2, double x3, double y3, bool f)
     {
       children.push_back(new polygon_element(x1, y1, x2, y2, x3, y3, f));
-      return *this;
+      return *(static_cast<polygon_element*>(&(children[(unsigned int)(children.size()-1)])));
     }
 
-    g_element& rhombus(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4, bool f = true)
+    polygon_element& rhombus(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4, bool f)
     {
       children.push_back(new polygon_element(x1, y1, x2, y2, x3, y3, x4, y4, f = true));
-      return *this;
+      return *(static_cast<polygon_element*>(&(children[(unsigned int)(children.size()-1)])));
     }
 
-    g_element& pentagon(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4, double x5, double y5, bool f = true)
+    polygon_element& pentagon(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4, double x5, double y5, bool f = true)
     { // push_back a complete pentagon to the document.
       children.push_back(new polygon_element(x1, y1, x2, y2, x3, y3, x4, y4, x5, y5, f));
-      return *this; // svg& 
+      return *(static_cast<polygon_element*>(&(children[(unsigned int)(children.size()-1)])));
     }
 
-    g_element& hexagon(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4, double x5, double y5, double x6, double y6, bool f = true)
+    polygon_element& hexagon(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4, double x5, double y5, double x6, double y6, bool f = true)
     { // push_back a complete 6-sided star to the document.
       children.push_back(new polygon_element(x1, y1, x2, y2, x3, y3, x4, y4, x5, y5, x6, y6, f));
-      return *this; // svg& 
-    }
-
-    g_element& polyline(double x1, double y1, bool f = true)
-    {
-      children.push_back(new polygon_element(x1, y1, f));
-      return *this;
+      return *(static_cast<polygon_element*>(&(children[(unsigned int)(children.size()-1)])));
     }
 
     // These return a reference to the last child node just pushed.
     // (Unlike the above functions that return a g_element&).
-    // TODO why?
     polygon_element& polygon()
     {
       children.push_back(new polygon_element()); // Empty polygon,
@@ -1455,6 +1536,12 @@
       return *(static_cast<path_element*>(&(children[(unsigned int)(children.size()-1)])));
     }
 
+    void clear()
+    {
+      children.clear();
+    }
+
+
   }; // class g_element
 
 } // namespace svg
Modified: sandbox/SOC/2007/visualization/boost/svg_plot/stylesheet.hpp
==============================================================================
--- sandbox/SOC/2007/visualization/boost/svg_plot/stylesheet.hpp	(original)
+++ sandbox/SOC/2007/visualization/boost/svg_plot/stylesheet.hpp	2008-01-20 23:40:06 EST (Sun, 20 Jan 2008)
@@ -14,8 +14,8 @@
 #include <boost/spirit/core.hpp>
 #include <boost/spirit/utility/distinct.hpp>
 
+#include <stdexcept>
 // TODO get some inscrutable errors from this and so commented out of other modules.
-
 #include <exception>
 #include <string>
 #include <fstream>
Modified: sandbox/SOC/2007/visualization/boost/svg_plot/svg.hpp
==============================================================================
--- sandbox/SOC/2007/visualization/boost/svg_plot/svg.hpp	(original)
+++ sandbox/SOC/2007/visualization/boost/svg_plot/svg.hpp	2008-01-20 23:40:06 EST (Sun, 20 Jan 2008)
@@ -17,7 +17,7 @@
 #include <exception>
 #include <vector>
 
-//#include "stylesheet.hpp" // TODO better to be called svg_stylesheet.hpp?
+#include "stylesheet.hpp" // TODO better to be called svg_stylesheet.hpp?
 #include "detail/svg_tag.hpp" // element class definitions.
 #include "svg_style.hpp"
 //#include "svg_fwd.hpp"
@@ -233,26 +233,23 @@
   }
 
   // Set & get functions for x_size_ and y_size_
-  svg& x_size(unsigned int x)
+  void x_size(unsigned int x)
   {
     x_size_ = x;
-    return *this;
   }
 
-  unsigned int x_size()
-  { //  x_size_ name is now used in class to permit function called x_size.
-    // TODO Better called image_x_size()?
-    return x_size_;
-  }
-
-  svg& y_size(unsigned int y)
+  void y_size(unsigned int y)
   {
     y_size_ = y;
-    return *this;
+  }
+
+  unsigned int x_size()
+  { 
+    return x_size_;
   }
 
   unsigned int y_size()
-  { //  y_size_ name is now used in class to permit function called y_size.
+  { 
     return y_size_;
   }
 
@@ -261,7 +258,7 @@
     return static_cast<unsigned int>(document.size());
   }
 
-  svg& coord_precision(int digits)
+  void coord_precision(int digits)
   { // Set decimal digits to be output for output of coordinates.
     // Default stream precision 6 decimal digits is probably excessive.
     // 4.1 Basic data types, integer or float in decimal or scientific (using e format).
@@ -273,7 +270,6 @@
     // but can be changed using this function.
     // Used in svg.write below and so applies to all the svg document.
     coord_precision_ = digits;
-    return *this;
   }
 
   int coord_precision()
@@ -292,7 +288,7 @@
   // recommends MUST have  correct Content-Encoding headers.
   // --------------------------------------------------------------------------------
 
-  svg& write(const std::string& file)
+  void write(const std::string& file)
   {// Write whole .svg 'file' contents to file.
     std::ofstream f_out(file.c_str());
     if(f_out.fail())
@@ -303,10 +299,9 @@
     }
     filename_ = file; // Note so that can embed into file as comment.
     write(f_out);
-    return *this;
   }
 
-  svg& write(std::ostream& s_out)
+  void write(std::ostream& s_out)
   { // Write whole .svg 'file' contents to stream (perhaps a file).
     write_header(s_out); // "<?xml version=...
     // write svg document, begin <svg tag.
@@ -404,10 +399,9 @@
     write_css(s_out);// stylesheet, if any.
     write_document(s_out); // write clip paths and all document elements.
     s_out << "</svg>" << std::endl;   // close off svg tag.
-    return *this;
   }
 
-  svg& license( // Set license requirements for the svg document.
+  void license( // Set license requirements for the svg document.
     const std::string repro = "permits",
     const std::string distrib = "permits",
     const std::string attrib = "requires",
@@ -418,14 +412,12 @@
     attribution_ = attrib;
     commercialuse_ = commercial;
     is_license_ = true;  // Assume want this if set these?
-    return *this;
   }
 
-  svg& license_on(bool l)
+  void license(bool l)
   { // Set (or not) license using all requirement (default permits).
     // Implicitly set by setting a license requirement using license above.
     is_license_ = l;
-    return *this;
   }
 
   bool license_on()
@@ -433,10 +425,9 @@
     return is_license_;
   }
 
-  svg& boost_license_on(bool l)
+  void boost_license_on(bool l)
   { // Set (or not) Boost license.
     is_boost_license_ = l;
-    return *this;
   }
 
   bool boost_license_on()
@@ -466,17 +457,15 @@
   // Writes the information about the image to the document.
   // TODO: allow other unit identifiers.
   // -------------------------------------------------------
-  svg& image_size(unsigned int x, unsigned int y)
+  void image_size(unsigned int x, unsigned int y)
   {
     x_size_ = x;
     y_size_ = y;
-    return *this;
   }
 
-  svg& description(const std::string d)
+  void description(const std::string d)
   { // Writes description to the document(for header as <desc>).
     image_desc_ = d;
-    return *this;
   }
 
   const std::string& description()
@@ -484,10 +473,9 @@
     return image_desc_;
   }
 
-  svg& author(const std::string a)
+  void author(const std::string a)
   { // Writes author to the document (default is copyright_holder).
     author_ = a;
-    return *this;
   }
 
   const std::string& author()
@@ -495,10 +483,9 @@
     return author_;
   }
 
-  svg& document_title(const std::string d)
+  void document_title(const std::string d)
   { // Writes document title for the document(for header as <title>)..
     title_document_ = d;
-    return *this;
   }
 
   const std::string document_title()
@@ -506,10 +493,9 @@
     return title_document_;
   }
 
-  svg& copyright_holder(const std::string d)
+  void copyright_holder(const std::string d)
   { // Writes document title for the document(for header as <title>)..
     holder_copyright_ = d;
-    return *this;
   }
 
   const std::string copyright_holder()
@@ -517,10 +503,9 @@
     return holder_copyright_;
   }
 
-  svg& copyright_date(const std::string d)
+  void copyright_date(const std::string d)
   { // Writes document title for the document(for header as <title>)..
     date_copyright_ = d;
-    return *this;
   }
 
   const std::string copyright_date()
@@ -528,10 +513,9 @@
     return date_copyright_;
   }
 
-  svg& image_filename(const std::string filename)
+  void image_filename(const std::string filename)
   { // Writes image filename for the document(for header as <title>)..
     filename_ = filename;
-    return *this;
   }
 
   const std::string image_filename()
@@ -542,105 +526,89 @@
   // ------------------------------------------------------------------------
   // push_back information about line, rec, circle & ellipse to the document.
   // ------------------------------------------------------------------------
-  svg& line(double x1, double y1, double x2, double y2)
+  line_element& line(double x1, double y1, double x2, double y2)
   { // 'line' element defines a line segment
     // that starts at one point and ends at another.
-    document.push_back(new line_element(x1, y1, x2, y2));
-    return *this;
+    return document.line(x1, y1, x2, y2);
   }
 
-  svg& rect(double x1, double y1, double x2, double y2)
+  rect_element& rect(double x1, double y1, double x2, double y2)
   {
-    document.push_back(new rect_element(x1, y1, x2, y2));
-
-    return *this;
+    return document.rect(x1, y1, x2, y2);
   }
 
-  svg& circle(double x, double y, unsigned int radius = 5)
+  circle_element& circle(double x, double y, unsigned int radius = 5)
   {
-    document.push_back(new circle_element(x, y, radius));
-    return *this;
+    return document.circle(x, y, radius);
   }
 
-  svg& ellipse(double rx, double ry, double cx, double cy)
-  { //
-    document.push_back(new ellipse_element(rx, ry, cx, cy));
-    return *this;
+  ellipse_element& ellipse(double rx, double ry, double cx, double cy)
+  { 
+    return document.ellipse(rx, ry, cx, cy);
   }
 
   // -------------------------------------------------
   // push_back information about text to the document.
   // -------------------------------------------------
-  svg& text(double x, double y, const std::string& text,
-    const text_style& style, // size, font etc.
-    align_style align = center_align, rotate_style rotate = horizontal
-    )
+  text_element& text(double x, double y, const std::string& text,
+        const text_style& style, // size, font etc.
+        align_style align, rotate_style rotate)
   {
-    document.push_back(new text_element(x, y, text, style, align, rotate) );
-    return *this;
-  }
+    return document.text(x, y, text, style, align, rotate);
+  } 
 
   // push_back info about polygon shapes:
   // Polygon for shapes with many vertices.
-  
-  svg& polygon(double x, double y, bool f = true) // 1st point only, add others later with .P(x, y).
+  polygon_element& polygon(double x, double y, bool f = true) // 1st point only, add others later with .P(x, y).
   {
-    document.push_back(new polygon_element(x, y, f));
-    return *this; 
+    return document.polygon(x, y, f);
   }
 
-  svg& polygon(std::vector<poly_path_point>& v, bool f = true)
+  //JVTODO: Replace with template version
+  polygon_element& polygon(std::vector<poly_path_point>& v, bool f = true)
   { // push_back a complete many-sided polygon to the document.
-    document.push_back(new polygon_element(v, f));
-    return *this; // svg& 
+    return document.polygon(v, f);
   }
 
+  // JVTODO: These are not in the standard. Remove, or keep as convenience?
   // Specific polygon shapes: triangle, rhombus, pentagon & hexagon.
 
-  svg& triangle(double x1, double y1, double x2, double y2, double x3, double y3, bool f = true)
+  polygon_element& triangle(double x1, double y1, double x2, double y2, double x3, double y3, bool f = true)
   { // push_back a complete triangle to the document.
-    document.push_back(new polygon_element(x1, y1, x2, y2, x3, y3, f));
-    return *this; // svg& 
+    return document.polygon(x1, y1, f).P(x2, y2).P(x3, y3);
   }
 
-  svg& rhombus(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4, bool f = true)
+  polygon_element& rhombus(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4, bool f = true)
   { // push_back a complete rhombus to the document.
-    document.push_back(new polygon_element(x1, y1, x2, y2, x3, y3, x4, y4, f));
-    return *this; // svg& 
+    return document.polygon(x1, y1, f).P(x2, y2).P(x3, y3).P(x4, y4);
   }
 
-  svg& pentagon(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4, double x5, double y5, bool f = true)
+  polygon_element& pentagon(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4, double x5, double y5, bool f = true)
   { // push_back a complete pentagon to the document.
-    document.push_back(new polygon_element(x1, y1, x2, y2, x3, y3, x4, y4, x5, y5, f));
-    return *this; // svg& 
+    return document.polygon(x1, y1, f).P(x2, y2).P(x3, y3).P(x4, y4).P(x5, y5);
   }
 
-  svg& hexagon(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4, double x5, double y5, double x6, double y6, bool f = true)
+  polygon_element& hexagon(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4, double x5, double y5, double x6, double y6, bool f = true)
   { // push_back a complete 6-sided star to the document.
-    document.push_back(new polygon_element(x1, y1, x2, y2, x3, y3, x4, y4, x5, y5, x6, y6, f));
-    return *this; // svg& 
+    return document.polygon(x1, y1, f).P(x2, y2).P(x3, y3).P(x4, y4).P(x5, y5).P(x6, y6);
   }
 
   // push_back info about polylines.
 
-  svg& polyline(double x, double y) // 1st point only, add others later with .P(x, y).
+  polyline_element& polyline(double x, double y) // 1st point only, add others later with .P(x, y).
   {
-    document.push_back(new polyline_element(x, y));
-    return *this; 
+    return document.polyline(x, y);
   }
 
-  svg& polyline(double x1, double y1, double x2, double y2)
+  polyline_element& polyline(double x1, double y1, double x2, double y2)
   { // Two points only, add others later with .P(x, y).
-    document.push_back(new polyline_element(x1, y1));
-    document.push_back(new polyline_element(x2, y2));
-    return *this; 
+    return document.polyline(x1, y1).P(x2, y2);
   }
 
-  svg& polyline(std::vector<poly_path_point>& v, bool f = true)
+  polyline_element& polyline(std::vector<poly_path_point>& v)
   { // push_back a complete many-sided polygon to the document,
     // from a vector of points.
-    document.push_back(new polygon_element(v, f));
-    return *this; // svg& 
+    return document.polyline(v);
   }
 
   // --------------------------------------------------------------------------------
@@ -649,58 +617,58 @@
 
   path_element& path()
   {
-    document.push_back(new path_element());  // empty path, ready for additions with M., L. ...
-    return *(static_cast<path_element*>(&(document[(unsigned int)(document.size()-1)])));
-    // reference to the path_element just pushed.
+    return document.path();  // empty path, ready for additions with M., L. ...
   }
 
-  svg& clip_path(const rect_element& rect, const std::string& id)
+  clip_path_element& clip_path(const rect_element& rect, const std::string& id)
   { // Rectangle outside which 'painting' is 'clipped' so doesn't show.
     clip_paths.push_back(clip_path_element(id, rect));
-    return *this;
+    return clip_paths[clip_paths.size()-1];
   }
 
   // -------------------------------------------------------------
   // Writes information about a group element to the document.
   // -------------------------------------------------------------
 
-  g_element& add_g_element()
+  g_element& g()
   {
-    return document.add_g_element();
+    return document.g();
   }
 
-  g_element& get_g_element(int i)
+  g_element& g(int i)
   { // Array of g_elements document,
     // indexed by group type, PLOT_BACKGROUND, PLOT_WINDOW_BACKGROUND, ... SVG_PLOT_DOC_CHILDREN
-    return document.g_tag(i);
+    return document.g(i);
   }
 
   //// -------------------------------------------------------------
   //// Load stylesheet
   //// -------------------------------------------------------------
 
-  //svg& load_stylesheet(const std::string& input)
-  //{ // Load a stylesheet into string css from an input file.
-  //  std::ifstream if_str(input.c_str());
-
-  //  if(if_str.fail())
-  //  {
-  //    throw std::runtime_error("Error opening file " + input);
-  //  }
-  //  if(!validate_stylesheet(if_str))
-  //  {
-  //    throw std::runtime_error("Error loading stylesheet!");
-  //  }
-  //  if_str.clear();
-  //  if_str.seekg(0);
-  //  std::string tmp;
-  //  css = "";
-  //  while(std::getline(if_str, tmp))
-  //  {
-  //    css += tmp;
-  //  }
-  //  return *this;
-  //} // svg& load_stylesheet
+  void load_stylesheet(const std::string& input)
+  { // Load a stylesheet into string css from an input file.
+    std::ifstream if_str(input.c_str());
+
+    if(if_str.fail())
+    {
+      throw std::runtime_error("Error opening file " + input);
+    }
+    if(!validate_stylesheet(if_str))
+    {
+      throw std::runtime_error("Error loading stylesheet!");
+    }
+
+    if_str.clear();
+    if_str.seekg(0);
+
+    std::string tmp;
+    css = "";
+
+    while(std::getline(if_str, tmp))
+    {
+      css += tmp;
+    }
+  } // svg& load_stylesheet
 }; // class svg
 
 } // namespace svg
Modified: sandbox/SOC/2007/visualization/boost/svg_plot/svg_2d_plot.hpp
==============================================================================
--- sandbox/SOC/2007/visualization/boost/svg_plot/svg_2d_plot.hpp	(original)
+++ sandbox/SOC/2007/visualization/boost/svg_plot/svg_2d_plot.hpp	2008-01-20 23:40:06 EST (Sun, 20 Jan 2008)
@@ -42,24 +42,6 @@
     class svg_2d_plot; // Plot.
     class svg_2d_plot_series; // plot data series.
 
-    static const double wh = 0.7; // font text width/height ratio.
-    // Even after reading http://www.w3.org/TR/SVG/fonts.html, unclear how to
-    // determine the exact width of digits, so an
-    // arbitrary average width height ratio wh = 0.7 is used as a good approximation.
-
-    static const double sin45 = 0.707; // Use if axis value labels are sloping.
-
-    // x_axis_position_ and y_axis_position_  use these.
-    enum x_axis_intersect {bottom = -1, x_intersects_y = 0, top = +1};
-    // bottom = X-axis free below bottom of end of Y-axis (case of all Y definitely < 0).
-    // top = X-axis free above top of X-axis (case of all Y definitely > 0).
-    // x_intersects_y when Y values include zero, so X intersects the Y axis.
-
-    enum y_axis_intersect {left = -1, y_intersects_x = 0, right = +1};
-    // left = Y-axis free to left of end of X-axis (case of all X definitely < 0).
-    // right = Y-axis free to left of end of X-axis (case of all X definitely > 0).
-    // y_intersects_x when X values include zero, so intersects the X axis.
-
     // -----------------------------------------------------------------
     // This allows us to store plot state locally in svg_plot. We don't
     // store it in "svg" because transforming the points after they are
@@ -200,6 +182,8 @@
       text_style y_value_label_style_;
       text_style point_symbols_style_; // Used for data point marking.
 
+      double x_label_width_;
+
       text_element title_info_; // Plot title.
       text_element legend_header_; // legend box header or title (if any).
       text_element x_label_info_; // For example: "length"
@@ -274,7 +258,7 @@
         y_axis_label_style_(14, "Verdana", "", ""),
         y_value_label_style_(12, "Verdana", "", ""),
         point_symbols_style_(12, "Lucida Sans Unicode"), // Used for data point marking.
-
+        x_label_width_(5),
         title_info_(0, 0, "Plot of data", title_style_, center_align, horizontal),
         x_label_info_(0, 0, "X Axis", x_axis_label_style_, center_align, horizontal),
         x_units_info_(0, 0, " (units)", x_value_label_style_, center_align, horizontal),
@@ -315,25 +299,25 @@
         // Build the document tree by adding all children of the root node.
         for(int i = 0; i < SVG_PLOT_DOC_CHILDREN; ++i)
         {
-          image.add_g_element();
+          image.g();
         }
         set_ids();
 
         // Set other SVG color, stroke & width defaults for various child PLOT nodes.
 
-        image.get_g_element(PLOT_BACKGROUND).style().fill_color(image_border_.fill_);
-        image.get_g_element(PLOT_BACKGROUND).style().stroke_color(image_border_.stroke_);
-        image.get_g_element(PLOT_BACKGROUND).style().stroke_width(image_border_.width_); //
-        image.get_g_element(PLOT_WINDOW_BACKGROUND).style().fill_color(plot_window_border_.fill_);
-        image.get_g_element(PLOT_WINDOW_BACKGROUND).style().stroke_width(plot_window_border_.width_).stroke_color(plot_window_border_.stroke_);
-        image.get_g_element(PLOT_LIMIT_POINTS).style().stroke_color(lightslategray).fill_color(antiquewhite);
-        image.get_g_element(PLOT_X_AXIS).style().stroke_color(black).stroke_width(x_axis_.width());
-        image.get_g_element(PLOT_Y_AXIS).style().stroke_color(black).stroke_width(y_axis_.width());
-        image.get_g_element(PLOT_X_LABEL).style().fill_color(black);
-        image.get_g_element(PLOT_Y_LABEL).style().fill_color(black);
-        image.get_g_element(PLOT_VALUE_LABELS).style().fill_color(black);
-        image.get_g_element(PLOT_LEGEND_TEXT).style().fill_color(black);
-        image.get_g_element(PLOT_TITLE).style().fill_color(black).stroke_on(false);
+        image.g(PLOT_BACKGROUND).style().fill_color(image_border_.fill_);
+        image.g(PLOT_BACKGROUND).style().stroke_color(image_border_.stroke_);
+        image.g(PLOT_BACKGROUND).style().stroke_width(image_border_.width_); //
+        image.g(PLOT_WINDOW_BACKGROUND).style().fill_color(plot_window_border_.fill_);
+        image.g(PLOT_WINDOW_BACKGROUND).style().stroke_width(plot_window_border_.width_).stroke_color(plot_window_border_.stroke_);
+        image.g(PLOT_LIMIT_POINTS).style().stroke_color(lightslategray).fill_color(antiquewhite);
+        image.g(PLOT_X_AXIS).style().stroke_color(black).stroke_width(x_axis_.width());
+        image.g(PLOT_Y_AXIS).style().stroke_color(black).stroke_width(y_axis_.width());
+        image.g(PLOT_X_LABEL).style().fill_color(black);
+        image.g(PLOT_Y_LABEL).style().fill_color(black);
+        image.g(PLOT_VALUE_LABELS).style().fill_color(black);
+        image.g(PLOT_LEGEND_TEXT).style().fill_color(black);
+        image.g(PLOT_TITLE).style().fill_color(black).stroke_on(false);
 
         // Note that widths are stored in member data *and* copied here.
         // Not sure if this is wise but ...
@@ -341,22 +325,22 @@
         // Ticks
         if(x_ticks_.use_up_ticks() || x_ticks_.use_down_ticks())
         {
-          image.get_g_element(PLOT_X_MAJOR_TICKS).style().stroke_width(x_ticks_.major_tick_width_).stroke_color(black);
-          image.get_g_element(PLOT_X_MINOR_TICKS).style().stroke_width(x_ticks_.minor_tick_width_).stroke_color(black);
+          image.g(PLOT_X_MAJOR_TICKS).style().stroke_width(x_ticks_.major_tick_width_).stroke_color(black);
+          image.g(PLOT_X_MINOR_TICKS).style().stroke_width(x_ticks_.minor_tick_width_).stroke_color(black);
         }
         if(y_ticks_.left_ticks_on_ || y_ticks_.right_ticks_on_)
         {
-          image.get_g_element(PLOT_Y_MAJOR_TICKS).style().stroke_width(y_ticks_.major_tick_width_).stroke_color(black);
-          image.get_g_element(PLOT_Y_MINOR_TICKS).style().stroke_width(y_ticks_.minor_tick_width_).stroke_color(black);
+          image.g(PLOT_Y_MAJOR_TICKS).style().stroke_width(y_ticks_.major_tick_width_).stroke_color(black);
+          image.g(PLOT_Y_MINOR_TICKS).style().stroke_width(y_ticks_.minor_tick_width_).stroke_color(black);
         }
         // Grids.
         // Default color & width for grid, used or not.
-        image.get_g_element(PLOT_X_MAJOR_GRID).style().stroke_width(x_ticks_.major_grid_width_).stroke_color(svg_color(200, 220, 255));
-        BOOST_ASSERT(image.get_g_element(PLOT_X_MAJOR_GRID).style().stroke_color() == svg_color(200, 220, 255));
-        image.get_g_element(PLOT_X_MINOR_GRID).style().stroke_width(x_ticks_.minor_grid_width_).stroke_color(svg_color(200, 220, 255));
-        image.get_g_element(PLOT_Y_MAJOR_GRID).style().stroke_width(y_ticks_.major_grid_width_).stroke_color(svg_color(200, 220, 255));
-        image.get_g_element(PLOT_Y_MINOR_GRID).style().stroke_width(y_ticks_.minor_grid_width_).stroke_color(svg_color(200, 220, 255));
-        image.get_g_element(PLOT_DATA_LINES).style().stroke_width(2); // default width.
+        image.g(PLOT_X_MAJOR_GRID).style().stroke_width(x_ticks_.major_grid_width_).stroke_color(svg_color(200, 220, 255));
+        BOOST_ASSERT(image.g(PLOT_X_MAJOR_GRID).style().stroke_color() == svg_color(200, 220, 255));
+        image.g(PLOT_X_MINOR_GRID).style().stroke_width(x_ticks_.minor_grid_width_).stroke_color(svg_color(200, 220, 255));
+        image.g(PLOT_Y_MAJOR_GRID).style().stroke_width(y_ticks_.major_grid_width_).stroke_color(svg_color(200, 220, 255));
+        image.g(PLOT_Y_MINOR_GRID).style().stroke_width(y_ticks_.minor_grid_width_).stroke_color(svg_color(200, 220, 255));
+        image.g(PLOT_DATA_LINES).style().stroke_width(2); // default width.
         // Alter with plot.data_lines_width(4);
 
         legend_place_ = (plot_window_on_) ? outside_right : inside; // Defaults.
@@ -376,7 +360,7 @@
       { // document ids for use in <g id = "PLOT_TITLE".../>
         for(int i = 0; i < detail::SVG_PLOT_DOC_CHILDREN; ++i)
         {	// Order determines the painting order.
-          image.get_g_element(i).id(detail::document_ids[i]);
+          image.g(i).id(detail::document_ids[i]);
         }
       } //  void set_ids()
 
@@ -612,7 +596,7 @@
         }
         if (plot_window_on_)
         { // Draw plot window rectangle with border and/or background.
-          image.get_g_element(detail::PLOT_WINDOW_BACKGROUND).push_back(
+          image.g(detail::PLOT_WINDOW_BACKGROUND).push_back(
             new rect_element(plot_left_, plot_top_, (plot_right_ - plot_left_), plot_bottom_ - plot_top_));
         }
 
@@ -633,24 +617,24 @@
             { // Extend the vertical line down in lieu of longest tick.
               ybottom += (std::max)(x_ticks_.minor_tick_length_, x_ticks_.major_tick_length_);// Avoid macro max trap!
             }
-            image.get_g_element(detail::PLOT_Y_AXIS).line(x, plot_top_, x, ybottom);
+            image.g(detail::PLOT_Y_AXIS).line(x, plot_top_, x, ybottom);
             // <g id="yAxis" stroke="rgb(0,0,0)"><line x1="70.5" y1="53" x2="70.5" y2="357"/>
             if (y_ticks_.ticks_on_plot_window_on_ < 0) //(y_axis_position_ == left)
             { // Draw vertical line holding the ticks on the left of plot window.
-              image.get_g_element(detail::PLOT_Y_AXIS).line(plot_left_, plot_top_, plot_left_, plot_bottom_);
+              image.g(detail::PLOT_Y_AXIS).line(plot_left_, plot_top_, plot_left_, plot_bottom_);
             }
             else
             {// Draw vertical line holding the ticks on the right of plot window.
-              image.get_g_element(detail::PLOT_Y_AXIS).line(plot_right_, plot_top_, plot_right_, plot_bottom_);
+              image.g(detail::PLOT_Y_AXIS).line(plot_right_, plot_top_, plot_right_, plot_bottom_);
             }
           }
           else if (y_axis_position_ == left)
           { // Draw on the left of plot window.
-            image.get_g_element(detail::PLOT_Y_AXIS).line(plot_left_, plot_top_, plot_left_, plot_bottom_);
+            image.g(detail::PLOT_Y_AXIS).line(plot_left_, plot_top_, plot_left_, plot_bottom_);
           }
           else if (y_axis_position_ == right)
           {// Draw on the lright of plot window.
-            image.get_g_element(detail::PLOT_Y_AXIS).line(plot_right_, plot_top_, plot_right_, plot_bottom_);
+            image.g(detail::PLOT_Y_AXIS).line(plot_right_, plot_top_, plot_right_, plot_bottom_);
           }
           else
           { // ??? Warn that things have gone wrong?
@@ -658,10 +642,10 @@
         }
 
         // Access the paths for the ticks & grids, ready for additions.
-        path_element& minor_tick_path = image.get_g_element(detail::PLOT_Y_MINOR_TICKS).path();
-        path_element& major_tick_path = image.get_g_element(detail::PLOT_Y_MAJOR_TICKS).path();
-        path_element& minor_grid_path = image.get_g_element(detail::PLOT_Y_MINOR_GRID).path();
-        path_element& major_grid_path = image.get_g_element(detail::PLOT_Y_MAJOR_GRID).path();
+        path_element& minor_tick_path = image.g(detail::PLOT_Y_MINOR_TICKS).path();
+        path_element& major_tick_path = image.g(detail::PLOT_Y_MAJOR_TICKS).path();
+        path_element& minor_grid_path = image.g(detail::PLOT_Y_MINOR_GRID).path();
+        path_element& major_grid_path = image.g(detail::PLOT_Y_MAJOR_GRID).path();
 
         // y_minor_jump is the interval between minor ticks.
         double y_minor_jump = y_ticks_.major_interval_ / ((double)(y_ticks_.num_minor_ticks_ + 1.) );
@@ -723,7 +707,7 @@
         }
 
         double y = image_border_.width_ + image_border_.margin_ + y_axis_label_style_.font_size();
-        image.get_g_element(detail::PLOT_Y_LABEL).push_back(new
+        image.g(detail::PLOT_Y_LABEL).push_back(new
           text_element(y,
           // shift over one char height to right from left edge of image.
           (plot_bottom_ + plot_top_) / 2., // center on the plot window.
@@ -833,7 +817,7 @@
             }
             // Always want all values including "0", if labeling external to plot window.
             // y_ticks_.ticks_on_plot_window_on_ == true != 0
-            image.get_g_element(detail::PLOT_VALUE_LABELS).text(
+            image.g(detail::PLOT_VALUE_LABELS).text(
               x_left,
               y,
               label.str(), y_value_label_style_, alignment, y_ticks_.label_rotation_);
@@ -843,7 +827,7 @@
             if ((value != 0) && y_axis_.axis_line_on_)
             { // Avoid a zero ON the Y-axis if it would be cut through by any horizontal X-axis line.
               y += y_value_label_style_.font_size() / 2;
-              image.get_g_element(detail::PLOT_VALUE_LABELS).text(
+              image.g(detail::PLOT_VALUE_LABELS).text(
                 x_left ,
                 y, // Just shift down half a digit to center value digits on tick.
                 label.str(),
@@ -927,7 +911,7 @@
         double temp_x(0.);
         double temp_y;
 
-        g_element& g_ptr = image.get_g_element(detail::PLOT_DATA_LINES).add_g_element();
+        g_element& g_ptr = image.g(detail::PLOT_DATA_LINES).g();
         g_ptr.clip_id(plot_window_clip_);
         g_ptr.style().stroke_color(series.line_style_.color_);
         g_ptr.style().fill_color(series.line_style_.area_fill_);
@@ -989,7 +973,7 @@
 
       void draw_bezier_lines(const svg_2d_plot_series& series)
       {
-        g_element& g_ptr = image.get_g_element(detail::PLOT_DATA_LINES).add_g_element();
+        g_element& g_ptr = image.g(detail::PLOT_DATA_LINES).g();
         g_ptr.clip_id(plot_window_clip_);
         g_ptr.style().stroke_color(series.line_style_.color_);
         path_element& path = g_ptr.path();
@@ -1085,7 +1069,7 @@
         // painting, so the order of drawing is important.
 
         // Draw image background (perhaps with border and/or fill color).
-        image.get_g_element(detail::PLOT_BACKGROUND).push_back(
+        image.g(detail::PLOT_BACKGROUND).push_back(
           new rect_element(0, 0, image.x_size(),  image.y_size()));
 
         calculate_plot_window();
@@ -1101,7 +1085,7 @@
           plot_window_clip_);
         // <clipPath id="plot_window"><rect x="35" y="38" width="309" height="322"/></clipPath>
 
-        image.get_g_element(detail::PLOT_DATA_POINTS).clip_id(plot_window_clip_);
+        image.g(detail::PLOT_DATA_POINTS).clip_id(plot_window_clip_);
 
         // Draw axes, labels & legend, as required.
         draw_x_axis(); // Must do X-axis first.
@@ -1126,7 +1110,7 @@
         double y(0.);
         for(unsigned int i = 0; i < series.size(); ++i)
         {
-          g_element& g_ptr = image.get_g_element(detail::PLOT_DATA_POINTS).add_g_element();
+          g_element& g_ptr = image.g(detail::PLOT_DATA_POINTS).g();
 
           g_ptr.style()
             .fill_color(series[i].point_style_.fill_color_)
@@ -1148,7 +1132,7 @@
         // Draw all the 'bad' at_limit points.
         for(unsigned int i = 0; i < series.size(); ++i)
         {
-          g_element& g_ptr = image.get_g_element(detail::PLOT_LIMIT_POINTS);
+          g_element& g_ptr = image.g(detail::PLOT_LIMIT_POINTS);
 
           for(std::multimap<double,double>::const_iterator j = series[i].series_limits.begin();
             j!=series[i].series_limits.end(); ++j)
@@ -1266,13 +1250,13 @@
 
       svg_2d_plot& y_axis_width(double width)
       {
-        image.get_g_element(detail::PLOT_Y_AXIS).style().stroke_width(width);
+        image.g(detail::PLOT_Y_AXIS).style().stroke_width(width);
         return *this;
       }
 
       double y_axis_width()
       {
-        return image.get_g_element(detail::PLOT_Y_AXIS).style().stroke_width();
+        return image.g(detail::PLOT_Y_AXIS).style().stroke_width();
       }
 
       svg_2d_plot& y_value_precision(int digits)
@@ -1286,7 +1270,7 @@
         return y_ticks_.value_precision_;
       }
 
-      svg_2d_plot& y_value_ioflags(int flags)
+      svg_2d_plot& y_value_ioflags(std::_Ios_Fmtflags flags)
       { // IO flags of Y tick label values (default 0X201).
         y_ticks_.value_ioflags_ = flags;
         return *this;
@@ -1310,24 +1294,24 @@
 
       svg_2d_plot& y_axis_color(const svg_color& col)
       { // Set only stroke color.
-        image.get_g_element(detail::PLOT_Y_AXIS).style().stroke_color(col);
+        image.g(detail::PLOT_Y_AXIS).style().stroke_color(col);
         return *this;
       }
 
       svg_color y_axis_color()
       { // return the stroke color.
-        return image.get_g_element(detail::PLOT_Y_AXIS).style().stroke_color();
+        return image.g(detail::PLOT_Y_AXIS).style().stroke_color();
       }
 
       svg_2d_plot& y_axis_label_color(const svg_color& col)
       { // Set stroke color.
-        image.get_g_element(detail::PLOT_VALUE_LABELS).style().stroke_color(col);
+        image.g(detail::PLOT_VALUE_LABELS).style().stroke_color(col);
         return *this;
       }
 
       svg_color y_axis_label_color()
       { // But only return the stroke color.
-        return image.get_g_element(detail::PLOT_VALUE_LABELS).style().stroke_color();
+        return image.g(detail::PLOT_VALUE_LABELS).style().stroke_color();
       }
 
       svg_2d_plot& y_label_units_on(bool b)
@@ -1343,68 +1327,68 @@
 
       svg_2d_plot& y_axis_value_color(const svg_color& col)
       {
-        image.get_g_element(detail::PLOT_VALUE_LABELS).style().stroke_color(col);
+        image.g(detail::PLOT_VALUE_LABELS).style().stroke_color(col);
         return *this;
       }
 
       svg_color y_axis_value_color()
       { // Only return the stroke color.
-        return image.get_g_element(detail::PLOT_VALUE_LABELS).style().stroke_color();
+        return image.g(detail::PLOT_VALUE_LABELS).style().stroke_color();
       }
 
       svg_2d_plot& y_label_width(double width)
       {
-        image.get_g_element(detail::PLOT_Y_LABEL).style().stroke_width(width);
+        image.g(detail::PLOT_Y_LABEL).style().stroke_width(width);
         return *this;
       }
 
       double y_label_width()
       {
-        return image.get_g_element(detail::PLOT_Y_LABEL).style().stroke_width();
+        return image.g(detail::PLOT_Y_LABEL).style().stroke_width();
       }
 
       svg_2d_plot& y_major_grid_color(const svg_color& col)
       {
-        image.get_g_element(detail::PLOT_Y_MAJOR_GRID).style().stroke_color(col);
+        image.g(detail::PLOT_Y_MAJOR_GRID).style().stroke_color(col);
         return *this;
       }
 
       const svg_color y_major_grid_color()
       {
-        return image.get_g_element(detail::PLOT_Y_MAJOR_GRID).style().stroke_color();
+        return image.g(detail::PLOT_Y_MAJOR_GRID).style().stroke_color();
       }
 
       svg_2d_plot& y_minor_grid_color(const svg_color& col)
       {
-        image.get_g_element(detail::PLOT_Y_MINOR_GRID).style().stroke_color(col);
+        image.g(detail::PLOT_Y_MINOR_GRID).style().stroke_color(col);
         return *this;
       }
 
       const svg_color y_minor_grid_color()
       {
-        return image.get_g_element(detail::PLOT_Y_MINOR_GRID).style().stroke_color();
+        return image.g(detail::PLOT_Y_MINOR_GRID).style().stroke_color();
       }
 
       svg_2d_plot& y_major_tick_color(const svg_color& col)
       {
-        image.get_g_element(detail::PLOT_Y_MAJOR_TICKS).style().stroke_color(col);
+        image.g(detail::PLOT_Y_MAJOR_TICKS).style().stroke_color(col);
         return *this;
       }
 
       const svg_color y_major_tick_color()
       {
-        return image.get_g_element(detail::PLOT_Y_MAJOR_TICKS).style().stroke_color();
+        return image.g(detail::PLOT_Y_MAJOR_TICKS).style().stroke_color();
       }
 
       svg_2d_plot& y_minor_tick_color(const svg_color& col)
       {
-        image.get_g_element(detail::PLOT_Y_MINOR_TICKS).style().stroke_color(col);
+        image.g(detail::PLOT_Y_MINOR_TICKS).style().stroke_color(col);
         return *this;
       }
 
       const svg_color y_minor_tick_color()
       {
-        return image.get_g_element(detail::PLOT_Y_MINOR_TICKS).style().stroke_color();
+        return image.g(detail::PLOT_Y_MINOR_TICKS).style().stroke_color();
       }
 
       const std::string y_axis_position()
@@ -1514,7 +1498,7 @@
       svg_2d_plot& y_major_tick_width(double width)
       {
         y_ticks_.major_tick_width_ = width;
-        image.get_g_element(detail::PLOT_Y_MAJOR_TICKS).style().stroke_width(width);
+        image.g(detail::PLOT_Y_MAJOR_TICKS).style().stroke_width(width);
         return *this;
       }
 
@@ -1526,7 +1510,7 @@
       svg_2d_plot& y_minor_tick_width(double width)
       {
         y_ticks_.minor_tick_width_ = width;
-        image.get_g_element(detail::PLOT_Y_MINOR_TICKS).style().stroke_width(width);
+        image.g(detail::PLOT_Y_MINOR_TICKS).style().stroke_width(width);
         return *this;
       }
 
@@ -1606,7 +1590,7 @@
       svg_2d_plot& y_minor_grid_width(double width)
       {
         y_ticks_.minor_grid_width_ = width;
-        image.get_g_element(detail::PLOT_Y_MINOR_GRID).style().stroke_width(width);
+        image.g(detail::PLOT_Y_MINOR_GRID).style().stroke_width(width);
         return *this;
       }
 
@@ -1618,7 +1602,7 @@
       svg_2d_plot& y_major_grid_width(double width)
       {
         y_ticks_.major_grid_width_ = width;
-        image.get_g_element(detail::PLOT_Y_MAJOR_GRID).style().stroke_width(width);
+        image.g(detail::PLOT_Y_MAJOR_GRID).style().stroke_width(width);
         return *this;
       }
 
Modified: sandbox/SOC/2007/visualization/boost/svg_plot/svg_style.hpp
==============================================================================
--- sandbox/SOC/2007/visualization/boost/svg_plot/svg_style.hpp	(original)
+++ sandbox/SOC/2007/visualization/boost/svg_plot/svg_style.hpp	2008-01-20 23:40:06 EST (Sun, 20 Jan 2008)
@@ -738,7 +738,7 @@
     bool major_grid_on_;  // Draw X grid at major ticks.
     bool minor_grid_on_;// Draw X grid at minor ticks.
     int value_precision_; // precision for tick value labels, usually 3 will suffice.
-    int value_ioflags_;  // IO formatting flags for the axis default std::ios::dec.
+    std::_Ios_Fmtflags value_ioflags_;  // IO formatting flags for the axis default std::ios::dec.
     bool strip_e0s_; // If redundant zero, + and e are to be stripped.
     size_t label_max_chars_;  // width (in SVG units) of longest label on axis.
     int ticks_on_plot_window_on_; // Value labels & ticks on the plot window border