////////////////////////////////////////////////////////////////////////////////
/** 
  \file
  \brief \ru Настройки импорта и экспорта.
         \en Settings of import and export procedure. \~
  \details  \ru Интерфейс настроек и предопределённая реализация ConvConvertorProperty3D.
            \en Interface of settings and pre-defined implementation ConvConvertorProperty3D. \~
*/
////////////////////////////////////////////////////////////////////////////////

#ifndef __CONV_EXCHANGE_SETTINGS_H
#define __CONV_EXCHANGE_SETTINGS_H

#include <math_define.h>
#include <mb_placement3d.h>
#include <mb_data.h>
#include <conv_predefined.h>
#include <reference_item.h>
#include <tool_cstring.h>
#include <map>

class MbProductInfo;

//------------------------------------------------------------------------------
/** \brief  \ru Константы единиц измерения. 
\en Length units constants.\~   
\ingroup Data_Interface
*/
// ---
/// \ru Миллиметры. \en Millimeters.
#define LENGTH_UNIT_MM 1.0
/// \ru Сантиметры. \en Centimeters.
#define LENGTH_UNIT_CM 10.0
/// \ru Дециметры. \en Decimeters.
#define LENGTH_UNIT_DM 100.0
/// \ru Метры. \en Meters.
#define LENGTH_UNIT_METER 1000.0
/// \ru Дюймы. \en Inches.
#define LENGTH_UNIT_INCH 25.4


//------------------------------------------------------------------------------
/** \brief  \ru Константы единиц массы. 
\en Mass units constants.\~
\ingroup Data_Interface
*/
// ---
/// \ru Граммы. \en Grams.
#define MASS_UNIT_GM 1.0
/// \ru Килограммы. \en Kilograms.
#define MASS_UNIT_KG 1000.0
/// \ru Миллиграммы. \en Milligrams.
#define MASS_UNIT_MG 0.001
/// \ru Микрограммы. \en Micrograms.
#define MASS_UNIT_MKG 1e-6
/// \ru Унции. \en Ounces.
#define MASS_UNIT_OU 28.35
/// \ru Фунты. \en Pounds.
#define MASS_UNIT_PN 453.59


#define EXPORT_DEFAULT  -1  ///< \ru По умолчанию для заданного формата.                                           \en Default for specified format.
#define EXPORT_STEP_203 203 ///< \ru STEP прикладной протокол 203 ( Проектирование с управляемой конфигурацией ).  \en STEP applied protocol STEP 203 (Configuration controlled design).
#define EXPORT_STEP_214 214 ///< \ru STEP прикладной протокол 214 ( Проектирование автомобилей ).                  \en STEP applied protocol STEP 214 (Automotive design).
#define EXPORT_STEP_242 242 ///< \ru STEP прикладной протокол 242. (по умолчанию)                                  \en STEP applied protocol STEP 242. (default) 
#define EXPORT_ACIS_4   4   ///< \ru ACIS версия 4.0.                                                              \en ACIS version 4.0.  
#define EXPORT_ACIS_7   7   ///< \ru ACIS версия 7.0 (по умолчанию).                                               \en ACIS version 7.0 (default).  
#define EXPORT_ACIS_10  10  ///< \ru ACIS версия 10.0.                                                             \en ACIS version 10.0.  


//------------------------------------------------------------------------------
/** \brief  \ru Индексы строк, передаваемых через конвертер.
\en Indices of strings, transmitted through converter.\~   
\ingroup Data_Interface
*/
// ---
enum MbeConverterStrings {
  cvs_BEGIN = 0,        ///< \ru Для удобства перебора.           \en For lookup only.
  cvs_STEPAuthor,       ///< \ru Автор для конвертера STEP.       \en Author of the document, in STEP.
  cvs_STEPOrganization, ///< \ru Организация для конвертера STEP. \en The organization, the author is related with, in STEP.
  cvs_STEPComment,      ///< \ru Комментарий файла формата STEP.  \en Annotation, in STEP.
  cvs_CAD_NAME,         ///< \ru Название САПР при экспорте.      \en CAD Name for export.
  cvs_STEPPreprocessorVersion, ///< \ru Поле Preprocerssor version из формата STEP. \en Preprocerssor version, in STEP.
  cvs_STEPAuthorization, ///< \ru Поле Authorization из формата STEP. \en Authorization, in STEP.
  cvs_END               ///< \ru Для удобства перебора.           \en For lookup only.
};


//------------------------------------------------------------------------------
/** \brief  \ru Индексы, управляющие разрешением на чтение или запись объектов.
\en Indeces, which filter imported/exported objects or properties.\~   
\ingroup Data_Interface
*/
// ---
enum MbeIOPermiss {
  iop_rSolid = 0,       ///< \ru Разрешение на чтение твёрдых тел.  \en Import solid solids.
  iop_wSolid,           ///< \ru Разрешение на запись твёрдых тел.  \en Export solid solids.
  iop_rSurface,         ///< \ru Разрешение на чтение поверхностей. \en Import surfaces.
  iop_wSurface,         ///< \ru Разрешение на запись поверхностей. \en Export surfaces.
  iop_rCurve,           ///< \ru Разрешение на чтение кривых.       \en Import curves.
  iop_wCurve,           ///< \ru Разрешение на запись кривых.       \en Export curves.
  iop_rDrafts,          ///< \ru Разрешение на чтение эскизов (не применяется).       \en Import drafts (ignored).
  iop_wDrafts,          ///< \ru Разрешение на запись эскизов.       \en Export drafts.
  iop_rInvisible,       ///< \ru Разрешение на чтение невидимых объектов (не применяется).  \en Import invisible objects (not applied).
  iop_wInvisible,       ///< \ru Разрешение на запись невидимых объектов.  \en Export invisible objects.
  iop_rPoint,           ///< \ru Разрешение на чтение точек.        \en Import points.
  iop_wPoint,           ///< \ru Разрешение на запись точек.        \en Export points.
  iop_rDocInfo,         ///< \ru Разрешение на чтение информации о документе (автор, организация, комментарии).  \en Import components info ( author, organization, description ).
  iop_wDocInfo,         ///< \ru Разрешение на запись информации о документе (автор, организация, комментарии).  \en Export components info ( author, organization, description ).
  iop_rTextDescription, ///< \ru Разрешение на чтение технических требований.  \en Import technical requirements.
  iop_wTextDescription, ///< \ru Разрешение на запись технических требований.  \en Export technical requirements.
  iop_rDimensions,      ///< \ru Разрешение на чтение размеров.     \en Import dimensions.
  iop_wDimensions,      ///< \ru Разрешение на запись размеров.     \en Export dimensions.
  iop_rAttributes,      ///< \ru Разрешение на чтение атрибутов.     \en Import attributes.
  iop_wAttributes,      ///< \ru Разрешение на запись атрибутов.     \en Export attributes.
  iop_rBRep,            ///< \ru Разрешение на чтение форм изделий в граничном представлении (только в JT).  \en Import shapes in boundary representation (JT only).
  iop_wBRep,            ///< \ru Разрешение на запись форм изделий в граничном представлении (только в JT).  \en Export shapes in boundary representation (JT only).
  iop_rPolygonal,       ///< \ru Разрешение на чтение полигональных форм изделий.  \en Import polygonal shapes.
  iop_wPolygonal,       ///< \ru Разрешение на запись полигональных форм изделий.  \en Export polygonal shapes.
  iop_rLOD0,            ///< \ru Разрешение на чтение полигональных форм изделий уровня детализации 0.  \en Import polygonal shapes of the 0-th LOD.
  iop_wLOD0,            ///< \ru Разрешение на запись полигональных форм изделий уровня детализации 0.  \en Export polygonal shapes of the 0-th LOD.
  iop_rAssociated,      ///< \ru Разрешение на чтение ассоциированной геометрии (резьбы и др).  \en Import associated geometry (threads etc).
  iop_wAssociated,      ///< \ru Разрешение на запись ассоциированной геометрии (резьбы и др).  \en Export associated geometry (threads etc).
  iop_rDensity,         ///< \ru Разрешение на чтение единиц плотности.  \en Import density units.
  iop_wDensity,         ///< \ru Разрешение на запись единиц плотности.  \en Export density units.
  iop_rValidationProperties, ///< \ru Разрешение на чтение контрольных параметров - объёма, площади поверхности, центра масс.  \en Import validation properties - volume, surface area, centroid.
  iop_wValidationProperties, ///< \ru Разрешение на запись контрольных параметров - объёма, площади поверхности, центра масс.  \en Export validation properties - volume, surface area, centroid.
  iop_rStyle,           ///< \ru Разрешение на чтение элементов оформления (цвет, начертание, и т.п.).  \en Import appearance.
  iop_wStyle,            ///< \ru Разрешение на запись элементов оформления (цвет, начертание, и т.п.).  \en Export appearance.
  iop_END
};


