2017-02-06 4 views
-3

Swigを使ってC++からPythonにベクトル(幾何ベクトル)クラスをラップする必要があります。このVector3クラスのコンストラクタの 一つは受け入れconst double*SWIG - 'const double *'をとるコンストラクタを使ってPythonにラップする方法

Vector3(const double* list); 

私はPythonでこれを行うことができるようにそれをラップしたいと思います:

vec = Vector3([1, 2, 3]) 

任意の提案を?

+0

は(HTTP私たちは、[チャットでこの議論を続ける]してみましょう。この例では、エラー簡潔にするためにチェックしないと、テストの目的のためにインラインクラスが含まれています注意してください.com/rooms/145385/discussion-between-flexo-and-dan-niero)。 – Flexo

答えて

5

は、私が使用して建設を支援

Vector(const double* list, size_t len); 

フル例にプロトタイプを変更推薦

import example 
v = example.Vector([1.0,2.0,3.0]) 

example.h

#pragma once 
#include <cstdlib> 

class Vector { 
public: 
    Vector(); 
    Vector(double x, double y, double z); 
    Vector(const double* list, size_t len); 
}; 

example.cpp

#include "example.h" 
#include <iostream> 

Vector::Vector() { 
    std::cout << "Vector()" << std::endl; 
} 

Vector::Vector(double x, double y, double z) { 
    std::cout << "Vector(double, double, double)" << std::endl; 
} 

Vector::Vector(const double* list, size_t len) { 
    std::cout << "Vector(const double*)" << std::endl; 
} 

example.i

%module example 
%{ 
#define SWIG_FILE_WITH_INIT 
#include "example.h" 
%} 

%include "numpy.i" 

%init { 
    import_array(); 
} 

%apply (double* IN_ARRAY1, size_t DIM1)   \ 
{(const double* list, size_t len)} 

%include "example.h" 

setup.py

from distutils.core import setup, Extension 

setup(name="example", 
     py_modules=['example'], 
     ext_modules=[Extension("_example", 
        ["example.i","example.cpp"], 
        swig_opts=['-c++'], 
       )]) 
+0

もしあなたが 'numpy.i'を見てlength引数をハードコードすることはできますが、実際にはこれをしないことをお勧めします –

+0

残念なことに2つの問題があります: 1 - 私はC++コードを変更できません。 2 - numpyは使用できません。 PythonコードをMayaという名前のソフトウェアで実行させる必要があります(3d computerアニメーションとfx用)。いくつかの近視眼的な開発のために、numpyのような特定のPythonライブラリは、ソフトウェアに埋め込まれたPythonに対してコンパイルすることはできません。 とにかく、あなたの詳細な回答に感謝します。もし誰も私があなたにできる返答をしないなら、私はあなたのことを確かに受け入れます。 –

+0

@ DanNiero:これは重要な制約です。あなたの質問にそれを含めてください。 –

4

あなたはconst double* listのために特定の入力タイプマップを書くことができます。

%module test 

%include <windows.i> 

%typemap(in) const double* list (double value[3]) %{ 
    for(Py_ssize_t i = 0; i < 3; ++i) 
     value[i] = PyFloat_AsDouble(PySequence_GetItem($input, i)); 
    $1 = value; 
%} 

%inline %{ 
#include <iostream> 
using namespace std; 

class __declspec(dllexport) Vector3 
{ 
    public: 
     Vector3(const double* list) 
     { 
      cout << list[0] << ',' << list[1] << ',' << list[2] << endl; 
     } 
}; 
%} 

出力:://chat.stackoverflow:

>>> import test 
>>> v = test.Vector3([1.1,2.2,3.3]) 
1.1,2.2,3.3 
+0

残念ながら、これは次のエラーをスローします。 NotImplementedError:オーバーロードされた関数 'new_Vector3'の引数またはタイプが間違っています。 可能なC/C++プロトタイプは次のとおりです。 gmath :: Vector3 :: Vector3 gmath :: Vector3 :: Vector3(double、double、double) gmath :: Vector3 :: Vector3(gmath :: Vector3 const&) gmath :: Vector3 :: Vector3(double const *) これはうまくいくはずですが、コンストラクタではありませんが、通常の方法ではうまくいくようです... –

+0

実際に試してみましたが、どちらの方法でも働かない。私の間違いは –

+1

の前に行ったと言っています。私はテストケースをコンパイルしていますので、出力が生成されますが、特定のクラスに関する詳細情報がなければ、 –

関連する問題