[vtkusers] How to select a specific cell/point attribute from a vtkDataSet? (Next)

Eric E. Monson emonson at cs.duke.edu
Tue May 24 07:05:09 EDT 2011


In this case the whole unstructured grid is a construct in memory all at once, including the vertex coordinates, the cell connectivities and the point and cell attribute arrays. Accessing them with GetArray() won't change anything about them or delete them, it's just a method that returns a pointer to the appropriate vtkDataArray. (Well, I guess that's in C++, and I don't really know the intricacies of how the Java wrapped VTK works, so if you have specific questions about that you should search the mailing list archives or ask a new question if you need to.)

Good luck,
-Eric


On May 24, 2011, at 1:48 AM, Leguay Romain wrote:

> Hello Eric,
> Thanks so much for your answer and your example.
> 
> Just to be sure, when I do a ug.GetPointData().GetArray("attribute"), vtk reads this array, doesn't it? If I use another attribute, is the previous array deleted (of course if I don't use it anymore)?
> 
> Thanks,
> Romain
> 
> "Eric E. Monson" <emonson at cs.duke.edu> a écrit :
> 
>> 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
>>> 
>> 
>> 
> 
> 
> 
> Romain LEGUAY
> 




More information about the vtkusers mailing list