//------------------------------------------------------------------------------
/** \brief  \ru Тип сообщения об ошибке при выводе в лог.
\en Type of a log message.\~   
\ingroup Data_Exchange
*/
// ---
enum eMsgType { 
  emt_ErrorNoId,///< \ru Ошибка формата. Значение id игнорируется, выводится только текст.  \en Error not related with a certain record. The id field is ignored.
  emt_TextOnly, ///< \ru Значение id игнорируется, выводится только текст.                  \en Used to type message only. The id field is ignored.
  emt_Info,     ///< \ru Рабочая информация.                                                \en Info.
  emt_Warning,  ///< \ru Предупреждение.                                                    \en Warning.
  emt_Error     ///< \ru Ошибка формата или неустранимая ошибка преобразования.             \en Format mismatch or fatal converting error.
};


//------------------------------------------------------------------------------
/** \brief  \ru Код подробного сообщения об ошибке при выводе в лог.
\en The key of a detailed log message.\~   
\ingroup Data_Interface
*/
// ---
enum eMsgDetail { 
  emd_Title,                          ///< \ru Заголовок файла.                 \en File header.
  emd_HEADError,                      ///< \ru Тип сообщения - ошибка.          \en Error.
  emd_HEADWarinig,                    ///< \ru Тип сообщения - Предупреждение.  \en Warning.
  emd_HEADInfo,                       ///< \ru Тип сообщения - Информация.      \en Info.
  emd_HEADDefaultMsg,                 ///< \ru Тип сообщения - Сообщение.       \en Message.

  emd_STOPFileOpenError,              ///< \ru Ошибка открытия файла.                           \en Cannot open file.
  emd_STOPFileOpenErrorOrEmpty,       ///< \ru Ошибка открытия файла или файл пуст.             \en Cannot open file or file is empty.
  emd_STOPHeaderReadError,            ///< \ru Не удалось прочитать заголовок файла.            \en Cannot read file header.
  emd_STOPNoOrBadData,                ///< \ru Файл не содержит данных или их не удалось распознать. \en File body does not exist or incorrect.
  emd_STOPIncorrectStructure,         ///< \ru Неверная структура файла.                        \en Incorrect file structure.
  emd_STOPAddressConflict,            ///< \ru Данный адрес имеют два различных объекта.        \en Two or more entities have the same id.

