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

Utkarsh Ayachit utkarsh.ayachit at kitware.com
Mon May 23 09:02:40 EDT 2011


Interesting, I wonder how that could have worked with older version of
ParaView then. Did that piece of code change recently?

Utkarsh

On Sun, May 22, 2011 at 2:43 PM, Nenad Vujicic <nenadus at gmail.com> wrote:
> Hello everyone,
>
> Just to announce - the problem is solved! It seems the problem was in
> plugin's sources when setting texture coordinates data. So, if in
> vtkMyExporter.cpp I remove
>
> tex_coord_data->SetNumberOfComponents(1);
>
> or set number of components to 2, correct texture will be generated!
>
> Thanks everyone on Your help!
>
> Best regards,
> Nenad.
>
> On Fri, May 13, 2011 at 11:49 PM, Nenad Vujicic <nenadus at gmail.com> wrote:
>> Hello everyone,
>>
>> Does anyone have idea where could be the problem in uploaded sources?
>>
>> Thanks,
>> Nenad.
>>
>> On Tue, May 10, 2011 at 12:13 PM, Nenad Vujicic <nenadus at gmail.com> wrote:
>>> Dear Utkarsh,
>>>
>>> Thank You very much, but unfortunately, adding manually copying of
>>> parameters didn't solve all problems. I updated test plug-in with
>>> manually copying, converting scalars to texture, applying texture to
>>> actor and showing resulting actor in vtkRenderWindow. You can find
>>> updated sources at
>>> http://alas.matf.bg.ac.rs/~mr00053/projects/PVTest.zip.
>>>
>>> If You load again disk_out_ref.ex2, select H2 and try to export to
>>> .my, You'll see in separate vtkRenderWindow same object with applied
>>> generated
>>> texture which looks very bad. Again, it works fine in v3.8.1. I
>>> believe I'm not initializing new actors properly? Do You have some
>>> idea how to fix it?
>>>
>>> Thanks,
>>> Nenad.
>>>
>>>
>>> On Mon, May 9, 2011 at 10:02 PM, Utkarsh Ayachit
>>> <utkarsh.ayachit at kitware.com> wrote:
>>>> The problem is pretty straight forward. Looks like
>>>> vtkMapper::ShallowCopy(..) does not copy the state of
>>>> InterpolateScalarsBeforeMapping. I will commit a fix for that for next
>>>> release. Until then, you'll have to manually copy ivars that you care
>>>> about.
>>>>
>>>> Utkarsh
>>>>
>>>> On Sun, May 8, 2011 at 10:25 AM, Nenad Vujicic <nenadus at gmail.com> wrote:
>>>>> Dear Utkarsh,
>>>>>
>>>>> I uploaded test plugin that shows my problem at
>>>>> http://alas.matf.bg.ac.rs/~mr00053/projects/PVTest.zip.
>>>>>
>>>>> After I build and load the plugin from Qt client, I load
>>>>> disk_out_ref.ex2, select "H2" for mapping scalars, check Interpolate
>>>>> Scalars on Display tab in Object inspector and go on File->Export
>>>>> (select .my file). I get 6 message boxes which report 0, 0, 0, 0, 0, 1
>>>>> (instead of 0, 0, 0, 0, 1, 1) as values for
>>>>> vtkMapper::InterpolateScalarsBeforeMapping. So, here is first
>>>>> question: "How to create multiple vtkActor objects from
>>>>> vtkCompositePolyDataMapper2's input"? I thought that vtkMyExporter.cpp
>>>>> Ln 138-162 should be fine, but uploaded sources shows different.
>>>>>
>>>>> Thanks,
>>>>> Nenad.
>>>>>
>>>>> On Fri, May 6, 2011 at 2:29 PM, Utkarsh Ayachit
>>>>> <utkarsh.ayachit at kitware.com> wrote:
>>>>>> 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
>>>>>>>
>>>>>>
>>>>> _______________________________________________
>>>>> 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