0030115: Implementation of import from XCAF to VRML.
[occt.git] / samples / CSharp / OCCTProxy / OCCTProxy.cpp
index 7f07556..d333aa6 100644 (file)
@@ -32,6 +32,8 @@
 //wrapper of pure C++ classes to ref classes
 #include <NCollection_Haft.h>
 
+#include <vcclr.h>
+
 // list of required OCCT libraries
 #pragma comment(lib, "TKernel.lib")
 #pragma comment(lib, "TKMath.lib")
 #pragma comment(lib, "TKSTEP.lib")
 #pragma comment(lib, "TKStl.lib")
 #pragma comment(lib, "TKVrml.lib")
+#pragma comment(lib, "TKLCAF.lib")
+
+//! Auxiliary tool for converting C# string into UTF-8 string.
+static TCollection_AsciiString toAsciiString (String^ theString)
+{
+  if (theString == nullptr)
+  {
+    return TCollection_AsciiString();
+  }
+
+  pin_ptr<const wchar_t> aPinChars = PtrToStringChars (theString);
+  const wchar_t* aWCharPtr = aPinChars;
+  if (aWCharPtr == NULL
+  || *aWCharPtr == L'\0')
+  {
+    return TCollection_AsciiString();
+  }
+  return TCollection_AsciiString (aWCharPtr);
+}
 
 /// <summary>
 /// Proxy class encapsulating calls to OCCT C++ classes within 
@@ -93,14 +114,14 @@ public:
   /// Make dump of current view to file
   /// </summary>
   /// <param name="theFileName">Name of dump file</param>
-  bool Dump(char *theFileName)
+  bool Dump(const TCollection_AsciiString& theFileName)
   {
     if (myView().IsNull())
     {
       return false;
     }
     myView()->Redraw();
-    return myView()->Dump(theFileName) != Standard_False;
+    return myView()->Dump(theFileName.ToCString()) != Standard_False;
   }
 
   /// <summary>
@@ -133,6 +154,7 @@ public:
     if (!myView().IsNull())
     {
       myView()->SetComputedMode (Standard_False);
+      myView()->Redraw();
     }
   }
 
@@ -144,6 +166,7 @@ public:
     if (!myView().IsNull())
     {
       myView()->SetComputedMode (Standard_True);
+      myView()->Redraw();
     }
   }
 
@@ -164,7 +187,7 @@ public:
   /// <param name="theZoomFactor">Current zoom</param>
   void Place(int theX, int theY, float theZoomFactor)
   {    
-    Quantity_Factor aZoomFactor = theZoomFactor;
+    Standard_Real aZoomFactor = theZoomFactor;
     if (!myView().IsNull())
     {
       myView()->Place(theX, theY, aZoomFactor);
@@ -222,7 +245,7 @@ public:
   {
     if (!myAISContext().IsNull())
     {
-      myAISContext()->Select(theX1, theY1, theX2, theY2, myView());
+      myAISContext()->Select (theX1, theY1, theX2, theY2, myView(), Standard_True);
     }
   }
 
@@ -233,7 +256,7 @@ public:
   {
     if (!myAISContext().IsNull())
     {
-      myAISContext()->Select();
+      myAISContext()->Select (Standard_True);
     }
   }
 
@@ -244,7 +267,7 @@ public:
   {
     if ((!myAISContext().IsNull()) && (!myView().IsNull()))
     {
-      myAISContext()->MoveTo(theX, theY, myView());
+      myAISContext()->MoveTo (theX, theY, myView(), Standard_True);
     }
   }
 
@@ -255,7 +278,7 @@ public:
   {
     if ((!myAISContext().IsNull()) && (!myView().IsNull()))
     {
-      myAISContext()->ShiftSelect(theX1, theY1, theX2, theY2, myView());
+      myAISContext()->ShiftSelect (theX1, theY1, theX2, theY2, myView(), Standard_True);
     }
   }
 
@@ -266,7 +289,7 @@ public:
   {
     if (!myAISContext().IsNull())
     {
-      myAISContext()->ShiftSelect();
+      myAISContext()->ShiftSelect (Standard_True);
     }
   }
 
@@ -463,15 +486,15 @@ public:
       aCurrentMode=AIS_Shaded;
     }
 
-    if(myAISContext()->NbCurrents()==0 || myAISContext()->NbSelected()==0)
+    if(myAISContext()->NbSelected()==0)
     {
-       myAISContext()->SetDisplayMode(aCurrentMode);
+       myAISContext()->SetDisplayMode (aCurrentMode, Standard_False);
     }
     else 
     {
-       for(myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent())
+       for(myAISContext()->InitSelected(); myAISContext()->MoreSelected(); myAISContext()->NextSelected())
        {
-         myAISContext()->SetDisplayMode(myAISContext()->Current(), theMode, Standard_False);
+         myAISContext()->SetDisplayMode (myAISContext()->SelectedInteractive(), theMode, Standard_False);
        }
     }
     myAISContext()->UpdateCurrentViewer();
@@ -487,10 +510,11 @@ public:
       return;
     }
     Quantity_Color aCol =  Quantity_Color(theR/255.,theG/255.,theB/255.,Quantity_TOC_RGB);