  emd_ErrorNoRootObject,              ///< \ru Не найден корневой объект.                       \en Root object not found.
  emd_ErrorSyntaxIncorrectFormFloat,  ///< \ru Невозможно прочитать действительную константу.   \en Error reading floating-point number.
  emd_ErrorEmptyLoop,                 ///< \ru Цикл грани пуст.                                 \en Face has an empty loop.
  emd_ErrorEmptyQueriesList,          ///< \ru Список запросов пуст. \en 
  emd_ErrorEmptyObjectsList,          ///< \ru Список объектов пуст.                            \en List of objects is empty.
  emd_ErrorEmptyGeomObjectsList,      ///< \ru Список геометрических объектов пуст.             \en List of geometric objects is empty.
  emd_ErrorEmptyShellsList,           ///< \ru Список оболочек пуст.                            \en List of shells is empty.
  emd_ErrorEmptyListOfWrieframes,     ///< \ru Список каркасов пуст.                            \en List of frames is empty.
  emd_ErrorEmptyCurveCompositesList,  ///< \ru Список компонент составной кривой пуст.          \en Composite curve has an empty list of composites.
  emd_ErrorEmptyBoundCurvesList,      ///< \ru Список граничных кривых пуст.                    \en List of boundary curves is empty.
  emd_ErrorEmptyEdgeList,             ///< \ru Список рёбер пуст.                               \en List of edges is empty.
  emd_ErrorEmptyFacesList,            ///< \ru Список граней пуст.                              \en List of faces is empty.
  emd_ErrorEmptyReferencesList,       ///< \ru Список ссылок пуст.                              \en List of references is empty.
  emd_ErrorEmptyOrMore2ReferencesList,///< \ru Список ссылок пуст или содержит более 2 элементов. \en List of references is empty or contains more than 2 items.
  emd_ErrorUndefinedFaceSurfaceRef,   ///< \ru Ссылка на базовую поверхность грани не определена. \en Invalid reference to base surface.
  emd_ErrorUndefinedBaseCurveRef,     ///< \ru Ссылка на базовую кривую не определена.          \en Invalid reference to base curve.
  emd_ErrorRadiusTooCloseToZero,      ///< \ru Радиус слишком мал.                              \en Too small radius.
  emd_ErrorRadiusValueNegative,       ///< \ru Отрицательное значение радиуса.                  \en Negative value of radius.
  emd_ErrorEllipseAxisTooCloseToZero, ///< \ru Длина полуоси эллипса слишком мала.              \en Ellipse axis is too short.
  emd_ErrorEllipseAxisNegative,       ///< \ru Отрицательная длина полуоси эллипса.             \en Ellipse axis length is negative.
  emd_ErrorNegativeDegree,            ///< \ru Отрицательный порядок сплайна.                   \en Negative spline order.
  emd_ErrorNegativeUDegree,           ///< \ru Отрицательный порядок сплайновой поверхности по U. \en Spline surface order along U is negative.
  emd_ErrorNegativeVDegree,           ///< \ru Отрицательный порядок сплайновой поверхности по V. \en Spline surface order along V is negative.
  emd_ErrorDegreeFixImpossible,       ///< \ru Невозможно исправить порядок сплайна.            \en Cannot fix spline order.
  emd_ErrorPolylinePointListLess2,    ///< \ru Список точек ломаной содержит менее 2 элементов. \en Polyline contains less then 2 points.
  emd_ErrorPointListLess2,            ///< \ru Список точек содержит менее 2 элементов.         \en List of points contains less then 2 points.
  emd_ErrorKnotsListLess2,            ///< \ru Список узлов содержит менее 2 элементов.         \en List of knots contains less then 2 values.
  emd_ErrorWeightsListLess2,          ///< \ru Список весов содержит менее 2 элементов.         \en List of weights contains less then 2 values.
  emd_ErrorUPointListLess2,           ///< \ru Список точек по U содержит менее 2 элементов.    \en List of points along U contains less then 2 points.
  emd_ErrorUKnotsListLess2,           ///< \ru Список узлов по U содержит менее 2 элементов.    \en List of knots along U contains less then 2 values.
  emd_ErrorUWeightsListLess2,         ///< \ru Список весов по U содержит менее 2 элементов.    \en List of weights along U contains less then 2 values.
  emd_ErrorVPointListLess2,           ///< \ru Список точек по V содержит менее 2 элементов.    \en List of points along V contains less then 2 points.
  emd_ErrorVKnotsListLess2,           ///< \ru Список узлов по V содержит менее 2 элементов.    \en List of knots along V contains less then 2 values.
  emd_ErrorVWeightsListLess2,         ///< \ru Список весов по V содержит менее 2 элементов.    \en List of weights along V contains less then 2 values.
  emd_ErrorListsSizeMismatch,         ///< \ru Размеры списков не согласуются.                  \en Lists size mismatch.
  emd_ErrorKnotsWeightsListsOrderMismatch,                ///< \ru Размеры списков узлов и весов не согласуются с порядком сплайна. \en Sizes of knots and weights lists do not agree with the spline order.
  emd_ErrorKnotsWeightsListsSizeMismatch,                 ///< \ru Размеры списков узлов и весов не согласуются. \en Size of knots list does not agree with the size of the list of weights.
  emd_ErrorUKnotsWeightsListsSizeMismatch,                ///< \ru Размеры списков узлов и весов по U не согласуются. \en Sizes of knots and weights lists along U do not agree.
  emd_ErrorVKnotsWeightsListsSizeMismatch,                ///< \ru Размеры списков узлов и весов по V не согласуются. \en Sizes of knots and weights lists along V do not agree.
  emd_ErrorSplineCurveNotCreatedUndefinedKnotsVector,     ///< \ru Сплайновая кривая не создана - не определёны узлы. \en Cannot create spline, because knots are not defined.
  emd_ErrorSplineSurfaceNotCreatedUndefinedKnotsVectors,  ///< \ru Сплайновая поверхность не создана - не определёны узлы. \en Cannot create spline surface, because knots are not defined.
  emd_ErrorInCorrectSplineSurfaceData,                    ///< \ru Неверно заданы параметры NURBS поверхности. \en Spline surface parameters are not valid.

  emd_WarningNoSectionTerminator,             ///< \ru Маркер завершения раздела не обнаружен.  \en Section terminator not found.
  emd_WarningSyntaxMultipleDotInFloat,        ///< \ru Повторяющаяся точка в действительном числе. \en Too many dots in a floating-point number.
  emd_WarningSyntaxMultipleEInFloat,          ///< \ru Повторяющаяся E в действительном числе.  \en Too many E signs in a floating-point number.
  emd_WarningLoopNotClosed,                   ///< \ru Цикл не замкнут.                         \en Loop is not closed.
  emd_WarningContourNotClosed,                ///< \ru Контур не замкнут.                       \en contour is not closed.
  emd_WarningUndefinedRef,                    ///< \ru Ссылка не определена.                    \en Invalid reference.
  emd_WarningToroidalSurfaceDegenerated,      ///< \ru Тороидальная поверхность вырождена.      \en Toroidal surface is degenerate.
  emd_WarningUndefinedBasisCurve,             ///< \ru Не определена базовая кривая.            \en Base curve not defined.
  emd_WarningUndefinedSweptCurve,             ///< \ru Не определена образующая кривая.         \en Generatrix curve is not defined.
  emd_WarningUndefinedExtrusionDirection,     ///< \ru Не определено направление выдавливания.  \en Extrusion direction is not defined.
  emd_WarningUndefinedAxis,                   ///< \ru Не определена ось.                       \en Axis is not defined.
  emd_WarningUndefinedAxisOfRevolution,       ///< \ru Не определена ось вращения.              \en Rotation axis is not defined.
  emd_WarningUndefinedBasisSurface,           ///< \ru Не определена базовая поверхность.       \en Base surface is not defined.
  emd_WarningUndefinedRepresentation,         ///< \ru Не определено представление.             \en Representation is not defined.
  emd_WarningUndefinedTransformationOperator, ///< \ru Не определён оператор преобразования.    \en Transformation is not defined.
  emd_WarningUndefinedObjectTransformBy,      ///< \ru Не определён объект, по которому ведётся преобразование. \en Basic object of transformation is not defined.
  emd_WarningUndefinedObjectToTransform,      ///< \ru Не определён преобразуемый объект.       \en No object to transform is defined.
  emd_WarningUndefinedCurve,                  ///< \ru Не определена кривая.                    \en Curve is not defined.
  emd_WarningUndefinedCompositeSegment,       ///< \ru Не определён сегмент составной кривой.   \en Composite curve segment is not defined.
  emd_WarningUndefinedDirection,              ///< \ru Не определено направление.               \en Direction is not defined.
  emd_WarningUndefinedAxisDirection,          ///< \ru Не определено направление оси.           \en Axis direction is not defined.
  emd_WarningDegeneratedItemWasSkipped,       ///< \ru Проигнорирован (пропущен) вырожденный объект. \en Degenerate object was missed.
  emd_WarningFloatParceFailureDefaultUsed,    ///< \ru Ошибка разпознавания числа с плавающей точкой, подставлено значение по умолчанию. \en Floating point value couldn't be parced; default value was used.
  emd_WarningSameShapeEdgeTwiceInLoop,        ///< \ru В цикле дважды встречается одинаковое ребро. \en Edge based on same curves twice enters a loop.
  emd_WarningIncorrectFaceWasNotAddedToShell, ///< \ru Некорректная грань не была добавлена в оболочку. \en Incorrect face was not added to shell.
  emd_WarningBoundsNotConnectedWithSeams,     ///< \ru Границы замкнутой грани не стыкуются со швами. \en Bounds of periodic face not connected with seams.
  emd_WarningIntCurveWasReplacedBySegment,    ///< \ru Кривая пересечения была заменена отрезком. \en Intersection curve was replaced by segment.
  emd_WarningOpenSolidsNotSupported,          ///< \ru Формат не поддерживает запись незамкнутых тел. \en Format does not support export of open solids.
  emd_WarningOpenMeshesNotSupported,          ///< \ru Формат не поддерживает запись незамкнутых полигональных объектов. \en Format does not support export of open meshes.
  emd_WarningClosedSolidBecameOpenMesh,       ///< \ru В результате триангуляции замкнутого тела сформировался незамкнутый полигональный объект. \en Triangulation of closed solid created an open mesh.
  emd_WarningEmptyMeshSkipped,                ///< \ru Пропущен полигональный объект, не содержащий триангуляций. \en Mesh without grids is skipped.
  emd_WarningTriangulationFailed,             ///< \ru Не удалось выполнить триангуляцию. Объект пропущен. \en Triangulation failed. Object is skipped.

