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

Ali Habib ali.mahmoud.habib at gmail.com
Mon Sep 13 02:16:29 EDT 2010


Dear Karthik

thanks alot ,

 it worked very well

but I have another problem with the code I sent  , which is when trying to
read large DICOm data (481 file ) it crash I use vista 32 bit , and 4 GB RAM

Best regards

On Sun, Sep 12, 2010 at 2:22 PM, Karthik Krishnan <
karthik.krishnan at kitware.com> wrote:

> 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/20100913/f8ee5e97/attachment.htm>


More information about the vtkusers mailing list