]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Merge branch 'master' into OPERA OPERA
authorNicolas RECHATIN <nicolas.rechatin@cea.fr>
Mon, 22 Jul 2024 09:01:25 +0000 (11:01 +0200)
committerNicolas RECHATIN <nicolas.rechatin@cea.fr>
Mon, 22 Jul 2024 09:01:25 +0000 (11:01 +0200)
17 files changed:
1  2 
CMakeLists.txt
src/CTestTestfileInstall.cmake
src/ExchangeAPI/ExchangeAPI_Export.cpp
src/ExchangeAPI/ExchangeAPI_Export.h
src/ExchangePlugin/CMakeLists.txt
src/ExchangePlugin/ExchangePlugin_ExportFeature.cpp
src/ExchangePlugin/ExchangePlugin_ExportFeature.h
src/ExchangePlugin/export_widget.xml
src/GeomAlgoAPI/CMakeLists.txt
src/GeomAlgoAPI/GeomAlgoAPI_Sphere.cpp
src/ModelHighAPI/ModelHighAPI_Macro.h
src/ModuleBase/ModuleBase_ListView.cpp
src/PrimitivesPlugin/PrimitivesPlugin_Tube.h
src/PythonAPI/Test/TestFeatures.py
src/PythonAPI/model/__init__.py
src/SHAPERGUI/SHAPERGUI.cpp
src/XGUI/XGUI_Displayer.cpp

diff --cc CMakeLists.txt
Simple merge
index e3f2a6c18a56705744366f73d97564414dab8f4e,81b24a8dae6f7fb688dc796c7feb8f6067b89635..5a1cee00206258fdf65637be23e15a3ee42a54ef
@@@ -45,5 -46,5 +46,6 @@@ SUBDIRS(ConnectorAP
          ModelGeomAlgo
          Locale
          test_API
 +        OperaPlugin
+         TestModels
  )
index 0112b643397958c70893b1138dc278397f4ccfb0,cda585a2d7ead5f4db7aadf1572f719d37ca10e7..ccee9ca567b52b7432ba33909699c682e0b9da58
@@@ -272,25 -315,9 +336,25 @@@ ExportPtr exportToXAO(const std::shared
    apply(); // finish previous operation to make sure all previous operations are done
    std::shared_ptr<ModelAPI_Feature> aFeature =
      thePart->addFeature(ExchangePlugin_ExportFeature::ID());
-   return ExportPtr(new ExchangeAPI_Export(aFeature, theFilePath, theAuthor, theGeometryName));
+   return ExportPtr(new ExchangeAPI_Export(aFeature, theFilePath, theAuthor, theGeometryName, theShapeFilePath));
  }
  
 +ExportPtr exportToROOT(const std::shared_ptr<ModelAPI_Document> &thePart,
 +                       const ModelHighAPI_Selection &theSelectedShape,
 +                       const std::string &theFilePath = "./exportedROOT.C",
 +                       const std::string &theManagerName = "manager_name",
 +                       const std::string &theManagerTitle = "manager_title",
 +                       const std::string &theExpFilePath = "exported.root")
 +{
 +  apply(); // finish previous operation to make sure all previous operations are done
 +  std::shared_ptr<ModelAPI_Feature> aFeature =
 +    thePart->addFeature(ExchangePlugin_ExportFeature::ID());
 +  if (theFilePath.substr(theFilePath.size() - 2) != ".C")
 +    aFeature->setError(std::string("Error: the file seems to not have a .C extension file for ROOT. Aborting"));
 +  return ExportPtr(new ExchangeAPI_Export(aFeature, theSelectedShape, theFilePath, theManagerName, theManagerTitle, theExpFilePath));
 +}
 +
 +
  ExportPtr exportToSTL(const std::shared_ptr<ModelAPI_Document> & thePart,
        const std::string & theFilePath,
        const ModelHighAPI_Selection& theSelectedShape,
index 309dd9df5731f6a2b4818b0326dbdc47b850dfe4,4500c95dbf9e7aa10defc96cfa21e8e1bfab4635..6bd82b43301e16f9a7e986a06e01e09eecaa5275
@@@ -51,26 -54,18 +54,27 @@@ public
    explicit ExchangeAPI_Export(const std::shared_ptr<ModelAPI_Feature>& theFeature,
                                const std::string & theFilePath,
                                const std::string & theAuthor = std::string(),
-                               const std::string & theGeometryName = std::string());
+                               const std::string & theGeometryName = std::string(),
+                               const std::string & theShapeFilePath = std::string());
  
 +  /// Constructor with values for ROOT export.
 +  EXCHANGEAPI_EXPORT
 +  explicit ExchangeAPI_Export(const std::shared_ptr<ModelAPI_Feature> &theFeature,
 +                              const ModelHighAPI_Selection &theSelectedShape,
 +                              const std::string &theFilePath,
 +                              const std::string &theManagerName,
 +                              const std::string &theManagerTitle,
 +                              const std::string &theExpFilePath);
 +
    /// Constructor with values for STL of selected result export.
    EXCHANGEAPI_EXPORT
-     explicit ExchangeAPI_Export(const std::shared_ptr<ModelAPI_Feature>& theFeature,
-                                 const std::string & theFilePath,
-                                 const ModelHighAPI_Selection& theSelectedShape,
-                                 const ModelHighAPI_Double&  theDeflectionRelative ,
-                                 const ModelHighAPI_Double&  theDeflectionAbsolute,
-                                 const bool theIsRelative,
-                                 const bool theIsASCII);
+   explicit ExchangeAPI_Export(const std::shared_ptr<ModelAPI_Feature>& theFeature,
+                               const std::string & theFilePath,
+                               const ModelHighAPI_Selection& theSelectedShape,
+                               const ModelHighAPI_Double&  theDeflectionRelative ,
+                               const ModelHighAPI_Double&  theDeflectionAbsolute,
+                               const bool theIsRelative,
+                               const bool theIsASCII);
  
    /// Constructor with values for XAO of selected result export.
    EXCHANGEAPI_EXPORT
    EXCHANGEAPI_EXPORT
    virtual ~ExchangeAPI_Export();
  
-   INTERFACE_20(ExchangePlugin_ExportFeature::ID(),
 -  INTERFACE_17(ExchangePlugin_ExportFeature::ID(),
++  INTERFACE_22(ExchangePlugin_ExportFeature::ID(),
                 exportType, ExchangePlugin_ExportFeature::EXPORT_TYPE_ID(),
                 ModelAPI_AttributeString, /** ExportType */,
                 filePath, ExchangePlugin_ExportFeature::FILE_PATH_ID(),
                 stlfileType, ExchangePlugin_ExportFeature::STL_FILE_TYPE(),
                 ModelAPI_AttributeString, /** Type of the stl file*/,
                 stldeflectionTypeabsolute,
 -                      ExchangePlugin_ExportFeature::STL_DEFLECTION_TYPE_ABSOLUTE(),
 +               ExchangePlugin_ExportFeature::STL_DEFLECTION_TYPE_ABSOLUTE(),
                 ModelAPI_AttributeString, /** Type of the defelection */,
                 stldeflectionTyperelative,
 -                      ExchangePlugin_ExportFeature::STL_DEFLECTION_TYPE_RELATIVE(),
 +               ExchangePlugin_ExportFeature::STL_DEFLECTION_TYPE_RELATIVE(),
-                ModelAPI_AttributeString,
-                /** Type of the defelection */)
+                ModelAPI_AttributeString, /** Type of the defelection */,
+                memoryBuff, ExchangePlugin_ExportFeature::MEMORY_BUFFER_ID(),
+                ModelAPI_AttributeString, /** Bytes*/,
+                xaoShapeFilePath, ExchangePlugin_ExportFeature::XAO_SHAPE_FILE_PATH_ID(),
+                ModelAPI_AttributeString, /** xao shape file path */)
  
    /// Dump wrapped feature
    EXCHANGEAPI_EXPORT
@@@ -179,21 -176,21 +195,31 @@@ ExportPtr exportToSTL(const std::shared
  */
  EXCHANGEAPI_EXPORT
  ExportPtr exportToXAO(const std::shared_ptr<ModelAPI_Document> & thePart,
-   const std::string & theFilePath,
-   const ModelHighAPI_Selection& theSelectedShape,
-   const std::string & theAuthor = std::string(),
-   const std::string & theGeometryName = std::string());
+                       const std::string & theFilePath,
+                       const ModelHighAPI_Selection& theSelectedShape,
+                       const std::string & theAuthor = std::string(),
+                       const std::string & theGeometryName = std::string(),
+                       const std::string & theShapeFilePath = std::string());
+ /**\ingroup CPPHighAPI
+ * \brief Exports to XAO format buffer the selected result with groups parts related to it only.
+ */
+ EXCHANGEAPI_EXPORT
+ PyObject* exportToXAOMem(const std::shared_ptr<ModelAPI_Document> & thePart,
+                            const ModelHighAPI_Selection& theSelectedShape,
+                            const std::string & theAuthor = std::string(),
+                            const std::string & theGeometryName = std::string());
  
 +/**\ingroup CPPHighAPI
 + * \brief Exports to XAO file all results of the current document
 + */
 +EXCHANGEAPI_EXPORT
 +ExportPtr exportToROOT(const std::shared_ptr<ModelAPI_Document> &thePart,
 +                       const ModelHighAPI_Selection &theSelectedShape,
 +                       const std::string &theFilePath = "./exportedROOT.C",
 +                       const std::string &theManagerName = "manager_name",
 +                       const std::string &theManagerTitle = "manager_title",
 +                       const std::string &theExpFilePath = "exported.root");
  
  /** \ingroup CPPHighAPI
   *  \brief Export selected features or the whole part to the binary file.
Simple merge
index 2a52e61b8a59a1c1faa4f1dadc5b804b90851327,b536f54efffda46310111d1a82a450112e701059..0010a1c253b346a7e5a25d2278d83f682b712b0e
@@@ -95,90 -86,90 +97,105 @@@ ExchangePlugin_ExportFeature::~Exchange
   */
  void ExchangePlugin_ExportFeature::initAttributes()
  {
-     data()->addAttribute(ExchangePlugin_ExportFeature::EXPORT_TYPE_ID(),
-                          ModelAPI_AttributeString::typeId());
-     data()->addAttribute(ExchangePlugin_ExportFeature::FILE_PATH_ID(),
-                          ModelAPI_AttributeString::typeId());
-     data()->addAttribute(ExchangePlugin_ExportFeature::XAO_FILE_PATH_ID(),
-                          ModelAPI_AttributeString::typeId());
-     data()->addAttribute(ExchangePlugin_ExportFeature::FILE_FORMAT_ID(),
-                          ModelAPI_AttributeString::typeId());
-     data()->addAttribute(ExchangePlugin_ExportFeature::SELECTION_LIST_ID(),
-                          ModelAPI_AttributeSelectionList::typeId());
-     data()->addAttribute(ExchangePlugin_ExportFeature::XAO_AUTHOR_ID(),
-                          ModelAPI_AttributeString::typeId());
-     data()->addAttribute(ExchangePlugin_ExportFeature::XAO_GEOMETRY_NAME_ID(),
-                          ModelAPI_AttributeString::typeId());
-     data()->addAttribute(ExchangePlugin_ExportFeature::XAO_SELECTION_LIST_ID(),
-                          ModelAPI_AttributeSelectionList::typeId());
-     data()->addAttribute(ExchangePlugin_ExportFeature::STL_FILE_PATH_ID(),
-                          ModelAPI_AttributeString::typeId());
-     data()->addAttribute(ExchangePlugin_ExportFeature::STL_OBJECT_SELECTED(),
-                          ModelAPI_AttributeSelection::typeId());
-     data()->addAttribute(ExchangePlugin_ExportFeature::STL_DEFLECTION_TYPE(),
-                          ModelAPI_AttributeString::typeId());
-     data()->addAttribute(ExchangePlugin_ExportFeature::STL_RELATIVE(),
-                          ModelAPI_AttributeDouble::typeId());
 -  data()->addAttribute(ExchangePlugin_ExportFeature::EXPORT_TYPE_ID(),
 -    ModelAPI_AttributeString::typeId());
 -  data()->addAttribute(ExchangePlugin_ExportFeature::FILE_PATH_ID(),
 -    ModelAPI_AttributeString::typeId());
 -  data()->addAttribute(ExchangePlugin_ExportFeature::XAO_FILE_PATH_ID(),
 -    ModelAPI_AttributeString::typeId());
 -  data()->addAttribute(ExchangePlugin_ExportFeature::FILE_FORMAT_ID(),
 -    ModelAPI_AttributeString::typeId());
 -  data()->addAttribute(ExchangePlugin_ExportFeature::SELECTION_LIST_ID(),
 -    ModelAPI_AttributeSelectionList::typeId());
 -  data()->addAttribute(ExchangePlugin_ExportFeature::XAO_AUTHOR_ID(),
 -    ModelAPI_AttributeString::typeId());
 -  data()->addAttribute(ExchangePlugin_ExportFeature::XAO_GEOMETRY_NAME_ID(),
 -    ModelAPI_AttributeString::typeId());
 -  data()->addAttribute(ExchangePlugin_ExportFeature::XAO_SELECTION_LIST_ID(),
 -    ModelAPI_AttributeSelectionList::typeId());
 -  data()->addAttribute(ExchangePlugin_ExportFeature::STL_FILE_PATH_ID(),
 -    ModelAPI_AttributeString::typeId());
 -  data()->addAttribute(ExchangePlugin_ExportFeature::STL_OBJECT_SELECTED(),
 -    ModelAPI_AttributeSelection::typeId());
 -  data()->addAttribute(ExchangePlugin_ExportFeature::STL_DEFLECTION_TYPE(),
 -   ModelAPI_AttributeString::typeId());
 -  data()->addAttribute(ExchangePlugin_ExportFeature::STL_RELATIVE(),
 -    ModelAPI_AttributeDouble::typeId());
--
-     double defelection = Config_PropManager::real("Visualization", "body_deflection");
-     real(ExchangePlugin_ExportFeature::STL_RELATIVE())->setValue(defelection);
 -  double defelection = Config_PropManager::real("Visualization", "body_deflection");
 -  real(ExchangePlugin_ExportFeature::STL_RELATIVE())->setValue(defelection);
--
-     data()->addAttribute(ExchangePlugin_ExportFeature::STL_ABSOLUTE(),
-                          ModelAPI_AttributeDouble::typeId());
-     data()->addAttribute(ExchangePlugin_ExportFeature::STL_FILE_TYPE(),
-                          ModelAPI_AttributeString::typeId());
 -  data()->addAttribute(ExchangePlugin_ExportFeature::STL_ABSOLUTE(),
 -    ModelAPI_AttributeDouble::typeId());
 -  data()->addAttribute(ExchangePlugin_ExportFeature::STL_FILE_TYPE(),
 -   ModelAPI_AttributeString::typeId());
--
-     ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(),
-                                                                  ExchangePlugin_ExportFeature::XAO_FILE_PATH_ID());
-     ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(),
-                                                                  ExchangePlugin_ExportFeature::STL_FILE_PATH_ID());
-     ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(),
-                                                                  ExchangePlugin_ExportFeature::XAO_AUTHOR_ID());
-     ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(),
-                                                                  ExchangePlugin_ExportFeature::XAO_GEOMETRY_NAME_ID());
-     ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(),
-                                                                  ExchangePlugin_ExportFeature::XAO_SELECTION_LIST_ID());
 -  // export to memory buffer (implemented for XAO format only)
 -  data()->addAttribute(ExchangePlugin_ExportFeature::MEMORY_BUFFER_ID(),
 -                       ModelAPI_AttributeString::typeId());