  emd_MessageWeightsFilled,                        ///< \ru Веса заданы. \en Weights are set.

  emd_ErrorEdgeCurveFlagTSingleRedefinition,   ///< \ru При создании ребра в конвертере дважды указана грань с флагом .T.. \en Double .T. face inclusion.
  emd_ErrorEdgeCurveFlagFSingleRedefinition,   ///< \ru При создании ребра в конвертере дважды указана грань с флагом .F.. \en Double .F. face inclusion.
  emd_ErrorSTEPEdgeCurveFlagTMultipleRedefinition, ///< \ru При создании ребра в конвертере STEP более чем дважды указана грань с флагом .T.. \en Multiple .T. face inclusion in STEP.
  emd_ErrorSTEPEdgeCurveFlagFMultipleRedefinition, ///< \ru При создании ребра в конвертере STEP более чем дважды указана грань с флагом .F.. \en Multiple .F. face inclusion in STEP.
  emd_ErrorSTEPUndefinedFaceGeometry,   ///< \ru Не определена геометрия грани в конвертере STEP. \en Face geometry is not defined in STEP.
  emd_ErrorSTEPSyntaxMultipleDotInEnum, ///< \ru Синтаксическая ошибка в файле формата STEP - в перечислении символ "." встречается более 1 раза подряд. \en Too many dots in a enumeration record in STEP.
  emd_WarningSTEPPointCorrection,       ///< \ru Скорректированы координаты точки. \en Point location corrected. ( by BUG_73871 )
  emd_WarningSTEPEdgeCurveByVertices,   ///< \ru Кривая ребра скорректирована с учётом координат вершин. \en Edge curve corrected in accordance with vertices. ( by BUG_73871 )
  emd_MessageSTEPFlagChangedToF,        ///< \ru Произведена замена флага на .F.. \en Flag was set as .F. in STEP.
  emd_MessageSTEPFlagChangedToT,        ///< \ru Произведена замена флага на .T.. \en Flag was set as .T. in STEP.
  emd_WarningBooleanUndefined,          ///< \ru Булево значение не определено. \en Boolean value not defined.

  emd_WarningACISUnsupportedInterpoleCurveType,  ///< \ru Данный подтип ACIS интерполяционной кривой не поддерживается. \en Interpolation curve type is not supported by SAT converter.
  emd_WarningACISUnsupportedParametricCurveType, ///< \ru Данный подтип ACIS параметрической кривой не поддерживается. \en Parametric curve type is not supported by SAT converter.
  emd_WarningACISUnsupportedSplineSurfaceType,   ///< \ru Данный подтип ACIS сплайновой поверхности не поддерживается. \en Spline surface type is not supported by SAT converter.
  emd_ErrorACISUnsupportedVersion,               ///< \ru Данная версия ACIS NT не поддерживается. \en Th version of file is not supported by SAT converter.
  emd_WarningACISCannotImportEntityId,           ///< \ru Не удалось импортировать объект с данным Id. \en Cannot import this object by SAT converter.
  emd_WarningACISIncorrectIntAttribute,          ///< \ru Некорректный целочисленный атрибут. \en Incorrect integer attribute.
  emd_WarningVRMLGridDuplicatesInMeshes,         ///< \ru Присутствуют дубликаты объектов в сетках. \en There are grid duplicates in meshes.
  emd_WarningACISLawIntCurveIsNotCreated,        ///< \ru Кривая по закону не создана. \en Law intersection curve is not created.

  emd_ErrorIGESIncorrectExternalReference,       ///< \ru Неверное имя внешней ссылки. \en Invalid external reference in IGES.

  emd_ErrorSTLTooManyTrianglesForBinary,         ///< \ru Триангуляция исходной модели содержит больше треугольников, чем допустимо стандартом ( не выражается 32-битным беззнаковым числом ) ( by BUG_71422 ). \en Too many triangles (not represented by unsigned 32-bit number) for export to binary STL.

  emd_ErrorXTUnsupportedVersion,                 ///< \ru Данная версия X_T не поддерживается. \en Th version of file is not supported by X_T converter.

  emd_ErrorJTUnsupportedVersion,                 ///< \ru Данная версия JT не поддерживается. \en Th version of file is not supported by JT converter.

  emd_ErrorStringEncoding,                       ///< \ru Ошибка кодировки строки. \en String encoding error.

  emd_WarningCurveParametrizationCorrected,      ///< \ru Исправлена параметризация кривой. \en Curve parameterization was corrected.

  emd_ErrorJTDuplicatedTriangles,                ///< \ru Сетка содержит дублирующиеся треугольники и не может быть записана. \en Mesh contains duplicate triangles and cannot be written.
  
  emd_WarningCreateEdgeBadInput,                 ///< \ru Некорректные исходные данные для кривой пересечения. \en Incorrect input data for intersection curve.

  emd_PluginGeneralProblem,                      ///< \ru Сбой общего характера в плагине. \en General plugin fault.
  emd_PluginLicenceProblem,                      ///< \ru Ошибка активации плагина. \en Plugin couldn't be activated.
  emd_PluginFunctionalityLimitation              ///< \ru Плагин не обладает требуемой функциональностью. \en Plugin' funtionality doesn't cover the required case.
 };


 //------------------------------------------------------------------------------
/** \brief  \ru Режим логирования.
\en Logging mode.\~   
\ingroup Exchange_Interface
*/
// ---
 enum eLoggingMode {
   elm_LoggingOff,     ///< \ru Логирование отключено.                            \en Logging disabled.
   elm_LoggingAll,     ///< \ru Логирование включено для всех объектов.           \en Logging enabled for all objects.
   elm_LoggingForId    ///< \ru Логирование включено для объекта с заданным id.   \en Logging enabled for an object with the specified id.
 };


