[vtkusers] vtkobject Error trying to delete object with non zero reference count

Karthik Krishnan karthik.krishnan at kitware.com
Sun Sep 12 07:22:32 EDT 2010


It probably means that the object has no references holding on to it and is
hence destroyed by the GC. Try expanding its scope outside the function.


On Sun, Sep 12, 2010 at 3:40 PM, Ali Habib <ali.mahmoud.habib at gmail.com>wrote:

> Hi,
> I created my own pipeline to select part of *vtkboxwidget *and linear
> transfer it , as a source of linear deformation but the code through error
> :  trying to delete object with non zero reference count  at vtkobject.cxx
>
> any suggestion to solve that , the code I use is :
>         static vtkPolyData gpd;
>         static vtkLODActor selectActor;
>         static vtkLODActor maceActor;
>         static vtkLODActor selectActor_cutting;
>         static vtkPlanes planes;
>         static vtkClipPolyData clipper;
>         static vtkClipPolyData clipper_cutting;
>         // static vtkAppendPolyData apd;
>
>         static double[] center_Before = new double[3];
>         static double[] center_After = new double[3];
>
>         bool IsTransfer = false;
>
> void AddInputToWindow(vtk.vtkRenderWindow renWin, bool ISFirst)
>         {
>             /* vtk.vtkSphereSource cone = new vtk.vtkSphereSource();
>              cone.SetRadius(1.0f);*/
>
>             vtk.vtkDICOMImageReader VDR = new vtk.vtkDICOMImageReader();
>             VDR.SetDirectoryName(@"E:\Master
> Degree\DataSet\case2\DICOM\PA1\ST1\SE2");
>             VDR.SetDataOrigin(0, 0, 0);
>             VDR.Update();
>
>             // decrease the dataset data for large data preprocessing
>
>             vtkImageShrink3D VIS = new vtkImageShrink3D();
>             VIS.SetShrinkFactors(2, 2, 2);
>             VIS.SetInputConnection(VDR.GetOutputPort());
>             VIS.Update();
>
>             vtkImageThreshold VIT = new vtkImageThreshold();
>             VIT.ThresholdBetween(200, 2000);
>             VIT.SetInputConnection(VIS.GetOutputPort());
>             VIT.Update();
>
>             ///// Start the creation of volume rendering
>
>             //1. Gget the range of data
>             vtk.vtkImageChangeInformation VIC = new
> vtk.vtkImageChangeInformation();
>             VIC.SetInput(VDR.GetOutput());
>             VIC.CenterImageOn();
>             VIC.Update();
>
>             vtk.vtkImageData VoxelData = new vtk.vtkImageData();
>             VoxelData = VIC.GetOutput();
>
>             double[] metaScalarRange = VoxelData.GetScalarRange();
>
>
>             // Render the skin - Soft tissue
>             double isovalue = 0.8 * (metaScalarRange[1] +
> metaScalarRange[0]);
>
>
>             vtkContourFilter skinExtractor = new vtkContourFilter();
>             skinExtractor.SetInputConnection(VIT.GetOutputPort());
>             skinExtractor.SetValue(0, isovalue);
>             skinExtractor.ComputeGradientsOn();
>             skinExtractor.Update();
>
>             vtkPolyDataConnectivityFilter VPDC = new
> vtkPolyDataConnectivityFilter();
>             VPDC.SetInput(skinExtractor.GetOutput());
>             VPDC.SetExtractionModeToLargestRegion();
>             VPDC.Update();
>
>             gpd = VPDC.GetOutput();
>
>             /*gpd.Register(null);
>             gpd.SetSource(null);*/
>
>             vtk.vtkPolyDataMapper coneMapper = new vtk.vtkPolyDataMapper();
>             coneMapper.SetInput(gpd);
>             coneMapper.ScalarVisibilityOff();
>
>             maceActor = new vtkLODActor();
>             maceActor.SetMapper(coneMapper);
>             maceActor.GetProperty().SetColor(1, 0, 0);
>             //////////////////////// Selection Part
> /////////////////////////
>             planes = new vtkPlanes();
>
>             clipper = new vtkClipPolyData();
>             clipper.SetInput(gpd);
>             clipper.SetClipFunction(planes);
>             clipper.InsideOutOn();
>             clipper.Modified();
>             vtkPolyDataMapper selectMapper = new vtkPolyDataMapper();
>             selectMapper.SetInput(clipper.GetOutput());
>             selectMapper.ScalarVisibilityOff();
>
>             selectActor = new vtkLODActor();
>             selectActor.SetMapper(selectMapper);
>             selectActor.GetProperty().SetColor(0, 1, 0);
>             selectActor.VisibilityOff();
>             selectActor.SetScale(1.01, 1.01, 1.01);
>
>             /////////////////////// End of selection
> part////////////////////
>
>             //////////////////////////// Cutting part
> /////////////////////////////////
>
>
>             clipper_cutting = new vtkClipPolyData();
>             clipper_cutting.SetInput(gpd);
>             clipper_cutting.SetClipFunction(planes);
>             clipper_cutting.InsideOutOff();
>             clipper_cutting.GenerateClippedOutputOff();
>             clipper_cutting.Modified();
>             vtkPolyDataMapper selectMapper_cutting = new
> vtkPolyDataMapper();
>             selectMapper_cutting.SetInput(clipper_cutting.GetOutput());
>             selectMapper_cutting.ScalarVisibilityOff();
>
>             selectActor_cutting = new vtkLODActor();
>             selectActor_cutting.SetMapper(selectMapper_cutting);
>             selectActor_cutting.GetProperty().SetColor(1, 0, 0);
>             selectActor_cutting.VisibilityOff();
>             selectActor_cutting.SetScale(1.01, 1.01, 1.01);
>
>             //////////////////////////// End Cutting part
> //////////////////////////////////////
>             vtk.vtkRenderer ren1 = new vtk.vtkRenderer();
>
>             renWin.AddRenderer(ren1);
>             //ren1.SetBackground(0.0f, 0.0f, 0.0f);
>
>             vtkRenderWindowInteractor iren = new
> vtkRenderWindowInteractor();
>             iren.SetRenderWindow(renWin);
>
>
>
>             //The SetInteractor method is how 3D widgets are associated
> with the
>             //render window interactor.  Internally, SetInteractor sets up
> a bunch
>             //of callbacks using the Command/Observer mechanism
> (AddObserver()).
>             vtkBoxWidget boxWidget = new vtkBoxWidget();
>             boxWidget.SetInteractor(iren);
>             boxWidget.SetPlaceFactor(1.25);
>             boxWidget.TranslationEnabledOn();
>
>
>
>             ren1.AddActor(maceActor);
>             ren1.AddActor(selectActor);
>             ren1.AddActor(selectActor_cutting);
>
>             boxWidget.SetInput(gpd);
>             boxWidget.PlaceWidget();
>
>             boxWidget.AddObserver((uint)vtk.EventIds.StartInteractionEvent,
> new vtk.vtkDotNetCallback(StartInteractionEvent));
>             boxWidget.AddObserver((uint)vtk.EventIds.InteractionEvent, new
> vtk.vtkDotNetCallback(InteractionEvent));
>             boxWidget.AddObserver((uint)vtk.EventIds.EndInteractionEvent,
> new vtk.vtkDotNetCallback(EndInteractionEvent));
>
>
>             boxWidget.On();
>
>
>             renWin.AddRenderer(ren1);
>
>             GC.Collect();
>         }
>
>         ///////////////////////// Observation Events
> ///////////////////////////////////////////////////////////////////
>         ///////////////////////// Observation Events
> ///////////////////////////////////////////////////////////////////
>         public void StartInteractionEvent(vtk.vtkObject obj, uint eventId,
> Object data, IntPtr clientdata)
>         {
>             if (IsTransfer)
>             {
>                 vtkBoxWidget widget = vtkBoxWidget.SafeDownCast(obj);
>
>                 vtkPolyData before = new vtkPolyData();
>                 widget.GetPolyData(before); double[] x =
> before.GetPoints().GetBounds();
>                 center_Before = GetBoundsCenter(before.GetBounds());
>             }
>
>
>         }
>         public void InteractionEvent(vtk.vtkObject obj, uint eventId,
> Object data, IntPtr clientdata)
>         {
>             vtkBoxWidget widget = vtkBoxWidget.SafeDownCast(obj);
>             widget.GetPlanes(planes);
>
>             clipper.Modified();
>             clipper_cutting.Modified();
>
>             selectActor.VisibilityOn();
>             selectActor_cutting.VisibilityOn();
>
>
>
>         }
>         public void EndInteractionEvent(vtk.vtkObject obj, uint eventId,
> Object data, IntPtr clientdata)
>         {
>             if (IsTransfer)
>             {
>                 vtkBoxWidget widget = vtkBoxWidget.SafeDownCast(obj);
>                 vtkPolyData after = new vtkPolyData();
>                 widget.GetPolyData(after);
>                 center_After = GetBoundsCenter(after.GetBounds());
>
>
>                 ModifyData();
>                 selectActor.VisibilityOff();
>             }
>
>
>         }
>
>         private double[] GetBoundsCenter(double[] bounds)
>         {
>             double[] center = new double[3];
>
>             center[0] = (bounds[0] + bounds[1]) / 2.0;
>             center[1] = (bounds[2] + bounds[3]) / 2.0;
>             center[2] = (bounds[4] + bounds[5]) / 2.0;
>
>             return center;
>         }
>
>         private void ModifyData()
>         {
>             //////////////////////////////////////////////////////Just
> sugesstion ///////////////////////
>
>
>             double[] Displacement = { center_After[0] - center_Before[0],
> center_After[1] - center_Before[1], center_After[2] - center_Before[2] };
>
>             int NoOfPoints = clipper.GetOutput().GetNumberOfPoints();
>
>             for (int i = 0; i < NoOfPoints; i++)
>             {
>                 // get the point data from the clipper
>                 double[] ci = clipper.GetOutput().GetPoints().GetPoint(i);
>                 // get the index of the original data point.
>                 int pxi = gpd.FindPoint(ci);
>                 // get the value of the poly  data point.
>                 double[] ppi = gpd.GetPoints().GetPoint(pxi);
>                 // transpose the point
>                 ppi[0] += Displacement[0];
>                 ppi[1] += Displacement[1];
>                 ppi[2] += Displacement[2];
>                 // replace the point in the poly data
>                 gpd.GetPoints().InsertPoint(pxi, ppi);
>             }
>             // mark the poly data as modified for the render processing.
>
>
>             /*gpd.Register(null);
>             gpd.SetSource(null);*/
>
>             gpd.Modified();
>             GC.Collect();
>         }
>
> Best regards
>
>
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the VTK FAQ at:
> http://www.vtk.org/Wiki/VTK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.vtk.org/mailman/listinfo/vtkusers
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20100912/93b7a2be/attachment.htm>


More information about the vtkusers mailing list