/
spivag
/
command_occ
Обзор
Документация
Войти
/
spivag
/
command_occ
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
initial
commands/shape_factory.h
245 строк
12 KB
Spivakov
Initial
10 апр 2026, 13:45
10 апр 2026, 13:45
b2ad868
Код
Авторство
О чём код?
#ifndef SHAPE_FACTORY_H_ #define SHAPE_FACTORY_H_ #include <brep_sections.h> #include <face_manipulate.h> #include <shape_command.h> #include <render/gl1_raw_cache.hxx> #include <memory> #include <string> // Включаем определение OpenGL mesh factory #include "opengl_mesh_factory.h" class IBrepFactory; class IShapeFactory; class IBrepFaceHandle; namespace Factory { IBrepFactory& Brep(); IShapeFactory& Shape(); IOpenGLMeshFactory& OpenGLMesh(); } // namespace Factory class BlockBuilder; class CylinderBuilder; class ConeBuilder; class TorusBuilder; class ExtrusionSolidBuilder; class RevolutionSolidBuilder; class SectionsBasedSolidBuilder; class BuildWallViaFaceRemove; class ChamferBuilder; class OffsetFacesBuilder; class ThinWallViaFaceRemoveBuilder; class FilletBuilder; class IBrepFactory { public: virtual std::shared_ptr< BlockBuilder > Block() const = 0; virtual std::shared_ptr< CylinderBuilder > Cylinder() const = 0; virtual std::shared_ptr< ConeBuilder > Cone() const = 0; virtual std::shared_ptr< TorusBuilder > Torus() const = 0; virtual std::shared_ptr< ExtrusionSolidBuilder > Extrusion() const = 0; virtual std::shared_ptr< RevolutionSolidBuilder > Revolution() const = 0; virtual std::shared_ptr< SectionsBasedSolidBuilder > Sections() const = 0; virtual std::shared_ptr< ChamferBuilder > Chamfer() const = 0; virtual std::shared_ptr< OffsetFacesBuilder > OffsetFaces() const = 0; virtual std::shared_ptr< ThinWallViaFaceRemoveBuilder > ThinWallViaFaceRemove() const = 0; virtual std::shared_ptr< FilletBuilder > Fillet() const = 0; virtual ~IBrepFactory() = default; }; class TransformedCloneBuilder; class BooleanOperationBuilder; class IShapeFactory { public: virtual std::shared_ptr< TransformedCloneBuilder > TransformedClone() const = 0; virtual std::shared_ptr< BooleanOperationBuilder > Boolean() const = 0; virtual ~IShapeFactory() = default; }; class BlockBuilder { public: /** @brief Построить параллелепипед, у котрого начало координат в углу */ virtual std::shared_ptr< BuildBlock > build( BuildBlock::OriginInLeftBackBottomCorner const& dimensions ) const = 0; /** @brief Построить параллелепипед, у котрого начало координат в центре нижней грани */ virtual std::shared_ptr< BuildBlock > build( BuildBlock::OriginInMiddleBottomFace const& dimensions ) const = 0; /** @brief Построить параллелепипед, у котрого начало координат в центре всей фигуры */ virtual std::shared_ptr< BuildBlock > build( BuildBlock::OriginInMiddleVolume const& dimensions ) const = 0; /** @brief Построить параллелепипед по двум точкам на диагонали */ virtual std::shared_ptr< BuildBlock > build( BuildBlock::PointsOnDiagonal const& dimensions ) const = 0; virtual ~BlockBuilder() = default; }; class CylinderBuilder { public: /** @brief Создать цилиндр выше плоскости XY */ virtual std::shared_ptr< BuildCylinder > build( R1::Distance radius, R1::ForwardDistance height, R3::Placement const& location = R3::Placement::World() ) const = 0; /** @brief Создать цилиндр ниже плоскости XY */ virtual std::shared_ptr< BuildCylinder > build( R1::Distance radius, R1::BackwardDistance height, R3::Placement const& location = R3::Placement::World() ) const = 0; /** @brief Создать цилиндр по обе стороны от плоскости XY */ virtual std::shared_ptr< BuildCylinder > build( R1::Distance radius, R1::ForwardDistance heightPositive, R1::BackwardDistance heightNegative, R3::Placement const& location = R3::Placement::World() ) const = 0; virtual ~CylinderBuilder() = default; }; class ConeBuilder { public: /** @brief Создать конус по двум радиусам и высоте */ virtual std::shared_ptr< BuildCone > build( BuildCone::CreateByRadiaHeight const& radiaHeight ) const = 0; /** @brief Создать конус по двум радиусам и углу между ними */ virtual std::shared_ptr< BuildCone > build( BuildCone::CreateByRadiaAngle const& radiaAngle ) const = 0; virtual ~ConeBuilder() = default; }; class TorusBuilder { public: /** @brief Создать тор */ virtual std::shared_ptr< BuildTorus > build( double majorRadius, double minorRadius, R3::Placement const& location, BuildTorus::Shape torusType ) const = 0; virtual ~TorusBuilder() = default; }; class BooleanOperationBuilder { public: /** @brief Создать булеву операцию над телами */ virtual std::shared_ptr< BooleanOperation > build( const std::shared_ptr< IShapeBuilder >& firstSolid, const std::shared_ptr< IShapeBuilder >& secondSolid, BooleanOperation::Operation operationType ) const = 0; virtual ~BooleanOperationBuilder() = default; }; // Интерфейсы фабрик class ExtrusionSolidBuilder { public: /** @brief Создать тело выдавлния выше плоскости XY */ virtual std::shared_ptr< BuildExtrusionSolid > build( SweptEntity::Sketch2D const& profile, R3::Vector const& direction, BuildExtrusionSolid::DepthAngleForward const& forwardDimension ) const = 0; /** @brief Создать тело выдавлния ниже плоскости XY */ virtual std::shared_ptr< BuildExtrusionSolid > build( SweptEntity::Sketch2D const& profile, R3::Vector const& direction, BuildExtrusionSolid::DepthAngleBackward const& backwardDimension ) const = 0; /** @brief Создать тело выдавлния по обе стороны от плоскости XY */ virtual std::shared_ptr< BuildExtrusionSolid > build( SweptEntity::Sketch2D const& profile, R3::Vector const& direction, BuildExtrusionSolid::DepthAngleForward const& forwardDimension, BuildExtrusionSolid::DepthAngleBackward const& backwardDimension ) const = 0; virtual ~ExtrusionSolidBuilder() = default; }; class RevolutionSolidBuilder { public: /** @brief Создать тело вращения против часовой стрелки */ virtual std::shared_ptr< BuildRevolutionSolid > build( SweptEntity::Sketch2D const& profile, R3::Axis const& axis, R1::AngleCcw< R1::Angle02pi > const& angleCcw ) const = 0; /** @brief Создать тело вращения по часовой стрелке */ virtual std::shared_ptr< BuildRevolutionSolid > build( SweptEntity::Sketch2D const& profile, R3::Axis const& axis, R1::AngleCw< R1::Angle02pi > const& angleCw ) const = 0; /** @brief Создать тело вращения по обеим направлениям */ virtual std::shared_ptr< BuildRevolutionSolid > build( SweptEntity::Sketch2D const& profile, R3::Axis const& axis, R1::AngleCcw< R1::Angle02pi > const& angleCcw, R1::AngleCw< R1::Angle02pi > const& angleCw ) const = 0; virtual ~RevolutionSolidBuilder() = default; }; class SectionsBasedSolidBuilder { public: /** @brief Создать тело по сечениям */ virtual std::shared_ptr< BuildSolidBySections > build( BuildSolidBySections::Ruled const& ruled ) const = 0; virtual std::shared_ptr< BuildSolidBySections > build( BuildSolidBySections::Loft const& loft, std::optional< WallThickness > const& wallThickness = std::nullopt ) const = 0; virtual ~SectionsBasedSolidBuilder() = default; }; class ChamferBuilder { public: /** @brief Создать симметричную фаску */ virtual std::shared_ptr< BuildChamfer > build( std::shared_ptr< IShapeBuilder > const& originalBrep, BuildChamfer::Symmetric const& symmetricChamferParametes ) const = 0; /** @brief Создать несиметричную фаску */ virtual std::shared_ptr< BuildChamfer > build( std::shared_ptr< IShapeBuilder > const& originalBrep, BuildChamfer::NonSymmetric const& nonSymmetricChamferParametes ) const = 0; virtual ~ChamferBuilder() = default; }; class OffsetFacesBuilder { public: /** @brief Выполнть смещение грани */ virtual std::shared_ptr< BuildOffsetFaces > build( std::shared_ptr< IShapeBuilder > const& originalBrep, std::shared_ptr< IBrepFaceHandle > const& faceToOffset, double offsetDistance ) const = 0; virtual ~OffsetFacesBuilder() = default; }; class ThinWallViaFaceRemoveBuilder { public: virtual std::shared_ptr< BuildWallViaFaceRemove > build( std::shared_ptr< IShapeBuilder > const& originalBrep, std::vector<std::shared_ptr< IBrepFaceHandle >> const& facesToRemove, R1::ForwardDistance outherThickness ) const = 0; virtual std::shared_ptr< BuildWallViaFaceRemove > build( std::shared_ptr< IShapeBuilder > const& originalBrep, std::vector<std::shared_ptr< IBrepFaceHandle >> const& facesToRemove, R1::BackwardDistance innerThickness ) const = 0; virtual std::shared_ptr< BuildWallViaFaceRemove > build( std::shared_ptr< IShapeBuilder > const& originalBrep, std::vector<std::shared_ptr< IBrepFaceHandle >> const& facesToRemove, R1::ForwardDistance outherThickness, R1::BackwardDistance innerThickness ) const = 0; virtual ~ThinWallViaFaceRemoveBuilder() = default; }; class FilletBuilder { public: /** @brief Создать симметричное скругление */ virtual std::shared_ptr< BuildFillet > build( std::shared_ptr< IShapeBuilder > const& originalBrep, BuildFillet::Symmetric const& symmetricFilletParametes ) const = 0; /** @brief Создать несимметричное скругление */ virtual std::shared_ptr< BuildFillet > build( std::shared_ptr< IShapeBuilder > const& originalBrep, BuildFillet::NonSymmetric const& nonSymmetricFilletParametes ) const = 0; virtual ~FilletBuilder() = default; }; class TransformedCloneBuilder { public: /** @brief Создать трансформированный клон тела по целевому местоположению */ virtual std::shared_ptr< BuildTransformedClone > build( std::shared_ptr< IShapeBuilder > const& originalShape, R3::Placement const& location ) const = 0; /** @brief Создать трансформированный клон тела по матрице преобразования */ virtual std::shared_ptr< BuildTransformedClone > build( std::shared_ptr< IShapeBuilder > const& originalShape, R3::Transform const& transformation ) const = 0; virtual ~TransformedCloneBuilder() = default; }; #endif // SHAPE_FACTORY_H_