[vtkusers] stenciling problem-- is this code thread safe?
Mark Roden
mmroden at gmail.com
Sat Feb 12 10:23:43 EST 2011
Hi David,
I figured out the problem. Somehow, the java wrapping was seeing a few
methods as static when they shouldn't have been:
vtkFileOutputWindow outWin = new vtkFileOutputWindow();
outWin.SetInstance(outWin);//this is not static
and
vtkPolyDataMapper theMapper = new vtkPolyDataMapper();
theMapper.SetResolveCoincidentTopologyToPolygonOffset();//not static
theMapper.SetResolveCoincidentTopologyToShiftZBuffer();//not static
Because the wrapping thought they were static, I had to comment them
out or else compilation and runtime failures resulted. Recompiling
everything after a recent pull seems to have solved the issue, and now
I can see contours again.
Just be sure, though, the line version of the stencil should be faster
than the polygon, correct?
Thanks for your help!
Mark
On Fri, Feb 11, 2011 at 2:54 PM, Mark Roden <mmroden at gmail.com> wrote:
> 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