2010-12-02 5 views
1

J'essaie de comprendre ce qui ne va pas avec du code boost :: python autogénéré (avec Pyste), mais je n'ai pas de chance jusqu'à maintenant.Boost :: Liaisons Python pour les classes avec héritage

Il y a bibliothèque C++, Magick ++, qui fournit deux classes, Magick::Drawable et Magick::DrawableRectangle:

https://www.imagemagick.org/subversion/ImageMagick/trunk/Magick++/lib/Magick++/Drawable.h

class MagickDLLDecl DrawableBase: 
    public std::unary_function<MagickCore::DrawingWand,void> 
{...} 
class MagickDLLDecl Drawable 
{ 
    public: 
    // Constructor 
    Drawable (void); 
    // Construct from DrawableBase 
    Drawable (const DrawableBase& original_); 
... 
} 
class MagickDLLDecl DrawableRectangle : public DrawableBase 
{ ... } 

sont utilisés comme arguments pour Image.draw(): https://www.imagemagick.org/subversion/ImageMagick/trunk/Magick++/lib/Magick++/Image.h

// Draw on image using a single drawable 
void   draw (const Drawable &drawable_); 
// Draw on image using a drawable list 
void   draw (const std::list<Magick::Drawable> &drawable_); 

I J'essaie de faire des liaisons python pour cela, il y a auto emballages genned pour toutes les classes,

http://bitbucket.org/dan.kluev/pythonmagick/src/65d45c998ef3/src/_Drawable.cpp

http://bitbucket.org/dan.kluev/pythonmagick/src/65d45c998ef3/src/_DrawableRectangle.cpp

http://bitbucket.org/dan.kluev/pythonmagick/src/65d45c998ef3/src/_Image.cpp

Le problème est, en raison de la classe indirecte des moulages de DrawableBase à Drawable, ces emballages ne fonctionnent pas:

>>> import PythonMagick 
>>> image = PythonMagick.Image() 
>>> square = PythonMagick._PythonMagick.DrawableRectangle(0,0,200,200) 
>>> image.draw(square) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
Boost.Python.ArgumentError: Python argument types in 
    Image.draw(Image, DrawableRectangle) 
did not match C++ signature: 
    draw(Magick::Image {lvalue}, std::list<Magick::Drawable, std::allocator<Magick::Drawable> >) 
    draw(Magick::Image {lvalue}, Magick::Drawable) 
# But abstract Drawable() does work: 
>>> image.draw(PythonMagick._PythonMagick.Drawable()) 
>>> 

Y at-il une meilleure façon de gérer cela que d'écrire mon propre wrapper draw() en C + +, qui jetterait PyObject en Drawable?

+0

Ceci devrait être étiqueté avec 'pyste' ainsi que 'boost-python'. –

+0

@Matthew, pyste a été utilisé auparavant pour le code autogen, mais il est abandonné maintenant, et le code est supporté. –

Répondre

1

Si vous voulez que BP convertisse implicitement des objets, vous devez indiquer à BP qu'il est implicitement convertible. mettre quelque chose comme ça dans votre bp :: code:

boost::python::implicitly_convertible<SourceType,DestType>(); 

Je ne sais pas comment induire Pyste pour ce faire.

+0

Merci beaucoup, cela a en effet fonctionné. Il fonctionne bien si je fais 'implicitly_convertible ', mais segfaults sur 'implicitly_convertible '. Eh bien, copypasser tous les Drawables le fera aussi. –

+0

Hmm. Pour autant que je sache, cela devrait fonctionner. Peut-être que la segfault est dans la bibliothèque enveloppée? Ou peut-être une mauvaise interaction. –

Questions connexes