-    for (;myAISContext()->MoreCurrent ();myAISContext()->NextCurrent ())
+    for (; myAISContext()->MoreSelected(); myAISContext()->NextSelected())
     {
-      myAISContext()->SetColor (myAISContext()->Current(),aCol.Name());
+      myAISContext()->SetColor (myAISContext()->SelectedInteractive(), aCol, Standard_False);
     }
+    myAISContext()->UpdateCurrentViewer();
   }
 
   /// <summary>
@@ -526,17 +550,17 @@ public:
     theGreen=255;
     theBlue=255;
     Handle(AIS_InteractiveObject) aCurrent ;
-    Quantity_Color anObjCol;
-    myAISContext()->InitCurrent();
-    if (!myAISContext()->MoreCurrent())
+    myAISContext()->InitSelected();
+    if (!myAISContext()->MoreSelected())
     {
       return;
     }
-    aCurrent = myAISContext()->Current();
+    aCurrent = myAISContext()->SelectedInteractive();
     if ( aCurrent->HasColor () ) 
     {
-      anObjCol = myAISContext()->Color(myAISContext()->Current());
-      Quantity_Parameter r1, r2, r3;
+      Quantity_Color anObjCol;
+      myAISContext()->Color (aCurrent, anObjCol);
+      Standard_Real r1, r2, r3;
       anObjCol.Values(r1, r2, r3, Quantity_TOC_RGB);
       theRed=(int)r1*255;
       theGreen=(int)r2*255;
@@ -575,8 +599,8 @@ public:
       return;
     }
 
-    myAISContext()->EraseSelected (Standard_True);
-    myAISContext()->ClearCurrents();
+    myAISContext()->EraseSelected (Standard_False);
+    myAISContext()->ClearSelected (Standard_True);
   }
 
   /// <summary>
@@ -596,9 +620,9 @@ public:
     {
       return;
     }
-    for ( myAISContext()->InitCurrent(); myAISContext()->MoreCurrent (); myAISContext()->NextCurrent () )
+    for (myAISContext()->InitSelected(); myAISContext()->MoreSelected(); myAISContext()->NextSelected())
     {
-      myAISContext()->SetMaterial( myAISContext()->Current(), (Graphic3d_NameOfMaterial)theMaterial );
+      myAISContext()->SetMaterial (myAISContext()->SelectedInteractive(), (Graphic3d_NameOfMaterial)theMaterial, Standard_False);
     }
     myAISContext()->UpdateCurrentViewer();
   }
@@ -612,10 +636,11 @@ public:
     {
       return;
     }