--
-     data()->addAttribute(ExchangePlugin_ExportFeature::ROOT_FILE_PATH_ID(),
-                          ModelAPI_AttributeString::typeId());
-     data()->addAttribute(ExchangePlugin_ExportFeature::ROOT_MANAGER_NAME_ID(),
-                          ModelAPI_AttributeString::typeId());
-     data()->addAttribute(ExchangePlugin_ExportFeature::ROOT_MANAGER_TITLE_ID(),
-                          ModelAPI_AttributeString::typeId());
-     data()->addAttribute(ExchangePlugin_ExportFeature::EXP_NAME_FILE_ID(),
-                          ModelAPI_AttributeString::typeId());
-     data()->addAttribute(ExchangePlugin_ExportFeature::MAIN_OBJECT_ID(),
-                          ModelAPI_AttributeSelection::typeId());
 -  data()->addAttribute(ExchangePlugin_ExportFeature::XAO_SHAPE_FILE_PATH_ID(),
 -                       ModelAPI_AttributeString::typeId());
 -  data()->addAttribute(ExchangePlugin_ExportFeature::XAO_SHAPE_FILE_SEPARATE_ID(),
 -                       ModelAPI_AttributeBoolean::typeId());
--
-     // to support previous version of document, move the selection list
-     // if the type of export operation is XAO
-     AttributeStringPtr aTypeAttr = string(EXPORT_TYPE_ID());
-     if (aTypeAttr->isInitialized() && aTypeAttr->value() == "XAO")
-     {
-         bool aWasBlocked = data()->blockSendAttributeUpdated(true, false);
-         AttributeSelectionListPtr aSelList = selectionList(SELECTION_LIST_ID());
-         AttributeSelectionListPtr aXAOSelList = selectionList(XAO_SELECTION_LIST_ID());
-         if (aSelList->size() > 0 && aXAOSelList->size() == 0)
-             aSelList->copyTo(aXAOSelList);
-         aSelList->clear();
-         data()->blockSendAttributeUpdated(aWasBlocked, false);
-     }
 -  ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(),
 -    ExchangePlugin_ExportFeature::XAO_FILE_PATH_ID());
 -  ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(),
 -    ExchangePlugin_ExportFeature::STL_FILE_PATH_ID());
 -  ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(),
 -    ExchangePlugin_ExportFeature::XAO_AUTHOR_ID());
 -  ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(),
 -    ExchangePlugin_ExportFeature::XAO_GEOMETRY_NAME_ID());
 -  ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(),
 -    ExchangePlugin_ExportFeature::XAO_SELECTION_LIST_ID());
 -  ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(),
 -    ExchangePlugin_ExportFeature::MEMORY_BUFFER_ID());
 -  ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(),
 -    ExchangePlugin_ExportFeature::XAO_SHAPE_FILE_PATH_ID());
 -  ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(),
 -    ExchangePlugin_ExportFeature::XAO_SHAPE_FILE_SEPARATE_ID());
 -
 -  // to support previous version of document, move the selection list
 -  // if the type of export operation is XAO
 -  AttributeStringPtr aTypeAttr = string(EXPORT_TYPE_ID());
 -  if (aTypeAttr->isInitialized() &&
 -      (aTypeAttr->value() == "XAO" || aTypeAttr->value() == "XAOMem")) {
 -    bool aWasBlocked = data()->blockSendAttributeUpdated(true, false);
 -    AttributeSelectionListPtr aSelList = selectionList(SELECTION_LIST_ID());
 -    AttributeSelectionListPtr aXAOSelList = selectionList(XAO_SELECTION_LIST_ID());
 -    if (aSelList->size() > 0 && aXAOSelList->size() == 0)
 -      aSelList->copyTo(aXAOSelList);
 -    aSelList->clear();
 -    data()->blockSendAttributeUpdated(aWasBlocked, false);
 -  }
++      data()->addAttribute(ExchangePlugin_ExportFeature::EXPORT_TYPE_ID(),
++                                              ModelAPI_AttributeString::typeId());
++      data()->addAttribute(ExchangePlugin_ExportFeature::FILE_PATH_ID(),
++                                              ModelAPI_AttributeString::typeId());
++      data()->addAttribute(ExchangePlugin_ExportFeature::XAO_FILE_PATH_ID(),
++                                              ModelAPI_AttributeString::typeId());
++      data()->addAttribute(ExchangePlugin_ExportFeature::FILE_FORMAT_ID(),
++                                              ModelAPI_AttributeString::typeId());
++      data()->addAttribute(ExchangePlugin_ExportFeature::SELECTION_LIST_ID(),
++                                              ModelAPI_AttributeSelectionList::typeId());
++      data()->addAttribute(ExchangePlugin_ExportFeature::XAO_AUTHOR_ID(),
++                                              ModelAPI_AttributeString::typeId());
++      data()->addAttribute(ExchangePlugin_ExportFeature::XAO_GEOMETRY_NAME_ID(),
++                                              ModelAPI_AttributeString::typeId());
++      data()->addAttribute(ExchangePlugin_ExportFeature::XAO_SELECTION_LIST_ID(),
++                                              ModelAPI_AttributeSelectionList::typeId());
++      data()->addAttribute(ExchangePlugin_ExportFeature::STL_FILE_PATH_ID(),
++                                              ModelAPI_AttributeString::typeId());
++      data()->addAttribute(ExchangePlugin_ExportFeature::STL_OBJECT_SELECTED(),
++                                              ModelAPI_AttributeSelection::typeId());
++      data()->addAttribute(ExchangePlugin_ExportFeature::STL_DEFLECTION_TYPE(),
++                                              ModelAPI_AttributeString::typeId());
++      data()->addAttribute(ExchangePlugin_ExportFeature::STL_RELATIVE(),
++                                              ModelAPI_AttributeDouble::typeId());
++
++      double defelection = Config_PropManager::real("Visualization", "body_deflection");
++      real(ExchangePlugin_ExportFeature::STL_RELATIVE())->setValue(defelection);
++
++      data()->addAttribute(ExchangePlugin_ExportFeature::STL_ABSOLUTE(),
++                                              ModelAPI_AttributeDouble::typeId());
++      data()->addAttribute(ExchangePlugin_ExportFeature::STL_FILE_TYPE(),
++                                              ModelAPI_AttributeString::typeId());
++
++      data()->addAttribute(ExchangePlugin_ExportFeature::ROOT_FILE_PATH_ID(),
++                                              ModelAPI_AttributeString::typeId());
++      data()->addAttribute(ExchangePlugin_ExportFeature::ROOT_MANAGER_NAME_ID(),
++                                              ModelAPI_AttributeString::typeId());
++      data()->addAttribute(ExchangePlugin_ExportFeature::ROOT_MANAGER_TITLE_ID(),
++                                              ModelAPI_AttributeString::typeId());
++      data()->addAttribute(ExchangePlugin_ExportFeature::EXP_NAME_FILE_ID(),
++                                              ModelAPI_AttributeString::typeId());
++      data()->addAttribute(ExchangePlugin_ExportFeature::MAIN_OBJECT_ID(),
++                                              ModelAPI_AttributeSelection::typeId());
++
++      // export to memory buffer (implemented for XAO format only)
++      data()->addAttribute(ExchangePlugin_ExportFeature::MEMORY_BUFFER_ID(),
++                                              ModelAPI_AttributeString::typeId());
++
++      data()->addAttribute(ExchangePlugin_ExportFeature::XAO_SHAPE_FILE_PATH_ID(),
++                                              ModelAPI_AttributeString::typeId());
++      data()->addAttribute(ExchangePlugin_ExportFeature::XAO_SHAPE_FILE_SEPARATE_ID(),
++                                              ModelAPI_AttributeBoolean::typeId());
++
++      ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(),
++      ExchangePlugin_ExportFeature::XAO_FILE_PATH_ID());
++      ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(),
++      ExchangePlugin_ExportFeature::STL_FILE_PATH_ID());
++      ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(),
++      ExchangePlugin_ExportFeature::XAO_AUTHOR_ID());
++      ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(),
++      ExchangePlugin_ExportFeature::XAO_GEOMETRY_NAME_ID());
++      ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(),
++      ExchangePlugin_ExportFeature::XAO_SELECTION_LIST_ID());
++      ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(),
++      ExchangePlugin_ExportFeature::MEMORY_BUFFER_ID());
++      ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(),
++      ExchangePlugin_ExportFeature::XAO_SHAPE_FILE_PATH_ID());
++      ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(),
++      ExchangePlugin_ExportFeature::XAO_SHAPE_FILE_SEPARATE_ID());
++
++      // to support previous version of document, move the selection list
++      // if the type of export operation is XAO
++      AttributeStringPtr aTypeAttr = string(EXPORT_TYPE_ID());
++      if (aTypeAttr->isInitialized() &&
++              (aTypeAttr->value() == "XAO" || aTypeAttr->value() == "XAOMem")) {
++      bool aWasBlocked = data()->blockSendAttributeUpdated(true, false);
++      AttributeSelectionListPtr aSelList = selectionList(SELECTION_LIST_ID());
++      AttributeSelectionListPtr aXAOSelList = selectionList(XAO_SELECTION_LIST_ID());
++      if (aSelList->size() > 0 && aXAOSelList->size() == 0)
++              aSelList->copyTo(aXAOSelList);
++      aSelList->clear();
++      data()->blockSendAttributeUpdated(aWasBlocked, false);
++      }
  }
  
 -void ExchangePlugin_ExportFeature::attributeChanged(const std::stringtheID)
 +void ExchangePlugin_ExportFeature::attributeChanged(const std::string &theID)
  {
-     if (theID == XAO_FILE_PATH_ID())
-     {
-         string(ExchangePlugin_ExportFeature::FILE_PATH_ID())->setValue(string(ExchangePlugin_ExportFeature::XAO_FILE_PATH_ID())->value());
-     }
-     else if (theID == STL_FILE_PATH_ID())
-     {
-         string(ExchangePlugin_ExportFeature::FILE_PATH_ID())->setValue(string(ExchangePlugin_ExportFeature::STL_FILE_PATH_ID())->value());
-     }
-     else if (theID == ROOT_FILE_PATH_ID())
-     {
-         string(ExchangePlugin_ExportFeature::FILE_PATH_ID())->setValue(string(ExchangePlugin_ExportFeature::ROOT_FILE_PATH_ID())->value());
-     }
 -  if (theID == XAO_FILE_PATH_ID()) {
 -    string(ExchangePlugin_ExportFeature::FILE_PATH_ID())->setValue(
 -      string(ExchangePlugin_ExportFeature::XAO_FILE_PATH_ID())->value());
 -  }
 -  else if (theID == STL_FILE_PATH_ID()) {
 -    string(ExchangePlugin_ExportFeature::FILE_PATH_ID())->setValue(
 -      string(ExchangePlugin_ExportFeature::STL_FILE_PATH_ID())->value());
 -  }
++      if (theID == XAO_FILE_PATH_ID())
++      {
++              string(ExchangePlugin_ExportFeature::FILE_PATH_ID())->setValue(string(ExchangePlugin_ExportFeature::XAO_FILE_PATH_ID())->value());
++      }
++      else if (theID == STL_FILE_PATH_ID())
++      {
++              string(ExchangePlugin_ExportFeature::FILE_PATH_ID())->setValue(string(ExchangePlugin_ExportFeature::STL_FILE_PATH_ID())->value());
++      }
++      else if (theID == ROOT_FILE_PATH_ID())
++      {
++              string(ExchangePlugin_ExportFeature::FILE_PATH_ID())->setValue(string(ExchangePlugin_ExportFeature::ROOT_FILE_PATH_ID())->value());
++      }
  }
  
  /*
   */
  void ExchangePlugin_ExportFeature::execute()
  {
-     AttributeStringPtr aFormatAttr =
-         this->string(ExchangePlugin_ExportFeature::FILE_FORMAT_ID());
-     std::string aFormat = aFormatAttr->value();
 -  AttributeStringPtr aFormatAttr =
 -      this->string(ExchangePlugin_ExportFeature::FILE_FORMAT_ID());
 -  std::string aFormat = aFormatAttr->value();
 -
 -  bool isMemoryExport = false;
 -  AttributeStringPtr aTypeAttr = string(EXPORT_TYPE_ID());
 -  if (aTypeAttr->isInitialized() && aTypeAttr->value() == "XAOMem")
 -    isMemoryExport = true;
 -
 -  AttributeStringPtr aFilePathAttr =
 -      this->string(ExchangePlugin_ExportFeature::FILE_PATH_ID());
 -  std::string aFilePath = aFilePathAttr->value();
 -  if (aFilePath.empty() && !isMemoryExport)
 -    return;
 -
 -  exportFile(aFilePath, aFormat, isMemoryExport);
++      AttributeStringPtr aFormatAttr = this->string(ExchangePlugin_ExportFeature::FILE_FORMAT_ID());
++      std::string aFormat = aFormatAttr->value();
 +
-     AttributeStringPtr aFilePathAttr =
-         this->string(ExchangePlugin_ExportFeature::FILE_PATH_ID());
++      bool isMemoryExport = false;
++      AttributeStringPtr aTypeAttr = string(EXPORT_TYPE_ID());
++      if (aTypeAttr->isInitialized() && aTypeAttr->value() == "XAOMem")
++              isMemoryExport = true;
 +
-     std::string aFilePath = aFilePathAttr->value();
-     if (aFilePath.empty())
-         return;
++      AttributeStringPtr aFilePathAttr = this->string(ExchangePlugin_ExportFeature::FILE_PATH_ID());
++      std::string aFilePath = aFilePathAttr->value();
++      if (aFilePath.empty() && !isMemoryExport)
++              return;
 +
-     exportFile(aFilePath, aFormat);
++      exportFile(aFilePath, aFormat, isMemoryExport);
  }
  
