John,
I will respond to the more philosophical parts of your message later.
I have committed changes to _transforms.* and transforms.py along the
lines of your suggestions for a quick improvement to the ease of drawing
with offsets.
> The best way may be for the extension code to provide a shallowcopy
> method and require derived transform classes to implement it. All
> references will be preserved, but a new object will be created.
>
> We only need this for SeparableTransformation and
> NonseparableTransformation but the methods will also have to be
> defined virtually in the base classes.
>
> We have to think about what should be preserved in the shallow
> copies. For the use case at hand, we want to preserve the references
> to the values but not the offset transform.
>
I think I got this right--or at least as right as the existing deepcopy
methods--but it would be good if you, or another c++ wizard, could take
a look. The way I have it seems to work as intended, but testing has
been light, and I don't really know c++. I have never written any from
scratch, only modified existing code.
> I'm not so sure that deepcopy is really needed. I can't think of a
> use case off hand.
I think it is needed for pickling, but I suspect that the screwiness of
the objects that the _transforms module produces would prevent pickling
in any case. Other than that, I don't see any point in the deepcopy
methods, or the corresponding (and redundant) deepcopy functions in
transforms.py. I marked with comments a block that I think should be
excised from transforms.py.
The convenience function I came up with is transforms.offset_copy:
def offset_copy(trans, fig=None, x=0, y=0, units='inches'):
'''
Return a shallow copy of a transform with an added offset.
args:
trans is any transform
kwargs:
fig is the current figure; it can be None if units are 'dots'
x, y give the offset in units of 'inches' or 'dots'
units is 'inches' or 'dots'
'''
newtrans = trans.shallowcopy()
if units == 'dots':
newtrans.set_offset((x,y), identity_transform())
return newtrans
if not units == 'inches':
raise ValueError('units must be dots or inches')
if fig is None:
raise ValueError('For units of inches a fig kwarg is needed')
tx = Value(x) * fig.dpi
ty = Value(y) * fig.dpi
newtrans.set_offset((0,0), translation_transform(tx, ty))
return newtrans
Minimal testing and illustration of the use of offsets is now in
examples/transoffset.py. It includes cartesian and polar coordinates.
Eric
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Matplotlib-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-devel