/* * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) * * This file is part of Orfeo Toolbox * * https://www.orfeo-toolbox.org/ * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef otbVectorData_hxx #define otbVectorData_hxx #include "otbVectorData.h" #include "itkPreOrderTreeIterator.h" #include "otbMetaDataKey.h" namespace otb { template VectorData::VectorData() { m_DataTree = DataTreeType::New(); DataNodePointerType root = DataNodeType::New(); root->SetNodeId("Root"); m_DataTree->SetRoot(root); m_Origin.Fill(0); m_Spacing.Fill(1); } template void VectorData::SetProjectionRef(const std::string& projectionRef) { itk::MetaDataDictionary& dict = this->GetMetaDataDictionary(); itk::EncapsulateMetaData(dict, MetaDataKey::ProjectionRefKey, projectionRef); this->Modified(); } template std::string VectorData::GetProjectionRef() const { const itk::MetaDataDictionary& dict = this->GetMetaDataDictionary(); std::string projectionRef; itk::ExposeMetaData(dict, MetaDataKey::ProjectionRefKey, projectionRef); return projectionRef; } template void VectorData::SetSpacing(const SpacingType& spacing) { itkDebugMacro("setting Spacing to " << spacing); if (this->m_Spacing != spacing) { this->m_Spacing = spacing; this->Modified(); } } template void VectorData::SetSpacing(const double spacing[2]) { SpacingType s(spacing); this->SetSpacing(s); } template void VectorData::SetSpacing(const float spacing[2]) { itk::Vector sf(spacing); SpacingType s; s.CastFrom(sf); this->SetSpacing(s); } template void VectorData::SetOrigin(const double origin[2]) { OriginType p(origin); this->SetOrigin(p); } template void VectorData::SetOrigin(const float origin[2]) { itk::Point of(origin); OriginType p; p.CastFrom(of); this->SetOrigin(p); } template bool VectorData::Clear() { return m_DataTree->Clear(); } template int VectorData::Size() const { return m_DataTree->Count(); } template void VectorData::PrintSelf(std::ostream& os, itk::Indent indent) const { Superclass::PrintSelf(os, indent); os << std::endl; itk::PreOrderTreeIterator it(m_DataTree); it.GoToBegin(); while (!it.IsAtEnd()) { itk::PreOrderTreeIterator itParent = it; bool goesOn = true; while (itParent.HasParent() && goesOn) { os << indent; goesOn = itParent.GoToParent(); } os << "+" << it.Get()->GetNodeTypeAsString() << std::endl; ++it; } } template void VectorData::Graft(const itk::DataObject* data) { // call the superclass' implementation Superclass::Graft(data); if (data) { // Attempt to cast data to an Image const Self* vdData; try { vdData = dynamic_cast(data); } catch (...) { return; } if (vdData) { // Copy all the needed data : DataTree, spacing, origin and // Projection Ref m_DataTree = const_cast(vdData->GetDataTree()); this->SetSpacing(vdData->GetSpacing()); this->SetOrigin(vdData->GetOrigin()); this->SetProjectionRef(vdData->GetProjectionRef()); } else { // pointer could not be cast back down itkExceptionMacro(<< "otb::VectorData::Graft() cannot cast " << typeid(data).name() << " to " << typeid(const Self*).name()); } } } } // end namespace otb #endif