/
spivag
/
command_occ
Обзор
Документация
Войти
/
spivag
/
command_occ
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
initial
commands/shape_iterator.h
222 строки
7 KB
Степанов Никита
Запрос на слияние 'topology_iterators' (
#3
) из topology_iterators в initial
27 апр 2026, 21:55
Верифицирован
27 апр 2026, 21:55
c047a95
Код
Авторство
О чём код?
/// @file shape_iterator.h /// @brief Получение доступа к топологическим элементам в граничном представлении /// Проект occ_engine /// @copyright (c) Alexander Spivakov 2025. #ifndef SHAPE_ITERATOR_H #define SHAPE_ITERATOR_H #include <geometry_types.h> #include <topology.h> #include <string> #include <array> #include <memory> #include <optional> #include <stdexcept> class BuildBlock; class BuildCylinder; class BuildCone; class BuildTorus; class BuildExtrusionSolid; class BuildRevolutionSolid; class BuildSweptSolid; class BuildChamfer; class BuildOffsetFaces; class BuildFillet; class BuildWallViaFaceRemove; class BuildSolidBySections; class BuildTransformedClone; class BooleanOperation; class IShapeBuilder; class TopologyVisitor; /** * @brief Исключение отсутствия объекта геометрического ядра. */ class MissingKernelObjectException : public std::runtime_error { public: MissingKernelObjectException( std::string const& message ); DECLARE_COPY_CTORS_DEFAULT( MissingKernelObjectException ) }; /** * @brief Провайдер топологических элементов */ class TopologyHandle { public: virtual ~TopologyHandle() = default; virtual void Accept( TopologyVisitor& visitor ) const; [[nodiscard]] virtual R3::Gabarit Gabarit() const = 0; /** * @brief Получить идентификатор элемента в виде строки. * @details Идентификатор стабилен от запуска к запуску и уникален для каждого топологического элемента. Если это * условие не соблюдается, то это ошиибка реализации. * @return Строковое представление идентификатора, формируемого геометрическим ядроа. */ virtual std::string GetIdentifier() const = 0; virtual std::optional< uint32_t > GetColour() const = 0; virtual bool IsSelected() const = 0; virtual bool SetColour( uint32_t rgba ) = 0; virtual bool SetSelectedFlag( bool ) = 0; virtual void RemoveMaterial() = 0; }; /** * @brief Провайдер грани */ class IBrepFaceHandle : public TopologyHandle { public: void Accept( TopologyVisitor& ) const override; [[nodiscard]] virtual std::shared_ptr<IFace> GetFace() const = 0; }; /** * @brief Провайдер ребра */ class IBrepEdgeHandle : public TopologyHandle { public: [[nodiscard]] virtual double Length() const = 0; void Accept( TopologyVisitor& ) const override; [[nodiscard]] virtual std::shared_ptr<IEdge> GetEdge() const = 0; }; /** * @brief Провайдер вершины */ class IBrepVertexHandle : public TopologyHandle { public: [[nodiscard]] virtual R3::Point Geometry() const = 0; void Accept( TopologyVisitor& ) const override; [[nodiscard]] virtual std::shared_ptr<IVertex> GetVertex() const = 0; }; /** * @brief Посетитель внутреннего устройства формы */ class TopologyVisitor { public: virtual void Visit( TopologyHandle const& ) {}; virtual void Visit( IBrepFaceHandle const& ) {}; virtual void Visit( IBrepEdgeHandle const& ) {}; virtual void Visit( IBrepVertexHandle const& ) {}; TopologyVisitor() = default; virtual ~TopologyVisitor() = default; }; /** * @brief Посетитель операций моделирования. */ class ShapeVisitor { public: virtual void Visit( BuildBlock const& ) = 0; virtual void Visit( BuildCylinder const& ) = 0; virtual void Visit( BuildCone const& ) = 0; virtual void Visit( BuildTorus const& ) = 0; virtual void Visit( BuildExtrusionSolid const& ) = 0; virtual void Visit( BuildRevolutionSolid const& ) = 0; virtual void Visit( BuildSweptSolid const& ) = 0; virtual void Visit( BuildChamfer const& ) = 0; virtual void Visit( BuildOffsetFaces const& ) = 0; virtual void Visit( BuildWallViaFaceRemove const& ) = 0; virtual void Visit( BuildSolidBySections const& ) = 0; virtual void Visit( BuildFillet const& ) = 0; virtual void Visit( BuildTransformedClone const& ) = 0; virtual void Visit( BooleanOperation const& ) = 0; virtual ~ShapeVisitor() = default; }; /** * @brief Итератор внутреннего устройства формы */ class ShapeIterator { public: ShapeIterator( std::weak_ptr< IShapeBuilder > const& shape ); virtual ~ShapeIterator() = default; virtual bool HasNext() const = 0; virtual std::shared_ptr< TopologyHandle > Next() const = 0; std::weak_ptr< IShapeBuilder > Shape() const; private: std::weak_ptr< IShapeBuilder > m_baseShape; }; /** * @brief Итератор граней */ class IFaceBrepIterator : public ShapeIterator { public: virtual std::shared_ptr< IBrepFaceHandle > FaceHandle() const = 0; IFaceBrepIterator( std::weak_ptr< IShapeBuilder > const& ); }; /** * @brief Итератор ребер */ class IEdgeBrepIterator : public ShapeIterator { public: virtual std::shared_ptr< IBrepEdgeHandle > EdgeHandle() const = 0; IEdgeBrepIterator( std::weak_ptr< IShapeBuilder > const& ); }; /** * @brief Итератор вершин */ class IVertexBrepIterator : public ShapeIterator { public: virtual std::shared_ptr< IBrepVertexHandle > VertexHandle() const = 0; IVertexBrepIterator( std::weak_ptr< IShapeBuilder > const& ); }; /** * @brief Получить итератор граней тела */ std::shared_ptr< IFaceBrepIterator > CreateFaceIterator( std::shared_ptr< IShapeBuilder > const& shape ); /** * @brief Получить итератор ребер тела */ std::shared_ptr< IEdgeBrepIterator > CreateEdgeIterator( std::shared_ptr< IShapeBuilder > const& shape ); /** * @brief Получить итератор вершин тела */ std::shared_ptr< IVertexBrepIterator > CreateVertexIterator( std::shared_ptr< IShapeBuilder > const& shape ); /** * @brief Получить итератор ребер грани */ std::shared_ptr< IEdgeBrepIterator > CreateEdgeIterator( std::shared_ptr< IBrepFaceHandle > const& face ); /** * @brief Получить итератор граней, примыкающих к ребру. * @param edge [in] Провайдер доступа к ребру. * @return Итератор обхода граней. */ std::shared_ptr< IFaceBrepIterator > CreateFaceIterator( std::shared_ptr< IBrepEdgeHandle > const& edge ); /** * @brief Получить итератор вершин, примыкающих к ребру. * @param edge [in] Провайдер доступа к ребру. * @return Итератор обхода вершин. */ std::shared_ptr< IVertexBrepIterator > CreateVertexIterator( std::shared_ptr< IBrepEdgeHandle > const& edge ); #endif