/
spivag
/
command_occ
Обзор
Документация
Войти
/
spivag
/
command_occ
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
initial
commands/shape_command.h
392 строки
13 KB
Степанов Никита
Запрос на слияние 'topology_iterators' (
#3
) из topology_iterators в initial
27 апр 2026, 21:55
Верифицирован
27 апр 2026, 21:55
c047a95
Код
Авторство
О чём код?
/// @file shape_command.h /// @brief Моделирование тел /// Проект occ_engine /// @copyright (c) Alexander Spivakov 2025. #ifndef SHAPE_COMMAND_H #define SHAPE_COMMAND_H #include <command.h> #include <geometry_types.h> #include <topology.h> #include <array> #include <optional> #include <variant> #include <memory> class ShapeVisitor; /** * @brief Моделирование формы тела */ class IShapeBuilder : public ICommand { public: // получить форму тела std::shared_ptr< IShape > GetShape() const; // принять посещение virtual void Accept( ShapeVisitor& Visitor ) const = 0; protected: std::shared_ptr< IShape > m_shape; bool m_isShapeValid{ false }; }; /** * @brief Создание трансформированного клона тела. */ class BuildTransformedClone : public IShapeBuilder { public: struct ByPlacement { ByPlacement() = default; ByPlacement( std::shared_ptr< IShapeBuilder > const& originalShape, R3::Placement const& cloneLocation ); DECLARE_COPY_CTORS_DEFAULT( ByPlacement ); std::shared_ptr< IShapeBuilder > m_originalShape{}; R3::Placement m_placement{}; }; struct ByTransformation { ByTransformation() = default; ByTransformation( std::shared_ptr< IShapeBuilder > const& originalShape, R3::Transform const& transformation ); DECLARE_COPY_CTORS_DEFAULT( ByTransformation ); std::shared_ptr< IShapeBuilder > m_originalShape{}; R3::Transform m_transform{}; }; using Parameters = std::variant<ByPlacement, ByTransformation>; //BuildTransformedClone( std::shared_ptr< IShapeBuilder > const& originalShape, gp_Trsf const& cloneLocation ); //BuildTransformedClone( std::shared_ptr< IShapeBuilder > const& originalShape, gp_Trsf const& transformation ); BuildTransformedClone( std::shared_ptr< IShapeBuilder > const& originalShape, R3::Placement const& cloneLocation ); BuildTransformedClone( std::shared_ptr< IShapeBuilder > const& originalShape, R3::Transform const& transformation ); Parameters GetParameters() const; void Execute() override; std::string ExecutionMessage() override; void Accept( ShapeVisitor& visitor ) const override; private: Parameters m_originConstruction; std::string m_executionMessage{}; }; /** * @brief Создание параллелепипеда */ class BuildBlock : public IShapeBuilder { public: // Параметры создания параллелепипеда по двум точкам на главной диагонали struct PointsOnDiagonal; // Параметры создания параллелепипеда по заданным размерам и системе координат, размещенной в центре объёма struct OriginInMiddleVolume; // Параметры создания параллелепипеда по заданным размерам и системе координат, размещенной в левом ближнем нижнем // углу struct OriginInLeftBackBottomCorner; // Параметры создания параллелепипеда по заданным размерам и системе координат, размещенной в центре нижней грани struct OriginInMiddleBottomFace; using Parameters = std::variant< OriginInMiddleVolume, OriginInMiddleBottomFace, OriginInLeftBackBottomCorner, PointsOnDiagonal >; Parameters GetParameters() const; // конструктор параллелепипеда с центром в начале локальной СК explicit BuildBlock( OriginInMiddleVolume const& dimensions ); // конструктор параллелепипеда расположенного в области положительных значений координат локалньной СК explicit BuildBlock( OriginInLeftBackBottomCorner const& dimensions ); // конструктор параллелепипеда, центр нижней грани которого находится в начале локальной СК explicit BuildBlock( OriginInMiddleBottomFace const& dimensions ); // конструктор параллелепипеда по двум точкам на диагонали explicit BuildBlock( R3::Point const& oneCorner, R3::Point const& otherCorner ); /// @brief Параметры создания параллелепипеда по заданным размерам и системе координат, размещенной в центре объёма struct OriginInMiddleVolume { OriginInMiddleVolume( double sizeX, double sizeY, double sizeZ, R3::Placement const& = R3::Placement::World() ); [[nodiscard]] bool AreParametersValid() const; std::array< double, 3 > m_dimensions{}; R3::Placement m_location{}; DECLARE_COPY_CTORS_DEFAULT( OriginInMiddleVolume ); }; /// @brief Параметры создания параллелепипеда по заданным размерам и системе координат, размещенной в центре объёма struct OriginInMiddleBottomFace { OriginInMiddleBottomFace( double sizeX, double sizeY, double sizeZ, R3::Placement const& = R3::Placement::World() ); [[nodiscard]] bool AreParametersValid() const; std::array< double, 3 > m_dimensions{}; R3::Placement m_location{}; DECLARE_COPY_CTORS_DEFAULT( OriginInMiddleBottomFace ); }; /// @brief Параметры создания параллелепипеда по заданным размерам и системе координат, размещенной в левом ближнем /// нижнем углу struct OriginInLeftBackBottomCorner { OriginInLeftBackBottomCorner( double sizeX, double sizeY, double sizeZ, R3::Placement const& = R3::Placement::World() ); [[nodiscard]] bool AreParametersValid() const; DECLARE_COPY_CTORS_DEFAULT( OriginInLeftBackBottomCorner ); std::array< double, 3 > m_dimensions{}; R3::Placement m_location{}; }; /// @brief Параметры создания параллелепипеда по заданным точкам на главной диагонали struct PointsOnDiagonal { PointsOnDiagonal( R3::Point const& one, R3::Point const& other ); [[nodiscard]] bool AreParametersValid() const; R3::Point m_oneCorner{}; R3::Point m_otherCorner{}; PointsOnDiagonal( PointsOnDiagonal const& ) = default; PointsOnDiagonal( PointsOnDiagonal&& ) = default; PointsOnDiagonal& operator=( PointsOnDiagonal const& ) = default; }; // проверить корректность входных данных bool validateBlockParameters() const; void Execute() override; std::string ExecutionMessage() override; void Accept( ShapeVisitor& visitor ) const override; private: void setErrorText( std::string const& errorText ); std::string m_errorText{}; Parameters m_originConstruction; }; /** * @brief Создание цилиндра */ class BuildCylinder : public IShapeBuilder { public: /// @brief Конструктор цилиндра выше плоскости OXY. BuildCylinder( double radius, const R1::ForwardDistance& positiveHeight, R3::Placement const& pl = R3::Placement::World() ); /// @brief Конструктор цилиндра ниже плоскости OXY. BuildCylinder( double radius, const R1::BackwardDistance& negativeHeight, R3::Placement const& pl = R3::Placement::World() ); /// @brief Конструктор цилиндра по обе стороны плоскости OXY. BuildCylinder( double radius, const R1::ForwardDistance& positiveHeight, const R1::BackwardDistance& negativeHeight, R3::Placement const& pl = R3::Placement::World() ); struct Parameters { double m_radius{ 0.0 }; std::optional< R1::ForwardDistance > m_heightPositiveZSide{}; std::optional< R1::BackwardDistance > m_heightNegativeZSide{}; R3::Placement m_position{}; Parameters( double radius, const R1::ForwardDistance& positiveHeight, R3::Placement const& pl ); Parameters( double radius, const R1::BackwardDistance& negativeHeight, R3::Placement const& pl ); Parameters( double radius, R1::ForwardDistance const& positiveHeight, R1::BackwardDistance const& negativeHeight, R3::Placement const& pl ); DECLARE_COPY_CTORS_DEFAULT( Parameters ) }; Parameters GetParameters() const; // проверить корректность входных данных bool validateCylinderParameters(); void Execute() override; std::string ExecutionMessage() override; void Accept( ShapeVisitor& visitor ) const override; private: Parameters m_originConstruction; std::string m_errorText{}; void setErrorText( std::string errorText ); }; /** * @brief Создание конуса */ class BuildCone : public IShapeBuilder { public: struct CreateByRadiaHeight; struct CreateByRadiaAngle; using Parameters = std::variant< CreateByRadiaHeight, CreateByRadiaAngle >; // конструктор explicit BuildCone( CreateByRadiaHeight const& rrh ); // конструктор explicit BuildCone( CreateByRadiaAngle const& rra ); struct CreateByRadiaHeight { CreateByRadiaHeight( double bottomRadius, double topRadius, double height, R3::Placement const& location = R3::Placement::World() ); [[nodiscard]] bool AreParametersValid() const; CreateByRadiaHeight( const CreateByRadiaHeight& ) = default; CreateByRadiaHeight( CreateByRadiaHeight&& ) = default; CreateByRadiaHeight& operator=( const CreateByRadiaHeight& ) = default; R3::Placement m_baseLocation{}; double m_bottomRadius{}; double m_topRadius{}; double m_height{}; }; struct CreateByRadiaAngle { CreateByRadiaAngle( double bottomRadius, double topRadius, R1::AngleModPi2 angle, R3::Placement const& = R3::Placement::World() ); [[nodiscard]] bool AreParametersValid() const; CreateByRadiaAngle( const CreateByRadiaAngle& ) = default; CreateByRadiaAngle( CreateByRadiaAngle&& ) = default; CreateByRadiaAngle& operator=( const CreateByRadiaAngle& ) = default; R3::Placement m_baseLocation{}; double m_bottomRadius{}; double m_topRadius{}; R1::AngleModPi2 m_angle{}; }; void Accept( ShapeVisitor& visitor ) const override; Parameters GetParameters() const; void Execute() override; std::string ExecutionMessage() override; // проверить корректность входных данных bool validateConeParameters(); private: void setErrorText( std::string errorText ); std::string m_errorText{}; Parameters m_originConstruction; }; /** * @brief Создание тора */ class BuildTorus : public IShapeBuilder { public: enum class Shape { donut, apple, lemon }; struct Parameters { Parameters( double majorRadius, double minorRadius, R3::Placement const& location, Shape torusType ); DECLARE_COPY_CTORS_DEFAULT( Parameters ) double m_majorRadius{}; double m_minorRadius{}; R3::Placement m_location{}; Shape m_torusType; }; // конструктор BuildTorus( double majorRadius, double minorRadius, R3::Placement const& location, Shape torusType ); void Execute() override; std::string ExecutionMessage() override; void Accept( ShapeVisitor& visitor ) const override; Parameters GetParameters() const; // проверить корректность входных данных bool validateTorusParameters(); private: Parameters m_originConstruction; std::string m_errorText{}; void setErrorText( std::string errorText ); }; /** * @brief Выполнение булевой операции над телами */ class BooleanOperation : public IShapeBuilder { public: enum class Operation { unite, intersect, difference }; struct Parameters { Parameters( const std::shared_ptr< IShapeBuilder >& firstSolid, const std::shared_ptr< IShapeBuilder >& secondSolid, Operation operationType ); DECLARE_COPY_CTORS_DEFAULT( Parameters ) std::shared_ptr< IShapeBuilder > m_firstSolid{}; std::shared_ptr< IShapeBuilder > m_secondSolid{}; Operation m_booleanOperationType; }; // конструктор BooleanOperation( const std::shared_ptr< IShapeBuilder >& firstSolid, const std::shared_ptr< IShapeBuilder >& secondSolid, Operation operationType ); void Execute() override; std::string ExecutionMessage() override; void Accept( ShapeVisitor& visitor ) const override; Parameters GetParameters() const; bool checkBooleanOperationResult(); private: Parameters m_originConstruction; std::string m_errorText{}; void setErrorText( std::string errorText ); }; #endif // SHAPE_COMMAND_H