]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Dump Python in the High Level Parameterized Geometry API (issue #1648)
authorazv <azv@opencascade.com>
Thu, 11 Aug 2016 12:16:28 +0000 (15:16 +0300)
committerazv <azv@opencascade.com>
Thu, 11 Aug 2016 12:16:28 +0000 (15:16 +0300)
* Dump user-defined names

src/ModelHighAPI/ModelHighAPI_Dumper.cpp
src/ModelHighAPI/ModelHighAPI_Dumper.h
src/PartSetAPI/PartSetAPI_Part.cpp

index efff259272624d4f7b7965828fcf4d6ff9760226..55cd9f2c7583fdd1e37b0e476daad817aeb60c92 100644 (file)
 
 #include <OSD_OpenFile.hxx>
 
-#include <algorithm>
 #include <fstream>
 
-//#define DUMP_USER_DEFINED_NAMES
+#define DUMP_USER_DEFINED_NAMES
 
 ModelHighAPI_Dumper* ModelHighAPI_Dumper::mySelf = 0;
 
@@ -73,6 +72,7 @@ void ModelHighAPI_Dumper::clear(bool bufferOnly)
 
     myNames.clear();
     myModules.clear();
+    myFeatureCount.clear();
     myLastEntityWithName = EntityPtr();
   }
 }
@@ -90,23 +90,32 @@ const std::string& ModelHighAPI_Dumper::name(const EntityPtr& theEntity)
 
   // entity is not found, store it
   std::string aName;
-  bool isNameDefined = false;
+  bool isUserDefined = false;
   FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(theEntity);
   if (aFeature) {
+    isUserDefined = true;
     aName = aFeature->name();
-    isNameDefined = !aName.empty();
-
-    if (!isNameDefined) {
-      static long anIndex = 0;
-      // set default name: feature ID + index
-      std::ostringstream aConverter;
-      aConverter << aFeature->getKind() << "_" << ++anIndex;
-      aName = aConverter.str();
-      std::transform(aName.begin(), aName.end(), aName.begin(), ::tolower);
+    const std::string& aKind = aFeature->getKind();
+    DocumentPtr aDoc = aFeature->document();
+    int& aNbFeatures = myFeatureCount[aDoc][aKind];
+
+    size_t anIndex = aName.find(aKind);
+    if (anIndex == 0 && aName[aKind.length()] == '_') { // name starts with "FeatureKind_"
+      std::string anIdStr = aName.substr(aKind.length() + 1, std::string::npos);
+      int anId = std::stoi(anIdStr);
+
+      // Check number of already registered objects of such kind. Index of current object
+      // should be greater than it to identify feature's name as automatically generated.
+      if (aNbFeatures < anId) {
+        isUserDefined = false;
+        aNbFeatures = anId - 1;
+      }
     }
+
+    aNbFeatures += 1;
   }
 
-  myNames[theEntity] = std::pair<std::string, bool>(aName, isNameDefined);
+  myNames[theEntity] = std::pair<std::string, bool>(aName, isUserDefined);
   myNotDumpedEntities.insert(theEntity);
   return myNames[theEntity].first;
 }
@@ -160,8 +169,13 @@ bool ModelHighAPI_Dumper::process(const std::shared_ptr<ModelAPI_Document>& theD
       if (!aPartResult)
         continue;
       DocumentPtr aSubDoc = aPartResult->partDoc();
-      // set name of document equal to part name
-      myNames[aSubDoc] = myNames[*aFeatIt];
+      // set name of document
+      const std::string& aPartName = myNames[*aFeatIt].first;
+      std::string aDocName = aPartName + "_doc";
+      myNames[aSubDoc] = std::pair<std::string, bool>(aDocName, false);
+
+      // dump document in a single line
+      *this << aDocName << " = " << aPartName << ".document()" << std::endl;
 
       isOk = process(aSubDoc) && isOk;
     } else
index 2c9edffe4e80cc1f774c5119f111aec30c768837..2bab94d9cda8d91308ae67eff6eaab376265d1e8 100644 (file)
@@ -39,8 +39,9 @@ class ModelAPI_Entity;
 class ModelAPI_Feature;
 class ModelAPI_Object;
 
-typedef std::shared_ptr<ModelAPI_Entity>  EntityPtr;
-typedef std::shared_ptr<ModelAPI_Feature> FeaturePtr;
+typedef std::shared_ptr<ModelAPI_Document> DocumentPtr;
+typedef std::shared_ptr<ModelAPI_Entity>   EntityPtr;
+typedef std::shared_ptr<ModelAPI_Feature>  FeaturePtr;
 
 /**\class ModelHighAPI_Dumper
  * \ingroup CPPHighAPI
@@ -211,6 +212,7 @@ private:
 private:
   typedef std::map<EntityPtr, std::pair<std::string, bool> > EntityNameMap;
   typedef std::map<std::string, std::set<std::string> >      ModulesMap;
+  typedef std::map<DocumentPtr, std::map<std::string, int> > NbFeaturesMap;
 
   static ModelHighAPI_Dumper* mySelf;
 
@@ -221,6 +223,8 @@ private:
   EntityNameMap       myNames;              ///< names of the entities
   EntityPtr           myLastEntityWithName; ///< not null, if last dumped entity had user defined name
 
+  NbFeaturesMap       myFeatureCount;       ///< number of features of each kind
+
 protected:
   std::set<EntityPtr> myNotDumpedEntities;  ///< list of entities, used by other features but not dumped yet
 };
index acda463d3a1651c918b17084eefd841d154474df..9460819c648d4ed791b81dc9dc3de6e09d8ac86a 100644 (file)
@@ -35,7 +35,7 @@ void PartSetAPI_Part::dump(ModelHighAPI_Dumper& theDumper) const
   FeaturePtr aBase = feature();
   const std::string& aDocName = theDumper.name(aBase->document());
 
-  theDumper << aBase << " = model.addPart(" << aDocName << ").document()" << std::endl;
+  theDumper << aBase << " = model.addPart(" << aDocName << ")" << std::endl;
 }
 
 //--------------------------------------------------------------------------------------