Skip to content

GitLab

  • Menu
Projects Groups Snippets
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
  • VTK VTK
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 740
    • Issues 740
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 199
    • Merge requests 199
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages & Registries
    • Packages & Registries
    • Package Registry
    • Infrastructure Registry
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • VTK
  • VTKVTK
  • Issues
  • #1153
Closed
Open
Created Sep 09, 2004 by Kitware Robot@kwrobotOwner

Bug in SetActiveAttribute?

This issue was created automatically from an original Mantis Issue. Further discussion may take place here.


Dear,

There seems to be a bug in vtkDataSetAttributes when using SetActiveAttribute (int index, int attributeType).

The following works fine (using a name): for(i = 0; i < vec_DataArray.size(); ++i) { sprintf(name, "PCTEST%i", i);

pPolyData-&gt;GetPointData()-&gt;SetActiveAttribute(name, vtkDataSetAttributes::VECTORS);

double* d = pPolyData->GetPointData()->GetVectors()->GetTuple3(1);

}

when using a number instead of a name:

for(i = 0; i < vec_DataArray.size(); ++i) { sprintf(name, "PCTEST%i", i);

pPolyData-&gt;GetPointData()-&gt;SetActiveAttribute(i, vtkDataSetAttributes::VECTORS);

double* d = pPolyData->GetPointData()->GetVectors()->GetTuple3(1);

}

it doesn’t change the active vectorfield.

Best wishes, Per

PS: Complete c++ test code:

// testAddArray.cpp : Defines the entry point for the console application. //

#include <iostream> #include <tchar.h>

#include <vtkPolyData.h> #include <vtkDataSetAttributes.h> #include <vtkAssignAttribute.h> #include <vtkPolyDataReader.h> #include <vtkPolyDataWriter.h> #include <vtkDoubleArray.h> #include <vtkPointData.h>

#pragma comment(lib, "vtkHybrid.lib") #pragma comment(lib, "vtkIO.lib") #pragma comment(lib, "vtkGraphics.lib") #pragma comment(lib, "vtkFiltering.lib") #pragma comment(lib, "vtkCommon.lib")

using namespace std;

#include <vector> void main(int argc, _TCHAR* argv[]) {

vtkPolyDataReader *pReader = vtkPolyDataReader::New(); vtkPolyData *pPolyData = vtkPolyData::New(); vtkPolyDataWriter pWriter = vtkPolyDataWriter::New(); vector<vtkDataArray > vec_DataArray; int i; char name[255];

pReader->SetFileName("fran_cut.vtk"); // 'fran_cut.vtk' from the vtk test set pReader->Update(); pPolyData->DeepCopy(pReader->GetOutput());

cerr << "pPolyData->GetNumberOfPoints() = " << pPolyData->GetNumberOfPoints() << "\n";

// Make vector field vec_DataArray.resize(3); for(i = 0; i < vec_DataArray.size(); ++i) { vec_DataArray[i] = vtkDoubleArray::New();

vtkDataArray* v = vec_DataArray[i];

sprintf(name, "PCTEST%i", i);
v-&gt;SetName(name);
v-&gt;SetNumberOfComponents(3);
v-&gt;SetNumberOfTuples(pPolyData-&gt;GetNumberOfPoints());

for(int j = 0; j &lt; v-&gt;GetNumberOfTuples(); ++j)
{
  const double d = i + j / 1.e4;
  v-&gt;SetTuple3(j, d, d, d);
}

}

// Add vectors to dataset // // 11111111111111111 // cerr << "..........1st test...........\n";

cerr << " Shows that many field sets may be added to a dataset.\n";

pPolyData->DeepCopy(pReader->GetOutput());

for(i = 0; i < vec_DataArray.size(); ++i) { pPolyData->GetPointData()->AddArray(vec_DataArray[i]); }

pWriter->SetInput(pPolyData); pWriter->SetFileName("fran_cut_with_test_vectors_1.vtk"); pWriter->Write(); // Write data set with 'FieldData'

// // 22222222222222222 // cerr << "..........2nd test...........\n";

cerr << " Shows that it's not possible to add more the one vector-attribute to a dataset.\n";

pPolyData->DeepCopy(pReader->GetOutput());

for(i = 0; i < vec_DataArray.size(); ++i) { pPolyData->GetPointData()->SetVectors(vec_DataArray[i]); }

