[vtkusers] How to select a specific cell/point attribute from a vtkDataSet? (Next)
Eric E. Monson
emonson at cs.duke.edu
Mon May 23 13:59:39 EDT 2011
Hey Romain,
First, if you're using an unstructured grid I'd use vtkDataSetMapper rather than vtkPolyDataMapper. Maybe there's no problem, but I think the latter is supposed to be specifically for polydata.
You can have the same data set which has both cell and point data going into the mapper, and then switch between whether you are coloring by point or cell attributes by doing something like this (sorry if there are syntax mistakes, I was testing in Python rather than Java):
// Set up the original mapper
vtkDataSetMapper mapper = new vtkDataSetMapper();
mapper.SetInput(ug);
mapper.SetScalarModeToUsePointData();
mapper.ScalarVisibilityOn();
mapper.SetLookupTable(coldAndHot);
mapper.SetScalarRange(ug.GetPointData().GetArray("temperature").GetRange());
// Switch to coloring by cell data
mapper.SetScalarModeToUseCellData();
mapper.SelectColorArray("density");
mapper.SetScalarRange(elev.GetOutput().GetCellData().GetArray("density").GetRange());
// Switch back to coloring by point data
mapper.SetScalarModeToUsePointData();
mapper.SelectColorArray("temperature");
mapper.SetScalarRange(ug.GetPointData().GetArray("temperature").GetRange());
So when you switch the attribute you're coloring by, you should only have to modify how the mapper is handling colors, and then call renderWindow.Render() to see the updated scene.
-Eric
On May 23, 2011, at 12:01 PM, Leguay Romain wrote:
> Hello Eric,
> Thank you for your answer.
>
> I try to do some color mapping with a specific cell attribute.
>
> I write this function (in Java):
>
> vtkActor colorMapping(String attributeName, vtkDataSet dataSet) {
>
> vtkDataArray attributeArray = null;
> if (dataSet.GetCellData() != null && dataSet.GetCellData().GetNumberOfArrays() != 0) {
> attributeArray = dataSet.GetCellData().GetArray(attributeName);
> } else if (dataSet.GetPointData() != null && dataSet.GetPointData().GetNumberOfArrays() != 0) {
> attributeArray = dataSet.GetCellData().GetArray(attributeName);
> }
>
> if (attributeArray == null) {
> System.err.println("No attribute with name " + attributeName);
> return null;
> }
>
>
> vtkMapper mapper = null;
> if (dataSet instanceof vtkUnstructuredGrid || dataSet instanceof vtkPolyData) {
> mapper = new vtkPolyDataMapper();
> ((vtkPolyDataMapper)mapper).SetInput((vtkPolyData)dataSet);
> vtkLookupTable coldAndHot = new vtkLookupTable();
> coldAndHot.SetNumberOfColors(10000);
> coldAndHot.SetHueRange(240. / 360., 0.);
> coldAndHot.SetAlphaRange(1., 1.);
> coldAndHot.Build();
> mapper.SetLookupTable(coldAndHot);
> }
>
> if (mapper == null) {
> System.err.println("Unexpected dataSetType");
> return null;
> }
>
> vtkActor actor = new vtkActor();
> actor.SetMapper(mapper);
> return actor;
> }
>
>
>
> I test this function with an unstrutured grid contains two cell attributes: (temperature, density). When I choose density or temperature, I have the same color mapping for my dataSet.
> I don't see where is the problem with my code.
> Has anyone got any ideas?
>
> Thanks,
> Romain
>
>
> "Eric E. Monson" <emonson at cs.duke.edu> a écrit :
>
>> Hello Romain,
>>
>> If I understand your question correctly, the standard way of accessing attributes in a vtkDataSet is something like:
>>
>> imageData->GetPointData()->GetArray("array_name");
>> polyData->GetCellData()->GetArray("array2_name");
>>
>> (with some other variations available). Both vtkCellData and vtkPointData inherit from vtkDataSetAttributes, so many of the methods you'll need are listed there or in it's superclass, vtkFieldData:
>>
>> http://www.vtk.org/doc/nightly/html/classvtkDataSetAttributes.html
>> http://www.vtk.org/doc/nightly/html/classvtkFieldData.html
>>
>> Hope this helps,
>> -Eric
>>
>> · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
>> Eric E Monson
>> Duke Visualization Technology Group
>>
>>
>> On May 23, 2011, at 3:22 AM, Leguay Romain wrote:
>>
>>> Hello everyone!
>>> I found how to select a cell (or point) attribute with a vtkDataSetReader's method: SetScalarsName(const char*).
>>> I try to do the same thing with a vtkDataSet.
>>>
>>> Has anyone got any leads?
>>>
>>> Thanks,
>>> Romain LEGUAY
>>>
>>> _______________________________________________
>>> 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 VTK FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
>>>
>>> Follow this link to subscribe/unsubscribe:
>>> http://www.vtk.org/mailman/listinfo/vtkusers
>>
>>
>
>
>
> Romain LEGUAY
>
More information about the vtkusers
mailing list