Salome HOME
Memory usage optimization for Builders on big tags creation (like Partition).
[modules/shaper.git] / src / Model / Model_BodyBuilder.cpp
index eeb1edf6f3af64518c4d921e41e6514ffd207b97..9c143aef815a79ce0d029b73a188cb4a307ccb45 100755 (executable)
@@ -1,14 +1,27 @@
-// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
-
-// File:        Model_ResultBody.cpp
-// Created:     08 Jul 2014
-// Author:      Mikhail PONIKAROV
+// Copyright (C) 2014-2017  CEA/DEN, EDF R&D
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or
+// email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
+//
 
 #include <Model_BodyBuilder.h>
 
 #include <Model_Data.h>
 #include <Model_Document.h>
-#include <ModelAPI_AttributeIntArray.h>
 #include <TNaming_Builder.hxx>
 #include <TNaming_NamedShape.hxx>
 #include <TNaming_Iterator.hxx>
@@ -69,27 +82,29 @@ static void evolutionToSelectionRec(TDF_Label theLab, const bool theFlag) {
     }
 
     for(TNaming_Iterator anIter(aName); anIter.More(); anIter.Next()) {
-      aShapePairs.push_back(std::pair<TopoDS_Shape, TopoDS_Shape>
+      // iterator goes in reversed order relatively to the Builder, to, make the list reversed
+      aShapePairs.push_front(std::pair<TopoDS_Shape, TopoDS_Shape>
         (anIter.OldShape(), anIter.NewShape()));
     }
-  }
-  // create new
-  TNaming_Builder aBuilder(theLab);
-  TNaming_Evolution anEvol = (TNaming_Evolution)(anEvolution);
-  std::list<std::pair<TopoDS_Shape, TopoDS_Shape> >::iterator aPairsIter = aShapePairs.begin();
-  for(; aPairsIter != aShapePairs.end(); aPairsIter++) {
-    if (theFlag) { // disabled => make selection
-      aBuilder.Select(aPairsIter->first, aPairsIter->second);
-    } else if (anEvol == TNaming_GENERATED) {
-      aBuilder.Generated(aPairsIter->first, aPairsIter->second);
-    } else if (anEvol == TNaming_MODIFY) {
-      aBuilder.Modify(aPairsIter->first, aPairsIter->second);
-    } else if (anEvol == TNaming_DELETE) {
-      aBuilder.Delete(aPairsIter->first);
-    } else if (anEvol == TNaming_PRIMITIVE) {
-      aBuilder.Generated(aPairsIter->second);
-    } else if (anEvol == TNaming_SELECTED) {
-      aBuilder.Select(aPairsIter->first, aPairsIter->second);
+
+    // create new
+    TNaming_Builder aBuilder(theLab);
+    TNaming_Evolution anEvol = (TNaming_Evolution)(anEvolution);
+    std::list<std::pair<TopoDS_Shape, TopoDS_Shape> >::iterator aPairsIter = aShapePairs.begin();
+    for(; aPairsIter != aShapePairs.end(); aPairsIter++) {
+      if (theFlag) { // disabled => make selection
+        aBuilder.Select(aPairsIter->second, aPairsIter->first);
+      } else if (anEvol == TNaming_GENERATED) {
+        aBuilder.Generated(aPairsIter->first, aPairsIter->second);
+      } else if (anEvol == TNaming_MODIFY) {
+        aBuilder.Modify(aPairsIter->first, aPairsIter->second);
+      } else if (anEvol == TNaming_DELETE) {
+        aBuilder.Delete(aPairsIter->first);
+      } else if (anEvol == TNaming_PRIMITIVE) {
+        aBuilder.Generated(aPairsIter->second);
+      } else if (anEvol == TNaming_SELECTED) {
+        aBuilder.Select(aPairsIter->second, aPairsIter->first);
+      }
     }
   }
   // recursive call for all sub-labels
@@ -115,7 +130,7 @@ void Model_BodyBuilder::store(const std::shared_ptr<GeomAPI_Shape>& theShape,
   if (aData) {
     TDF_Label& aShapeLab = aData->shapeLab();
     // clean builders
-    clean();   
+    clean();
     // store the new shape as primitive
     TNaming_Builder aBuilder(aShapeLab);
     if (!theShape)
@@ -130,18 +145,21 @@ void Model_BodyBuilder::store(const std::shared_ptr<GeomAPI_Shape>& theShape,
         // This shape is already in document, store reference instead of shape;
         const TDF_Label aFoundLabel = aNS->Label();
         TDF_Reference::Set(aShapeLab, aFoundLabel);
+        aShapeLab.ForgetAttribute(TNaming_NamedShape::GetID());
         return;
       }
     }
 
-    aBuilder.Generated(aShape);        
+    aBuilder.Generated(aShape);
     // register name
+    aShapeLab.ForgetAttribute(TDF_Reference::GetID());
     if(!aBuilder.NamedShape()->IsEmpty()) {
       Handle(TDataStd_Name) anAttr;
       if(aBuilder.NamedShape()->Label().FindAttribute(TDataStd_Name::GetID(),anAttr)) {
         std::string aName (TCollection_AsciiString(anAttr->Get()).ToCString());
         if(!aName.empty()) {
-          std::shared_ptr<Model_Document> aDoc = std::dynamic_pointer_cast<Model_Document>(document());
+          std::shared_ptr<Model_Document> aDoc =
+            std::dynamic_pointer_cast<Model_Document>(document());
           aDoc->addNamingName(aBuilder.NamedShape()->Label(), aName);
         }
       }
@@ -156,7 +174,7 @@ void Model_BodyBuilder::storeGenerated(const std::shared_ptr<GeomAPI_Shape>& the
   if (aData) {
     TDF_Label& aShapeLab = aData->shapeLab();
     // clean builders
-    clean();   
+    clean();
     // store the new shape as primitive
     TNaming_Builder aBuilder(aShapeLab);
     if (!theFromShape || !theToShape)
@@ -174,7 +192,8 @@ void Model_BodyBuilder::storeGenerated(const std::shared_ptr<GeomAPI_Shape>& the
       if(aBuilder.NamedShape()->Label().FindAttribute(TDataStd_Name::GetID(),anAttr)) {
         std::string aName (TCollection_AsciiString(anAttr->Get()).ToCString());
         if(!aName.empty()) {
-          std::shared_ptr<Model_Document> aDoc = std::dynamic_pointer_cast<Model_Document>(document());
+          std::shared_ptr<Model_Document> aDoc =
+            std::dynamic_pointer_cast<Model_Document>(document());
           aDoc->addNamingName(aBuilder.NamedShape()->Label(), aName);
         }
       }
@@ -189,7 +208,7 @@ void Model_BodyBuilder::storeModified(const std::shared_ptr<GeomAPI_Shape>& theO
   if (aData) {
     TDF_Label& aShapeLab = aData->shapeLab();
     // clean builders
-    clean();   
+    clean();
     // store the new shape as primitive
     TNaming_Builder aBuilder(aShapeLab);
     if (!theOldShape || !theNewShape)
@@ -201,34 +220,14 @@ void Model_BodyBuilder::storeModified(const std::shared_ptr<GeomAPI_Shape>& theO
     if (aShapeNew.IsNull())
       return;  // null shape inside
     aBuilder.Modify(aShapeOld, aShapeNew);
-    if (theDecomposeSolidsTag && aShapeNew.ShapeType() == TopAbs_COMPOUND) { // make sub elements as subs
-
-      // register name if it is possible
-      TCollection_AsciiString aName;
-      if(!aBuilder.NamedShape()->IsEmpty()) {
-        Handle(TDataStd_Name) anAttr;
-        if(aBuilder.NamedShape()->Label().FindAttribute(TDataStd_Name::GetID(),anAttr)) {
-          aName = TCollection_AsciiString(anAttr->Get()).ToCString();
-        }
-      }
-
-      TopoDS_Iterator aSubIter(aShapeNew);
-      for(int aTag = theDecomposeSolidsTag; aSubIter.More(); aSubIter.Next()) {
-        const TopoDS_Shape& aShape = aSubIter.Value();
-        Handle(TNaming_NamedShape) aNS = TNaming_Tool::NamedShape(aShape, aShapeLab);
-        if(!aNS.IsNull() && !aNS->IsEmpty()) {
-          // This shape is already in document, don't add it.
-          continue;
-        }
-        TNaming_Builder aSubBuilder(aShapeLab.FindChild(aTag++));
-        aSubBuilder.Generated(aSubIter.Value());
-        if(!aName.IsEmpty()) {
-          std::string aSolidName = 
-            (aName + "_Solid_" + TCollection_AsciiString(aTag - theDecomposeSolidsTag)).ToCString(); 
-          std::shared_ptr<Model_Document> aDoc = 
+    if(!aBuilder.NamedShape()->IsEmpty()) {
+      Handle(TDataStd_Name) anAttr;
+      if(aBuilder.NamedShape()->Label().FindAttribute(TDataStd_Name::GetID(),anAttr)) {
+        std::string aName (TCollection_AsciiString(anAttr->Get()).ToCString());
+        if(!aName.empty()) {
+          std::shared_ptr<Model_Document> aDoc =
             std::dynamic_pointer_cast<Model_Document>(document());
-          aDoc->addNamingName(aSubBuilder.NamedShape()->Label(), aSolidName);
-          TDataStd_Name::Set(aSubBuilder.NamedShape()->Label(), aSolidName.c_str());
+          aDoc->addNamingName(aBuilder.NamedShape()->Label(), aName);
         }
       }
     }
@@ -239,7 +238,7 @@ void  Model_BodyBuilder::storeWithoutNaming(const std::shared_ptr<GeomAPI_Shape>
 {
   std::shared_ptr<Model_Data> aData = std::dynamic_pointer_cast<Model_Data>(data());
   if (aData) {
-    clean();   
+    clean();
     if (!theShape.get())
       return; // bad shape
     TopoDS_Shape aShape = theShape->impl<TopoDS_Shape>();
@@ -252,9 +251,9 @@ void  Model_BodyBuilder::storeWithoutNaming(const std::shared_ptr<GeomAPI_Shape>
 
 void Model_BodyBuilder::clean()
 {
-  std::vector<TNaming_Builder*>::iterator aBuilder = myBuilders.begin();
+  std::map<int, TNaming_Builder*>::iterator aBuilder = myBuilders.begin();
   for(; aBuilder != myBuilders.end(); aBuilder++)
-    delete *aBuilder;
+    delete aBuilder->second;
   myBuilders.clear();
 }
 
@@ -265,32 +264,27 @@ Model_BodyBuilder::~Model_BodyBuilder()
 
 TNaming_Builder* Model_BodyBuilder::builder(const int theTag)
 {
-  if (myBuilders.size() <= (unsigned int)theTag) {
-    myBuilders.insert(myBuilders.end(), theTag - myBuilders.size() + 1, NULL);
-  }
-  if (!myBuilders[theTag]) {
+  std::map<int, TNaming_Builder*>::iterator aFind = myBuilders.find(theTag);
+  if (aFind == myBuilders.end()) {
     std::shared_ptr<Model_Data> aData = std::dynamic_pointer_cast<Model_Data>(data());
     myBuilders[theTag] = new TNaming_Builder(aData->shapeLab().FindChild(theTag));
-    //TCollection_AsciiString entry;//
-    //TDF_Tool::Entry(aData->shapeLab().FindChild(theTag), entry);
-    //cout << "Label = " <<entry.ToCString() <<endl;
+    aFind = myBuilders.find(theTag);
   }
-  return myBuilders[theTag];
+  return aFind->second;
 }
 
 void Model_BodyBuilder::buildName(const int theTag, const std::string& theName)
 {
-  std::string aName = data()->name() + "/" + theName; 
   std::shared_ptr<Model_Document> aDoc = std::dynamic_pointer_cast<Model_Document>(document());
-  aDoc->addNamingName(builder(theTag)->NamedShape()->Label(), aName);
-  TDataStd_Name::Set(builder(theTag)->NamedShape()->Label(),aName.c_str());
+  //aDoc->addNamingName(builder(theTag)->NamedShape()->Label(), theName);
+  TDataStd_Name::Set(builder(theTag)->NamedShape()->Label(), theName.c_str());
 }
 void Model_BodyBuilder::generated(
   const std::shared_ptr<GeomAPI_Shape>& theNewShape, const std::string& theName, const int theTag)
 {
   TopoDS_Shape aShape = theNewShape->impl<TopoDS_Shape>();
   builder(theTag)->Generated(aShape);
-  if(!theName.empty()) 
+  if(!theName.empty())
     buildName(theTag, theName);
 }
 
@@ -300,8 +294,24 @@ void Model_BodyBuilder::generated(const std::shared_ptr<GeomAPI_Shape>& theOldSh
   TopoDS_Shape anOldShape = theOldShape->impl<TopoDS_Shape>();
   TopoDS_Shape aNewShape = theNewShape->impl<TopoDS_Shape>();
   builder(theTag)->Generated(anOldShape, aNewShape);
-  if(!theName.empty()) 
+  if(!theName.empty())
     buildName(theTag, theName);
+  TopAbs_ShapeEnum aGenShapeType = aNewShape.ShapeType();
+  if(aGenShapeType == TopAbs_WIRE || aGenShapeType == TopAbs_SHELL) {
+    TopAbs_ShapeEnum anExplodeShapeType = aGenShapeType == TopAbs_WIRE ? TopAbs_EDGE : TopAbs_FACE;
+    const TDF_Label aLabel = builder(theTag)->NamedShape()->Label();
+    int aTag = 1;
+    std::shared_ptr<Model_Document> aDoc = std::dynamic_pointer_cast<Model_Document>(document());
+    for(TopExp_Explorer anExp(aNewShape, anExplodeShapeType); anExp.More(); anExp.Next()) {
+      TDF_Label aChildLabel = aLabel.FindChild(aTag);
+      TNaming_Builder aBuilder(aChildLabel);
+      aBuilder.Generated(anOldShape, anExp.Current());
+      TCollection_AsciiString aChildName = TCollection_AsciiString((theName + "_").c_str()) + aTag;
+      //aDoc->addNamingName(aChildLabel, aChildName.ToCString());
+      TDataStd_Name::Set(aChildLabel, aChildName.ToCString());
+      aTag++;
+    }
+  }
 }
 
 
@@ -311,7 +321,7 @@ void Model_BodyBuilder::modified(const std::shared_ptr<GeomAPI_Shape>& theOldSha
   TopoDS_Shape anOldShape = theOldShape->impl<TopoDS_Shape>();
   TopoDS_Shape aNewShape = theNewShape->impl<TopoDS_Shape>();
   builder(theTag)->Modify(anOldShape, aNewShape);
-  if(!theName.empty()) 
+  if(!theName.empty())
     buildName(theTag, theName);
 }
 
@@ -348,15 +358,17 @@ void Model_BodyBuilder::loadAndOrientModifiedShapes (
   const int  theTag,
   const std::string& theName,
   GeomAPI_DataMapOfShapeShape& theSubShapes,
-  const bool theIsStoreSeparate)
+  const bool theIsStoreSeparate,
+  const bool theIsStoreAsGenerated)
 {
+  int anIndex = 1;
   int aTag = theTag;
+  bool isBuilt = !theName.empty();
   std::string aName = theName;
   std::ostringstream aStream;
-  int anIndex = 1;
+  GeomShapePtr aResultShape = shape();
   TopoDS_Shape aShapeIn = theShapeIn->impl<TopoDS_Shape>();
   TopTools_MapOfShape aView;
-  bool isBuilt = theName.empty();
   TopExp_Explorer aShapeExplorer (aShapeIn, (TopAbs_ShapeEnum)theKindOfShape);
   for (; aShapeExplorer.More(); aShapeExplorer.Next ()) {
     const TopoDS_Shape& aRoot = aShapeExplorer.Current ();
@@ -365,16 +377,25 @@ void Model_BodyBuilder::loadAndOrientModifiedShapes (
     std::shared_ptr<GeomAPI_Shape> aRShape(new GeomAPI_Shape());
     aRShape->setImpl((new TopoDS_Shape(aRoot)));
     theMS->modified(aRShape, aList);
-    std::list<std::shared_ptr<GeomAPI_Shape> >::const_iterator anIt = aList.begin(), aLast = aList.end();
+    std::list<std::shared_ptr<GeomAPI_Shape> >::const_iterator
+      anIt = aList.begin(), aLast = aList.end();
     for (; anIt != aLast; anIt++) {
-      TopoDS_Shape aNewShape = (*anIt)->impl<TopoDS_Shape>();    
+      TopoDS_Shape aNewShape = (*anIt)->impl<TopoDS_Shape>();
       if (theSubShapes.isBound(*anIt)) {
         std::shared_ptr<GeomAPI_Shape> aMapShape(theSubShapes.find(*anIt));
         aNewShape.Orientation(aMapShape->impl<TopoDS_Shape>().Orientation());
       }
-      if (!aRoot.IsSame (aNewShape)) {
-        builder(aTag)->Modify(aRoot,aNewShape);
-        if(!isBuilt) {
+      GeomShapePtr aGeomNewShape(new GeomAPI_Shape());
+      aGeomNewShape->setImpl(new TopoDS_Shape(aNewShape));
+      if(!aRoot.IsSame(aNewShape) && aResultShape->isSubShape(aGeomNewShape)) {
+        if(theIsStoreAsGenerated) {
+          // Here we store shapes as generated, to avoid problem when one parent shape produce
+          // several child shapes. In this case naming could not determine which shape to select.
+          builder(aTag)->Generated(aRoot,aNewShape);
+        } else {
+          builder(aTag)->Modify(aRoot,aNewShape);
+        }
+        if(isBuilt) {
           if(theIsStoreSeparate) {
             aStream.str(std::string());
             aStream.clear();
@@ -401,7 +422,7 @@ void Model_BodyBuilder::loadAndOrientGeneratedShapes (
 {
   TopoDS_Shape aShapeIn = theShapeIn->impl<TopoDS_Shape>();
   TopTools_MapOfShape aView;
-  bool isBuilt = theName.empty();
+  bool isBuilt = !theName.empty();
   TopExp_Explorer aShapeExplorer (aShapeIn, (TopAbs_ShapeEnum)theKindOfShape);
   for (; aShapeExplorer.More(); aShapeExplorer.Next ()) {
     const TopoDS_Shape& aRoot = aShapeExplorer.Current ();
@@ -410,26 +431,45 @@ void Model_BodyBuilder::loadAndOrientGeneratedShapes (
     std::shared_ptr<GeomAPI_Shape> aRShape(new GeomAPI_Shape());
     aRShape->setImpl((new TopoDS_Shape(aRoot)));
     theMS->generated(aRShape, aList);
-    std::list<std::shared_ptr<GeomAPI_Shape> >::const_iterator anIt = aList.begin(), aLast = aList.end();
+    std::list<std::shared_ptr<GeomAPI_Shape> >::const_iterator
+      anIt = aList.begin(), aLast = aList.end();
     for (; anIt != aLast; anIt++) {
-      TopoDS_Shape aNewShape = (*anIt)->impl<TopoDS_Shape>();    
+      TopoDS_Shape aNewShape = (*anIt)->impl<TopoDS_Shape>();
       if (theSubShapes.isBound(*anIt)) {
         std::shared_ptr<GeomAPI_Shape> aMapShape(theSubShapes.find(*anIt));
         aNewShape.Orientation(aMapShape->impl<TopoDS_Shape>().Orientation());
       }
       if (!aRoot.IsSame (aNewShape)) {
         builder(theTag)->Generated(aRoot,aNewShape);
-        if(!isBuilt) 
-          buildName(theTag, theName);  
+        if(isBuilt)
+          buildName(theTag, theName);
+      }
+      TopAbs_ShapeEnum aGenShapeType = aNewShape.ShapeType();
+      if(aGenShapeType == TopAbs_WIRE || aGenShapeType == TopAbs_SHELL) {
+        TopAbs_ShapeEnum anExplodeShapeType =
+          aGenShapeType == TopAbs_WIRE ? TopAbs_EDGE : TopAbs_FACE;
+        const TDF_Label aLabel = builder(theTag)->NamedShape()->Label();
+        int aTag = 1;
+        std::shared_ptr<Model_Document> aDoc =
+          std::dynamic_pointer_cast<Model_Document>(document());
+        for(TopExp_Explorer anExp(aNewShape, anExplodeShapeType); anExp.More(); anExp.Next()) {
+          TDF_Label aChildLabel = aLabel.FindChild(aTag);
+          TNaming_Builder aBuilder(aChildLabel);
+          aBuilder.Generated(aRoot, anExp.Current());
+          TCollection_AsciiString aChildName =
+            TCollection_AsciiString((theName + "_").c_str()) + aTag;
+          TDataStd_Name::Set(aChildLabel, aChildName.ToCString());
+          aTag++;
+        }
       }
     }
   }
 }
 
 //=======================================================================
-int getDangleShapes(const TopoDS_Shape&           theShapeIn, 
+int getDangleShapes(const TopoDS_Shape&           theShapeIn,
   const TopAbs_ShapeEnum        theGeneratedFrom,
-  TopTools_DataMapOfShapeShape& theDangles) 
+  TopTools_DataMapOfShapeShape& theDangles)
 {
   theDangles.Clear();
   TopTools_IndexedDataMapOfShapeListOfShape subShapeAndAncestors;
@@ -455,21 +495,21 @@ void loadGeneratedDangleShapes(
   TopTools_DataMapOfShapeShape dangles;
   if (!getDangleShapes(theShapeIn, theGeneratedFrom, dangles)) return;
   TopTools_DataMapIteratorOfDataMapOfShapeShape itr(dangles);
-  for (; itr.More(); itr.Next()) 
+  for (; itr.More(); itr.Next())
     theBuilder->Generated(itr.Key(), itr.Value());
 }
 
 //=======================================================================
-void Model_BodyBuilder::loadNextLevels(std::shared_ptr<GeomAPI_Shape> theShape, 
+void Model_BodyBuilder::loadNextLevels(std::shared_ptr<GeomAPI_Shape> theShape,
   const std::string& theName, int&  theTag)
 {
   if(theShape->isNull()) return;
-  TopoDS_Shape aShape = theShape->impl<TopoDS_Shape>();    
+  TopoDS_Shape aShape = theShape->impl<TopoDS_Shape>();
   std::string aName;
-  if (aShape.ShapeType() == TopAbs_SOLID) {                
+  if (aShape.ShapeType() == TopAbs_SOLID) {
     TopExp_Explorer expl(aShape, TopAbs_FACE);
-    for (; expl.More(); expl.Next()) {  
-      builder(theTag)->Generated(expl.Current()); 
+    for (; expl.More(); expl.Next()) {
+      builder(theTag)->Generated(expl.Current());
       TCollection_AsciiString aStr(theTag);
       aName = theName + aStr.ToCString();
       buildName(theTag, aName);
@@ -483,7 +523,7 @@ void Model_BodyBuilder::loadNextLevels(std::shared_ptr<GeomAPI_Shape> theShape,
     if (Faces.Extent() > 1 || (aShape.ShapeType() == TopAbs_SHELL && Faces.Extent() == 1)) {
       TopExp_Explorer expl(aShape, TopAbs_FACE);
       for (; expl.More(); expl.Next()) {
-        builder(theTag)->Generated(expl.Current());          
+        builder(theTag)->Generated(expl.Current());
         TCollection_AsciiString aStr(theTag);
         aName = theName + aStr.ToCString();
         buildName(theTag, aName);
@@ -492,7 +532,7 @@ void Model_BodyBuilder::loadNextLevels(std::shared_ptr<GeomAPI_Shape> theShape,
     }
     TopTools_IndexedDataMapOfShapeListOfShape anEdgeAndNeighbourFaces;
     TopExp::MapShapesAndAncestors(aShape, TopAbs_EDGE, TopAbs_FACE, anEdgeAndNeighbourFaces);
-    for (Standard_Integer i = 1; i <= anEdgeAndNeighbourFaces.Extent(); i++) 
+    for (Standard_Integer i = 1; i <= anEdgeAndNeighbourFaces.Extent(); i++)
     {
       const TopTools_ListOfShape& aLL = anEdgeAndNeighbourFaces.FindFromIndex(i);
       if (aLL.Extent() < 2) {
@@ -530,25 +570,25 @@ void Model_BodyBuilder::loadNextLevels(std::shared_ptr<GeomAPI_Shape> theShape,
         theTag++;
       }
     } else {
-      TopExp_Explorer expl(aShape, TopAbs_EDGE); 
-      for (; expl.More(); expl.Next()) {       
+      TopExp_Explorer expl(aShape, TopAbs_EDGE);
+      for (; expl.More(); expl.Next()) {
         builder(theTag)->Generated(expl.Current());
         TCollection_AsciiString aStr(theTag);
         aName = theName + aStr.ToCString();
         buildName(theTag, aName);
         theTag++;
-      }   
+      }
       // and load generated vertices.
       TopTools_DataMapOfShapeShape generated;
-      if (getDangleShapes(aShape, TopAbs_EDGE, generated)) 
+      if (getDangleShapes(aShape, TopAbs_EDGE, generated))
       {
         TNaming_Builder* pBuilder = builder(theTag++);
-        loadGeneratedDangleShapes(aShape, TopAbs_EDGE, pBuilder);  
+        loadGeneratedDangleShapes(aShape, TopAbs_EDGE, pBuilder);
       }
     }
   } else if (aShape.ShapeType() == TopAbs_EDGE) {
     TopExp_Explorer expl(aShape, TopAbs_VERTEX);
-    for (; expl.More(); expl.Next()) {      
+    for (; expl.More(); expl.Next()) {
       builder(theTag)->Generated(expl.Current());
       TCollection_AsciiString aStr(theTag);
       aName = theName + aStr.ToCString();
@@ -559,8 +599,8 @@ void Model_BodyBuilder::loadNextLevels(std::shared_ptr<GeomAPI_Shape> theShape,
 }
 
 //=======================================================================
-int findAmbiguities(const TopoDS_Shape&           theShapeIn,                                  
-  TopTools_ListOfShape&   theList) 
+int findAmbiguities(const TopoDS_Shape&           theShapeIn,
+  TopTools_ListOfShape&   theList)
 {
   int aNumEdges(0);
   theList.Clear();
@@ -583,21 +623,21 @@ int findAmbiguities(const TopoDS_Shape&           theShapeIn,
       if(ancestors1.Extent() == ancestors2.Extent() && ancestors1.Extent() > 1) {
         int aNum (ancestors2.Extent());
         TopTools_ListIteratorOfListOfShape it(ancestors2);
-        for(;it.More();it.Next()) 
+        for(;it.More();it.Next())
           if(aMap1.Contains(it.Value())) aNum--;
         if(aNum == 0) {
-          if(aMap2.Add(aKeyEdge1)) 
+          if(aMap2.Add(aKeyEdge1))
             aKeyList.Append(aKeyEdge1);
           if(aMap2.Add(aKeyEdge2))
             aKeyList.Append(aKeyEdge2);
         }
       }
-    } // at the end ==> List of edges to be named in addition  
+    } // at the end ==> List of edges to be named in addition
   }
   aNumEdges = aKeyList.Extent();
   if(aNumEdges)
-    theList.Assign(aKeyList);  
-  return aNumEdges; 
+    theList.Assign(aKeyList);
+  return aNumEdges;
 }
 
 //=======================================================================
@@ -605,7 +645,7 @@ void Model_BodyBuilder::loadFirstLevel(
   std::shared_ptr<GeomAPI_Shape> theShape, const std::string& theName, int&  theTag)
 {
   if(theShape->isNull()) return;
-  TopoDS_Shape aShape = theShape->impl<TopoDS_Shape>(); 
+  TopoDS_Shape aShape = theShape->impl<TopoDS_Shape>();
   std::string aName;
   if (aShape.ShapeType() == TopAbs_COMPOUND || aShape.ShapeType() == TopAbs_COMPSOLID) {
     TopoDS_Iterator itr(aShape);
@@ -615,22 +655,22 @@ void Model_BodyBuilder::loadFirstLevel(
       aName = theName + aStr.ToCString();
       buildName(theTag, aName);
       if(!theName.empty()) buildName(theTag, aName);
-      if (itr.Value().ShapeType() == TopAbs_COMPOUND || 
-        itr.Value().ShapeType() == TopAbs_COMPSOLID) 
+      if (itr.Value().ShapeType() == TopAbs_COMPOUND ||
+        itr.Value().ShapeType() == TopAbs_COMPSOLID)
       {
         std::shared_ptr<GeomAPI_Shape> itrShape(new GeomAPI_Shape());
         itrShape->setImpl(new TopoDS_Shape(itr.Value()));
         loadFirstLevel(itrShape, theName, theTag);
       } else {
         std::shared_ptr<GeomAPI_Shape> itrShape(new GeomAPI_Shape());
-        itrShape->setImpl(new TopoDS_Shape(itr.Value()));              
+        itrShape->setImpl(new TopoDS_Shape(itr.Value()));
         loadNextLevels(itrShape, theName, theTag);
       }
     }
   } else {
     std::shared_ptr<GeomAPI_Shape> itrShape(new GeomAPI_Shape());
     itrShape->setImpl(new TopoDS_Shape(aShape));
-    loadNextLevels(itrShape, theName, theTag); 
+    loadNextLevels(itrShape, theName, theTag);
   }
   TopTools_ListOfShape   aList;
   if(findAmbiguities(aShape, aList)) {
@@ -649,7 +689,7 @@ void Model_BodyBuilder::loadDisconnectedEdges(
   std::shared_ptr<GeomAPI_Shape> theShape, const std::string& theName, int&  theTag)
 {
   if(theShape->isNull()) return;
-  TopoDS_Shape aShape = theShape->impl<TopoDS_Shape>();  
+  TopoDS_Shape aShape = theShape->impl<TopoDS_Shape>();
   TopTools_DataMapOfShapeListOfShape edgeNaborFaces;
   TopTools_ListOfShape empty;
   TopExp_Explorer explF(aShape, TopAbs_FACE);
@@ -667,30 +707,13 @@ void Model_BodyBuilder::loadDisconnectedEdges(
           break;
         }
       }
-      if (faceIsNew) 
-        edgeNaborFaces.ChangeFind(anEdge).Append(aFace);      
+      if (faceIsNew)
+        edgeNaborFaces.ChangeFind(anEdge).Append(aFace);
     }
   }
 
-  /*  TopTools_IndexedDataMapOfShapeListOfShape aDM;
-  TopExp::MapShapesAndAncestors(aShape, TopAbs_EDGE, TopAbs_FACE, aDM);
-  for(int i=1; i <= aDM.Extent(); i++) {
-  if(aDM.FindFromIndex(i).Extent() > 1) continue;
-  if (BRep_Tool::Degenerated(TopoDS::Edge(aDM.FindKey(i))))
-  continue;
-  builder(theTag)->Generated(aDM.FindKey(i));
-  TCollection_AsciiString aStr(theTag);
-  std::string aName = theName + aStr.ToCString();
-  buildName(theTag, aName);
-  #ifdef DEB_IMPORT
-  aName +=  + ".brep";
-  BRepTools::Write(aDM.FindKey(i), aName.c_str());
-  #endif
-  theTag++;
-  }
-  */
   TopTools_MapOfShape anEdgesToDelete;
-  TopExp_Explorer anEx(aShape,TopAbs_EDGE); 
+  TopExp_Explorer anEx(aShape,TopAbs_EDGE);
   std::string aName;
   for(;anEx.More();anEx.Next()) {
     Standard_Boolean aC0 = Standard_False;
@@ -720,26 +743,27 @@ void Model_BodyBuilder::loadDisconnectedEdges(
             theTag++;
           }
         }
-      }      
+      }
       TopTools_MapIteratorOfMapOfShape itDelete(anEdgesToDelete);
-      for(;itDelete.More();itDelete.Next()) 
-        edgeNaborFaces.UnBind(itDelete.Key());      
+      for(;itDelete.More();itDelete.Next())
+        edgeNaborFaces.UnBind(itDelete.Key());
       edgeNaborFaces.UnBind(anEdge1);
     }
     if (aC0) {
       builder(theTag)->Generated(anEdge1);
       TCollection_AsciiString aStr(theTag);
       aName = theName + aStr.ToCString();
-      buildName(theTag, aName);         
+      buildName(theTag, aName);
       theTag++;
     }
-  }  
+  }
 }
 
-void Model_BodyBuilder::loadDisconnectedVertexes(std::shared_ptr<GeomAPI_Shape> theShape, const std::string& theName, int&  theTag)
+void Model_BodyBuilder::loadDisconnectedVertexes(std::shared_ptr<GeomAPI_Shape> theShape,
+                                                 const std::string& theName, int&  theTag)
 {
   if(theShape->isNull()) return;
-  TopoDS_Shape aShape = theShape->impl<TopoDS_Shape>();  
+  TopoDS_Shape aShape = theShape->impl<TopoDS_Shape>();
   TopTools_DataMapOfShapeListOfShape vertexNaborEdges;
   TopTools_ListOfShape empty;
   TopExp_Explorer explF(aShape, TopAbs_EDGE);
@@ -766,11 +790,11 @@ void Model_BodyBuilder::loadDisconnectedVertexes(std::shared_ptr<GeomAPI_Shape>
   TopTools_DataMapIteratorOfDataMapOfShapeListOfShape itr(vertexNaborEdges);
   for (; itr.More(); itr.Next()) {
     const TopTools_ListOfShape& naborEdges = itr.Value();
-    if (naborEdges.Extent() < 2) {             
+    if (naborEdges.Extent() < 2) {
       builder(theTag)->Generated(itr.Key());
       TCollection_AsciiString aStr(theTag);
       aName = theName + aStr.ToCString();
-      buildName(theTag, aName);         
+      buildName(theTag, aName);
       theTag++;
     }
   }
@@ -801,7 +825,7 @@ std::shared_ptr<GeomAPI_Shape> Model_BodyBuilder::shape()
 bool Model_BodyBuilder::isLatestEqual(const std::shared_ptr<GeomAPI_Shape>& theShape)
 {
   if (theShape.get()) {
-    TopoDS_Shape aShape = theShape->impl<TopoDS_Shape>();  
+    TopoDS_Shape aShape = theShape->impl<TopoDS_Shape>();
     std::shared_ptr<Model_Data> aData = std::dynamic_pointer_cast<Model_Data>(data());
     if (aData) {
       TDF_Label& aShapeLab = aData->shapeLab();