#include <NCollection_DataMap.hxx>
typedef NCollection_DataMap<Standard_Real, Handle(HYDROData_Profile)> HYDROData_DataMapOfRealOfHDProfile;
-//typedef HYDROData_DataMapOfRealOfHDProfile::Iterator HYDROData_DataMapIteratorOfDataMapOfRealOfHDProfile;
#include <TColStd_ListOfReal.hxx>
#include <TColStd_ListIteratorOfListOfReal.hxx>
#include <TCollection_CompareOfReal.hxx>
#include <GeomAPI_Interpolate.hxx>
#include <Geom_BSplineCurve.hxx>
#include <TopTools_Array1OfShape.hxx>
+#include <BRepCheck_Analyzer.hxx>
+
+//#define DEB_STREAM 1
+#ifdef DEB_STREAM
//#define DEB_HASINT 1
-#ifdef DEB_HASINT
+//#define DEB_UPDATE 1
#include <BRepTools.hxx>
#include <TCollection_AsciiString.hxx>
-#include <BRep_Builder.hxx>
#endif
#define PYTHON_STREAM_ID "KIND_STREAM"
{
return getShape3D();
}
-
+ Handle(Geom_BSplineCurve) HYDROData_Stream::buildInterpolationCurve(const Handle(TColgp_HArray1OfPnt)& theArrayOfPnt)
+{
+ Handle(Geom_BSplineCurve) aBSpline;
+ GeomAPI_Interpolate anInterpolator (theArrayOfPnt, Standard_False, 1.0e-5);
+ anInterpolator.Perform() ;
+ if (anInterpolator.IsDone())
+ aBSpline = anInterpolator.Curve();
+ return aBSpline;
+}
void HYDROData_Stream::Update()
{
HYDROData_NaturalObject::Update();
HYDROData_SequenceOfObjects aRefProfiles = GetProfiles();
if ( aHydAxis.IsNull() || aRefProfiles.IsEmpty() )
return;
-
- TopoDS_Shell a2dShell;
- BRep_Builder a2dShellBuilder;
- a2dShellBuilder.MakeShell( a2dShell );
-
+
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());
+ 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());
- // Construct the top presentation
+ TopTools_Array1OfShape anArrOf2DProfiles(1, aRefProfiles.Length());
+
+ // Pre-processing
HYDROData_SequenceOfObjects::Iterator anIter( aRefProfiles );
for (int i=1 ; anIter.More(); anIter.Next(),i++ )
{
gp_XY aPnt1, aPnt2;
if ( !aProfile->GetFirstPoint( aPnt1 ) || !aProfile->GetLastPoint( aPnt2 ) )
continue;
- anArrOfProfiles.SetValue(i,aProfile->GetShape3D());
+ 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;
aCurFP = aP1;
anArrayOfFPnt->SetValue(i,aCurFP);
anArrayOfLPnt->SetValue(i,aCurLP);
- if ( anIsFirst )
- {
- aPrevFirstPoint = aCurFirstPoint;
- aPrevLastPoint = aCurLastPoint;
- anIsFirst = false;
- continue;
- }
-
- BRepBuilderAPI_MakeEdge aFirstEdge( aPrevFirstPoint, aPrevLastPoint );
- BRepBuilderAPI_MakeEdge aSecondEdge( aPrevLastPoint, aCurLastPoint );
- BRepBuilderAPI_MakeEdge aThirdEdge( aCurLastPoint, aCurFirstPoint );
- BRepBuilderAPI_MakeEdge aFourthEdge( aCurFirstPoint, aPrevFirstPoint );
-
- BRepBuilderAPI_MakeWire aMakeWire( aFirstEdge.Edge(), aSecondEdge.Edge(),
- aThirdEdge.Edge(), aFourthEdge.Edge() );
-
- TopoDS_Wire aSectProfileWire = aMakeWire.Wire();
-
- BRepBuilderAPI_MakeFace aMakeFace( aSectProfileWire, Standard_True );
- aMakeFace.Build();
- if( aMakeFace.IsDone() )
- {
- a2dShellBuilder.Add( a2dShell, aMakeFace.Face() );
- }
-
- aPrevFirstPoint = aCurFirstPoint;
- aPrevLastPoint = aCurLastPoint;
}
- SetTopShape( a2dShell );
- // Construct the 3D presentation
- Handle(Geom_BSplineCurve) aBSpline;
- GeomAPI_Interpolate anInterpolator (anArrayOfFPnt, Standard_False, 1.0e-5);
- anInterpolator.Perform() ;
- if (anInterpolator.IsDone())
- aBSpline = anInterpolator.Curve();
- else
- return;
+ // 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();
- GeomAPI_Interpolate anInterpolator2 (anArrayOfLPnt, Standard_False, 1.0e-5);
- anInterpolator2.Perform() ;
- if (anInterpolator2.IsDone())
- aBSpline = anInterpolator2.Curve();
- else
- return;
+ 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);
aBB.Add(aCmp, anArrOfProfiles.Value(i));
aBB.Add(aCmp,anEdgLeft);
aBB.Add(aCmp,anEdgRight);
- SetShape3D(aCmp);
- //BRepTools::Write(aCmp, "str3d.brep");
+ 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
+
}
bool HYDROData_Stream::SetHydraulicAxis( const Handle(HYDROData_PolylineXY)& theAxis )