Files
SaraP 09a338b565 Extern :
- C3d aggiornamento delle librerie ( 117994).
2024-06-05 09:47:32 +02:00

1440 lines
79 KiB
C++

////////////////////////////////////////////////////////////////////////////////
/**
\file
\brief \ru Следы трехмерных объектов.
\en Vestiges of three-dimensional objects. \~
*/
////////////////////////////////////////////////////////////////////////////////
#ifndef __MAP_VESTIGE_H
#define __MAP_VESTIGE_H
#include <templ_p_array.h>
#include <templ_pointer.h>
#include <templ_sptr.h>
#include <mb_cart_point.h>
#include <mb_matrix.h>
#include <curve.h>
#include <topology_item.h>
#include <mesh_primitive.h>
#include <algorithm>
#include <iterator>
#include <vector>
class MbEdgeVestige;
class MbVertexVestige;
//------------------------------------------------------------------------------
/** \brief Тип пространственной геометрии кривой.
\details Тип пространственной геометрии кривой. \n
\ingroup Mapping
*/
enum MbMapSpaceCurveType {
mst_Unset = 0, ///< тип геометрии кривой неопределен
mst_Degenerate, ///< кривая в проекции вырождается в точку
mst_Line, ///< кривая в проекции вырождается в линию
mst_Circle, ///< кривая в проекции вырождается в окружность
mst_Ellipse, ///< кривая в проекции вырождается в эллипс
mst_Arbitrary, ///< произвольный тип кривой
};
// ---
//------------------------------------------------------------------------------
/** \brief \ru След трехмерного объекта.
\en The vestige of three-dimensional object. \~
\details \ru Базовый класс для классов следа трехмерного объекта.\n
\en The base class for classes of three-dimensional object vestige.\n \~
\ingroup Mapping
*/
// ---
class MATH_CLASS MbBaseVestige : public TapeBase {
protected:
uint comp; ///< \ru Компонент. \en A component.
size_t ident; ///< \ru Идентификатор нити. \en A thread identifier.
uint16 style; ///< \ru Базовый стиль. \en A basis style. \~ \internal \ru По просьбе группы 3D (Компас) \en 3D (Kompas) at request. \~ \endinternal
MbAttributeContainer attrData; ///< \ru Атрибуты. \en Attributes. \~ \internal \ru По просьбе группы Приложений (Компас) \en Apps (Kompas) at request. \~ \endinternal
protected:
const MbTopologyItem * item; ///< \ru Топологический объект(используется только как временный внутри проецирования). \en Topological object (is used only as a temporary object in projection).
TOwnPointer<const MbName> name; ///< \ru Имя. \en A name.
public:
/** \brief \ru Классификация плоского отображения.
\en The classification of a planar mapping. \~
\details \ru Классификация плоского отображения. \n
\en The classification of a planar mapping. \n \~
*/
enum Type {
vt_None, ///< \ru Тип не определён. \en A type is undefined.
vt_SmoothEdge, ///< \ru Линия перехода (гладкое ребро). \en A transition line (smooth edge).
vt_Edge, ///< \ru Отображение ребра или линия очерка поверхности. \en Mapping of edge or isocline curve of surface.
vt_SectionLine, ///< \ru Линия разреза (ребра тела, полученные сечением). \en A cutaway line (section edges).
vt_AnnThreadThin, ///< \ru Аннотационный объект резьба тонкая. \en An annotative object - a thread is thin.
vt_AnnThreadThick, ///< \ru Аннотационный объект резьба толстая. \en An annotative object - a thread is thick.
vt_AnnThreadDashed, ///< \ru Аннотационный объект резьба штриховая. \en An annotative object - a thread is dashed.
vt_BoundLeft, ///< \ru Левая граница вида. \en The left boundary of a view.
vt_BoundRight, ///< \ru Правая граница вида. \en The right boundary of a view.
vt_Vertex, ///< \ru Вершина. \en A vertex.
vt_SpacePoint, ///< \ru Пространственная точка. \en A spatial point.
vt_SpaceCurve, ///< \ru Пространственная кривая. \en A spatial curve.
vt_CenterLine, ///< \ru Осевая (центральная) линия. \en A center line.
vt_MeshEdge, ///< \ru Отображение ребра или линия очерка полигонального объекта. \en Mapping of edge or isocline curve of polygonal object.
};
/** \brief \ru Классификатор подтипов аннотационных ребер.
\en The classifier of annotative edges subtypes. \~
\details \ru Классификатор подтипов аннотационных ребер. \n
\en The classifier of annotative edges subtypes. \n \~
*/
enum SubType {
vst_None = 0, ///< \ru Подтип не определен. \en A subtype is undefined.
vst_BaseBeg, ///< \ru Основной начальный. \en A base initial type.
vst_BaseEnd, ///< \ru Основной конечный. \en A base final type.
vst_ButtBeg, ///< \ru Торцевой начальный. \en A butt initial type.
vst_ButtEnd, ///< \ru Торцевой конечный. \en A butt final type.
vst_CLAxis, ///< \ru Прямолинейная ось. \en A straight axis type.
vst_CLPath, ///< \ru Криволинейная траектория. \en A curved path type.
};
protected:
/** \brief \ru Конструктор.
\en Constructor. \~
\details \ru Конструктор для топологического объекта.\n
\en Constructor for a topological object.\n \~
\param[in] otherComp - \ru Компонент.
\en A component. \~
\param[in] otherIdent - \ru Идентификатор нити.
\en A thread identifier. \~
\param[in] otherItem - \ru Топологический объект.
\en A topological object. \~
*/
MbBaseVestige( uint otherComp, size_t otherIdent, const MbTopologyItem & otherItem )
: comp ( otherComp )
, ident ( otherIdent )
, style ( SYS_MAX_UINT16 )
, attrData ( )
, item ( &otherItem )
, name ( &otherItem.GetName() )
{ name.SetOwn( false ); }
/** \brief \ru Конструктор.
\en Constructor. \~
\details \ru Конструктор для аннотационного объекта.\n
\en Constructor for an annotative object.\n \~
\param[in] otherComp - \ru Компонент.
\en A component. \~
\param[in] otherIdent - \ru Идентификатор нити.
\en A thread identifier. \~
\param[in] otherName - \ru Имя топологического объекта.
\en A name of a topological object. \~
\param[in] otherItem - \ru Топологический объект.
\en A topological object. \~
*/
MbBaseVestige( uint otherComp, size_t otherIdent, const MbName & otherName, const MbTopologyItem * otherItem )
: comp ( otherComp )
, ident ( otherIdent )
, style ( SYS_MAX_UINT16 )
, attrData ( )
, item ( otherItem )
, name ( &otherName )
{ name.SetOwn( false ); }
/** \brief \ru Конструктор.
\en Constructor. \~
\details \ru Конструктор для пространственной точки или кривой.\n
\en Constructor for a spatial point or curve.\n \~
\param[in] otherComp - \ru Компонент.
\en A component. \~
\param[in] otherIdent - \ru Идентификатор нити.
\en A thread identifier. \~
\param[in] otherName - \ru Имя топологического объекта.
\en A name of a topological object. \~
*/
MbBaseVestige( uint otherComp, size_t otherIdent, const MbName & otherName )
: comp ( otherComp )
, ident ( otherIdent )
, style ( SYS_MAX_UINT16 )
, attrData ( )
, item ( nullptr )
, name ( &otherName )
{ name.SetOwn( false ); }
/// \ru Конструктор копирования с регистратором. \en Copy-constructor with the registrator.
MbBaseVestige( const MbBaseVestige & other, MbRegDuplicate * iReg );
/// \ru Конструктор. \en Constructor.
MbBaseVestige()
: comp ( 0 )
, ident ( SYS_MAX_T )
, style ( SYS_MAX_UINT16 )
, item ( nullptr )
, name ( nullptr )
{ name.SetOwn(false); }
virtual ~MbBaseVestige() {}
public:
virtual MbBaseVestige & Duplicate( MbRegDuplicate * iReg = nullptr ) const; ///< \ru Создать копию объекта. \en Create a copy of the object.
public:
uint GetComponent() const { return comp; }
size_t GetIdentifier() const { return ident; }
uint16 GetStyle() const { return style; }
const MbAttributeContainer & GetAttributes() const { return attrData; }
void CopyIdData( const MbBaseVestige & obj ) { comp = obj.comp; ident = obj.ident; }
void SetProperties ( uint16 st ) { style = st; }
void SetProperties ( uint16 st, const MbAttributeContainer & ac ) { style = st; attrData.AttributesAssign( ac ); }
void CopyProperties( const MbBaseVestige & obj ) { style = obj.style; attrData.AttributesAssign( obj.attrData ); }
public:
const MbTopologyItem * GetItem() const { return item; } ///< \ru Топологический объект. \en A topological object.
const MbName * GetVestigeName() const { return name; } ///< \ru Имя. \en A name.
private:
bool operator == ( const MbBaseVestige & ); // \ru Не реализован. \en Not implemented.
bool operator != ( const MbBaseVestige & ); // \ru Не реализован. \en Not implemented.
DECLARE_PERSISTENT_CLASS_NEW_DEL( MbBaseVestige )
OBVIOUS_PRIVATE_COPY( MbBaseVestige )
};
IMPL_PERSISTENT_OPS( MbBaseVestige )
//------------------------------------------------------------------------------
/** \brief \ru След вершины.
\en The vestige of a vertex. \~
\details \ru След вершины.\n
\en The vestige of a vertex.\n \~
\ingroup Mapping
*/
// ---
class MATH_CLASS MbVertexVestige : public MbBaseVestige {
friend struct MbVEFVestiges;
protected:
MbCartPoint point; ///< \ru Проекция вершины. \en A vertex projection.
bool bvisible; ///< \ru Флаг видимости. \en A visibility flag.
private:
uint8 vesType; ///< \ru Тип вершины. \en A vertex type.
protected:
/** \brief \ru Конструктор.
\en Constructor. \~
\details \ru Конструктор вершины.\n
\en Constructor of a vertex.\n \~
\param[in] otherComp - \ru Компонент.
\en A component. \~
\param[in] otherIdent - \ru Идентификатор нити.
\en A thread identifier. \~
\param[in] otherItem - \ru Топологический объект.
\en A topological object. \~
\param[in] vis - \ru Флаг видимости.
\en A visibility flag. \~
*/
MbVertexVestige( uint otherComp, size_t otherIdent, const MbTopologyItem & otherItem, bool vis )
: MbBaseVestige( otherComp, otherIdent, otherItem )
, point ( )
, bvisible( vis )
, vesType ( vt_Vertex )
{}
/** \brief \ru Конструктор.
\en Constructor. \~
\details \ru Конструктор пространственной точки.\n
\en Constructor of a spatial point.\n \~
\param[in] otherComp - \ru Компонент.
\en A component. \~
\param[in] otherIdent - \ru Идентификатор нити.
\en A thread identifier. \~
\param[in] otherName - \ru Имя топологического объекта.
\en A name of a topological object. \~
\param[in] vis - \ru Флаг видимости.
\en A visibility flag. \~
*/
MbVertexVestige( uint otherComp, size_t otherIdent, const MbName & otherName, bool vis, bool isDegenerateCurve )
: MbBaseVestige( otherComp, otherIdent, otherName )
, point ( )
, bvisible( vis )
, vesType ( isDegenerateCurve ? (uint8)vt_SpaceCurve : (uint8)vt_SpacePoint )
{}
/// \ru Конструктор копирования с регистратором. \en Copy-constructor with the registrator.
MbVertexVestige( const MbVertexVestige & other, MbRegDuplicate * iReg )
: MbBaseVestige( other, iReg )
, point ( other.point )
, bvisible ( other.bvisible )
, vesType ( other.vesType )
{}
/// \ru Конструктор. \en Constructor.
MbVertexVestige()
: MbBaseVestige()
, point ( )
, bvisible( true )
, vesType ( vt_None )
{}
public:
/// \ru Создать копию объекта. \en Create a copy of the object.
MbBaseVestige & Duplicate( MbRegDuplicate * iReg = nullptr ) const override;
public:
/// \ru Тип отображения. \en Mapping type.
Type GetType() const { return (Type)vesType; }
/// \ru Это видимая точка? \en Is point visible?
bool IsVisible() const { return bvisible; }
/// \ru Получить точку. \en Get the point.
const MbCartPoint & GetPoint() const { return point; }
/// \ru Преобразовать точку по матрице. \en Transform the point.
void TransformPoint( const MbMatrix & mtr ) { point.Transform( mtr ); }
private:
bool operator == ( const MbVertexVestige & ); // \ru Не реализован. \en Not implemented.
bool operator != ( const MbVertexVestige & ); // \ru Не реализован. \en Not implemented.
DECLARE_PERSISTENT_CLASS_NEW_DEL( MbVertexVestige )
OBVIOUS_PRIVATE_COPY( MbVertexVestige )
};
IMPL_PERSISTENT_OPS( MbVertexVestige )
struct MbCurveVestige;
void ReplaceCurveVestigeDuplicates( MbCurveVestige & );
//------------------------------------------------------------------------------
/** \brief \ru Информация о следе кривой.
\en The information about a curve vestige. \~
\details \ru Информация о следе кривой.\n
Для вложения в след ребра (MbVestigeEdge) и в след грани (MbVestigeEdge).\n
\en The information about a curve vestige.\n
For including to the edge vestige (MbVestigeEdge) and face vestige (MbVestigeEdge).\n \~
\ingroup Mapping
*/
// ---
struct MATH_CLASS MbCurveVestige : public TapeBase {
protected:
SPtr<MbCurve> totalPrj; ///< \ru Полная проекция (может быть nullptr). \en A full projection (can be nullptr). \~ \internal \ru Владеет. \en Owns. \~ \endinternal
std::vector<MbCurve *> arTotal; ///< \ru Все проекции в упорядоченной форме. \en All projections in an ordered form. \~ \internal \ru Не владеет. \en Doesn't own. \~ \endinternal
// \ru Двумерные кривые лежат копиями, поэтому массивы владеющие. \en Two-dimensional uv-curves are copies therefore arrays are owners
// \ru Если кривых нет то указатель останется нулевым. \en If no curves then the pointer remains nullptr.
TPointer< PArray<MbCurve> > arVisPrj; ///< \ru Видимые проекции. \en Visible projections.
TPointer< PArray<MbCurve> > arHidPrj; ///< \ru Не видимые проекции. \en Invisible projections.
public:
/** \brief \ru Конструктор.
\en Constructor. \~
\details \ru Конструктор по умолчанию.\n
Создает объект с нулевой проекцией.
\en Default constructor.\n
Creates an object with the null projection. \~
*/
MbCurveVestige()
: totalPrj( nullptr )
, arTotal ( )
, arVisPrj( nullptr )
, arHidPrj( nullptr )
{}
/// \ru Конструктор копирования с регистратором. \en Copy-constructor with the registrator.
MbCurveVestige( const MbCurveVestige & other, MbRegDuplicate * iReg );
/// \ru Деструктор. \en Destructor.
virtual ~MbCurveVestige() { ClearAll(); }
public:
/// \ru Создать копию объекта. \en Create a copy of the object.
virtual MbCurveVestige & Duplicate( MbRegDuplicate * iReg = nullptr ) const;
public:
/** \brief \ru Очистить проекции.
\en Clear projections. \~
\details \ru Очистить проекции.\n
Очищает список проекций в arTotal,
обнуляет указатели totalPrj, arVisPrj, arHidPrj.
\en Clear projections.\n
Clears the list of projections in the arToral,
resets the totalPrj, arVisPrj, arHidPrj. \~
*/
void ClearAll()
{
arTotal.clear();
totalPrj = nullptr;
arVisPrj = nullptr;
arHidPrj = nullptr;
}
/// \ru Пустое ли отображение кривой? \en Is an empty curve vestige?
bool IsEmpty() const
{
return ( totalPrj == nullptr ) &&
( arTotal.size() < 1 ) &&
( !arVisPrj || arVisPrj->empty() ) &&
( !arHidPrj || arHidPrj->empty() );
}
/// \ru Количество видимых частей проекции. \en The number of visible parts of the projection.
size_t GetVisiblePartsCount() const { return ( ( !!arVisPrj ) ? arVisPrj->size() : 0 ); }
/// \ru Количество невидимых частей проекции. \en The number of hidden parts of the projection.
size_t GetHiddenPartsCount () const { return ( ( !!arHidPrj ) ? arHidPrj->size() : 0 ); }
/// \ru Количество всех частей проекции. \en The number of all parts of the projection.
size_t GetAllPartsCount () const { return arTotal.size(); }
/// \ru Создан ли массив для видимых частей проекции. \en Is the array for visible parts of the projection created?
bool IsVisibleCurvesArray() const { return !!arVisPrj; }
/// \ru Создан ли массив для невидимых частей проекции. \en Is the array for hidden parts of the projection created?
bool IsHiddenCurvesArray () const { return !!arHidPrj; }
/// \ru Получить видимую часть проекции. \en Get visible part of projection.
const MbCurve * _GetVisibleCurve( size_t k ) const { return (( !!arVisPrj ) ? (*arVisPrj)[k] : nullptr); }
/// \ru Получить невидимую часть проекции. \en Get hidden part of projection.
const MbCurve * _GetHiddenCurve ( size_t k ) const { return (( !!arHidPrj ) ? (*arHidPrj)[k] : nullptr); }
/// \ru Положить в массив указатели видимых частей проекции. \en Put pointers of visible parts of projection into the array.
template <class Curves>
void GetVisibleCurves( Curves & dst ) const;
/// \ru Положить в массив указатели невидимых частей проекции. \en Put pointers of hidden parts of projection into the array.
template <class Curves>
void GetHiddenCurves ( Curves & dst ) const;
/// \ru Добавить свой габарит в присланный габарит. \en Add your own bounding box into the sent bounding box.
void AddYourGabaritTo( MbRect & ) const;
/// \ru Преобразование согласно матрице. \en The transformation according to a matrix.
void Transform( const MbMatrix & );
/** \brief \ru Добавить часть проекции.
\en Add a part of projection. \~
\details \ru Добавить новую часть общей проекции, имеющий признак видимости.\n
\en Add a new part of the general projection which has a visibility attribute.\n \~
\param[in] segment - \ru Часть проекции.
\en A projection part. \~
\param[in] visible - \ru Признак видимости.
\en A visibility attribute. \~
*/
void AddSegment( MbCurve & segment, bool visible );
/** \brief \ru Добавить копию часть проекции.
\en Add copy of a part of projection. \~
\details \ru Добавить копию новой части общей проекции, имеющей признак видимости.\n
\en Add copy of a new part of the general projection which has a visibility attribute.\n \~
\param[in] segment - \ru Часть проекции.
\en A projection part. \~
\param[in] visible - \ru Признак видимости.
\en A visibility attribute. \~
*/
void AddSegmentCopy( const MbCurve & segment, bool visible );
/** \brief \ru Забрать все проекционные кривые из структуры.
\en Pick up all curves. \~
\details \ru Забрать все проекционные кривые из структуры и очистить ее.
\en Pick up all curves of this structure and clear it. \~
*/
bool PickUpMapCurves( RPArray<MbCurve> & crvArr, c3d::BoolVector & visArr );
/// \ru Забрать видимую часть проекции (не обнуляет в массиве всех проекций). \en Pick up visible part of projection (it doesn't set zero in all projections array).
MbCurve * _PickupVisibleCurve( size_t );
/// \ru Забрать невидимую часть проекции (не обнуляет в массиве всех проекций). \en Pick up hidden part of projection (it doesn't set zero in all projections array).
MbCurve * _PickupHiddenCurve ( size_t );
/// \ru Поглотить данные структуры и очистить ее. \en Absorb data of this structure and clear it.
bool EatupOther( MbCurveVestige & );
/// \ru Отцепить все кривые из структуры и очистить ее. \en Detach all curves of this structure and clear it.
void DetachAllCurves( PArray<MbCurve> *& visCurves, PArray<MbCurve> *& hidCurves, SPtr<MbCurve> & totalPrj );
/// \ru Получение полной проекции. \en Merge total projection.
const MbCurve * MergeTotalMap ( MbMapSpaceCurveType spaceCurveGeomType );
/// \ru Обновление полной проекции. \en Update total projection.
const MbCurve * UpdateTotalMap( MbMapSpaceCurveType spaceCurveGeomType );
/// \ru Починить одиночное соответствие полной проекции и ее частями. \en Repair correspondence between total projection and parts of the projection.
bool RepairSpecificCorrespondence( bool uncertainIsVisible );
/// \ru Есть ли указатель на полную проекцию? \en Is there a pointer to the full projection?
bool IsTotalProjection() const { return (totalPrj != nullptr); }
/// \ru Указатель на полную проекцию. \en The pointer to a full projection.
MbCurve * DetachTotalProjection() { return ::DetachItem( totalPrj ); }
/// \ru Установить полную проекцию. \en Set a full projection.
void SetTotalProjection( MbCurve & );
/// \ru Указатель на полную проекцию. \en The pointer to a full projection.
const MbCurve * GetFullProjection() const;
/// \ru Обнулить указатель на полную проекцию. \en Set to null the pointer to a full projection.
MbCurve * DetachFullProjection();
friend void ReplaceCurveVestigeDuplicates( MbCurveVestige & );
private:
bool operator == ( const MbCurveVestige & ); // \ru Не реализован. \en Not implemented.
bool operator != ( const MbCurveVestige & ); // \ru Не реализован. \en Not implemented.
DECLARE_PERSISTENT_CLASS_NEW_DEL ( MbCurveVestige )
OBVIOUS_PRIVATE_COPY( MbCurveVestige )
};
IMPL_PERSISTENT_OPS( MbCurveVestige )
//------------------------------------------------------------------------------
// указатель на полную проекцию
// ---
inline
const MbCurve * MbCurveVestige::GetFullProjection() const
{
C3D_ASSERT( arTotal.size() == GetVisiblePartsCount() + GetHiddenPartsCount() );
MbCurve * curve = totalPrj;
if ( curve == nullptr ) {
if ( !!arVisPrj && (arVisPrj->size() == 1) )
curve = arVisPrj->operator[]( 0 );
else if ( !!arHidPrj && (arHidPrj->size() == 1) )
curve = arHidPrj->operator[]( 0 );
}
return curve;
}
//------------------------------------------------------------------------------
// \ru Забрать видимую часть проекции. \en Pick up visible part of projection.
//---
inline MbCurve * MbCurveVestige::_PickupVisibleCurve( size_t k )
{
if ( arVisPrj != nullptr ) {
PArray<MbCurve> & crvs = *arVisPrj;
MbCurve * crv = crvs[k];
::AddRefItem( crv ); // захват и отпускание на случай перехода на владение по счетчику ссылок
crvs[k] = nullptr;
::DecRefItem( crv );
return crv;
}
return nullptr;
}
//------------------------------------------------------------------------------
// \ru Забрать видимую часть проекции. \en Pick up visible part of projection.
//---
inline MbCurve * MbCurveVestige::_PickupHiddenCurve( size_t k )
{
if ( arHidPrj != nullptr ) {
PArray<MbCurve> & crvs = *arHidPrj;
MbCurve * crv = crvs[k];
::AddRefItem( crv ); // захват и отпускание на случай перехода на владение по счетчику ссылок
crvs[k] = nullptr;
::DecRefItem( crv );
return crv;
}
return nullptr;
}
//------------------------------------------------------------------------------
// \ru Отцепить все кривые из структуры и очистить ее. \en Detach all curves of this structure and clear it.
//---
inline void MbCurveVestige::DetachAllCurves( PArray<MbCurve> *& visCurves, PArray<MbCurve> *& hidCurves, SPtr<MbCurve> & wholePrj )
{
wholePrj = totalPrj;
totalPrj = nullptr;
arTotal.clear();
visCurves = !!arVisPrj ? arVisPrj.Relinquish() : nullptr;
hidCurves = !!arHidPrj ? arHidPrj.Relinquish() : nullptr;
}
//------------------------------------------------------------------------------
// \ru Положить в массив указатели видимых частей проекции. \en Put pointers of visible parts of projection into the array.
//---
template <class Curves>
void MbCurveVestige::GetVisibleCurves( Curves & dst ) const
{
if ( !!arVisPrj ) {
PArray<MbCurve> & src = *arVisPrj;
dst.reserve( dst.size() + src.size() );
std::copy( src.begin(), src.end(), std::back_inserter( dst ) );
}
}
//------------------------------------------------------------------------------
// \ru Положить в массив указатели невидимых частей проекции. \en Put pointers of hidden parts of projection into the array.
//---
template <class Curves>
void MbCurveVestige::GetHiddenCurves( Curves & dst ) const
{
if ( !!arHidPrj ) {
PArray<MbCurve> & src = *arHidPrj;
dst.reserve( dst.size() + src.size() );
std::copy( src.begin(), src.end(), std::back_inserter( dst ) );
}
}
//------------------------------------------------------------------------------
/** \brief \ru След ребра или кривой.
\en The vestige of an edge or a curve. \~
\details \ru След ребра или кривой.
Несет в себе информацию о следе одной кривой.\n
\en The vestige of an edge or a curve.
Carries the information about the vestige of one curve.\n \~
\internal \ru МА - На самом деле след не ребра,
а единичное отображение топологического объекта\n
(как правило ребра)
\en МА - it is not an edge vestige,
it is unit mapping of a topological object\n
(of edge usually) \~ \endinternal
\ingroup Mapping
*/
// ---
class MATH_CLASS MbEdgeVestige : public MbBaseVestige {
friend struct MbVEFVestiges;
public:
/** \brief
\deprecated \ru Поле будет объявлено приватным. Используйте для доступа методы GetCurveInfo() и SetCurveInfo().
\en The field will be declared private. Use methods GetCurveInfo() and SetCurveInfo() to access it.
*/
MbCurveVestige curveInfo; ///< \ru Информация о следе кривой. \en The information about a curve vestige.
private:
uint8 vesType; ///< \ru Тип отображения. \en A mapping type.
uint8 vesSubType; ///< \ru Подтип (для ветвления именования). \en A subtype for naming branching.
protected:
/** \brief \ru Конструктор.
\en Constructor. \~
\details \ru Конструктор для ребра.\n
\en Constructor for an edge.\n \~
\param[in] otherComp - \ru Компонент.
\en A component. \~
\param[in] otherIdent - \ru Идентификатор нити.
\en A thread identifier. \~
\param[in] otherItem - \ru Топологический объект.
\en A topological object. \~
\param[in] isSmooth - \ru Является ли ребро гладким или нет.
\en Is edge is smooth or not. \~
\param[in] isSection - \ru Является ли ребро линией разреза или нет.
\en Is edge is cutaway line or not. \~
*/
explicit
MbEdgeVestige( uint otherComp, size_t otherIdent, const MbTopologyItem & otherItem, bool isSmooth, bool isSection )
: MbBaseVestige( otherComp, otherIdent, otherItem )
, curveInfo ( )
, vesType ( (uint8)(isSmooth ? vt_SmoothEdge : vt_Edge) )
, vesSubType ( vst_None )
{
if ( isSection )
vesType = (uint8)vt_SectionLine;
}
/** \brief \ru Конструктор.
\en Constructor. \~
\details \ru Конструктор для пространственной точки или кривой.\n
\en Constructor for a spatial point or curve.\n \~
\param[in] otherComp - \ru Компонент.
\en A component. \~
\param[in] otherIdent - \ru Идентификатор нити.
\en A thread identifier. \~
\param[in] otherName - \ru Имя.
\en A name. \~
\param[in] isCenterLine - \ru Является ли кривая осевой линией или нет.
\en Is curve is center line or not. \~
\param[in] ownName - \ru Является ли otherName собственным именем объекта.
\en Is otherName own object name or not. \~
*/
explicit
MbEdgeVestige( uint otherComp, size_t otherIdent, const MbName & otherName, bool isCenterLine, bool ownName = false )
: MbBaseVestige( otherComp, otherIdent, otherName )
, curveInfo ( )
, vesType ( (uint8)(isCenterLine ? vt_CenterLine : vt_SpaceCurve) )
, vesSubType ( vst_None )
{ if ( ownName ) name.SetOwn( ownName ); }
/// \ru Конструктор копирования с регистратором. \en Copy-constructor with the registrator.
MbEdgeVestige( const MbEdgeVestige & other, MbRegDuplicate * iReg )
: MbBaseVestige( other, iReg )
, curveInfo ( other.curveInfo, iReg )
, vesType ( other.vesType )
, vesSubType ( other.vesSubType )
{}
/// \ru Конструктор. \en Constructor.
MbEdgeVestige()
: MbBaseVestige()
, curveInfo()
, vesType( vt_None )
, vesSubType( vst_None )
{}
public:
MbBaseVestige & Duplicate( MbRegDuplicate * iReg = nullptr ) const override;
public:
/// \ru Получить тип отображения. \en Get mapping type.
Type GetType() const { return (Type)vesType; }
/// \ru Получить подтип отображения. \en Get mapping subtype.
SubType GetSubType() const { return (SubType)vesSubType; }
/// \ru Установить тип отображения. \en Set mapping type.
void SetType( Type vt ) { vesType = (uint8)vt; }
/// \ru Установить подтип отображения. \en Set mapping subtype.
void SetSubType( SubType vt ) { vesSubType = (uint8)vt; }
///< \ru Получить информацию о следе кривой. \en Get the information about a curve vestige.
const MbCurveVestige & GetCurveInfo() const { return curveInfo; }
///< \ru Получить информацию о следе кривой. \en Get the information about a curve vestige.
MbCurveVestige & SetCurveInfo() { return curveInfo; }
/// \ru Добавить MbEdgeVestige в массив. \en Add the MbEdgeVestige to an array. \~
friend MbEdgeVestige * AddVestigeCurve( uint otherComp, size_t otherIdent, const MbName & otherName, RPArray<MbEdgeVestige> & arr, bool isCenterLine, bool ownName );
private:
bool operator == ( const MbEdgeVestige & ); // \ru Не реализован. \en Not implemented.
bool operator != ( const MbEdgeVestige & ); // \ru Не реализован. \en Not implemented.
DECLARE_PERSISTENT_CLASS_NEW_DEL( MbEdgeVestige )
OBVIOUS_PRIVATE_COPY( MbEdgeVestige )
};
IMPL_PERSISTENT_OPS( MbEdgeVestige )
//------------------------------------------------------------------------------
/** \brief \ru Добавить MbEdgeVestige в массив.
\en Add the MbEdgeVestige to an array. \~
\details \ru Добавить MbEdgeVestige в массив через закрытые конструкторы. \n
\en Add the MbEdgeVestige to an array by the private constructors. \n \~
\param[in] otherComp - \ru Компонент.
\en A component. \~
\param[in] otherIdent - \ru Идентификатор нити.
\en A thread identifier. \~
\param[in] otherName - \ru Имя топологического объекта.
\en A name of a topological object. \~
\param[out] array - \ru Массив ребер.
\en Array of edges. \~
\param[in] isCenterLine - \ru Является ли ребро осевой линией или нет.
\en Is curve is center line or not. \~
\param[in] ownName - \ru Является ли otherName собственным именем объекта.
\en Is otherName own object name or not. \~
\ingroup Mapping
*/
// ---
inline MbEdgeVestige * AddVestigeCurve( uint otherComp,
size_t otherIdent,
const MbName & otherName,
RPArray<MbEdgeVestige> & arr,
bool isCenterLine,
bool ownName )
{
MbEdgeVestige * vestige = new MbEdgeVestige( otherComp, otherIdent, otherName, isCenterLine, ownName );
if ( vestige ) {
arr.Add( vestige );
}
return vestige;
}
//------------------------------------------------------------------------------
/** \brief \ru След грани.
\en The vestige of a face. \~
\details \ru След грани.\n
Несет в себе информацию о следах очерков этой грани.
\en The vestige of a face.\n
Carriers the information about the vestiges of this face outlines. \~
\internal \ru МА - На самом деле след не грани,
а множественное отображение топологического объекта\n
(как правило грани или разбитого на части отображения ребра (при построении сечений) )
\en МА - it is not a vestige of a face,
it is a multiple mapping of a topological object\n
(of a face or partitioned edge mapping usually) \~ \endinternal
\ingroup Mapping
*/
// ---
class MATH_CLASS MbFaceVestige : public MbBaseVestige {
friend struct MbVEFVestiges;
public:
PArray<MbCurveVestige> curveInfos; ///< \ru Информация о следах очерков этой грани. \en The information about vestiges of this face outlines. \~ \internal \ru Владеет. \en Owns. \~ \endinternal
private:
uint8 vesType; ///< \ru Тип отображения. \en A mapping type.
protected:
/** \brief \ru Конструктор.
\en Constructor. \~
\details \ru Конструктор следа грани.\n
\en Constructor of a face vestige.\n \~
\param[in] otherComp - \ru Компонент.
\en A component. \~
\param[in] otherIdent - \ru Идентификатор нити.
\en A thread identifier. \~
\param[in] otherItem - \ru Топологический объект.
\en A topological object. \~
*/
MbFaceVestige( uint otherComp, size_t otherIdent, const MbTopologyItem & otherItem )
: MbBaseVestige( otherComp, otherIdent, otherItem )
, curveInfos ( 0, 1, true )
, vesType ( vt_Edge )
{}
/** \brief \ru Конструктор.
\en Constructor. \~
\details \ru Конструктор следа грани.\n
\en Constructor of a face vestige.\n \~
\param[in] otherComp - \ru Компонент.
\en A component. \~
\param[in] otherIdent - \ru Идентификатор нити.
\en A thread identifier. \~
\param[in] otherItem - \ru Полигональный объект.
\en A polygonal object. \~
*/
MbFaceVestige( uint otherComp, size_t otherIdent, const MbGrid & grid )
: MbBaseVestige( otherComp, otherIdent, grid.GetName() )
, curveInfos ( 0, 1, true )
, vesType ( vt_MeshEdge )
{}
/// \ru Конструктор копирования с регистратором. \en Copy-constructor with the registrator.
MbFaceVestige( const MbFaceVestige & other, MbRegDuplicate * iReg );
public:
MbBaseVestige & Duplicate( MbRegDuplicate * iReg = nullptr ) const override;
public:
/// \ru Тип отображения. \en Mapping type.
Type GetType() const { return (Type)vesType; }
private:
bool operator == ( const MbFaceVestige & ); // \ru Не реализован. \en Not implemented.
bool operator != ( const MbFaceVestige & ); // \ru Не реализован. \en Not implemented.
DECLARE_PERSISTENT_CLASS_NEW_DEL( MbFaceVestige )
OBVIOUS_PRIVATE_COPY( MbFaceVestige )
};
IMPL_PERSISTENT_OPS( MbFaceVestige )
//------------------------------------------------------------------------------
/** \brief \ru След аннотационного объекта.
\en The vestige of an annotative object. \~
\details \ru След аннотационного объекта.\n
\en The vestige of an annotative object.\n \~
\ingroup Mapping
*/
// ---
class MATH_CLASS MbAnnotationEdgeVestige : public MbBaseVestige {
friend struct MbVEFVestiges;
public:
/** \brief
\deprecated \ru Поле будет объявлено приватным. Используйте для доступа методы GetCurveInfo() и SetCurveInfo().
\en The field will be declared private. Use methods GetCurveInfo() and SetCurveInfo() to access it.
*/
MbCurveVestige curveInfo; ///< \ru Информация о следе кривой. \en The information about a curve vestige.
protected:
uint8 vesType; ///< \ru Тип отображения. \en A mapping type.
uint8 vesSubType; ///< \ru Подтип (для ветвления именования). \en A subtype for naming branching.
protected:
/** \brief \ru Конструктор.
\en Constructor. \~
\details \ru Конструктор следа аннотационного объекта.\n
\en Constructor of an annotative object vestige.\n \~
\param[in] otherComp - \ru Компонент.
\en A component. \~
\param[in] otherIdent - \ru Идентификатор нити.
\en A thread identifier. \~
\param[in] otherItem - \ru Топологический объект.
\en A topological object. \~
\param[in] otherName - \ru Имя.
\en A name. \~
\param[in] type - \ru Тип аннотационных ребер.
\en A type of annotative edges. \~
\param[in] subType - \ru Подтип аннотационных ребер.
\en A subtype of annotative edges. \~
*/
MbAnnotationEdgeVestige( uint otherComp, size_t otherIdent, const MbTopologyItem * otherItem, const MbName & otherName,
Type type, SubType subType )
: MbBaseVestige( otherComp, otherIdent, otherName, otherItem )
, curveInfo ( )
, vesType ( (uint8)type )
, vesSubType ( (uint8)subType )
{
}
/// \ru Конструктор копирования с регистратором. \en Copy-constructor with the registrator.
MbAnnotationEdgeVestige( const MbAnnotationEdgeVestige & other, MbRegDuplicate * iReg );
public:
MbBaseVestige & Duplicate( MbRegDuplicate * iReg = nullptr ) const override;
public:
/// \ru Тип отображения. \en Mapping type.
Type GetType() const { return (Type)vesType; }
/// \ru Подтип аннотационных ребер. \en A subtype of annotative edges.
SubType GetSubType() const { return (SubType)vesSubType; }
///< \ru Получить информацию о следе кривой. \en Get the information about a curve vestige.
const MbCurveVestige & GetCurveInfo() const { return curveInfo; }
///< \ru Получить информацию о следе кривой. \en Get the information about a curve vestige.
MbCurveVestige & SetCurveInfo() { return curveInfo; }
/// \ru Добавить MbAnnotationEdgeVestige в массив. \en Add the MbAnnotationEdgeVestige to an array. \~
friend MbAnnotationEdgeVestige * AddVestigeAnnotationEdge( uint otherComp, size_t otherIdent, const MbTopologyItem * otherItem,
const MbName & otherName, MbBaseVestige::Type type, MbBaseVestige::SubType subType,
RPArray<MbAnnotationEdgeVestige> & array );
private:
bool operator == ( const MbAnnotationEdgeVestige & ); // \ru Не реализован. \en Not implemented.
bool operator != ( const MbAnnotationEdgeVestige & ); // \ru Не реализован. \en Not implemented.
DECLARE_PERSISTENT_CLASS_NEW_DEL( MbAnnotationEdgeVestige )
OBVIOUS_PRIVATE_COPY( MbAnnotationEdgeVestige )
};
IMPL_PERSISTENT_OPS( MbAnnotationEdgeVestige )
//------------------------------------------------------------------------------
/** \brief \ru Добавить MbAnnotationEdgeVestige в массив.
\en Add the MbAnnotationEdgeVestige to an array. \~
\details \ru Добавить MbAnnotationEdgeVestige в массив через закрытые конструкторы. \n
\en Add the MbAnnotationEdgeVestige to an array by the private constructors. \n \~
\param[in] otherComp - \ru Компонент.
\en A component. \~
\param[in] otherIdent - \ru Идентификатор нити.
\en A thread identifier. \~
\param[in] otherItem - \ru Топологический объект.
\en A topological object. \~
\param[in] otherName - \ru Имя топологического объекта.
\en A name of a topological object. \~
\param[in] type - \ru Тип аннотационных ребер.
\en A subtype of annotative edges. \~
\param[in] subType - \ru Подтип аннотационных ребер.
\en A subtype of annotative edges. \~
\param[out] array - \ru Массив аннотационных ребер.
\en Array of annotative edges. \~
\ingroup Mapping
*/
// ---
inline
MbAnnotationEdgeVestige * AddVestigeAnnotationEdge( uint otherComp, size_t otherIdent, const MbTopologyItem * otherItem,
const MbName & otherName, MbBaseVestige::Type type, MbBaseVestige::SubType subType,
RPArray<MbAnnotationEdgeVestige> & array )
{
MbAnnotationEdgeVestige * vestige = new MbAnnotationEdgeVestige( otherComp, otherIdent, otherItem, otherName, type, subType );
if ( vestige ) {
array.Add( vestige );
}
return vestige;
}
//------------------------------------------------------------------------------
/** \brief \ru След условного обозначения.
\en The vestige of a conventional notation. \~
\details \ru След условного обозначения.\n
\en The vestige of a conventional notation.\n \~
\ingroup Mapping
*/
// ---
class MATH_CLASS MbSymbolVestige : public MbBaseVestige {
friend struct MbVEFVestiges;
protected:
bool bvisible; ///< \ru Флаг видимости. \en A visibility flag.
TPointer<MbMatrix> matrix; ///< \ru Матрица трансформации плоскости сечения из внутреннего представления во внешнее. \en A matrix of transformation of a section plane from internal representation to external one.
protected:
/** \brief \ru Конструктор.
\en Constructor. \~
\details \ru Конструктор следа условного обозначения с определенным признаком видимости.\n
\en Constructor of a conventional notation vestige with a defined visibility attribute.\n \~
\param[in] otherComp - \ru Компонент.
\en A component. \~
\param[in] otherIdent - \ru Идентификатор нити.
\en A thread identifier. \~
\param[in] otherItem - \ru Топологический объект.
\en A topological object. \~
\param[in] otherName - \ru Имя.
\en A name. \~
\param[in] _bvisible - \ru Признак видимости.
\en A visibility attribute. \~
*/
MbSymbolVestige( uint otherComp, size_t otherIdent, const MbTopologyItem * otherItem, const MbName & otherName, bool _bvisible = true )
: MbBaseVestige( otherComp, otherIdent, otherName, otherItem )
, bvisible( _bvisible )
, matrix ( nullptr )
{}
/// \ru Конструктор копирования с регистратором. \en Copy-constructor with the registrator.
MbSymbolVestige( const MbSymbolVestige & other, MbRegDuplicate * iReg );
/// \ru Конструктор. \en Constructor.
MbSymbolVestige()
: MbBaseVestige()
, bvisible( true )
, matrix ( nullptr )
{}
public:
virtual ~MbSymbolVestige() {}
MbBaseVestige & Duplicate( MbRegDuplicate * iReg = nullptr ) const override;
public:
/// \ru Это видимая точка? \en Is point visible?
bool IsVisible() const { return bvisible; }
/// \ru Установить матрицу трансформации. \en Set a transformation matrix.
void SetMatrix( const MbMatrix & initMatrix );
/// \ru Матрица трансформации. \en Transformation matrix.
MbMatrix * GetMatrix() const { return matrix; }
private:
bool operator == ( const MbSymbolVestige & ); // \ru Не реализован. \en Not implemented.
bool operator != ( const MbSymbolVestige & ); // \ru Не реализован. \en Not implemented.
DECLARE_PERSISTENT_CLASS_NEW_DEL( MbSymbolVestige )
OBVIOUS_PRIVATE_COPY( MbSymbolVestige )
};
IMPL_PERSISTENT_OPS( MbSymbolVestige )
//------------------------------------------------------------------------------
//
// ---
inline void MbSymbolVestige::SetMatrix( const MbMatrix & initMatrix )
{
C3D_ASSERT( matrix == nullptr );
if ( matrix == nullptr )
matrix = new MbMatrix( initMatrix );
else
*matrix = initMatrix;
}
//------------------------------------------------------------------------------
/** \brief \ru Набор массивов, выдаваемых наружу при получении всех линий.
\en The set of arrays which are given after getting of all lines. \~
\details \ru Набор массивов, выдаваемых наружу при получении всех линий тел(а)
с селектированием на видимые и невидимые.\n
\en The set of arrays which are given after getting off all solid(s) lines
with the separation to visible and invisible.\n \~
\ingroup Mapping
*/
// ---
struct MATH_CLASS MbVEFVestiges {
protected:
PArray<MbVertexVestige> vertexVestiges; ///< \ru Следы вершин. \en Vestiges of vertices.
PArray<MbEdgeVestige> edgeVestiges; ///< \ru Следы ребер. \en Vestiges of edges.
PArray<MbFaceVestige> faceVestiges; ///< \ru Следы граней. \en Vestiges of faces.
PArray<MbAnnotationEdgeVestige> annotateVestiges; ///< \ru Следы аннотационных объектов. \en Vestiges of annotative objects.
PArray<MbSymbolVestige> symbolVestiges; ///< \ru Следы условного обозначения. \en Vestiges of a conventional notation.
PArray<MbVertexVestige> pointVestiges; ///< \ru Следы пространственных точек. \en Vestiges of spatial points.
PArray<MbEdgeVestige> curveVestiges; ///< \ru Следы пространственных кривых. \en Vestiges of spatial curves.
public:
/// \ru Конструктор. \en Constructor.
MbVEFVestiges();
/// \ru Конструктор копирования с регистратором. \en Copy-constructor with the registrator.
MbVEFVestiges( const MbVEFVestiges & other, MbRegDuplicate * iReg );
/// \ru Деструктор. \en Destructor.
virtual ~MbVEFVestiges() {}
public:
/// \ru Создать копию объекта. \en Create a copy of the object.
virtual MbVEFVestiges & Duplicate( MbRegDuplicate * iReg = nullptr ) const;
/// \ru Очистить массивы следов. \en Clear arrays of vestiges.
void SetEmpty();
/// \ru Очистить массивы следов. \en Clear arrays of vestiges.
void SetEmptyHard();
/// \ru Освободить неиспользуемую память. \en Adjust memory.
void Adjust();
/// \ru Пусты ли массивы следов. \en Check if arrays of vestiges are empty.
bool IsEmpty() const;
/// \ru Изменить флаг владения элементами. \en Change the flag of elements ownership
void DetachOwn();
/// \ru Зарезервировать место под n элементов следов вершин. \en Reserve memory for n elements of vertices vestiges.
void VertexVestigesReserve( size_t count );
/// \ru Зарезервировать место под n элементов следов вершин. \en Reserve memory for n elements of edges vestiges.
void EdgesVestigesReserve( size_t count );
/// \ru Очистить массивы следов вершин. \en Clear arrays of vertices vestiges.
void ClearVertexVestiges();
/// \ru Очистить массивы следов ребер. \en Clear arrays of edges vestiges.
void ClearEdgeVestiges();
/// \ru Очистить массивы следов граней. \en Clear arrays of faces vestiges.
void ClearFaceVestiges();
/// \ru Очистить массивы следов аннотационных объектов. \en Clear arrays of annotative objects vestiges.
void ClearAnnotationVestiges();
/// \ru Очистить массивы следов условных обозначений. \en Clear arrays of conventional notations vestiges.
void ClearSymbolVestiges();
/// \ru Очистить массивы следов пространственных точек. \en Clear arrays of spatial points vestiges.
void ClearPointVestiges();
/// \ru Очистить массивы следов пространственных кривых. \en Clear arrays of spatial curves vestiges.
void ClearCurveVestiges();
public:
/// \ru Количество следов вершин. \en Count of vertices vestiges.
size_t VertexVestigesCount() const { return vertexVestiges.size(); }
/// \ru Количество следов ребер. \en Count of edges vestiges.
size_t EdgeVestigesCount() const { return edgeVestiges.size(); }
/// \ru Количество следов граней. \en Count of faces vestiges.
size_t FaceVestigesCount() const { return faceVestiges.size(); }
/// \ru Количество следов аннотационных объектов. \en Count of annotative objects vestiges.
size_t AnnotateVestigesCount() const { return annotateVestiges.size(); }
/// \ru Количество следов условных обозначений. \en Count of conventional notations vestiges.
size_t SymbolVestigesCount() const { return symbolVestiges.size(); }
/// \ru Количество следов пространственных точек. \en Count of spatial points vestiges.
size_t PointVestigesCount() const { return pointVestiges.size(); }
/// \ru Количество следов пространственных кривых. \en Count of spatial curves vestiges.
size_t CurveVestigesCount() const { return curveVestiges.size(); }
/// \ru Получить указатель на след вершины. \en Get pointer to vertex vestige.
MbVertexVestige * GetVertexVestige( size_t ind ) const { return vertexVestiges[ind]; }
/// \ru Получить указатель на след ребра. \en Get pointer to edge vestige.
MbEdgeVestige * GetEdgeVestige( size_t ind ) const { return edgeVestiges[ind]; }
/// \ru Получить указатель на след грани. \en Get pointer to face vestige.
MbFaceVestige * GetFaceVestige( size_t ind ) const { return faceVestiges[ind]; }
/// \ru Получить указатель на след аннотационного объекта. \en Get pointer to annotative object vestige.
MbAnnotationEdgeVestige * GetAnnotationVestige( size_t ind ) const { return annotateVestiges[ind]; }
/// \ru Получить указатель на след условного обозначения. \en Get pointer to conventional notation vestige.
MbSymbolVestige * GetSymbolVestige( size_t ind ) const { return symbolVestiges[ind]; }
/// \ru Получить указатель на след пространственной точки. \en Get pointer to spatial point vestige.
MbVertexVestige * GetPointVestige( size_t ind ) const { return pointVestiges[ind]; }
/// \ru Получить указатель на след пространственной кривой. \en Get pointer to spatial curve vestige.
MbEdgeVestige * GetCurveVestige( size_t ind ) const { return curveVestiges[ind]; }
/** \brief \ru Добавить MbVertexVestige в массив.
\en Add the MbVertexVestige to an array. \~
\details \ru Добавить MbVertexVestige в массив через закрытые конструкторы. \n
\en Add the MbVertexVestige to an array by the private constructors. \n \~
\param[in] otherComp - \ru Компонент.
\en A component. \~
\param[in] otherIdent - \ru Идентификатор нити.
\en A thread identifier. \~
\param[in] otherItem - \ru Топологический объект.
\en A topological object. \~
\param[in] uv - \ru Точка - след вершины.
\en Point - vertex vestige. \~
\param[in] vis - \ru Состояние видимости.
\en Visibility state. \~
*/
MbVertexVestige * AddVestigeVertex( uint otherComp, size_t otherIdent, const MbTopologyItem & otherItem, const MbCartPoint & uv, bool vis );
/** \brief \ru Добавить MbVertexVestige в массив.
\en Add the MbVertexVestige to an array. \~
\details \ru Добавить MbVertexVestige в массив через закрытые конструкторы. \n
\en Add the MbVertexVestige to an array by the private constructors. \n \~
\param[in] otherComp - \ru Компонент.
\en A component. \~
\param[in] otherIdent - \ru Идентификатор нити.
\en A thread identifier. \~
\param[in] otherName - \ru Имя топологического объекта.
\en A name of a topological object. \~
\param[in] uv - \ru Точка - след пространственной точки.
\en Point - vestige of a spatial point. \~
\param[in] vis - \ru Флаг видимости.
\en A visibility flag. \~
*/
MbVertexVestige * AddVestigePoint( uint otherComp, size_t otherIdent, const MbName & otherName, const MbCartPoint & uv, bool vis, bool isDegeneratedCurve );
/** \brief \ru Добавить MbEdgeVestige в массив.
\en Add the MbEdgeVestige to an array. \~
\details \ru Добавить MbEdgeVestige в массив через закрытые конструкторы. \n
\en Add the MbEdgeVestige to an array by the private constructors. \n \~
\param[in] otherComp - \ru Компонент.
\en A component. \~
\param[in] otherIdent - \ru Идентификатор нити.
\en A thread identifier. \~
\param[in] otherItem - \ru Топологический объект.
\en A topological object. \~
\param[in] isSmooth - \ru Тип ребра (гладкое или нет).
\en A type of edge (smooth or not). \~
\param[in] isSection - \ru Ребро от сечения или разреза.
\en Edge of section. \~
*/
MbEdgeVestige * AddVestigeEdge( uint otherComp, size_t otherIdent, const MbTopologyItem & otherItem, bool isSmooth, bool isSection );
/** \brief \ru Добавить MbEdgeVestige в массив.
\en Add the MbEdgeVestige to an array. \~
\details \ru Добавить MbEdgeVestige в массив через закрытые конструкторы. \n
\en Add the MbEdgeVestige to an array by the private constructors. \n \~
\param[in] otherComp - \ru Компонент.
\en A component. \~
\param[in] otherIdent - \ru Идентификатор нити.
\en A thread identifier. \~
\param[in] otherName - \ru Имя топологического объекта.
\en A name of a topological object. \~
\param[in] isCenterLine - \ru Является ли след осевой линией объекта.
\en Is curve vestige a center line. \~
*/
MbEdgeVestige * AddVestigeCurve( uint otherComp, size_t otherIdent, const MbName & otherName, bool isCenterLine = false );
/** \brief \ru Добавить MbEdgeVestige в массив.
\en Add the MbEdgeVestige to an array. \~
\details \ru Добавить MbEdgeVestige в массив через закрытые конструкторы. \n
\en Add the MbEdgeVestige to an array by the private constructors. \n \~
\param[in] otherComp - \ru Компонент.
\en A component. \~
\param[in] otherIdent - \ru Идентификатор нити.
\en A thread identifier. \~
\param[in] mapCurves - \ru Следы кривой.
\en Spatial curve vestiges. \~
\param[in] visible - \ru Состояние видимости.
\en A visibility state. \~
\param[in] otherName - \ru Имя топологического объекта.
\en A name of a topological object. \~
*/
MbEdgeVestige * AddVestigeCurve( uint otherComp, size_t otherIdent, const RPArray<MbCurve> & mapCurves, bool visible, const MbName & otherName );
/** \brief \ru Добавить MbFaceVestige в массив.
\en Add the MbFaceVestige to an array. \~
\details \ru Добавить MbFaceVestige в массив через закрытые конструкторы. \n
\en Add the MbFaceVestige to an array by the private constructors. \n \~
\param[in] otherComp - \ru Компонент.
\en A component. \~
\param[in] otherIdent - \ru Идентификатор нити.
\en A thread identifier. \~
\param[in] otherItem - \ru Топологический объект.
\en A topological object. \~
*/
MbFaceVestige * AddVestigeFace( uint otherComp, size_t otherIdent, const MbTopologyItem & otherItem );
/** \brief \ru Добавить MbFaceVestige в массив.
\en Add the MbFaceVestige to an array. \~
\details \ru Добавить MbFaceVestige в массив через закрытые конструкторы. \n
\en Add the MbFaceVestige to an array by the private constructors. \n \~
\param[in] otherComp - \ru Компонент.
\en A component. \~
\param[in] otherIdent - \ru Идентификатор нити.
\en A thread identifier. \~
\param[in] otherItem - \ru Полигональный объект.
\en A polygonal object. \~
*/
MbFaceVestige * AddVestigeFace( uint otherComp, size_t otherIdent, const MbGrid & otherItem );
/** \brief \ru Добавить MbAnnotationEdgeVestige в массив.
\en Add the MbAnnotationEdgeVestige to an array. \~
\details \ru Добавить MbAnnotationEdgeVestige в массив через закрытые конструкторы. \n
\en Add the MbAnnotationEdgeVestige to an array by the private constructors. \n \~
\param[in] otherComp - \ru Компонент.
\en A component. \~
\param[in] otherIdent - \ru Идентификатор нити.
\en A thread identifier. \~
\param[in] otherItem - \ru Топологический объект.
\en A topological object. \~
\param[in] otherName - \ru Имя топологического объекта.
\en A name of a topological object. \~
\param[in] type - \ru Подтип аннотационных ребер.
\en A subtype of annotative edges. \~
\param[in] subType - \ru Подтип аннотационных ребер.
\en A subtype of annotative edges. \~
*/
MbAnnotationEdgeVestige * AddVestigeAnnotationEdge( uint otherComp, size_t otherIdent, const MbTopologyItem * otherItem,
const MbName & otherName, MbBaseVestige::Type type, MbBaseVestige::SubType subType );
/** \brief \ru Добавить MbSymbolVestige в массив.
\en Add the MbSymbolVestige to an array. \~
\details \ru Добавить MbSymbolVestige в массив через закрытые конструкторы. \n
\en Add the MbSymbolVestige to an array by the private constructors. \n \~
\param[in] otherComp - \ru Компонент.
\en A component. \~
\param[in] otherIdent - \ru Идентификатор нити.
\en A thread identifier. \~
\param[in] otherItem - \ru Топологический объект.
\en A topological object. \~
\param[in] otherName - \ru Имя.
\en A name. \~
\param[in] _bvisible - \ru Признак видимости.
\en A visibility attribute. \~
*/
MbSymbolVestige * AddVestigeSymbol( uint otherComp, size_t otherIdent, const MbTopologyItem * otherItem, const MbName & otherName, bool _bvisible = true );
/// \ru Трансформировать следы по матрице. \en Transform vestiges according to a matrix.
void Transform( const MbMatrix & matrix );
/// \ru Удалить след вершины. \en Delete vertex vestige.
void RemoveVertexVestige( size_t ind );
/// \ru Удалить след ребра. \en Delete edge vestige.
void RemoveEdgeVestige( size_t ind );
/// \ru Удалить след грани. \en Delete face vestige.
void RemoveFaceVestige( size_t ind );
/// \ru Удалить след аннотационного объекта. \en Delete annotative object vestige.
void RemoveAnnotationVestige( size_t ind );
/// \ru Удалить след условного обозначения. \en Delete conventional notation vestige.
void RemoveSymbolVestige( size_t ind );
/// \ru Удалить след пространственной точки. \en Delete spatial point vestige.
void RemovePointVestige( size_t ind );
/// \ru Удалить след пространственной кривой. \en Delete spatial curve vestige.
void RemoveCurveVestige( size_t ind );
/// \ru Добавить следы из другого набора. \en Add vestiges from other set.
void AddFrom( const MbVEFVestiges & other );
/// \ru Инициализировать следы аннотационных объектов. \en Initialize annotative objects vestiges.
template <class AnnotateVector>
void InitAnnotateVestiges( const AnnotateVector & annotates ) {
annotateVestiges.clear();
annotateVestiges.AddArray( annotates );
}
/// \ru Инициализировать следы пространственных кривых. \en Initialize spatial curves vestiges.
template <class CurveVector>
void InitCurveVestiges( CurveVector & curves ) {
curveVestiges.clear();
curveVestiges.AddArray( curves );
}
/// \ru Выдать следы вершин. \en Get vertices vestiges.
template <class VertexVector>
void GetVertexVestiges( VertexVector & vertices ) const {
vertices.reserve( vertices.size() + vertexVestiges.size() );
std::copy( vertexVestiges.begin(), vertexVestiges.end(), std::back_inserter(vertices) );
}
/// \ru Выдать следы ребер. \en Get edges vestiges.
template <class EdgeVector>
void GetEdgeVestiges( EdgeVector & edges ) const {
edges.reserve( edges.size() + edgeVestiges.size() );
std::copy( edgeVestiges.begin(), edgeVestiges.end(), std::back_inserter(edges) );
}
/// \ru Выдать следы граней. \en Get faces vestiges.
template <class FaceVector>
void GetFaceVestiges( FaceVector & faces ) const {
faces.reserve( faces.size() + faceVestiges.size() );
std::copy( faceVestiges.begin(), faceVestiges.end(), std::back_inserter(faces) );
}
/// \ru Выдать следы аннотационных объектов. \en Get annotative objects vestiges.
template <class AnnotateVector>
void GetAnnotateVestiges( AnnotateVector & annotates ) const {
annotates.reserve( annotates.size() + annotateVestiges.size() );
std::copy( annotateVestiges.begin(), annotateVestiges.end(), std::back_inserter(annotates) );
}
/// \ru Выдать следы условных обозначений. \en Get conventional notations vestiges.
template <class SymbolVector>
void GetSymbolVestiges( SymbolVector & symbols ) const {
symbols.reserve( symbols.size() + symbolVestiges.size() );
std::copy( symbolVestiges.begin(), symbolVestiges.end(), std::back_inserter(symbols) );
}
/// \ru Выдать следы пространственных точек. \en Get spatial points vestiges.
template <class PointVector>
void GetPointVestiges( PointVector & points ) const {
points.reserve( points.size() + pointVestiges.size() );
std::copy( pointVestiges.begin(), pointVestiges.end(), std::back_inserter(points) );
}
/// \ru Выдать следы пространственных кривых. \en Get spatial curves vestiges.
template <class CurveVector>
void GetCurveVestiges( CurveVector & curves ) const {
curves.reserve( curves.size() + curveVestiges.size() );
std::copy( curveVestiges.begin(), curveVestiges.end(), std::back_inserter(curves) );
}
private:
bool operator == ( const MbVEFVestiges & ); // \ru Не реализован. \en Not implemented.
bool operator != ( const MbVEFVestiges & ); // \ru Не реализован. \en Not implemented.
DECLARE_NEW_DELETE_CLASS( MbVEFVestiges )
DECLARE_NEW_DELETE_CLASS_EX( MbVEFVestiges )
KNOWN_OBJECTS_RW_REF_OPERATORS_EX ( MbVEFVestiges, MATH_FUNC_EX ) // \ru Для работы со ссылками и объектами класса \en For working with references and objects of the class
OBVIOUS_PRIVATE_COPY( MbVEFVestiges )
};
//------------------------------------------------------------------------------
//
// ---
inline MbVertexVestige * MbVEFVestiges::AddVestigeVertex( uint otherComp, size_t otherIdent, const MbTopologyItem & otherItem, const MbCartPoint & uv, bool vis )
{
MbVertexVestige * vestige = new MbVertexVestige( otherComp, otherIdent, otherItem, vis );
if ( vestige ) {
vestige->point = uv;
vertexVestiges.Add( vestige );
}
return vestige;
}
//------------------------------------------------------------------------------
//
// ---
inline MbVertexVestige * MbVEFVestiges::AddVestigePoint( uint otherComp, size_t otherIdent, const MbName & otherName, const MbCartPoint & uv, bool vis, bool isDegeneratedCurve )
{
MbVertexVestige * vestige = new MbVertexVestige( otherComp, otherIdent, otherName, vis, isDegeneratedCurve );
if ( vestige ) {
vestige->point = uv;
pointVestiges.Add( vestige );
}
return vestige;
}
//------------------------------------------------------------------------------
//
// ---
inline MbEdgeVestige * MbVEFVestiges::AddVestigeEdge( uint otherComp, size_t otherIdent, const MbTopologyItem & otherItem, bool isSmooth, bool isSection )
{
MbEdgeVestige * vestige = new MbEdgeVestige( otherComp, otherIdent, otherItem, isSmooth, isSection );
if ( vestige ) {
edgeVestiges.Add( vestige );
}
return vestige;
}
//------------------------------------------------------------------------------
//
// ---
inline MbEdgeVestige * MbVEFVestiges::AddVestigeCurve( uint otherComp, size_t otherIdent, const MbName & otherName, bool isCenterLine ) {
return ::AddVestigeCurve( otherComp, otherIdent, otherName, curveVestiges, isCenterLine, false );
}
//------------------------------------------------------------------------------
//
// ---
inline MbEdgeVestige * MbVEFVestiges::AddVestigeCurve( uint otherComp, size_t otherIdent, const RPArray<MbCurve> & mapCurves, bool visible,
const MbName & otherName )
{
MbEdgeVestige * ev = nullptr;
ev = ::AddVestigeCurve( otherComp, otherIdent, otherName, curveVestiges, false, false );
// BUG_93683 ev = ::AddVestigeEdge( otherComp, otherIdent, otherName, MbBaseVestige::vt_Edge, edgeVestiges );
if ( ev != nullptr ) {
MbCurveVestige & vc = ev->curveInfo;
for ( size_t m = 0, mapCurvesCnt = mapCurves.Count(); m < mapCurvesCnt; m++ ) {
MbCurve * mapCurve = mapCurves[m];
if ( mapCurve != nullptr )
vc.AddSegment( *mapCurve, visible );
}
}
return ev;
}
//------------------------------------------------------------------------------
//
// ---
inline MbFaceVestige * MbVEFVestiges::AddVestigeFace( uint otherComp, size_t otherIdent, const MbTopologyItem & otherItem )
{
MbFaceVestige * vestige = new MbFaceVestige( otherComp, otherIdent, otherItem );
if ( vestige )
faceVestiges.Add( vestige );
return vestige;
}
//------------------------------------------------------------------------------
//
// ---
inline MbFaceVestige * MbVEFVestiges::AddVestigeFace( uint otherComp, size_t otherIdent, const MbGrid & otherItem )
{
MbFaceVestige * vestige = new MbFaceVestige( otherComp, otherIdent, otherItem );
if ( vestige )
faceVestiges.Add( vestige );
return vestige;
}
//------------------------------------------------------------------------------
//
// ---
inline
MbAnnotationEdgeVestige * MbVEFVestiges::AddVestigeAnnotationEdge( uint otherComp, size_t otherIdent, const MbTopologyItem * otherItem,
const MbName & otherName, MbBaseVestige::Type type, MbBaseVestige::SubType subType )
{
return ::AddVestigeAnnotationEdge( otherComp, otherIdent, otherItem, otherName, type, subType, annotateVestiges );
}
//------------------------------------------------------------------------------
//
// ---
inline MbSymbolVestige * MbVEFVestiges::AddVestigeSymbol( uint otherComp, size_t otherIdent, const MbTopologyItem * otherItem, const MbName & otherName, bool _bvisible )
{
MbSymbolVestige * vestige = new MbSymbolVestige( otherComp, otherIdent, otherItem, otherName, _bvisible );
if ( vestige )
symbolVestiges.Add( vestige );
return vestige;
}
//------------------------------------------------------------------------------
/** \brief \ru Доступ к элементу массива.
\en The access to an array element. \~
\details \ru Доступ к элементу массива по индексу.\n
\en The access to an array element by an index.\n \~
\param[in] i - \ru Индекс.
\en An index. \~
\param[in] array - \ru Множество следов вершин.
\en An array of vertices vestiges. \~
\return \ru След вершины по индексу
\en A vestige of a vertex by an index. \~
\ingroup Mapping
*/
// ---
inline
MbVertexVestige & GetVertexI( size_t i, const MbVEFVestiges & vestiges ) {
return *vestiges.GetVertexVestige( i );
}
//------------------------------------------------------------------------------
/// \ru Получение полной проекции. \en Merge total projection.
// ---
MbCurve * MergeTotalMap( const std::vector<MbCurve *> &, MbMapSpaceCurveType = mst_Unset );
//------------------------------------------------------------------------------
/// \ru Слияние наложений линий очерка. \en Merge impositions of silhouette lines of the face.
// ---
MATH_FUNC (bool) MergeFaceVestiges( MbVEFVestiges &, const MbMatrix3D * );
#endif // __MAP_VESTIGE_H