[vtkusers] stenciling problem-- is this code thread safe?
David Gobbi
david.gobbi at gmail.com
Fri Feb 11 14:57:52 EST 2011
I gotta ask... did you call theEdges.Update() before checking the output?
On Fri, Feb 11, 2011 at 12:49 PM, Mark Roden <mmroden at gmail.com> wrote:
> Yeah, that doesn't work.
>
> vtkCellArray thePolys = data.GetPolys();
> vtkCellArray theStrips = data.GetStrips();
> vtkCellArray theLines = data.GetLines();
>
> vtkFeatureEdges theEdges = new vtkFeatureEdges();
> theEdges.BoundaryEdgesOn();
> theEdges.ManifoldEdgesOn();
> theEdges.NonManifoldEdgesOn();
> theEdges.FeatureEdgesOn();
> theEdges.SetInput(data);
> vtkPolyData theEdgeData = theEdges.GetOutput();
>
> thePolys = theEdgeData.GetPolys();
> theStrips = theEdgeData.GetStrips();
> theLines = theEdgeData.GetLines();
>
> thePolys, theStrips, and theLines are all zero-sized once
> theFeatureEdges filter is run, but thePolys has 25 points (for my test
> data) prior to running.
>
>
>
>
> On Fri, Feb 11, 2011 at 11:37 AM, David Gobbi <david.gobbi at gmail.com> wrote:
>> 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