2016-12-03 1 views
1

にコードを注入は、インターフェースを生成しました。SWIGTYPEの名前を変更し、私はSWIGを使用してJavaからOpenCasCade C++ライブラリにアクセスするために使用されるjCAE/occjavaを拡張しています生成されたクラス

C++側のオブジェクトのいくつかは、等価即ちオペレータ==を比較する必要があります。ライブラリのように使用されるクラスHandle_Standard_Type

具体例、すなわち多かれ少なかれ列挙等シングルトンを使用してダイナミック型情報を表現します。関連性があるとは思わないでください。ちょうど背景情報としてここに入れてください。

私はSWIG定義

%typemap(javacode) Handle_Standard_Type& %{ 
    public boolean equals(Object obj) { 
     boolean equal = false; 
     if (obj instanceof $javaclassname) 
     equal = ((($javaclassname)obj).swigCPtr == this.swigCPtr); 
     return equal; 
     } 
    %} 

と次のようにこの作業を行うことができますしかし、これは醜いクラス名SWIGTYPE_p_Handle_Standard_Typeを生成します。

私はたとえば、このために、私は見つけることができましたすべてのものを試してみました:

Remove SWIGTYPE from Generated Class name

しかし、私のように行うと示唆し、私のSWIGのDEFSに追加します。

class Handle_Standard_Type {} 

Iを醜い名前を取り除きますが、equals()メソッドはJavaクラスに注入されません。

さらに複雑なことは、OCCのクラスのほとんどが ハンドルを使用してアクセスされるため、各C++クラスExampleにはHandle_Exampleクラスがあることです。

%rename(Example) Handle_Example; 

だから私は最終的に生成されたJavaクラスをこの命名規則に従うことを私の解決策を必要とするので、代わりのHandle_Standard_Type:occjavaプロジェクトSWIGの定義は以下のように定義がたくさんあるJava側でその醜さを取り除くために 名前はStandard_Typeとする必要があります。

はここで、彼らが関連しているか、撮影したパスに影響を与える可能性がある場合には、いくつかの詳細です。ここ

はOCCでダイナミック型の動作またはより正確にそれがSWIGを使用してJavaからアクセスする方法方法の一例です。 SWIGで

我々はこのような定義があります:問題のクラスの型を表すシングルトンを返すSTANDARD_TYPE(Geom_Plane)上記(*self)->DynamicType()

%{ 
#include <Geom_Geometry.hxx> 
#include <Geom_Plane.hxx> 
%} 

%rename(Geom_Geometry) Handle_Geom_Geometry; 
%rename(Geom_Plane) Handle_Geom_Plane; 

%extend Handle_Geom_Geometry { 
const Handle_Standard_Type& DynamicType() 
    { 
     return (*self)->DynamicType(); 
    } 
} 

class Handle_Geom_Plane: public Handle_Geom_Geometry 
{ 
    Handle_Geom_Plane()=0; 
}; 

%extend Handle_Geom_Plane { 
    static const Handle_Standard_Type& STANDARD_TYPE() 
    { 
    return STANDARD_TYPE(Geom_Plane); 
    } 
} 

をして。そこには多くのマクロマジックが使われています。

Handle_Standard_Type&と一致するように意図された私のタイプマップの定義が、これについてはまったく正しい方法であるとは確信できないので、これらの詳細を示しています。

一番下の行は、C++側で私はSTANDARD_TYPE()マクロや関数DynamicTypeによって返された値にアクセスし、C ==の意味と同等のためequals()でJava側にそれらを比較する必要があるということです。"[email protected]" -listから助けを借りてこれを解決この

Geom_Surface aSurface = .... 
if (aSurface.DynamicType().equals(Geom_Plane.STANDARD_TYPE())) { 
    .... 
    } 

答えて

0

同様

クラス定義は、タイプマップ定義 の後に来る必要があります。

一般的なプログラミング言語であなたが
前にタイプを導入するので、私は間違ってそれが 範囲であるため、それらを使用するが、もちろん、ここで、それは他の方法でラウンドを動作するクラスDEFがタイプマップ 前にする必要があると仮定SWIGユーザーマニュアル「10.2.2タイプマップスコープ」で説明されているように重要なタイプマップのタイプ:

「一度定義されると、その後のすべての宣言に対してタイプマップが有効なままになります。以下は

は私のために働いたSWIGの定義である:それは行う必要が残っているので、1は、 equals()をオーバーライドする時はいつでも1も hashCode()を上書きするために忘れてはならないが、それは上記のすべての私の懸念に答える必要があります
%rename(Standard_Type) Handle_Standard_Type; 
%typemap(javacode) Handle_Standard_Type %{ 
    public boolean equals(Object obj) { 
    boolean equal = false; 
    if (obj instanceof $javaclassname) 
     equal = ((($javaclassname)obj).swigCPtr == this.swigCPtr); 
    return equal; 
    } 
%} 
class Handle_Standard_Type {}; 

Javaでは

私の元の質問。

関連する問題