[vtkusers] stenciling problem-- is this code thread safe?
Mark Roden
mmroden at gmail.com
Fri Feb 11 14:05:24 EST 2011
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