]> OCCT Git - occt.git/commitdiff
0033491: Data Exchange, Step Import - Incorrect import of ComplexTriangulatedFace CR0-77-Hybrid-2024011701 CR0-77-Hybrid-2024011801
authorichesnok <ichesnok@opencascade.com>
Mon, 25 Sep 2023 10:04:05 +0000 (11:04 +0100)
committerichesnok <ichesnok@opencascade.com>
Thu, 11 Jan 2024 16:41:00 +0000 (16:41 +0000)
Reading and writing of triangle_strips and triangle_fans has been corrected in RWStepVisual_RWComplexTriangulatedFace.cxx file. And corresponding corrections have been added to other files.

src/RWStepVisual/RWStepVisual_RWComplexTriangulatedFace.cxx
src/RWStepVisual/RWStepVisual_RWTessellatedShapeRepresentation.cxx
src/StepToTopoDS/StepToTopoDS_TranslateFace.cxx
src/StepVisual/StepVisual_ComplexTriangulatedFace.cxx
src/StepVisual/StepVisual_ComplexTriangulatedFace.hxx
tests/de_mesh/step_read/A2

index 266d02d91a54d0e7f42b965ed98170c2e3297a88..7ae9ded12a1ebff39cea21bb80e47529e12433c2 100644 (file)
@@ -27,7 +27,7 @@
 #include <Standard_Real.hxx>
 #include <StepVisual_FaceOrSurface.hxx>
 #include <TColStd_HArray1OfInteger.hxx>
-#include <TColStd_HArray2OfInteger.hxx>
+#include <TColStd_HArray1OfTransient.hxx>
 
 //=======================================================================
 //function : RWStepVisual_RWComplexTriangulatedFace
@@ -118,15 +118,16 @@ void RWStepVisual_RWComplexTriangulatedFace::ReadStep (const Handle(StepData_Ste
     }
   }
 
