2010-12-02 11 views
1

Ich versuche herauszufinden, was falsch mit einigen selbstgenerierten (mit Pyste) Boost :: Python-Code ist, aber bisher kein Glück haben.Boost :: Python-Bindings für Klassen mit Vererbung

Es ist C++ Bibliothek, Magick ++, die zwei Klassen bietet, Magick::Drawable und 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 
{ ... } 

Diese werden als Argumente für Image.draw() verwendet: 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 Ich versuche Python Bindings dafür zu machen, da sind automatisch genned Wrapper für alle Klassen,

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

Problem ist, aufgrund indirekter Klasse wirft von DrawableBase zu Drawable, diese Wrapper nicht funktionieren:

>>> 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()) 
>>> 

Gibt es eine bessere Möglichkeit, dies zu handhaben, als meinen eigenen draw() -Wrapper in C + zu schreiben +, die PyObject in Drawable umwandeln würde?

+0

Dies sollte mit 'pyste' sowie 'boost-python' getaggt werden. –

+0

@Matthew, pyste wurde zuvor für Autogen-Code verwendet, wird aber jetzt gelöscht, und Code wird ohne es unterstützt. –

Antwort

1

Wenn Sie möchten, dass BP Objekte implizit konvertiert, müssen Sie BP mitteilen, dass diese implizit konvertierbar sind. setze so etwas in deinen bp :: code:

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

Ich weiß nicht, wie man Pyste dazu bringt.

+0

Vielen Dank, das hat tatsächlich irgendwie funktioniert. Es läuft gut, wenn ich 'implityly_convertible ', aber segfaults auf 'implicitly_convertible '. Na ja, das Kopieren aller Drawables wird es auch tun. –

+0

Hmm. Soweit ich weiß, sollte es funktionieren. Vielleicht ist der segfault in der Wrapped-Bibliothek? Oder vielleicht eine schlechte Interaktion. –

Verwandte Themen