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