]> OCCT Git - occt.git/commitdiff
Mesh - Import of STEP file crashes at the very end when visualizing the boundary...
authorDmitrii Kulikov <164657232+AtheneNoctuaPt@users.noreply.github.com>
Thu, 16 Oct 2025 17:46:10 +0000 (18:46 +0100)
committerGitHub <noreply@github.com>
Thu, 16 Oct 2025 17:46:10 +0000 (18:46 +0100)
When an edge (BRepMeshData_Edge) has multiple PCurve curves (IMeshData_PCurve) with different orientations, the index array is filled for only one PCurve curve.
This would cause problems later, so a fix was made to fill index arrays for curves with another orientation.

src/ModelingAlgorithms/TKMesh/BRepMesh/BRepMesh_BaseMeshAlgo.cxx
src/ModelingAlgorithms/TKMesh/BRepMeshData/BRepMeshData_Edge.cxx
src/ModelingAlgorithms/TKMesh/BRepMeshData/BRepMeshData_Edge.hxx
src/ModelingAlgorithms/TKMesh/IMeshData/IMeshData_Edge.hxx
tests/hlr/poly_hlr/bug25813_2
tests/hlr/poly_hlr/bug25813_3
tests/hlr/poly_hlr/bug25813_4

index acc102de0fb20f54ea4a3585bccf29d0d4b9d847..930a6239fffc16dc7babfb2b05588ebe01fca69d 100644 (file)
@@ -86,39 +86,42 @@ Standard_Boolean BRepMesh_BaseMeshAlgo::initDataStructure()
 
     for (Standard_Integer aEdgeIt = 0; aEdgeIt < aDWire->EdgesNb(); ++aEdgeIt)
     {
-      const IMeshData::IEdgeHandle    aDEdge = aDWire->GetEdge(aEdgeIt);
-      const IMeshData::ICurveHandle&  aCurve = aDEdge->GetCurve();
-      const IMeshData::IPCurveHandle& aPCurve =
-        aDEdge->GetPCurve(myDFace.get(), aDWire->GetEdgeOrientation(aEdgeIt));
+      const IMeshData::IEdgeHandle    aDEdge         = aDWire->GetEdge(aEdgeIt);
+      const IMeshData::ICurveHandle&  aCurve         = aDEdge->GetCurve();
+      const IMeshData::ListOfInteger& aListOfPCurves = aDEdge->GetPCurves(myDFace.get());
 
-      const TopAbs_Orientation aOri = fixSeamEdgeOrientation(aDEdge, aPCurve);
-
-      Standard_Integer       aPrevNodeIndex = -1;
-      const Standard_Integer aLastPoint     = aPCurve->ParametersNb() - 1;
-      for (Standard_Integer aPointIt = 0; aPointIt <= aLastPoint; ++aPointIt)
+      for (IMeshData::ListOfInteger::Iterator aPCurveIt(aListOfPCurves); aPCurveIt.More();
+           aPCurveIt.Next())
       {
-        const Standard_Integer aNodeIndex =
-          registerNode(aCurve->GetPoint(aPointIt),
-                       aPCurve->GetPoint(aPointIt),
-                       BRepMesh_Frontier,
-                       Standard_False /*aPointIt > 0 && aPointIt < aLastPoint*/);
-
-        aPCurve->GetIndex(aPointIt) = aNodeIndex;
-        myUsedNodes->Bind(aNodeIndex, aNodeIndex);
+        const IMeshData::IPCurveHandle& aPCurve = aDEdge->GetPCurve(aPCurveIt.Value());
+        const TopAbs_Orientation        aOri    = fixSeamEdgeOrientation(aDEdge, aPCurve);
 
-        if (aPrevNodeIndex != -1 && aPrevNodeIndex != aNodeIndex)
+        Standard_Integer       aPrevNodeIndex = -1;
+        const Standard_Integer aLastPoint     = aPCurve->ParametersNb() - 1;
+        for (Standard_Integer aPointIndex = 0; aPointIndex <= aLastPoint; ++aPointIndex)
         {
-          const Standard_Integer aLinksNb   = myStructure->NbLinks();
-          const Standard_Integer aLinkIndex = addLinkToMesh(aPrevNodeIndex, aNodeIndex, aOri);
-          if (aWireIt != 0 && aLinkIndex <= aLinksNb)
+          const Standard_Integer aNodeIndex = registerNode(aCurve->GetPoint(aPointIndex),
+                                                           aPCurve->GetPoint(aPointIndex),
+                                                           BRepMesh_Frontier,
+                                                           Standard_False);
+
+          aPCurve->GetIndex(aPointIndex) = aNodeIndex;
+          myUsedNodes->Bind(aNodeIndex, aNodeIndex);
+
+          if (aPrevNodeIndex != -1 && aPrevNodeIndex != aNodeIndex)
           {
-            // Prevent holes around wire of zero area.
-            BRepMesh_Edge& aLink = const_cast<BRepMesh_Edge&>(myStructure->GetLink(aLinkIndex));
-            aLink.SetMovability(BRepMesh_Fixed);
+            const Standard_Integer aLinksNb   = myStructure->NbLinks();
+            const Standard_Integer aLinkIndex = addLinkToMesh(aPrevNodeIndex, aNodeIndex, aOri);
+            if (aWireIt != 0 && aLinkIndex <= aLinksNb)
+            {
+              // Prevent holes around wire of zero area.
+              BRepMesh_Edge& aLink = const_cast<BRepMesh_Edge&>(myStructure->GetLink(aLinkIndex));
+              aLink.SetMovability(BRepMesh_Fixed);
+            }
           }
-        }
 
-        aPrevNodeIndex = aNodeIndex;
+          aPrevNodeIndex = aNodeIndex;
+        }
       }
     }
   }
