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

Utkarsh Ayachit utkarsh.ayachit at kitware.com
Fri Aug 16 13:18:58 EDT 2013


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


More information about the ParaView mailing list