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.
194 lines
5.3 KiB
194 lines
5.3 KiB
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: $RCSfile: vtkHierarchicalDataIterator.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 "vtkHierarchicalDataIterator.h"
|
|
|
|
#include "vtkHierarchicalDataSet.h"
|
|
#include "vtkHierarchicalDataSetInternal.h"
|
|
#include "vtkObjectFactory.h"
|
|
|
|
vtkCxxRevisionMacro(vtkHierarchicalDataIterator, "$Revision: 1.3 $");
|
|
vtkStandardNewMacro(vtkHierarchicalDataIterator);
|
|
|
|
class vtkHierarchicalDataIteratorInternal
|
|
{
|
|
public:
|
|
// We store two iterators.
|
|
// DSIterator (DataSets) iterators over the levels
|
|
// LDSIteator (LevelDataSets) iterates over the nodes in the current level
|
|
vtkHierarchicalDataSetInternal::LevelDataSetsIterator LDSIterator;
|
|
vtkHierarchicalDataSetInternal::DataSetsIterator DSIterator;
|
|
};
|
|
|
|
//----------------------------------------------------------------------------
|
|
vtkHierarchicalDataIterator::vtkHierarchicalDataIterator()
|
|
{
|
|
this->DataSet = 0;
|
|
this->Internal = new vtkHierarchicalDataIteratorInternal;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
vtkHierarchicalDataIterator::~vtkHierarchicalDataIterator()
|
|
{
|
|
this->SetDataSet(0);
|
|
delete this->Internal;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void vtkHierarchicalDataIterator::SetDataSet(vtkHierarchicalDataSet* dataset)
|
|
{
|
|
if (this->DataSet != dataset)
|
|
{
|
|
if (this->DataSet)
|
|
{
|
|
this->DataSet->UnRegister(this);
|
|
}
|
|
this->DataSet = dataset;
|
|
if (this->DataSet)
|
|
{
|
|
this->DataSet->Register(this);
|
|
this->GoToFirstItem();
|
|
}
|
|
this->Modified();
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void vtkHierarchicalDataIterator::GoToFirstItem()
|
|
{
|
|
if (!this->DataSet)
|
|
{
|
|
vtkErrorMacro("No data object has been set.");
|
|
return;
|
|
}
|
|
// Initialize to the first level
|
|
this->Internal->DSIterator = this->DataSet->Internal->DataSets.begin();
|
|
if ( !this->DataSet->Internal->DataSets.empty() )
|
|
{
|
|
// Initialize to the first node in the first level
|
|
this->Internal->LDSIterator = this->Internal->DSIterator->begin();
|
|
if (this->Internal->LDSIterator == this->Internal->DSIterator->end())
|
|
{
|
|
this->GoToNextNonEmptyLevel();
|
|
}
|
|
// Skip nodes with NULL dataset pointers.
|
|
if (!this->IsDoneWithTraversal() && !this->GetCurrentDataObject())
|
|
{
|
|
this->GoToNextItem();
|
|
}
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void vtkHierarchicalDataIterator::GoToNextNonEmptyLevel()
|
|
{
|
|
if (!this->IsDoneWithTraversal())
|
|
{
|
|
while (1)
|
|
{
|
|
this->Internal->DSIterator++;
|
|
if (this->IsDoneWithTraversal())
|
|
{
|
|
break;
|
|
}
|
|
this->Internal->LDSIterator = this->Internal->DSIterator->begin();
|
|
if (this->Internal->LDSIterator != this->Internal->DSIterator->end())
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void vtkHierarchicalDataIterator::GoToNextItem()
|
|
{
|
|
if (!this->DataSet)
|
|
{
|
|
vtkErrorMacro("No data object has been set.");
|
|
return;
|
|
}
|
|
if (!this->IsDoneWithTraversal())
|
|
{
|
|
// In case the first level is empty
|
|
if (this->Internal->LDSIterator == this->Internal->DSIterator->end())
|
|
{
|
|
this->GoToNextNonEmptyLevel();
|
|
if (this->IsDoneWithTraversal())
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
|
|
this->Internal->LDSIterator++;
|
|
if (this->Internal->LDSIterator == this->Internal->DSIterator->end())
|
|
{
|
|
this->GoToNextNonEmptyLevel();
|
|
if (this->IsDoneWithTraversal())
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
// Skip nodes with NULL dataset pointers.
|
|
if (!this->GetCurrentDataObject())
|
|
{
|
|
this->GoToNextItem();
|
|
}
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
int vtkHierarchicalDataIterator::IsDoneWithTraversal()
|
|
{
|
|
if (!this->DataSet)
|
|
{
|
|
vtkErrorMacro("No data object has been set.");
|
|
return 1;
|
|
}
|
|
|
|
if ( this->DataSet->Internal->DataSets.empty() ||
|
|
this->Internal->DSIterator == this->DataSet->Internal->DataSets.end() )
|
|
{
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
vtkDataObject* vtkHierarchicalDataIterator::GetCurrentDataObject()
|
|
{
|
|
if ( !this->DataSet || this->DataSet->Internal->DataSets.empty() )
|
|
{
|
|
return 0;
|
|
}
|
|
return this->Internal->LDSIterator->GetPointer();
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void vtkHierarchicalDataIterator::PrintSelf(ostream& os, vtkIndent indent)
|
|
{
|
|
this->Superclass::PrintSelf(os,indent);
|
|
|
|
os << indent << "DataSet: ";
|
|
if (this->DataSet)
|
|
{
|
|
os << endl;
|
|
this->DataSet->PrintSelf(os, indent.GetNextIndent());
|
|
}
|
|
else
|
|
{
|
|
os << "(none)" << endl;
|
|
}
|
|
}
|
|
|
|
|