Commit 13b31513 authored by Utkarsh Ayachit's avatar Utkarsh Ayachit

Adding new naming modes to vtkSplitColumnComponents.

vtkSplitColumnComponents now support multiple naming conventions for naming
array components, including ways to use the component name specified in the
array, if any.

Also enabled the TestTableSplitColumnComponents and adding logic to test the new
naming modes in it.

Change-Id: I42848d522d643043cbb6fb793f1d5ad3c63c52f4
parent 0ae9a6d7
vtk_add_test_cxx(
TestGraphWeightEuclideanDistanceFilter.cxx,NO_VALID
BoxClipPolyData.cxx
BoxClipTetrahedra.cxx
BoxClipTriangulate.cxx,NO_VALID
BoxClipTriangulateAndInterpolate.cxx
BoxClipTriangulate.cxx,NO_VALID
TestAppendPoints.cxx,NO_VALID
TestBooleanOperationPolyDataFilter.cxx
TestBooleanOperationPolyDataFilter2.cxx
TestContourTriangulator.cxx
TestBooleanOperationPolyDataFilter.cxx
TestContourTriangulatorCutter.cxx
TestContourTriangulator.cxx
TestContourTriangulatorMarching.cxx
TestDeformPointSet.cxx
TestDensifyPolyData.cxx,-E15
TestDistancePolyDataFilter.cxx
TestGraphWeightEuclideanDistanceFilter.cxx,NO_VALID
TestImageDataToPointSet.cxx,NO_VALID
TestIntersectionPolyDataFilter.cxx
TestIntersectionPolyDataFilter2.cxx,NO_VALID
TestIntersectionPolyDataFilter.cxx
TestRectilinearGridToPointSet.cxx,NO_VALID
TestReflectionFilter.cxx,NO_VALID
TestTableSplitColumnComponents.cxx,NO_VALID
TestTransformFilter.cxx,NO_VALID
TestTransformPolyDataFilter.cxx,NO_VALID
TestUncertaintyTubeFilter.cxx
......
......@@ -55,7 +55,7 @@ int TestTableSplitColumnComponents(int, char*[])
{
vtkGenericWarningMacro(<< "Incorrect column count: "
<< out->GetNumberOfColumns());
return 1;
return EXIT_FAILURE;
}
vtkIntArray* arrays[4];
arrays[0] = vtkIntArray::SafeDownCast(out->GetColumn(0));
......@@ -65,7 +65,7 @@ int TestTableSplitColumnComponents(int, char*[])
if (arrays[0] == 0 || arrays[1] == 0 || arrays[2] == 0 || arrays[3] == 0)
{
vtkGenericWarningMacro(<< "One of the output arrays was zero - type change?");
return 1;
return EXIT_FAILURE;
}
for (int i = 0; i < 5; ++i)
......@@ -80,5 +80,42 @@ int TestTableSplitColumnComponents(int, char*[])
}
}
// Test naming modes.
if (strcmp(arrays[1]->GetName(), "Multi (0)") != 0)
{
vtkGenericWarningMacro("Incorrect name. NamingMode not being respected correctly.");
return EXIT_FAILURE;
}
split->SetNamingModeToNumberWithUnderscores();
split->Update();
out = split->GetOutput(0);
arrays[1] = vtkIntArray::SafeDownCast(out->GetColumn(1));
if (strcmp(arrays[1]->GetName(), "Multi_0") != 0)
{
vtkGenericWarningMacro("Incorrect name. NamingMode not being respected correctly.");
return EXIT_FAILURE;
}
split->SetNamingModeToNamesWithParens();
split->Update();
out = split->GetOutput(0);
arrays[1] = vtkIntArray::SafeDownCast(out->GetColumn(1));
if (strcmp(arrays[1]->GetName(), "Multi (X)") != 0)
{
vtkGenericWarningMacro("Incorrect name. NamingMode not being respected correctly.");
return EXIT_FAILURE;
}
split->SetNamingModeToNamesWithUnderscores();
split->Update();
out = split->GetOutput(0);
arrays[1] = vtkIntArray::SafeDownCast(out->GetColumn(1));
if (strcmp(arrays[1]->GetName(), "Multi_X") != 0)
{
vtkGenericWarningMacro("Incorrect name. NamingMode not being respected correctly.");
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
......@@ -12,13 +12,13 @@
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
#include "vtkSplitColumnComponents.h"
#include "vtkAbstractArray.h"
#include "vtkInformation.h"
#include "vtkInformationVector.h"
#include "vtkObjectFactory.h"
#include "vtkAbstractArray.h"
#include "vtkStdString.h"
#include "vtkTable.h"
#include "vtksys/ios/sstream"
......@@ -31,6 +31,7 @@ vtkSplitColumnComponents::vtkSplitColumnComponents()
this->SetNumberOfInputPorts(1);
this->SetNumberOfOutputPorts(1);
this->CalculateMagnitudes = true;
this->NamingMode = NUMBERS_WITH_PARENS;
}
//---------------------------------------------------------------------------
......@@ -91,7 +92,6 @@ int vtkSplitColumnComponents::RequestData(
for (int i = 0; i < table->GetNumberOfColumns(); ++i)
{
vtkAbstractArray* col = table->GetColumn(i);
char* name = col->GetName();
int components = col->GetNumberOfComponents();
if (components == 1)
{
......@@ -103,10 +103,9 @@ int vtkSplitColumnComponents::RequestData(
int colSize = col->GetNumberOfTuples();
for (int j = 0; j < components; ++j)
{
vtksys_ios::ostringstream ostr;
ostr << name << " (" << j << ")";
vtkStdString component_label = this->GetComponentLabel(col, j);
vtkAbstractArray* newCol = vtkAbstractArray::CreateArray(col->GetDataType());
newCol->SetName(ostr.str().c_str());
newCol->SetName(component_label.c_str());
newCol->SetNumberOfTuples(colSize);
// Now copy the components into their new columns
switch(col->GetDataType())
......@@ -123,10 +122,10 @@ int vtkSplitColumnComponents::RequestData(
// Add a magnitude column and calculate values if requested
if (this->CalculateMagnitudes && col->IsA("vtkDataArray"))
{
vtksys_ios::ostringstream ostr;
ostr << name << " (Magnitude)";
vtkStdString component_label = this->GetComponentLabel(
col, -1 /* for magnitude */);
vtkAbstractArray* newCol = vtkAbstractArray::CreateArray(col->GetDataType());
newCol->SetName(ostr.str().c_str());
newCol->SetName(component_label.c_str());
newCol->SetNumberOfTuples(colSize);
// Now calculate the magnitude column
switch(col->GetDataType())
......@@ -146,9 +145,114 @@ int vtkSplitColumnComponents::RequestData(
return 1;
}
namespace
{
//----------------------------------------------------------------------------
std::string vtkDefaultComponentName(int componentNumber, int componentCount)
{
if (componentCount <= 1)
{
return "";
}
else if (componentNumber == -1)
{
return "Magnitude";
}
else if (componentCount <= 3 && componentNumber < 3)
{
const char* titles[] = {"X", "Y", "Z"};
return titles[componentNumber];
}
else if (componentCount == 6)
{
const char* titles[] = {"XX", "YY", "ZZ", "XY", "YZ", "XZ"};
// Assume this is a symmetric matrix.
return titles[componentNumber];
}
else
{
std::ostringstream buffer;
buffer << componentNumber;
return buffer.str();
}
}
std::string vtkGetComponentName(vtkAbstractArray* array, int component_no)
{
const char* name = array->GetComponentName(component_no);
if (name)
{
return name;
}
return vtkDefaultComponentName(component_no, array->GetNumberOfComponents());
}
};
//---------------------------------------------------------------------------
vtkStdString vtkSplitColumnComponents::GetComponentLabel(
vtkAbstractArray* array, int component_no)
{
std::ostringstream stream;
switch (this->NamingMode)
{
case NUMBERS_WITH_PARENS:
stream << array->GetName() << " (";
if (component_no == -1)
{
stream << "Magnitude)";
}
else
{
stream << component_no << ")";
}
break;
case NUMBERS_WITH_UNDERSCORES:
stream << array->GetName() << "_";
if (component_no == -1)
{
stream << "Magnitude";
}
else
{
stream << component_no;
}
break;
case NAMES_WITH_PARENS:
stream << array->GetName() << " ("
<< vtkGetComponentName(array, component_no).c_str() << ")";
break;
case NAMES_WITH_UNDERSCORES:
default:
stream << array->GetName() << "_"
<< vtkGetComponentName(array, component_no).c_str();;
break;
}
return stream.str();
}
//---------------------------------------------------------------------------
void vtkSplitColumnComponents::PrintSelf(ostream& os, vtkIndent indent)
{
this->Superclass::PrintSelf(os, indent);
os << indent << "CalculateMagnitudes: " << this->CalculateMagnitudes << endl;
os << indent << "NamingMode: ";
switch(this->NamingMode)
{
case NAMES_WITH_UNDERSCORES:
os << "NAMES_WITH_UNDERSCORES" << endl;
break;
case NAMES_WITH_PARENS:
os << "NAMES_WITH_PARENS" << endl;
break;
case NUMBERS_WITH_UNDERSCORES:
os << "NUMBERS_WITH_UNDERSCORES" << endl;
break;
case NUMBERS_WITH_PARENS:
os << "NUMBERS_WITH_PARENS" << endl;
break;
default:
os << "INVALID" << endl;
}
}
......@@ -22,8 +22,14 @@
// .SECTION Description
// Splits any columns in a table that have more than one component into
// individual columns. Single component columns are passed through without
// any data duplication. So if column names "Points" had three components
// this column would be split into "Points (0)", "Points (1)" and Points (2)".
// any data duplication.
// NamingMode can be used to control how columns with multiple components are
// labelled in the output, e.g., if column names "Points" had three components
// this column would be split into "Points (0)", "Points (1)", and Points (2)"
// when NamingMode is NUMBERS_WITH_PARENS, into Points_0, Points_1, and Points_2
// when NamingMode is NUMBERS_WITH_UNDERSCORES, into "Points (X)", "Points (Y)",
// and "Points (Z)" when NamingMode is NAMES_WITH_PARENS, and into Points_X,
// Points_Y, and Points_Z when NamingMode is NAMES_WITH_UNDERSCORES.
#ifndef __vtkSplitColumnComponents_h
#define __vtkSplitColumnComponents_h
......@@ -31,6 +37,7 @@
#include "vtkFiltersGeneralModule.h" // For export macro
#include "vtkTableAlgorithm.h"
class vtkStdString;
class VTKFILTERSGENERAL_EXPORT vtkSplitColumnComponents : public vtkTableAlgorithm
{
public:
......@@ -45,10 +52,37 @@ public:
vtkSetMacro(CalculateMagnitudes, bool);
vtkGetMacro(CalculateMagnitudes, bool);
enum
{
NUMBERS_WITH_PARENS = 0, // e.g Points (0)
NAMES_WITH_PARENS = 1, // e.g. Points (X)
NUMBERS_WITH_UNDERSCORES=2, // e.g. Points_0
NAMES_WITH_UNDERSCORES=3 // e.g. Points_X
};
// Description:
// Get/Set the array naming mode.
// Description is NUMBERS_WITH_PARENS.
vtkSetClampMacro(NamingMode, int, NUMBERS_WITH_PARENS, NAMES_WITH_UNDERSCORES);
void SetNamingModeToNumberWithParens()
{ this->SetNamingMode(NUMBERS_WITH_PARENS); }
void SetNamingModeToNumberWithUnderscores()
{ this->SetNamingMode(NUMBERS_WITH_UNDERSCORES); }
void SetNamingModeToNamesWithParens()
{ this->SetNamingMode(NAMES_WITH_PARENS); }
void SetNamingModeToNamesWithUnderscores()
{ this->SetNamingMode(NAMES_WITH_UNDERSCORES); }
vtkGetMacro(NamingMode, int);
protected:
vtkSplitColumnComponents();
~vtkSplitColumnComponents();
// Description:
// Returns the label to use for the specific component in the array based on
// this->NamingMode. Use component_no==-1 for magnitude.
vtkStdString GetComponentLabel(vtkAbstractArray* array, int component_no);
bool CalculateMagnitudes;
int RequestData(
......@@ -56,6 +90,7 @@ protected:
vtkInformationVector**,
vtkInformationVector*);
int NamingMode;
private:
vtkSplitColumnComponents(const vtkSplitColumnComponents&); // Not implemented
void operator=(const vtkSplitColumnComponents&); // Not implemented
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment