Salome HOME
Copyright update 2022
[modules/shaper.git] / src / BuildPlugin / BuildPlugin_Wire.cpp
index 7f10590d93fbf3e2c22b4b221281ed2e8a2a1253..ff29af48add642e820dce8272b15d9ae3b516c50 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2014-2020  CEA/DEN, EDF R&D
+// Copyright (C) 2014-2022  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
@@ -122,7 +122,10 @@ void BuildPlugin_Wire::execute()
       for (ListOfShape::const_iterator anIt = anEdges.cbegin(); anIt != anEdges.cend(); ++anIt) {
         std::shared_ptr<GeomAPI_Edge> anEdgeInList(new GeomAPI_Edge(*anIt));
         if (anEdgeInList->isEqual(anEdgeInResult)) {
-          aResultBody->modified(anEdgeInList, anEdgeInResult);
+          if (anEdgeInList->isSame(anEdgeInResult))
+            aResultBody->generated(anEdgeInResult, "Edge");
+          else
+            aResultBody->modified(anEdgeInList, anEdgeInResult);
           break;
         }
       }
@@ -144,9 +147,9 @@ void BuildPlugin_Wire::execute()
 
     for (ListOfShape::iterator aWIt = aWires.begin(); aWIt != aWires.end(); ++aWIt) {
       ResultBodyPtr aResultBody = document()->createBody(data(), aResultIndex);
-      ListOfShape aSketches;
-      aSketches.push_back(anIt->second);
-      aResultBody->storeModified(aSketches, *aWIt, aMakeShapeList);
+      ListOfShape aSketch;
+      aSketch.push_back(anIt->second);
+      aResultBody->storeModified(aSketch, *aWIt, aMakeShapeList);
       aResultBody->loadModifiedShapes(aMakeShapeList, anIt->second, GeomAPI_Shape::EDGE);
       setResult(aResultBody, aResultIndex);
       ++aResultIndex;
@@ -317,11 +320,16 @@ bool buildSketchWires(FeaturePtr theSketchFeature, GeomShapePtr theSketchShape,
     const ListOfShape& aFaces = aSketchBuilder->faces();
     for (ListOfShape::const_iterator anIt = aFaces.begin(); anIt != aFaces.end(); ++anIt) {
       for (GeomAPI_ShapeExplorer aWExp(*anIt, GeomAPI_Shape::WIRE); aWExp.more(); aWExp.next()) {
+        // skip the wire if at least one its edge was already processed
         GeomAPI_ShapeExplorer aEExp(aWExp.current(), GeomAPI_Shape::EDGE);
-        if (aProcessedEdges.find(aEExp.current()) != aProcessedEdges.end())
-          continue; // wire is already processed
+        for (; aEExp.more(); aEExp.next()) {
+          if (aProcessedEdges.find(aEExp.current()) != aProcessedEdges.end())
+            break; // wire is already processed
+        }
+        if (aEExp.more())
+          continue;
         // mark edges as processed
-        for (; aEExp.more(); aEExp.next())
+        for (aEExp.init(aWExp.current(), GeomAPI_Shape::EDGE); aEExp.more(); aEExp.next())
           aProcessedEdges.insert(aEExp.current());
         // store the wire
         theWires.push_back(aWExp.current());
@@ -388,7 +396,9 @@ bool buildSketchWires(FeaturePtr theSketchFeature, GeomShapePtr theSketchShape,
       else {
         // both vertices are found
         aFoundStart->second->push_back(anEdge);
-        if (aFoundStart->second != aFoundEnd->second) {
+        if (aFoundStart->second == aFoundEnd->second)
+          aMapVW.erase(aFoundStart);
+        else {
           // different wires => merge segments
           aFoundStart->second->insert(aFoundStart->second->end(),
               aFoundEnd->second->begin(), aFoundEnd->second->end());
@@ -399,9 +409,9 @@ bool buildSketchWires(FeaturePtr theSketchFeature, GeomShapePtr theSketchShape,
               break;
             }
           aNewWires.erase(aFoundEnd->second);
+          aMapVW.erase(aFoundStart);
+          aMapVW.erase(aFoundEnd);
         }
-        aMapVW.erase(aFoundStart);
-        aMapVW.erase(aFoundEnd);
         continue;
       }
     }