From c950f7fe0ef9e89f4c8cb2ae4e2f9321e09f89ee Mon Sep 17 00:00:00 2001 From: ichesnok Date: Mon, 25 Sep 2023 11:04:05 +0100 Subject: [PATCH] 0033491: Data Exchange, Step Import - Incorrect import of ComplexTriangulatedFace 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. --- ...RWStepVisual_RWComplexTriangulatedFace.cxx | 36 ++++++---- ...isual_RWTessellatedShapeRepresentation.cxx | 10 +-- .../StepToTopoDS_TranslateFace.cxx | 70 +++++++++++-------- .../StepVisual_ComplexTriangulatedFace.cxx | 16 ++--- .../StepVisual_ComplexTriangulatedFace.hxx | 18 ++--- tests/de_mesh/step_read/A2 | 2 +- 6 files changed, 86 insertions(+), 66 deletions(-) diff --git a/src/RWStepVisual/RWStepVisual_RWComplexTriangulatedFace.cxx b/src/RWStepVisual/RWStepVisual_RWComplexTriangulatedFace.cxx index 266d02d91a..7ae9ded12a 100644 --- a/src/RWStepVisual/RWStepVisual_RWComplexTriangulatedFace.cxx +++ b/src/RWStepVisual/RWStepVisual_RWComplexTriangulatedFace.cxx @@ -27,7 +27,7 @@ #include #include #include -#include +#include //======================================================================= //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(); diff --git a/src/RWStepVisual/RWStepVisual_RWTessellatedShapeRepresentation.cxx b/src/RWStepVisual/RWStepVisual_RWTessellatedShapeRepresentation.cxx index 3bae89fde1..f38aecf2bb 100644 --- a/src/RWStepVisual/RWStepVisual_RWTessellatedShapeRepresentation.cxx +++ b/src/RWStepVisual/RWStepVisual_RWTessellatedShapeRepresentation.cxx @@ -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()); diff --git a/src/StepToTopoDS/StepToTopoDS_TranslateFace.cxx b/src/StepToTopoDS/StepToTopoDS_TranslateFace.cxx index 209eb69338..f60f8ee72e 100644 --- a/src/StepToTopoDS/StepToTopoDS_TranslateFace.cxx +++ b/src/StepToTopoDS/StepToTopoDS_TranslateFace.cxx @@ -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 (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), + aTriangleStrip->Value(anIndex - 1))); } } - for (Standard_Integer j = 4; j <= aTriaStrips->UpperCol(); j += 2) + 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 - 1), - aTriaStrips->Value(i, j))); + aMesh->SetTriangle(aTriangleIndex++, Poly_Triangle(aTriangleStrip->Value(anIndex - 2), + aTriangleStrip->Value(anIndex - 1), + aTriangleStrip->Value(anIndex))); + } + } + } + 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 (aTriangleFan->Value(anIndex) != aTriangleFan->Value(anIndex - 2) && + aTriangleFan->Value(anIndex - 1) != aTriangleFan->Value(anIndex - 2)) + { + aMesh->SetTriangle(aTriangleIndex++, Poly_Triangle(aTriangleFan->Value(1), + aTriangleFan->Value(anIndex), + aTriangleFan->Value(anIndex - 1))); } } } diff --git a/src/StepVisual/StepVisual_ComplexTriangulatedFace.cxx b/src/StepVisual/StepVisual_ComplexTriangulatedFace.cxx index 741603f545..57e573641c 100644 --- a/src/StepVisual/StepVisual_ComplexTriangulatedFace.cxx +++ b/src/StepVisual/StepVisual_ComplexTriangulatedFace.cxx @@ -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(); } diff --git a/src/StepVisual/StepVisual_ComplexTriangulatedFace.hxx b/src/StepVisual/StepVisual_ComplexTriangulatedFace.hxx index b89b6a5b34..d345e197d9 100644 --- a/src/StepVisual/StepVisual_ComplexTriangulatedFace.hxx +++ b/src/StepVisual/StepVisual_ComplexTriangulatedFace.hxx @@ -22,7 +22,7 @@ #include #include -#include +#include 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; }; diff --git a/tests/de_mesh/step_read/A2 b/tests/de_mesh/step_read/A2 index 33aaba4759..d2f9f3f6b7 100644 --- a/tests/de_mesh/step_read/A2 +++ b/tests/de_mesh/step_read/A2 @@ -9,4 +9,4 @@ XGetOneShape S D set nb_faces 273 set nb_nodes 3788 -set nb_triangles 2893 +set nb_triangles 3377