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