[vtkusers] stenciling problem-- is this code thread safe?
David Gobbi
david.gobbi at gmail.com
Fri Feb 11 14:37:14 EST 2011
You could try vtkFeatureEdges. There is probably a better filter for
the job, but I don't know.
On Fri, Feb 11, 2011 at 12:25 PM, Mark Roden <mmroden at gmail.com> wrote:
> OK, so it looks like everything's coming back as polys instead of
> lines. What's the best way to proceed then, modify the reader to get
> just lines, or is there some way to convert from the polys to lines?
>
> On Fri, Feb 11, 2011 at 11:12 AM, David Gobbi <david.gobbi at gmail.com> wrote:
>> 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