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

848 lines
34 KiB
C++

//////////////////////////////////////////////////////////////////////////////////////////
/** \file
\brief \ru Реализация данных узла дерева модели
\en Implementation of data of Model Tree node \~
*/
//////////////////////////////////////////////////////////////////////////////////////////
#ifndef __MODEL_TREE_DATA_H
#define __MODEL_TREE_DATA_H
#include <io_tape_define.h>
#include <templ_multimap.h>
#include <mb_cube.h>
#include <attribute_item.h>
#include <attribute_container.h>
#include <space_item.h>
#include <mb_placement3d.h>
#include <instance_item.h>
//----------------------------------------------------------------------------------------
// \ru Реализация пользовательских данных узла дерева модели.
// \en Implementation of user data of the model tree node.
//----------------------------------------------------------------------------------------
namespace c3d // namespace C3D
{
//----------------------------------------------------------------------------------------
/** \brief \ru Тип пользовательских данных узла дерева модели.
\en A type of user data of the model tree node. \~
\details \ru \ru Тип пользовательских данных узла дерева модели.
\en A type of user data of the model tree node. \~
\ingroup Base_Tools_IO
*/
// ---
enum MbeItemDataType
{
// \ru Простые пользовательские данные. \en Simple user data.
idtBool, // bool
idtInteger, // int
idtDouble, // double
idtString, // c3d::string_t
// \ru Данные атрибутов. \en Attributes data.
// \ru Данные атрибутов, для которых хранится тип и значение атрибута.
// \en Attributes data which keeps attribute type and value.
idtAttrBool, // MbBoolAttribute (bool) at_BoolAttribute
idtAttrInt, // MbIntAttribute (int) at_IntAttribute
idtAttrDouble, // MbDoubleAttribute (double) at_DoubleAttribute
idtAttrString, // MbStringAttribute (c3d::string_t) at_StringAttribute
idtAttrInt64, // MbInt64Attribute (int64) at_Int64Attribute
idtAttrIdentifier, // MbIdentifier (int32) at_Identifier
idtAttrColor, // MbColor (uint32) at_Color
idtAttrWidth, // MbWidth (int) at_Width
idtAttrStyle, // MbStyle (int) at_Style
idtAttrSelected, // MbSelected (bool) at_Selected
idtAttrVisible, // MbVisible (bool) at_Visible
idtAttrChanged, // MbChanged (bool) at_Changed
idtAttrDencity, // MbDencity (double) at_Dencity
idtAttrUpdateStamp, // MbUpdateStamp (uint32) at_UpdateStamp
idtAttrAnchor, // MbAnchorAttribute (uint8) at_AnchorAttribute
// \ru Данные сложных атрибутов, для которых хранится только тип.
// \en Complex attributes data which keeps attribute type only.
idtAttrVisual, // MbVisual at_Visual
idtAttrWireCount, // MbWireCount at_WireCount
idtAttrName, // MbNameAttribute at_NameAttribute
idtAttrGeom, // MbGeomAttribute at_GeomAttribute
idtAttrStampRib, // MbStampRibAttribute at_StampRibAttribute
idtAttrModelInfo, // MbModelInfo at_ModelInfo
idtAttrPersonOrganizationInfo, // MbPersonOrganizationInfo at_PersonOrganizationInfo
// \ru Специальная обработка атрибута - хранится свойство Идентификатор (Обозначение).
// \en Special processing of attribute - keep property Identifier.
idtAttrProductInfo, // MbProductInfo at_ProductInfo
// \ru Данные сложных атрибутов, для которых хранится только тип (продолжение 1).
// \en Complex attributes data which keeps attribute type only (continuation 1).
idtAttrSTEPTextDescription, // MbSTEPTextDescription at_STEPTextDescription
idtAttrSTEPReferenceHolder, // MbSTEPReferenceHolder at_STEPReferenceHolder
idtAttrBinary, // MbBinaryAttribute at_BinaryAttribute
// \ru Специальный атрибут исполнения (хранится тип и пара значений).
// \en Special attribute of embodiment (keeps type and values pair).
idtAttrEmbodiment, // MbEmbodimentAttribute at_Embodiment
// \ru Данные сложных атрибутов, для которых хранится только тип (продолжение 2).
// \en Complex attributes data which keeps attribute type only (continuation 2).
idtAttrStrains, // MbStrains at_Strains
idtAttrElasticity, // MbElasticity at_Elasticity
idtAttrSheetFlanging, // MbSheetFlangingAttribute at_SweptFlangeAttribute
idtAttrThickness, // MbShellThickness at_Thickness
idtAttrInt32Vector, // MbInt32VectorAttribute at_Int32VectorAttribute
idtAttrInt64Vector, // MbInt64VectorAttribute at_Int64VectorAttribute
idtAttrDoubleVector, // MbDoubleVectorAttribute at_DoubleVectorAttribute
// \ru Новый тип должен добавляться непосредственно перед idtCount (после всех определенных ранее типов).
// \en New type should be added just before idtCount (after all types defined before).
idtCount // \ru Число поддерживаемых типов данных. \en Number of supported data types
};
//----------------------------------------------------------------------------------------
/** \brief \ru Базовый класс для пользовательских данных узла дерева.
\en A base class for user data of a tree node. \~
\details \ru Базовый класс для пользовательских данных узла дерева.
\en A base class for user data of a tree node. \~
\ingroup Base_Tools_IO
*/
// ---
class MATH_CLASS ItemDataBase
{
// \ru Приведение объекта 'item' к типу данных 'Type' (тип проверен заранее).
// \en Cast object 'item' to the data type 'Type' (type already verified).
#define CAST(Type, item) dynamic_cast<Type*>(const_cast<ItemDataBase*>(item))
protected:
bool m_filterByType; // \ru Фильтр только по типу (значение данных игнорируется). \en Filter by type only (ignore data value).
public:
ItemDataBase() : m_filterByType(false) {}
virtual ~ItemDataBase() {}
// \ru Тип данных. \en The data type.
virtual MbeItemDataType Type() const = 0;
// \ru Размер записи данных в поток. \en The data size in the stream.
virtual size_t Size( writer& ) const = 0;
// \ru Создать данные заданного типа. \en Create data of the given type.
static ItemDataBase* Create( MbeItemDataType type );
// \ru Создать копию данных. \en Create data copy.
static ItemDataBase* Create( ItemDataBase* item );
// \ru Прочитать данные. \en Read data.
reader& operator << ( reader& in );
// \ru Записать данные. \en Write data.
writer& operator >> ( writer& out ) const;
// \ru Сравнить данные. \en Compare data.
bool operator == ( ItemDataBase* item2 ) const;
/// \ru Сравнить данные. \en Compare data.
bool operator < ( ItemDataBase* item2 ) const;
// \ru Выдать/установить флаг сравнения только по типу (значение игнорируется).
// \en Get/set flag for comparing by type only (value ignored).
bool IgnoreValue() const { return m_filterByType; }
void SetIgnoreValue( bool ignore ) { m_filterByType = ignore; }
};
//----------------------------------------------------------------------------------------
/// \ru Создать объект пользовательских данных для атрибута. Возвращает nullptr, если данный атрибут не поддерживается деревом модели.
/// \en Create user data object for the attribute. Return nullptr if this attribute is not supported in the model tree.
//---
MATH_FUNC( ItemDataBase* ) CreateAttributeData( MbAttribute* attr );
//----------------------------------------------------------------------------------------
/// \ru Прочитать атрибуты для узла дерева.
/// \en Read attributes for the model tree node.
//---
MATH_FUNC( std::unique_ptr<MbAttributeContainer> ) GetTreeNodeAttributes( const IModelTreeNode * node, reader& in );
//----------------------------------------------------------------------------------------
// \ru Функции чтения и записи для пользовательских данных атрибута.
// \en Functions of reading and writing for attribute user data.
//---
#define MTREE_PERSISTENT_DATA_OBJ(Class) \
public: \
static void Read(reader& in, Class* item) { in >> item->m_value; } \
static void Write(writer& out, const Class* item) { out << item->m_value; }
//----------------------------------------------------------------------------------------
// \ru Определение типа для пользовательских данных атрибута.
// \en Type definition for attribute user data.
//---
#define MTREE_DEFINE_DATA_TYPE(type) \
public: \
virtual MbeItemDataType Type() const { return type; }
//----------------------------------------------------------------------------------------
/// \ru Определение размера записи пользовательских данных атрибута в поток, как sizeof.
/// \en Definition of data size of attribute user data in the stream as sizeof.
//---
#define MTREE_DEFINE_DATA_SIZE_STD(data) \
public: \
virtual size_t Size(writer&) const { return sizeof(data); }
//----------------------------------------------------------------------------------------
// \ru Макрос для объявления класса без данных (dataless) для атрибута.
// \en Macro for defining attribute dataless class.
//---
#define MTREE_ATTR_DATALESS_CLASS(Class,ClassType) \
class Class : public ItemDataBase { \
public: \
virtual ~Class() {} \
virtual size_t Size( writer& ) const { return 0; } \
virtual MbeItemDataType Type() const { return ClassType; } \
static void Read( reader&, Class* ) {} \
static void Write( writer&, const Class* ) {} \
};
//----------------------------------------------------------------------------------------
/** \brief \ru Свойство типа bool.
\en Bool property. \~
\details \ru Свойство типа bool.
\en Bool property. \~
\ingroup Base_Tools_IO
*/
// ---
class ItemDataBool : public ItemDataBase
{
public:
bool m_value;
ItemDataBool() : m_value( false ) {}
ItemDataBool( bool value ) : m_value( value ) {}
virtual ~ItemDataBool() {}
MTREE_DEFINE_DATA_SIZE_STD(m_value)
MTREE_DEFINE_DATA_TYPE(idtBool)
MTREE_PERSISTENT_DATA_OBJ(ItemDataBool)
};
//----------------------------------------------------------------------------------------
/** \brief \ru Свойство типа integer.
\en Integer property. \~
\details \ru Свойство типа integer.
\en Integer property. \~
\ingroup Base_Tools_IO
*/
// ---
class ItemDataInteger : public ItemDataBase
{
public:
int m_value;
ItemDataInteger() : m_value( 0 ) {}
ItemDataInteger( int value ) : m_value( value ) {}
virtual ~ItemDataInteger() {}
MTREE_DEFINE_DATA_SIZE_STD(int32)
MTREE_DEFINE_DATA_TYPE(idtInteger)
MTREE_PERSISTENT_DATA_OBJ(ItemDataInteger)
};
//----------------------------------------------------------------------------------------
/** \brief \ru Свойство типа double.
\en Double property. \~
\details \ru Свойство типа double.
\en Double property. \~
\ingroup Base_Tools_IO
*/
// ---
class ItemDataDouble : public ItemDataBase
{
public:
double m_value;
ItemDataDouble() : m_value( 0 ) {}
ItemDataDouble( double value ) : m_value( value ) {}
virtual ~ItemDataDouble() {}
MTREE_DEFINE_DATA_SIZE_STD(m_value)
MTREE_DEFINE_DATA_TYPE(idtDouble)
MTREE_PERSISTENT_DATA_OBJ(ItemDataDouble)
};
//----------------------------------------------------------------------------------------
/** \brief \ru Свойство типа string.
\en String property. \~
\details \ru Свойство типа string.
\en String property. \~
\ingroup Base_Tools_IO
*/
// ---
class ItemDataString : public ItemDataBase
{
public:
c3d::string_t m_value;
ItemDataString() {}
ItemDataString( c3d::string_t value ) : m_value( value ) {}
virtual ~ItemDataString() {}
/// \ru Размер записи данных в поток. \en The data size in the stream.
virtual size_t Size( writer& out ) const { return out.__lenWchar( m_value.c_str() ); }
MTREE_DEFINE_DATA_TYPE(idtString)
MTREE_PERSISTENT_DATA_OBJ(ItemDataString)
};
//----------------------------------------------------------------------------------------
/** \brief \ru Данные атрибута bool.
\en Data of Bool attribute. \~
\details \ru Данные атрибута bool.
\en Data of Bool attribute. \~
\ingroup Base_Tools_IO
*/
// ---
class ItemAttrBool : public ItemDataBool
{
public:
ItemAttrBool() : ItemDataBool() {}
ItemAttrBool( bool value ) : ItemDataBool( value ) {}
MTREE_DEFINE_DATA_TYPE(idtAttrBool)
MTREE_PERSISTENT_DATA_OBJ(ItemAttrBool)
};
//----------------------------------------------------------------------------------------
/** \brief \ru Данные атрибута integer.
\en Data of Integer attribute. \~
\details \ru Данные атрибута integer.
\en Data of Integer attribute. \~
\ingroup Base_Tools_IO
*/
// ---
class ItemAttrInteger : public ItemDataInteger
{
public:
ItemAttrInteger() : ItemDataInteger() {}
ItemAttrInteger( int value ) : ItemDataInteger( value ) {}
MTREE_DEFINE_DATA_TYPE(idtAttrInt)
MTREE_PERSISTENT_DATA_OBJ(ItemAttrInteger)
};
//----------------------------------------------------------------------------------------
/** \brief \ru Данные атрибута double.
\en Data of Double attribute. \~
\details \ru Данные атрибута double.
\en Data of Double attribute. \~
\ingroup Base_Tools_IO
*/
// ---
class ItemAttrDouble : public ItemDataDouble
{
public:
ItemAttrDouble() : ItemDataDouble() {}
ItemAttrDouble( double value ) : ItemDataDouble( value ) {}
MTREE_DEFINE_DATA_TYPE(idtAttrDouble)
MTREE_PERSISTENT_DATA_OBJ(ItemAttrDouble)
};
//----------------------------------------------------------------------------------------
/** \brief \ru Данные атрибута string.
\en Data of String attribute. \~
\details \ru Данные атрибута string.
\en Data of String attribute. \~
\ingroup Base_Tools_IO
*/
// ---
class ItemAttrString : public ItemDataString
{
public:
ItemAttrString() : ItemDataString() {}
ItemAttrString( c3d::string_t value ) : ItemDataString( value ) {}
MTREE_DEFINE_DATA_TYPE(idtAttrString)
MTREE_PERSISTENT_DATA_OBJ(ItemAttrString)
};
//----------------------------------------------------------------------------------------
/** \brief \ru Данные атрибута MbProductInfo.
\en Data of MbProductInfo attribute. \~
\details \ru Данные атрибута MbProductInfo.
\en Data of MbProductInfo attribute. \~
\ingroup Base_Tools_IO
*/
// ---
class ItemAttrProductInfo : public ItemDataString
{
public:
ItemAttrProductInfo() : ItemDataString() {}
ItemAttrProductInfo( c3d::string_t value ) : ItemDataString( value ) {}
MTREE_DEFINE_DATA_TYPE( idtAttrProductInfo )
static void Read( reader &, ItemAttrProductInfo * ) {}
static void Write( writer &, const ItemAttrProductInfo * ) {}
};
//----------------------------------------------------------------------------------------
/** \brief \ru Данные атрибута int64.
\en Data of int64 attribute. \~
\details \ru Данные атрибута int64.
\en Data of int64 attribute. \~
\ingroup Base_Tools_IO
*/
// ---
class ItemAttrInt64 : public ItemDataBase
{
public:
int64 m_value;
ItemAttrInt64() : m_value( 0 ) {}
ItemAttrInt64( int64 value ) : m_value( value ) {}
MTREE_DEFINE_DATA_SIZE_STD(m_value)
MTREE_DEFINE_DATA_TYPE(idtAttrInt64)
MTREE_PERSISTENT_DATA_OBJ(ItemAttrInt64)
};
//----------------------------------------------------------------------------------------
/** \brief \ru Данные атрибута Идентификатор.
\en Data of Identifier attribute. \~
\details \ru Данные атрибута Идентификатор.
\en Data of Identifier attribute. \~
\ingroup Base_Tools_IO
*/
// ---
class ItemAttrIdentifier : public ItemDataBase
{
public:
int32 m_value;
ItemAttrIdentifier() : m_value( 0 ) {}
ItemAttrIdentifier( int32 value ) : m_value( value ) {}
MTREE_DEFINE_DATA_SIZE_STD(m_value)
MTREE_DEFINE_DATA_TYPE(idtAttrIdentifier)
MTREE_PERSISTENT_DATA_OBJ(ItemAttrIdentifier)
};
//----------------------------------------------------------------------------------------
/** \brief \ru Данные атрибута Цвет.
\en Data of Color attribute. \~
\details \ru Данные атрибута Цвет.
\en Data of Color attribute. \~
\ingroup Base_Tools_IO
*/
// ---
class ItemAttrColor : public ItemDataBase
{
public:
uint32 m_value;
ItemAttrColor() : m_value( 0 ) {}
ItemAttrColor( uint32 value ) : m_value( value ) {}
MTREE_DEFINE_DATA_SIZE_STD(m_value)
MTREE_DEFINE_DATA_TYPE(idtAttrColor)
MTREE_PERSISTENT_DATA_OBJ(ItemAttrColor)
};
//----------------------------------------------------------------------------------------
/** \brief \ru Данные атрибута Толщина.
\en Data of Width attribute. \~
\details \ru Данные атрибута Толщина.
\en Data of Width attribute. \~
\ingroup Base_Tools_IO
*/
// ---
class ItemAttrWidth : public ItemDataInteger
{
public:
ItemAttrWidth() : ItemDataInteger() {}
ItemAttrWidth( int value ) : ItemDataInteger( value ) {}
MTREE_DEFINE_DATA_TYPE(idtAttrWidth)
MTREE_PERSISTENT_DATA_OBJ(ItemAttrWidth)
};
//----------------------------------------------------------------------------------------
/** \brief \ru Данные атрибута Стиль.
\en Data of Style attribute. \~
\details \ru Данные атрибута Стиль.
\en Data of Style attribute. \~
\ingroup Base_Tools_IO
*/
// ---
class ItemAttrStyle : public ItemDataInteger
{
public:
ItemAttrStyle() : ItemDataInteger() {}
ItemAttrStyle( int value ) : ItemDataInteger( value ) {}
MTREE_DEFINE_DATA_TYPE(idtAttrStyle)
MTREE_PERSISTENT_DATA_OBJ(ItemAttrStyle)
};
//----------------------------------------------------------------------------------------
/** \brief \ru Данные атрибута Селектированность.
\en Data of Selection attribute. \~
\details \ru Данные атрибута Селектированность.
\en Data of Selection attribute. \~
\ingroup Base_Tools_IO
*/
// ---
class ItemAttrSelected : public ItemDataBool
{
public:
ItemAttrSelected() : ItemDataBool() {}
ItemAttrSelected( bool value ) : ItemDataBool( value ) {}
MTREE_DEFINE_DATA_TYPE(idtAttrSelected)
MTREE_PERSISTENT_DATA_OBJ(ItemAttrSelected)
};
//----------------------------------------------------------------------------------------
/** \brief \ru Данные атрибута Видимость.
\en Data of Visibility attribute. \~
\details \ru Данные атрибута Видимость.
\en Data of Visibility attribute. \~
\ingroup Base_Tools_IO
*/
// ---
class ItemAttrVisible : public ItemDataBool
{
public:
ItemAttrVisible() : ItemDataBool() {}
ItemAttrVisible( bool value ) : ItemDataBool( value ) {}
MTREE_DEFINE_DATA_TYPE(idtAttrVisible)
MTREE_PERSISTENT_DATA_OBJ(ItemAttrVisible)
};
//----------------------------------------------------------------------------------------
/** \brief \ru Данные атрибута Изменённость.
\en Data of Modification attribute. \~
\details \ru Данные атрибута Изменённость.
\en Data of Modification attribute. \~
\ingroup Base_Tools_IO
*/
// ---
class ItemAttrChanged : public ItemDataBool
{
public:
ItemAttrChanged() : ItemDataBool() {}
ItemAttrChanged( bool value ) : ItemDataBool( value ) {}
MTREE_DEFINE_DATA_TYPE(idtAttrChanged)
MTREE_PERSISTENT_DATA_OBJ(ItemAttrChanged)
};
//----------------------------------------------------------------------------------------
/** \brief \ru Данные атрибута Плотность.
\en Data of Dencity attribute. \~
\details \ru Данные атрибута Плотность.
\en Data of Dencity attribute. \~
\ingroup Base_Tools_IO
*/
// ---
class ItemAttrDencity : public ItemDataDouble
{
public:
ItemAttrDencity() : ItemDataDouble( 0 ) {}
ItemAttrDencity( double value ) : ItemDataDouble( value ) {}
MTREE_DEFINE_DATA_TYPE(idtAttrDencity)
MTREE_PERSISTENT_DATA_OBJ(ItemAttrDencity)
};
//----------------------------------------------------------------------------------------
/** \brief \ru Данные атрибута Метка времени обновления.
\en Data of Update timestamp attribute. \~
\details \ru Данные атрибута Метка времени обновления.
\en Data of Update timestamp attribute. \~
\ingroup Base_Tools_IO
*/
// ---
class ItemAttrUpdateStamp : public ItemDataBase
{
public:
uint32 m_value;
ItemAttrUpdateStamp() : m_value( 0 ) {}
ItemAttrUpdateStamp( uint32 value ) : m_value( value ) {}
MTREE_DEFINE_DATA_SIZE_STD(m_value)
MTREE_DEFINE_DATA_TYPE(idtAttrUpdateStamp)
MTREE_PERSISTENT_DATA_OBJ(ItemAttrUpdateStamp)
};
//----------------------------------------------------------------------------------------
/** \brief \ru Данные атрибута Якорь.
\en Data of Anchor attribute. \~
\details \ru Данные атрибута Якорь.
\en Data of Anchor attribute. \~
\ingroup Base_Tools_IO
*/
// ---
class ItemAttrAnchor : public ItemDataBase
{
public:
uint8 m_value;
ItemAttrAnchor() : m_value( 0 ) {}
ItemAttrAnchor( uint8 value ) : m_value( value ) {}
MTREE_DEFINE_DATA_SIZE_STD(m_value)
MTREE_DEFINE_DATA_TYPE(idtAttrAnchor)
MTREE_PERSISTENT_DATA_OBJ(ItemAttrAnchor)
};
//----------------------------------------------------------------------------------------
/** \brief \ru Данные атрибута исполнения.
\en Data of embodiment attribute. \~
\details \ru Данные атрибута исполнения.
\en Data of embodiment attribute. \~
\ingroup Base_Tools_IO
*/
// ---
class ItemAttrEmbodiment : public ItemDataBase
{
public:
typedef std::pair<std::pair<SimpleName, SimpleName>, bool> EmbData;
EmbData m_value;
ItemAttrEmbodiment() : m_value( std::pair<SimpleName, SimpleName>(0, 0),false ) {}
ItemAttrEmbodiment( const EmbData& value ) : m_value( value ) {}
MTREE_DEFINE_DATA_SIZE_STD( m_value )
MTREE_DEFINE_DATA_TYPE( idtAttrEmbodiment )
static void Read( reader& in, ItemAttrEmbodiment* item ) {
item->m_value.first.first = ::ReadSimpleName( in ); // in >> item->m_value.first.first;
item->m_value.first.second = ::ReadSimpleName( in ); // in >> item->m_value.first.second;
if ( in.MathVersion() >= 0x13000010L )
in >> item->m_value.second;
}
static void Write( writer& out, const ItemAttrEmbodiment* item ) {
::WriteSimpleName( out, item->m_value.first.first ); // out << item->m_value.first.first;
::WriteSimpleName( out, item->m_value.first.second ); // out << item->m_value.first.second;
if ( out.MathVersion() >= 0x13000010L )
out << item->m_value.second;
}
};
//----------------------------------------------------------------------------------------
/** \brief \ru Данные атрибута Толщина оболочки.
\en Data of Thickness attribute. \~
\details \ru Данные атрибута Толщина оболочки.
\en Data of Thickness attribute. \~
\ingroup Base_Tools_IO
*/
// ---
class ItemAttrThickness : public ItemDataDouble
{
public:
ItemAttrThickness() : ItemDataDouble( 0 ) {}
ItemAttrThickness( double value ) : ItemDataDouble( value ) {}
MTREE_DEFINE_DATA_TYPE( idtAttrThickness )
MTREE_PERSISTENT_DATA_OBJ( ItemAttrThickness )
};
//----------------------------------------------------------------------------------------
/// \ru Объявление классов без данных для атрибутов.
/// \en Definition of attribute dataless classes.
//---
MTREE_ATTR_DATALESS_CLASS(ItemAttrVisual, idtAttrVisual);
MTREE_ATTR_DATALESS_CLASS(ItemAttrWireCount, idtAttrWireCount);
MTREE_ATTR_DATALESS_CLASS(ItemAttrName, idtAttrName);
MTREE_ATTR_DATALESS_CLASS(ItemAttrGeom, idtAttrGeom);
MTREE_ATTR_DATALESS_CLASS(ItemAttrStampRib, idtAttrStampRib);
MTREE_ATTR_DATALESS_CLASS(ItemAttrModelInfo, idtAttrModelInfo);
MTREE_ATTR_DATALESS_CLASS(ItemAttrPersonOrganizationInfo, idtAttrPersonOrganizationInfo);
MTREE_ATTR_DATALESS_CLASS(ItemAttrSTEPTextDescription, idtAttrSTEPTextDescription);
MTREE_ATTR_DATALESS_CLASS(ItemAttrSTEPReferenceHolder, idtAttrSTEPReferenceHolder);
MTREE_ATTR_DATALESS_CLASS(ItemAttrBinary, idtAttrBinary);
MTREE_ATTR_DATALESS_CLASS(ItemAttrInt32Vector, idtAttrInt32Vector)
MTREE_ATTR_DATALESS_CLASS(ItemAttrInt64Vector, idtAttrInt64Vector)
MTREE_ATTR_DATALESS_CLASS(ItemAttrDoubleVector, idtAttrDoubleVector)
MTREE_ATTR_DATALESS_CLASS(ItemAttrStrains, idtAttrStrains);
MTREE_ATTR_DATALESS_CLASS(ItemAttrElasticity, idtAttrElasticity);
MTREE_ATTR_DATALESS_CLASS(ItemAttrSheetFlanging, idtAttrSheetFlanging);
//----------------------------------------------------------------------------------------
/** \brief \ru Контейнер для пользовательских данных узла дерева.
\en A container for user data of a tree node. \~
\details \ru Контейнер для пользовательских данных узла дерева (владеет данными).
\en A container for user data of a tree node (owns the data). \~
\ingroup Base_Tools_IO
*/
// ---
class MATH_CLASS UserDataMap : public MultiMap<MbeItemDataType,ItemDataBase*>
{
public:
UserDataMap() {}
UserDataMap( const UserDataMap& other );
~UserDataMap(); // \ru Владеет данными. \en Owns the data.
/// \ru Оператор ==. \en Operator ==.
bool operator == ( const UserDataMap& other ) const;
/// \ru Оператор <. \en Operator <.
bool operator < ( const UserDataMap& other ) const;
/// \ru Оператор =. \en Operator =.
UserDataMap& operator = ( const UserDataMap& other );
};
//----------------------------------------------------------------------------------------
/** \brief \ru Данные узла дерева.
\en Tree node data. \~
\details \ru Данные узла дерева. \n
\en Tree node data. \n \~
\ingroup Base_Tools_IO
*/
// ---
struct MATH_CLASS MbItemData
{
// \ru Признак наличия локальной системы координат.
// \en Token of local coordinate system presence.
enum PlacementPresenceToken
{
ppt_No = 0x01,
ppt_Yes = 0x02
};
// \ru Уникальный ID узла в дереве модели. \en Unique id in the model tree.
// \ru Не учитывается при сравнении. \en Not considered during comparison.
mutable size_t id;
// \ru Тип объекта. \en Object type.
// \ru type==st_Undefined означает, что фильтр по типу не определен.
// \en type==st_Undefined means that filter is undefined.
MbeSpaceType type;
// \ru иИмя объекта. \en Object name.
// \ru name==SYS_MAX_UINT32 означает, что фильтр по имени не определен.
// \en name==SYS_MAX_UINT32 means that filter is undefined.
SimpleName name;
// \ru gabarit.IsEmpty()==true означает, что фильтр по габариту не определен.
// \en gabarit.IsEmpty()==true means that filter is undefined.
MbCube gabarit;
// \ru Позиция записи/чтения узла. \en Position for the node writing/reading.
// \ru position.IsValid()==false означает, что это поле не учитывается при сравнении.
// \en position.IsValid()==false means that this field is not considered during comparison.
ClusterReference position;
// \ru Локальная система координат объекта. \en Local coordinate system for the object.
// \ru Не учитывается при сравнении. \en Not considered during comparison.
MbPlacement3D placement;
// \ru Кроме обязательных данных узла, описанных выше, можно задать пользовательские данные,
// которые содержатся в контейнере 'properties'.
// \en In addition to the mandatory node data, described above, it is possible to define user data,
// which is kept in the 'properties' container.
// \ru Контейнер для пользовательских данных узла.
// \en Container for user data of a node.
UserDataMap properties;
// \ru Конструкторы. \en Constructors.
MbItemData() : id( SYS_MAX_T ), type( st_Undefined ), name( SYS_MAX_UINT32 ) {}
MbItemData( MbeSpaceType t, SimpleName n, const MbCube& c, ClusterReference& pos ) : id( SYS_MAX_T ), type( t ), name( n ), gabarit( c ), position( pos ) {}
MbItemData( MbeSpaceType t, SimpleName n, const MbCube& c, ClusterReference& pos, const UserDataMap& prop ) :
id( SYS_MAX_T ), type( t ), name( n ), gabarit( c ), position( pos ), properties( prop ) {}
MbItemData( const MbItemData& data ) : id( data.id ), type( data.type ),
name( data.name ), gabarit( data.gabarit ), position( data.position ),
placement( data.placement ), properties( data.properties ) {}
// \ru Признак пустых (неинициализированных) данных. \en Indicator of empty (uninitialized) data.
bool IsEmpty() const;
// \ru Идентичность полей-фильтров (id не важен).
// \en Equality of filtering fields (id is irrelevant).
bool operator == ( const MbItemData& rt ) const;
// \ru Сравнение полей-фильтров (id не важен).
// \en Comparison of filtering fields (id is irrelevant).
bool operator < ( const MbItemData& rt ) const;
// \ru Специальное сравнение габаритов для сортировки объектов.
// \en Special comparison of bounding boxes for object sorting.
static bool CompareGabarits( const MbCube& a, const MbCube& b );
// \ru Запись и чтение.
// \en Writing and reading.
writer& operator >> ( writer & out );
reader& operator << ( reader & out );
};
//----------------------------------------------------------------------------------------
/// \ru Чтение UserDataMap. \en UserDataMap reading.
// ---
inline reader& operator >> ( reader & in, UserDataMap& itemmap )
{
size_t typeCount = ::ReadCOUNT( in ); // \ru Количество типов данных в наборе. \en A number of types in the map.
if ( in.good() ) {
for ( size_t i = 0; i < typeCount; i++ ) {
int t;
in >> t;
size_t typeSize = ::ReadCOUNT( in );
C3D_ASSERT( t < (int)idtCount ); // SKIP_SA
if ( t < (int)idtCount ) { // SKIP_SA
MbeItemDataType type = (MbeItemDataType)t; // \ru Тип данных. \en A data type.
ItemDataBase* item = ItemDataBase::Create( type );
*item << in;
itemmap.Associate( type, item );
}
else { // skip unknown data
char* buff = new char[typeSize];
in.readBytes( buff, typeSize );
delete[] buff;
}
if ( !in.good() ) {
in.setState( io::fail );
break;
}
}
}
return in;
}
//----------------------------------------------------------------------------------------
/// \ru Запись UserDataMap. \en UserDataMap writing.
// ---
inline writer& operator << ( writer & out, const UserDataMap& itemmap )
{
size_t mapCount = itemmap.Count();
::WriteCOUNT( out, mapCount ); // \ru Количество типов данных в наборе. \en A number of types in the map.
if ( out.good() && mapCount ) {
UserDataMap::Iterator curIter = itemmap.First();
while ( !curIter.Empty() ) {
MbeItemDataType type = curIter.Key();
ItemDataBase* item = curIter.Value();
C3D_ASSERT( type < idtCount && item != nullptr );
if ( type < idtCount && item != nullptr ) {
out << (int)type; // \ru Тип данных. \en A data type.
size_t dataSize = item->Size( out );
::WriteCOUNT( out, dataSize );// \ru Размер данных. \en Data size.
*item >> out;
}
if ( !out.good() ) {
out.setState( io::fail );
break;
}
curIter++;
}
}
return out;
}
} //namespace c3d
#endif // __MODEL_TREE_DATA_H