Salome HOME
Improve XAO import: group_list
authorspo <sergey.pokhodenko@opencascade.com>
Fri, 27 Nov 2015 10:29:27 +0000 (13:29 +0300)
committerspo <sergey.pokhodenko@opencascade.com>
Wed, 22 Jun 2016 11:06:01 +0000 (14:06 +0300)
src/ExchangePlugin/ExchangePlugin_ImportFeature.cpp
src/ExchangePlugin/ExchangePlugin_ImportFeature.h
src/GeomAlgoAPI/GeomAlgoAPI_XAOImport.cpp
src/GeomAlgoAPI/GeomAlgoAPI_XAOImport.h

index 037c300e7113ec599c08f342f2cb92a7a1fd61f2..143bad9ac47863521e1b3bb1c805ab28e69db8e5 100644 (file)
 
 #include <GeomAPI_Shape.h>
 
-#include <ModelAPI_AttributeString.h>
+#include <ModelAPI_AttributeRefList.h>
 #include <ModelAPI_AttributeSelectionList.h>
+#include <ModelAPI_AttributeString.h>
 #include <ModelAPI_BodyBuilder.h>
 #include <ModelAPI_Data.h>
 #include <ModelAPI_Document.h>
+#include <ModelAPI_Events.h>
 #include <ModelAPI_Object.h>
 #include <ModelAPI_ResultBody.h>
 #include <ModelAPI_ResultGroup.h>
+#include <ModelAPI_Session.h>
+#include <ModelAPI_Validator.h>
 
 #include <XAO_Xao.hxx>
 #include <XAO_Group.hxx>
@@ -45,20 +49,15 @@ ExchangePlugin_ImportFeature::~ExchangePlugin_ImportFeature()
   // TODO Auto-generated destructor stub
 }
 
-/*
- * Returns the unique kind of a feature
- */
-const std::string& ExchangePlugin_ImportFeature::getKind()
-{
-  return ExchangePlugin_ImportFeature::ID();
-}
-
 /*
  * Request for initialization of data model of the feature: adding all attributes
  */
 void ExchangePlugin_ImportFeature::initAttributes()
 {
   data()->addAttribute(ExchangePlugin_ImportFeature::FILE_PATH_ID(), ModelAPI_AttributeString::typeId());
+  data()->addAttribute(ExchangePlugin_ImportFeature::GROUP_LIST_ID(), ModelAPI_AttributeRefList::typeId());
+
+  ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), ExchangePlugin_ImportFeature::GROUP_LIST_ID());
 }
 
 /*
@@ -66,86 +65,121 @@ void ExchangePlugin_ImportFeature::initAttributes()
  */
 void ExchangePlugin_ImportFeature::execute()
 {
-  AttributeStringPtr aFilePathAttr =
-      this->string(ExchangePlugin_ImportFeature::FILE_PATH_ID());
+  AttributeStringPtr aFilePathAttr = string(ExchangePlugin_ImportFeature::FILE_PATH_ID());
   std::string aFilePath = aFilePathAttr->value();
-  if (aFilePath.empty())
+  if (aFilePath.empty()) {
+    setError("File path is empty.");
     return;
+  }
 
   importFile(aFilePath);
 }
 
-bool ExchangePlugin_ImportFeature::importFile(const std::string& theFileName)
+std::shared_ptr<ModelAPI_ResultBody> ExchangePlugin_ImportFeature::createResultBody(
+    std::shared_ptr<GeomAPI_Shape> aGeomShape)
 {
-  // retrieve the file and plugin library names
-  // ".brep" -> "BREP"
+  std::shared_ptr<ModelAPI_ResultBody> aResultBody = document()->createBody(data());
+  //LoadNamingDS of the imported shape
+  loadNamingDS(aGeomShape, aResultBody);
+  return aResultBody;
+}
+
+void ExchangePlugin_ImportFeature::importFile(const std::string& theFileName)
+{
+  // "*.brep" -> "BREP"
   std::string anExtension = GeomAlgoAPI_Tools::File_Tools::extension(theFileName);
 
+  if (anExtension == "XAO") {
+    importXAO(theFileName);
+    return;
+  }
+
   // Perform the import
   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;
+  } else {
+    anError = "Cann't read files with extension: " + anExtension;
   }
 
   // Check if shape is valid
-  if (aGeomShape->isNull()) {
-    const static std::string aShapeError =
-      "An error occurred while importing " + theFileName + ": " + anError;
-    setError(aShapeError);
-    return false;
+  if (!anError.empty()) {
+    setError("An error occurred while importing " + theFileName + ": " + anError);
+    return;
   }
 
   // Pass the results into the model
   std::string anObjectName = GeomAlgoAPI_Tools::File_Tools::name(theFileName);
   data()->setName(anObjectName);
-  std::shared_ptr<ModelAPI_ResultBody> aResultBody = document()->createBody(data());
 
-  //LoadNamingDS of the imported shape
-  loadNamingDS(aGeomShape, aResultBody);
+  setResult(createResultBody(aGeomShape));
+}
+
+void ExchangePlugin_ImportFeature::importXAO(const std::string& theFileName)
+{
+  std::string anError;
+
+  XAO::Xao aXao;
+  std::shared_ptr<GeomAPI_Shape> aGeomShape = XAOImport(theFileName, anError, &aXao);
+
+  if (!anError.empty()) {
+    setError("An error occurred while importing " + theFileName + ": " + anError);
+    return;
+  }
 
+  XAO::Geometry* aXaoGeometry = aXao.getGeometry();
+  data()->setName(aXaoGeometry->getName());
+
+  std::shared_ptr<ModelAPI_ResultBody> aResultBody = createResultBody(aGeomShape);
+  aResultBody->data()->setName(aXaoGeometry->getName());
   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);
