[vtkusers] stenciling problem-- is this code thread safe?

David Gobbi david.gobbi at gmail.com
Fri Feb 11 14:12:51 EST 2011


Just verify that the vtkGDCMPolyDataReader contains no polygons, i.e.
get its output and call output.GetPolys() and output.GetStrips().
Both of these should be null, because a single polygon or strip in the
polydata will keep the contour code from working.  The output of
GetLines() should, of course, not be null, since that is what
vtkPolyDataToImageStencil will use to create the stencil.

 - David

On Fri, Feb 11, 2011 at 12:05 PM, Mark Roden <mmroden at gmail.com> wrote:
> So in this code, which is using a vtkPolyData 'data' that is a series
> of xy contours along the z axis, as restored by the
> vtkGDCMPolyDataReader (and working in 5.6):
>
>
>
>        //vtk 5.9 no longer requires linear extrusion beforehand
>        //vtkLinearExtrusionFilter extruder = new vtkLinearExtrusionFilter();
>        //extruder.SetInput(data);
>        //extruder.SetVector(0, 0, spacing[2]);
>        //extruder.Update();
>        //vtkPolyData extruderOutput = extruder.GetOutput();
>
>        vtkPolyDataToImageStencil pol2Stenc = new vtkPolyDataToImageStencil();
>        pol2Stenc.SetTolerance(0);
>        //pol2Stenc.SetInput(extruderOutput);
>        pol2Stenc.SetInput(data);
>        pol2Stenc.SetInformationInput(binaryOrgan);
>        pol2Stenc.Update();
>        vtkImageStencilData pol2StencOutput = pol2Stenc.GetOutput();
>
>        vtkImageStencil stencil = new vtkImageStencil();
>        stencil.SetInput(binaryOrgan);
>        stencil.ReverseStencilOn();
>        stencil.SetStencil(pol2StencOutput);
>        stencil.Update();
>
>        final vtkImageData stencilOutput = stencil.GetOutput();
>        final vtkImageData imageToKeep = new vtkImageData();
>        imageToKeep.DeepCopy(stencilOutput);
>        stencilOutput.Delete();
>
> The result is a blank image.  Is there a call I'm missing here?
>
> On Fri, Feb 11, 2011 at 11:00 AM, David Gobbi <david.gobbi at gmail.com> wrote:
>> The vtkPolyDataToImageStencil in VTK 5.8 and 5.9 can take a polyline
>> contour or a stack of contours as input and create a stencil from
>> that.  Each polylines should lie in an XY plane (though they can be at
>> any Z position).  This will not work with a polygon; a polyline is
>> required.
>>
>>  - David
>>
>>
>> On Fri, Feb 11, 2011 at 11:51 AM, Mark Roden <mmroden at gmail.com> wrote:
>>> Hi David,
>>>
>>> How should the stenciling be done in vtk 5.9 then?  If I remove the
>>> linear extrusion, no masks are produced.
>>>
>>> This is exciting-- I can now use the vtkSmartVolumeMapper, which I've
>>> been drooling over ever since it was introduced!
>>>
>>> Thanks,
>>> Mark
>>>
>>> On Fri, Feb 11, 2011 at 10:39 AM, Mark Roden <mmroden at gmail.com> wrote:
>>>> wait, never mind!  I had some issues with vtk strings, but it appears
>>>> that this line:
>>>>
>>>> outWin.SetInstance(outWin);
>>>>
>>>> is now deprecated or something, because having that line active in this snippet:
>>>>
>>>>            vtkFileOutputWindow outWin = new vtkFileOutputWindow();
>>>>            outWin.SetInstance(outWin);
>>>>            outWin.SetFileName("MVSVTKViewer.log");
>>>>
>>>> throws this exception:
>>>>
>>>> Exception in thread "main" java.lang.NoSuchFieldError: vtkId
>>>>        at vtk.vtkOutputWindow.SetInstance_3(Native Method)
>>>>        at vtk.vtkOutputWindow.SetInstance(vtkOutputWindow.java:45)
>>>>        at com.mvs.viewer.Application.main(Application.java:63)
>>>>
>>>> But that's a different issue (bug?)
>>>>
>>>> On Fri, Feb 11, 2011 at 10:35 AM, David Gobbi <david.gobbi at gmail.com> wrote:
>>>>> If you are reporting the vtkLinearExtrusionFilter, I already did.
>>>>>
>>>>> On Fri, Feb 11, 2011 at 11:31 AM, Mark Roden <mmroden at gmail.com> wrote:
>>>>>> Hi David,
>>>>>>
>>>>>> Unfortunately,  the current vtk master branch is seriously broken in
>>>>>> its java wrappings.  I'm putting together a bug report now...
>>>>>>
>>>>>> Thanks,
>>>>>> Mark
>>>>>>
>>>>>> On Fri, Feb 11, 2011 at 10:09 AM, David Gobbi <david.gobbi at gmail.com> wrote:
>>>>>>> I should add: with the current VTK master and release branches,
>>>>>>> vtkPolyDataToImageStencil no longer requires vtkLinearExtrusionFilter
>>>>>>> to be used beforehand.  So you could try that.
>>>>>>>
>>>>>>>  - David
>>>>>>>
>>>>>>>
>>>>>>> On Fri, Feb 11, 2011 at 11:06 AM, David Gobbi <david.gobbi at gmail.com> wrote:
>>>>>>>> I was doubtful about the global memory, but I looked through the
>>>>>>>> filters just to be sure.  And guess what I found... here is some
>>>>>>>> highly suspect code in vtkLinearExtrusionFilter:
>>>>>>>>
>>>>>>>> double *vtkLinearExtrusionFilter::ViaNormal(double x[3], vtkIdType id,
>>>>>>>>                                           vtkDataArray *n)
>>>>>>>> {
>>>>>>>>  static double xNew[3], normal[3];
>>>>>>>>  int i;
>>>>>>>>
>>>>>>>>  n->GetTuple(id, normal);
>>>>>>>>  for (i=0; i<3; i++)
>>>>>>>>    {
>>>>>>>>    xNew[i] = x[i] + this->ScaleFactor*normal[i];
>>>>>>>>    }
>>>>>>>>
>>>>>>>>  return xNew;
>>>>>>>> }
>>>>>>>>
>>>>>>>> Code like the above is definitely going to cause thread problems.
>>>>>>>> And this isn't the only place in that class where code like this appears.
>>>>>>>>
>>>>>>>> Yikes!
>>>>>>>>
>>>>>>>>  - David
>>>>>>>>
>>>>>>>>
>>>>>>>> On Fri, Feb 11, 2011 at 10:46 AM, Mark Roden <mmroden at gmail.com> wrote:
>>>>>>>>> What I mean is, I have a vtkPolyData that has been DeepCopied and a
>>>>>>>>> vtkImageData that is binary and distinct from all other data.
>>>>>>>>>
>>>>>>>>> When I call the previously listed code with multiple threads (each
>>>>>>>>> with their own polydata and binary image to fill in), the result is
>>>>>>>>> generally a very garbled image.  If I call from a single thread in
>>>>>>>>> series, one for each polydata/image pair, then everything works out
>>>>>>>>> fine.
>>>>>>>>>
>>>>>>>>> So it seems to me that something in the above series isn't thread
>>>>>>>>> safe.  Each thread is declaring its own local objects, but is there
>>>>>>>>> some global memory that's being used or accessed here?
>>>>>>>>>
>>>>>>>>> On Fri, Feb 11, 2011 at 9:23 AM, David Gobbi <david.gobbi at gmail.com> wrote:
>>>>>>>>>> Hi Mark,
>>>>>>>>>>
>>>>>>>>>> Explain in more detail what you mean by "call from multiple threads".
>>>>>>>>>> VTK is, in general, not thread safe and you cannot call Update() on
>>>>>>>>>> a filter from more than one thread.  Each thread needs to have its own
>>>>>>>>>> set of filters.  And in general, you cannot feed a data object into more
>>>>>>>>>> than one thread, because even simple methods like GetBounds() are
>>>>>>>>>> not thread safe.
>>>>>>>>>>
>>>>>>>>>> When using VTK from multiple threads, it is necessary to apply
>>>>>>>>>> extreme caution.
>>>>>>>>>>
>>>>>>>>>>  - David
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On Fri, Feb 11, 2011 at 10:00 AM, Mark Roden <mmroden at gmail.com> wrote:
>>>>>>>>>>> Hi all,
>>>>>>>>>>>
>>>>>>>>>>> This code does not have threads enabled in vtk 5.6.1 (the code is in Java):
>>>>>>>>>>>
>>>>>>>>>>>        vtkLinearExtrusionFilter extruder = new vtkLinearExtrusionFilter();
>>>>>>>>>>>        extruder.SetInput(data);
>>>>>>>>>>>        extruder.SetVector(0, 0, spacing[2]);
>>>>>>>>>>>        extruder.Update();
>>>>>>>>>>>        vtkPolyData extruderOutput = extruder.GetOutput();
>>>>>>>>>>>
>>>>>>>>>>>        vtkPolyDataToImageStencil pol2Stenc = new vtkPolyDataToImageStencil();
>>>>>>>>>>>        pol2Stenc.SetTolerance(0);
>>>>>>>>>>>        pol2Stenc.SetInput(extruderOutput);
>>>>>>>>>>>        pol2Stenc.SetInformationInput(binaryOrgan);
>>>>>>>>>>>        pol2Stenc.Update();
>>>>>>>>>>>        vtkImageStencilData pol2StencOutput = pol2Stenc.GetOutput();
>>>>>>>>>>>
>>>>>>>>>>>        // This is where the memory leak is!!!!
>>>>>>>>>>>        vtkImageStencil stencil = new vtkImageStencil();
>>>>>>>>>>>        stencil.SetInput(binaryOrgan);
>>>>>>>>>>>        stencil.ReverseStencilOn();
>>>>>>>>>>>        stencil.SetStencil(pol2StencOutput);
>>>>>>>>>>>        stencil.Update();
>>>>>>>>>>>
>>>>>>>>>>>        // We're doing this because of an email to Mark
>>>>>>>>>>>        // that says this will fix our memory issues
>>>>>>>>>>>        final vtkImageData stencilOutput = stencil.GetOutput();
>>>>>>>>>>>        final vtkImageData imageToKeep = new vtkImageData();
>>>>>>>>>>>        imageToKeep.DeepCopy(stencilOutput);
>>>>>>>>>>>        stencilOutput.Delete();
>>>>>>>>>>>
>>>>>>>>>>> When I try to call this code from multiple threads (ie, to create the
>>>>>>>>>>> stencils for multiple organs), Bad Things happen, as in, the data are
>>>>>>>>>>> entirely corrupted.  Is this code thread safe?
>>>>>>>>>>>
>>>>>>>>>>> Mark
>>>>>>>>>>> _______________________________________________
>>>>>>>>>>> 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
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>



More information about the vtkusers mailing list