index 2096f4b328f6c0e5a02b3bdef0771ee146b60b8f..90e8ab23dc5daf7ce2c39dae1c4fd9e7f98974c0 100644 (file)
@@ -84,3 +84,11 @@ const IMeshData::IPCurveHandle& BRepMeshData_Edge::GetPCurve(const Standard_Inte
 {
   return myPCurves(theIndex);
 }
+
+//==================================================================================================
+
+const IMeshData::ListOfInteger& BRepMeshData_Edge::GetPCurves(
+  const IMeshData::IFacePtr& theDFace) const
+{
+  return myPCurvesMap.Find(theDFace);
+}
index 82c1ebb71d413b63d9eeb26322bdbb238ae32f87..00528ab74efe79dfb74d6b202e8557c53179b960 100644 (file)
@@ -50,6 +50,10 @@ public:
   Standard_EXPORT virtual const IMeshData::IPCurveHandle& GetPCurve(
     const Standard_Integer theIndex) const Standard_OVERRIDE;
 
+  //! Returns an array of pcurves indices for the specified discrete face.
+  Standard_EXPORT virtual const IMeshData::ListOfInteger& GetPCurves(
+    const IMeshData::IFacePtr& theDFace) const Standard_OVERRIDE;
+
   DEFINE_STANDARD_RTTIEXT(BRepMeshData_Edge, IMeshData_Edge)
 
 private:
index d349a29ecfbebb180ecc4229769050a6e97b3441..876602c84869f5e6cbeddcaf37196f59fe4da042 100644 (file)
@@ -49,6 +49,10 @@ public:
   Standard_EXPORT virtual const IMeshData::IPCurveHandle& GetPCurve(
     const Standard_Integer theIndex) const = 0;
 
+  //! Returns an array of pcurves indices for the specified discrete face.
+  Standard_EXPORT virtual const IMeshData::ListOfInteger& GetPCurves(
+    const IMeshData::IFacePtr& theDFace) const = 0;
+
   //! Clears curve and all pcurves assigned to the edge from discretization.
   void Clear(const Standard_Boolean isKeepEndPoints)
   {
index 38478c883be6093cf9e53b679e93e70210fbdf18..0c6d438e3ee9dd72abbc54d5190c711af3685e11 100644 (file)
@@ -1,4 +1,4 @@
-puts "TODO OCC30286 Linux: Error : The length of result shape is 3025.48, expected 3025.49"
+puts "TODO OCC30286 Linux: Error : The length of result shape is 3025.32, expected 3025.36"
 
 puts "==========================================="
 puts "OCC25813: regression in Hidden Line Removal"
@@ -6,7 +6,7 @@ puts "==========================================="
 puts ""
 
 set viewname ""
-set length 3025.49
+set length 3025.36
 
 restore [locate_data_file bug25813_hlr-bus1-draw-Fusion001.brep] a
 COMPUTE_HLR $viewname $algotype
index 9cddd23203b77ecf4dbe75bf4495ec68d720071a..ef2a510b8c8bb9dc26523c14a1db0ec5d2406baf 100644 (file)
@@ -1,4 +1,4 @@
-puts "TODO OCC30286 Linux: Error : The length of result shape is 302.443, expected 301.999"
+puts "TODO OCC30286 Linux: Error : The length of result shape is 302.183, expected 302.238"
 
 puts "==========================================="
 puts "OCC25813: regression in Hidden Line Removal"
@@ -6,7 +6,7 @@ puts "==========================================="
 puts ""
 
 set viewname ""
-set length 301.999
+set length 302.238
 
 ptorus a 30 10
 
index 4dcd33347ff6eb0434eb72cd1a3d2eb74f827138..dbfca2240d5e0320c42acd0fb57efc10b13a135a 100644 (file)
@@ -4,7 +4,7 @@ puts "==========================================="
 puts ""
 
 set viewname ""
-set length 1196.29
+set length 1196.25
 
 restore [locate_data_file bug25813_hlr-test_normandc1m1-draw-Cut001.brep] a
 COMPUTE_HLR $viewname $algotype