/*========================================================================= Program: Visualization Toolkit Module: vtkProgrammableElectronicData.cxx 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 "vtkProgrammableElectronicData.h" #include "vtkDataSetCollection.h" #include "vtkImageData.h" #include "vtkObjectFactory.h" #include "vtkNew.h" #include "vtkSmartPointer.h" #include // PIMPL'd std::vector class StdVectorOfImageDataPointers : public std::vector > {}; //---------------------------------------------------------------------------- vtkStandardNewMacro(vtkProgrammableElectronicData); vtkCxxSetObjectMacro(vtkProgrammableElectronicData, ElectronDensity, vtkImageData); //---------------------------------------------------------------------------- vtkProgrammableElectronicData::vtkProgrammableElectronicData() : NumberOfElectrons(0), MOs(new StdVectorOfImageDataPointers), ElectronDensity(nullptr) { } //---------------------------------------------------------------------------- vtkProgrammableElectronicData::~vtkProgrammableElectronicData() { delete this->MOs; this->MOs = nullptr; this->SetElectronDensity(nullptr); } //---------------------------------------------------------------------------- void vtkProgrammableElectronicData::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); os << indent << "NumberOfElectrons: " << this->NumberOfElectrons << "\n"; os << indent << "MOs: (std::vector) @" << this->MOs << "\n"; os << indent.GetNextIndent() << "size: " << this->MOs->size() << "\n"; for (size_t i = 0; i < this->MOs->size(); ++i) { vtkImageData *current = this->MOs->at(i); os << indent.GetNextIndent() << "MO #" << i+1 << " @" << current << "\n"; if (current) current->PrintSelf(os, indent.GetNextIndent().GetNextIndent()); } os << indent << "ElectronDensity: @" << this->ElectronDensity << "\n"; if (this->ElectronDensity) this->ElectronDensity->PrintSelf(os, indent.GetNextIndent().GetNextIndent()); os << indent << "Padding: " << this->Padding << "\n"; } //---------------------------------------------------------------------------- vtkIdType vtkProgrammableElectronicData::GetNumberOfMOs() { return static_cast(this->MOs->size()); } //---------------------------------------------------------------------------- void vtkProgrammableElectronicData::SetNumberOfMOs(vtkIdType size) { if (size == static_cast(this->MOs->size())) { return; } vtkDebugMacro(<<"Resizing MO vector from " << this->MOs->size() << " to " << size << "."); this->MOs->resize(size); this->Modified(); } //---------------------------------------------------------------------------- vtkImageData * vtkProgrammableElectronicData::GetMO(vtkIdType orbitalNumber) { if (orbitalNumber <= 0) { vtkWarningMacro(<< "Request for invalid orbital number "< static_cast(this->MOs->size())) { vtkWarningMacro(<< "Request for orbital number " << orbitalNumber << ", which exceeds the number of MOs (" << this->MOs->size() << ")"); return nullptr; } vtkImageData *result = this->MOs->at(orbitalNumber - 1); vtkDebugMacro(<< "Returning '" << result << "' for MO '" << orbitalNumber << "'"); return result; } //---------------------------------------------------------------------------- void vtkProgrammableElectronicData::SetMO(vtkIdType orbitalNumber, vtkImageData *data) { if (orbitalNumber <= 0) { vtkErrorMacro("Cannot set invalid orbital number "< static_cast(this->MOs->size())) { this->SetNumberOfMOs(orbitalNumber); } vtkImageData *previous = this->MOs->at(orbitalNumber - 1); if (data == previous) return; vtkDebugMacro(<<"Changing MO " << orbitalNumber << " from @" << previous << " to @" << data << "."); this->MOs->at(orbitalNumber - 1) = data; this->Modified(); } //---------------------------------------------------------------------------- void vtkProgrammableElectronicData::DeepCopy(vtkDataObject *obj) { vtkProgrammableElectronicData *source = vtkProgrammableElectronicData::SafeDownCast(obj); if (!source) { vtkErrorMacro("Can only deep copy from vtkProgrammableElectronicData " "or subclass."); return; } // Call superclass this->Superclass::DeepCopy(source); this->NumberOfElectrons = source->NumberOfElectrons; // Grow vector if needed this->SetNumberOfMOs(source->GetNumberOfMOs()); for (size_t i = 0; i < source->MOs->size(); ++i) { vtkImageData *current = source->MOs->at(i); if (current) { vtkNew newImage; newImage->DeepCopy(current); this->SetMO(static_cast(i), newImage); } } if (source->ElectronDensity) { vtkNew newImage; newImage->DeepCopy(source->ElectronDensity); this->SetElectronDensity(newImage); } }