From fcc1ee2730590685ac19544f3499b67fb42835da Mon Sep 17 00:00:00 2001 From: mzn Date: Mon, 23 Dec 2013 12:07:00 +0000 Subject: [PATCH] Bug #200: Profiles, that don't intersect axis, are not removed from the list of referenced profiles after the stream object update. --- src/HYDROData/HYDROData_Stream.cxx | 292 +++++++++++++++-------------- src/HYDROData/HYDROData_Stream.h | 7 +- src/HYDROGUI/HYDROGUI_StreamOp.cxx | 11 +- 3 files changed, 162 insertions(+), 148 deletions(-) diff --git a/src/HYDROData/HYDROData_Stream.cxx b/src/HYDROData/HYDROData_Stream.cxx index b9605be3..47ca38fa 100644 --- a/src/HYDROData/HYDROData_Stream.cxx +++ b/src/HYDROData/HYDROData_Stream.cxx @@ -143,149 +143,8 @@ Handle(Geom_BSplineCurve) HYDROData_Stream::buildInterpolationCurve( void HYDROData_Stream::Update() { - HYDROData_NaturalObject::Update(); - - Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis(); - HYDROData_SequenceOfObjects aRefProfiles = GetProfiles(); - if ( aHydAxis.IsNull() || aRefProfiles.Length() < 2 ) - return; - - bool anIsFirst = true; - gp_Pnt aPrevFirstPoint, aPrevLastPoint; - Handle(TColgp_HArray1OfPnt) anArrayOfFPnt = new TColgp_HArray1OfPnt(1, aRefProfiles.Length()); - Handle(TColgp_HArray1OfPnt) anArrayOfLPnt = new TColgp_HArray1OfPnt(1, aRefProfiles.Length()); - TopTools_Array1OfShape anArrOfProfiles(1, aRefProfiles.Length()); - TopTools_Array1OfShape anArrOf2DProfiles(1, aRefProfiles.Length()); - - // Pre-processing - HYDROData_SequenceOfObjects::Iterator anIter( aRefProfiles ); - for (int i=1 ; anIter.More(); anIter.Next(),i++ ) - { - Handle(HYDROData_Profile) aProfile = - Handle(HYDROData_Profile)::DownCast( anIter.Value() ); - if ( aProfile.IsNull() ) - continue; - const TopoDS_Shape& aProf3d = aProfile->GetShape3D(); - gp_XY aPnt1, aPnt2; - if ( !aProfile->GetLeftPoint( aPnt1 ) || !aProfile->GetRightPoint( aPnt2 ) ) - continue; - anArrOfProfiles.SetValue(i,aProfile->GetShape3D());//aProfile->GetTopShape(); - anArrOf2DProfiles.SetValue(i,aProfile->GetTopShape()); - - gp_Pnt aCurFirstPoint( aPnt1.X(), aPnt1.Y(), 0 ), aCurFP; - gp_Pnt aCurLastPoint( aPnt2.X(), aPnt2.Y(), 0 ), aCurLP; - TopoDS_Vertex aV1, aV2; - TopExp::Vertices(TopoDS::Wire(aProf3d), aV1, aV2); - gp_Pnt aP1 = BRep_Tool::Pnt(aV1); - if(aP1.X() == aPnt1.X() && aP1.Y() == aPnt1.Y()) - aCurFP = aP1; - else - aCurLP = aP1; - aP1 = BRep_Tool::Pnt(aV2); - if(aP1.X() == aPnt2.X() && aP1.Y() == aPnt2.Y()) - aCurLP = aP1; - else - aCurFP = aP1; - anArrayOfFPnt->SetValue(i,aCurFP); - anArrayOfLPnt->SetValue(i,aCurLP); - } - - // Construct of the 3D presentation - Handle(Geom_BSplineCurve) aBSpline = buildInterpolationCurve (anArrayOfFPnt); - if(aBSpline.IsNull()) - return; - TopoDS_Edge anEdgLeft, anEdgRight; - BRepBuilderAPI_MakeEdge aMakeEdge(aBSpline); - if(aMakeEdge.IsDone()) - anEdgLeft = aMakeEdge.Edge(); - if(anEdgLeft.IsNull()) - return; - aBSpline.Nullify(); - aBSpline = buildInterpolationCurve (anArrayOfLPnt); - if(aBSpline.IsNull()) - return; - aMakeEdge.Init(aBSpline); - if(aMakeEdge.IsDone()) - anEdgRight = aMakeEdge.Edge(); - if(anEdgRight.IsNull()) - return; - BRep_Builder aBB; - TopoDS_Compound aCmp; - aBB.MakeCompound(aCmp); - anIter.Init( aRefProfiles ); - for (int i=1 ; i < anArrOfProfiles.Length() +1; i++ ) - aBB.Add(aCmp, anArrOfProfiles.Value(i)); - aBB.Add(aCmp,anEdgLeft); - aBB.Add(aCmp,anEdgRight); - BRepCheck_Analyzer aCh(aCmp); - if(aCh.IsValid()) - SetShape3D(aCmp); -#ifdef DEB_UPDATE - else { - BRepTools::Write(aCmp, "str3d.brep"); - SetShape3D(aCmp); - } -#endif - - // Construct the top presentation - for(int i=1;i<= anArrayOfLPnt->Length();i++) { - gp_Pnt aPnt = anArrayOfFPnt->Value(i); - aPnt.SetZ(.0); // make 2d - anArrayOfFPnt->SetValue(i, aPnt); - aPnt = anArrayOfLPnt->Value(i); - aPnt.SetZ(.0); - anArrayOfLPnt->SetValue(i, aPnt); - } - aBSpline.Nullify(); - aBSpline = buildInterpolationCurve (anArrayOfFPnt); - if(aBSpline.IsNull()) - return; - aMakeEdge.Init(aBSpline); - if(aMakeEdge.IsDone()) - anEdgLeft = aMakeEdge.Edge(); - aBSpline.Nullify(); - aBSpline = buildInterpolationCurve (anArrayOfLPnt); - if(aBSpline.IsNull()) - return; - aMakeEdge.Init(aBSpline); - if(aMakeEdge.IsDone()) - anEdgRight = aMakeEdge.Edge(); - if(anEdgRight.IsNull()) - return; - BRepBuilderAPI_MakeEdge aMakeEdge2(anArrayOfFPnt->Value(1),anArrayOfLPnt->Value(1)); - TopoDS_Edge aBotEdge, aTopEdge; - if(aMakeEdge2.IsDone()) - aBotEdge = aMakeEdge2.Edge(); - BRepBuilderAPI_MakeEdge aMakeEdge3(anArrayOfFPnt->Value(anArrayOfFPnt->Length()),anArrayOfLPnt->Value(anArrayOfLPnt->Length())); - if(aMakeEdge3.IsDone()) - aTopEdge = aMakeEdge3.Edge(); - - BRepBuilderAPI_MakeWire aMakeWire( aBotEdge, anEdgLeft, aTopEdge,anEdgRight); - TopoDS_Wire aSectProfileWire; - if(aMakeWire.IsDone()) - aSectProfileWire = aMakeWire.Wire(); - BRepBuilderAPI_MakeFace aMakeFace( aSectProfileWire, Standard_True ); - TopoDS_Face aFace; - aMakeFace.Build(); - if( aMakeFace.IsDone() ) - aFace = aMakeFace.Face(); - aCmp.Nullify(); - aBB.MakeCompound(aCmp); - aBB.Add(aCmp,aFace); - for(int i=1;i <= anArrOf2DProfiles.Length(); i++) - aBB.Add(aCmp,anArrOf2DProfiles.Value(i)); - aCh.Init(aCmp); - if(aCh.IsValid()) - SetTopShape(aCmp); -#ifdef DEB_UPDATE - else { - BRepTools::Write(aCmp, "str2d.brep"); - SetTopShape(aCmp); - } -#endif - - // Create the stream groups - createGroupObjects(); + updateProfilesOrder(); + updatePrs(); } QColor HYDROData_Stream::DefaultFillingColor() @@ -915,3 +774,150 @@ void HYDROData_Stream::removeParameter( const int& theIndex ) setParametersArray( aNewArr ); } + +void HYDROData_Stream::updatePrs() +{ + HYDROData_NaturalObject::Update(); + + Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis(); + HYDROData_SequenceOfObjects aRefProfiles = GetProfiles(); + if ( aHydAxis.IsNull() || aRefProfiles.Length() < 2 ) + return; + + bool anIsFirst = true; + gp_Pnt aPrevFirstPoint, aPrevLastPoint; + Handle(TColgp_HArray1OfPnt) anArrayOfFPnt = new TColgp_HArray1OfPnt(1, aRefProfiles.Length()); + Handle(TColgp_HArray1OfPnt) anArrayOfLPnt = new TColgp_HArray1OfPnt(1, aRefProfiles.Length()); + TopTools_Array1OfShape anArrOfProfiles(1, aRefProfiles.Length()); + TopTools_Array1OfShape anArrOf2DProfiles(1, aRefProfiles.Length()); + + // Pre-processing + HYDROData_SequenceOfObjects::Iterator anIter( aRefProfiles ); + for (int i=1 ; anIter.More(); anIter.Next(),i++ ) + { + Handle(HYDROData_Profile) aProfile = + Handle(HYDROData_Profile)::DownCast( anIter.Value() ); + if ( aProfile.IsNull() ) + continue; + const TopoDS_Shape& aProf3d = aProfile->GetShape3D(); + gp_XY aPnt1, aPnt2; + if ( !aProfile->GetLeftPoint( aPnt1 ) || !aProfile->GetRightPoint( aPnt2 ) ) + continue; + anArrOfProfiles.SetValue(i,aProfile->GetShape3D());//aProfile->GetTopShape(); + anArrOf2DProfiles.SetValue(i,aProfile->GetTopShape()); + + gp_Pnt aCurFirstPoint( aPnt1.X(), aPnt1.Y(), 0 ), aCurFP; + gp_Pnt aCurLastPoint( aPnt2.X(), aPnt2.Y(), 0 ), aCurLP; + TopoDS_Vertex aV1, aV2; + TopExp::Vertices(TopoDS::Wire(aProf3d), aV1, aV2); + gp_Pnt aP1 = BRep_Tool::Pnt(aV1); + if(aP1.X() == aPnt1.X() && aP1.Y() == aPnt1.Y()) + aCurFP = aP1; + else + aCurLP = aP1; + aP1 = BRep_Tool::Pnt(aV2); + if(aP1.X() == aPnt2.X() && aP1.Y() == aPnt2.Y()) + aCurLP = aP1; + else + aCurFP = aP1; + anArrayOfFPnt->SetValue(i,aCurFP); + anArrayOfLPnt->SetValue(i,aCurLP); + } + + // Construct of the 3D presentation + Handle(Geom_BSplineCurve) aBSpline = buildInterpolationCurve (anArrayOfFPnt); + if(aBSpline.IsNull()) + return; + TopoDS_Edge anEdgLeft, anEdgRight; + BRepBuilderAPI_MakeEdge aMakeEdge(aBSpline); + if(aMakeEdge.IsDone()) + anEdgLeft = aMakeEdge.Edge(); + if(anEdgLeft.IsNull()) + return; + aBSpline.Nullify(); + aBSpline = buildInterpolationCurve (anArrayOfLPnt); + if(aBSpline.IsNull()) + return; + aMakeEdge.Init(aBSpline); + if(aMakeEdge.IsDone()) + anEdgRight = aMakeEdge.Edge(); + if(anEdgRight.IsNull()) + return; + BRep_Builder aBB; + TopoDS_Compound aCmp; + aBB.MakeCompound(aCmp); + anIter.Init( aRefProfiles ); + for (int i=1 ; i < anArrOfProfiles.Length() +1; i++ ) + aBB.Add(aCmp, anArrOfProfiles.Value(i)); + aBB.Add(aCmp,anEdgLeft); + aBB.Add(aCmp,anEdgRight); + BRepCheck_Analyzer aCh(aCmp); + if(aCh.IsValid()) + SetShape3D(aCmp); +#ifdef DEB_UPDATE + else { + BRepTools::Write(aCmp, "str3d.brep"); + SetShape3D(aCmp); + } +#endif + + // Construct the top presentation + for(int i=1;i<= anArrayOfLPnt->Length();i++) { + gp_Pnt aPnt = anArrayOfFPnt->Value(i); + aPnt.SetZ(.0); // make 2d + anArrayOfFPnt->SetValue(i, aPnt); + aPnt = anArrayOfLPnt->Value(i); + aPnt.SetZ(.0); + anArrayOfLPnt->SetValue(i, aPnt); + } + aBSpline.Nullify(); + aBSpline = buildInterpolationCurve (anArrayOfFPnt); + if(aBSpline.IsNull()) + return; + aMakeEdge.Init(aBSpline); + if(aMakeEdge.IsDone()) + anEdgLeft = aMakeEdge.Edge(); + aBSpline.Nullify(); + aBSpline = buildInterpolationCurve (anArrayOfLPnt); + if(aBSpline.IsNull()) + return; + aMakeEdge.Init(aBSpline); + if(aMakeEdge.IsDone()) + anEdgRight = aMakeEdge.Edge(); + if(anEdgRight.IsNull()) + return; + BRepBuilderAPI_MakeEdge aMakeEdge2(anArrayOfFPnt->Value(1),anArrayOfLPnt->Value(1)); + TopoDS_Edge aBotEdge, aTopEdge; + if(aMakeEdge2.IsDone()) + aBotEdge = aMakeEdge2.Edge(); + BRepBuilderAPI_MakeEdge aMakeEdge3(anArrayOfFPnt->Value(anArrayOfFPnt->Length()),anArrayOfLPnt->Value(anArrayOfLPnt->Length())); + if(aMakeEdge3.IsDone()) + aTopEdge = aMakeEdge3.Edge(); + + BRepBuilderAPI_MakeWire aMakeWire( aBotEdge, anEdgLeft, aTopEdge,anEdgRight); + TopoDS_Wire aSectProfileWire; + if(aMakeWire.IsDone()) + aSectProfileWire = aMakeWire.Wire(); + BRepBuilderAPI_MakeFace aMakeFace( aSectProfileWire, Standard_True ); + TopoDS_Face aFace; + aMakeFace.Build(); + if( aMakeFace.IsDone() ) + aFace = aMakeFace.Face(); + aCmp.Nullify(); + aBB.MakeCompound(aCmp); + aBB.Add(aCmp,aFace); + for(int i=1;i <= anArrOf2DProfiles.Length(); i++) + aBB.Add(aCmp,anArrOf2DProfiles.Value(i)); + aCh.Init(aCmp); + if(aCh.IsValid()) + SetTopShape(aCmp); +#ifdef DEB_UPDATE + else { + BRepTools::Write(aCmp, "str2d.brep"); + SetTopShape(aCmp); + } +#endif + + // Create the stream groups + createGroupObjects(); +} \ No newline at end of file diff --git a/src/HYDROData/HYDROData_Stream.h b/src/HYDROData/HYDROData_Stream.h index 4e968be7..231bf6c3 100644 --- a/src/HYDROData/HYDROData_Stream.h +++ b/src/HYDROData/HYDROData_Stream.h @@ -58,11 +58,16 @@ public: HYDRODATA_EXPORT virtual TopoDS_Shape GetShape3D() const; /** - * Update the shape presentations of stream. + * Update the profiles order and shape presentations of stream. * Call this method whenever you made changes for stream data. */ HYDRODATA_EXPORT virtual void Update(); + /** + * Update the shape presentations of stream. + */ + HYDRODATA_EXPORT virtual void updatePrs(); + /** * Returns default filling color for new stream. */ diff --git a/src/HYDROGUI/HYDROGUI_StreamOp.cxx b/src/HYDROGUI/HYDROGUI_StreamOp.cxx index bd7085f4..5f45d48e 100755 --- a/src/HYDROGUI/HYDROGUI_StreamOp.cxx +++ b/src/HYDROGUI/HYDROGUI_StreamOp.cxx @@ -80,6 +80,9 @@ void HYDROGUI_StreamOp::startOperation() // Get/create the edited object if( myIsEdit ) { myEditedObject = Handle(HYDROData_Stream)::DownCast( HYDROGUI_Tool::GetSelectedObject( module() ) ); + if ( !myEditedObject.IsNull() && myEditedObject->IsMustBeUpdated() ) { + myEditedObject->Update(); + } } else { myEditedObject = Handle(HYDROData_Stream)::DownCast( doc()->CreateObject( KIND_STREAM ) ); } @@ -306,7 +309,7 @@ void HYDROGUI_StreamOp::onAddProfiles() Handle(HYDROData_Profile)::DownCast( aVerifiedProfiles.Value( i ) ); myEditedObject->AddProfile( aProfile ); } - myEditedObject->Update(); + myEditedObject->updatePrs(); // Update the panel updatePanelData(); @@ -346,7 +349,7 @@ void HYDROGUI_StreamOp::onRemoveProfiles( const QStringList& theProfilesToRemove if ( isRemoved ) { // Update the edited stream object - myEditedObject->Update(); + myEditedObject->updatePrs(); // Update the panel updatePanelData(); @@ -413,7 +416,7 @@ void HYDROGUI_StreamOp::onAxisChanged( const QString& theNewAxis ) } else { // Set axis myEditedObject->SetHydraulicAxis( anAxis ); - myEditedObject->Update(); + myEditedObject->updatePrs(); // Update the panel updatePanelData(); @@ -426,7 +429,7 @@ void HYDROGUI_StreamOp::onAxisChanged( const QString& theNewAxis ) void HYDROGUI_StreamOp::updatePanelData() { HYDROGUI_StreamDlg* aPanel = ::qobject_cast( inputPanel() ); - if ( !aPanel ) { + if ( !aPanel || myEditedObject.IsNull() ) { return; } -- 2.39.2