//------------------------------------------------------------------------------
/** \brief \ru Настройки отладочного функционала C3D Converter.
           \en Settings of the debug features of the C3D Converter. \~
    \details \ru Предназначен для для получения информации, облегчающей диагностику и отладку конвертера.
             \en Intended for getting information to make diagnostics and debugging of converter easier. \~
\ingroup Exchange_Interface
*/
struct C3DConverterDebugSettings {
  /// \ru Включить вывод отладочной информации в CERR. \en Enable debug info out into the CERR stream.
  bool enableCERRout;
  /// \ru Включить вывод обхода дерева модели, реализованной на стороне пользователя. \en Enable logging the traverse of the user-implemented model tree.
  bool cerrOutUserTreeTraverse;
  /// \ru Включить вывод обхода промежуточного дерева модели. \en Enable logging the traverse of the intermediate model tree.
  bool cerrOutIntermediateTreeTraverse;
  
  /** \brief \ru Сохранить двойник модели.
             \en Save the twin of the model. \~
      \details \ru При актавации этого флага при экспорте формируется дополнительно файл, предназначенный для приложения-двойника
      с точки зрения значений возвращаемых реализацией модельного документа.
                \en If this option active, an additional model for the twin application is written. It returns the same values as
                the original implementation of the model document.\~
  
  */
  bool saveModelTwin;

  /// \ru Включить вывод статистики импортируемых объектов. \en Enable logging the statistic of imported objects.
  bool cerrOutImportStatistic;

  /// \ru Добавлять целочисленный атрибут со значением id элемента из обменного файла. \en Attach int attribute which's value based on id from exchange file.
  bool attachThisIdAttribute;

  /// \ru Идентификатор элемента, для которого сделать вывод информации для тонкой отладки. \en Id of element for each save data for fine debugging.
  ptrdiff_t elementIdFineDebug;

  /// \ru Путь для сохранения информации для тонкой отладки. \en Fine for saving data for fine debugging.
  c3d::string_t pathFineDebug;

  /// \ru Режим логирования. \en Logging mode.
  eLoggingMode loggingMode;

  /// \ru Идентификатор для логирования. \en Id for logging.
  ptrdiff_t idForLogging;

  /// \ru Конструктор. \en Conctuctor.
  C3DConverterDebugSettings()
    : enableCERRout( false )
    , cerrOutUserTreeTraverse( false )
    , cerrOutIntermediateTreeTraverse( false )
    , cerrOutImportStatistic( false )
    , saveModelTwin( false )
    , attachThisIdAttribute( false )
    , elementIdFineDebug( -1 )
    , pathFineDebug()
    , loggingMode( elm_LoggingOff )
    , idForLogging( -1 )
  {
  }
  ~C3DConverterDebugSettings() {}
};


//------------------------------------------------------------------------------
/** \brief \ru Интерфейс генератора однострочного идентификатора компонента.
           \en Interface of component's identifier generator. \~
    \details \ru Предназначен для для экспорта в форматы, в которых для идентификации компонента предусмотрено одно строковое значение.
             \en Demanded for export to formats having one string field for product inetifier. \~
\ingroup Exchange_Interface
*/
struct IProductIdMaker : public MbRefItem
{
  virtual c3d::string_t operator()( const MbProductInfo& ) const = 0;
};

//------------------------------------------------------------------------------
/** \brief \ru Интерфейс для  преобразования строк.
           \en An interface for string encoding. \~
  \ingroup Base_Tools_String
*/
class CONV_CLASS IC3DCharEncodingTransformer : public MbRefItem
{
public:
  virtual ~IC3DCharEncodingTransformer() {}

  //------------------------------------------------------------------------------
  /** \brief \ru Преобразование строки из wchar_t* в char*.
             \en Transform string from wchar_t* to char*. \~
    \ingroup Base_Tools_String
  */
  virtual bool C3DToStd( const c3d::string_t& from, std::string& to ) = 0;

  //------------------------------------------------------------------------------
  /** \brief \ru Преобразование строки из char* в wchar_t*.
             \en Transform string from char* в wchar_t*. \~
    \ingroup  Base_Tools_String
  */
  virtual bool StdToC3D( const std::string& from, c3d::string_t& to ) = 0;
};

//------------------------------------------------------------------------------
/** \brief \ru Интерфейс свойств конвертера.
           \en Interface of converter's properties. \~
    \details \ru Интерфейс свойств конвертера реализует выдачу имени документа и других сведений о нём, таких как автор,
    и управление режимами работы - сшивкой поверхностей с возможностью создания твёрдых тел, фильтрацией объектов, 
    формирование журнала трансляции.
             \en Interface of converter's properties realizes getting the document's name and other information about it, 
             such as the author, and management of modes of operations - stitching of surfaces with possibility of solids 
             creation, objects filtration, generation of translation journal. \~
\ingroup Exchange_Interface
*/
class CONV_CLASS IConvertorProperty3D {
public :
  virtual ~IConvertorProperty3D() {}

public:
  /// \ru Получить имя документа. \en Get document's name. 
  virtual const std::string GetDocumentName   () const = 0; //{ return std::string( GetDocName().get_str() ); };
                                                            /// \ru Получить имя файла для конвертирования. \en Get file name for converting. 
  virtual const c3d::path_string FullFilePath  () const = 0 ;//{ return c3d::path_string( GetFileName().c_str() ); };
                                                             /// \ru Является ли файл текстовым. \en Whether the file is a text file. 
  virtual bool           IsFileAscii      () const = 0; 
  /// \ru Получить версию формата при экспорте. \en Get the version of format for export.
  virtual long int       GetFormatVersion () const { return EXPORT_DEFAULT; };
  /// \ru Следует ли экспортировать только поверхности ( введено для работы конвертера IGES ). \en Whether to export only surfaces (introduced for work with converter IGES ). 
  virtual bool           IsOutOnlySurfaces() const = 0;
  /// \ru Является ли экспортируемый документ сборкой. \en Whether the document for export is an assembly. 
  virtual bool           IsAssembling     () const = 0; 
  /// \ru Получить значение разрешения на импорт экспорт объектов определенного типа. \en Get the value of permission for import-export of objects of a certain type. 
  virtual bool           GetIoPermission( MbeIOPermiss nPermission ) const = 0; 
  /// \ru Получить значения разрешений на импорт экспорт объектов определенных типов. \en Get values of permission for import-export of objects of certain types. 
  virtual void           GetIoPermissions( std::vector<bool>& ioPermissions ) const = 0; 
  /// \ru Установить разрешение на импорт экспорт объектов определенного типа. \en Set permission for import-export of objects of a certain type. 
  virtual void           SetIoPermission( MbeIOPermiss nPermission, bool set ) = 0; 
  /// \ru Получить значение специфичной строки для конвертера. \en Get the value of a certain string for the converter. 
  virtual bool           GetPropertyString ( MbeConverterStrings nString, std::string &  propertyString ) const = 0;
  /// \ru Установить значение специфичной строки для конвертера. \en Set the value of a certain string for the converter. 
  virtual void           SetPropertyString ( MbeConverterStrings nString, const std::string &  propertyString ) = 0;
  /// \ru Представление текста в аннотационных объектах. \en Text representation in annotation objects. 
  virtual eTextForm      GetAnnotationTextRepresentation () const { return exf_TextOnly; }
  /**  \brief \ru Следует ли компоненты экспортировать в разные файлы (если позволяет формат).
              \en Export components into separate files ( if provided in format). \~
       \note  \ru ЭКСПЕРИМЕНТАЛЬНАЯ.
              \en EXPEREIMENTAL \~.    
  */
  virtual bool           ExportComponentsSeparately() const { return false; }
  /// \ru Получить ЛСК, относительно которой позиционирована модель. \en Get the location, the model is placed in.
  virtual MbPlacement3D  GetOriginLocation() const = 0;
  /// \ru Заменять ли принудительно СК компонент на правые. \en Replace components' placements to right-oriented.
  virtual bool           ReplaceLocationsToRight() const = 0;
  /**  \brief \ru Сшивать ли поверхности автоматически.
              \en If surfaces should be stitched automatically. \~
       \return \ru true - Сшивать поверхности автоматически, false - Спросить пользователя, сшивать ли поверхности.
               \en true - Stitch surfaces automatically, false - Ask user first time. \~
       \param[out] stitchPrecision - \ru Точность сшивки.
                                     \en Stitch precision. \~
  */
  virtual bool           EnableAutoStitch( double& /*stitchPrecision*/ ) const = 0;

