[vtkusers] Regularly sample 3D unstructured tensor grid

Jochen Jankowai jochen.jankowai at gmail.com
Tue Nov 28 09:23:01 EST 2017


Hi,
Thank you for your reply! I have adjusted my code according to your suggestions which had the effect that I am not getting a nullptr any longer.
The resulting structured grid has 0 values at all positions though.
Am I forgetting to specify that/how I want to interpolate the tensors or something like that?

See code below:

    auto reader = vtkUnstructuredGridReader::New();

    reader->SetFileName(file_.get().c_str());

    reader->SetReadAllTensors(1);

    reader->Update();

    auto unstructuredGrid = reader->GetOutput();

    auto bounds = unstructuredGrid->GetBounds();

    // Create a grid of points to interpolate over
    auto gridSize = ivec3(32);
    const auto gridBounds = dvec3(31);
    vtkSmartPointer<vtkPoints> gridPoints = vtkSmartPointer<vtkPoints>::New();

    const auto xRange = std::abs(bounds[0] - bounds[1]);
    const auto yRange = std::abs(bounds[2] - bounds[3]);
    const auto zRange = std::abs(bounds[4] - bounds[5]);

    const auto stepSize = dvec3(xRange / gridBounds.x, yRange / gridBounds.y, zRange / gridBounds.z);

    for (int x = 0; x < gridSize.x; x++) {
        for (int y = 0; y < gridSize.y; y++) {
            for (int z = 0; z < gridSize.z; z++) {
                const auto xCoord = bounds[0] + static_cast<double>(x) * stepSize.x;
                const auto yCoord = bounds[2] + static_cast<double>(y) * stepSize.y;
                const auto zCoord = bounds[4] + static_cast<double>(z) * stepSize.z;
                gridPoints->InsertNextPoint(xCoord, yCoord, zCoord);
            }
        }
    }

    // Create a dataset from the grid points
     vtkSmartPointer<vtkStructuredGrid> pointSet =
        vtkSmartPointer<vtkStructuredGrid>::New();
     pointSet->SetDimensions(glm::value_ptr(gridSize));
     pointSet->SetPoints(gridPoints);
    
     vtkSmartPointer<vtkProbeFilter> probeFilter =
        vtkSmartPointer<vtkProbeFilter>::New();
     probeFilter->SetSourceData(unstructuredGrid);

     probeFilter->SetInputData(pointSet);

     probeFilter->Update();

     auto structuredGrid = probeFilter->GetStructuredGridOutput();

     auto pointData = structuredGrid->GetPointData();
     auto tensors = pointData->GetArray("strain_0.0");



-----Original Message-----
From: kenichiro yoshimi [mailto:rccm.kyoshimi at gmail.com] 
Sent: den 25 november 2017 04:50
To: PetiteViking <jochen.jankowai at gmail.com>
Cc: vtkusers at vtk.org
Subject: Re: [vtkusers] Regularly sample 3D unstructured tensor grid

Hi,

The standard way of retrieving PointData is not  auto tensors = pointData->GetArray(); but  auto tensors = pointData->GetArray(0);  auto tensors = pointData->GetArray("array-name");
 auto tensors = pointData->GetTensors("array-name");

vtkPointData inherits from vtkDataSetAttributes and
pointData->GetArray() is trying to access the FieldData which
describes global properties of pointData, but it is null.

Thanks

2017-11-24 21:48 GMT+09:00 PetiteViking <jochen.jankowai at gmail.com>:
> Hello everyone! I've tried to find an answer to my problem in the 
> forum for quite some time now but I cannot seem to find a solution. I 
> have an unstructured hexahedral grid that stores one tensor per cell. 
> What I need in my application though is a regulargrid so I would like 
> to regularly sample the field. So far, this is what I am trying to 
> (see code below). In one of the posts here I have read that 
> vtkProbeFilter will produce output that corresponds to the input so I 
> amusing a structured grid as input for which I have computed points. 
> And while I manage to retreive a structured grid from the probeFilter, 
> the variable tensors ends up being a nullptr. auto reader = 
> vtkUnstructuredGridReader::New(); 
> reader->SetFileName(file_.get().c_str());
> reader->Update(); auto unstructuredGrid = reader->GetOutput(); // 
> reader->Create a
> grid of points to interpolate over auto gridSize = glm::ivec3(32, 32, 
> 32); vtkSmartPointer<vtkPoints> gridPoints =  
> vtkSmartPointer<vtkPoints>::New();
> for (int x = 0; x < gridSize.x; x++) {  for (int y = 0; y < 
> gridSize.y; y++) {   for (int z = 0; z < gridSize.z; z++) {    
> gridPoints->InsertNextPoint(x, y, z);   }  } } // Create a dataset 
> from the grid points vtkSmartPointer<vtkStructuredGrid> pointSet =
>  vtkSmartPointer<vtkStructuredGrid>::New();
> pointSet->SetDimensions(glm::value_ptr(gridSize));
> pointSet->SetPoints(gridPoints); vtkSmartPointer<vtkProbeFilter> 
> pointSet->probeFilter
> =  vtkSmartPointer<vtkProbeFilter>::New();
> probeFilter->SetSourceData(unstructuredGrid);
> probeFilter->SetInputData(pointSet); probeFilter->Update(); auto
> structuredGrid = probeFilter->GetStructuredGridOutput(); auto 
> pointData =
> structuredGrid->GetPointData(); auto tensors = 
> structuredGrid->GetPointData()->GetTensors();
> ________________________________
> Sent from the VTK - Users mailing list archive at Nabble.com.
>
> _______________________________________________
> 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
>
> Search the list archives at: http://markmail.org/search/?q=vtkusers
>
> Follow this link to subscribe/unsubscribe:
> http://public.kitware.com/mailman/listinfo/vtkusers
>



More information about the vtkusers mailing list