- void ExchangePlugin_ExportFeature::exportFile(const std::string &theFileName,
-                                               const std::string &theFormat)
+ void ExchangePlugin_ExportFeature::exportFile(const std::string& theFileName,
+                                               const std::string& theFormat,
+                                               const bool         isMemoryExport)
  {
 -  std::string aFormatName = theFormat;
 -
 -  if (aFormatName.empty()) { // get default format for the extension
 -    if (isMemoryExport) return;
 -
 -    // ".brep" -> "BREP"
 -    std::string anExtension = GeomAlgoAPI_Tools::File_Tools::extension(theFileName);
 -    if (anExtension == "BREP" || anExtension == "BRP") {
 -      aFormatName = "BREP";
 -    } else if (anExtension == "STEP" || anExtension == "STP") {
 -      aFormatName = "STEP";
 -    } else if (anExtension == "IGES" || anExtension == "IGS") {
 -      aFormatName = "IGES-5.1";
 -    } else {
 -      aFormatName = anExtension;
 -    }
 -  }
 -
 -  if (aFormatName == "XAO") {
 -    exportXAO(theFileName, isMemoryExport);
 -    return;
 -  } else if (aFormatName == "STL") {
 -    exportSTL(theFileName);
 -    return;
 -  }
 -
 -  // make shape for export from selected shapes
 -  AttributeSelectionListPtr aSelectionListAttr =
 -      this->selectionList(ExchangePlugin_ExportFeature::SELECTION_LIST_ID());
 -  std::list<GeomShapePtr> aShapes;
 -  std::list<ResultPtr> aContexts;
 -  for (int i = 0, aSize = aSelectionListAttr->size(); i < aSize; ++i) {
 -    AttributeSelectionPtr anAttrSelection = aSelectionListAttr->value(i);
 -
 -    /// do not export pictures
 -    ResultPtr aBodyContext =
 -      std::dynamic_pointer_cast<ModelAPI_Result>(anAttrSelection->context());
 -    if (aBodyContext.get() && aBodyContext->hasTexture())
 -      continue;
 -
 -    std::shared_ptr<GeomAPI_Shape> aCurShape = anAttrSelection->value();
 -    if (aCurShape.get() == NULL)
 -      aCurShape = anAttrSelection->context()->shape();
 -    if (aCurShape.get() != NULL)
 -    {
 -      aShapes.push_back(aCurShape);
 -      aContexts.push_back(anAttrSelection->context());
 -    }
 -  }
 -
 -  // Store compound if we have more than one shape.
 -  std::shared_ptr<GeomAPI_Shape> aShape =
 -    aShapes.size() == 1 ? aShapes.front() : GeomAlgoAPI_CompoundBuilder::compound(aShapes);
 -
 -  // Perform the export
 -  std::string anError;
 -  bool aResult = false;
 -  if (aFormatName == "BREP") {
 -    aResult = BREPExport(theFileName, aFormatName, aShape, anError);
 -  } else if (aFormatName == "STEP") {
 -    aResult = STEPExport(theFileName, aShapes, aContexts, anError);
 -  } else if (aFormatName.substr(0, 4) == "IGES") {
 -    aResult = IGESExport(theFileName, aFormatName, aShape, anError);
 -  } else {
 -    anError = "Unsupported format: " + aFormatName;
 -  }
 -
 -  if (!aResult || !anError.empty()) {
 -    setError("An error occurred while exporting " + theFileName + ": " + anError);
 -    return;
 -  }
 +    std::string aFormatName = theFormat;
 +
-     if (aFormatName.empty())
-     { // get default format for the extension
-         // ".brep" -> "BREP"
-         std::string anExtension = GeomAlgoAPI_Tools::File_Tools::extension(theFileName);
-         if (anExtension == "BREP" || anExtension == "BRP")
-         {
-             aFormatName = "BREP";
-         }
-         else if (anExtension == "STEP" || anExtension == "STP")
-         {
-             aFormatName = "STEP";
-         }
-         else if (anExtension == "IGES" || anExtension == "IGS")
-         {
-             aFormatName = "IGES-5.1";
-         }
-         else if (anExtension == "C")
-         {
-             aFormatName = "ROOT";
-         }
-         else
-         {
-             aFormatName = anExtension;
-         }
-     }
-     if (aFormatName == "XAO")
-     {
-         exportXAO(theFileName);
-         return;
-     }
-     else if (aFormatName == "STL")
-     {
-         exportSTL(theFileName);
-         return;
-     }
-     else if (aFormatName == "ROOT")
-     {
-         exportROOT(theFileName);
-         return;
-     }
-     // make shape for export from selected shapes
-     AttributeSelectionListPtr aSelectionListAttr =
-         this->selectionList(ExchangePlugin_ExportFeature::SELECTION_LIST_ID());
-     std::list<GeomShapePtr> aShapes;
-     std::list<ResultPtr> aContexts;
-     for (int i = 0, aSize = aSelectionListAttr->size(); i < aSize; ++i)
-     {
-         AttributeSelectionPtr anAttrSelection = aSelectionListAttr->value(i);
-         /// do not export pictures
-         ResultPtr aBodyContext =
-             std::dynamic_pointer_cast<ModelAPI_Result>(anAttrSelection->context());
-         if (aBodyContext.get() && aBodyContext->hasTexture())
-             continue;
-         std::shared_ptr<GeomAPI_Shape> aCurShape = anAttrSelection->value();
-         if (aCurShape.get() == NULL)
-             aCurShape = anAttrSelection->context()->shape();
-         if (aCurShape.get() != NULL)
-         {
-             aShapes.push_back(aCurShape);
-             aContexts.push_back(anAttrSelection->context());
-         }
-     }
-     // Store compound if we have more than one shape.
-     std::shared_ptr<GeomAPI_Shape> aShape =
-         aShapes.size() == 1 ? aShapes.front() : GeomAlgoAPI_CompoundBuilder::compound(aShapes);
-     // Perform the export
-     std::string anError;
-     bool aResult = false;
-     if (aFormatName == "BREP")
-     {
-         aResult = BREPExport(theFileName, aFormatName, aShape, anError);
-     }
-     else if (aFormatName == "STEP")
-     {
-         aResult = STEPExport(theFileName, aShapes, aContexts, anError);
-     }
-     else if (aFormatName.substr(0, 4) == "IGES")
-     {
-         aResult = IGESExport(theFileName, aFormatName, aShape, anError);
-     }
-     else
-     {
-         anError = "Unsupported format: " + aFormatName;
-     }
-     if (!aResult || !anError.empty())
-     {
-         setError("An error occurred while exporting " + theFileName + ": " + anError);
-         return;
-     }
++      if (aFormatName.empty()) { // get default format for the extension
++              if (isMemoryExport) return;
++
++              // ".brep" -> "BREP"
++              std::string anExtension = GeomAlgoAPI_Tools::File_Tools::extension(theFileName);
++              if (anExtension == "BREP" || anExtension == "BRP") {
++              aFormatName = "BREP";
++              } else if (anExtension == "STEP" || anExtension == "STP") {
++              aFormatName = "STEP";
++              } else if (anExtension == "IGES" || anExtension == "IGS") {
++              aFormatName = "IGES-5.1";
++              } else {
++              aFormatName = anExtension;
++              }
++      }
++
++      if (aFormatName == "XAO") {
++              exportXAO(theFileName, isMemoryExport);
++              return;
++      } else if (aFormatName == "STL") {
++              exportSTL(theFileName);
++              return;
++      }
++
++      // make shape for export from selected shapes
++      AttributeSelectionListPtr aSelectionListAttr =
++              this->selectionList(ExchangePlugin_ExportFeature::SELECTION_LIST_ID());
++      std::list<GeomShapePtr> aShapes;
++      std::list<ResultPtr> aContexts;
++      for (int i = 0, aSize = aSelectionListAttr->size(); i < aSize; ++i){
++              AttributeSelectionPtr anAttrSelection = aSelectionListAttr->value(i);
++
++              /// do not export pictures
++              ResultPtr aBodyContext =
++                      std::dynamic_pointer_cast<ModelAPI_Result>(anAttrSelection->context());
++              if (aBodyContext.get() && aBodyContext->hasTexture())
++                      continue;
++
++              std::shared_ptr<GeomAPI_Shape> aCurShape = anAttrSelection->value();
++              if (aCurShape.get() == NULL)
++                      aCurShape = anAttrSelection->context()->shape();
++              if (aCurShape.get() != NULL)
++              {
++                      aShapes.push_back(aCurShape);
++                      aContexts.push_back(anAttrSelection->context());
++              }
++              else if (aFormatName == "STL")
++              {
++                      exportSTL(theFileName);
++                      return;
++              }
++              else if (aFormatName == "ROOT")
++              {
++                      exportROOT(theFileName);
++                      return;
++              }
++      }
++
++      // Store compound if we have more than one shape.
++      std::shared_ptr<GeomAPI_Shape> aShape =
++              aShapes.size() == 1 ? aShapes.front() : GeomAlgoAPI_CompoundBuilder::compound(aShapes);
++
++      // Perform the export
++      std::string anError;
++      bool aResult = false;
++      if (aFormatName == "BREP"){
++              aResult = BREPExport(theFileName, aFormatName, aShape, anError);
++      } else if (aFormatName == "STEP"){
++              aResult = STEPExport(theFileName, aShapes, aContexts, anError);
++      } else if (aFormatName.substr(0, 4) == "IGES"){
++              aResult = IGESExport(theFileName, aFormatName, aShape, anError);
++      } else {
++              anError = "Unsupported format: " + aFormatName;
++      }
++
++      if (!aResult || !anError.empty()){
++              setError("An error occurred while exporting " + theFileName + ": " + anError);
++              return;
++      }
  }
  
  /// Returns XAO string by the value from the table