  /**  \brief \ru Получить множитель единиц длины по отношению к миллиметру. 
              \en Get the factor of the length units to millimeters. \~
        \details \ru При импорте, если единицы измерения не заданы явно с помощью средств, предоставляемых обменным форматом,
  все размеры (координаты точек, радиусы) умножаются на возвращаемое значение. При экспорте либо с помощью 
  средств, предоставляемых обменным форматом, задаются единицы измерения, либо все размеры модели (координаты 
  точек, радиусы) умножаются на возвращаемое значение.
                \en During the import all spatial objects (coordinate values, radiuses) are multiplied by the returned value, 
  unless the scale factor comes from the exchange file. During the export the exchange format facilities are 
  used to specify the length units or all spatial objects (coordinate values, radiuses) are multiplied by the 
  returned value. \~
  */
  virtual double         LengthUnitsFactor() const { return LENGTH_UNIT_MM; } 


  /**  \brief \ru Получить дополнительный множитель единиц длины по отношению к миллиметру в модели приложения. 
              \en Get addifional factor of the length units to millimeters in the application model. \~
       \details \ru При импорте из всех форматов за исключением JT, если единицы измерения, в том числе и заданные 
  явно с помощью средств, предоставляемых обменным форматом, все размеры (координаты точек, радиусы) умножаются 
  на возвращаемое значение. При экспорте либо с помощью средств, предоставляемых обменным форматом, задаются 
  единицы измерения, либо все размеры модели (координаты точек, радиусы) умножаются на возвращаемое значение.
                \en During the import from all formats except for JT all spatial objects (coordinate values, radiuses) are 
  multiplied by the returned value, even if the scale factor comes from the exchange file. During the export the 
  exchange format facilities are used to specify the length units or all spatial objects (coordinate values, 
  radiuses) are multiplied by the returned value. \~
  */
  virtual double         AppLengthUnitsFactor() const { return LENGTH_UNIT_MM; } 

  /**  \brief \ru Сделать запись в журнал конвертирования.
              \en Make a record in the converter report. \~
  \param[in] id - \ru Идентификатор элемента внутри файла стороннего формата.
                  \en Identifier of an element inside the file of a foreign format. \~
  \param[in] msgType - \ru Тип сообщения.
                       \en Message type. \~
  \param[in] msgText - \ru Код сообщения.
                       \en Message code. \~
  */
  virtual void           LogReport( ptrdiff_t id, eMsgType msgType, eMsgDetail msgText ) = 0;

  //   /**  \brief \ru Следует ли показывать сообщения и диалоги пользователю. \en Whether to show messages and dialog to the user. \~
  //    \details \ru Обеспечивает работу через API. \en Provide possibility for work via API. \~
  //    \return \ru true - обычная работа, false - через API. \en true - ordinary work, false - via API. \~
  //   */
  virtual bool          CanShowMessages() const = 0;
  /// \ru Дать данные вычисления триангуляции (для конвертера JT, STL и VRML). \en Get data for step calculation during triangulation (for JT, STL, VRML only).
  virtual MbStepData    TesselationParameters() const { return MbStepData(); }
  /// \ru Дать данные вычисления триангуляции уровня детализации (для конвертера JT). \en Get data for step calculation during triangulation of LOD0 (for JTonly).
  virtual MbStepData    LOD0TesselationParameters() const { return TesselationParameters(); }
  /// \ru Флаг сохранения совпадающих точек швов. (для конвертера STL и VRML). \en Whether to keep coincident points of seams (for STL, VRML only).
  virtual bool          DualSeams() const { return true; }
  /// \ru Выполнять ли слияние подобных граней. \en Whether to join similar faces.
  virtual bool          JoinSimilarFaces() const { return true; }
  /// \ru Добавлять ли удаленные грани в качестве оболочек. \en Whether to add removed faces as shells.
  virtual bool          AddRemovedFacesAsShells() const { return false; }
  /// \ru Получить генератор однострочного идентификтора изделия. \en Get generator of one-line product identifier.
  virtual SPtr<IProductIdMaker> ProductIdentifierGenerator() const { return SPtr<IProductIdMaker>(); }
  /// \ru Получить настройки для выдачи отладочной информации. \en Get the settings of debug info.
  virtual C3DConverterDebugSettings GetDebugSettings() const { return C3DConverterDebugSettings(); };
  /// \ru Получить пользовательский преобразователь строк. \en Get user string transformer.
  virtual SPtr<IC3DCharEncodingTransformer> GetUserCharEncodingTransformer() const { return SPtr<IC3DCharEncodingTransformer>( nullptr ); }
  /// \ru Создавать раскрашенные копии компонент при импорте. \en Create colored replicas of components on import.
  DEPRECATE_DECLARE virtual bool           ImportComponentsWithColoredReplica() { return false; }
}; // IConvertorProperty3D


