[Paraview] Problems with 'interpolate scalars before mapping' in v3.10

Utkarsh Ayachit utkarsh.ayachit at kitware.com
Fri May 6 08:29:18 EDT 2011


Nenad,

There;s nothing much different about the vtkCompositePolyDataMapper or
vtkPolyDataMapper as far as the state of the
InterpolateScalarsBeforeMapping flag goes. I cannot see how that
variable can return false if it is indeed set to true as you are
saying. Can you share the plugin?

Utkarsh

On Thu, May 5, 2011 at 6:03 PM, Nenad Vujicic <nenadus at gmail.com> wrote:
> Hello everyone,
>
> Perhaps I was a bit unclear in my previous messages. Here are more
> details about the problem and test case.
>
> I use ParaView v3.10.1 release sources, Visual Studio 2008 SP1, Python
> 2.7, OpenMPI 1.4.3 on Vista SP2. I compiled sources with standard
> options (just turned on BUILD_SHARED_LIBS, MPI and Python). I derived
> new class from vtkExporter, vtkMyExporter, and in
> vtkMyExporter::WriteData() I call code specified down. The problem is
> in QMessage line, which reports always 0, even when this flag is
> turned on. Same is happening with most of other parameters.
>
> I believe that learning how to decompose composite ptrActor into
> several actors with vtkPolyDataMapper mapper and vtkPolyData data will
> solve all other problems (which occur when generating texture from
> scalars). At the moment, I'm interested only in actors which use
> vtkCompositePolyDataMapper2 mappers. As input I use disk_out_ref.ex2
> with selected H2 (or any other channel) for mapping colors. Does
> anyone have any idea how this can be done? Btw, this worked perfectly
> under ParaView v.3.8.1 and with RenderWindow created using VTK 5.4.2
> (where I create vtkCompositePolyDataMapper2 and populate it manually).
>
> Thank You very much for Your help!
>
> Best regards,
> Nenad.
>
> --------------------
>
> 1) Get interactive renderer 'InteractiveRenderer' from
> vtkMyExporter::RenderWindow
> 2) For every actor 'ptrActor' (3D actors only) in InteractiveRenderer do:
>
>    vtkCompositeDataIterator* actor_iterator;
>    vtkCompositePolyDataMapper2* composite_mapper = NULL;
>
>    // get actor's mapper
>    vtkMapper* mapper = ptrActor->GetMapper();
>    if(mapper == NULL)
>        return true; // discard
>
>    // get mapper's input
>    vtkCompositeDataSet* composite_input_data =
> dynamic_cast<vtkCompositeDataSet*>(mapper->GetInputDataObject(0, 0));
>    if(composite_input_data != NULL)
>    {
>        // get actor's composite mapper
>        composite_mapper = dynamic_cast<vtkCompositePolyDataMapper2*>(mapper);
>        if(composite_mapper == NULL)
>            return false;
>
>        // in case input data is composite object, get iterator for traversing
>        actor_iterator = composite_input_data->NewIterator();
>
>        // initialize iterator for traversing
>        actor_iterator->InitTraversal();
>        actor_iterator->GoToFirstItem();
>    }
>    else
>        actor_iterator = NULL;
>
>    // export all components of input actor
>    for(;;)
>    {
>        vtkSmartPointer<vtkActor> actor;
>
>        // if input data is composite object, create actor with
> current component as data, otherwise use entire actor (I do this
> because I need actor with vtkPolyDataMapper and vtkPolyData data for
> vtkScalarsToColorsPainter)
>        if(actor_iterator != NULL)
>        {
>            // check if there are no more components
>            if(actor_iterator->IsDoneWithTraversal())
>                break;
>
>            // get next component
>            vtkDataObject* data_object = actor_iterator->GetCurrentDataObject();
>            if(dynamic_cast<vtkPolyData*>(data_object) != NULL)
>            {
>                // get poly data
>                vtkPolyData* poly_data =
> dynamic_cast<vtkPolyData*>(data_object);
>
>                // create new temporary poly data mapper
>                vtkSmartPointer<vtkPolyDataMapper> poly_data_mapper =
> vtkSmartPointer<vtkPolyDataMapper>::New();
>
>                // copy mapper's parameters
>                poly_data_mapper->ShallowCopy(composite_mapper);
>
>                // set mapper's input
>                poly_data_mapper->SetInput(poly_data);
>
>                // create new actor
>                actor = vtkSmartPointer<vtkActor>::New();
>
>                // copy actor parameters
>                actor->ShallowCopy(ptrActor);
>
>                // set actor's mapper
>                actor->SetMapper(poly_data_mapper);
>            }
>            else
>            {
>                return false;
>            }
>        }
>        else
>            actor = ptrActor;
>
>        // report some actor's property
>        QMessageBox::about(NULL, "",
> QString::number(ptrActor->GetMapper()->GetInterpolateScalarsBeforeMapping()));
>
>        // perform transformation from scalars to texture using
>        vtkScalarsToColorsPainter class
>
>        // extract data from ptrActor (I use previously generated
> texture instead of colors / scalars)
>
>        // write to my custom format
>
>        // if input is not composite, break the loop
>        if(composite_input_data == NULL)
>            break;
>
>        // set iterator on next item
>        if(actor_iterator != NULL)
>            actor_iterator->GoToNextItem();
>    }
>
>
> ----------------------------------------------------------------------------------------------------
>
> On Wed, May 4, 2011 at 3:04 PM, Utkarsh Ayachit
> <utkarsh.ayachit at kitware.com> wrote:
>> Nenad,
>>
>> I am not sure I understand where this code is being put. You say it's
>> an exporter? Meaning it exports to something like a vrml/x3d file? But
>> that doesn't seem right since you say you are using the
>> PolyDataMapper.
>>
>> What is this plugin trying to achieve?
>>
>> Utkarsh
>>
>> On Wed, May 4, 2011 at 8:31 AM, Nenad Vujicic <nenadus at gmail.com> wrote:
>>> Hello everyone,
>>>
>>> I'm having some problems with porting my ParaView exporter plug-in to
>>> v3.10, because ParaView started using vtkCompositeDataSet internally
>>> instead of keeping components merged. The problem is in performing
>>> transformation of scalars to texture using vtkScalarsToColorsPainter
>>> class. Here is approximately my code (questions come after
>>> pseudo-code):
>>>
>>> for every actor in currently active renderer:
>>>  for every component of composite data object (I retrieve
>>> vtkDataObject* with vtkCompositeDataIterator::GetCurrentDataObject()
>>> call)
>>>
>>>    // prepare new actor which defines component
>>>    dynamic cast vtkDataObject* data_object to vtkPolyData* poly_data;
>>>    create new vtkPolyDataMapper* pdm;
>>>    pdm->ShallowCopy(composite_mapper);
>>>    pdm->SetInput(poly_data);
>>>    allocate new actor and do actor->ShallowCopy(ptrActor) //
>>> ptrActor) is selected actor from currently active renderer - line 1
>>>    actor->SetMapper(pdm);
>>>
>>>    // perform converting from scalars to texture
>>>    ConvertScalarsToColors(actor);
>>>
>>> Routine ConvertScalarsToColors(vtkActor*) is defined in following way:
>>>
>>> L1 get actor's poly_data and mapper references,
>>> L2 create s2c - instance of MyVtkScalarsToColorsPainter (derived from
>>> vtkScalarsToColorsPainter for allowing setting its protected
>>> attributes),
>>> L3 initialize s2c parameters from mapper and poly_data
>>> L4 if s2c->CanUseTextureMapForColoring(poly_data) returns true,
>>> s2c->PrepareForRendering(), get texture and texture coordinates and
>>> sets them to passed actor
>>>
>>> Q1: First problem is in L3 when setting s2c parameters. Original
>>> mapper has turned on InterpolateScalarsBeforeMapping flag, but new one
>>> doesn't have it. How to safely copy properties of
>>> vtkCompositePolyDataMapper2 to vtkPolyDataMapper or I shouldn't do it?
>>>
>>> Q2: Even if I override above problem by turning on manually
>>> InterpolateScalarsBeforeMapping, I get very bad texture on output. It
>>> looks like scalars were not interpolated before mapping, sometimes
>>> even more distorted..
>>>
>>> The same code works with v3.8 perfectly. I also tried to apply
>>> vtkCompositeDataGeometryFilter to composite data object and to apply
>>> ConvertScalarsToColors() to result (even without creating new actor),
>>> but without success. Strange thing is that when I try this with
>>> manually created VTK scene (out of ParaView) it works perfectly and
>>> texture looks great!
>>>
>>> I would appreciate any help!
>>>
>>> Best regards,
>>> Nenad.
>>> _______________________________________________
>>> 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
>>>
>>
> _______________________________________________
> 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
>


More information about the ParaView mailing list