Revision: 4011
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=4011&view=rev
Author:   mdboom
Date:     2007-10-26 08:58:50 -0700 (Fri, 26 Oct 2007)

Log Message:
-----------
More coverage.  Add draw_path_collection to SVG.

Modified Paths:
--------------
    branches/transforms/examples/backend_driver.py
    branches/transforms/examples/legend_auto.py
    branches/transforms/lib/matplotlib/axis.py
    branches/transforms/lib/matplotlib/backends/backend_ps.py
    branches/transforms/lib/matplotlib/backends/backend_svg.py
    branches/transforms/lib/matplotlib/figure.py
    branches/transforms/lib/matplotlib/quiver.py
    branches/transforms/lib/matplotlib/scale.py
    branches/transforms/lib/matplotlib/transforms.py

Modified: branches/transforms/examples/backend_driver.py
===================================================================
--- branches/transforms/examples/backend_driver.py      2007-10-26 03:40:33 UTC 
(rev 4010)
+++ branches/transforms/examples/backend_driver.py      2007-10-26 15:58:50 UTC 
(rev 4011)
@@ -55,6 +55,7 @@
     'image_origin.py',
     'invert_axes.py',
     'layer_images.py',
+    'legend_auto.py',
     'legend_demo.py',
     'legend_demo2.py',
     'line_collection.py',

Modified: branches/transforms/examples/legend_auto.py
===================================================================
--- branches/transforms/examples/legend_auto.py 2007-10-26 03:40:33 UTC (rev 
4010)
+++ branches/transforms/examples/legend_auto.py 2007-10-26 15:58:50 UTC (rev 
4011)
@@ -79,7 +79,12 @@
 
 if __name__ == '__main__':
     nfigs = 10
-    figures = [int(f) for f in sys.argv[1:]]
+    figures = []
+    for f in sys.argv[1:]:
+        try:
+            figures.append(int(f))
+        except ValueError:
+            pass
     if len(figures) == 0:
         figures = range(1, nfigs+1)
 

Modified: branches/transforms/lib/matplotlib/axis.py
===================================================================
--- branches/transforms/lib/matplotlib/axis.py  2007-10-26 03:40:33 UTC (rev 
4010)
+++ branches/transforms/lib/matplotlib/axis.py  2007-10-26 15:58:50 UTC (rev 
4011)
@@ -18,7 +18,7 @@
 from font_manager import FontProperties
 from text import Text, TextWithDash, _process_text_args
 from transforms import Affine2D, Bbox, blended_transform_factory, 
interval_contains, \
-    interval_contains_open, IntervalTransform, IdentityTransform
+    interval_contains_open, IdentityTransform
 from patches import bbox_artist
 from scale import scale_factory
 

Modified: branches/transforms/lib/matplotlib/backends/backend_ps.py
===================================================================
--- branches/transforms/lib/matplotlib/backends/backend_ps.py   2007-10-26 
03:40:33 UTC (rev 4010)
+++ branches/transforms/lib/matplotlib/backends/backend_ps.py   2007-10-26 
15:58:50 UTC (rev 4011)
@@ -505,12 +505,13 @@
         path_codes = []
         for i, (path, transform) in enumerate(self._iter_collection_raw_paths(
             master_transform, paths, all_transforms)):