//------------------------------------------------------------------------------
/** \brief \ru Реализация генератора однострочного идентификатора компонента.
           \en Implementation of component's identifier generator. \~
    \details \ru Реализация по умолчанию предполагает передачу наименования компонента.
             \en Default implementatio implies export of component's name. \~
\ingroup Exchange_Interface
*/
struct NameProductIdMaker : public IProductIdMaker
{
  virtual c3d::string_t operator()( const MbProductInfo& ) const;
};


//------------------------------------------------------------------------------
/** \brief \ru Предопределённая реализация интерфейса свойств конвертера.
           \en Pre-defined implementation of converter's properties. \~
\ingroup Exchange_Interface
*/
class CONV_CLASS ConvConvertorProperty3D : public IConvertorProperty3D {
public:  
  std::string       docName;  ///< \ru Имя документа. \en Document name.  
  c3d::path_string  fileName; ///< \ru Имя файла. \en File name.
  bool              fileASCII; ///< \ru Экспортировать ли в текстовый файл (если формат поддерживает двоичный). \en Export to text file (if format supports binary one).
  long int          formatVersion; /// \ru Версия формата при экспорте. \en The version of format for export.
  bool              exportIGESTopology; ///< \ru Экспортировать ли топологию в IGES. \en Export topology items into IGES.
  std::vector<bool> ioPermissions; ///< \ru Фильтр объектов по типам. \en Type objects filter.
  SPtr<IC3DCharEncodingTransformer>          userEncodingTransformer; ///< \ru Пользовательский преобразователь строк. \en User string transformer. 
  std::map<MbeConverterStrings, std::string> propertyStrings; ///< \ru Особые значения сведений о документе. \en Specific values of documents properties.
  eTextForm         annotTextReprSTEP; ///< \ru Представление текста элементов аннотации. \en Text representation in annotation items.
  MbPlacement3D     originLocation; ///< \ru ЛСК документа. \en Own placement of the document.
  bool              replaceLocationsToRight; ///< \ru Следует ли принудительно преобразовывать ЛСК объектов к правым (для форматов, допускающих левые). \en Force replacement of locations to right ones.
  bool              enableAutostitch; ///< \ru Сшивать ли поверхности автоматически. \en Automatically stitch surfaces into shells.
  double            autostitchPrecision; ///< \ru Точность сшивки. \en Stitch precision.
  bool              showMessages; ///< \ru Отображать ли сообщения. \en Invoke messages show.
  MbStepData        tesseleationStepData; ///< \ru Параметры триангуляции при экспорте в STL и VRML. \en Tessellation parameters for export into STL and VRML.
  MbStepData        LOD0StepData; ///< \ru Параметры триангуляции при экспорте в JT. \en Tessellation parameters for export into JT.
  bool              dualSeams; ///< \ru Признак сдваивания швов при экспорте в STL и VRML. \en Make dual seams when export into STL and VRML.
  bool              joinSimilarFaces; ///< \ru Выполнять ли слияние подобных граней. \en Whether to join similar faces.
  bool              addRemovedFacesAsShells; ///< \ru Добавлять ли удаленные грани в качестве отдельных оболочек. \en Whether to add removed faces as shells.
  double            lengthUnitsFactor; ///< \ru Единицы длины модели. \en Length units of the model.
  double            appUnitsFactor; ///< \ru Единицы длины модели пользовательского приложения. \en Length units of the model used in user application.
  bool              attatchIdAttributes; ///< \ru Следует ли формировать атрибут на основе идентификатора элемнта в файле. \en Whether to attatch the element's id in file as attribute.
  bool              auditEnabled;
  C3DConverterDebugSettings debugSettings;
  
  /// \ru Сведения о сообщениях конвертера. \en Converter message data.
  struct LogRecord {
    ptrdiff_t id; ///< \ru Идентификатор записи. \en Record id.
    eMsgType msgType; ///< \ru Тип сообщения. \en Message type.
    eMsgDetail msgText; ///< \ru Код сообщения. \en Message code.
  };
  
  std::vector< LogRecord > logRecords; ///< \ru Сообщения конвертера. \en Converter messages.

public:

  ConvConvertorProperty3D(); ///< \ru Конструктор. \en Constructor.
  ~ConvConvertorProperty3D() override {};///< \ru Деструктор. \en Destructor.

  /// \ru Получить имя документа. \en Get document's name. 
  const std::string GetDocumentName   () const override { return docName; };
  /// \ru Получить имя файла для конвертирования. \en Get file name for converting. 
  const c3d::path_string FullFilePath  () const override { return fileName; };
  /// \ru Является ли файл текстовым. \en Whether the file is a text file. 
  bool           IsFileAscii      () const override;
  /// \ru Получить версию формата при экспорте. \en Get the version of format for export.
  long int       GetFormatVersion () const override;
  /// \ru Следует ли экспортировать только поверхности ( введено для работы конвертера IGES ). \en Whether to export only surfaces (introduced for work with converter IGES ). 
  bool           IsOutOnlySurfaces() const override;
  /// \ru Является ли экспортируемый документ сборкой. \en Whether the document for export is an assembly. 
  bool           IsAssembling     () const override { return true; }; 
  /// \ru Получить значение разрешения на импорт экспорт объектов определенного типа. \en Get the value of permission for import-export of objects of a certain type. 
  bool           GetIoPermission( MbeIOPermiss nPermission ) const override;
  /// \ru Получить значения разрешений на импорт экспорт объектов определенных типов. \en Get values of permission for import-export of objects of certain types. 
  void GetIoPermissions( std::vector<bool>& ioPermissions ) const override; 
  /// \ru Установить разрешение на импорт экспорт объектов определенного типа. \en Set permission for import-export of objects of a certain type. 
  void           SetIoPermission( MbeIOPermiss nPermission, bool isSet ) override;
  /// \ru Получить значение специфичной строки для конвертера. \en Get the value of a certain string for the converter. 
  bool           GetPropertyString ( MbeConverterStrings nString, std::string &  propertyString ) const override; 
  /// \ru Установить значение специфичной строки для конвертера. \en Set the value of a certain string for the converter. 
  void           SetPropertyString ( MbeConverterStrings nString, const std::string &  propertyString ) override;
  /// \ru Представление текста в аннотационных объектах. \en Text representation in annotation objects. 
  eTextForm      GetAnnotationTextRepresentation () const override;
  /**  \brief \ru Следует ли компоненты экспортировать в разные файлы (если позволяет формат).
              \en Export components into separate files ( if provided in format). \~
       \note  \ru ЭКСПЕРИМЕНТАЛЬНАЯ.
              \en EXPEREIMENTAL \~.
    
  */
  bool           ExportComponentsSeparately() const override;
  /// \ru Получить ЛСК, относительно которой позиционирована модель. \en Get the location, the model is placed in.
  MbPlacement3D  GetOriginLocation() const override;
  /// \ru Заменять ли принудительно СК компонент на правые. \en Replace components' placements to right-oriented.
  bool           ReplaceLocationsToRight() const override;
  /**  \brief \ru Сшивать ли поверхности автоматически.
              \en If surfaces should be stitched automatically. \~
    \return \ru true - Сшивать поверхности автоматически, false - Спросить пользователя, сшивать ли поверхности.
            \en true - Stitch surfaces automatically, false - Ask user first time. \~
    \param[out] stitchPrecision - \ru Точность сшивки.
                                  \en Stitch precision. \~
  */  bool           EnableAutoStitch( double& /*stitchPrecision*/ ) const override;

