Salome HOME
Make import XAO with groups
[modules/shaper.git] / src / ExchangePlugin / ExchangePlugin_ImportFeature.cpp
index e7e9e1b981bd6dbdb76bf94ada1c5e2c1136b4cc..037c300e7113ec599c08f342f2cb92a7a1fd61f2 100644 (file)
@@ -6,28 +6,35 @@
 
 #include <ExchangePlugin_ImportFeature.h>
 
+#include <algorithm>
+#include <string>
+#ifdef _DEBUG
+#include <iostream>
+#include <ostream>
+#endif
+
+#include <Config_Common.h>
+#include <Config_PropManager.h>
+
 #include <GeomAlgoAPI_BREPImport.h>
 #include <GeomAlgoAPI_IGESImport.h>
 #include <GeomAlgoAPI_STEPImport.h>
+#include <GeomAlgoAPI_XAOImport.h>
 #include <GeomAlgoAPI_Tools.h>
 
 #include <GeomAPI_Shape.h>
 
-#include <Config_Common.h>
-#include <Config_PropManager.h>
-
 #include <ModelAPI_AttributeString.h>
+#include <ModelAPI_AttributeSelectionList.h>
+#include <ModelAPI_BodyBuilder.h>
 #include <ModelAPI_Data.h>
 #include <ModelAPI_Document.h>
 #include <ModelAPI_Object.h>
 #include <ModelAPI_ResultBody.h>
+#include <ModelAPI_ResultGroup.h>
 
-#include <algorithm>
-#include <string>
-#ifdef _DEBUG
-#include <iostream>
-#include <ostream>
-#endif
+#include <XAO_Xao.hxx>
+#include <XAO_Group.hxx>
 
 ExchangePlugin_ImportFeature::ExchangePlugin_ImportFeature()
 {
@@ -78,15 +85,22 @@ bool ExchangePlugin_ImportFeature::importFile(const std::string& theFileName)
   std::string anError;
 
   std::shared_ptr<GeomAPI_Shape> aGeomShape;
+  std::shared_ptr<XAO::Xao> aXao;
   if (anExtension == "BREP" || anExtension == "BRP") {
     aGeomShape = BREPImport(theFileName, anExtension, anError);
   } else if (anExtension == "STEP" || anExtension == "STP") {
     aGeomShape = STEPImport(theFileName, anExtension, anError);
   } else if (anExtension == "IGES" || anExtension == "IGS") {
     aGeomShape = IGESImport(theFileName, anExtension, anError);
+  } else if (anExtension == "XAO") {
+    std::shared_ptr<XAO::Xao> aTmpXao(new XAO::Xao);
+    aGeomShape = XAOImport(theFileName, anExtension, anError, aTmpXao.get());
+    if (!aGeomShape->isNull())
+      aXao = aTmpXao;
   }
-   // Check if shape is valid
-  if ( aGeomShape->isNull() ) {
+
+  // Check if shape is valid
+  if (aGeomShape->isNull()) {
     const static std::string aShapeError =
       "An error occurred while importing " + theFileName + ": " + anError;
     setError(aShapeError);
@@ -103,6 +117,34 @@ bool ExchangePlugin_ImportFeature::importFile(const std::string& theFileName)
 
   setResult(aResultBody);
 
+  if (aXao.get()) {
+    XAO::Geometry* aXaoGeometry = aXao->getGeometry();
+
+    // Creates group results
+    for (int aGroupIndex = 0; aGroupIndex < aXao->countGroups(); ++aGroupIndex) {
+      XAO::Group* aXaoGroup = aXao->getGroup(aGroupIndex);
+
+      std::shared_ptr<ModelAPI_Feature> aGroupFeature = document()->addFeature("Group", false);
+      if (aGroupFeature) {
+        if (!aXaoGroup->getName().empty())
+          aGroupFeature->data()->setName(aXaoGroup->getName());
+        AttributeSelectionListPtr aSelectionList = aGroupFeature->selectionList("group_list");
+        aSelectionList->setSelectionType(XAO::XaoUtils::dimensionToString(aXaoGroup->getDimension()));
+
+        for (int anElementIndex = 0; anElementIndex < aXaoGroup->count(); ++anElementIndex) {
+          aSelectionList->append(aResultBody, GeomShapePtr());
+          int anElementID = aXaoGroup->get(anElementIndex);
+          std::string aReferenceString =
+              aXaoGeometry->getElementReference(aXaoGroup->getDimension(), anElementID);
+          int aReferenceID = XAO::XaoUtils::stringToInt(aReferenceString);
+          aSelectionList->value(anElementIndex)->setId(aReferenceID);
+        }
+
+        document()->setCurrentFeature(aGroupFeature, true);
+      }
+    }
+  }
+
   return true;
 }