Cloned library of VTK-5.0.0 with extra build files for internal package management.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

383 lines
11 KiB

/*=========================================================================
Program: Visualization Toolkit
Module: $RCSfile: vtkDataArraySelection.cxx,v $
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
#include "vtkDataArraySelection.h"
#include "vtkObjectFactory.h"
#include <vtkstd/vector>
#include <vtkstd/string>
vtkCxxRevisionMacro(vtkDataArraySelection, "$Revision: 1.21 $");
vtkStandardNewMacro(vtkDataArraySelection);
class vtkDataArraySelectionInternals
{
public:
vtkstd::vector<vtkstd::string> ArrayNames;
vtkstd::vector<int> ArraySettings;
};
//----------------------------------------------------------------------------
vtkDataArraySelection::vtkDataArraySelection()
{
this->Internal = new vtkDataArraySelectionInternals;
}
//----------------------------------------------------------------------------
vtkDataArraySelection::~vtkDataArraySelection()
{
delete this->Internal;
}
//----------------------------------------------------------------------------
void vtkDataArraySelection::PrintSelf(ostream& os, vtkIndent indent)
{
this->Superclass::PrintSelf(os, indent);
os << indent << "Number of Arrays: " << this->GetNumberOfArrays() << "\n";
vtkIndent nindent = indent.GetNextIndent();
int cc;
for ( cc = 0; cc < this->GetNumberOfArrays(); cc ++ )
{
os << nindent << "Array: " << this->GetArrayName(cc) << " is: "
<< (this->GetArraySetting(cc)?"enabled":"disabled")
<< " (" << this->ArrayIsEnabled(this->GetArrayName(cc)) << ")" << endl;
}
}
//----------------------------------------------------------------------------
void vtkDataArraySelection::EnableArray(const char* name)
{
vtkDebugMacro("Enabling array \"" << name << "\".");
int index = this->GetArrayIndex(name);
if(index >= 0)
{
if(!this->Internal->ArraySettings[index])
{
this->Internal->ArraySettings[index] = 1;
this->Modified();
}
}
else
{
this->Internal->ArrayNames.push_back(name);
this->Internal->ArraySettings.push_back(1);
this->Modified();
}
}
//----------------------------------------------------------------------------
void vtkDataArraySelection::DisableArray(const char* name)
{
vtkDebugMacro("Disabling array \"" << name << "\".");
int index = this->GetArrayIndex(name);
if(index >= 0)
{
if(this->Internal->ArraySettings[index])
{
this->Internal->ArraySettings[index] = 0;
this->Modified();
}
}
else
{
this->Internal->ArrayNames.push_back(name);
this->Internal->ArraySettings.push_back(0);
this->Modified();
}
}
//----------------------------------------------------------------------------
int vtkDataArraySelection::ArrayIsEnabled(const char* name)
{
// Check if there is a specific entry for this array.
int index = this->GetArrayIndex(name);
if(index >= 0)
{
return this->Internal->ArraySettings[index];
}
// The array does not have an entry. Assume it is disabled.
return 0;
}
//----------------------------------------------------------------------------
int vtkDataArraySelection::ArrayExists(const char* name)
{
// Check if there is a specific entry for this array.
return (this->GetArrayIndex(name) >= 0)? 1:0;
}
//----------------------------------------------------------------------------
void vtkDataArraySelection::EnableAllArrays()
{
vtkDebugMacro("Enabling all arrays.");
int modified = 0;
for(vtkstd::vector<int>::iterator i = this->Internal->ArraySettings.begin();
i != this->Internal->ArraySettings.end(); ++i)
{
if(!*i)
{
*i = 1;
modified = 1;
}
}
if(modified)
{
this->Modified();
}
}
//----------------------------------------------------------------------------
void vtkDataArraySelection::DisableAllArrays()
{
vtkDebugMacro("Disabling all arrays.");
int modified = 0;
for(vtkstd::vector<int>::iterator i = this->Internal->ArraySettings.begin();
i != this->Internal->ArraySettings.end(); ++i)
{
if(*i)
{
*i = 0;
modified = 1;
}
}
if(modified)
{
this->Modified();
}
}
//----------------------------------------------------------------------------
int vtkDataArraySelection::GetNumberOfArrays()
{
return static_cast<int>(this->Internal->ArrayNames.size());
}
//----------------------------------------------------------------------------
int vtkDataArraySelection::GetNumberOfArraysEnabled()
{
int numArrays = 0;
for(vtkstd::vector<int>::iterator i = this->Internal->ArraySettings.begin();
i != this->Internal->ArraySettings.end(); ++i)
{
if(*i)
{
numArrays++;
}
}
return numArrays;
}
//----------------------------------------------------------------------------
const char* vtkDataArraySelection::GetArrayName(int index)
{
if(index >= 0 && index < this->GetNumberOfArrays())
{
return this->Internal->ArrayNames[index].c_str();
}
return 0;
}
//----------------------------------------------------------------------------
int vtkDataArraySelection::GetArrayIndex(const char* name)
{
for(unsigned int i=0; i < this->Internal->ArrayNames.size(); ++i)
{
if(this->Internal->ArrayNames[i] == name)
{
return i;
}
}
return -1;
}
//----------------------------------------------------------------------------
int vtkDataArraySelection::GetEnabledArrayIndex(const char* name)
{
int index = 0;
for(unsigned int i=0; i < this->Internal->ArrayNames.size(); ++i)
{
if(this->Internal->ArrayNames[i] == name)
{
return index;
}
else if(this->Internal->ArraySettings[i])
{
++index;
}
}
return -1;
}
//----------------------------------------------------------------------------
int vtkDataArraySelection::GetArraySetting(int index)
{
if(index >= 0 && index < this->GetNumberOfArrays())
{
return this->Internal->ArraySettings[index];
}
return 0;
}
//----------------------------------------------------------------------------
void vtkDataArraySelection::RemoveAllArrays()
{
vtkDebugMacro("Removing all arrays.");
if(this->GetNumberOfArrays() > 0)
{
this->Internal->ArrayNames.erase(this->Internal->ArrayNames.begin(),
this->Internal->ArrayNames.end());
this->Internal->ArraySettings.erase(this->Internal->ArraySettings.begin(),
this->Internal->ArraySettings.end());
this->Modified();
}
}
//----------------------------------------------------------------------------
int vtkDataArraySelection::AddArray(const char* name)
{
vtkDebugMacro("Adding array \"" << name << "\".");
// This function is called only by the filter owning the selection.
// It should not call Modified() because array settings are not
// changed.
if(this->ArrayExists(name))
{
return 0;
}
this->Internal->ArrayNames.push_back(name);
this->Internal->ArraySettings.push_back(1);
return 1;
}
//----------------------------------------------------------------------------
void vtkDataArraySelection::RemoveArrayByIndex(int index)
{
if(index >= 0 && index < this->GetNumberOfArrays())
{
this->Internal->ArrayNames.erase(
this->Internal->ArrayNames.begin()+index
);
this->Internal->ArraySettings.erase(
this->Internal->ArraySettings.begin()+index
);
}
}
//----------------------------------------------------------------------------
void vtkDataArraySelection::RemoveArrayByName(const char *name)
{
this->RemoveArrayByIndex(this->GetArrayIndex(name));
}
//----------------------------------------------------------------------------
void vtkDataArraySelection::SetArrays(const char* const* names, int numArrays)
{
this->SetArraysWithDefault(names, numArrays, 1);
}
//----------------------------------------------------------------------------
void vtkDataArraySelection::SetArraysWithDefault(const char* const* names,
int numArrays,
int defaultStatus)
{
// This function is called only by the filter owning the selection.
// It should not call Modified() because array settings are not
// changed.
vtkDebugMacro("Settings arrays to given list of " << numArrays
<< " arrays.");
// Create a new map for this set of arrays.
vtkDataArraySelectionInternals* newInternal =
new vtkDataArraySelectionInternals;
newInternal->ArrayNames.reserve(numArrays);
newInternal->ArraySettings.reserve(numArrays);
// Fill with settings for all arrays.
int i;
for(i=0;i < numArrays; ++i)
{
// Add this array.
newInternal->ArrayNames.push_back(names[i]);
// Fill in the setting. Use the old value if available.
// Otherwise, use the given default.
int setting = defaultStatus?1:0;
int index = this->GetArrayIndex(names[i]);
if(index >= 0)
{
setting = this->Internal->ArraySettings[index];
}
newInternal->ArraySettings.push_back(setting);
}
// Delete the old map and save the new one.
delete this->Internal;
this->Internal = newInternal;
}
//----------------------------------------------------------------------------
void vtkDataArraySelection::CopySelections(vtkDataArraySelection* selections)
{
if(this == selections)
{
return;
}
int needUpdate = 0;
int i;
const char* arrayName;
if (this->GetNumberOfArrays() != selections->GetNumberOfArrays())
{
needUpdate = 1;
}
else
{
for (i = 0; i < this->GetNumberOfArrays(); i++)
{
arrayName = this->GetArrayName(i);
if (!selections->ArrayExists(arrayName))
{
needUpdate = 1;
break;
}
if (selections->ArrayIsEnabled(arrayName) !=
this->ArrayIsEnabled(arrayName))
{
needUpdate = 1;
break;
}
}
}
if (!needUpdate)
{
return;
}
vtkDebugMacro("Copying arrays and settings from " << selections << ".");
this->RemoveAllArrays();
this->Internal->ArrayNames.insert(this->Internal->ArrayNames.begin(),
selections->Internal->ArrayNames.begin(),
selections->Internal->ArrayNames.end());
this->Internal->ArraySettings.insert(
this->Internal->ArraySettings.begin(),
selections->Internal->ArraySettings.begin(),
selections->Internal->ArraySettings.end()
);
this->Modified();
}