Skip to content

Commit

Permalink
Merge pull request #4867 from N-Dekker/PointSetBase
Browse files Browse the repository at this point in the history
ENH: Add `itk::PointSetBase` as abstract base class of `itk::PointSet`
  • Loading branch information
thewtex authored Oct 7, 2024
2 parents 9413dc4 + 4b92507 commit bf0ed18
Show file tree
Hide file tree
Showing 7 changed files with 604 additions and 429 deletions.
129 changes: 3 additions & 126 deletions Modules/Core/Common/include/itkPointSet.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,8 @@
#ifndef itkPointSet_h
#define itkPointSet_h

#include "itkDataObject.h"
#include "itkPointSetBase.h"
#include "itkDefaultStaticMeshTraits.h"
#include <vector>
#include <set>

namespace itk
Expand Down Expand Up @@ -79,14 +78,14 @@ namespace itk
template <typename TPixelType,
unsigned int VDimension = 3,
typename TMeshTraits = DefaultStaticMeshTraits<TPixelType, VDimension, VDimension>>
class ITK_TEMPLATE_EXPORT PointSet : public DataObject
class ITK_TEMPLATE_EXPORT PointSet : public PointSetBase<typename TMeshTraits::PointsContainer>
{
public:
ITK_DISALLOW_COPY_AND_MOVE(PointSet);

/** Standard class type aliases. */
using Self = PointSet;
using Superclass = DataObject;
using Superclass = PointSetBase<typename TMeshTraits::PointsContainer>;
using Pointer = SmartPointer<Self>;
using ConstPointer = SmartPointer<const Self>;

Expand All @@ -101,86 +100,31 @@ class ITK_TEMPLATE_EXPORT PointSet : public DataObject
using PixelType = typename MeshTraits::PixelType;

/** Convenient type alias obtained from TMeshTraits template parameter. */
using CoordRepType = typename MeshTraits::CoordRepType;
using PointIdentifier = typename MeshTraits::PointIdentifier;
using PointType = typename MeshTraits::PointType;
using PointsContainer = typename MeshTraits::PointsContainer;
using PointDataContainer = typename MeshTraits::PointDataContainer;

/** For improving Python support for PointSet and Meshes **/
using PointsVectorContainer = typename itk::VectorContainer<PointIdentifier, CoordRepType>;
using PointsVectorContainerPointer = typename PointsVectorContainer::Pointer;

/** Convenient type alias obtained from TMeshTraits template parameter. */
static constexpr unsigned int PointDimension = TMeshTraits::PointDimension;

/** Create types that are pointers to each of the container types. */
using PointsContainerPointer = typename PointsContainer::Pointer;
using PointsContainerConstPointer = typename PointsContainer::ConstPointer;
using PointDataContainerPointer = typename PointDataContainer::Pointer;
using PointDataContainerConstPointer = typename PointDataContainer::ConstPointer;

/** Create types that are iterators for each of the container types. */
using PointsContainerConstIterator = typename PointsContainer::ConstIterator;
using PointsContainerIterator = typename PointsContainer::Iterator;
using PointDataContainerIterator = typename PointDataContainer::ConstIterator;

/** Type used to define Regions */
using RegionType = long;

/** Get the maximum number of regions that this data can be
* separated into. */
itkGetConstMacro(MaximumNumberOfRegions, RegionType);

protected:
/** An object containing points used by the mesh. Individual points are
* accessed through point identifiers. */
PointsContainerPointer m_PointsContainer{};

/** An object containing data associated with the mesh's points.
* Optionally, this can be nullptr, indicating that no data are associated with
* the points. The data for a point can be accessed through its point
* identifier. */
PointDataContainerPointer m_PointDataContainer{};

public:
/** Copy the geometric and topological structure of the given input pointSet.
* The copying is done via reference counting.
*/
void
PassStructure(Self * inputPointSet);

/** Restore the PointSet to its initial state. Useful for data pipeline updates
* without memory re-allocation.
*/
void
Initialize() override;

/** Get the number of points in the points container. */
PointIdentifier
GetNumberOfPoints() const;

/** Set the points container. */
void
SetPoints(PointsContainer *);

/** Set the points container using a 1D vector.
\warning This member function is unsafe. It may just work, but it may also lead to undefined behavior. */
void
SetPoints(PointsVectorContainer *);

/** Sets the points by specifying its coordinates. */
void
SetPointsByCoordinates(const std::vector<CoordRepType> & coordinates);

/** Get the points container. */
PointsContainer *
GetPoints();

/** Get the points container. */
const PointsContainer *
GetPoints() const;

/** Set the point data container. */
void
SetPointData(PointDataContainer *);
Expand All @@ -193,23 +137,6 @@ class ITK_TEMPLATE_EXPORT PointSet : public DataObject
const PointDataContainer *
GetPointData() const;

/** Assign a point to a point identifier. If a spot for the point identifier
* does not exist, it will be created automatically.
*/
void SetPoint(PointIdentifier, PointType);

/** Check if a point exists for a given point identifier. If a spot for
* the point identifier exists, the point is set, and true is returned.
* Otherwise, false is returned, and the point is not modified.
* If the point is nullptr, then it is never set, but the existence of the
* point is still returned.
*/
bool
GetPoint(PointIdentifier, PointType *) const;

/** Get the point for the given point identifier. */
PointType GetPoint(PointIdentifier) const;

/** Assign data to a point identifier. If a spot for the point identifier
* does not exist, it will be created automatically. There is no check if
* a point with the same identifier exists.
Expand All @@ -225,66 +152,16 @@ class ITK_TEMPLATE_EXPORT PointSet : public DataObject
bool
GetPointData(PointIdentifier, PixelType *) const;

/** Methods to manage streaming. */
void
UpdateOutputInformation() override;

void
SetRequestedRegionToLargestPossibleRegion() override;

void
CopyInformation(const DataObject * data) override;

void
Graft(const DataObject * data) override;

bool
RequestedRegionIsOutsideOfTheBufferedRegion() override;

bool
VerifyRequestedRegion() override;

/** Set the requested region from this data object to match the requested
* region of the data object passed in as a parameter. This method
* implements the API from DataObject. The data object parameter must be
* castable to a PointSet. */
void
SetRequestedRegion(const DataObject * data) override;

/** Set/Get the Requested region */
virtual void
SetRequestedRegion(const RegionType & region);

itkGetConstMacro(RequestedRegion, RegionType);

/** Set/Get the Buffered region */
virtual void
SetBufferedRegion(const RegionType & region);

itkGetConstMacro(BufferedRegion, RegionType);

protected:
/** Constructor for use by New() method. */
PointSet() = default;
~PointSet() override = default;
void
PrintSelf(std::ostream & os, Indent indent) const override;

// If the RegionType is ITK_UNSTRUCTURED_REGION, then the following
// variables represent the maximum number of region that the data
// object can be broken into, which region out of how many is
// currently in the buffered region, and the number of regions and
// the specific region requested for the update. Data objects that
// do not support any division of the data can simply leave the
// MaximumNumberOfRegions as 1. The RequestedNumberOfRegions and
// RequestedRegion are used to define the currently requested
// region. The LargestPossibleRegion is always requested region = 0
// and number of regions = 1;
RegionType m_MaximumNumberOfRegions{ 1 };
RegionType m_NumberOfRegions{ 1 };
RegionType m_RequestedNumberOfRegions{};
RegionType m_BufferedRegion{ -1 };
RegionType m_RequestedRegion{ -1 };
}; // End Class: PointSet
} // end namespace itk

Expand Down
Loading

0 comments on commit bf0ed18

Please sign in to comment.