- static std::string valToString(const ModelAPI_AttributeTables::Value &theVal,
-                                const ModelAPI_AttributeTables::ValueType &theType)
+ static std::string valToString(const ModelAPI_AttributeTables::ValuetheVal,
+                                const ModelAPI_AttributeTables::ValueTypetheType)
  {
-     std::ostringstream aStr; // the resulting string value
-     switch (theType)
-     {
-     case ModelAPI_AttributeTables::BOOLEAN:
-         aStr << (theVal.myBool ? "true" : "false");
-         break;
-     case ModelAPI_AttributeTables::INTEGER:
-         aStr << theVal.myInt;
-         break;
-     case ModelAPI_AttributeTables::DOUBLE:
-         aStr << theVal.myDouble;
-         break;
-     case ModelAPI_AttributeTables::STRING:
-         aStr << theVal.myStr;
-         break;
-     }
-     return aStr.str();
+   std::ostringstream aStr; // the resulting string value
+   switch(theType) {
+   case ModelAPI_AttributeTables::BOOLEAN:
+     aStr<<(theVal.myBool ? "true" : "false");
+     break;
+   case ModelAPI_AttributeTables::INTEGER:
+     aStr<<theVal.myInt;
+     break;
+   case ModelAPI_AttributeTables::DOUBLE:
+     aStr<<theVal.myDouble;
+     break;
+   case ModelAPI_AttributeTables::STRING:
+     aStr<<theVal.myStr;
+     break;
+   }
+   return aStr.str();
  }
  
 -void ExchangePlugin_ExportFeature::exportSTL(const std::stringtheFileName)
 +void ExchangePlugin_ExportFeature::exportSTL(const std::string &theFileName)
  {
 -  // Get shape.
 -  AttributeSelectionPtr aSelection = selection(STL_OBJECT_SELECTED());
 -  GeomShapePtr aShape = aSelection->value();
 -  if (!aShape.get()) {
 -    aShape = aSelection->context()->shape();
 -  }
 +    // Get shape.
 +    AttributeSelectionPtr aSelection = selection(STL_OBJECT_SELECTED());
 +    GeomShapePtr aShape = aSelection->value();
-     if (!aShape.get())
-     {
++    if (!aShape.get()){
 +        aShape = aSelection->context()->shape();
 +    }
  
 -  // Get relative value and percent flag.
 -  double aValue;
 -  bool anIsRelative = false;
 -  bool anIsASCII = false;
 +    // Get relative value and percent flag.
 +    double aValue;
 +    bool anIsRelative = false;
 +    bool anIsASCII = false;
  
-     if (string(STL_DEFLECTION_TYPE())->value() == STL_DEFLECTION_TYPE_RELATIVE())
-     {
 -  if (string(STL_DEFLECTION_TYPE())->value() == STL_DEFLECTION_TYPE_RELATIVE()) {
 -    aValue = real(STL_RELATIVE())->value();
 -    anIsRelative = true;
 -  } else {
 -    aValue = real(STL_ABSOLUTE())->value();
 -  }
++    if (string(STL_DEFLECTION_TYPE())->value() == STL_DEFLECTION_TYPE_RELATIVE()) {
 +        aValue = real(STL_RELATIVE())->value();
 +        anIsRelative = true;
-     }
-     else
-     {
++    } else {
 +        aValue = real(STL_ABSOLUTE())->value();
 +    }
  
-     if (string(STL_FILE_TYPE())->value() == STL_FILE_TYPE_ASCII())
-     {
 -  if (string(STL_FILE_TYPE())->value() == STL_FILE_TYPE_ASCII()) {
 -    anIsASCII = true;
 -  }
 -  // Perform the export
 -  std::string anError;
 -  bool aResult = false;
 -
 -  aResult = STLExport(theFileName,
 -                      aShape,
 -                      aValue,
 -                      anIsRelative,
 -                      anIsASCII,
 -                      anError);
 -
 -  if (!aResult || !anError.empty()) {
 -    setError("An error occurred while exporting " + theFileName + ": " + anError);
 -    return;
 -  }
++    if (string(STL_FILE_TYPE())->value() == STL_FILE_TYPE_ASCII()) {
 +        anIsASCII = true;
 +    }
 +    // Perform the export
 +    std::string anError;
 +    bool aResult = false;
 +
 +    aResult = STLExport(theFileName,
 +                        aShape,
 +                        aValue,
 +                        anIsRelative,
 +                        anIsASCII,
 +                        anError);
 +
 +    if (!aResult || !anError.empty())
 +    {
 +        setError("An error occurred while exporting " + theFileName + ": " + anError);
 +        return;
 +    }
  }
  
- void ExchangePlugin_ExportFeature::exportXAO(const std::string &theFileName)
- {
-     try
-     {
  
-         std::string anError;
-         XAO::Xao aXao;
-         // author
-         std::string anAuthor = string(ExchangePlugin_ExportFeature::XAO_AUTHOR_ID())->value();
-         aXao.setAuthor(anAuthor);
-         // make shape for export from all results
-         std::list<GeomShapePtr> aShapes;
-         std::list<ResultPtr> aResults;
-         std::list<DocumentPtr> aDocuments;           /// documents of Parts selected and used in export
-         std::map<DocumentPtr, GeomTrsfPtr> aDocTrsf; /// translation of the part
-         bool anExCludedIsImage = false;
-         AttributeSelectionListPtr aSelection = selectionList(XAO_SELECTION_LIST_ID());
-         bool aIsSelection = aSelection->isInitialized() && aSelection->size() > 0;
-         if (aIsSelection)
-         { // a mode for export to geom result by result
-             for (int a = 0; a < aSelection->size(); a++)
-             {
-                 AttributeSelectionPtr anAttr = aSelection->value(a);
-                 ResultPtr aBodyContext =
-                     std::dynamic_pointer_cast<ModelAPI_Result>(anAttr->context());
-                 if (aBodyContext.get() && !aBodyContext->isDisabled() && aBodyContext->shape().get())
-                 {
-                     /// do not export pictures
-                     if (aBodyContext->hasTexture())
-                     {
-                         anExCludedIsImage = true;
-                         continue;
-                     }
-                     aResults.push_back(aBodyContext);
-                     GeomShapePtr aShape = anAttr->value();
-                     if (!aShape.get())
-                         aShape = aBodyContext->shape();
-                     aShapes.push_back(aShape);
-                     if (aBodyContext->groupName() == ModelAPI_ResultPart::group())
-                     {
-                         ResultPartPtr aResPart = std::dynamic_pointer_cast<ModelAPI_ResultPart>(aBodyContext);
-                         DocumentPtr aPartDoc = aResPart->partDoc();
-                         if (!aPartDoc.get() || !aPartDoc->isOpened())
-                         { // document is not accessible
-                             std::string msg = "Can not export XAO for not loaded part";
-                             Events_InfoMessage("ExportFeature", msg, this).send();
-                             return;
-                         }
-                         else
-                         {
-                             aDocuments.push_back(aPartDoc);
-                             aDocTrsf[aPartDoc] = aResPart->summaryTrsf();
-                         }
-                     }
-                 }
-             }
-         }
-         else
-         {
-             int aBodyCount = document()->size(ModelAPI_ResultBody::group());
-             for (int aBodyIndex = 0; aBodyIndex < aBodyCount; ++aBodyIndex)
-             {
-                 ResultBodyPtr aResultBody =
-                     std::dynamic_pointer_cast<ModelAPI_ResultBody>(
-                         document()->object(ModelAPI_ResultBody::group(), aBodyIndex));
-                 if (!aResultBody.get())
-                     continue;
-                 aShapes.push_back(aResultBody->shape());
-                 aResults.push_back(aResultBody);
-             }
-         }
-         if (aShapes.empty())
-         {
-             if (!anExCludedIsImage)
-                 setError("No shapes to export");
-             return;
-         }
-         GeomShapePtr aShape = (aShapes.size() == 1)
-                                   ? *aShapes.begin()
-                                   : GeomAlgoAPI_CompoundBuilder::compound(aShapes);
-         SetShapeToXAO(aShape, &aXao, anError);
-         if (!anError.empty())
-         {
-             setError("An error occurred while exporting " + theFileName + ": " + anError);
-             return;
-         }
-         // geometry name
-         std::string aGeometryName = string(ExchangePlugin_ExportFeature::XAO_GEOMETRY_NAME_ID())->value();
-         if (aGeometryName.empty() && aResults.size() == 1)
-         {
-             // get the name from the first result
-             ResultPtr aResultBody = *aResults.begin();
-             aGeometryName = Locale::Convert::toString(aResultBody->data()->name());
-         }
-         aXao.getGeometry()->setName(aGeometryName);
-         std::set<ResultPtr> allResultsCashed; // cash to speed up searching in all results selected
-         // iterate all documents used
-         if (aDocuments.empty())
-             aDocuments.push_back(document());
-         std::list<DocumentPtr>::iterator aDoc = aDocuments.begin();
-         for (; aDoc != aDocuments.end(); aDoc++)
-         {
-             // groups
-             int aGroupCount = (*aDoc)->size(ModelAPI_ResultGroup::group());
-             for (int aGroupIndex = 0; aGroupIndex < aGroupCount; ++aGroupIndex)
-             {
-                 ResultGroupPtr aResultGroup = std::dynamic_pointer_cast<ModelAPI_ResultGroup>(
-                     (*aDoc)->object(ModelAPI_ResultGroup::group(), aGroupIndex));
-                 if (!aResultGroup.get() || !aResultGroup->shape().get())
-                     continue;
-                 FeaturePtr aGroupFeature = (*aDoc)->feature(aResultGroup);
-                 AttributeSelectionListPtr aSelectionList =
-                     aGroupFeature->selectionList("group_list");
-                 if (!ModelAPI_Tools::isInResults(aSelectionList,
-                                                  aResults,
-                                                  allResultsCashed)) // skip group not used in result
-                     continue;
-                 // conversion of dimension
-                 std::string aSelectionType = aSelectionList->selectionType();
-                 GeomAPI_Shape::ShapeType aSelType = GeomAPI_Shape::shapeTypeByStr(aSelectionType);
-                 std::string aDimensionString =
-                     ExchangePlugin_Tools::selectionType2xaoDimension(aSelectionType);
-                 XAO::Dimension aGroupDimension = XAO::XaoUtils::stringToDimension(aDimensionString);
-                 XAO::Group *aXaoGroup = aXao.addGroup(aGroupDimension,
-                                                       Locale::Convert::toString(aResultGroup->data()->name()));
-                 try
-                 {
-                     GeomAPI_ShapeExplorer aGroupResExplorer(aResultGroup->shape(), aSelType);
-                     for (; aGroupResExplorer.more(); aGroupResExplorer.next())
-                     {
-                         GeomShapePtr aGroupShape = aGroupResExplorer.current();
-                         if (aDocTrsf.find(*aDoc) != aDocTrsf.end())
-                             aGroupShape->move(aDocTrsf[*aDoc]);
-                         int aReferenceID = GeomAlgoAPI_CompoundBuilder::id(aShape, aGroupShape);
-                         if (aReferenceID == 0) // selected value does not found in the exported shape
-                             continue;
-                         std::string aReferenceString = XAO::XaoUtils::intToString(aReferenceID);
-                         int anElementID =
-                             aXao.getGeometry()->getElementIndexByReference(aGroupDimension, aReferenceString);
-                         aXaoGroup->add(anElementID);
-                     }
-                 }
-                 catch (XAO::XAO_Exception &e)
-                 {
-                     // LCOV_EXCL_START
-                     std::string msg = "An error occurred while exporting group " +
-                                       Locale::Convert::toString(aResultGroup->data()->name());
-                     msg += ".\n";
-                     msg += e.what();
-                     msg += "\n";
-                     msg += "=> skipping this group from XAO export.";
-                     Events_InfoMessage("ExportFeature", msg, this).send();
-                     aXao.removeGroup(aXaoGroup);
-                     // LCOV_EXCL_STOP
-                 }
-             }
-             // fields
-             int aFieldCount = (*aDoc)->size(ModelAPI_ResultField::group());
-             for (int aFieldIndex = 0; aFieldIndex < aFieldCount; ++aFieldIndex)
-             {
-                 ResultFieldPtr aResultField = std::dynamic_pointer_cast<ModelAPI_ResultField>(
-                     (*aDoc)->object(ModelAPI_ResultField::group(), aFieldIndex));
-                 FeaturePtr aFieldFeature = (*aDoc)->feature(aResultField);
-                 AttributeSelectionListPtr aSelectionList =
-                     aFieldFeature->selectionList("selected");
-                 std::string aSelectionType = aSelectionList->selectionType();
-                 bool isWholePart = aSelectionType == "part";
-                 // skip field not used in results
-                 if (!isWholePart &&
-                     !ModelAPI_Tools::isInResults(aSelectionList, aResults, allResultsCashed))
-                     continue;
-                 // conversion of dimension
-                 std::string aDimensionString =
-                     ExchangePlugin_Tools::selectionType2xaoDimension(aSelectionType);
-                 XAO::Dimension aFieldDimension = XAO::XaoUtils::stringToDimension(aDimensionString);
-                 // get tables and their type
-                 std::shared_ptr<ModelAPI_AttributeTables> aTables = aFieldFeature->tables("values");
-                 std::string aTypeString = ExchangePlugin_Tools::valuesType2xaoType(aTables->type());
-                 XAO::Type aFieldType = XAO::XaoUtils::stringToFieldType(aTypeString);
-                 XAO::Field *aXaoField = aXao.addField(aFieldType, aFieldDimension, aTables->columns(),
-                                                       Locale::Convert::toString(aResultField->data()->name()));
-                 try
-                 {
-                     // set components names
-                     AttributeStringArrayPtr aComponents = aFieldFeature->stringArray("components_names");
-                     for (int aComp = 0; aComp < aComponents->size(); aComp++)
-                     {
-                         std::string aName = aComponents->value(aComp);
-                         aXaoField->setComponentName(aComp, aName);
-                     }
-                     AttributeIntArrayPtr aStamps = aFieldFeature->intArray("stamps");
-                     for (int aStepIndex = 0; aStepIndex < aTables->tables(); aStepIndex++)
-                     {
-                         XAO::Step *aStep = aXaoField->addNewStep(aStepIndex + 1);
-                         aStep->setStep(aStepIndex + 1);
-                         int aStampIndex = aStamps->value(aStepIndex);
-                         aStep->setStamp(aStampIndex);
-                         int aNumElements = isWholePart ? aXaoField->countElements() : aTables->rows();
-                         int aNumComps = aTables->columns();
-                         std::set<int> aFilledIDs; // to fill the rest by defaults
-                         // omit default values first row
-                         for (int aRow = isWholePart ? 0 : 1; aRow < aNumElements; aRow++)
-                         {
-                             for (int aCol = 0; aCol < aNumComps; aCol++)
-                             {
-                                 int anElementID = 0;
-                                 if (!isWholePart)
-                                 {
-                                     // element index actually is the ID of the selection
-                                     AttributeSelectionPtr aSel = aSelectionList->value(aRow - 1);
-                                     int aReferenceID = GeomAlgoAPI_CompoundBuilder::id(aShape, aSel->value());
-                                     if (aReferenceID == 0) // selected value does not found in the exported shape
-                                         continue;
-                                     std::string aReferenceString = XAO::XaoUtils::intToString(aReferenceID);
-                                     anElementID = aXao.getGeometry()->getElementIndexByReference(aFieldDimension, aReferenceString);
-                                 }
-                                 ModelAPI_AttributeTables::Value aVal = aTables->value(
-                                     isWholePart ? 0 : aRow, aCol, aStepIndex);
-                                 std::string aStrVal = valToString(aVal, aTables->type());
-                                 aStep->setStringValue(isWholePart ? aRow : anElementID, aCol, aStrVal);
-                                 aFilledIDs.insert(anElementID);
-                             }
-                         }
-                         if (!isWholePart)
-                         { // fill the rest values by default ones
-                             XAO::GeometricElementList::iterator allElem =
-                                 aXao.getGeometry()->begin(aFieldDimension);
-                             for (; allElem != aXao.getGeometry()->end(aFieldDimension); allElem++)
-                             {
-                                 if (aFilledIDs.find(allElem->first) != aFilledIDs.end())
-                                     continue;
-                                 for (int aCol = 0; aCol < aNumComps; aCol++)
-                                 {
-                                     // default value
-                                     ModelAPI_AttributeTables::Value aVal = aTables->value(0, aCol, aStepIndex);
-                                     std::string aStrVal = valToString(aVal, aTables->type());
-                                     aStep->setStringValue(allElem->first, aCol, aStrVal);
-                                 }
-                             }
-                         }
-                     }
-                 }
-                 catch (XAO::XAO_Exception &e)
-                 {
-                     // LCOV_EXCL_START
-                     std::string msg = "An error occurred while exporting field " +
-                                       Locale::Convert::toString(aResultField->data()->name());
-                     msg += ".\n";
-                     msg += e.what();
-                     msg += "\n";
-                     msg += "=> skipping this field from XAO export.";
-                     Events_InfoMessage("ExportFeature", msg, this).send();
-                     aXao.removeField(aXaoField);
-                     // LCOV_EXCL_STOP
-                 }
-             }
-         }
-         // exporting
-         XAOExport(theFileName, &aXao, anError);
-         if (!anError.empty())
-         {
-             setError("An error occurred while exporting " + theFileName + ": " + anError);
-             return;
-         }
-         // LCOV_EXCL_START
-     }
-     catch (XAO::XAO_Exception &e)
-     {
-         std::string anError = e.what();
-         setError("An error occurred while exporting " + theFileName + ": " + anError);
-         return;
-     }
-     // LCOV_EXCL_STOP
+ void ExchangePlugin_ExportFeature::exportXAO(const std::string& theFileName,
+                                              const bool         isMemoryExport)
+ {
 -  try {
 -
 -  std::string anError;
 -  XAO::Xao aXao;
 -
 -  // author
 -
 -  std::string anAuthor = string(ExchangePlugin_ExportFeature::XAO_AUTHOR_ID())->value();
 -  aXao.setAuthor(anAuthor);
 -
 -  // make shape for export from all results
 -  std::list<GeomShapePtr> aShapes;
 -  std::list<ResultPtr> aResults;
 -  std::list<DocumentPtr> aDocuments; /// documents of Parts selected and used in export
 -  std::map<DocumentPtr, GeomTrsfPtr> aDocTrsf; /// translation of the part
 -
 -  bool anExCludedIsImage = false;
 -  AttributeSelectionListPtr aSelection = selectionList(XAO_SELECTION_LIST_ID());
 -  bool aIsSelection = aSelection->isInitialized() && aSelection->size() > 0;
 -  if (aIsSelection) { // a mode for export to geom result by result
 -    for (int a = 0; a < aSelection->size(); a++) {
 -      AttributeSelectionPtr anAttr = aSelection->value(a);
 -      ResultPtr aBodyContext =
 -        std::dynamic_pointer_cast<ModelAPI_Result>(anAttr->context());
 -      if (aBodyContext.get() && !aBodyContext->isDisabled() && aBodyContext->shape().get()) {
 -          /// do not export pictures
 -          if (aBodyContext->hasTexture()){
 -            anExCludedIsImage = true;
 -            continue;
 -          }
 -        aResults.push_back(aBodyContext);
 -        GeomShapePtr aShape = anAttr->value();
 -        if (!aShape.get())
 -          aShape = aBodyContext->shape();
 -        aShapes.push_back(aShape);
 -        if (aBodyContext->groupName() == ModelAPI_ResultPart::group()) {
 -          ResultPartPtr aResPart = std::dynamic_pointer_cast<ModelAPI_ResultPart>(aBodyContext);
 -          DocumentPtr aPartDoc = aResPart->partDoc();
 -          if (!aPartDoc.get() || !aPartDoc->isOpened()) { // document is not accessible
 -            std::string msg = "Can not export XAO for not loaded part";
 -            Events_InfoMessage("ExportFeature", msg, this).send();
 -            return;
 -          } else {
 -            aDocuments.push_back(aPartDoc);
 -            aDocTrsf[aPartDoc] = aResPart->summaryTrsf();
 -          }
 -        }
 -      }
 -    }
 -  } else {
 -    int aBodyCount = document()->size(ModelAPI_ResultBody::group());
 -    for (int aBodyIndex = 0; aBodyIndex < aBodyCount; ++aBodyIndex) {
 -      ResultBodyPtr aResultBody =
 -          std::dynamic_pointer_cast<ModelAPI_ResultBody>(
 -              document()->object(ModelAPI_ResultBody::group(), aBodyIndex));
 -      if (!aResultBody.get())
 -        continue;
 -      aShapes.push_back(aResultBody->shape());
 -      aResults.push_back(aResultBody);
 -    }
 -  }
 -  if (aShapes.empty()) {
 -    if(!anExCludedIsImage)
 -      setError("No shapes to export");
 -    return;
 -  }
++    try {
++
++              std::string anError;
++              XAO::Xao aXao;
++
++              // author
++              std::string anAuthor = string(ExchangePlugin_ExportFeature::XAO_AUTHOR_ID())->value();
++              aXao.setAuthor(anAuthor);
++
++              // make shape for export from all results
++              std::list<GeomShapePtr> aShapes;
++              std::list<ResultPtr> aResults;
++              std::list<DocumentPtr> aDocuments;           /// documents of Parts selected and used in export
++              std::map<DocumentPtr, GeomTrsfPtr> aDocTrsf; /// translation of the part
++
++              bool anExCludedIsImage = false;
++              AttributeSelectionListPtr aSelection = selectionList(XAO_SELECTION_LIST_ID());
++              bool aIsSelection = aSelection->isInitialized() && aSelection->size() > 0;
++              if (aIsSelection)
++              { // a mode for export to geom result by result
++                      for (int a = 0; a < aSelection->size(); a++)
++                      {
++                              AttributeSelectionPtr anAttr = aSelection->value(a);
++                              ResultPtr aBodyContext =
++                                      std::dynamic_pointer_cast<ModelAPI_Result>(anAttr->context());
++                              if (aBodyContext.get() && !aBodyContext->isDisabled() && aBodyContext->shape().get()) {
++                                      /// do not export pictures
++                                      if (aBodyContext->hasTexture()) {
++                                              anExCludedIsImage = true;
++                                              continue;
++                                      }
++                                      aResults.push_back(aBodyContext);
++                                      GeomShapePtr aShape = anAttr->value();
++                                      if (!aShape.get())
++                                              aShape = aBodyContext->shape();
++                                      aShapes.push_back(aShape);
++                                      if (aBodyContext->groupName() == ModelAPI_ResultPart::group()) {
++                                              ResultPartPtr aResPart = std::dynamic_pointer_cast<ModelAPI_ResultPart>(aBodyContext);
++                                              DocumentPtr aPartDoc = aResPart->partDoc();
++                                              if (!aPartDoc.get() || !aPartDoc->isOpened()) { // document is not accessible
++                                                      std::string msg = "Can not export XAO for not loaded part";
++                                                      Events_InfoMessage("ExportFeature", msg, this).send();
++                                                      return;
++                                              } else {
++                                                      aDocuments.push_back(aPartDoc);
++                                                      aDocTrsf[aPartDoc] = aResPart->summaryTrsf();
++                                              }
++                                      }
++                              }
++                      }
++              } else {
++                      int aBodyCount = document()->size(ModelAPI_ResultBody::group());
++                      for (int aBodyIndex = 0; aBodyIndex < aBodyCount; ++aBodyIndex) {
++                              ResultBodyPtr aResultBody =
++                                      std::dynamic_pointer_cast<ModelAPI_ResultBody>(
++                                              document()->object(ModelAPI_ResultBody::group(), aBodyIndex));
++                              if (!aResultBody.get())
++                                      continue;
++                              aShapes.push_back(aResultBody->shape());
++                              aResults.push_back(aResultBody);
++                      }
++              }
++              if (aShapes.empty()) {
++                      if (!anExCludedIsImage)
++                              setError("No shapes to export");
++                      return;
++              }
++
++
++      GeomShapePtr aShape = (aShapes.size() == 1)
++              ? *aShapes.begin()
++              : GeomAlgoAPI_CompoundBuilder::compound(aShapes);
++
++      SetShapeToXAO(aShape, &aXao, anError);
++
++      if (!anError.empty()) {
++              setError("An error occurred while exporting " + theFileName + ": " + anError);
++              return;
++      }
++
++      // geometry name
++      std::string aGeometryName = string(ExchangePlugin_ExportFeature::XAO_GEOMETRY_NAME_ID())->value();
++      if (aGeometryName.empty() && aResults.size() == 1) {
++              // get the name from the first result
++              ResultPtr aResultBody = *aResults.begin();
++              aGeometryName = Locale::Convert::toString(aResultBody->data()->name());
++              if (isMemoryExport) {
++                      // for python dump
++                      string(ExchangePlugin_ExportFeature::XAO_GEOMETRY_NAME_ID())->setValue(aGeometryName);
++                      // or
++                      //data()->setName(Locale::Convert::toWString(aGeometryName));
++              }
++      }
++
++      aXao.getGeometry()->setName(aGeometryName);
++
++      std::set<ResultPtr> allResultsCashed; // cash to speed up searching in all results selected
++
++      // [bos #38360] [CEA] improve performances of exportXAO and PublishToStudy
++      GeomAPI_IndexedMapOfShape aSubShapesMap;
++      bool isSubShapesMap = false; // we will init it only if required (for performance reason)
++
++      // iterate all documents used
++      if (aDocuments.empty())
++              aDocuments.push_back(document());
++      std::list<DocumentPtr>::iterator aDoc = aDocuments.begin();
++      for(; aDoc != aDocuments.end(); aDoc++) {
++              // groups
++              int aGroupCount = (*aDoc)->size(ModelAPI_ResultGroup::group());
++              for (int aGroupIndex = 0; aGroupIndex < aGroupCount; ++aGroupIndex) {
++                      ResultGroupPtr aResultGroup = std::dynamic_pointer_cast<ModelAPI_ResultGroup>(
++                              (*aDoc)->object(ModelAPI_ResultGroup::group(), aGroupIndex));
++                      if (!aResultGroup.get() || !aResultGroup->shape().get())
++                              continue;
++
++                      FeaturePtr aGroupFeature = (*aDoc)->feature(aResultGroup);
++
++                      AttributeSelectionListPtr aSelectionList =
++                              aGroupFeature->selectionList("group_list");
++                      if (!ModelAPI_Tools::isInResults(aSelectionList,
++                                                                                      aResults,
++                                                                                      allResultsCashed))// skip group not used in result
++                              continue;
++
++                      // conversion of dimension
++                      std::string aSelectionType = aSelectionList->selectionType();
++                      GeomAPI_Shape::ShapeType aSelType = GeomAPI_Shape::shapeTypeByStr(aSelectionType);
++                      std::string aDimensionString =
++                              ExchangePlugin_Tools::selectionType2xaoDimension(aSelectionType);
++                      XAO::Dimension aGroupDimension = XAO::XaoUtils::stringToDimension(aDimensionString);
++                      XAO::Group* aXaoGroup = aXao.addGroup(aGroupDimension,
++                              Locale::Convert::toString(aResultGroup->data()->name()));
++
++                      try {
++                              GeomAPI_ShapeExplorer aGroupResExplorer(aResultGroup->shape(), aSelType);
++                              for(; aGroupResExplorer.more(); aGroupResExplorer.next()) {
++                                      GeomShapePtr aGroupShape = aGroupResExplorer.current();
++                                      if (aDocTrsf.find(*aDoc) != aDocTrsf.end())
++                                              aGroupShape->move(aDocTrsf[*aDoc]);
++
++                                      if (!isSubShapesMap) {
++                                              aSubShapesMap.MapShapes(aShape);
++                                              isSubShapesMap = true;
++                                      }
++                                      int aReferenceID = aSubShapesMap.FindIndexEqualLocations(aGroupShape);
++                                      if (aReferenceID == 0) // selected value does not found in the exported shape
++                                              continue;
++                                      std::string aReferenceString = XAO::XaoUtils::intToString(aReferenceID);
++                                      int anElementID =
++                                              aXao.getGeometry()->getElementIndexByReference(aGroupDimension, aReferenceString);
++                                      aXaoGroup->add(anElementID);
++                              }
++                      } catch (XAO::XAO_Exception& e) {
++                              // LCOV_EXCL_START
++                              std::string msg = "An error occurred while exporting group " +
++                              Locale::Convert::toString(aResultGroup->data()->name());
++                              msg += ".\n";
++                              msg += e.what();
++                              msg += "\n";
++                              msg += "=> skipping this group from XAO export.";
++                              Events_InfoMessage("ExportFeature", msg, this).send();
++                              aXao.removeGroup(aXaoGroup);
++                              // LCOV_EXCL_STOP
++                      }
++              }
++
++              // fields
++              int aFieldCount = (*aDoc)->size(ModelAPI_ResultField::group());
++              for (int aFieldIndex = 0; aFieldIndex < aFieldCount; ++aFieldIndex)
++              {
++                      ResultFieldPtr aResultField = std::dynamic_pointer_cast<ModelAPI_ResultField>(
++                              (*aDoc)->object(ModelAPI_ResultField::group(), aFieldIndex));
++
++                      FeaturePtr aFieldFeature = (*aDoc)->feature(aResultField);
++
++                      AttributeSelectionListPtr aSelectionList =
++                              aFieldFeature->selectionList("selected");
++                      std::string aSelectionType = aSelectionList->selectionType();
++                      bool isWholePart = aSelectionType == "part";
++                      // skip field not used in results
++                      if (!isWholePart &&
++                              !ModelAPI_Tools::isInResults(aSelectionList, aResults, allResultsCashed))
++                              continue;
++
++                      // conversion of dimension
++                      std::string aDimensionString =
++                              ExchangePlugin_Tools::selectionType2xaoDimension(aSelectionType);
++                      XAO::Dimension aFieldDimension = XAO::XaoUtils::stringToDimension(aDimensionString);
++                      // get tables and their type
++                      std::shared_ptr<ModelAPI_AttributeTables> aTables = aFieldFeature->tables("values");
++                      std::string aTypeString = ExchangePlugin_Tools::valuesType2xaoType(aTables->type());
++                      XAO::Type aFieldType = XAO::XaoUtils::stringToFieldType(aTypeString);
++
++                      XAO::Field *aXaoField = aXao.addField(aFieldType, aFieldDimension, aTables->columns(),
++                                                                                                Locale::Convert::toString(aResultField->data()->name()));
++
++                      try
++                      {
++                              // set components names
++                              AttributeStringArrayPtr aComponents = aFieldFeature->stringArray("components_names");
++                              for (int aComp = 0; aComp < aComponents->size(); aComp++)
++                              {
++                                      std::string aName = aComponents->value(aComp);
++                                      aXaoField->setComponentName(aComp, aName);
++                              }
++
++                              AttributeIntArrayPtr aStamps = aFieldFeature->intArray("stamps");
++                              for (int aStepIndex = 0; aStepIndex < aTables->tables(); aStepIndex++)
++                              {
++                                      XAO::Step *aStep = aXaoField->addNewStep(aStepIndex + 1);
++                                      aStep->setStep(aStepIndex + 1);
++                                      int aStampIndex = aStamps->value(aStepIndex);
++                                      aStep->setStamp(aStampIndex);
++                                      int aNumElements = isWholePart ? aXaoField->countElements() : aTables->rows();
++                                      int aNumComps = aTables->columns();
++                                      std::set<int> aFilledIDs; // to fill the rest by defaults
++                                      // omit default values first row
++                                      for (int aRow = isWholePart ? 0 : 1; aRow < aNumElements; aRow++)
++                                      {
++                                              for (int aCol = 0; aCol < aNumComps; aCol++)
++                                              {
++                                                      int anElementID = 0;
++                                                      if (!isWholePart)
++                                                      {
++                                                              // element index actually is the ID of the selection
++                                                              AttributeSelectionPtr aSel = aSelectionList->value(aRow - 1);
++                                                              if (!isSubShapesMap)
++                                                              {
++                                                                      aSubShapesMap.MapShapes(aShape);
++                                                                      isSubShapesMap = true;
++                                                              }
++                                                              int aReferenceID = aSubShapesMap.FindIndexEqualLocations(aSel->value());
++                                                              if (aReferenceID == 0) // selected value does not found in the exported shape
++                                                                      continue;
++
++                                                              std::string aReferenceString = XAO::XaoUtils::intToString(aReferenceID);
++                                                              anElementID = aXao.getGeometry()->getElementIndexByReference(aFieldDimension, aReferenceString);
++                                                      }
++
++                                                      ModelAPI_AttributeTables::Value aVal = aTables->value(
++                                                              isWholePart ? 0 : aRow, aCol, aStepIndex);
++                                                      std::string aStrVal = valToString(aVal, aTables->type());
++                                                      aStep->setStringValue(isWholePart ? aRow : anElementID, aCol, aStrVal);
++                                                      aFilledIDs.insert(anElementID);
++                                              }
++                                      }
++                                      if (!isWholePart)
++                                      { // fill the rest values by default ones
++                                              XAO::GeometricElementList::iterator allElem =
++                                                      aXao.getGeometry()->begin(aFieldDimension);
++                                              for (; allElem != aXao.getGeometry()->end(aFieldDimension); allElem++)
++                                              {
++                                                      if (aFilledIDs.find(allElem->first) != aFilledIDs.end())
++                                                              continue;
++                                                      for (int aCol = 0; aCol < aNumComps; aCol++)
++                                                      {
++                                                              // default value
++                                                              ModelAPI_AttributeTables::Value aVal = aTables->value(0, aCol, aStepIndex);
++                                                              std::string aStrVal = valToString(aVal, aTables->type());
++                                                              aStep->setStringValue(allElem->first, aCol, aStrVal);
++                                                      }
++                                              }
++                                      }
++                              }
++                      }
++                      catch (XAO::XAO_Exception &e)
++                      {
++                              // LCOV_EXCL_START
++                              std::string msg = "An error occurred while exporting field " +
++                                                                Locale::Convert::toString(aResultField->data()->name());
++                              msg += ".\n";
++                              msg += e.what();
++                              msg += "\n";
++                              msg += "=> skipping this field from XAO export.";
++                              Events_InfoMessage("ExportFeature", msg, this).send();
++                              aXao.removeField(aXaoField);
++                              // LCOV_EXCL_STOP
++                      }
++              }
++      }
++
++      // exporting
++      if (isMemoryExport)
++      {
++              string(ExchangePlugin_ExportFeature::MEMORY_BUFFER_ID())->setValue(XAOExportMem(&aXao, anError));
++      }
++      else
++      {
++              std::string aShapeFile("");
++              AttributeBooleanPtr aShapeSeparateAttr = boolean(XAO_SHAPE_FILE_SEPARATE_ID());
++              if (aShapeSeparateAttr->isInitialized() &&
++                      aShapeSeparateAttr->value() == true)
++              {
++                      aShapeFile = theFileName + ".brep";
++              }
++              else
++              {
++                      AttributeStringPtr aShapeFileAttr = string(XAO_SHAPE_FILE_PATH_ID());
++                      if (aShapeFileAttr->isInitialized())
++                              aShapeFile = aShapeFileAttr->value();
++              }
++
++              XAOExport(theFileName, &aXao, anError, aShapeFile);
++      }
++
++      if (!anError.empty())
++      {
++              setError("An error occurred while exporting " + theFileName + ": " + anError);
++              return;
++      }
++
++      // LCOV_EXCL_START
++      }
++      catch (XAO::XAO_Exception &e)
++      {
++              std::string anError = e.what();
++              setError("An error occurred while exporting " + theFileName + ": " + anError);
++              return;
++      }
++      // LCOV_EXCL_STOP
 +}
  
 +void ExchangePlugin_ExportFeature::exportROOT(const std::string &theFileName)
 +{
 +    // Get data from feature
 +    std::string aName = string(ExchangePlugin_ExportFeature::ROOT_MANAGER_NAME_ID())->value();
 +    std::string aTitle = string(ExchangePlugin_ExportFeature::ROOT_MANAGER_TITLE_ID())->value();
  
 -  GeomShapePtr aShape = (aShapes.size() == 1)
 -      ? *aShapes.begin()
 -      : GeomAlgoAPI_CompoundBuilder::compound(aShapes);
 +    FeaturePtr aFeature;
  
 -  SetShapeToXAO(aShape, &aXao, anError);
 +    std::shared_ptr<GeomAlgoAPI_ROOTExport> anAlgo(new GeomAlgoAPI_ROOTExport(theFileName));
  
 -  if (!anError.empty()) {
 -    setError("An error occurred while exporting " + theFileName + ": " + anError);
 -    return;
 -  }
 +    std::list<std::string> listNames = ExchangePlugin_Tools::split(theFileName, _separator_);
 +    listNames = ExchangePlugin_Tools::split(listNames.back(), '.');
  
 -  // geometry name
 -  std::string aGeometryName = string(ExchangePlugin_ExportFeature::XAO_GEOMETRY_NAME_ID())->value();
 -  if (aGeometryName.empty() && aResults.size() == 1) {
 -    // get the name from the first result
 -    ResultPtr aResultBody = *aResults.begin();
 -    aGeometryName = Locale::Convert::toString(aResultBody->data()->name());
 -    if (isMemoryExport) {
 -      // for python dump
 -      string(ExchangePlugin_ExportFeature::XAO_GEOMETRY_NAME_ID())->setValue(aGeometryName);
 -      // or
 -      //data()->setName(Locale::Convert::toWString(aGeometryName));
 -    }
 -  }
 +    // Create the head of file
 +    anAlgo->buildHead(listNames.front(), aName, aTitle);
  
 -  aXao.getGeometry()->setName(aGeometryName);
 -
 -  std::set<ResultPtr> allResultsCashed; // cash to speed up searching in all results selected
 -
 -  // [bos #38360] [CEA] improve performances of exportXAO and PublishToStudy
 -  GeomAPI_IndexedMapOfShape aSubShapesMap;
 -  bool isSubShapesMap = false; // we will init it only if required (for performance reason)
 -
 -  // iterate all documents used
 -  if (aDocuments.empty())
 -    aDocuments.push_back(document());
 -  std::list<DocumentPtr>::iterator aDoc = aDocuments.begin();
 -  for(; aDoc != aDocuments.end(); aDoc++) {
 -    // groups
 -    int aGroupCount = (*aDoc)->size(ModelAPI_ResultGroup::group());
 -    for (int aGroupIndex = 0; aGroupIndex < aGroupCount; ++aGroupIndex) {
 -      ResultGroupPtr aResultGroup = std::dynamic_pointer_cast<ModelAPI_ResultGroup>(
 -          (*aDoc)->object(ModelAPI_ResultGroup::group(), aGroupIndex));
 -      if (!aResultGroup.get() || !aResultGroup->shape().get())
 -        continue;
 -
 -      FeaturePtr aGroupFeature = (*aDoc)->feature(aResultGroup);
 -
 -      AttributeSelectionListPtr aSelectionList =
 -          aGroupFeature->selectionList("group_list");
 -      if (!ModelAPI_Tools::isInResults(aSelectionList,
 -                                       aResults,
 -                                       allResultsCashed))// skip group not used in result
 -        continue;
 -
 -      // conversion of dimension
 -      std::string aSelectionType = aSelectionList->selectionType();
 -      GeomAPI_Shape::ShapeType aSelType = GeomAPI_Shape::shapeTypeByStr(aSelectionType);
 -      std::string aDimensionString =
 -        ExchangePlugin_Tools::selectionType2xaoDimension(aSelectionType);
 -      XAO::Dimension aGroupDimension = XAO::XaoUtils::stringToDimension(aDimensionString);
 -
 -      XAO::Group* aXaoGroup = aXao.addGroup(aGroupDimension,
 -        Locale::Convert::toString(aResultGroup->data()->name()));
 -
 -      try {
 -        GeomAPI_ShapeExplorer aGroupResExplorer(aResultGroup->shape(), aSelType);
 -        for(; aGroupResExplorer.more(); aGroupResExplorer.next()) {
 -          GeomShapePtr aGroupShape = aGroupResExplorer.current();
 -          if (aDocTrsf.find(*aDoc) != aDocTrsf.end())
 -            aGroupShape->move(aDocTrsf[*aDoc]);
 -
 -          if (!isSubShapesMap) {
 -            aSubShapesMap.MapShapes(aShape);
 -            isSubShapesMap = true;
 -          }
 -          int aReferenceID = aSubShapesMap.FindIndexEqualLocations(aGroupShape);
 -          if (aReferenceID == 0) // selected value does not found in the exported shape
 -            continue;
 -          std::string aReferenceString = XAO::XaoUtils::intToString(aReferenceID);
 -          int anElementID =
 -            aXao.getGeometry()->getElementIndexByReference(aGroupDimension, aReferenceString);
 -          aXaoGroup->add(anElementID);
 -        }
 -      } catch (XAO::XAO_Exception& e) {
 -        // LCOV_EXCL_START
 -        std::string msg = "An error occurred while exporting group " +
 -          Locale::Convert::toString(aResultGroup->data()->name());
 -        msg += ".\n";
 -        msg += e.what();
 -        msg += "\n";
 -        msg += "=> skipping this group from XAO export.";
 -        Events_InfoMessage("ExportFeature", msg, this).send();
 -        aXao.removeGroup(aXaoGroup);
 -        // LCOV_EXCL_STOP
 -      }
 -    }
 +    // Handling data
 +    std::list<std::string> aListOfMedias;
  
 -    // fields
 -    int aFieldCount = (*aDoc)->size(ModelAPI_ResultField::group());
 -    for (int aFieldIndex = 0; aFieldIndex < aFieldCount; ++aFieldIndex) {
 -      ResultFieldPtr aResultField = std::dynamic_pointer_cast<ModelAPI_ResultField>(
 -        (*aDoc)->object(ModelAPI_ResultField::group(), aFieldIndex));
 -
 -      FeaturePtr aFieldFeature = (*aDoc)->feature(aResultField);
 -
 -      AttributeSelectionListPtr aSelectionList =
 -          aFieldFeature->selectionList("selected");
 -      std::string aSelectionType = aSelectionList->selectionType();
 -      bool isWholePart = aSelectionType == "part";
 -      // skip field not used in results
 -      if (!isWholePart &&
 -          !ModelAPI_Tools::isInResults(aSelectionList, aResults, allResultsCashed))
 -        continue;
 -
 -      // conversion of dimension
 -      std::string aDimensionString =
 -        ExchangePlugin_Tools::selectionType2xaoDimension(aSelectionType);
 -      XAO::Dimension aFieldDimension = XAO::XaoUtils::stringToDimension(aDimensionString);
 -      // get tables and their type
 -      std::shared_ptr<ModelAPI_AttributeTables> aTables = aFieldFeature->tables("values");
 -      std::string aTypeString = ExchangePlugin_Tools::valuesType2xaoType(aTables->type());
 -      XAO::Type aFieldType = XAO::XaoUtils::stringToFieldType(aTypeString);
 -
 -      XAO::Field* aXaoField = aXao.addField(aFieldType, aFieldDimension, aTables->columns(),
 -        Locale::Convert::toString(aResultField->data()->name()));
 -
 -
 -      try {
 -        // set components names
 -        AttributeStringArrayPtr aComponents = aFieldFeature->stringArray("components_names");
 -        for(int aComp = 0; aComp < aComponents->size(); aComp++) {
 -          std::string aName = aComponents->value(aComp);
 -          aXaoField->setComponentName(aComp, aName);
 +    // Add feature in the file
 +    std::list<FeaturePtr> aVolumeFeatureList;
 +    std::list<FeaturePtr> aFeatures = document()->allFeatures();
 +    std::list<FeaturePtr>::iterator itFeature = aFeatures.begin();
 +    int aMediumIndex = 0;
 +    for (; itFeature != aFeatures.end(); ++itFeature)
 +    {
 +        aFeature = *itFeature;
 +        if (aFeature->getKind() == "Box")
 +        {
 +            std::map<std::string, double> aFeatureDimensions;
 +            aFeatureDimensions = ExchangePlugin_ExportRoot::computeBox(aFeature);
 +            std::wstring anObjectName = aFeature->firstResult()->data()->name();
 +            anAlgo->buildBox(anObjectName, aFeatureDimensions);
          }
 -
 -        AttributeIntArrayPtr aStamps = aFieldFeature->intArray("stamps");
 -        for (int aStepIndex = 0; aStepIndex < aTables->tables(); aStepIndex++) {
 -          XAO::Step* aStep = aXaoField->addNewStep(aStepIndex + 1);
 -          aStep->setStep(aStepIndex + 1);
 -          int aStampIndex = aStamps->value(aStepIndex);
 -          aStep->setStamp(aStampIndex);
 -          int aNumElements = isWholePart ? aXaoField->countElements() : aTables->rows();
 -          int aNumComps = aTables->columns();
 -          std::set<int> aFilledIDs; // to fill the rest by defaults
 -          // omit default values first row
 -          for(int aRow = isWholePart ? 0 : 1; aRow < aNumElements; aRow++) {
 -            for(int aCol = 0; aCol < aNumComps; aCol++) {
 -              int anElementID = 0;
 -              if (!isWholePart) {
 -                // element index actually is the ID of the selection
 -                AttributeSelectionPtr aSel = aSelectionList->value(aRow - 1);
 -                if (!isSubShapesMap) {
 -                  aSubShapesMap.MapShapes(aShape);
 -                  isSubShapesMap = true;
 +        else if (aFeature->getKind() == "Cylinder")
 +        {
 +            std::map<std::string, double> aFeatureDimensions;
 +            aFeatureDimensions = ExchangePlugin_ExportRoot::computeCylinder(aFeature);
 +            std::wstring anObjectName = aFeature->firstResult()->data()->name();
 +            anAlgo->buildTube(anObjectName, aFeatureDimensions);
 +        }
 +        else if (aFeature->getKind() == "Volume")
 +        {
 +            aVolumeFeatureList.push_back(aFeature);
 +            std::list<std::map<std::string, std::string>> aFeatureDimensionsList;
 +            aFeatureDimensionsList = ExchangePlugin_ExportRoot::computeVolume(aFeature);
 +
 +            const std::list<ResultPtr> &aResultList = aFeature->results();
 +            auto aResIt = aResultList.begin();
 +
 +            std::list<std::map<std::string, std::string>>::iterator itList = aFeatureDimensionsList.begin();
 +            for (; itList != aFeatureDimensionsList.end(); ++itList)
 +            {
 +
 +                std::map<std::string, std::string> aFeatureDimensions = *itList;
 +                std::wstring anObjectName = (*aResIt)->data()->name();
 +                // Filter on already created medias
 +                std::list<std::string>::iterator anIter = std::find(aListOfMedias.begin(), aListOfMedias.end(), aFeatureDimensions["medium"]);
 +                if (anIter != aListOfMedias.end())
 +                    anAlgo->buildVolume(anObjectName, aFeatureDimensions, -1);
 +                else
 +                {
 +                    aListOfMedias.push_back(aFeatureDimensions["medium"]);
 +                    anAlgo->buildVolume(anObjectName, aFeatureDimensions, ++aMediumIndex);
                  }
 -                int aReferenceID = aSubShapesMap.FindIndexEqualLocations(aSel->value());
 -                if (aReferenceID == 0) // selected value does not found in the exported shape
 -                  continue;
 -
 -                std::string aReferenceString = XAO::XaoUtils::intToString(aReferenceID);
 -                anElementID = aXao.getGeometry()->
 -                  getElementIndexByReference(aFieldDimension, aReferenceString);
 -              }
 -
 -              ModelAPI_AttributeTables::Value aVal = aTables->value(
 -                isWholePart ? 0 : aRow, aCol, aStepIndex);
 -              std::string aStrVal = valToString(aVal, aTables->type());
 -              aStep->setStringValue(isWholePart ? aRow : anElementID, aCol, aStrVal);
 -              aFilledIDs.insert(anElementID);
 +                aResIt++;
              }
 -          }
 -          if (!isWholePart) { // fill the rest values by default ones
 -            XAO::GeometricElementList::iterator allElem =
 -              aXao.getGeometry()->begin(aFieldDimension);
 -            for(; allElem != aXao.getGeometry()->end(aFieldDimension); allElem++) {
 -              if (aFilledIDs.find(allElem->first) != aFilledIDs.end())
 -                continue;
 -              for(int aCol = 0; aCol < aNumComps; aCol++) {
 -                // default value
 -                ModelAPI_AttributeTables::Value aVal = aTables->value(0, aCol, aStepIndex);
 -                std::string aStrVal = valToString(aVal, aTables->type());
 -                aStep->setStringValue(allElem->first, aCol, aStrVal);
 -              }
 -            }
 -          }
          }
 -      } catch (XAO::XAO_Exception& e) {
 -        // LCOV_EXCL_START
 -        std::string msg = "An error occurred while exporting field " +
 -          Locale::Convert::toString(aResultField->data()->name());
 -        msg += ".\n";
 -        msg += e.what();
 -        msg += "\n";
 -        msg += "=> skipping this field from XAO export.";
 -        Events_InfoMessage("ExportFeature", msg, this).send();
 -        aXao.removeField(aXaoField);
 -        // LCOV_EXCL_STOP
 -      }
 +        else if (aFeature->getKind() == "AddNode")
 +        {
 +            std::map<std::string, std::string> aFeatureDimensions;
 +            aFeatureDimensions = ExchangePlugin_ExportRoot::computeAddNode(aFeature);
 +            anAlgo->buildAddNode(aFeatureDimensions);
 +        }
      }
 -  }
  
 -  // exporting
 -  if (isMemoryExport) {
 -    string(ExchangePlugin_ExportFeature::MEMORY_BUFFER_ID())->setValue(XAOExportMem(&aXao, anError));
 -  }
 -  else {
 -    std::string aShapeFile ("");
 -    AttributeBooleanPtr aShapeSeparateAttr = boolean(XAO_SHAPE_FILE_SEPARATE_ID());
 -    if (aShapeSeparateAttr->isInitialized() &&
 -        aShapeSeparateAttr->value() == true) {
 -      aShapeFile = theFileName + ".brep";
 -    }
 -    else {
 -      AttributeStringPtr aShapeFileAttr = string(XAO_SHAPE_FILE_PATH_ID());
 -      if (aShapeFileAttr->isInitialized())
 -        aShapeFile = aShapeFileAttr->value();
 +    // Create the end of files
 +    AttributeSelectionPtr anObjectAttr = selection(ExchangePlugin_ExportFeature::MAIN_OBJECT_ID());
 +    aFeature = anObjectAttr->contextFeature();
 +
 +    std::string aNameShape = "";
 +    if (aFeature.get())
 +        aNameShape = Locale::Convert::toString(aFeature->firstResult()->data()->name());
 +    else
 +    {
 +        ObjectPtr anObject = anObjectAttr->contextObject();
 +        aNameShape = Locale::Convert::toString(anObject->data()->name());
      }
  
 -    XAOExport(theFileName, &aXao, anError, aShapeFile);
 -  }
 +    // Check if top volume in Volume list
 +    bool err = true;
 +    std::list<FeaturePtr>::iterator jtFeature = aVolumeFeatureList.begin();
 +    for (; jtFeature != aVolumeFeatureList.end(); ++jtFeature){
 +        std::string aCurrName = Locale::Convert::toString((*jtFeature)->firstResult()->data()->name());
 +        if (aCurrName == aNameShape)
 +            err = false;
 +    }
 +    if (err)
 +        setError("An error occured while exporting : The selected ROOT top volume \"" + aNameShape + "\" is not in the volume list and thus seems to not be a proper Volume result");
  
 -  if (!anError.empty()) {
 -    setError("An error occurred while exporting " + theFileName + ": " + anError);
 -    return;
 -  }
 +    // Create the end of file
 +    std::string aExportFileName = string(ExchangePlugin_ExportFeature::EXP_NAME_FILE_ID())->value();
 +    anAlgo->buildEnd(aNameShape, aExportFileName);
  
 -// LCOV_EXCL_START
 -  } catch (XAO::XAO_Exception& e) {
 -    std::string anError = e.what();
 -    setError("An error occurred while exporting " + theFileName + ": " + anError);
 -    return;
 -  }
 -// LCOV_EXCL_STOP
 +    // Create the file with the content
 +    anAlgo->write();
  }
  
  bool ExchangePlugin_ExportFeature::isMacro() const
index cf51869061b320c0509e7e28bb78eb5a805e8c9f,295aa7618f4a5e3fed26c73c4c395c629319fb97..4faa2551c54176ca92611f7e5245038abeaeefc7
@@@ -150,36 -150,25 +150,55 @@@ public
      static const std::string MY_XAO_GEOMETRY_NAME_ID("xao_geometry_name");
      return MY_XAO_GEOMETRY_NAME_ID;
    }
 +  /// attribute name of root file path
 +  inline static const std::string& ROOT_FILE_PATH_ID()
 +  {
 +    static const std::string MY_ROOT_FILE_PATH_ID("root_file_path");
 +    return MY_ROOT_FILE_PATH_ID;
 +  }
 +  /// attribute name of author for ROOT format
 +  inline static const std::string& ROOT_MANAGER_NAME_ID()
 +  {
 +    static const std::string MY_ROOT_MANAGER_NAME_ID("root_manager_name");
 +    return MY_ROOT_MANAGER_NAME_ID;
 +  }
 +  /// attribute name of geometry name for ROOT format
 +  inline static const std::string& ROOT_MANAGER_TITLE_ID()
 +  {
 +    static const std::string MY_ROOT_MANAGER_TITLE_ID("root_manager_title");
 +    return MY_ROOT_MANAGER_TITLE_ID;
 +  }
 +  /// attribute name of file export
 +  inline static const std::string& EXP_NAME_FILE_ID()
 +  {
 +    static const std::string MY_EXP_NAME_FILE_ID("root_name_file");
 +    return MY_EXP_NAME_FILE_ID;
 +  }
 +  /// Attribute name of the main solid.
 +  inline static const std::string& MAIN_OBJECT_ID()
 +  {
 +    static const std::string MY_MAIN_OBJECT_ID("root_main_object");
 +    return MY_MAIN_OBJECT_ID;
 +  }
+   /// attribute name of xao shape file path
+   inline static const std::string& XAO_SHAPE_FILE_PATH_ID()
+   {
+     static const std::string MY_XAO_SHAPE_FILE_PATH_ID("xao_shape_file_path");
+     return MY_XAO_SHAPE_FILE_PATH_ID;
+   }
+   /// attribute flag to export shape in a separate file during xao export,
+   /// name of shape file will be xao_file_path + .brep
+   inline static const std::string& XAO_SHAPE_FILE_SEPARATE_ID()
+   {
+     static const std::string MY_XAO_SHAPE_FILE_SEPARATE_ID("xao_shape_file_separate");
+     return MY_XAO_SHAPE_FILE_SEPARATE_ID;
+   }
+   /// attribute string memory buffer
+   inline static const std::string& MEMORY_BUFFER_ID()
+   {
+     static const std::string MY_MEMORY_BUFFER_ID("memory_buffer");
+     return MY_MEMORY_BUFFER_ID;
+   }
  
    /// Default constructor
    EXCHANGEPLUGIN_EXPORT ExchangePlugin_ExportFeature();
Simple merge
index 4cdb4f20a48e025a87f2987e4356a3fe3d3d2021,e01dbf2c76e786c589d4f4d8b565a34744cd3876..dd972ee098a2be7e4fb845ab7c1c64e7c3457abb
@@@ -94,10 -95,13 +95,15 @@@ SET(PROJECT_HEADER
      GeomAlgoAPI_Defeaturing.h
      GeomAlgoAPI_BoundingBox.h
      GeomAlgoAPI_NormalToFace.h
 -    GeomAlgoAPI_Tube.h
      GeomAlgoAPI_ShapeInfo.h
 +    GeomAlgoAPI_Tube.h
 +    GeomAlgoAPI_ROOTExport.h
 +        GeomAlgoAPI_CanonicalRecognition.h
+         GeomAlgoAPI_CanonicalRecognition.h
+     GeomAlgoAPI_GlueFaces.h
+     GeomAlgoAPI_LimitTolerance.h
+     GeomAlgoAPI_Utils.h
+     GeomAlgoAPI_NonPlanarFace.h
  )
  
  SET(PROJECT_SOURCES
      GeomAlgoAPI_NormalToFace.cpp
      GeomAlgoAPI_Tube.cpp
      GeomAlgoAPI_ShapeInfo.cpp
 +    GeomAlgoAPI_Tube.cpp
 +    GeomAlgoAPI_ROOTExport.cpp
 +        GeomAlgoAPI_CanonicalRecognition.cpp
+         GeomAlgoAPI_CanonicalRecognition.cpp
+     GeomAlgoAPI_GlueFaces.cpp
+       GeomAlgoAPI_CanonicalRecognition.cpp
+     GeomAlgoAPI_LimitTolerance.cpp
+     GeomAlgoAPI_Utils.cpp
+     GeomAlgoAPI_NonPlanarFace.cpp
  )
  
  SET(PROJECT_LIBRARIES
index 985bce1c1d1538459cdba35d7f6df8acfc934df3,3d6f716bbed07074a2177fa646d365766268c2f7..df83258990a3727727af07623ba376c9cc43790c
    public:
  
  //--------------------------------------------------------------------------------------
- #define INTERFACE_24(KIND, \
 -#define INTERFACE_25(KIND, \
--                     N_0, AN_0, T_0, C_0, \
--                     N_1, AN_1, T_1, C_1, \
--                     N_2, AN_2, T_2, C_2, \
--                     N_3, AN_3, T_3, C_3, \
--                     N_4, AN_4, T_4, C_4, \
--                     N_5, AN_5, T_5, C_5, \
--                     N_6, AN_6, T_6, C_6, \
--                     N_7, AN_7, T_7, C_7, \
--                     N_8, AN_8, T_8, C_8, \
--                     N_9, AN_9, T_9, C_9, \
++#define INTERFACE_22(KIND,                    \
++                     N_0, AN_0, T_0, C_0,     \
++                     N_1, AN_1, T_1, C_1,     \
++                     N_2, AN_2, T_2, C_2,     \
++                     N_3, AN_3, T_3, C_3,     \
++                     N_4, AN_4, T_4, C_4,     \
++                     N_5, AN_5, T_5, C_5,     \
++                     N_6, AN_6, T_6, C_6,     \
++                     N_7, AN_7, T_7, C_7,     \
++                     N_8, AN_8, T_8, C_8,     \
++                     N_9, AN_9, T_9, C_9,     \
                       N_10, AN_10, T_10, C_10, \
                       N_11, AN_11, T_11, C_11, \
                       N_12, AN_12, T_12, C_12, \
                       N_18, AN_18, T_18, C_18, \
                       N_19, AN_19, T_19, C_19, \
                       N_20, AN_20, T_20, C_20, \
-                      N_21, AN_21, T_21, C_21, \
-                      N_22, AN_22, T_22, C_22, \
-                      N_23, AN_23, T_23, C_23) \
-   public: \
-     INTERFACE_COMMON(KIND) \
-     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
-     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
-     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
-     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
-     DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
-     DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
-     DEFINE_ATTRIBUTE(N_6, T_6, C_6) \
-     DEFINE_ATTRIBUTE(N_7, T_7, C_7) \
-     DEFINE_ATTRIBUTE(N_8, T_8, C_8) \
-     DEFINE_ATTRIBUTE(N_9, T_9, C_9) \
-     DEFINE_ATTRIBUTE(N_10, T_10, C_10) \
-     DEFINE_ATTRIBUTE(N_11, T_11, C_11) \
-     DEFINE_ATTRIBUTE(N_12, T_12, C_12) \
-     DEFINE_ATTRIBUTE(N_13, T_13, C_13) \
-     DEFINE_ATTRIBUTE(N_14, T_14, C_14) \
-     DEFINE_ATTRIBUTE(N_15, T_15, C_15) \
-     DEFINE_ATTRIBUTE(N_16, T_16, C_16) \
-     DEFINE_ATTRIBUTE(N_17, T_17, C_17) \
-     DEFINE_ATTRIBUTE(N_18, T_18, C_18) \
-     DEFINE_ATTRIBUTE(N_19, T_19, C_19) \
-     DEFINE_ATTRIBUTE(N_20, T_20, C_20) \
-     DEFINE_ATTRIBUTE(N_21, T_21, C_21) \
-     DEFINE_ATTRIBUTE(N_22, T_22, C_22) \
-     DEFINE_ATTRIBUTE(N_23, T_23, C_23) \
-   protected: \
-     START_INIT() \
-       SET_ATTRIBUTE(N_0, T_0, AN_0) \
-       SET_ATTRIBUTE(N_1, T_1, AN_1) \
-       SET_ATTRIBUTE(N_2, T_2, AN_2) \
-       SET_ATTRIBUTE(N_3, T_3, AN_3) \
-       SET_ATTRIBUTE(N_4, T_4, AN_4) \
-       SET_ATTRIBUTE(N_5, T_5, AN_5) \
-       SET_ATTRIBUTE(N_6, T_6, AN_6) \
-       SET_ATTRIBUTE(N_7, T_7, AN_7) \
-       SET_ATTRIBUTE(N_8, T_8, AN_8) \
-       SET_ATTRIBUTE(N_9, T_9, AN_9) \
-       SET_ATTRIBUTE(N_10, T_10, AN_10) \
-       SET_ATTRIBUTE(N_11, T_11, AN_11) \
-       SET_ATTRIBUTE(N_12, T_12, AN_12) \
-       SET_ATTRIBUTE(N_13, T_13, AN_13) \
-       SET_ATTRIBUTE(N_14, T_14, AN_14) \
-       SET_ATTRIBUTE(N_15, T_15, AN_15) \
-       SET_ATTRIBUTE(N_16, T_16, AN_16) \
-       SET_ATTRIBUTE(N_17, T_17, AN_17) \
-       SET_ATTRIBUTE(N_18, T_18, AN_18) \
-       SET_ATTRIBUTE(N_19, T_19, AN_19) \
-       SET_ATTRIBUTE(N_20, T_20, AN_20) \
-       SET_ATTRIBUTE(N_21, T_21, AN_21) \
-       SET_ATTRIBUTE(N_22, T_22, AN_22) \
-       SET_ATTRIBUTE(N_23, T_23, AN_23) \
-     END_INIT() \
-   public:
- //--------------------------------------------------------------------------------------
- #define INTERFACE_25(KIND, \
-                      N_0, AN_0, T_0, C_0, \
-                      N_1, AN_1, T_1, C_1, \
-                      N_2, AN_2, T_2, C_2, \
-                      N_3, AN_3, T_3, C_3, \
-                      N_4, AN_4, T_4, C_4, \
-                      N_5, AN_5, T_5, C_5, \
-                      N_6, AN_6, T_6, C_6, \
-                      N_7, AN_7, T_7, C_7, \
-                      N_8, AN_8, T_8, C_8, \
-                      N_9, AN_9, T_9, C_9, \
-                      N_10, AN_10, T_10, C_10, \
-                      N_11, AN_11, T_11, C_11, \
-                      N_12, AN_12, T_12, C_12, \
-                      N_13, AN_13, T_13, C_13, \
-                      N_14, AN_14, T_14, C_14, \
-                      N_15, AN_15, T_15, C_15, \
-                      N_16, AN_16, T_16, C_16, \
-                      N_17, AN_17, T_17, C_17, \
-                      N_18, AN_18, T_18, C_18, \
-                      N_19, AN_19, T_19, C_19, \
-                      N_20, AN_20, T_20, C_20, \
--                     N_21, AN_21, T_21, C_21, \
--                     N_22, AN_22, T_22, C_22, \
--                     N_23, AN_23, T_23, C_23, \
--                     N_24, AN_24, T_24, C_24) \
-   public: \
-     INTERFACE_COMMON(KIND) \
-     DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
-     DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
-     DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
-     DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
-     DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
-     DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
-     DEFINE_ATTRIBUTE(N_6, T_6, C_6) \
-     DEFINE_ATTRIBUTE(N_7, T_7, C_7) \
-     DEFINE_ATTRIBUTE(N_8, T_8, C_8) \
-     DEFINE_ATTRIBUTE(N_9, T_9, C_9) \
-     DEFINE_ATTRIBUTE(N_10, T_10, C_10) \
-     DEFINE_ATTRIBUTE(N_11, T_11, C_11) \
-     DEFINE_ATTRIBUTE(N_12, T_12, C_12) \
-     DEFINE_ATTRIBUTE(N_13, T_13, C_13) \
-     DEFINE_ATTRIBUTE(N_14, T_14, C_14) \
-     DEFINE_ATTRIBUTE(N_15, T_15, C_15) \
-     DEFINE_ATTRIBUTE(N_16, T_16, C_16) \
-     DEFINE_ATTRIBUTE(N_17, T_17, C_17) \
-     DEFINE_ATTRIBUTE(N_18, T_18, C_18) \
-     DEFINE_ATTRIBUTE(N_19, T_19, C_19) \
-     DEFINE_ATTRIBUTE(N_20, T_20, C_20) \
-     DEFINE_ATTRIBUTE(N_21, T_21, C_21) \
-     DEFINE_ATTRIBUTE(N_22, T_22, C_22) \
-     DEFINE_ATTRIBUTE(N_23, T_23, C_23) \
-     DEFINE_ATTRIBUTE(N_24, T_24, C_24) \
-   protected: \
-     START_INIT() \
-       SET_ATTRIBUTE(N_0, T_0, AN_0) \
-       SET_ATTRIBUTE(N_1, T_1, AN_1) \
-       SET_ATTRIBUTE(N_2, T_2, AN_2) \
-       SET_ATTRIBUTE(N_3, T_3, AN_3) \
-       SET_ATTRIBUTE(N_4, T_4, AN_4) \
-       SET_ATTRIBUTE(N_5, T_5, AN_5) \
-       SET_ATTRIBUTE(N_6, T_6, AN_6) \
-       SET_ATTRIBUTE(N_7, T_7, AN_7) \
-       SET_ATTRIBUTE(N_8, T_8, AN_8) \
-       SET_ATTRIBUTE(N_9, T_9, AN_9) \
-       SET_ATTRIBUTE(N_10, T_10, AN_10) \
-       SET_ATTRIBUTE(N_11, T_11, AN_11) \
-       SET_ATTRIBUTE(N_12, T_12, AN_12) \
-       SET_ATTRIBUTE(N_13, T_13, AN_13) \
-       SET_ATTRIBUTE(N_14, T_14, AN_14) \
-       SET_ATTRIBUTE(N_15, T_15, AN_15) \
-       SET_ATTRIBUTE(N_16, T_16, AN_16) \
-       SET_ATTRIBUTE(N_17, T_17, AN_17) \
-       SET_ATTRIBUTE(N_18, T_18, AN_18) \
-       SET_ATTRIBUTE(N_19, T_19, AN_19) \
-       SET_ATTRIBUTE(N_20, T_20, AN_20) \
-       SET_ATTRIBUTE(N_21, T_21, AN_21) \
-       SET_ATTRIBUTE(N_22, T_22, AN_22) \
-       SET_ATTRIBUTE(N_23, T_23, AN_23) \
-       SET_ATTRIBUTE(N_24, T_24, AN_24) \
-     END_INIT() \
-   public:
- //--------------------------------------------------------------------------------------
- #define INTERFACE_27(KIND, \
-                      N_0, AN_0, T_0, C_0, \
-                      N_1, AN_1, T_1, C_1, \
-                      N_2, AN_2, T_2, C_2, \
-                      N_3, AN_3, T_3, C_3, \
-                      N_4, AN_4, T_4, C_4, \
-                      N_5, AN_5, T_5, C_5, \
-                      N_6, AN_6, T_6, C_6, \
-                      N_7, AN_7, T_7, C_7, \
-                      N_8, AN_8, T_8, C_8, \
-                      N_9, AN_9, T_9, C_9, \
-                      N_10, AN_10, T_10, C_10, \
-                      N_11, AN_11, T_11, C_11, \
-                      N_12, AN_12, T_12, C_12, \
-                      N_13, AN_13, T_13, C_13, \
-                      N_14, AN_14, T_14, C_14, \
-                      N_15, AN_15, T_15, C_15, \
-                      N_16, AN_16, T_16, C_16, \
-                      N_17, AN_17, T_17, C_17, \
-                      N_18, AN_18, T_18, C_18, \
-                      N_19, AN_19, T_19, C_19, \
-                      N_20, AN_20, T_20, C_20, \
-                      N_21, AN_21, T_21, C_21, \
-                      N_22, AN_22, T_22, C_22, \
-                      N_23, AN_23, T_23, C_23, \
-                      N_24, AN_24, T_24, C_24, \
-                      N_25, AN_25, T_25, C_25, \
-                      N_26, AN_26, T_26, C_26) \
--  public: \
--    INTERFACE_COMMON(KIND) \
--    DEFINE_ATTRIBUTE(N_0, T_0, C_0) \
--    DEFINE_ATTRIBUTE(N_1, T_1, C_1) \
--    DEFINE_ATTRIBUTE(N_2, T_2, C_2) \
--    DEFINE_ATTRIBUTE(N_3, T_3, C_3) \
--    DEFINE_ATTRIBUTE(N_4, T_4, C_4) \
--    DEFINE_ATTRIBUTE(N_5, T_5, C_5) \
--    DEFINE_ATTRIBUTE(N_6, T_6, C_6) \
--    DEFINE_ATTRIBUTE(N_7, T_7, C_7) \
--    DEFINE_ATTRIBUTE(N_8, T_8, C_8) \
--    DEFINE_ATTRIBUTE(N_9, T_9, C_9) \
--    DEFINE_ATTRIBUTE(N_10, T_10, C_10) \
--    DEFINE_ATTRIBUTE(N_11, T_11, C_11) \
--    DEFINE_ATTRIBUTE(N_12, T_12, C_12) \
--    DEFINE_ATTRIBUTE(N_13, T_13, C_13) \
--    DEFINE_ATTRIBUTE(N_14, T_14, C_14) \
--    DEFINE_ATTRIBUTE(N_15, T_15, C_15) \
--    DEFINE_ATTRIBUTE(N_16, T_16, C_16) \
--    DEFINE_ATTRIBUTE(N_17, T_17, C_17) \
--    DEFINE_ATTRIBUTE(N_18, T_18, C_18) \
--    DEFINE_ATTRIBUTE(N_19, T_19, C_19) \
--    DEFINE_ATTRIBUTE(N_20, T_20, C_20) \
--    DEFINE_ATTRIBUTE(N_21, T_21, C_21) \
--    DEFINE_ATTRIBUTE(N_22, T_22, C_22) \
--    DEFINE_ATTRIBUTE(N_23, T_23, C_23) \
--    DEFINE_ATTRIBUTE(N_24, T_24, C_24) \
-     DEFINE_ATTRIBUTE(N_25, T_25, C_25) \
-     DEFINE_ATTRIBUTE(N_26, T_26, C_26) \
--  protected: \
--    START_INIT() \
--      SET_ATTRIBUTE(N_0, T_0, AN_0) \
--      SET_ATTRIBUTE(N_1, T_1, AN_1) \
--      SET_ATTRIBUTE(N_2, T_2, AN_2) \
--      SET_ATTRIBUTE(N_3, T_3, AN_3) \
--      SET_ATTRIBUTE(N_4, T_4, AN_4) \
--      SET_ATTRIBUTE(N_5, T_5, AN_5) \
--      SET_ATTRIBUTE(N_6, T_6, AN_6) \
--      SET_ATTRIBUTE(N_7, T_7, AN_7) \
--      SET_ATTRIBUTE(N_8, T_8, AN_8) \
--      SET_ATTRIBUTE(N_9, T_9, AN_9) \
--      SET_ATTRIBUTE(N_10, T_10, AN_10) \
--      SET_ATTRIBUTE(N_11, T_11, AN_11) \
--      SET_ATTRIBUTE(N_12, T_12, AN_12) \
--      SET_ATTRIBUTE(N_13, T_13, AN_13) \
--      SET_ATTRIBUTE(N_14, T_14, AN_14) \
--      SET_ATTRIBUTE(N_15, T_15, AN_15) \
--      SET_ATTRIBUTE(N_16, T_16, AN_16) \
--      SET_ATTRIBUTE(N_17, T_17, AN_17) \
--      SET_ATTRIBUTE(N_18, T_18, AN_18) \
--      SET_ATTRIBUTE(N_19, T_19, AN_19) \
--      SET_ATTRIBUTE(N_20, T_20, AN_20) \
--      SET_ATTRIBUTE(N_21, T_21, AN_21) \
--      SET_ATTRIBUTE(N_22, T_22, AN_22) \
--      SET_ATTRIBUTE(N_23, T_23, AN_23) \
--      SET_ATTRIBUTE(N_24, T_24, AN_24) \
-       SET_ATTRIBUTE(N_25, T_25, AN_25) \
-       SET_ATTRIBUTE(N_26, T_26, AN_26) \
--    END_INIT() \
--  public:
- //--------------------------------------------------------------------------------------
++                     N_21, AN_21, T_21, C_21) \
++public:                                       \
++  INTERFACE_COMMON(KIND)                      \
++  DEFINE_ATTRIBUTE(N_0, T_0, C_0)             \
++  DEFINE_ATTRIBUTE(N_1, T_1, C_1)             \
++  DEFINE_ATTRIBUTE(N_2, T_2, C_2)             \
++  DEFINE_ATTRIBUTE(N_3, T_3, C_3)             \
++  DEFINE_ATTRIBUTE(N_4, T_4, C_4)             \
++  DEFINE_ATTRIBUTE(N_5, T_5, C_5)             \
++  DEFINE_ATTRIBUTE(N_6, T_6, C_6)             \
++  DEFINE_ATTRIBUTE(N_7, T_7, C_7)             \
++  DEFINE_ATTRIBUTE(N_8, T_8, C_8)             \
++  DEFINE_ATTRIBUTE(N_9, T_9, C_9)             \
++  DEFINE_ATTRIBUTE(N_10, T_10, C_10)          \
++  DEFINE_ATTRIBUTE(N_11, T_11, C_11)          \
++  DEFINE_ATTRIBUTE(N_12, T_12, C_12)          \
++  DEFINE_ATTRIBUTE(N_13, T_13, C_13)          \
++  DEFINE_ATTRIBUTE(N_14, T_14, C_14)          \
++  DEFINE_ATTRIBUTE(N_15, T_15, C_15)          \
++  DEFINE_ATTRIBUTE(N_16, T_16, C_16)          \
++  DEFINE_ATTRIBUTE(N_17, T_17, C_17)          \
++  DEFINE_ATTRIBUTE(N_18, T_18, C_18)          \
++  DEFINE_ATTRIBUTE(N_19, T_19, C_19)          \
++  DEFINE_ATTRIBUTE(N_20, T_20, C_20)          \
++  DEFINE_ATTRIBUTE(N_21, T_21, C_21)          \
++protected:                                    \
++  START_INIT()                                \
++  SET_ATTRIBUTE(N_0, T_0, AN_0)               \
++  SET_ATTRIBUTE(N_1, T_1, AN_1)               \
++  SET_ATTRIBUTE(N_2, T_2, AN_2)               \
++  SET_ATTRIBUTE(N_3, T_3, AN_3)               \
++  SET_ATTRIBUTE(N_4, T_4, AN_4)               \
++  SET_ATTRIBUTE(N_5, T_5, AN_5)               \
++  SET_ATTRIBUTE(N_6, T_6, AN_6)               \
++  SET_ATTRIBUTE(N_7, T_7, AN_7)               \
++  SET_ATTRIBUTE(N_8, T_8, AN_8)               \
++  SET_ATTRIBUTE(N_9, T_9, AN_9)               \
++  SET_ATTRIBUTE(N_10, T_10, AN_10)            \
++  SET_ATTRIBUTE(N_11, T_11, AN_11)            \
++  SET_ATTRIBUTE(N_12, T_12, AN_12)            \
++  SET_ATTRIBUTE(N_13, T_13, AN_13)            \
++  SET_ATTRIBUTE(N_14, T_14, AN_14)            \
++  SET_ATTRIBUTE(N_15, T_15, AN_15)            \
++  SET_ATTRIBUTE(N_16, T_16, AN_16)            \
++  SET_ATTRIBUTE(N_17, T_17, AN_17)            \
++  SET_ATTRIBUTE(N_18, T_18, AN_18)            \
++  SET_ATTRIBUTE(N_19, T_19, AN_19)            \
++  SET_ATTRIBUTE(N_20, T_20, AN_20)            \
++  SET_ATTRIBUTE(N_21, T_21, AN_21)            \
++  END_INIT()                                  \
++public:
+ //--------------------------------------------------------------------------------------
++#define INTERFACE_25(KIND,                    \
++                           N_0, AN_0, T_0, C_0,     \
++                           N_1, AN_1, T_1, C_1,     \
++                           N_2, AN_2, T_2, C_2,     \
++                           N_3, AN_3, T_3, C_3,     \
++                           N_4, AN_4, T_4, C_4,     \
++                           N_5, AN_5, T_5, C_5,     \
++                           N_6, AN_6, T_6, C_6,     \
++                           N_7, AN_7, T_7, C_7,     \
++                           N_8, AN_8, T_8, C_8,     \
++                           N_9, AN_9, T_9, C_9,     \
++                           N_10, AN_10, T_10, C_10, \
++                           N_11, AN_11, T_11, C_11, \
++                           N_12, AN_12, T_12, C_12, \
++                           N_13, AN_13, T_13, C_13, \
++                           N_14, AN_14, T_14, C_14, \
++                           N_15, AN_15, T_15, C_15, \
++                           N_16, AN_16, T_16, C_16, \
++                           N_17, AN_17, T_17, C_17, \
++                           N_18, AN_18, T_18, C_18, \
++                           N_19, AN_19, T_19, C_19, \
++                           N_20, AN_20, T_20, C_20, \
++                           N_21, AN_21, T_21, C_21, \
++                           N_22, AN_22, T_22, C_22, \
++                           N_23, AN_23, T_23, C_23, \
++                           N_24, AN_24, T_24, C_24) \
++      public:                                       \
++        INTERFACE_COMMON(KIND)                      \
++        DEFINE_ATTRIBUTE(N_0, T_0, C_0)             \
++        DEFINE_ATTRIBUTE(N_1, T_1, C_1)             \
++        DEFINE_ATTRIBUTE(N_2, T_2, C_2)             \
++        DEFINE_ATTRIBUTE(N_3, T_3, C_3)             \
++        DEFINE_ATTRIBUTE(N_4, T_4, C_4)             \
++        DEFINE_ATTRIBUTE(N_5, T_5, C_5)             \
++        DEFINE_ATTRIBUTE(N_6, T_6, C_6)             \
++        DEFINE_ATTRIBUTE(N_7, T_7, C_7)             \
++        DEFINE_ATTRIBUTE(N_8, T_8, C_8)             \
++        DEFINE_ATTRIBUTE(N_9, T_9, C_9)             \
++        DEFINE_ATTRIBUTE(N_10, T_10, C_10)          \
++        DEFINE_ATTRIBUTE(N_11, T_11, C_11)          \
++        DEFINE_ATTRIBUTE(N_12, T_12, C_12)          \
++        DEFINE_ATTRIBUTE(N_13, T_13, C_13)          \
++        DEFINE_ATTRIBUTE(N_14, T_14, C_14)          \
++        DEFINE_ATTRIBUTE(N_15, T_15, C_15)          \
++        DEFINE_ATTRIBUTE(N_16, T_16, C_16)          \
++        DEFINE_ATTRIBUTE(N_17, T_17, C_17)          \
++        DEFINE_ATTRIBUTE(N_18, T_18, C_18)          \
++        DEFINE_ATTRIBUTE(N_19, T_19, C_19)          \
++        DEFINE_ATTRIBUTE(N_20, T_20, C_20)          \
++        DEFINE_ATTRIBUTE(N_21, T_21, C_21)          \
++        DEFINE_ATTRIBUTE(N_22, T_22, C_22)          \
++        DEFINE_ATTRIBUTE(N_23, T_23, C_23)          \
++        DEFINE_ATTRIBUTE(N_24, T_24, C_24)          \
++      protected:                                    \
++        START_INIT()                                \
++        SET_ATTRIBUTE(N_0, T_0, AN_0)               \
++        SET_ATTRIBUTE(N_1, T_1, AN_1)               \
++        SET_ATTRIBUTE(N_2, T_2, AN_2)               \
++        SET_ATTRIBUTE(N_3, T_3, AN_3)               \
++        SET_ATTRIBUTE(N_4, T_4, AN_4)               \
++        SET_ATTRIBUTE(N_5, T_5, AN_5)               \
++        SET_ATTRIBUTE(N_6, T_6, AN_6)               \
++        SET_ATTRIBUTE(N_7, T_7, AN_7)               \
++        SET_ATTRIBUTE(N_8, T_8, AN_8)               \
++        SET_ATTRIBUTE(N_9, T_9, AN_9)               \
++        SET_ATTRIBUTE(N_10, T_10, AN_10)            \
++        SET_ATTRIBUTE(N_11, T_11, AN_11)            \
++        SET_ATTRIBUTE(N_12, T_12, AN_12)            \
++        SET_ATTRIBUTE(N_13, T_13, AN_13)            \
++        SET_ATTRIBUTE(N_14, T_14, AN_14)            \
++        SET_ATTRIBUTE(N_15, T_15, AN_15)            \
++        SET_ATTRIBUTE(N_16, T_16, AN_16)            \
++        SET_ATTRIBUTE(N_17, T_17, AN_17)            \
++        SET_ATTRIBUTE(N_18, T_18, AN_18)            \
++        SET_ATTRIBUTE(N_19, T_19, AN_19)            \
++        SET_ATTRIBUTE(N_20, T_20, AN_20)            \
++        SET_ATTRIBUTE(N_21, T_21, AN_21)            \
++        SET_ATTRIBUTE(N_22, T_22, AN_22)            \
++        SET_ATTRIBUTE(N_23, T_23, AN_23)            \
++        SET_ATTRIBUTE(N_24, T_24, AN_24)            \
++        END_INIT()                                  \
++      public:
++
++      //--------------------------------------------------------------------------------------
  #endif /* SRC_MODELHIGHAPI_MODELHIGHAPI_MACRO_H_ */
index b0ca3c8e82bec2897387ec90dcbed2ff28b491b1,d0a5255d480239e4e16ab12253b1c7e255b49ed5..91e66fa29de0fb8eafdfd52e7e7061deba96efd7
@@@ -44,9 -46,9 +46,9 @@@ ModuleBase_ListView::ModuleBase_ListVie
  
    myCopyAction = ModuleBase_Tools::createAction(QIcon(":pictures/copy.png"), tr("Copy"),
                            theParent, this, SLOT(onCopyItem()));
-   myCopyAction->setShortcut(QKeySequence::Copy);
    myCopyAction->setEnabled(false);
    myListControl->addAction(myCopyAction);
 -  SUIT_ShortcutMgr::get()->registerAction("SHAPER/#TOT_DESK_EDIT_COPY", myCopyAction);
++  // SUIT_ShortcutMgr::get()->registerAction("SHAPER/#TOT_DESK_EDIT_COPY", myCopyAction); //HOTFIX for OPERA merge
  
    myDeleteAction = ModuleBase_Tools::createAction(QIcon(":pictures/delete.png"), tr("Delete"),
                            theParent, this, SIGNAL(deleteActionClicked()));
Simple merge
Simple merge
index e8850f6273b7ff7c3f7946331a0d737944b9466e,b920afc425d94ee42e3956317fd3dd78ee296774..f9f8bd45128786a5b249abb76114cf457a780bef
@@@ -729,7 -808,7 +808,8 @@@ QAction* SHAPERGUI::addFeatureOfNested(
                                         const QList<QAction*>& theNestedActions)
  {
    SUIT_Desktop* aDesk = application()->desktop();
-   SHAPERGUI_NestedButton* anAction = new SHAPERGUI_NestedButton(aDesk, theNestedActions);
 -  SHAPERGUI_NestedButton* anAction = new SHAPERGUI_NestedButton(aDesk, makeActionID(theInfo.id), theNestedActions);
++  SHAPERGUI_NestedButton *anAction = new SHAPERGUI_NestedButton(aDesk, theInfo.id, theNestedActions);                   //HOTFIX for OPERA merge
++  // SHAPERGUI_NestedButton* anAction = new SHAPERGUI_NestedButton(aDesk, makeActionID(theInfo.id), theNestedActions);  //Old version
    anAction->setData(theInfo.id);
    anAction->setCheckable(theInfo.checkable);
    anAction->setChecked(theInfo.checked);
index 8fda4fb34480ead10ae437d8eff6481bf4974222,4775444902facde04b55b7dd5a36b7b2d05f59af..b80cbd088e4b6a604640199c8bbb6345edd9c212
@@@ -126,6 -139,23 +139,23 @@@ QString qIntListInfo(const QIntList& th
    return anInfo.join(theSeparator);
  }
  
 -        pViewMdl->applyClippingPlanes(true);
+ /// Apply the clipping planes to all objects in the "OCC3D" viewer.
+ void applyClippingPlanes()
+ {
+   SUIT_Application *pApp = SUIT_Session::session()->activeApplication();
+   QList<SUIT_ViewManager*> viewMgrs;
+   pApp->viewManagers(QString("OCCViewer"), viewMgrs);
+   if (!viewMgrs.isEmpty()) {
+     SUIT_ViewManager *pViewMgr = viewMgrs.first();
+     if (pViewMgr) {
+       SUIT_ViewModel *pViewMdl = pViewMgr->getViewModel();
+       if (pViewMdl) {
++        // pViewMdl->applyClippingPlanes(true); //HOTFIX for OPERA merge
+       }
+     }
+   }
+ }
  //**************************************************************
  XGUI_Displayer::XGUI_Displayer(XGUI_Workshop* theWorkshop)
  : myWorkshop(theWorkshop),
@@@ -210,6 -245,27 +245,27 @@@ bool XGUI_Displayer::display(ObjectPtr 
    if (!anAISIO.IsNull()) {
      appendResultObject(theObject, theAIS);
  
 -    // as they are stored in the ViewModel of the OCCViewer in GUI, where we 
+     // bos#40617: Apply clipping planes
+     // Retrieve the clipping plane from the OCCT Presentation Manager directly,
++    // as they are stored in the ViewModel of the OCCViewer in GUI, where we
+     // don't have access to.
+     Handle(ViewerData_AISShape) aShape = Handle(ViewerData_AISShape)::DownCast (anAISIO);
+     if (!aShape.IsNull() && aShape->IsClippable()) {
+       Graphic3d_MapOfStructure aSetOfStructures;
+       aContext->MainPrsMgr()->StructureManager()->DisplayedStructures( aSetOfStructures );
+       Graphic3d_MapIteratorOfMapOfStructure aStructureIt( aSetOfStructures );
+       for( ; aStructureIt.More(); aStructureIt.Next() ) {
+         const Handle(Graphic3d_Structure)& aStructure = aStructureIt.Key();
+         if ( aStructure->IsEmpty() || !aStructure->IsVisible() || aStructure->CStructure()->IsForHighlight )
+           continue;
+         const Handle(Graphic3d_SequenceOfHClipPlane) &planes = aStructure->ClipPlanes();
+         if (!planes.IsNull() && !planes->IsEmpty()) {
+           aShape->SetClipPlanes(planes);
+           break;
+         }
+       }
+     }
      //bool isCustomized = customizeObject(theObject);
  
      int aDispMode = isShading? Shading : Wireframe;