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.
 
 
 
 
 
 

369 lines
11 KiB

/*=========================================================================
Program: Visualization Toolkit
Module: $RCSfile: vtkHierarchicalDataSet.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 "vtkHierarchicalDataSet.h"
#include "vtkDataSet.h"
#include "vtkHierarchicalDataInformation.h"
#include "vtkHierarchicalDataIterator.h"
#include "vtkHierarchicalDataSetInternal.h"
#include "vtkInformation.h"
#include "vtkInformationVector.h"
#include "vtkInformationIntegerKey.h"
#include "vtkObjectFactory.h"
vtkCxxRevisionMacro(vtkHierarchicalDataSet, "$Revision: 1.7.6.1 $");
vtkStandardNewMacro(vtkHierarchicalDataSet);
vtkCxxSetObjectMacro(vtkHierarchicalDataSet,HierarchicalDataInformation,vtkHierarchicalDataInformation);
vtkInformationKeyMacro(vtkHierarchicalDataSet,LEVEL,Integer);
//----------------------------------------------------------------------------
vtkHierarchicalDataSet::vtkHierarchicalDataSet()
{
this->Internal = new vtkHierarchicalDataSetInternal;
this->HierarchicalDataInformation = vtkHierarchicalDataInformation::New();
}
//----------------------------------------------------------------------------
vtkHierarchicalDataSet::~vtkHierarchicalDataSet()
{
this->InitializeDataSets();
delete this->Internal;
this->SetHierarchicalDataInformation(0);
}
//----------------------------------------------------------------------------
vtkCompositeDataIterator* vtkHierarchicalDataSet::NewIterator()
{
vtkHierarchicalDataIterator* iter = vtkHierarchicalDataIterator::New();
iter->SetDataSet(this);
return iter;
}
//----------------------------------------------------------------------------
vtkHDSNode* vtkHierarchicalDataSet::NewNode()
{
return new vtkHDSNode;
}
//----------------------------------------------------------------------------
void vtkHierarchicalDataSet::InitializeDataSets()
{
this->Internal->DataSets.clear();
}
//----------------------------------------------------------------------------
void vtkHierarchicalDataSet::Initialize()
{
this->Superclass::Initialize();
this->InitializeDataSets();
this->SetHierarchicalDataInformation(0);
this->HierarchicalDataInformation = vtkHierarchicalDataInformation::New();
}
//----------------------------------------------------------------------------
unsigned int vtkHierarchicalDataSet::GetNumberOfLevels()
{
return this->Internal->DataSets.size();
}
//----------------------------------------------------------------------------
void vtkHierarchicalDataSet::SetNumberOfLevels(unsigned int numLevels)
{
this->HierarchicalDataInformation->SetNumberOfLevels(numLevels);
if (numLevels == this->GetNumberOfLevels())
{
return;
}
this->Internal->DataSets.resize(numLevels);
this->Modified();
}
//----------------------------------------------------------------------------
unsigned int vtkHierarchicalDataSet::GetNumberOfDataSets(unsigned int level)
{
if (this->Internal->DataSets.size() <= level)
{
return 0;
}
vtkHierarchicalDataSetInternal::LevelDataSetsType& ldataSets =
this->Internal->DataSets[level];
return ldataSets.size();
}
//----------------------------------------------------------------------------
void vtkHierarchicalDataSet::SetNumberOfDataSets(unsigned int level,
unsigned int numDataSets)
{
this->HierarchicalDataInformation->SetNumberOfDataSets(level, numDataSets);
if (numDataSets == this->GetNumberOfDataSets(level))
{
return;
}
// Make sure that there is a vector allocated for this level
if (this->Internal->DataSets.size() <= level)
{
this->SetNumberOfLevels(level+1);
}
vtkHierarchicalDataSetInternal::LevelDataSetsType& ldataSets =
this->Internal->DataSets[level];
// We need to delete all extra nodes since we manage memory for them.
unsigned int curNumDataSets = ldataSets.size();
ldataSets.resize(numDataSets);
// Assign NULL to all new pointers. We use this later to figure out
// whether a node allocated for a particular entry.
if (curNumDataSets < numDataSets)
{
for (unsigned int i=curNumDataSets; i<numDataSets; i++)
{
ldataSets[i] = 0;
}
}
this->Modified();
}
//----------------------------------------------------------------------------
void vtkHierarchicalDataSet::InitializeNode(unsigned int level,
unsigned int id)
{
// Make sure that there is a vector allocated for this level
if (this->Internal->DataSets.size() <= level)
{
this->SetNumberOfLevels(level+1);
}
vtkHierarchicalDataSetInternal::LevelDataSetsType& ldataSets =
this->Internal->DataSets[level];
// Make sure that the size of the vector for this level is big enough.
if (ldataSets.size() <= id)
{
this->SetNumberOfDataSets(level, id+1);
}
ldataSets[id] = 0;
this->Modified();
}
//----------------------------------------------------------------------------
void vtkHierarchicalDataSet::SetDataSet(unsigned int level,
unsigned int id,
vtkDataObject* ds)
{
// Make sure that there is a vector allocated for this level
if (this->Internal->DataSets.size() <= level)
{
this->SetNumberOfLevels(level+1);
}
vtkHierarchicalDataSetInternal::LevelDataSetsType& ldataSets =
this->Internal->DataSets[level];
// Make sure that the size of the vector for this level is big enough.
if (ldataSets.size() <= id)
{
this->SetNumberOfDataSets(level, id+1);
}
ldataSets[id] = ds;
this->Modified();
}
//----------------------------------------------------------------------------
void vtkHierarchicalDataSet::AddDataSet(vtkInformation* index, vtkDataObject* dobj)
{
if (index->Has(INDEX()) && index->Has(LEVEL()))
{
this->SetDataSet(index->Get(LEVEL()), index->Get(INDEX()), dobj);
}
}
//----------------------------------------------------------------------------
vtkDataObject* vtkHierarchicalDataSet::GetDataSet(unsigned int level,
unsigned int id)
{
if (this->Internal->DataSets.size() <= level)
{
return 0;
}
vtkHierarchicalDataSetInternal::LevelDataSetsType& ldataSets =
this->Internal->DataSets[level];
if (ldataSets.size() <= id)
{
return 0;
}
if (!ldataSets[id])
{
return 0;
}
return ldataSets[id];
}
//----------------------------------------------------------------------------
vtkDataObject* vtkHierarchicalDataSet::GetDataSet(vtkInformation* index)
{
if (index->Has(INDEX()) && index->Has(LEVEL()))
{
return this->GetDataSet(index->Get(LEVEL()), index->Get(INDEX()));
}
return 0;
}
//----------------------------------------------------------------------------
void vtkHierarchicalDataSet::ShallowCopy(vtkDataObject *src)
{
if (src == this)
{
return;
}
this->InitializeDataSets();
this->Superclass::ShallowCopy(src);
vtkHierarchicalDataSet* from = vtkHierarchicalDataSet::SafeDownCast(src);
if (from)
{
this->SetHierarchicalDataInformation(from->HierarchicalDataInformation);
unsigned int numLevels = from->GetNumberOfLevels();
this->SetNumberOfLevels(numLevels);
for (unsigned int i=0; i<numLevels; i++)
{
unsigned int numDataSets = from->GetNumberOfDataSets(i);
this->SetNumberOfDataSets(i, numDataSets);
for (unsigned int j=0; j<numDataSets; j++)
{
this->SetDataSet(i, j, from->GetDataSet(i,j));
}
}
}
this->Modified();
}
//----------------------------------------------------------------------------
void vtkHierarchicalDataSet::DeepCopy(vtkDataObject *src)
{
if (src == this)
{
return;
}
this->InitializeDataSets();
this->Superclass::ShallowCopy(src);
this->SetHierarchicalDataInformation(0);
this->HierarchicalDataInformation = vtkHierarchicalDataInformation::New();
vtkHierarchicalDataSet* from = vtkHierarchicalDataSet::SafeDownCast(src);
if (from)
{
this->HierarchicalDataInformation->DeepCopy(
from->HierarchicalDataInformation);
unsigned int numLevels = from->GetNumberOfLevels();
this->SetNumberOfLevels(numLevels);
for (unsigned int i=0; i<numLevels; i++)
{
unsigned int numDataSets = from->GetNumberOfDataSets(i);
this->SetNumberOfDataSets(i, numDataSets);
for (unsigned int j=0; j<numDataSets; j++)
{
vtkDataObject* ds = from->GetDataSet(i,j);
if (ds)
{
vtkDataObject* copy = ds->NewInstance();
copy->DeepCopy(ds);
this->SetDataSet(i, j, copy);
}
}
}
}
this->Modified();
}
//----------------------------------------------------------------------------
vtkIdType vtkHierarchicalDataSet::GetNumberOfPoints()
{
vtkIdType numPts = 0;
vtkCompositeDataIterator* iterator = this->NewIterator();
iterator->InitTraversal();
while (!iterator->IsDoneWithTraversal())
{
vtkDataObject* dObj = iterator->GetCurrentDataObject();
if (dObj)
{
vtkDataSet* ds = vtkDataSet::SafeDownCast(dObj);
if (ds)
{
numPts += ds->GetNumberOfPoints();
}
else
{
vtkHierarchicalDataSet* hds =
vtkHierarchicalDataSet::SafeDownCast(dObj);
if (hds)
{
numPts += hds->GetNumberOfPoints();
}
}
}
iterator->GoToNextItem();
}
iterator->Delete();
return numPts;
}
//----------------------------------------------------------------------------
vtkHierarchicalDataSet* vtkHierarchicalDataSet::GetData(vtkInformation* info)
{
return
info? vtkHierarchicalDataSet::SafeDownCast(info->Get(DATA_OBJECT())) : 0;
}
//----------------------------------------------------------------------------
vtkHierarchicalDataSet*
vtkHierarchicalDataSet::GetData(vtkInformationVector* v, int i)
{
return vtkHierarchicalDataSet::GetData(v->GetInformationObject(i));
}
//----------------------------------------------------------------------------
void vtkHierarchicalDataSet::PrintSelf(ostream& os, vtkIndent indent)
{
this->Superclass::PrintSelf(os,indent);
os << indent << "HierarchicalDataInformation: ";
if (this->HierarchicalDataInformation)
{
os << endl;
this->HierarchicalDataInformation->PrintSelf(os, indent.GetNextIndent());
}
else
{
os << "(none)" << endl;
}
}