Salome HOME
Make import XAO with groups
authorspo <sergey.pokhodenko@opencascade.com>
Thu, 26 Nov 2015 10:27:27 +0000 (13:27 +0300)
committerspo <sergey.pokhodenko@opencascade.com>
Wed, 22 Jun 2016 11:06:01 +0000 (14:06 +0300)
src/ExchangePlugin/CMakeLists.txt
src/ExchangePlugin/ExchangePlugin_ImportFeature.cpp
src/GeomAlgoAPI/CMakeLists.txt
src/GeomAlgoAPI/GeomAlgoAPI_XAOImport.cpp [new file with mode: 0644]
src/GeomAlgoAPI/GeomAlgoAPI_XAOImport.h [new file with mode: 0644]
src/ModelAPI/ModelAPI_AttributeSelection.h

index 2528e4bb318e0423562bbb57ef82513d8e07ff20..17c0489777d527a78cdb1c19aad7e3dcb88ff21b 100644 (file)
@@ -8,6 +8,7 @@ INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/src/Events
                     ${PROJECT_SOURCE_DIR}/src/ModelAPI
                     ${PROJECT_SOURCE_DIR}/src/GeomAPI
                     ${PROJECT_SOURCE_DIR}/src/GeomAlgoAPI
+                    ${PROJECT_SOURCE_DIR}/src/XAO
 )
 
 SET(PROJECT_HEADERS
@@ -41,6 +42,7 @@ SET(PROJECT_LIBRARIES
     ModelAPI
     GeomAPI
     GeomAlgoAPI
+    XAO
 )
 SOURCE_GROUP ("Resource Files" FILES ${TEXT_RESOURCES})
 
index a0e7ebaaf1fd5faf309e0069699598563b43a292..037c300e7113ec599c08f342f2cb92a7a1fd61f2 100644 (file)
@@ -6,29 +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()
 {
@@ -79,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);
@@ -104,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;
 }
 
index bdc7a8d58f32052a355c1f992b846b59a406f019..b40fcd76e22d3a9b503409b216ca3c59f16f15f7 100644 (file)
@@ -39,6 +39,7 @@ SET(PROJECT_HEADERS
     GeomAlgoAPI_WireBuilder.h
     GeomAlgoAPI_Sewing.h
     GeomAlgoAPI_ShapeBuilder.h
+    GeomAlgoAPI_XAOImport.h
 )
 
 SET(PROJECT_SOURCES
@@ -74,12 +75,14 @@ SET(PROJECT_SOURCES
     GeomAlgoAPI_WireBuilder.cpp
     GeomAlgoAPI_Sewing.cpp
     GeomAlgoAPI_ShapeBuilder.cpp
+    GeomAlgoAPI_XAOImport.cpp
 )
 
 SET(PROJECT_LIBRARIES
     GeomAPI
     GeomAlgoImpl
     ModelAPI
+    XAO
     ${CAS_OCAF}
     ${CAS_SHAPE}
     ${CAS_TKBO}
@@ -109,6 +112,7 @@ INCLUDE_DIRECTORIES(
   ../GeomAPI
   ../GeomAlgoImpl
   ../ModelAPI
+  ../XAO
   ${CAS_INCLUDE_DIRS}
 )
 
diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_XAOImport.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_XAOImport.cpp
new file mode 100644 (file)
index 0000000..1440c81
--- /dev/null
@@ -0,0 +1,56 @@
+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
+
+// File:    GEOMALGOAPI_XAOImport.cpp
+// Created: Nov 25, 2015
+// Author:  Sergey POKHODENKO
+
+#include <GeomAlgoAPI_XAOImport.h>
+
+#include <cassert>
+
+#include <TopoDS_Shape.hxx>
+
+#include <XAO_XaoExporter.hxx>
+#include <XAO_BrepGeometry.hxx>
+
+//=============================================================================
+/*!
+ *
+ */
+//=============================================================================
+std::shared_ptr<GeomAPI_Shape> XAOImport(const std::string& theFileName,
+                                         const std::string&,
+                                         std::string& theError,
+                                         XAO::Xao* theXao)
+{
+  assert(theXao);
+
+  #ifdef _DEBUG
+  std::cout << "Import XAO from file " << theFileName << std::endl;
+  #endif
+  TopoDS_Shape aShape;
+  try {
+//    XAO::Xao aXao;
+    if (XAO::XaoExporter::readFromFile(theFileName, theXao/*&aXao*/)) {
+      XAO::Geometry* aGeometry = /*aXao*/theXao->getGeometry();
+      XAO::Format aFormat = aGeometry->getFormat();
+      if (aFormat == XAO::BREP) {
+        if (XAO::BrepGeometry* aBrepGeometry = dynamic_cast<XAO::BrepGeometry*>(aGeometry))
+          aShape = aBrepGeometry->getTopoDS_Shape();
+      } else {
+        theError = "Unsupported XAO geometry format:" + XAO::XaoUtils::shapeFormatToString(aFormat);
+        aShape.Nullify();
+      }
+    } else {
+      theError = "XAO object was not read successful";
+      aShape.Nullify();
+    }
+  } catch (XAO::XAO_Exception& e) {
+    theError = e.what();
+    aShape.Nullify();
+  }
+
+  std::shared_ptr<GeomAPI_Shape> aGeomShape(new GeomAPI_Shape);
+  aGeomShape->setImpl(new TopoDS_Shape(aShape));
+  return aGeomShape;
+}
diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_XAOImport.h b/src/GeomAlgoAPI/GeomAlgoAPI_XAOImport.h
new file mode 100644 (file)
index 0000000..0bc5ec5
--- /dev/null
@@ -0,0 +1,27 @@
+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
+
+// File:    GEOMALGOAPI_XAOImport.h
+// Created: Nov 25, 2015
+// Author:  Sergey POKHODENKO
+
+#ifndef GEOMALGOAPI_XAOIMPORT_H_
+#define GEOMALGOAPI_XAOIMPORT_H_
+
+#include <GeomAlgoAPI.h>
+
+#include <string>
+
+#include <GeomAPI_Shape.h>
+
+namespace XAO {
+class Xao;
+} // namespace XAO
+
+/// Implementation of the import XAO files algorithms
+GEOMALGOAPI_EXPORT
+std::shared_ptr<GeomAPI_Shape> XAOImport(const std::string& theFileName,
+                                          const std::string& theFormatName,
+                                          std::string& theError,
+                                          XAO::Xao* theXao);
+
+#endif /* GEOMALGOAPI_XAOIMPORT_H_ */
index 896b007591d3ba757e3072008f15f669c067d12b..99c53b61a7c50131793e8a6c877307be815df14d 100644 (file)
@@ -53,6 +53,8 @@ class ModelAPI_AttributeSelection : public ModelAPI_Attribute
   /// Returns an id of the selection
   virtual int Id() = 0;
 
+  /// Defines an id of the selection
+  virtual void setId(int theID) = 0;
 
   /// Selects sub-shape by the textual Name
   virtual void selectSubShape(const std::string& theType, const std::string& theSubShapeName) = 0;