-    for( myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextSelected() )
+    for( myAISContext()->InitSelected(); myAISContext()->MoreSelected(); myAISContext()->NextSelected() )
     {
-      myAISContext()->SetTransparency( myAISContext()->Current(), ((Standard_Real)theTrans) / 10.0 );
+      myAISContext()->SetTransparency (myAISContext()->SelectedInteractive(), ((Standard_Real)theTrans) / 10.0, Standard_False);
     }
+    myAISContext()->UpdateCurrentViewer();
   }
 
   /// <summary>
@@ -627,8 +652,8 @@ public:
     {
       return false;
     }
-    myAISContext()->InitCurrent();
-    return myAISContext()->MoreCurrent() != Standard_False;
+    myAISContext()->InitSelected();
+    return myAISContext()->MoreSelected() != Standard_False;
   }
 
   /// <summary>
@@ -643,13 +668,13 @@ public:
     int aMode = -1;
     bool OneOrMoreInShading = false;
     bool OneOrMoreInWireframe = false;
-    for (myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent())
+    for (myAISContext()->InitSelected(); myAISContext()->MoreSelected(); myAISContext()->NextSelected())
     {
-      if ( myAISContext()->IsDisplayed( myAISContext()->Current(), 1 ) )
+      if ( myAISContext()->IsDisplayed( myAISContext()->SelectedInteractive(), 1 ) )
       {
         OneOrMoreInShading = true;
       }
-      if ( myAISContext()->IsDisplayed( myAISContext()->Current(), 0 ) )
+      if ( myAISContext()->IsDisplayed( myAISContext()->SelectedInteractive(), 0 ) )
       {
         OneOrMoreInWireframe = true;
       }
@@ -727,37 +752,24 @@ public:
   /// <param name="theFileName">Name of import file</param>
   bool ImportBrep(System::String^ theFileName)
   {
-    bool isResult = false;
-    int aLength = theFileName->Length;
-    char* aFilename = new char[aLength+1];
-    for(int i = 0; i<aLength; i++)
-    {
-      aFilename[i] = (char)theFileName->ToCharArray()[i];
-    }
-    aFilename[aLength] = '\0';
-    isResult = ImportBrep(aFilename);
-    return isResult;
+    return ImportBrep (toAsciiString (theFileName));
   }
 
   /// <summary>
   ///Import BRep file
   /// </summary>
   /// <param name="theFileName">Name of import file</param>
-  bool ImportBrep(char* theFileName)
+  bool ImportBrep (const TCollection_AsciiString& theFileName)
   {
-    Standard_CString aFileName = (Standard_CString) theFileName;
     TopoDS_Shape aShape;
     BRep_Builder aBuilder;
-    Standard_Boolean isResult = BRepTools::Read(aShape,aFileName,aBuilder);
+    Standard_Boolean isResult = BRepTools::Read(aShape,theFileName.ToCString(),aBuilder);
     if (!isResult)
     {
       return false;
     }
-    if(myAISContext()->HasOpenedContext())
-    {
-      myAISContext()->CloseLocalContext();
-    }
-    myAISContext()->Display(new AIS_Shape(aShape));
+
+    myAISContext()->Display (new AIS_Shape (aShape), Standard_True);
     return true;
   }
 
@@ -765,11 +777,10 @@ public:
   ///Import Step file
   /// </summary>
   /// <param name="theFileName">Name of import file</param>
-  bool ImportStep(char* theFileName)
+  bool ImportStep(const TCollection_AsciiString& theFileName)
   {
-    Standard_CString aFileName = (Standard_CString) theFileName;
     STEPControl_Reader aReader;
-    IFSelect_ReturnStatus aStatus = aReader.ReadFile(aFileName);
+    IFSelect_ReturnStatus aStatus = aReader.ReadFile(theFileName.ToCString());
     if ( aStatus == IFSelect_RetDone )
     {
       bool isFailsonly = false;
@@ -786,8 +797,9 @@ public:
           for ( int i = 1; i <= aNbShap; i++ )
           {
             TopoDS_Shape aShape = aReader.Shape( i );
-            myAISContext()->Display(new AIS_Shape(aShape));
+            myAISContext()->Display (new AIS_Shape (aShape), Standard_False);
           }
+          myAISContext()->UpdateCurrentViewer();
         }
       }
     }
