[vtkusers] vtkAppendPolydata - wrong extents on multiple inputs

Dan Lipsa dan.lipsa at kitware.com
Fri Aug 7 14:14:42 EDT 2015


Nigel,
I don't see anything wrong in your script. Do you mind sharing your data so
that I can debug this?

On Fri, Aug 7, 2015 at 7:48 AM Nigel Mcfarlane <Nigel.Mcfarlane at beds.ac.uk>
wrote:

> Dear Dan,
>
> I’m sorry, but I was too hasty in declaring that my problem was fixed –
> removing my AddScalars filter did not help after all, and neither did
> replacing it with vtkPolyDataNormals.  I have now stripped down the code to
> its simplest configuration.  The resulting scene has isosurfaces which are
> mispositioned and broken in a manner consistent with the images being read
> with the wrong dimensions.  Furthermore, if the readers are not manually
> updated, the program crashes.
>
>
>
> There is also an error message:
>
> ERROR: In
> C:\VTK\VTK-6.2.0\Common\ExecutionModel\vtkStreamingDemandDrivenPipeline.cxx,
> line 857
>
> vtkCompositeDataPipeline (0132A818): The update extent specified in the
> information for output port 0 on algorithm vtkMetaImageReader(01321E58) is
> 0 67 0 72 0 9, which is outside the whole extent 0 69 0 58 0 10.
>
>
>
> The results are ok if only one image is fed to appendPD.  If I update the
> dmcubes[i] manually, the results are also ok.
>
>
>
> It looks as if the base of the pipeline only remembers one set of extents,
> which it then demands incorrectly from all the inputs.  Have I missed
> anything important in the code below?
>
>
>
>   // Set filenames
>
>   *std*::*string* dirname = CHICVIS"/ForthLungCropped20150703";
>
>   *std*::*string* fname[3];
>
>   fname[0] = dirname + "/2505ct/Tumor1Big/lesion2505-1mm.mhd";
>
>   fname[1] = dirname + "/3108ct/Tumor1Big/lesion3108-1mm.mhd";
>
>   fname[2] = dirname + "/170957ct/Tumor1Big/lesion1709-1mm.mhd";
>
>
>
>   // Create array of image readers
>
>   vtkMetaImageReader **reader;
>
>   reader = new (vtkMetaImageReader *[3]);
>
>   for (int i = 0; i < 3; i++)
>
>     reader[i] = vtkMetaImageReader::New();
>
>
>
>   for (int i = 0; i < 3; i++){
>
>     reader[i]->SetFileName(fname[i].*c_str*());
>
>     reader[i]->Update();
>
>   }
>
>
>
>
>
>   // -----------------------
>
>   // Create the VTK pipeline
>
>   //
>
>   //  image0     image1      image2
>
>   // dmcubes0   dmcubes1    dmcubes2
>
>   //         \     |       /
>
>   //        vtkAppendPolyData
>
>   //          mapper/actor
>
>   //           renderer
>
>   // -----------------------
>
>   vtkDiscreteMarchingCubes **dmcubes;
>
>   dmcubes = new (vtkDiscreteMarchingCubes *[3]);
>
>   for (int i = 0; i < 3; i++){
>
>     dmcubes[i] = vtkDiscreteMarchingCubes::New();
>
>     dmcubes[i]->SetInputConnection(reader[i]->GetOutputPort());
>
>     dmcubes[i]->SetNumberOfContours(1);
>
>     dmcubes[i]->SetComputeGradients(0);
>
>     dmcubes[i]->SetComputeScalars(0);
>
>     dmcubes[i]->SetComputeNormals(1);
>
>     dmcubes[i]->SetValue(i, 255);
>
>   }
>
>
>
>   vtkAppendPolyData *appendPD = vtkAppendPolyData::New();
>
>   for (int i = 0; i < 3; i++)
>
>     appendPD->AddInputConnection(dmcubes[i]->GetOutputPort());
>
>
>
>   vtkPolyDataMapper *mapper = vtkPolyDataMapper::New();
>
>   mapper = vtkPolyDataMapper::New();
>
>   mapper->SetInputConnection(appendPD->GetOutputPort());
>
>
>
>   vtkActor *actor = vtkActor::New();
>
>   actor->SetMapper(mapper);
>
>
>
>   Renderer->AddActor(actor);
>
>
>
>   // -------------------------------
>
>   // Reset the camera and initialize
>
>   // -------------------------------
>
>   Renderer->ResetCamera();
>
>   RWI->Initialize();
>
>   RWI->Start();
>
>
>
>
>
>
>
> Thank you
>
> Nigel McFarlane
>
> University of Bedfordshire UK
>
>
>
>
>
>
>
>
>
> *From:* Dan Lipsa [mailto:dan.lipsa at kitware.com]
> *Sent:* 06 August 2015 22:21
> *To:* Nigel Mcfarlane <Nigel.Mcfarlane at beds.ac.uk>; vtkusers at vtk.org
> *Subject:* Re: [vtkusers] vtkAppendPolydata - wrong extents on multiple
> inputs
>
>
>
> > This request is propagated upstream and stops if a filter has its inputs
> older than its output.
>
> I meant downstream. It has to check all filters as their properties might
> change which will affect the final result.
>
>
>
> On Thu, Aug 6, 2015 at 5:12 PM Dan Lipsa <dan.lipsa at kitware.com> wrote:
>
> Nigel,
>
> The pipeline executive compares the modification time (
> vtkObject::GetMTime()) for the output of a filter against each of its
> inputs. If any of the inputs is newer, the filter is updated. It may be
> that your filter does not update the time of its output properly. This
> request is propagated upstream and stops if a filter has its inputs older
> than its output. I would setup a breakpoint and look at the first update
> for your filters.
>
>
>
> On Thu, Aug 6, 2015 at 9:20 AM Nigel Mcfarlane <Nigel.Mcfarlane at beds.ac.uk>
> wrote:
>
> Dear vtkusers,
>
>
>
> I am creating a visual pipe in vtk 6.2.0 and I am having problems
> connecting vtkAppendPolyData to multiple inputs which start from images of
> different dimensions.  The visual pipe converts a set of input images into
> isosurfaces, adds scalars for colour and transparency, then merges them
> into one polydata mesh so they can be depth sorted before rendering.  Its
> structure looks like this:
>
>
>
> //
>
> //     image1       image2       image3
>
> //       |            |            |
>
> //    DMCubes1     DMCubes2     DMCubes3
>
> //       |            |            |
>
> //  AddScalars1  AddScalars2  AddScalars3
>
> //             \      |      /
>
> //              \     |     /
>
> //               \    |    /
>
> //            vtkAppendPolyData
>
> //                    |
>
> //           vtkDepthSortPolyData
>
> //                    |
>
> //               Mapper/Actor
>
> //                    |
>
> //                 Renderer
>
> //
>
>
>
> The images are produced by vtkMetaImageReader, the “DMCubes” filters are
> vtkDiscreteMarchingCubes, and the”AddScalars” filters are my own code.
>
>
>
> The problem is that this produces an image in which the dimensions/extents
> of two of the images have clearly been set incorrectly.  I don’t know much
> about the way the vtk pipeline works, but I suppose that an information
> request for the extents of the images travels up and back down the
> pipeline, so the extents get set to that of the last input, and then
> applied to all the inputs.  The problem disappears if the input branches
> are first independently updated by calling a manual Update() on each of the
> AddScalars filters, but it returns if one of the DMCubes filters is
> modified, which triggers another general update cycle.
>
>
>
> Is there any way to set up this pipeline so that it does not require a
> manual update when the image inputs are modified?
>
>
>
> Nigel McFarlane
>
> University of Bedfordshire
>
> _______________________________________________
> 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
>
> Search the list archives at: http://markmail.org/search/?q=vtkusers
>
> Follow this link to subscribe/unsubscribe:
> http://public.kitware.com/mailman/listinfo/vtkusers
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20150807/3a0a9337/attachment.html>


More information about the vtkusers mailing list