// check that all vectors are in dataset! for(i = 0; i < vec_DataArray.size(); ++i) { sprintf(name, "PCTEST%i", i);

pPolyData-&gt;GetPointData()-&gt;SetActiveVectors(name);

if (pPolyData-&gt;GetPointData()-&gt;GetVectors()==NULL)
{
  cerr &lt;&lt; "no vector with name '" &lt;&lt; name &lt;&lt; "'....continue\n";
  continue;
}

double* d = pPolyData-&gt;GetPointData()-&gt;GetVectors()-&gt;GetTuple3(1);
cerr &lt;&lt; name &lt;&lt; " " 
  &lt;&lt; d[0] &lt;&lt; " "
  &lt;&lt; d[1] &lt;&lt; " "
  &lt;&lt; d[2] &lt;&lt; " "
  &lt;&lt; "\n";

}

pWriter->SetInput(pPolyData); pWriter->SetFileName("fran_cut_with_test_vectors_2.vtk"); pWriter->Write(); // Write data set with 'FieldData'

// // 33333333333333333 // cerr << "..........3rd test...........\n";

cerr << " Shows how easy field data may be converted/assigned as vector-attribute to the dataset.\n";

pReader->SetFileName("fran_cut_with_test_vectors_1.vtk"); pReader->Update();

pPolyData->DeepCopy(pReader->GetOutput());

cerr << (pPolyData->GetPointData()->GetVectors() != NULL) << " - should be zero as not vector field is assigned/present\n";

for(i = 0; i < vec_DataArray.size(); ++i) { sprintf(name, "PCTEST%i", i);

pPolyData-&gt;GetPointData()-&gt;SetActiveAttribute(name, vtkDataSetAttributes::VECTORS);

double* d = pPolyData-&gt;GetPointData()-&gt;GetVectors()-&gt;GetTuple3(1);
cerr &lt;&lt; name &lt;&lt; " " 
  &lt;&lt; d[0] &lt;&lt; " "
  &lt;&lt; d[1] &lt;&lt; " "
  &lt;&lt; d[2] &lt;&lt; " "
  &lt;&lt; "\n";

cerr &lt;&lt; "just to show that the number also can be used. BUT IT DOESN'T WORK\n";
pPolyData-&gt;GetPointData()-&gt;SetActiveAttribute((i+1)%vec_DataArray.size(), vtkDataSetAttributes::VECTORS); // just to show that the number also can be used!

d = pPolyData-&gt;GetPointData()-&gt;GetVectors()-&gt;GetTuple3(1);
cerr &lt;&lt; (i+1)%vec_DataArray.size() &lt;&lt; " " 
  &lt;&lt; d[0] &lt;&lt; " "
  &lt;&lt; d[1] &lt;&lt; " "
  &lt;&lt; d[2] &lt;&lt; " "
  &lt;&lt; "\n\n";

}

// // 44444444444444444 // cerr << "..........4th test...........\n";

cerr << " Shows the same as 3rd test but uses vtkAssignAttribute.\n";

vtkAssignAttribute* aa = vtkAssignAttribute::New(); aa->SetInput(pReader->GetOutput());

for(i = 0; i < vec_DataArray.size(); ++i) { sprintf(name, "PCTEST%i", i);

aa-&gt;Assign(name, vtkDataSetAttributes::VECTORS,
  vtkAssignAttribute::POINT_DATA); // POINT_DATA: Attribute found in POINT_DATA not cell data
aa-&gt;Update();

try
{
  double* d = aa-&gt;GetOutput()-&gt;GetPointData()-&gt;GetVectors()-&gt;GetTuple3(1);
  cerr &lt;&lt; name &lt;&lt; " " 
    &lt;&lt; d[0] &lt;&lt; " "
    &lt;&lt; d[1] &lt;&lt; " "
    &lt;&lt; d[2] &lt;&lt; " "
    &lt;&lt; "\n";
}
catch (...) {cerr &lt;&lt; "exception!!!\n";}

}

#define VTKRELEASE(x) x->Delete()

VTKRELEASE(pReader); VTKRELEASE(pPolyData); VTKRELEASE(pWriter);

for(i = 0; i < vec_DataArray.size(); ++i) VTKRELEASE(vec_DataArray[i]);

return;

}

Assignee
Assign to
Time tracking