@@ -803,17 +815,16 @@ public:
   ///Import Iges file
   /// </summary>
   /// <param name="theFileName">Name of import file</param>
-  bool ImportIges(char* theFileName)
+  bool ImportIges(const TCollection_AsciiString& theFileName)
   {
-    Standard_CString aFileName = (Standard_CString) theFileName;
     IGESControl_Reader aReader;
-    int aStatus = aReader.ReadFile( aFileName );
+    int aStatus = aReader.ReadFile( theFileName.ToCString() );
 
     if ( aStatus == IFSelect_RetDone )
     {
       aReader.TransferRoots();
       TopoDS_Shape aShape = aReader.OneShape();
-      myAISContext()->Display(new AIS_Shape(aShape));
+      myAISContext()->Display (new AIS_Shape (aShape), Standard_False);
     }
     else
     {
@@ -828,31 +839,31 @@ public:
   ///Export BRep file
   /// </summary>
   /// <param name="theFileName">Name of export file</param>
-  bool ExportBRep(char* theFileName)
+  bool ExportBRep(const TCollection_AsciiString& theFileName)
   {
-    myAISContext()->InitCurrent();
-    if (!myAISContext()->MoreCurrent())
+    myAISContext()->InitSelected();
+    if (!myAISContext()->MoreSelected())
     {
       return false;
     }
 
-    Handle(AIS_InteractiveObject) anIO = myAISContext()->Current();
+    Handle(AIS_InteractiveObject) anIO = myAISContext()->SelectedInteractive();
     Handle(AIS_Shape) anIS = Handle(AIS_Shape)::DownCast(anIO);
-    return BRepTools::Write (anIS->Shape(), (Standard_CString)theFileName) != Standard_False;
+    return BRepTools::Write (anIS->Shape(), theFileName.ToCString()) != Standard_False;
   }
 
   /// <summary>
   ///Export Step file
   /// </summary>
   /// <param name="theFileName">Name of export file</param>
-  bool ExportStep(char* theFileName)
+  bool ExportStep(const TCollection_AsciiString& theFileName)
   {
     STEPControl_StepModelType aType = STEPControl_AsIs;
     IFSelect_ReturnStatus aStatus;
     STEPControl_Writer aWriter;
-    for ( myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent() )
+    for ( myAISContext()->InitSelected(); myAISContext()->MoreSelected(); myAISContext()->NextSelected() )
     {
-      Handle(AIS_InteractiveObject) anIO = myAISContext()->Current();
+      Handle(AIS_InteractiveObject) anIO = myAISContext()->SelectedInteractive();
       Handle(AIS_Shape) anIS=Handle(AIS_Shape)::DownCast(anIO);
       TopoDS_Shape aShape = anIS->Shape();
       aStatus = aWriter.Transfer( aShape , aType );
@@ -862,7 +873,7 @@ public:
       }
     }
 
-    aStatus = aWriter.Write( (Standard_CString)theFileName );
+    aStatus = aWriter.Write(theFileName.ToCString());
     if ( aStatus != IFSelect_RetDone )
     {
       return false;
@@ -875,37 +886,37 @@ public:
   ///Export Iges file
   /// </summary>
   /// <param name="theFileName">Name of export file</param>
-  bool ExportIges(char* theFileName)
+  bool ExportIges(const TCollection_AsciiString& theFileName)
   {
     IGESControl_Controller::Init();
     IGESControl_Writer aWriter( Interface_Static::CVal( "XSTEP.iges.unit" ),
       Interface_Static::IVal( "XSTEP.iges.writebrep.mode" ) );
 
-    for ( myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent() )
+    for ( myAISContext()->InitSelected(); myAISContext()->MoreSelected(); myAISContext()->NextSelected() )
     {
-      Handle(AIS_InteractiveObject) anIO = myAISContext()->Current();
+      Handle(AIS_InteractiveObject) anIO = myAISContext()->SelectedInteractive();
       Handle(AIS_Shape) anIS=Handle(AIS_Shape)::DownCast(anIO);
       TopoDS_Shape aShape = anIS->Shape();
       aWriter.AddShape ( aShape );
     }
 
     aWriter.ComputeModel();
-    return aWriter.Write( (Standard_CString)theFileName) != Standard_False;
+    return aWriter.Write(theFileName.ToCString()) != Standard_False;
   }
 
   /// <summary>
   ///Export Vrml file
   /// </summary>
   /// <param name="theFileName">Name of export file</param>
-  bool ExportVrml(char* theFileName)
+  bool ExportVrml(const TCollection_AsciiString& theFileName)
   {
     TopoDS_Compound aRes;
     BRep_Builder aBuilder;
     aBuilder.MakeCompound( aRes );
 
-    for ( myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent() )
+    for ( myAISContext()->InitSelected(); myAISContext()->MoreSelected(); myAISContext()->NextSelected() )
     {
-      Handle(AIS_InteractiveObject) anIO = myAISContext()->Current();
+      Handle(AIS_InteractiveObject) anIO = myAISContext()->SelectedInteractive();
       Handle(AIS_Shape) anIS=Handle(AIS_Shape)::DownCast(anIO);
       TopoDS_Shape aShape = anIS->Shape();
       if ( aShape.IsNull() )
@@ -917,7 +928,7 @@ public:
     }
 
     VrmlAPI_Writer aWriter;
-    aWriter.Write( aRes, (Standard_CString)theFileName );
+    aWriter.Write(aRes, theFileName.ToCString());
 
     return true;
   }
@@ -926,15 +937,15 @@ public:
   ///Export Stl file
   /// </summary>
   /// <param name="theFileName">Name of export file</param>
-  bool ExportStl(char* theFileName)
+  bool ExportStl(const TCollection_AsciiString& theFileName)
   {
     TopoDS_Compound aComp;
     BRep_Builder aBuilder;
     aBuilder.MakeCompound( aComp );
 
-    for ( myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent() )
+    for ( myAISContext()->InitSelected(); myAISContext()->MoreSelected(); myAISContext()->NextSelected() )
     {
-      Handle(AIS_InteractiveObject) anIO = myAISContext()->Current();
+      Handle(AIS_InteractiveObject) anIO = myAISContext()->SelectedInteractive();
       Handle(AIS_Shape) anIS=Handle(AIS_Shape)::DownCast(anIO);
       TopoDS_Shape aShape = anIS->Shape();
       if ( aShape.IsNull() ) 
@@ -945,7 +956,7 @@ public:
     }
 
     StlAPI_Writer aWriter;
-    aWriter.Write( aComp, (Standard_CString)theFileName );
+    aWriter.Write(aComp, theFileName.ToCString());
     return true;
   }
 
@@ -958,14 +969,8 @@ public:
   bool TranslateModel(System::String^ theFileName, int theFormat, bool theIsImport)
   {
     bool isResult;
-    int aLength = theFileName->Length;
-    char* aFilename = new char[aLength+1];
-    for(int i = 0; i<aLength; i++)
-    {
-      aFilename[i] = (char)theFileName->ToCharArray()[i];
-    }
-    aFilename[aLength] = '\0';
 
+    const TCollection_AsciiString aFilename = toAsciiString (theFileName);
     if (theIsImport)
     {
       switch(theFormat)