[Paraview] can vtkImplicitPlaneWidget be used in an XML-only paraview plug-in?

Dr. Roman Grothausmann grothausmann.roman at mh-hannover.de
Mon Aug 19 06:50:16 EDT 2013


Dear Utkarsh,


Many thanks for Your reply, Your effort to create an XML-plugin and the bug 
report. Would it help to compile paraview from source with 
Module_vtkImagingStencil set to ON on our own platform for testing or is there 
some code adjustment of paraview necessary to allow that? I guess it would not 
help to specify the location of a separately compiled vtk-5.10?
I had a look at the attached xml-file, however am left with two questions:

Do I understand correctly that with using port_index= You specify which output 
should go to which input?
What is calling e.g. the vtkImplicitPlaneWidget to get the interaction widget 
for specifying the implicit function parameters?

Many thanks again for Your help
Roman

On 16/08/13 19:18, Utkarsh Ayachit wrote:
> Roman,
>
> As I was working on the XML, it occurred to me that unfortunately this
> cannot work in ParaView currently. The reason being that the VTK
> module that contains the Image stencil classes is not enabled in the
> default ParaView build. Also, there seem to be other issues with using
> Image Stencils due to the general lack of support for the same in
> ParaView. It will need some work to clean that up. I'm reporting a
> bug: http://paraview.org/Bug/view.php?id=14236
>
> Utkarsh
>
> On Thu, Aug 15, 2013 at 8:43 AM, Dr. Roman Grothausmann
> <grothausmann.roman at mh-hannover.de> wrote:
>> Dear Utkarsh,
>>
>>
>>
>> On 14/08/13 16:49, Utkarsh Ayachit wrote:
>>>
>>> Can you post the current XML for the filter? I think I can update that
>>> to add logic for the widget.
>>
>>
>> Thank You for Your reply. Well, I already got stuck trying to translate my
>> C++ programme into XML. Below is The C++ code but I could not find an
>> example how to connect a series of VTK-filters in XML-syntax. Is that
>> possible at all or should I translate the C-code to python? The idea is to
>> create a plug-in that does not need compiling paraview from source.
>>
>> Many thanks for Your help
>> Roman
>>
>>
>> ______________________________________________
>>
>> /////cli program to clip a voxel-dataset with a plane, as in paraview, but
>> in a way that the result is a voxel-dataset again. (using
>> vtkImplicitFunctionToImageStencil)
>> ////parameter to specify the clipping plane can be optaitned from the
>> paraview widget
>>
>>
>> #include <vtkSmartPointer.h>
>>
>> #include <vtkMetaImageReader.h>
>> #include <vtkPlane.h>
>> #include <vtkImplicitFunctionToImageStencil.h>
>> #include <vtkImageData.h>
>> #include <vtkImageStencil.h>
>> #include <vtkImageMask.h>
>> #include <vtkMetaImageWriter.h>
>>
>> #include <vtkCallbackCommand.h>
>> #include <vtkCommand.h>
>>
>>
>> void ProgressFunction ( vtkObject* caller, long unsigned int eventId, void*
>> clientData, void* callData )
>>      {
>>
>>      vtkAlgorithm *d= static_cast<vtkAlgorithm*>(caller);
>>      fprintf(stderr, "\rFilter progress: %5.1f%%", 100.0 * d->GetProgress());
>>      std::cerr.flush();
>>
>>      }
>>
>> int main(int argc, char* argv[]){
>>      if( argc != 10 )
>>          {
>>          std::cerr << "Usage: " << argv[0];
>>          std::cerr << " inputImage";
>>          std::cerr << " outputImage";
>>          std::cerr << " origin normal";
>>          std::cerr << " mask-value";
>>          std::cerr << std::endl;
>>          return EXIT_FAILURE;
>>          }
>>
>>      if(!(strcasestr(argv[1],".mhd"))) {
>>          std::cout << "The input should end with .mhd" << std::endl;
>>          return -1;
>>          }
>>
>>      if(!(strcasestr(argv[2],".mhd"))) {
>>          std::cout << "The output should end with .mhd" << std::endl;
>>          return -1;
>>          }
>>
>>      vtkSmartPointer<vtkCallbackCommand> progressCallback =
>> vtkSmartPointer<vtkCallbackCommand>::New();
>>      progressCallback->SetCallback(ProgressFunction);
>>
>>      vtkSmartPointer<vtkMetaImageReader> reader =
>>          vtkSmartPointer<vtkMetaImageReader>::New();
>>
>>      reader->SetFileName(argv[1]);
>>      reader->Update();
>>
>>
>>
>>      vtkSmartPointer<vtkPlane> plane =
>>          vtkSmartPointer<vtkPlane>::New();
>>
>>      plane->SetOrigin(atof(argv[3]), atof(argv[4]), atof(argv[5]));
>>      plane->SetNormal(atof(argv[6]), atof(argv[7]), atof(argv[8]));
>>
>>
>>      vtkSmartPointer<vtkImplicitFunctionToImageStencil> filter =
>>          vtkSmartPointer<vtkImplicitFunctionToImageStencil>::New();
>>
>>      filter->SetInput(plane);
>>      filter->SetInformationInput(reader->GetOutput());
>>      std::cout << "Executing vtkImplicitFunctionToImageStencil..." <<
>> std::endl;
>>      filter->AddObserver(vtkCommand::ProgressEvent, progressCallback);
>>      filter->Update();
>>      std::cout  << std::endl << "done." << std::endl;
>>
>>
>>      //// Create an empty (3D) image of appropriate size.
>>      vtkSmartPointer<vtkImageData> image =
>>          vtkSmartPointer<vtkImageData>::New();
>>
>>      //image->SetInformationInput(reader->GetOutput());
>>      image->SetSpacing(reader->GetOutput()->GetSpacing());
>>      image->SetOrigin(reader->GetOutput()->GetOrigin());
>>      image->SetExtent(reader->GetOutput()->GetExtent());
>>      image->SetScalarTypeToUnsignedChar();
>>      image->AllocateScalars(); // this causes blender to crash if not enough
>> space can be allocated
>>
>>      //// apply the image stencil to the empty image
>>      vtkSmartPointer<vtkImageStencil> stencil =
>>          vtkSmartPointer<vtkImageStencil>::New();
>>
>>      stencil->SetInput(image);
>>      stencil->SetStencil(filter->GetOutput());
>>      //stencil->ReverseStencilOn();
>>      stencil->SetBackgroundValue(255);
>>
>>      std::cout << "Executing vtkImageStencil..." << std::endl;
>>      stencil->AddObserver(vtkCommand::ProgressEvent, progressCallback);
>>      stencil->Update();
>>      std::cout  << std::endl << "done." << std::endl;
>>
>>
>>      //// mask the input image with the stencil
>>      vtkSmartPointer<vtkImageMask> mask =
>>          vtkSmartPointer<vtkImageMask>::New();
>>
>>      // mask->SetImageInputData(reader->GetOutput()); //6.0.0
>>      // mask->SetMaskInputData(stincil->GetOutput()); //6.0.0
>>      mask->SetImageInput(reader->GetOutput()); //5.10.1
>>      mask->SetMaskInput(stencil->GetOutput()); //5.10.1
>>      mask->SetMaskedOutputValue(atoi(argv[9]));
>>
>>      std::cout << "Executing vtkImageMask..." << std::endl;
>>      stencil->AddObserver(vtkCommand::ProgressEvent, progressCallback);
>>      mask->Update();
>>      std::cout  << std::endl << "done." << std::endl;
>>
>>
>>      //// save the output to an mhd-file
>>      vtkSmartPointer<vtkMetaImageWriter> writer=
>> vtkSmartPointer<vtkMetaImageWriter>::New();
>>
>>      writer->SetFileName(argv[2]);
>>      writer->SetFileDimensionality(3);
>>      writer->SetCompression(0);
>>      writer->SetInputConnection(mask->GetOutputPort());
>>
>>      std::cout << "Writing image..." << std::endl;
>>      stencil->AddObserver(vtkCommand::ProgressEvent, progressCallback);
>>      writer->Write();
>>      std::cout  << std::endl << "done." << std::endl;
>>
>>      return EXIT_SUCCESS;
>>
>>      }
>>
>>
>>
>>> On Wed, Aug 14, 2013 at 10:26 AM, Dr. Roman Grothausmann
>>> <grothausmann.roman at mh-hannover.de> wrote:
>>>>
>>>> Dear mailing list members,
>>>>
>>>>
>>>> I managed to write c++ vtk-program that uses
>>>> vtkImplicitFunctionToImageStencil to "clip" image data. However one needs
>>>> to
>>>> copy past the origin and normal coordinates of e.g. a clipping plane in
>>>> paraview to the cli command. Therefore I'd like to integrate this as a
>>>> plugin into paraview using the vtkImplicitPlaneWidget as a direct
>>>> interaction method.
>>>> Now, I wonder if there is a way to write an XML-only paraview plug-in
>>>> that
>>>> uses e.g. a vtkImplicitPlaneWidget as input to a chain of vtk-filters?
>>>> I.e.
>>>> would it be possible to write an XML-plug-in that would give the same
>>>> functionality as the paraview clip-filter or would it have to be a c++
>>>> based
>>>> plugin?
>>>> It seems there is no plug-in in the paraview XML-plugin list that uses a
>>>> vtkImplicitPlaneWidget nor could I find any instruction on that in the
>>>> plugin howto.
>>>>
>>>> Any help or hints are very much appreciated
>>>> Roman
>>>>
>>>>
>>>> On 13/08/13 13:33, Dr. Roman Grothausmann wrote:
>>>>>
>>>>>
>>>>> Dear mailing list members,
>>>>>
>>>>>
>>>>> Is there a better way (taking less render time) to clip a voxel dataset
>>>>> along an
>>>>> arbitrarily oriented plane in paraview than using the clip-filter? It
>>>>> works find
>>>>> as long as no volume rendering is chosen as the displaying method but
>>>>> when
>>>>> I
>>>>> change to volume rendering it takes more than a day what before took
>>>>> only
>>>>> a minute.
>>>>> My guess is, that the change of the type of the dataset caused by the
>>>>> clip-filter (output is unstructured grid) is not as efficiently rendered
>>>>> as
>>>>> vtkImage. For my purpose it would be sufficient to not clip intersected
>>>>> voxel
>>>>> themselves, just not to render those on one side of the clipping plane.
>>>>> Is there any way to achieve that with existing paraview or vtk-filters?
>>>>> If not should I use vtkImplicitFunctionToImageStencil in a plugin to
>>>>> create a
>>>>> mask image from an interactive plane-widget and then render e.g. black
>>>>> transparent?
>>>>>
>>>>> Any help or hints are very much appreciated
>>>>> Roman
>>>>>
>>>>
>>>> --
>>>> Dr. Roman Grothausmann
>>>>
>>>> Tomographie und Digitale Bildverarbeitung
>>>> Tomography and Digital Image Analysis
>>>>
>>>> Institut für Funktionelle und Angewandte Anatomie, OE 4120
>>>> Medizinische Hochschule Hannover
>>>> Carl-Neuberg-Str. 1
>>>> D-30625 Hannover
>>>>
>>>> Tel. +49 511 532-9574
>>>> _______________________________________________
>>>> 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 ParaView Wiki at:
>>>> http://paraview.org/Wiki/ParaView
>>>>
>>>> Follow this link to subscribe/unsubscribe:
>>>> http://www.paraview.org/mailman/listinfo/paraview
>>
>>
>> --
>> Dr. Roman Grothausmann
>>
>> Tomographie und Digitale Bildverarbeitung
>> Tomography and Digital Image Analysis
>>
>> Institut für Funktionelle und Angewandte Anatomie, OE 4120
>> Medizinische Hochschule Hannover
>> Carl-Neuberg-Str. 1
>> D-30625 Hannover
>>
>> Tel. +49 511 532-9574

-- 
Dr. Roman Grothausmann

Tomographie und Digitale Bildverarbeitung
Tomography and Digital Image Analysis

Institut für Funktionelle und Angewandte Anatomie, OE 4120
Medizinische Hochschule Hannover
Carl-Neuberg-Str. 1
D-30625 Hannover

Tel. +49 511 532-9574


More information about the ParaView mailing list