/
spivag
/
command_occ
Обзор
Документация
Войти
/
spivag
/
command_occ
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
initial
commands/builder.h
297 строк
11 KB
Степанов Никита
Запрос на слияние 'topology_iterators' (
#3
) из topology_iterators в initial
27 апр 2026, 21:55
Верифицирован
27 апр 2026, 21:55
c047a95
Код
Авторство
О чём код?
#ifndef BUILDER_H #define BUILDER_H #include <memory> #include <vector> #include <optional> #include <variant> #include <geometry_types.h> #include <topology.h> //======================================================================================= // Абстрактные интерфейсы построения примитивов //======================================================================================= class IPrimitiveBuilder { public: virtual ~IPrimitiveBuilder() = default; [[nodiscard]] virtual std::shared_ptr< IShape > GetShape() const = 0; [[nodiscard]] virtual bool IsDone() const = 0; }; class IMakeBox : public IPrimitiveBuilder { public: virtual ~IMakeBox() = default; // origin = левый нижний угол (OriginInLeftBackBottomCorner) virtual void CreateCorner( R3::Placement const& placement, double dx, double dy, double dz ) = 0; // origin = центр объёма (OriginInMiddleVolume) virtual void CreateCentered( R3::Placement const& placement, double dx, double dy, double dz ) = 0; // origin = центр нижней грани (OriginInMiddleBottomFace) virtual void CreateBottomCenter( R3::Placement const& placement, double dx, double dy, double dz ) = 0; // origin = точка, оси = мировые (PointsOnDiagonal) virtual void CreateFromCornerPoint( R3::Point const& corner, double dx, double dy, double dz ) = 0; }; class IMakeCylinder : public IPrimitiveBuilder { public: virtual ~IMakeCylinder() = default; virtual void Create( R3::Placement const& placement, double radius, double height ) = 0; virtual void CreateFlipped( R3::Placement const& placement, double radius, double height ) = 0; }; class IMakeCone : public IPrimitiveBuilder { public: virtual ~IMakeCone() = default; virtual void Create( R3::Placement const& placement, double r1, double r2, double h ) = 0; }; class IMakeTorus : public IPrimitiveBuilder { public: virtual ~IMakeTorus() = default; virtual void Create( R3::Placement const& placement, double majorRadius, double minorRadius ) = 0; }; class IMakePrism : public IPrimitiveBuilder { public: virtual ~IMakePrism() = default; virtual void Create( std::shared_ptr< IShape > const& profile, R3::Vector const& direction, double height, std::optional< double > angle = std::nullopt ) = 0; }; class IMakeRevol : public IPrimitiveBuilder { public: virtual ~IMakeRevol() = default; virtual void Create( std::shared_ptr< IShape > const& profile, R3::Axis const& axis, double angle ) = 0; }; class IMakeFillet : public IPrimitiveBuilder { public: virtual ~IMakeFillet() = default; virtual void AddEdge( std::shared_ptr< IEdge > const& edge, double radius ) = 0; virtual void AddEdge( std::shared_ptr< IEdge > const& edge, double radius1, double radius2 ) = 0; virtual void Create( std::shared_ptr< IShape > const& shape ) = 0; }; class IMakeChamfer : public IPrimitiveBuilder { public: virtual ~IMakeChamfer() = default; virtual void AddEdge( std::shared_ptr< IEdge > const& edge, std::shared_ptr< IFace > const& face, double distance ) = 0; virtual void AddEdge( std::shared_ptr< IEdge > const& edge, std::shared_ptr< IFace > const& face, double distance1, double distance2 ) = 0; virtual void Create( std::shared_ptr< IShape > const& shape ) = 0; }; class IMakeBooleanOp : public IPrimitiveBuilder { public: virtual ~IMakeBooleanOp() = default; enum class Operation { unite, intersect, difference }; virtual void Create( std::shared_ptr< IShape > const& s1, std::shared_ptr< IShape > const& s2, Operation op ) = 0; }; class IMakeTransform : public IPrimitiveBuilder { public: virtual ~IMakeTransform() = default; virtual void Create( std::shared_ptr< IShape > const& shape, R3::Placement const& placement ) = 0; virtual void Create( std::shared_ptr< IShape > const& shape, R3::Transform const& transform ) = 0; }; //======================================================================================= // Интерфейсы для ядра OpenCASCADE //======================================================================================= class OCCMakeBox : public IMakeBox { std::shared_ptr<OCCShape> m_shape; bool m_isDone{ false }; public: void CreateCorner( R3::Placement const& placement, double dx, double dy, double dz ) override; void CreateCentered( R3::Placement const& placement, double dx, double dy, double dz ) override; void CreateBottomCenter( R3::Placement const& placement, double dx, double dy, double dz ) override; void CreateFromCornerPoint( R3::Point const& corner, double dx, double dy, double dz ) override; [[nodiscard]] std::shared_ptr< IShape > GetShape() const override { return m_shape; } [[nodiscard]] bool IsDone() const override { return m_isDone; } }; class OCCMakeCylinder : public IMakeCylinder { std::shared_ptr<OCCShape> m_shape; bool m_isDone{ false }; public: void Create( R3::Placement const& placement, double radius, double height ) override; void CreateFlipped( R3::Placement const& placement, double radius, double height ) override; [[nodiscard]] std::shared_ptr< IShape > GetShape() const override { return m_shape; } [[nodiscard]] bool IsDone() const override { return m_isDone; } }; class OCCMakeCone : public IMakeCone { std::shared_ptr<OCCShape> m_shape; bool m_isDone{ false }; public: void Create( R3::Placement const& placement, double r1, double r2, double h ) override; [[nodiscard]] std::shared_ptr< IShape > GetShape() const override { return m_shape; } [[nodiscard]] bool IsDone() const override { return m_isDone; } }; class OCCMakeTorus : public IMakeTorus { std::shared_ptr<OCCShape> m_shape; bool m_isDone{ false }; public: void Create( R3::Placement const& placement, double majorRadius, double minorRadius ) override; [[nodiscard]] std::shared_ptr< IShape > GetShape() const override { return m_shape; } [[nodiscard]] bool IsDone() const override { return m_isDone; } }; class OCCMakePrism : public IMakePrism { std::shared_ptr<OCCShape> m_shape; bool m_isDone{ false }; public: void Create( std::shared_ptr< IShape > const& profile, R3::Vector const& direction, double height, std::optional< double > angle ) override; [[nodiscard]] std::shared_ptr< IShape > GetShape() const override { return m_shape; } [[nodiscard]] bool IsDone() const override { return m_isDone; } }; class OCCMakeRevol : public IMakeRevol { std::shared_ptr<OCCShape> m_shape; bool m_isDone{ false }; public: void Create( std::shared_ptr< IShape > const& profile, R3::Axis const& axis, double angle ) override; [[nodiscard]] std::shared_ptr< IShape > GetShape() const override { return m_shape; } [[nodiscard]] bool IsDone() const override { return m_isDone; } }; class OCCMakeFillet : public IMakeFillet { std::shared_ptr<OCCShape> m_shape; bool m_isDone{ false }; struct EdgeParams { std::shared_ptr< IEdge > m_edge; double m_radius1; double m_radius2; bool m_isSymmetric; }; std::vector< EdgeParams > m_edges; public: void AddEdge( std::shared_ptr< IEdge > const& edge, double radius ) override; void AddEdge( std::shared_ptr< IEdge > const& edge, double radius1, double radius2 ) override; void Create( std::shared_ptr< IShape > const& shape ) override; [[nodiscard]] std::shared_ptr< IShape > GetShape() const override { return m_shape; } [[nodiscard]] bool IsDone() const override { return m_isDone; } }; class OCCMakeChamfer : public IMakeChamfer { std::shared_ptr<OCCShape> m_shape; bool m_isDone{ false }; struct EdgeParams { std::shared_ptr< IEdge > m_edge; std::shared_ptr< IFace > m_face; double m_distance1; double m_distance2; bool m_isSymmetric; }; std::vector< EdgeParams > m_edges; public: void AddEdge( std::shared_ptr< IEdge > const& edge, std::shared_ptr< IFace > const& face, double distance ) override; void AddEdge( std::shared_ptr< IEdge > const& edge, std::shared_ptr< IFace > const& face, double distance1, double distance2 ) override; void Create( std::shared_ptr< IShape > const& shape ) override; [[nodiscard]] std::shared_ptr< IShape > GetShape() const override { return m_shape; } [[nodiscard]] bool IsDone() const override { return m_isDone; } }; class OCCMakeBooleanOp : public IMakeBooleanOp { std::shared_ptr<OCCShape> m_shape; bool m_isDone{ false }; public: void Create( std::shared_ptr< IShape > const& s1, std::shared_ptr< IShape > const& s2, Operation op ) override; [[nodiscard]] std::shared_ptr< IShape > GetShape() const override { return m_shape; } [[nodiscard]] bool IsDone() const override { return m_isDone; } }; class OCCMakeTransform : public IMakeTransform { std::shared_ptr<OCCShape> m_shape; bool m_isDone{ false }; public: void Create( std::shared_ptr< IShape > const& shape, R3::Placement const& placement ) override; void Create( std::shared_ptr< IShape > const& shape, R3::Transform const& transform ) override; [[nodiscard]] std::shared_ptr< IShape > GetShape() const override { return m_shape; } [[nodiscard]] bool IsDone() const override { return m_isDone; } }; // Интерфейс фабрики builder-ов (абстракция для замены ядра) class IBuilderFactory { public: virtual ~IBuilderFactory() = default; [[nodiscard]] virtual std::shared_ptr< IMakeBox > CreateBoxBuilder() const = 0; [[nodiscard]] virtual std::shared_ptr< IMakeCylinder > CreateCylinderBuilder() const = 0; [[nodiscard]] virtual std::shared_ptr< IMakeCone > CreateConeBuilder() const = 0; [[nodiscard]] virtual std::shared_ptr< IMakeTorus > CreateTorusBuilder() const = 0; [[nodiscard]] virtual std::shared_ptr< IMakePrism > CreatePrismBuilder() const = 0; [[nodiscard]] virtual std::shared_ptr< IMakeRevol > CreateRevolBuilder() const = 0; [[nodiscard]] virtual std::shared_ptr< IMakeFillet > CreateFilletBuilder() const = 0; [[nodiscard]] virtual std::shared_ptr< IMakeChamfer > CreateChamferBuilder() const = 0; [[nodiscard]] virtual std::shared_ptr< IMakeBooleanOp > CreateBooleanOpBuilder() const = 0; [[nodiscard]] virtual std::shared_ptr< IMakeTransform > CreateTransformBuilder() const = 0; }; // Фабрика для создания OCC builder-ов class OCCBuilderFactory { public: [[nodiscard]] static std::shared_ptr< IMakeBox > CreateBoxBuilder(); [[nodiscard]] static std::shared_ptr< IMakeCylinder > CreateCylinderBuilder(); [[nodiscard]] static std::shared_ptr< IMakeCone > CreateConeBuilder(); [[nodiscard]] static std::shared_ptr< IMakeTorus > CreateTorusBuilder(); [[nodiscard]] static std::shared_ptr< IMakePrism > CreatePrismBuilder(); [[nodiscard]] static std::shared_ptr< IMakeRevol > CreateRevolBuilder(); [[nodiscard]] static std::shared_ptr< IMakeFillet > CreateFilletBuilder(); [[nodiscard]] static std::shared_ptr< IMakeChamfer > CreateChamferBuilder(); [[nodiscard]] static std::shared_ptr< IMakeBooleanOp > CreateBooleanOpBuilder(); [[nodiscard]] static std::shared_ptr< IMakeTransform > CreateTransformBuilder(); }; #endif // BUILDER_H