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

Mark Roden mmroden at gmail.com
Fri Feb 11 17:54:26 EST 2011


Ah, I will almost definitely have multiple contours per slice.  Thanks
for the warning, I'll go back to the old way for now.


On Fri, Feb 11, 2011 at 2:43 PM, David Gobbi <david.gobbi at gmail.com> wrote:
> Yeah, it should be Lasso.  It looked just a little wrong to me but
> if you hadn't mentioned it to me I wouldn't have checked.  I'm
> pretty sure Kitware will allow me to fix my typo before VTK 5.8
> is finalized.
>
> Good luck.  But before you try Lasso, I do have one caveat
> about it, too.  It only allows one contour per slice, and I
> suspect that if you are reading contours from DICOM files,
> there is the possibility that you will have multiple contours
> per slice.  (You're always welcome to dig into the VTK
> classes and add features to fit your requirements).
>
>  - David
>
>
> On Fri, Feb 11, 2011 at 3:24 PM, Mark Roden <mmroden at gmail.com> wrote:
>> Hi David,
>>
>> That's not working either.
>>
>> I'm going to have to really debug what's going on here.  I literally
>> just swapped out libraries, and what was getting displayed before is
>> now not getting displayed at all.  I just tried the lasso tool (is it
>> lassoo or lasso? wikipedia redirects lassoo to lasso) and that didn't
>> change anything.  I might have something busted on my end that was
>> exploiting some corner case in 5.6 that's now gone in 5.9.
>>
>> Thanks,
>> Mark
>>
>> On Fri, Feb 11, 2011 at 1:56 PM, David Gobbi <david.gobbi at gmail.com> wrote:
>>> I should add: vtkLassooStencilSource is not only much more
>>> efficient than vtkPolyDataToImageStencil, but it is also much
>>> more robust.  Internally it is simpler and has fewer heuristics.
>>>
>>>  - David
>>>
>>>
>>> On Fri, Feb 11, 2011 at 2:48 PM, David Gobbi <david.gobbi at gmail.com> wrote:
>>>> The old code shouldn't break, it didn't break any of the
>>>> regression tests at least.  To be safe, you should be using
>>>> vtkTransformToPolyDataFilter to add a shift to the extruded
>>>> data, just like the TestImageTracerWidget.
>>>>
>>>> Your other option is to use vtkLassoStencilSource (new in VTK 5.8)
>>>> instead of vtkPolyDataToImageStencil.  It requires you to build
>>>> your own contours (it takes a list of points as input) but it is more
>>>> efficient than vtkPolyDataToImageStencil and it can take x-aligned
>>>> and y-aligned contours as well as z-aligned.  It has a
>>>> SetSliceOrientation() method to allow you to set the orientation.
>>>>
>>>>  - David
>>>>
>>>>
>>>> On Fri, Feb 11, 2011 at 2:33 PM, Mark Roden <mmroden at gmail.com> wrote:
>>>>> I guess the question is why the 5.6 method doesn't work with 5.9, if
>>>>> the extrusion/polydatatostencil/stencil pipeline should be good-- ie,
>>>>> if I have contours drawn along the x plane, I'll need this
>>>>> non-z-stacking approach to work (and I do have such contours).  Our
>>>>> app allows users to draw their contours on any plane, so the z-aligned
>>>>> contour assumption isn't entirely useful to me.
>>>>>
>>>>> It looks like there's a noop happening somewhere, as if the something
>>>>> in that pipeline just decided that because there are only polys (or
>>>>> something similar), it's not going to do the work.  If polys are still
>>>>> a valid input, then why should the old code break?
>>>>>
>>>>> On Fri, Feb 11, 2011 at 1:24 PM, David Gobbi <david.gobbi at gmail.com> wrote:
>>>>>> Ah, it looks like TestImageTracerWidget.cxx uses slices that
>>>>>> aren't parallel to the XY plane... so it actually has to use the
>>>>>> old extrusion method to prepare the data.
>>>>>>
>>>>>>  - David
>>>>>>
>>>>>>
>>>>>> On Fri, Feb 11, 2011 at 1:57 PM, David Gobbi <david.gobbi at gmail.com> wrote:
>>>>>>> I was recommending that you visualize the contours as polydata,
>>>>>>> so telling me that you are still getting blank images doesn't help
>>>>>>> to move things forward.
>>>>>>>
>>>>>>> PolyDataToImageStencil still works on polys. It has two modes:
>>>>>>> it can be given a closed polyhedral surface (like before) or,
>>>>>>> in VTK 5.8 and 5.9, it can be given a set of polyline contours.
>>>>>>> But if its input contains any polys, then it will ignore the polylines.
>>>>>>> And if given a set of polys that do not form a closed surface, it
>>>>>>> will usually not work (this depends on the orientation of the polys).
>>>>>>> Given a single, flat poly it will never work, if given polys the polys
>>>>>>> must define an enclosed volume.
>>>>>>>
>>>>>>> The vtkImageTracer widget has not been updated recently, so
>>>>>>> it still uses extrusion in order to generate a surface, instead of
>>>>>>> using the more efficient contour-to-stencil conversion.
>>>>>>>
>>>>>>> The contours should be closed and connected, which they should
>>>>>>> be if they are generated from polygon edges, but vtkCleanPolyData
>>>>>>> can be used as further insurance.  An example of contour use is
>>>>>>> Hybrid/Testing/Tcl/TestImageStencilWithPolydata.tcl
>>>>>>>
>>>>>>> But I've gone ahead and merged a patch for the vtkLinearExtrusion
>>>>>>> multithreading bug.  I'd prefer if you continued to diagnose the
>>>>>>> contour issue and get it working that way, but that's up to you.
>>>>>>>
>>>>>>>  - David
>>>>>>>
>>>>>>>
>>>>>>> On Fri, Feb 11, 2011 at 1:34 PM, Mark Roden <mmroden at gmail.com> wrote:
>>>>>>>> Hi David,
>>>>>>>>
>>>>>>>> Yes, I'm feeding these things into a visualizer.  It's the same code
>>>>>>>> path as when I was using 5.6, in that it's going right into a mapper
>>>>>>>> to an actor to a renderer.  I'm getting blank images.
>>>>>>>>
>>>>>>>> I'm wondering if it could be easier to avoid this extra filter (that
>>>>>>>> seems to have some kind of angle threshold?) and just redo the gdcm
>>>>>>>> poly reader to report both polys and lines, and then blank the polys
>>>>>>>> if necessary for the stenciling code.
>>>>>>>>
>>>>>>>> rtstructs are just a series of points that are supposed to be linearly
>>>>>>>> connected.  right now, the code to feed them into the polys array
>>>>>>>> looks like:
>>>>>>>>
>>>>>>>>
>>>>>>>>    vtkCellArray *polys = vtkCellArray::New();
>>>>>>>>    for(unsigned int i = 0; i < nitems; ++i){//nitems = number of
>>>>>>>> closed contour polygons
>>>>>>>>      ....
>>>>>>>>      for(unsigned int i = 0; i < npts * 3; i+=3)
>>>>>>>>        {
>>>>>>>>        float x[3];
>>>>>>>>        x[0] = pts[i+0];
>>>>>>>>        x[1] = pts[i+1];
>>>>>>>>        x[2] = pts[i+2];
>>>>>>>>        vtkIdType ptId = newPts->InsertNextPoint( x );
>>>>>>>>        ptIds[i / 3] = ptId;
>>>>>>>>        }
>>>>>>>>      // Each Contour Data is in fact a Cell:
>>>>>>>>      vtkIdType cellId = polys->InsertNextCell( npts , ptIds);
>>>>>>>>   }
>>>>>>>> Could you point me to some sample code I can use to construct the
>>>>>>>> lines necessary to make your filter work, as opposed to the polys that
>>>>>>>> the reader is currently producing?
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> On Fri, Feb 11, 2011 at 12:14 PM, David Gobbi <david.gobbi at gmail.com> wrote:
>>>>>>>>> A better approach would be to visualize the contours to make
>>>>>>>>> sure there's nothing wrong with them.  Just feed them into a
>>>>>>>>> vtkDataSetMapper, add that mapper to a vtkActor, and add that
>>>>>>>>> to your renderer.  If they don't look right, then do the same for the
>>>>>>>>> polygons. You need to know what kind of input you are feeding into
>>>>>>>>> vtkPolyDataToImageStencil before you start worrying about the output.
>>>>>>>>>
>>>>>>>>> On Fri, Feb 11, 2011 at 1:01 PM, Mark Roden <mmroden at gmail.com> wrote:
>>>>>>>>>> whoops.  Thanks for that.
>>>>>>>>>>
>>>>>>>>>> Now theLines has some information in it, although more than I think it should.
>>>>>>>>>>
>>>>>>>>>> Still not showing up in my displays, though, whereas it was in the 5.6 version.
>>>>>>>>>>
>>>>>>>>>> Is there a way to quickly walk through the contents of vtkImageData to
>>>>>>>>>> see if there's anything there produced by the stenciling?  I'm
>>>>>>>>>> wondering if something's broken in the visualization code.
>>>>>>>>>>
>>>>>>>>>> On Fri, Feb 11, 2011 at 11:57 AM, David Gobbi <david.gobbi at gmail.com> wrote:
>>>>>>>>>>> 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