Files
Extern/C3d/Include/action_b_shaper.h
T
SaraP f5f6a9cb47 Extern :
- C3d aggiornamento librerie ( 118027).
2025-02-28 15:40:33 +01:00

498 lines
33 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
////////////////////////////////////////////////////////////////////////////////
/**
\file
\brief \ru Методы преобразования полигональных геометрических объектов в объекты BRep.
\en Functions for conversion of the polygonal geometric object to BRep objects. \~
\details \ru Методы преобразования полигональных геометрических объектов в объекты BRep.
\en Functions for conversion of the polygonal geometric object to BRep objects. \~
*/
////////////////////////////////////////////////////////////////////////////////
#ifndef __ACTION_B_SHAPER_H
#define __ACTION_B_SHAPER_H
#include <mb_cart_point.h>
#include <mb_cart_point3d.h>
#include <mesh.h>
#include <mb_enum.h>
#include <mb_operation_result.h>
#include <op_mesh_parameter.h>
#include <vector>
class MbPlacement3D;
class MbMesh;
class MbSurface;
class MbSNameMaker;
class MbFace;
class MATH_CLASS MbCollection;
struct MbCurvature;
//------------------------------------------------------------------------------
/** \brief \ru Режим распознавания поверхностей.
\en Surface reconstruction mode. \~
\details \ru Режим распознавания поверхностей.
\en Surface reconstruction mode. \~
\ingroup Polygonal_Objects
*/
// ---
enum MbeSurfReconstructMode
{
srm_All = 0, ///< \ru Строить все поверхности. \en Build all surfaces.
srm_NoGrids = 1, ///< \ru Не строить поверхности на базе триангуляции. \en Not build surfaces based on triangulation.
srm_CanonicOnly = 2, ///< \ru Строить только элементарные поверхности. \en Build elementary surfaces only.
srm_Default = srm_NoGrids ///< \ru Режим по умолчанию. \en Default mode.
};
//------------------------------------------------------------------------------
/** \brief \ru Режим построения модели BRep.
\en BRep creation mode. \~
\details \ru Режим построения модели BRep.
\en BRep creation mode. \~
\ingroup Polygonal_Objects
*/
// ---
enum MbeCreateBRepMode
{
cbm_Strict = 0, ///< \ru Соседние грани пересекаются по общей кривой. \en Adjancent faces have a common edge.
cbm_Weak = 1, ///< \ru Все ребра каждой из граней - граничные. \en All edges of each face are a boundary edges.
cbm_Default = cbm_Strict ///< \ru Режим по умолчанию. \en Default mode.
};
//------------------------------------------------------------------------------
/** \brief \ru Параметры построения оболочки тела по полигональной сетке.
\en Parameters of BRep shell construction from polygonal mesh. \~
\ingroup Polygonal_Objects
*/
// ---
class MATH_CLASS MbMeshProcessorValues {
public:
/** \brief \ru Использовать относительную точность (true).
\en Use relative tolerance (true). \~
\details \ru При использовании относительной точности отклонение граней тела от сетки проверяется относительно размера модели.
\en While use of relative tolerance distance from shell to mesh is checked relative to model size. \~
*/
bool useRelativeTolerance;
/** \brief \ru Флаг сглаживания краевых ребер.
\en Smoothing flag of boundary edges. \~
\details \ru Сглаживать краевые ребра результирующей оболочки или строить их кусочно-линейными.
\en Smooth boundary edges of the resultant shell or build them piecewise linear. \~
*/
bool smoothBoundaryEdges;
/** \brief \ru Предельное значение угла между соседними внешними ребрами сетки в радианах.
\en The treshold value of angle between two adjanced external edges of mesh (in radians). \~
\details \ru Предельное значение угла между соседними ребрами сетки используется при построении граничных ребер оболочки: граничные ребра оболочки
будут разделяться в вершинах, где наименьший угол между соседними внешними ребрами сетки менее данного предельного.
\en The treshold value of angle between two adjanced edges of mesh is used for building boundary edges of the shell:
boundary edge will be divied at the vertices at which minimum angle between two adjanced edges of mesh is less
then a given treshold value. \~
*/
double bAngle;
/** \brief \ru Точность.
\en Tolerance. \~
\details \ru Точность работы метода: допустимое отклонение граней тела от вершин сетки.
\en Tolerance: maximum distance from BRep faces to mesh vertices. \~
*/
double tolerance;
/** \brief \ru Режим распознавания поверхностей.
\en Surface reconstruction mode. \~
*/
MbeSurfReconstructMode surfReconstructMode;
/** \brief \ru Режим построения модели BRep.
\en BRep creation mode. \~
*/
MbeCreateBRepMode brepCreationMode;
/// \ru Конструктор по умолчанию. \en Default constructor.
explicit MbMeshProcessorValues( bool useRelTol = true,
bool smoothBoundary = true,
double tol = 0.01,
double angle = M_PI_2,
MbeSurfReconstructMode reconMode = srm_Default,
MbeCreateBRepMode bMode = cbm_Default )
: useRelativeTolerance( useRelTol )
, smoothBoundaryEdges ( smoothBoundary )
, bAngle ( angle )
, tolerance ( tol )
, surfReconstructMode ( reconMode )
, brepCreationMode ( bMode )
{}
};
//------------------------------------------------------------------------------
/** \brief \ru Класс для создания оболочки в граничном представлении по полигональной сетке.
\en Class for creating a BRep shell by polygonal mesh. \~
\details \ru Предоставить интерфейс для управления преобразованием сетки в
оболочку в граничном представлении. \n
\en Provide an interface for managing of "Mesh to BRep" conversion. \n \~
\ingroup Polygonal_Objects
*/
// ---
class MATH_CLASS MbMeshProcessor : public MbRefItem
{
protected:
/// \ru Конструктор. \en Constructor.
MbMeshProcessor();
public:
/** \brief \ru Создать экземпляр процессора по коллекции.
\en Create mesh processor by collection. \~
\details \ru Создать экземпляр процессора по коллекции. Пользователь должен сам удалить объект.
\en Create mesh processor by collection. User must delete created object. \~
\param[in] collection - \ru Входная коллекция, содержащая треугольную сетку. \n
\en Input collection containing triangle mesh. \~
\return \ru Возвращает указатель на созданный объект.
\en Returns pointer to created object. \~
\ingroup Polygonal_Objects
*/
static MbMeshProcessor * Create( const MbCollection & collection );
/// \ru Деструктор. \en Destructor.
virtual ~MbMeshProcessor();
/** \brief \ru Установить относительную точность.
\en Set relative tolerance. \~
\details \ru Установить относительную точность по габаритам текущей сетки.
\en Set relative tolerance by current mesh box. \~
\param[in] tolerance - \ru Относительная точность. \n
\en Relative tolerance to set. \~
\ingroup Polygonal_Objects
*/
virtual void SetRelativeTolerance( double tolerance ) = 0;
/** \brief \ru Установить точность.
\en Set tolerance. \~
\details \ru Установить точность распознавания поверхностей и расширения сегментов сетки.
Метод должен быть вызван перед вызовом SegmentMesh.
Точность по умолчанию равна 0.1.
\en Set tolerance of surface reconstruction and segments extension.
Method should be called before call to SegmentMesh.
Default tolerance is 0.1. \n \~
\param[in] tolerance - \ru Точность. \n
\en Tolerance to set. \~
\ingroup Polygonal_Objects
*/
virtual void SetTolerance( double tolerance ) = 0;
/** \brief \ru Получить точность.
\en Get tolerance. \~
\details \ru Получить текущую точность, используемую при распознавании поверхностей и расширения сегментов сетки.
\en Get current tolerance used in surface reconstruction and segments extension. \~
\return \ru Возвращает абсолютную точность.
\en Returns absolute tolerance. \~
\ingroup Polygonal_Objects
*/
virtual double GetTolerance() const = 0;
//------------------------------------------------------------------------------
/** \brief \ru Установить режим распознавания поверхностей.
\en Set the surfaces reconstruction mode. \~
\details \ru Задать типы поверхностей, генерируемых на сегментах. Поверхности неподдерживаемых типов строиться не будут. \n
\en Set types of surfaces which will be generated on segments. The surfaces of unsupoprted type will not be built. \n \~
\param[in] mode - \ru Режим распознавания поверхностей.
\en Surface reconstruction mode.
\ingroup Polygonal_Objects
*/
virtual void SetReconstructionMode( MbeSurfReconstructMode mode ) = 0;
//------------------------------------------------------------------------------
/** \brief \ru Установить режим построения модели BRep.
\en Set the BRep creation mode. \~
\details \ru Задать степень связности граней в результирующей модели BRep. \n
\en Set connectivity type of faces of resultant BRep model. \n \~
\param[in] mode - \ru Режим построения модели BRep.
\en BRep creation mode.
\ingroup Polygonal_Objects
*/
virtual void SetBrepCreationMode( MbeCreateBRepMode mode ) = 0;
//------------------------------------------------------------------------------
/** \brief \ru Установить флаг сглаживания входной сетки.
\en Set flag to use smoothing of input mesh. \~
\details \ru Установить флаг сглаживания входной сетки. Если флаг установлен в true,
то перед запуском основного алгоритма сегментации будет выполнено сглаживание входной сетки.
Рекомендуется использовать сглаживание на неточных сетках, например, полученных методом сканирования. \n
\en Set flag to use smoothing of input mesh. If the flag set to true, then run smoothing of input mesh
before main segmentation algorithm start.
It is recommended to use mesh smoothing on inexact meshes, e.g. meshes obtained by scanning. \n \~
\param[in] useSmoothing - \ru Флаг использования сглаживания входной сетки. По-умолчанию false.
\en The flag to use smoothing of input mesh. Default false.
\ingroup Polygonal_Objects
*/
// ---
virtual void SetUseMeshSmoothing( bool useSmoothing ) = 0;
/** \brief \ru Получить исправленную (упрощенную) копию входной полигональной сетки.
\en Get fixed (simplified) copy of the input mesh. \~
\details \ru Получить исправленную копию входной сетки, на которой выполняются операции MbMeshProcessor:
подсчет кривизн, сегментация, построение оболочки. Все индексы в выходных данных соответствуют
индексам вершин и треугольников упрощенной сетки, возвращаемой данным методом. \n
\en Get fixed copy of the input mesh. All further operations of MbMehsProcessor are
performed for simplified mesh: curvature calculation, segmentation, shell creation.
All indices in the output of these operations corresponds to indices of vertices and
triangles of the simplified mesh returned from this function. \n \~
\return \ru Возвращает исправленную версию входной полигональной сетки.
\en Returns a fixed version of the input mesh. \~
\ingroup Polygonal_Objects
*/
virtual const MbCollection & GetSimplifiedMesh() = 0;
/** \brief \ru Получить сегментированную копию входной полигональной сетки.
\en Get segmented copy of the input mesh. \~
\details \ru Получить сегменитрованную копию входной сетки, на которой выполняются операции MbMeshProcessor:
подсчет кривизн, сегментация, построение оболочки.
Сегментация доступна внутри коллекции. \n
\en Get segmented copy of the input mesh. All further operations of MbMehsProcessor are
performed for simplified mesh: curvature calculation, segmentation, shell creation.
Segmentation is stored inside collection. \n \~
\return \ru Возвращает сегментированную версию входной полигональной сетки.
\en Returns a segmented version of the input mesh. \~
\ingroup Polygonal_Objects
*/
virtual const MbCollection & GetSegmentedMesh() = 0;
/** \brief \ru Рассчитать главные кривизны и главные направления изменения кривизн в точках сетки.
\en Calculate the principal curvatures and principal curvature directions at mesh points. \~
\details \ru Рассчитать главные кривизны и главные направления изменения кривизн в точках сетки. \n
\en Calculate the principal curvatures and principal curvature directions at mesh points. \n \~
\return \ru Возвращает главные кривизны и главные направления в точках сетки.
\en Returns principal curvatures and principal curvature directions at mesh points. \~
\ingroup Polygonal_Objects
*/
virtual const std::vector<MbCurvature> & CalculateCurvatures() = 0;
/** \brief \ru Сегментровать полигональную сетку.
\en Segment a polygonal mesh. \~
\details \ru Выполнить сегментацию полигональной сетки. \n
\en Perform segmentation of a polygonal mesh. \n \~
\return \ru Возвращает код результата операции.
\en Returns operation result code. \~
\param[in] createSurfaces - \ru Создавать ли поверхности на сегментах.
\en Create surfaces on segments or not. \~
\ingroup Polygonal_Objects
*/
virtual MbResultType SegmentMesh( bool createSurfaces = true ) = 0;
/** \brief \ru Создать оболочку.
\en Create shell. \~
\details \ru Создать оболочку в граничном представлении, соответствующее модели, заданной полигональной сеткой.
Используется текущая сегментация.
Если сегментация не была вычислена, то вычисляется автоматическая сегментация (с параметрами по умолчанию). \n
\en Create BRep shell that represents input mesh model.
Current segmentation is used.
If segmentation is not computed yet, then automatic segmentation is performed (with default parameters). \n \~
\param[out] pShell - \ru Указатель на созданную оболочку.
\en The pointer to created shell. \~
\param[in] smoothBoundaryEdges - \ru Флаг сглаживания краевых ребер.
\en Smoothing flag of boundary edges. \~
\param[in] bondThresholdAngle - \ru Предельное значение угла между соседними внешними ребрами сетки в радианах.
\en The treshold value of angle between two adjanced external edges of mesh (in radians). \~
\return \ru Возвращает код результата операции.
\en Returns operation result code. \~
\ingroup Polygonal_Objects
*/
virtual MbResultType CreateBRepShell( MbFaceShell *& pShell, bool smoothBoundaryEdges, double bondThresholdAngle ) = 0;
/** \brief \ru Вписать поверхность.
\en Fit surface to segment . \~
\details \ru Распознать поверхность по сегменту сетки с заданным индексом.
Распознанная поверхность может быть получена с помощью метода GetSegmentSurface. \n
\en Recognize surface for mesh segment with a given index.
Recognized surface is available through GetSegmentSurface method. \n \~
\param[in] idxSegment - \ru Индекс сегмента полигональной сетки.
\en Index of a mesh segment. \~
\ingroup Polygonal_Objects
*/
virtual void FitSurfaceToSegment( size_t idxSegment ) = 0;
/** \brief \ru Вписать поверхность заданного типа.
\en Fit surface of a given type to a segment. \~
\details \ru Построить поверхность заданного типа, аппроксимирующиую сегмент сетки с заданным индексом.
Распознанная поверхность может быть получена с помощью метода GetSegmentSurface. \n
\en Find surface of a given type approximating mesh segment with a given index.
Recognized surface is available through GetSegmentSurface method. \n \~
\param[in] idxSegment - \ru Индекс сегмента полигональной сетки.
\en Index of a mesh segment. \~
\param[in] surfaceType - \ru Тип вписываемой поверхности.
\en Type of fitted surface. \~
\ingroup Polygonal_Objects
*/
virtual void FitSurfaceToSegment( size_t idxSegment, MbeSpaceType surfaceType ) = 0;
/** \brief \ru Получить поверхность для сегмента.
\en Get surface of segment. \~
\details \ru Получить поверхность, вписанную в сегмент.
Чтобы поверхность была определена предварительно должны быть вызваны методы
SegmentMesh или FitSurfaceToSegment.
Распознанная поверхность с помощью метода GetSegmentSurface. \n
\en Get surface that approximates segment.
To fit surface use corresponding methods SegmentMesh or FitSurfaceToSegment. \n \~
\param[in] idxSegment - \ru Индекс сегмента полигональной сетки.
\en Index of a mesh segment. \~
\return \ru Возвращает указатель на поверхность для сегмента, если поверхность определена, иначе - nullptr.
\en Returns pointer to segment surface if it exists, else - nullptr. \~
\ingroup Polygonal_Objects
*/
virtual const MbSurface * GetSegmentSurface( size_t idxSegment ) const = 0;
/** \brief \ru Установить поверхность для сегмента.
\en Set surface of segment. \~
\details \ru Установить поверхность, вписанную в сегмент.
Чтобы поверхность была определена предварительно должны быть вызваны методы
SegmentMesh или FitSurfaceToSegment.
Распознанная поверхность с помощью метода GetSegmentSurface. \n
\en Set surface that approximates segment.
To fit surface use corresponding methods SegmentMesh or FitSurfaceToSegment. \n \~
\param[in] idxSegment - \ru Индекс сегмента полигональной сетки.
\en Index of a mesh segment. \~
\return \ru Возвращает указатель на поверхность для сегмента, если поверхность определена, иначе - nullptr.
\en Returns pointer to segment surface if it exists, else - nullptr. \~
\ingroup Polygonal_Objects
*/
virtual MbSurface * SetSegmentSurface( size_t idxSegment ) = 0;
/** \brief \ru Очистить сегментацию полигональной сетки.
\en Reset segmentation of the polygonal mesh. \~
\details \ru Очистить сегментацию полигональной сетки, хранящуюся внутри MbMeshProcessor. \n
\en Reset segmentation of the polygonal mesh stored inside MbMeshProcessor. \n \~
\ingroup Polygonal_Objects
*/
virtual void ResetSegmentation() = 0;
/** \brief \ru Найти ближайший путь между двумя вершинами коллекции.
\en Find shortest path between two vertices. \~
\details \ru Найти ближайший путь, проходящий по вершинам и ребрам коллекции, соединяющий две заданные вершины. \n
\en Find shortest path between two vertices. The path should pass through collection vertices and edges. \n \~
\param[in] v1 - \ru Индекс первой вершины.
\en The index of first vertex. \~
\param[in] v2 - \ru Индекс второй вершины.
\en The index of second vertex. \~
\param[out] path - \ru Путь из первой вершины во вторую.
Массив содержит последовательные индексы всех вершин пути.
\en The path from the first vertex to the second one.
The array contains successive indices of path vertices. \~
\return \ru Возвращает код результата операции.
\en Returns operation result code. \~
\ingroup Polygonal_Objects
*/
virtual bool FindShortestVertexPath( uint v1, uint v2, std::vector<uint> & path ) = 0;
private: // UNDER DEVELOPMENT
/** \} */
/** \ru \name Функции для работы с разбиением сетки на сегменты и распознаванием поверхностей для сегментов.
\en \name Functions for editting of mesh segmentation and reconstruction of surfaces for the segments.
\{ */
/** \brief \ru Объединить два сегмента в текущей сегментации.
\en Unite two segments in current segmentation. \~
\details \ru Объединение сегментов в текущей сегментации.
Результат объединения доступен через коллекцию, возвращаемую методом GetSegmentedMesh. \n
\en Union of segments in current mesh segmentation.
Result segmentation is available through collection returned by GetSegmentedMesh. \n \~
\param[in] firstSegmentIdx - \ru Индекс первого сегмента для объединения. \n
\en Index of the first segment for union. \~
\param[in] secondSegmentIdx - \ru Индекс второго сегмента для объединения. \n
\en Index of the second segment for union. \~
\ingroup Polygonal_Objects
*/
virtual void UniteSegments( size_t firstSegmentIdx, size_t secondSegmentIdx ) = 0;
/** \brief \ru Сегментровать полигональную сетку по разделителям сегментов.
\en Segment a polygonal mesh by segment separators. \~
\details \ru Выполнить сегментацию полигональной сетки по заданным разделителям сегментов. \n
\en Perform segmentation of a polygonal mesh by segment separators. \n \~
\param[in] separators - \ru Массив разделителей.
Каждый разделитель содержит путь по вершинам сетки, ребра которого разделяют сегменты.
\en The array of segment separators.
Each separator contains a path by mesh vertices. Edges of that path split mesh to segments. \~
\return \ru Возвращает код результата операции.
\en Returns operation result code. \~
\ingroup Polygonal_Objects
*/
virtual MbResultType SegmentMeshBySeparators( const std::vector<c3d::UintVector> & separators ) = 0;
OBVIOUS_PRIVATE_COPY( MbMeshProcessor )
};
//------------------------------------------------------------------------------
/** \brief \ru Создать оболочку по полигональной сетке c автоматическим распознаванием поверхностей.
\en Create shell from mesh with automatic surface reconstruction. \~
\details \ru Создать оболочку в граничном представлении, соответствующее модели, заданной полигональной сеткой.
Алгоритм в автоматическом режиме распознает и реконструирует грани, соответствующие элементарным
поверхностям (плоскость, цилиндр, сфера, конус, тор). \n
\en Create BRep shell that represents input mesh model.
Algorithm automatically detect and reconstruct faces based on elementary surfaces (plane, cylinder, sphere, cone, torus). \n \~
\param[in] mesh - \ru Входная сетка.
\en The input mesh. \~
\param[out] shell - \ru Указатель на созданную оболочку.
\en The pointer to created shell. \~
\param[in] params - \ru Параметры построения оболочки тела.
\en Parameters of BRep shell construction. \~
\return \ru Возвращает код результата операции.
\en Returns operation result code. \~
\ingroup Polygonal_Objects
*/
// ---
MATH_FUNC( MbResultType ) ConvertMeshToShell( MbMesh & mesh, MbFaceShell *& shell, const MbMeshProcessorValues & params = MbMeshProcessorValues() );
//------------------------------------------------------------------------------
/** \brief \ru Создать оболочку по коллекции, содержащей полигональную сетку c автоматическим распознаванием поверхностей.
\en Create shell from collection with automatic surface reconstruction. \~
\details \ru Создать оболочку в граничном представлении, соответствующую модели, заданной полигональной сеткой.
Алгоритм в автоматическом режиме распознает и реконструирует грани, соответствующие элементарным
поверхностям (плоскость, цилиндр, сфера, конус, тор). \n
\en Create BRep shell that represents input mesh model from collection.
Algorithm automatically detect and reconstruct faces based on elementary surfaces (plane, cylinder, sphere, cone, torus). \n \~
\param[in] collection - \ru Коллекция, содержащая входную сетку.
\en The input collection. \~
\param[out] shell - \ru Указатель на созданную оболочку.
\en The pointer to created shell. \~
\param[in] params - \ru Параметры построения оболочки тела.
\en Parameters of BRep shell construction. \~
\return \ru Возвращает код результата операции.
\en Returns operation result code. \~
\ingroup Polygonal_Objects
*/
// ---
MATH_FUNC( MbResultType ) ConvertCollectionToShell( MbCollection & collection, MbFaceShell *& shell, const MbMeshProcessorValues & params = MbMeshProcessorValues() );
//------------------------------------------------------------------------------
/** \brief \ru Вписать поверхность в множество полигонов сетки.
\en Fit the surface into polygon set. \~
\details \ru Вписать поверхность заданного типа в множество полигонов триангуляции. \n
В случае если множество полигонов не задано, используются
все полигоны триангуляции.
\en Fit a surface of a given type into the polygon set. \n
If the set of polygons is not specified, all triangulation polygons are used. \~
\param[in] grid - \ru Исходная триангуляция.
\en The initial triangulation. \~
\param[in] params - \ru Параметры вписывания поверхности.
\en The fitting parameters. \~
\param[out] results - \ru Результаты вписывания поверхности.
\en Results of surface fitting. \~
\return \ru Возвращает код результата операции.
\en Returns operation result code. \~
\warning \ru В разработке.
\en Under development. \~
\ingroup Polygonal_Objects
\deprecated
*/
// ---
DEPRECATE_DECLARE_REPLACE( MbSurfaceFitter )
MATH_FUNC( MbResultType ) FitSurfaceToGrid( const MbGrid & grid, const MbSurfaceFitToGridParameters & params, MbSurfaceFitToGridResults & results );
#endif // __ACTION_B_SHAPER_H