-      }
-    }
+  // Process groups
+  AttributeRefListPtr aRefListOfGroups = reflist(ExchangePlugin_ImportFeature::GROUP_LIST_ID());
+
+  // Remove previous groups stored in RefList
+  std::list<ObjectPtr> anGroupList = aRefListOfGroups->list();
+  std::list<ObjectPtr>::iterator anGroupIt = anGroupList.begin();
+  for (; anGroupIt != anGroupList.end(); ++anGroupIt) {
+    std::shared_ptr<ModelAPI_Feature> aFeature =
+        std::dynamic_pointer_cast<ModelAPI_Feature>(*anGroupIt);
+    if (aFeature)
+      document()->removeFeature(aFeature);
   }
 
-  return true;
+  // Create new groups
+  for (int aGroupIndex = 0; aGroupIndex < aXao.countGroups(); ++aGroupIndex) {
+    XAO::Group* aXaoGroup = aXao.getGroup(aGroupIndex);
+
+    std::shared_ptr<ModelAPI_Feature> aGroupFeature = document()->addFeature("Group", false);
+
+    // group name
+    if (!aXaoGroup->getName().empty())
+      aGroupFeature->data()->setName(aXaoGroup->getName());
+
+    // fill selection
+    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());
+      // complex conversion of element index to reference id
+      int anElementID = aXaoGroup->get(anElementIndex);
+      std::string aReferenceString =
+          aXaoGeometry->getElementReference(aXaoGroup->getDimension(), anElementID);
+      int aReferenceID = XAO::XaoUtils::stringToInt(aReferenceString);
+
+      aSelectionList->value(anElementIndex)->setId(aReferenceID);
+    }
+
+    aRefListOfGroups->append(aGroupFeature);
+
+    document()->setCurrentFeature(aGroupFeature, true);
+  }
 }
 
 //============================================================================
index d7cf695b438675fe9afb7454f1929f84d55e1e04..566a7b9e569836fd1e6ec4f13466bd27e7cdf750 100644 (file)
@@ -35,13 +35,22 @@ class ExchangePlugin_ImportFeature : public ModelAPI_Feature
     static const std::string MY_FILE_PATH_ID("file_path");
     return MY_FILE_PATH_ID;
   }
+  /// attribute name of group list
+  inline static const std::string& GROUP_LIST_ID()
+  {
+    static const std::string MY_GROUP_LIST_ID("group_list");
+    return MY_GROUP_LIST_ID;
+  }
   /// Default constructor
   EXCHANGEPLUGIN_EXPORT ExchangePlugin_ImportFeature();
   /// Default destructor
   EXCHANGEPLUGIN_EXPORT virtual ~ExchangePlugin_ImportFeature();
 
   /// Returns the unique kind of a feature
-  EXCHANGEPLUGIN_EXPORT virtual const std::string& getKind();
+  EXCHANGEPLUGIN_EXPORT virtual const std::string& getKind()
+  {
+    return ExchangePlugin_ImportFeature::ID();
+  }
 
   /// Request for initialization of data model of the feature: adding all attributes
   EXCHANGEPLUGIN_EXPORT virtual void initAttributes();
@@ -54,7 +63,14 @@ class ExchangePlugin_ImportFeature : public ModelAPI_Feature
 
  protected:
   /// Performs the import of the file
-  EXCHANGEPLUGIN_EXPORT bool importFile(const std::string& theFileName);
+  EXCHANGEPLUGIN_EXPORT void importFile(const std::string& theFileName);
+
+  /// Performs the import of XAO file
+  EXCHANGEPLUGIN_EXPORT void importXAO(const std::string& theFileName);
+
+  /// Creates and prepares a result body from the shape
+  std::shared_ptr<ModelAPI_ResultBody> createResultBody(
+      std::shared_ptr<GeomAPI_Shape> aGeomShape);
 
 private:
   /// Loads Naming data structure to the document
index 1440c8142503e8284ae24a4bf4cb336fd257be1a..b0309c2739b565b51c555a4d373d8236ae3ee271 100644 (file)
@@ -19,7 +19,6 @@
  */
 //=============================================================================
 std::shared_ptr<GeomAPI_Shape> XAOImport(const std::string& theFileName,
-                                         const std::string&,
                                          std::string& theError,
                                          XAO::Xao* theXao)
 {
@@ -30,9 +29,8 @@ std::shared_ptr<GeomAPI_Shape> XAOImport(const std::string& theFileName,
   #endif
   TopoDS_Shape aShape;
   try {
-//    XAO::Xao aXao;
-    if (XAO::XaoExporter::readFromFile(theFileName, theXao/*&aXao*/)) {
-      XAO::Geometry* aGeometry = /*aXao*/theXao->getGeometry();
+    if (XAO::XaoExporter::readFromFile(theFileName, theXao)) {
+      XAO::Geometry* aGeometry = theXao->getGeometry();
       XAO::Format aFormat = aGeometry->getFormat();
       if (aFormat == XAO::BREP) {
         if (XAO::BrepGeometry* aBrepGeometry = dynamic_cast<XAO::BrepGeometry*>(aGeometry))
index 0bc5ec535d2a275777853e3b6606bc37ab637e90..70e25ada8158120daec39673304c8a9a2329847c 100644 (file)
@@ -20,7 +20,6 @@ class 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);