@@ -62,13 +62,7 @@ IMPLEMENT_STANDARD_RTTIEXT(ShapeFix_Shell, ShapeFix_Root)
6262namespace
6363{
6464// Type aliases for unordered maps with custom allocators
65- using FaceEdgesAllocator =
66- NCollection_Allocator<std::pair<const TopoDS_Face, NCollection_Array1<TopoDS_Edge>>>;
67- using FaceEdgesMap = std::unordered_map<TopoDS_Face,
68- NCollection_Array1<TopoDS_Edge>,
69- TopTools_ShapeMapHasher,
70- TopTools_ShapeMapHasher,
71- FaceEdgesAllocator>;
65+ using FaceEdgesMap = NCollection_IndexedDataMap<TopoDS_Face, NCollection_Array1<TopoDS_Edge>>;
7266using EdgeFacesAllocator =
7367 NCollection_Allocator<std::pair<const TopoDS_Edge, NCollection_DynamicArray<TopoDS_Face>>>;
7468using EdgeFacesMap = std::unordered_map<TopoDS_Edge,
@@ -212,16 +206,16 @@ static NCollection_List<TopTools_SequenceOfShape> GetConnectedFaceGroups(
212206{
213207 NCollection_List<TopTools_SequenceOfShape> aConnectedGroups;
214208
215- if (theFaceEdges.empty ())
209+ if (theFaceEdges.IsEmpty ())
216210 {
217211 return aConnectedGroups;
218212 }
219213
220- TopTools_MapOfShape aVisitedFaces (static_cast <int >(theFaceEdges.size ()));
214+ TopTools_MapOfShape aVisitedFaces (static_cast <int >(theFaceEdges.Size ()));
221215
222216 for (auto aFaceIter = theFaceEdges.begin (); aFaceIter != theFaceEdges.end (); ++aFaceIter)
223217 {
224- const TopoDS_Face& aStartFace = aFaceIter-> first ;
218+ const TopoDS_Face& aStartFace = aFaceIter. ChangeIterator (). Key () ;
225219
226220 if (aVisitedFaces.Contains (aStartFace))
227221 {
@@ -244,10 +238,10 @@ static NCollection_List<TopTools_SequenceOfShape> GetConnectedFaceGroups(
244238 aConnectedGroup.Append (aCurrentFace);
245239
246240 // Find connected faces through shared edges
247- auto aFaceEdgesIter = theFaceEdges.find (aCurrentFace);
248- if (aFaceEdgesIter != theFaceEdges. end () )
241+ auto aFaceEdgesIter = theFaceEdges.Seek (aCurrentFace);
242+ if (aFaceEdgesIter)
249243 {
250- const NCollection_Array1<TopoDS_Edge>& aFaceEdgesArray = aFaceEdgesIter-> second ;
244+ const NCollection_Array1<TopoDS_Edge>& aFaceEdgesArray = * aFaceEdgesIter;
251245
252246 for (Standard_Integer anEdgeIdx = aFaceEdgesArray.Lower ();
253247 anEdgeIdx <= aFaceEdgesArray.Upper ();
@@ -275,25 +269,7 @@ static NCollection_List<TopTools_SequenceOfShape> GetConnectedFaceGroups(
275269 }
276270 }
277271
278- // Insert in sorted order (largest groups first)
279- Standard_Boolean anIsInserted = Standard_False;
280-
281- for (NCollection_List<TopTools_SequenceOfShape>::Iterator anIter (aConnectedGroups);
282- anIter.More ();
283- anIter.Next ())
284- {
285- if (aConnectedGroup.Length () > anIter.Value ().Length ())
286- {
287- aConnectedGroups.InsertBefore (aConnectedGroup, anIter);
288- anIsInserted = Standard_True;
289- break ;
290- }
291- }
292-
293- if (!anIsInserted)
294- {
295- aConnectedGroups.Append (aConnectedGroup);
296- }
272+ aConnectedGroups.Append (aConnectedGroup);
297273 }
298274
299275 return aConnectedGroups;
@@ -339,7 +315,7 @@ static Standard_Boolean GetShells(TopTools_SequenceOfShape& theLfaces,
339315 NCollection_DataMap<TopoDS_Edge, std::pair<bool , bool >, TopTools_ShapeMapHasher>;
340316
341317 FaceEdgesMap aFaceEdges;
342- aFaceEdges.reserve (theLfaces.Length ());
318+ aFaceEdges.ReSize (theLfaces.Length ());
343319 size_t aNumberOfEdges = 0 ;
344320 NCollection_DynamicArray<TopoDS_Edge> aTempEdges;
345321 for (TopTools_SequenceOfShape::Iterator anFaceIter (theLfaces); anFaceIter.More ();
@@ -357,16 +333,16 @@ static Standard_Boolean GetShells(TopTools_SequenceOfShape& theLfaces,
357333 {
358334 aFaceEdgesArray.SetValue (idx + 1 , aTempEdges.Value (idx));
359335 }
360- aFaceEdges[ aFace] = std::move (aFaceEdgesArray);
336+ aFaceEdges. Add ( aFace, std::move (aFaceEdgesArray) );
361337 }
362338
363339 EdgeFacesMap aEdgeFaces;
364340 aEdgeFaces.reserve (aNumberOfEdges);
365341
366- for (const auto & aFaceEdgesPair : aFaceEdges)
342+ for (Standard_Integer aFaceInd = 1 ; aFaceInd <= aFaceEdges. Size (); ++aFaceInd )
367343 {
368- const TopoDS_Face& aFace = aFaceEdgesPair. first ;
369- const NCollection_Array1<TopoDS_Edge>& aFaceEdgesArray = aFaceEdgesPair. second ;
344+ const TopoDS_Face& aFace = aFaceEdges. FindKey (aFaceInd) ;
345+ const NCollection_Array1<TopoDS_Edge>& aFaceEdgesArray = aFaceEdges. FindFromIndex (aFaceInd) ;
370346
371347 for (Standard_Integer anEdgeInd = aFaceEdgesArray.Lower (); anEdgeInd <= aFaceEdgesArray.Upper ();
372348 ++anEdgeInd)
@@ -425,7 +401,7 @@ static Standard_Boolean GetShells(TopTools_SequenceOfShape& theLfaces,
425401 Standard_Integer aBadOrientationCount = 0 , aGoodOrientationCount = 0 ;
426402 TopoDS_Face F1 = TopoDS::Face (aProcessingFaces.Value (aFaceIdx));
427403 // Get edges of the face
428- const NCollection_Array1<TopoDS_Edge>& aFaceEdgesArray = aFaceEdges[F1] ;
404+ const NCollection_Array1<TopoDS_Edge>& aFaceEdgesArray = aFaceEdges. FindFromKey (F1) ;
429405
430406 for (Standard_Integer anEdgeInd = aFaceEdgesArray.Lower (); anEdgeInd <= aFaceEdgesArray.Upper ();
431407 ++anEdgeInd)
@@ -631,9 +607,10 @@ static Standard_Boolean GetShells(TopTools_SequenceOfShape& theLfaces,
631607 continue ; // Skip first group (already processed)
632608
633609 const TopTools_SequenceOfShape& aUnprocessedGroup = aGroupIter.Value ();
634- for (Standard_Integer aFaceIdx = 1 ; aFaceIdx <= aUnprocessedGroup.Length (); ++aFaceIdx)
610+ for (Standard_Integer anUnprocFaceIdx = 1 ; anUnprocFaceIdx <= aUnprocessedGroup.Length ();
611+ ++anUnprocFaceIdx)
635612 {
636- aSeqUnconnectFaces.Append (aUnprocessedGroup.Value (aFaceIdx ));
613+ aSeqUnconnectFaces.Append (aUnprocessedGroup.Value (anUnprocFaceIdx ));
637614 }
638615 }
639616
0 commit comments