[Paraview] Problems with 'interpolate scalars before mapping' in v3.10
Nenad Vujicic
nenadus at gmail.com
Thu May 5 18:03:13 EDT 2011
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
>>
>
More information about the ParaView
mailing list