-  Handle(TColStd_HArray2OfInteger) aTriangleStrips;
+  Handle(TColStd_HArray1OfTransient) aTriangleStrips;
   Standard_Integer sub7 = 0;
   if (theData->ReadSubList(theNum, 7, "triangle_strips", theCheck, sub7))
   {
     Standard_Integer nb0 = theData->NbParams(sub7);
-    Standard_Integer nbj0 = theData->NbParams(theData->ParamNumber(sub7,1));
-    aTriangleStrips = new TColStd_HArray2OfInteger(1, nb0, 1, nbj0);
+    aTriangleStrips = new TColStd_HArray1OfTransient(1, nb0);
     for (Standard_Integer i0 = 1; i0 <= nb0; i0++)
     {
+      Standard_Integer nbj0 = theData->NbParams(theData->ParamNumber(sub7, i0));
+      Handle(TColStd_HArray1OfInteger) aSingleTriangleStrip = new TColStd_HArray1OfInteger(1, nbj0);
       Standard_Integer subj7 = 0;
       if ( theData->ReadSubList (sub7, i0, "sub-part(triangle_strips)", theCheck, subj7) ) {
         Standard_Integer num4 = subj7;
@@ -134,21 +135,23 @@ void RWStepVisual_RWComplexTriangulatedFace::ReadStep (const Handle(StepData_Ste
         {
           Standard_Integer anIt0;
           theData->ReadInteger(num4, j0, "integer", theCheck, anIt0);
-          aTriangleStrips->SetValue(i0,j0, anIt0);
+          aSingleTriangleStrip->SetValue(j0, anIt0);
         }
+        aTriangleStrips->SetValue(i0, aSingleTriangleStrip);
       }
     }
   }
 
-  Handle(TColStd_HArray2OfInteger) aTriangleFans;
+  Handle(TColStd_HArray1OfTransient) aTriangleFans;
   Standard_Integer sub8 = 0;
   if (theData->ReadSubList(theNum, 8, "triangle_fans", theCheck, sub8))
   {
     Standard_Integer nb0 = theData->NbParams(sub8);
-    Standard_Integer nbj0 = theData->NbParams(theData->ParamNumber(sub8,1));
-    aTriangleFans = new TColStd_HArray2OfInteger(1, nb0, 1, nbj0);
+    aTriangleFans = new TColStd_HArray1OfTransient(1, nb0);
     for (Standard_Integer i0 = 1; i0 <= nb0; i0++)
     {
+      Standard_Integer nbj0 = theData->NbParams(theData->ParamNumber(sub8, i0));
+      Handle(TColStd_HArray1OfInteger) aSingleTriangleFan = new TColStd_HArray1OfInteger(1, nbj0);
       Standard_Integer subj8 = 0;
       if ( theData->ReadSubList (sub8, i0, "sub-part(triangle_fans)", theCheck, subj8) ) {
         Standard_Integer num4 = subj8;
@@ -156,8 +159,9 @@ void RWStepVisual_RWComplexTriangulatedFace::ReadStep (const Handle(StepData_Ste
         {
           Standard_Integer anIt0;
           theData->ReadInteger(num4, j0, "integer", theCheck, anIt0);
-          aTriangleFans->SetValue(i0,j0, anIt0);
+          aSingleTriangleFan->SetValue(j0, anIt0);
         }
+        aTriangleFans->SetValue(i0, aSingleTriangleFan);
       }
     }
   }
@@ -219,13 +223,14 @@ void RWStepVisual_RWComplexTriangulatedFace::WriteStep (StepData_StepWriter& the
   theSW.CloseSub();
 
   theSW.OpenSub();
-  for (Standard_Integer i6 = 1; i6 <= theEnt->TriangleStrips()->RowLength(); i6++)
+  for (Standard_Integer i6 = 1; i6 <= theEnt->NbTriangleStrips(); i6++)
   {
     theSW.NewLine(Standard_False);
     theSW.OpenSub();
-    for (Standard_Integer j6 = 1; j6 <= theEnt->TriangleStrips()->ColLength(); j6++)
+    Handle(TColStd_HArray1OfInteger) aTriangleStrip = Handle(TColStd_HArray1OfInteger)::DownCast(theEnt->TriangleStrips()->Value(i6));
+    for (Standard_Integer j6 = 1; j6 <= aTriangleStrip->Length(); j6++)
     {
-      Standard_Integer Var0 = theEnt->TriangleStrips()->Value(i6,j6);
+      Standard_Integer Var0 = aTriangleStrip->Value(j6);
       theSW.Send(Var0);
     }
     theSW.CloseSub();
@@ -233,13 +238,14 @@ void RWStepVisual_RWComplexTriangulatedFace::WriteStep (StepData_StepWriter& the
   theSW.CloseSub();
 
   theSW.OpenSub();
-  for (Standard_Integer i7 = 1; i7 <= theEnt->TriangleFans()->RowLength(); i7++)
+  for (Standard_Integer i7 = 1; i7 <= theEnt->NbTriangleFans(); i7++)
   {
     theSW.NewLine(Standard_False);
     theSW.OpenSub();
-    for (Standard_Integer j7 = 1; j7 <= theEnt->TriangleFans()->ColLength(); j7++)
+    Handle(TColStd_HArray1OfInteger) aTriangleFan = Handle(TColStd_HArray1OfInteger)::DownCast(theEnt->TriangleFans()->Value(i7));
+    for (Standard_Integer j7 = 1; j7 <= aTriangleFan->Length(); j7++)
     {
-      Standard_Integer Var0 = theEnt->TriangleFans()->Value(i7,j7);
+      Standard_Integer Var0 = aTriangleFan->Value(j7);
       theSW.Send(Var0);
     }
     theSW.CloseSub();
index 3bae89fde1f0cdd1c6a599e6a8bf4ef91fecdf3c..f38aecf2bb4045a1545dd4d8f3c2359a03fbc9bf 100644 (file)
@@ -114,11 +114,13 @@ Interface_EntityIterator& theIter) const
 {
 
   // Inherited fields of Representation
-
-  for (Standard_Integer i1 = 1; i1 <= theEnt->StepRepr_Representation::Items()->Length(); i1++)
+  if (!theEnt->StepRepr_Representation::Items().IsNull())
   {
-    Handle(StepRepr_RepresentationItem) Var0 = theEnt->StepRepr_Representation::Items()->Value(i1);
-    theIter.AddItem(Var0);
+    for (Standard_Integer i1 = 1; i1 <= theEnt->StepRepr_Representation::Items()->Length(); i1++)
+    {
+      Handle(StepRepr_RepresentationItem) Var0 = theEnt->StepRepr_Representation::Items()->Value(i1);
+      theIter.AddItem(Var0);
+    }
   }
 
   theIter.AddItem(theEnt->StepRepr_Representation::ContextOfItems());
index 209eb69338f4201e1173ec40078df31256015b0d..f60f8ee72ef82ad7e28a32ef2b7efa1a6707b919 100644 (file)
@@ -96,7 +96,7 @@
 // To proceed with I-DEAS-like STP (ssv; 15.11.2010)
 //#define DEBUG
 // ============================================================================
-// Method  : StepToTopoDS_TranslateFace::StepToTopoDS_TranslateFace
+// Method  : StepToTopoDS_TranslateFace
 // Purpose : Empty Constructor
 // ============================================================================
 StepToTopoDS_TranslateFace::StepToTopoDS_TranslateFace()
@@ -540,24 +540,25 @@ StepToTopoDS_TranslateFace::createMesh(const Handle(StepVisual_ComplexTriangulat
 {
   Handle(StepVisual_CoordinatesList) aCoords = theTF->Coordinates();
   Handle(TColgp_HArray1OfXYZ) aNodes = aCoords->Points();
-  Handle(TColStd_HArray2OfInteger) aTriaStrips = theTF->TriangleStrips();
-  Handle(TColStd_HArray2OfInteger) aTriaFans = theTF->TriangleFans();
+  Handle(TColStd_HArray1OfTransient) aTriaStrips = theTF->TriangleStrips();
+  Handle(TColStd_HArray1OfTransient) aTriaFans = theTF->TriangleFans();
   const Standard_Boolean aHasUVNodes = Standard_False;
   const Standard_Boolean aHasNormals = (theTF->NbNormals() > 0);
 
   Standard_Integer aNbTriaStrips = 0;
   for (Standard_Integer i = 1; i <= theTF->NbTriangleStrips(); ++i)
   {
-    for (Standard_Integer j = 3; j <= aTriaStrips->UpperCol(); j += 2)
+    Handle(TColStd_HArray1OfInteger) aTriangleStrip = Handle(TColStd_HArray1OfInteger)::DownCast(aTriaStrips->Value(i));
+    for (Standard_Integer j = 3; j <= aTriangleStrip->Length(); j += 2)
     {
-      if (aTriaStrips->Value(i, j) != aTriaStrips->Value(i, j - 2) &&
-        aTriaStrips->Value(i, j) != aTriaStrips->Value(i, j - 1))
+      if (aTriangleStrip->Value(j) != aTriangleStrip->Value(j - 2) &&
+          aTriangleStrip->Value(j) != aTriangleStrip->Value(j - 1))
         ++aNbTriaStrips;
     }
-    for (Standard_Integer j = 4; j <= aTriaStrips->UpperCol(); j += 2)
+    for (Standard_Integer j = 4; j <= aTriangleStrip->Length(); j += 2)
     {
-      if (aTriaStrips->Value(i, j) != aTriaStrips->Value(i, j - 2) &&
-        aTriaStrips->Value(i, j) != aTriaStrips->Value(i, j - 1))
+      if (aTriangleStrip->Value(j) != aTriangleStrip->Value(j - 2) &&
+          aTriangleStrip->Value(j) != aTriangleStrip->Value(j - 1))
         ++aNbTriaStrips;
     }
   }
@@ -565,12 +566,8 @@ StepToTopoDS_TranslateFace::createMesh(const Handle(StepVisual_ComplexTriangulat
   Standard_Integer aNbTriaFans = 0;
   for (Standard_Integer i = 1; i <= theTF->NbTriangleFans(); ++i)
   {
-    Standard_Integer v1 = aTriaStrips->Value(i, 1);
-    for (Standard_Integer j = 3; j <= aTriaStrips->UpperCol(); ++j)
-    {
-      if (aTriaStrips->Value(i, j) != v1 && aTriaStrips->Value(i, j - 1) != v1)
-        ++aNbTriaFans;
-    }
+    Handle(TColStd_HArray1OfInteger) aTriangleFan = Handle(TColStd_HArray1OfInteger)::DownCast(aTriaFans->Value(i));
+    aNbTriaFans += aTriangleFan->Length() - 2;
   }
 
   Handle(Poly_Triangulation) aMesh = new Poly_Triangulation(theTF->NbPnindex(), 
@@ -583,27 +580,42 @@ StepToTopoDS_TranslateFace::createMesh(const Handle(StepVisual_ComplexTriangulat
     aMesh->SetNode(j, aLF * aPoint);
   }
 
-  Standard_Integer k = 1;
-  for (Standard_Integer i = 1; i <= theTF->NbTriangleStrips(); ++i)
+  Standard_Integer aTriangleIndex = 1;
+  for (Standard_Integer aTrianStripIndex = 1; aTrianStripIndex <= theTF->NbTriangleStrips(); ++aTrianStripIndex)
   {
-    for (Standard_Integer j = 3; j <= aTriaStrips->UpperCol(); j += 2)
+    Handle(TColStd_HArray1OfInteger) aTriangleStrip = Handle(TColStd_HArray1OfInteger)::DownCast(aTriaStrips->Value(aTrianStripIndex));
+    for (Standard_Integer anIndex = 3; anIndex <= aTriangleStrip->Length(); anIndex += 2)
+    {
+      if (aTriangleStrip->Value(anIndex) != aTriangleStrip->Value(anIndex - 2) &&
+          aTriangleStrip->Value(anIndex) != aTriangleStrip->Value(anIndex - 1))
+      {
+        aMesh->SetTriangle(aTriangleIndex++, Poly_Triangle(aTriangleStrip->Value(anIndex - 2),
+                           aTriangleStrip->Value(anIndex),
+                           aTriangleStrip->Value(anIndex - 1)));
+      }
+    }
+    for (Standard_Integer anIndex = 4; anIndex <= aTriangleStrip->Length(); anIndex += 2)
     {
-      if (aTriaStrips->Value(i, j) != aTriaStrips->Value(i, j - 2) &&
-        aTriaStrips->Value(i, j) != aTriaStrips->Value(i, j - 1))
+      if (aTriangleStrip->Value(anIndex) != aTriangleStrip->Value(anIndex - 2) &&
+          aTriangleStrip->Value(anIndex) != aTriangleStrip->Value(anIndex - 1))
       {
-        aMesh->SetTriangle(k++, Poly_Triangle(aTriaStrips->Value(i, j - 2), 
-                                              aTriaStrips->Value(i, j), 
-                                              aTriaStrips->Value(i, j - 1)));
+        aMesh->SetTriangle(aTriangleIndex++, Poly_Triangle(aTriangleStrip->Value(anIndex - 2),
+                           aTriangleStrip->Value(anIndex - 1),
+                           aTriangleStrip->Value(anIndex)));
       }
     }
-    for (Standard_Integer j = 4; j <= aTriaStrips->UpperCol(); j += 2)
+  }
+  for (Standard_Integer aTrianFanIndex = 1; aTrianFanIndex <= theTF->NbTriangleFans(); ++aTrianFanIndex)
+  {
+    Handle(TColStd_HArray1OfInteger) aTriangleFan = Handle(TColStd_HArray1OfInteger)::DownCast(aTriaFans->Value(aTrianFanIndex));
+    for (Standard_Integer anIndex = 3; anIndex <= aTriangleFan->Length(); ++anIndex)
     {
-      if (aTriaStrips->Value(i, j) != aTriaStrips->Value(i, j - 2) &&
-        aTriaStrips->Value(i, j) != aTriaStrips->Value(i, j - 1))
+      if (aTriangleFan->Value(anIndex) != aTriangleFan->Value(anIndex - 2) &&
+        aTriangleFan->Value(anIndex - 1) != aTriangleFan->Value(anIndex - 2))
       {
-        aMesh->SetTriangle(k++, Poly_Triangle(aTriaStrips->Value(i, j - 2),
-                                              aTriaStrips->Value(i, j - 1),
-                                              aTriaStrips->Value(i, j)));
+        aMesh->SetTriangle(aTriangleIndex++, Poly_Triangle(aTriangleFan->Value(1),
+          aTriangleFan->Value(anIndex),
+          aTriangleFan->Value(anIndex - 1)));
       }
     }
   }
index 741603f545831f49014f722dad7633e10a63927a..57e573641ca3bf9c3af81f41278da930bd21d75e 100644 (file)
@@ -39,8 +39,8 @@ void StepVisual_ComplexTriangulatedFace::Init (const Handle(TCollection_HAsciiSt
                                                const Standard_Boolean theHasTessellatedFace_GeometricLink,
                                                const StepVisual_FaceOrSurface& theTessellatedFace_GeometricLink,
                                                const Handle(TColStd_HArray1OfInteger)& thePnindex,
-                                               const Handle(TColStd_HArray2OfInteger)& theTriangleStrips,
-                                               const Handle(TColStd_HArray2OfInteger)& theTriangleFans)
+                                               const Handle(TColStd_HArray1OfTransient)& theTriangleStrips,
+                                               const Handle(TColStd_HArray1OfTransient)& theTriangleFans)
 {
   StepVisual_TessellatedFace::Init(theRepresentationItem_Name,
                                    theTessellatedFace_Coordinates,
@@ -107,7 +107,7 @@ Standard_Integer StepVisual_ComplexTriangulatedFace::PnindexValue(const Standard
 //purpose  : 
 //=======================================================================
 
-Handle(TColStd_HArray2OfInteger) StepVisual_ComplexTriangulatedFace::TriangleStrips () const
+Handle(TColStd_HArray1OfTransient) StepVisual_ComplexTriangulatedFace::TriangleStrips () const
 {
   return myTriangleStrips;
 }
@@ -117,7 +117,7 @@ Handle(TColStd_HArray2OfInteger) StepVisual_ComplexTriangulatedFace::TriangleStr
 //purpose  : 
 //=======================================================================
 
-void StepVisual_ComplexTriangulatedFace::SetTriangleStrips(const Handle(TColStd_HArray2OfInteger)& theTriangleStrips)
+void StepVisual_ComplexTriangulatedFace::SetTriangleStrips(const Handle(TColStd_HArray1OfTransient)& theTriangleStrips)
 {
   myTriangleStrips = theTriangleStrips;
 }
@@ -133,7 +133,7 @@ Standard_Integer StepVisual_ComplexTriangulatedFace::NbTriangleStrips() const
   {
     return 0;
   }
-  return myTriangleStrips->ColLength();
+  return myTriangleStrips->Length();
 }
 
 //=======================================================================
@@ -141,7 +141,7 @@ Standard_Integer StepVisual_ComplexTriangulatedFace::NbTriangleStrips() const
 //purpose  : 
 //=======================================================================
 
-Handle(TColStd_HArray2OfInteger) StepVisual_ComplexTriangulatedFace::TriangleFans () const
+Handle(TColStd_HArray1OfTransient) StepVisual_ComplexTriangulatedFace::TriangleFans () const
 {
   return myTriangleFans;
 }
@@ -151,7 +151,7 @@ Handle(TColStd_HArray2OfInteger) StepVisual_ComplexTriangulatedFace::TriangleFan
 //purpose  : 
 //=======================================================================
 
-void StepVisual_ComplexTriangulatedFace::SetTriangleFans(const Handle(TColStd_HArray2OfInteger)& theTriangleFans)
+void StepVisual_ComplexTriangulatedFace::SetTriangleFans(const Handle(TColStd_HArray1OfTransient)& theTriangleFans)
 {
   myTriangleFans = theTriangleFans;
 }
@@ -167,5 +167,5 @@ Standard_Integer StepVisual_ComplexTriangulatedFace::NbTriangleFans() const
   {
     return 0;
   }
-  return myTriangleFans->ColLength();
+  return myTriangleFans->Length();
 }
index b89b6a5b34d654fa8b37cfabc2c438988f86bebd..d345e197d9b0e5ef32c81b3422293f1f089307c1 100644 (file)
@@ -22,7 +22,7 @@
 #include <StepVisual_TessellatedFace.hxx>
 
 #include <TColStd_HArray1OfInteger.hxx>
-#include <TColStd_HArray2OfInteger.hxx>
+#include <TColStd_HArray1OfTransient.hxx>
 
 DEFINE_STANDARD_HANDLE(StepVisual_ComplexTriangulatedFace, StepVisual_TessellatedFace)
 
@@ -43,8 +43,8 @@ public :
                             const Standard_Boolean theHasTessellatedFace_GeometricLink,
                             const StepVisual_FaceOrSurface& theTessellatedFace_GeometricLink,
                             const Handle(TColStd_HArray1OfInteger)& thePnindex,
-                            const Handle(TColStd_HArray2OfInteger)& theTriangleStrips,
-                            const Handle(TColStd_HArray2OfInteger)& theTriangleFans);
+                            const Handle(TColStd_HArray1OfTransient)& theTriangleStrips,
+                            const Handle(TColStd_HArray1OfTransient)& theTriangleFans);
 
   //! Returns field Pnindex
   Standard_EXPORT Handle(TColStd_HArray1OfInteger) Pnindex() const;
@@ -59,19 +59,19 @@ public :
   Standard_EXPORT Standard_Integer PnindexValue(const Standard_Integer theNum) const;
 
   //! Returns field TriangleStrips
-  Standard_EXPORT Handle(TColStd_HArray2OfInteger) TriangleStrips() const;
+  Standard_EXPORT Handle(TColStd_HArray1OfTransient) TriangleStrips() const;
 
   //! Sets field TriangleStrips
-  Standard_EXPORT void SetTriangleStrips (const Handle(TColStd_HArray2OfInteger)& theTriangleStrips);
+  Standard_EXPORT void SetTriangleStrips (const Handle(TColStd_HArray1OfTransient)& theTriangleStrips);
 
   //! Returns number of TriangleStrips
   Standard_EXPORT Standard_Integer NbTriangleStrips() const;
 
   //! Returns field TriangleFans
-  Standard_EXPORT Handle(TColStd_HArray2OfInteger) TriangleFans() const;
+  Standard_EXPORT Handle(TColStd_HArray1OfTransient) TriangleFans() const;
 
   //! Sets field TriangleFans
-  Standard_EXPORT void SetTriangleFans (const Handle(TColStd_HArray2OfInteger)& theTriangleFans);
+  Standard_EXPORT void SetTriangleFans (const Handle(TColStd_HArray1OfTransient)& theTriangleFans);
 
   //! Returns number of TriangleFans
   Standard_EXPORT Standard_Integer NbTriangleFans() const;
@@ -81,8 +81,8 @@ public :
 private:
 
   Handle(TColStd_HArray1OfInteger) myPnindex;
-  Handle(TColStd_HArray2OfInteger) myTriangleStrips;
-  Handle(TColStd_HArray2OfInteger) myTriangleFans;
+  Handle(TColStd_HArray1OfTransient) myTriangleStrips;
+  Handle(TColStd_HArray1OfTransient) myTriangleFans;
 
 };
 
index 33aaba4759f3077fdd88671b027ee6afd03cd4bb..d2f9f3f6b70e1d57b93e9c5d6dc210cd14bb42b1 100644 (file)
@@ -9,4 +9,4 @@ XGetOneShape S D
 
 set nb_faces     273
 set nb_nodes     3788
-set nb_triangles 2893
+set nb_triangles 3377