-// Copyright (C) 2014-2019 CEA/DEN, EDF R&D
+// Copyright (C) 2014-2023 CEA, EDF
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
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;
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());
aStartV = aEndV;
}
else {
- // both vertices are found => close the loop
+ // 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());
+ for (MapVertexWire::iterator it = aMapVW.begin(); it != aMapVW.end(); ++it)
+ if (it != aFoundEnd && it->second == aFoundEnd->second) {
+ // another boundary of the wire, change link to the whole result
+ it->second = aFoundStart->second;
+ break;
+ }
aNewWires.erase(aFoundEnd->second);
+ aMapVW.erase(aFoundStart);
+ aMapVW.erase(aFoundEnd);
}
- aMapVW.erase(aFoundStart);
- aMapVW.erase(aFoundEnd);
continue;
}
}