-            ps_cmd = ['/p%x_%x {' % (self._path_collection_id, i),
+            name = 'p%x_%x' % (self._path_collection_id, i)
+            ps_cmd = ['/%s {' % name,
                       'newpath', 'translate']
             ps_cmd.append(self._convert_path(path, transform))
             ps_cmd.extend(['} bind def\n'])
             write('\n'.join(ps_cmd))
-            path_codes.append("p%x_%x" % (self._path_collection_id, i))
+            path_codes.append(name)
             
         for xo, yo, path_id, gc, rgbFace in self._iter_collection(
             path_codes, cliprect, clippath, clippath_trans,

Modified: branches/transforms/lib/matplotlib/backends/backend_svg.py
===================================================================
--- branches/transforms/lib/matplotlib/backends/backend_svg.py  2007-10-26 
03:40:33 UTC (rev 4010)
+++ branches/transforms/lib/matplotlib/backends/backend_svg.py  2007-10-26 
15:58:50 UTC (rev 4011)
@@ -42,6 +42,7 @@
         self._clipd = {}
         self._char_defs = {}
         self._markers = {}
+        self._path_collection_id = 0
         self.mathtext_parser = MathTextParser('SVG')
         self.fontd = {}
         svgwriter.write(svgProlog%(width,height,width,height))
@@ -192,7 +193,33 @@
         for x, y in tpath.vertices:
             details = 'xlink:href="#%s" x="%f" y="%f"' % (name, x, y)
             self._draw_svg_element('use', details, gc, rgbFace)
+
+    def draw_path_collection(self, master_transform, cliprect, clippath,
+                             clippath_trans, paths, all_transforms, offsets,
+                             offsetTrans, facecolors, edgecolors, linewidths,
+                             linestyles, antialiaseds):
+        write = self._svgwriter.write
+        
+        path_codes = []
+        write('<defs>\n')
+        for i, (path, transform) in enumerate(self._iter_collection_raw_paths(
+            master_transform, paths, all_transforms)):
+            name = 'coll%x_%x' % (self._path_collection_id, i)
+            transform = transform.frozen().scale(1.0, -1.0)
+            d = self._convert_path(path, transform)
+            write('<path id="%s" d="%s"/>\n' % (name, d))
+            path_codes.append(name)
+        write('</defs>\n')
             
+        for xo, yo, path_id, gc, rgbFace in self._iter_collection(
+            path_codes, cliprect, clippath, clippath_trans,
+            offsets, offsetTrans, facecolors, edgecolors,
+            linewidths, linestyles, antialiaseds):
+            details = 'xlink:href="#%s" x="%f" y="%f"' % (path_id, xo, 
self.height - yo)
+            self._draw_svg_element('use', details, gc, rgbFace)
+
+        self._path_collection_id += 1
+            
     def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None):
         # MGDTODO: Support clippath here
         trans = [1,0,0,1,0,0]

Modified: branches/transforms/lib/matplotlib/figure.py
===================================================================
--- branches/transforms/lib/matplotlib/figure.py        2007-10-26 03:40:33 UTC 
(rev 4010)
+++ branches/transforms/lib/matplotlib/figure.py        2007-10-26 15:58:50 UTC 
(rev 4011)
@@ -328,7 +328,7 @@
             w,h = args
 
        dpival = self.dpi
-       self.bbox_inches.max = w, h
+       self.bbox_inches.p1 = w, h
        
         if forward:
             dpival = self.dpi
@@ -339,7 +339,7 @@
                 manager.resize(int(canvasw), int(canvash))
 
     def get_size_inches(self):
-        return self.bbox_inches.max
+        return self.bbox_inches.p1
 
     def get_edgecolor(self):
         'Get the edge color of the Figure rectangle'

Modified: branches/transforms/lib/matplotlib/quiver.py
===================================================================
--- branches/transforms/lib/matplotlib/quiver.py        2007-10-26 03:40:33 UTC 
(rev 4010)
+++ branches/transforms/lib/matplotlib/quiver.py        2007-10-26 15:58:50 UTC 
(rev 4011)
@@ -238,8 +238,8 @@
             self.set_transform(self.Q.ax.figure.transFigure)
         elif self.coord == 'inches':
             dx = ax.figure.dpi
-            bb = transforms.Bbox(transforms.origin(), transforms.Point(dx, dx))
-            trans = transforms.get_bbox_transform(transforms.unit_bbox(), bb)
+            bb = transforms.Bbox.from_extents(0, 0, dx, dy)
+            trans = transforms.BboxTransform(Bbox.unit(), bb)
             self.set_transform(trans)
         else:
             raise ValueError('unrecognized coordinates')

Modified: branches/transforms/lib/matplotlib/scale.py
===================================================================
--- branches/transforms/lib/matplotlib/scale.py 2007-10-26 03:40:33 UTC (rev 
4010)
+++ branches/transforms/lib/matplotlib/scale.py 2007-10-26 15:58:50 UTC (rev 
4011)
@@ -6,8 +6,7 @@
     LogFormatter, LogFormatterMathtext
 from ticker import NullLocator, FixedLocator, LinearLocator, LogLocator, \
     AutoLocator
-from transforms import Affine1DBase, IntervalTransform, Transform, \
-    composite_transform_factory, IdentityTransform
+from transforms import Transform, composite_transform_factory, 
IdentityTransform
 
 class ScaleBase(object):
     def set_default_locators_and_formatters(self, axis):

Modified: branches/transforms/lib/matplotlib/transforms.py
===================================================================
--- branches/transforms/lib/matplotlib/transforms.py    2007-10-26 03:40:33 UTC 
(rev 4010)
+++ branches/transforms/lib/matplotlib/transforms.py    2007-10-26 15:58:50 UTC 
(rev 4011)
@@ -128,62 +128,63 @@
         might normally be used.
         """
         return self
-        
-    def write_graphviz(self, fobj, highlight=[]):
-        """
-        For debugging purposes.
 
-        Writes the transform tree rooted at 'self' to a graphviz "dot"
-        format file.  This file can be run through the "dot" utility
-        to produce a graph of the transform tree.
+    if DEBUG:
+        def write_graphviz(self, fobj, highlight=[]):
+            """
+            For debugging purposes.
 
-        Affine transforms are marked in blue.  Bounding boxes are
-        marked in yellow.
+            Writes the transform tree rooted at 'self' to a graphviz "dot"
+            format file.  This file can be run through the "dot" utility
+            to produce a graph of the transform tree.
 
-        fobj: A Python file-like object
-        """
-        if not DEBUG:
-            return
-        
-        seen = cbook.set()
+            Affine transforms are marked in blue.  Bounding boxes are
+            marked in yellow.
 
-        def recurse(root):
-            if root in seen:
-                return
-            seen.add(root)
-            props = {}
-            label = root.__class__.__name__
-            if root._invalid:
-                label = '[%s]' % label
-            if root in highlight:
-                props['style'] = 'bold'
-            if root.is_affine:
-                props['shape'] = 'parallelogram'
-            if root.is_bbox:
-                props['shape'] = 'box'
-            props['label'] = '"%s"' % label
-            props = ' '.join(['%s=%s' % (key, val) for key, val in 
props.items()])
+            fobj: A Python file-like object
+            """
+            seen = cbook.set()
 
-            fobj.write('%s [%s];\n' %
-                       (hash(root), props))
+            def recurse(root):
+                if root in seen:
+                    return
+                seen.add(root)
+                props = {}
+                label = root.__class__.__name__
+                if root._invalid:
+                    label = '[%s]' % label
+                if root in highlight:
+                    props['style'] = 'bold'
+                if root.is_affine:
+                    props['shape'] = 'parallelogram'
+                if root.is_bbox:
+                    props['shape'] = 'box'
+                props['label'] = '"%s"' % label
+                props = ' '.join(['%s=%s' % (key, val) for key, val in 
props.items()])
 
-            for child in root._children:
-                name = '?'
-                for key, val in root.__dict__.items():
-                    if val is child:
-                        name = key
-                        break
-                fobj.write('%s -> %s [label="%s", fontsize=10];\n' % (
-                        hash(root),
-                        hash(child),
-                        name))
-                recurse(child)
+                fobj.write('%s [%s];\n' %
+                           (hash(root), props))
 
-        fobj.write("digraph G {\n")
-        recurse(self)
-        fobj.write("}\n")
+                for child in root._children:
+                    name = '?'
+                    for key, val in root.__dict__.items():
+                        if val is child:
+                            name = key
+                            break
+                    fobj.write('%s -> %s [label="%s", fontsize=10];\n' % (
+                            hash(root),
+                            hash(child),
+                            name))
+                    recurse(child)
+
+            fobj.write("digraph G {\n")
+            recurse(self)
+            fobj.write("}\n")
+    else:
+        def write_graphviz(self, fobj, highlight=[]):
+            return
+   
     
-    
 class BboxBase(TransformNode):
     """
     This is the base class of all bounding boxes, and provides
@@ -226,6 +227,14 @@
         return self.get_points()[1, 1]
     y1 = property(_get_y1)
 
+    def _get_p0(self):
+        return self.get_points()[0]
+    p0 = property(_get_p0)
+
+    def _get_p1(self):
+        return self.get_points()[1]
+    p1 = property(_get_p1)
+    
     def _get_xmin(self):
         return min(self.get_points()[:, 0])
     xmin = property(_get_xmin)
@@ -737,15 +746,15 @@
         self.invalidate()
     y1 = property(BboxBase._get_y1, _set_y1)
 
-    def _set_min(self, val):
+    def _set_p0(self, val):
         self._points[0] = val
         self.invalidate()
-    min = property(BboxBase._get_min, _set_min)
-    
-    def _set_max(self, val):
+    p0 = property(BboxBase._get_p0, _set_p0)
+
+    def _set_p1(self, val):
         self._points[1] = val
         self.invalidate()
-    max = property(BboxBase._get_max, _set_max)
+    p1 = property(BboxBase._get_p1, _set_p1)
     
     def _set_intervalx(self, interval):
         self._points[:, 0] = interval
@@ -1137,240 +1146,6 @@
     get_affine.__doc__ = Transform.get_affine.__doc__
 
     
-class Affine1DBase(AffineBase):
-    """
-    The base class of all 1D affine transforms.
-
-    Provides the read-only interface.
-
-    1D affine transformations are performed using a 2x2 numpy array:
-    
-        a b
-        0 1
-
-    where a is scale and b is translation.
-    """
-    input_dims = 1
-    output_dims = 1
-    is_separable = True
-
-    def __init__(self):
-        AffineBase.__init__(self)
-
-    def frozen(self):
-        return Affine1D(self.get_matrix().copy())
-    frozen.__doc__ = AffineBase.frozen.__doc__
-        
-    def __array__(self, *args, **kwargs):
-       return self.get_matrix()
-
-    def to_values(self):
-        """
-        Returns a, b
-        """
-        mtx = self.get_matrix()
-        return mtx[0]
-    
-    [EMAIL PROTECTED]
-    def matrix_from_values(a, b):
-        """
-        Create a new transformation matrix as a numpy array using the
-        values a, b, where:
-
-          a: scale
-          b: translation
-        """
-        return npy.array([[a, b], [0.0, 1.0]], npy.float_)
-    matrix_from_values = staticmethod(matrix_from_values)
-
-    def transform(self, values):
-        mtx = self.get_matrix()
-        points = npy.asarray(values, npy.float_)
-        return points * mtx[0, 0] + mtx[0, 1]
-
-    if DEBUG:
-        _transform = transform
-        def transform(self, values):
-            # The major speed trap here is just converting to the points
-            # to an array in the first place.  If we can use more arrays
-            # upstream, that should help here.
-            if not isinstance(values, npy.ndarray):
-                warnings.warn(
-                    ('A non-numpy array of type %s was passed in for ' +
-                     'transformation.  Please correct this.')
-                    % type(values))
-            return self._transform(values)
-    transform.__doc__ = AffineBase.transform.__doc__
-    
-    transform_affine = transform
-    transform_affine.__doc__ = AffineBase.transform_affine.__doc__
-    
-    def inverted(self):
-        if self._inverted is None or self._invalid:
-            mtx = self.get_matrix()
-            self._inverted = Affine1D(inv(mtx))
-            self._invalid = 0
-        return self._inverted
-    inverted.__doc__ = AffineBase.inverted.__doc__
-
-    
-class Affine1D(Affine1DBase):
-    """
-    A concrete 1D affine transformation.
-
-    1D affine transformations are performed using a 2x2 numpy array:
-    
-        a b
-        0 1
-
-    where a is scale and b is translation.
-    """
-    def __init__(self, matrix = None):
-        """
-        Initialize an Affine transform from a 2x2 numpy float array.
-
-        If matrix is None, initialize with the identity transform.
-        """
-        Affine1DBase.__init__(self)
-        if matrix is None:
-            matrix = npy.identity(2)
-        else:
-           matrix = npy.asarray(matrix, npy.float_)
-            assert matrix.shape == (2, 2)
-        self._mtx = matrix
-        self._invalid = 0
-
-    def __repr__(self):
-        return "Affine1D(%s)" % repr(self._mtx)
-    __str__ = __repr__
-
-    def __cmp__(self, other):
-        if (isinstance(other, Affine1D) and
-            (self.get_matrix() == other.get_matrix()).all()):
-            return 0
-        return -1
-    
-    [EMAIL PROTECTED]
-    def from_values(a, b):
-        """
-        Create a new Affine1D instance from the given values.
-
-          a: scale
-          b: translation
-        """
-        return Affine1D(Affine1D.matrix_from_values(a, b))
-    from_values = staticmethod(from_values)
-
-    def get_matrix(self):
-        """
-        Get the underlying transformation matrix as a 2x2 numpy array.
-
-          a b
-          0 1
-
-        where a is scale and b is translation.
-        """
-        self._invalid = 0
-        return self._mtx
-    
-    def set_matrix(self, mtx):
-        """
-        Set the underlying transformation matrix from a 2x2 numpy array.
-        
-          a b
-          0 1
-
-        where a is scale and b is translation.
-        """
-        self._mtx = mtx
-        self.invalidate()
-        
-    def set(self, other):
-        """
-        Set this transformation from a frozen copy of another
-        Affine1DBase instance.
-        """
-        assert isinstance(other, Affine1DBase)
-        self._mtx = other.get_matrix()
-        self.invalidate()
-    
-    [EMAIL PROTECTED]
-    def identity():
-        """
-        Return a new Affine1D instance that is the identity transform.
-
-        Unless this transform will be mutated later on, consider using
-        the faster IdentityTransform class instead.
-        """
-        return Affine1D(npy.identity(2))
-    identity = staticmethod(identity)
-
-    def clear(self):
-        """
-        Resets this transformation back to the identity transform.
-        """
-        self._mtx = npy.identity(2)
-        self.invalidate()
-        return self
-    
-    def translate(self, t):
-        """
-        Add a translation t to this transform.
-
-        Returns self, so this method can easily be chained with more
-        calls to translate() and scale().
-        """
-        self._mtx[0, 1] += t
-        self.invalidate()
-        return self
-
-    def scale(self, s):
-        """
-        Add a scale s to this transform.
-
-        Returns self, so this method can easily be chained with more
-        calls to translate() and scale().
-        """
-        self._mtx[0, 0] *= s
-        self.invalidate()
-        return self
-
-    
-class IntervalTransform(Affine1DBase):
-    """
-    A 1D transformation that linearly transforms points along the
-    input interval (0.0, 1.0) to an arbitrary child interval.
-    """
-    def __init__(self, bbox, direction):
-        """
-        bbox: A Bbox instance containing the child interval.
-        direction: A string 'x' or 'y' indicating the interval of the
-                   bbox to use as the child interval.
-        """
-        assert direction in ('x', 'y')
-        assert bbox.is_bbox
-        
-        Affine1DBase.__init__(self)
-        self._bbox = bbox
-        self._direction = "interval" + direction
-        self.set_children(bbox)
-        self._mtx = None
-        
-    def __repr__(self):
-        return "IntervalTransform(%s)" % (getattr(self._bbox, self._direction))
-    __str__ = __repr__
-
-    def get_matrix(self):
-        if self._invalid:
-            vmin, vmax = getattr(self._bbox, self._direction)
-            self._mtx = inv(npy.array([[vmax - vmin, vmin],
-                                       [0.0, 1.0]], npy.float_))
-            self._inverted = None
-            self._invalid = 0
-        return self._mtx
-    get_matrix.__doc__ = Affine1DBase.get_matrix.__doc__
-
-    
 class Affine2DBase(AffineBase):
     """
     The base class of all 2D affine transformations.
@@ -1780,58 +1555,8 @@
             self._invalid = 0
         return self._affine
     get_affine.__doc__ = Transform.get_affine.__doc__
-
-
-class BlendedAffine1D(Affine2DBase):
-    """
-    A "blended" transform uses one transform for the x-direction, and
-    another transform for the y-direction.
-
-    This version is an optimization for the case where both child
-    transforms are of type Affine1DBase.
-    """
-    is_separable = True
     
-    def __init__(self, x_transform, y_transform):
-        """
-        Create a new "blended" transform using x_transform to
-        transform the x-axis and y_transform to transform the y_axis.
-
-        Both x_transform and y_transform must be 1D affine transforms.
-        
-        You will generally not call this constructor directly but use
-        the blended_transform_factory function instead, which can
-        determine automatically which kind of blended transform to
-        create.
-        """
-        assert isinstance(x_transform, Affine1DBase)
-        assert isinstance(y_transform, Affine1DBase)
-
-        Transform.__init__(self)
-        self._x = x_transform
-        self._y = y_transform
-        self.set_children(x_transform, y_transform)
-        
-        Affine2DBase.__init__(self)
-        self._mtx = None
-
-    def __repr__(self):
-        return "BlendedAffine1D(%s,%s)" % (self._x, self._y)
-    __str__ = __repr__
-        
-    def get_matrix(self):
-        if self._invalid:
-            x_mtx = self._x.get_matrix()
-            y_mtx = self._y.get_matrix()
-            self._mtx = npy.array([[x_mtx[0, 0], 0.0, x_mtx[0, 1]],
-                                   [0.0, y_mtx[0, 0], y_mtx[0, 1]],
-                                   [0.0, 0.0, 1.0]])
-            self._inverted = None
-            self._invalid = 0
-        return self._mtx
-    get_matrix.__doc__ = Affine2DBase.get_matrix.__doc__
     
-    
 class BlendedAffine2D(Affine2DBase):
     """
     A "blended" transform uses one transform for the x-direction, and
@@ -1900,9 +1625,6 @@
     if (isinstance(x_transform, Affine2DBase)
         and isinstance(y_transform, Affine2DBase)):
         return BlendedAffine2D(x_transform, y_transform)
-    elif (isinstance(x_transform, Affine1DBase)
-          and isinstance(y_transform, Affine1DBase)):
-        return BlendedAffine1D(x_transform, y_transform)
     return BlendedGenericTransform(x_transform, y_transform)
 
 
@@ -2235,7 +1957,7 @@
 
     bbox_copy = copy.deepcopy(bbox)
     assert (bbox.extents == bbox_copy.extents).all()
-    bbox_copy.max = (14, 15)
+    bbox_copy.p1 = (14, 15)
     assert bbox.bounds == (10, 11, 12, 13)
     assert bbox_copy.bounds == (10, 11, 4, 4)
     


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Matplotlib-checkins mailing list
Matplotlib-checkins@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to