  /// \ru Получить множитель единиц длины по отношению к миллиметру. \en Get the factor of the length units to millimeters.
  double         LengthUnitsFactor() const override;

  /**  \brief \ru Получить множитель единиц длины по отношению к миллиметру в модели приложения. 
  \en Get the factor of the length units to millimeters in the application model. \~  
  */
  double         AppLengthUnitsFactor() const override;

  /**  \brief \ru Сделать запись в журнал конвертирования.
              \en Make a record in the converter report. \~
    \param[in] id - \ru Идентификатор элемента внутри файла стороннего формата.
                    \en Identifier of an element inside the file of a foreign format. \~
    \param[in] msgType - \ru Тип сообщения.
                         \en Message type. \~
    \param[in] msgText - \ru Код сообщения.
                         \en Message code. \~
  */
  void           LogReport( ptrdiff_t id, eMsgType msgType, eMsgDetail msgText ) override;

//   /**  \brief \ru Следует ли показывать сообщения и диалоги пользователю. \en Whether to show messages and dialog to the user. \~
//    \details \ru Обеспечивает работу через API. \en Provide possibility for work via API. \~
//    \return \ru true - обычная работа, false - через API. \en true - ordinary work, false - via API. \~
//   */
   bool          CanShowMessages() const override;

  /// \ru Дать данные вычисления триангуляции (для конвертера STL и VRML). \en Get data for step calculation during triangulation (for STL, VRML only).
  MbStepData     TesselationParameters() const override;
  /// \ru Дать данные вычисления триангуляции уровня детализации (для конвертера JT). \en Get data for step calculation during triangulation of LOD0 (for JTonly).
  MbStepData    LOD0TesselationParameters() const override;
  /// \ru Получить флаг сохранения совпадающих точек швов. (для конвертера STL и VRML). \en Whether to keep coincident points of seams (for STL, VRML only).
  bool           DualSeams() const override;
  /// \ru Задать флаг сохранения совпадающих точек швов. (для конвертера STL и VRML). \en Whether to keep coincident points of seams (for STL, VRML only).
  void           DualSeams( bool );
  /// \ru Получить настройки для выдачи отладочной информации. \en Get the settings of debug info.
  C3DConverterDebugSettings GetDebugSettings() const override;
  /// \ru Выполнять ли слияние подобных граней. \en Whether to join similar faces.
  bool          JoinSimilarFaces() const override { return joinSimilarFaces; }
  /// \ru Добавлять ли удаленные грани в качестве оболочек. \en Whether to add removed faces as shells.
  bool          AddRemovedFacesAsShells() const override { return addRemovedFacesAsShells; }
  /// \ru Получить генератор однострочного идентификтора изделия. \en Get generator of one-line product identifier.
  SPtr<IProductIdMaker> ProductIdentifierGenerator() const override { return SPtr<IProductIdMaker>( new NameProductIdMaker() ); }

  /// \ru Получить пользовательский преобразователь строк. \en Get user string transformer. 
  SPtr<IC3DCharEncodingTransformer> GetUserCharEncodingTransformer() const override;

  OBVIOUS_PRIVATE_COPY( ConvConvertorProperty3D )

}; // IConvertorProperty3D



//------------------------------------------------------------------------------
/** \brief  \ru Преобразование строк с использованием установленной локали.              
            \en Transform strings using the set locale. 
   \details \ru Выполняется только для UNICODE-сборок, для остальных случаев производится копирование.
            \en It is performed only for UNICODE assemblies, for other cases copying is performed.\~
  \ingroup Base_Tools_String
*/
class CONV_CLASS C3DCharEncodingTransformerLocale : public IC3DCharEncodingTransformer
{
public:
  virtual ~C3DCharEncodingTransformerLocale() {}

  //------------------------------------------------------------------------------
  /** \brief \ru Преобразовать строку C3D в строку STD.
             \en Transform C3D string to the STD one. \~
    \ingroup Base_Tools_String
  */
  virtual bool C3DToStd( const c3d::string_t& from, std::string  & to );

  //------------------------------------------------------------------------------
  /** \brief \ru Преобразовать строку STD в строку C3D.
             \en Transform STD string to the C3D one. \~
    \ingroup Base_Tools_String
  */
  virtual bool StdToC3D( const std::string  & from, c3d::string_t& to );
};


//------------------------------------------------------------------------------
/** \brief  \ru Преобразование строк с использованием нотации STEP.
            \en Transform strings using the STEP wide characters encoding. 
  \ingroup Base_Tools_String
*/
class CONV_CLASS IC3DCharEncodingTransformerStep : public IC3DCharEncodingTransformer
{
public:
  virtual ~IC3DCharEncodingTransformerStep() {}

  //------------------------------------------------------------------------------
  /** \brief \ru Преобразовать строку C3D в строку STD.
             \en Transform C3D string to the STD one. \~
    \ingroup Base_Tools_String
  */
  virtual bool C3DToStd( const c3d::string_t& from, std::string  & to );

  //------------------------------------------------------------------------------
  /** \brief \ru Преобразовать строку STD в строку C3D.
             \en Transform STD string to the C3D one. \~
    \ingroup Base_Tools_String
  */
  virtual bool StdToC3D( const std::string  & from, c3d::string_t& to );
};


//------------------------------------------------------------------------------
/** \brief  \ru Преобразование строк с использованием кодировки UTF-8.
            \en Transform strings using the utf-8 encoding.
  \note     \ru Реализовано только для C++ 20 или выше. 
            \en Implemented only for C++ 20 and above.

  \ingroup Base_Tools_String
*/
class CONV_CLASS IC3DCharEncodingTransformerUTF8 : public IC3DCharEncodingTransformer
{
public:
  virtual ~IC3DCharEncodingTransformerUTF8() {}

  //------------------------------------------------------------------------------
  /** \brief \ru Преобразовать строку C3D в строку STD.
             \en Transform C3D string to the STD one. \~
    \ingroup Base_Tools_String
  */
  virtual bool C3DToStd( const c3d::string_t& from, std::string  & to );

  //------------------------------------------------------------------------------
  /** \brief \ru Преобразовать строку STD в строку C3D.
             \en Transform STD string to the C3D one. \~
    \ingroup Base_Tools_String
  */
  virtual bool StdToC3D( const std::string  & from, c3d::string_t& to );
};

#endif // __CONV_EXCHANGE_SETTINGS_H
