0

I'm trying to use opencascade from C#. I have started from the .NET example with the OCCTProxy. To keep track of the shapes created i use this class, NativeWrapper, to keep a pointer to the objects.

public ref class NativeWrapper
{
  public:
     NativeWrapper();

     // Allocate the native object on the C++ Heap via a constructor
     NativeWrapper(void* topoDs) : m_Impl(topoDs) {}

     // Deallocate the native object on a destructor
     ~NativeWrapper() {
          delete m_Impl;
     }

  protected:
     // Deallocate the native object on the finalizer just in case no destructor is called
     !NativeWrapper() {
          delete m_Impl;
     }

  public:
     void* GetPointer() { return m_Impl; }

  private:
     void* m_Impl;
};

Here the shape is drawn and the NativeWrapper is set as a tag on the treenode

TopoDS_Shape MakeBox(Standard_Real x0, Standard_Real y0, Standard_Real z0, Standard_Real xDelta, Standard_Real yDelta, Standard_Real zDelta)
{
     gp_Pnt center(x0, y0, z0);
     BRepPrimAPI_MakeBox mkBox(center, xDelta, yDelta, zDelta);
     TopoDS_Shape shape = mkBox.Shape();
     return shape;
}

NativeWrapper^ DrawBox(Standard_Real x0, Standard_Real y0, Standard_Real z0, Standard_Real xDelta, Standard_Real yDelta, Standard_Real zDelta)
{
     TopoDS_Shape shape = MakeBox(x0, y0, z0, xDelta, yDelta, zDelta);
     myAISContext()->Display(new AIS_Shape(shape));
     TopoDS_Shape* retVal = new TopoDS_Shape(shape);
     NativeWrapper ^f = gcnew NativeWrapper(retVal);
     return f;
}     

private void ribbonButtonAddBox_Click(object sender, EventArgs e)
{
     var dlg = new DrawCubeDialog();
     dlg.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
     if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
     {
          var data = dlg.CubeData;
          var o = Viewer.DrawCube(data.Name, data.Point, data.XDelta, data.YDelta, data.ZDelta);
          treeNodePrimitives.Nodes.Add(new TreeNode(data.Name) { Tag = o });
     }
}

But when i try to use the object i get this exception

System.AccessViolationException was unhandled Message=Attempted to read or write protected memory. This is often an indication that other memory is corrupt. Source=OCCTProxy StackTrace: at Handle_Standard_Transient.BeginScope(Handle_Standard_Transient* ) at Handle_Standard_Transient.{ctor}(Handle_Standard_Transient* , Handle_Standard_Transient* aTid) in c:\opencascade6.7.0\opencascade-6.7.0\inc\handle_standard_transient.hxx:line 82 at Handle_MMgt_TShared.{ctor}(Handle_MMgt_TShared* , Handle_MMgt_TShared* aHandle) in c:\opencascade6.7.0\opencascade-6.7.0\inc\handle_mmgt_tshared.hxx:line 25 at Handle_TopoDS_TShape.{ctor}(Handle_TopoDS_TShape* , Handle_TopoDS_TShape* aHandle) in c:\opencascade6.7.0\opencascade-6.7.0\inc\handle_topods_tshape.hxx:line 25 at TopoDS_Shape.{ctor}(TopoDS_Shape* , TopoDS_Shape* A_0) ...

NativeWrapper^ Partition(void* objA, void* objB)
{
     TopoDS_Shape* p_A = static_cast<TopoDS_Shape*>(objA);
     TopoDS_Shape* p_B = static_cast<TopoDS_Shape*>(objB);

     TopoDS_Shape a = *p_A;
     TopoDS_Shape b = *p_B;

     BOPAlgo_Builder aBuilder;
     aBuilder.AddArgument(a);
     aBuilder.AddArgument(b);
     aBuilder.Perform();
     Standard_Integer iErr = aBuilder.ErrorStatus();
     if (iErr)
     {
          // TODO: HANDLE ERROR
     }
     const TopoDS_Shape& shape = aBuilder.Shape();
     TopoDS_Shape retVal = shape;

     ClearView();
     Draw(retVal);

     NativeWrapper ^f = gcnew NativeWrapper(&retVal);
     return f;
}

Any one who can explain to me what is going wrong here, and how to do this right?

Any help much appreciated :)

Rakib
  • 7,435
  • 7
  • 29
  • 45
  • The stack trace of the exception appears to have *very* little to do with the code you posted. The point of any library named "open" is that you can use its source code to debug and fix the bugs in the library. – Hans Passant Jun 02 '14 at 08:48
  • My C++ dll and C# dll got out of sync. Now it works :) – Henrik Rune Jakobsen Jun 02 '14 at 09:30

0 Answers0