#include <TopTools_HArray1OfShape.hxx>
#include <TopTools_IndexedMapOfOrientedShape.hxx>
+#include <TopTools_ListIteratorOfListOfShape.hxx>
+#include <TopTools_SequenceOfShape.hxx>
+#include <TopTools_IndexedMapOfShape.hxx>
#include <SortTools_QuickSortOfReal.hxx>
#include <TCollection_AsciiString.hxx>
#endif
+#include <assert.h>
+
typedef NCollection_DataMap<Standard_Real, Handle(HYDROData_Profile)> HYDROData_DataMapOfRealOfHDProfile;
IMPLEMENT_STANDARD_HANDLE(HYDROData_Stream,HYDROData_NaturalObject)
void HYDROData_Stream::Update()
{
- updateProfilesOrder();
+ if (!GetHydraulicAxis().IsNull())
+ updateProfilesOrder();
// Update bottom polyline if exists
const Handle(HYDROData_Polyline3D) aBottomPolyline = GetBottomPolyline();
Handle_HYDROData_DTM dtm = DTM();
dtm->Update();
UpdatePrs( dtm );
+
+ HYDROData_NaturalObject::Update();
}
bool HYDROData_Stream::IsHas2dPrs() const
void HYDROData_Stream::SetDDZ( double theDDZ )
{
DTM()->SetDDZ( theDDZ );
+ Changed( Geom_3d );
}
double HYDROData_Stream::GetSpatialStep() const
void HYDROData_Stream::SetSpatialStep( double theSpatialStep )
{
DTM()->SetSpatialStep( theSpatialStep );
+ Changed( Geom_3d );
}
bool HYDROData_Stream::SetHydraulicAxis( const Handle(HYDROData_PolylineXY)& theAxis )
if ( theProfile.IsNull() )
return false;
- Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis();
- if ( aHydAxis.IsNull() )
- return false;
+ // Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis();
+ // if ( aHydAxis.IsNull() )
+ // return false;
TopoDS_Face aPlane;
- if(!BuildFace(aHydAxis, aPlane))
- return false;
+ BuildRefFace( aPlane );
Standard_Real aPar(.0);
if ( HasReference( theProfile, DataTag_Profile ) || !HasIntersection( theProfile, aPlane, aPar ) )
void HYDROData_Stream::insertProfileInToOrder( const Handle(HYDROData_Profile)& theProfile,
const int theBeforeIndex )
{
- Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis();
- if ( theProfile.IsNull() || aHydAxis.IsNull() )
+ //Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis();
+ if ( theProfile.IsNull() )
return;
- TopoDS_Wire aHydraulicWire = TopoDS::Wire( aHydAxis->GetShape() );
+ //TopoDS_Wire aHydraulicWire = TopoDS::Wire( aHydAxis->GetShape() );
TopoDS_Wire aProfileWire = TopoDS::Wire( theProfile->GetTopShape() );
- if ( aHydraulicWire.IsNull() || aProfileWire.IsNull() )
+ if ( aProfileWire.IsNull() )
return;
if ( theBeforeIndex == -1 )
InsertReferenceObject( theProfile, DataTag_Profile, theBeforeIndex );
}
-bool HYDROData_Stream::BuildFace( const Handle(HYDROData_PolylineXY)& theHydAxis,
- TopoDS_Face& thePlane )
+void HYDROData_Stream::BuildRefFace( TopoDS_Face& thePlane )
{
- //if ( !IsValidAsAxis( theHydAxis ) )
- // return false;
-
- //TopoDS_Wire aHydraulicWire = TopoDS::Wire( theHydAxis->GetShape() );
- //
- //gp_Ax2 aX2(gp::XOY());
- //gp_Ax3 aX3(aX2);
- //gp_Pln aPln(aX3);
- //Bnd_Box B;
- //BRepBndLib::Add(aHydraulicWire,B);
- //Standard_Real axmin,aymin,azmin,axmax,aymax,azmax;
- //B.Get(axmin,aymin,azmin,axmax,aymax,azmax);
- //BRepBuilderAPI_MakeFace aMkr(aPln, axmin-500., axmax+500., aymin-500., aymax+500.); // to be tuned later according max/ Profile deviation
- //if(!aMkr.IsDone() || aMkr.Shape().IsNull()) return false;
thePlane = BRepBuilderAPI_MakeFace(gp_Pln(gp_Pnt(0,0,0),gp_Dir(0,0,1))).Face();
- return true;
}
void HYDROData_Stream::updateProfilesOrder()
return;
TopoDS_Face aPlane;
- if ( !BuildFace( aHydAxis, aPlane ) )
- return;
+ BuildRefFace( aPlane );
Standard_Real aPar( .0 );
}
}
}
-
void HYDROData_Stream::CreatePresentations( const Handle(TColgp_HArray1OfPnt) theArrayOfFPnt,
const Handle(TColgp_HArray1OfPnt) theArrayOfLPnt,
const Handle(TopTools_HArray1OfShape) theArrOfProfiles,
std::vector<HYDROData_Bathymetry::AltitudePoints> dummy;
TopTools_IndexedMapOfOrientedShape ll = HYDROData_DTM::Create3DShape(left, right, dummy);
+ TopoDS_Shape LB, RB, IL, OL;
+
if (!ll.IsEmpty())
{
- thePrs.myLeftBank = TopoDS::Wire(ll(1));
- thePrs.myRightBank = TopoDS::Wire(ll(2));
+ LB = TopoDS::Wire(ll(1));
+ RB = TopoDS::Wire(ll(2));
}
- thePrs.myInlet = TopoDS::Wire(theArrOfProfiles->Value(theArrOfProfiles->Lower())); //TODO check that
- thePrs.myOutlet = TopoDS::Wire(theArrOfProfiles->Value(theArrOfProfiles->Upper()));
+ IL = TopoDS::Wire(theArrOfProfiles->Value(theArrOfProfiles->Lower())); //TODO check that
+ OL = TopoDS::Wire(theArrOfProfiles->Value(theArrOfProfiles->Upper()));
//make new compound so it's shapes will be in known order to build correct projection
BRep_Builder BB;
TopoDS_Compound newCmp;
BB.MakeCompound(newCmp);
- BB.Add(newCmp, thePrs.myLeftBank);
- BB.Add(newCmp, thePrs.myInlet);
- BB.Add(newCmp, thePrs.myOutlet);
- BB.Add(newCmp, thePrs.myRightBank);
+ BB.Add(newCmp, LB);
+ BB.Add(newCmp, IL);
+ BB.Add(newCmp, OL);
+ BB.Add(newCmp, RB);
thePrs.myPrs3D = newCmp;
+ std::set<int> ind;
+ ind.insert(1); //inlet ind
+ ind.insert(2); //outlet ind
+
+ TopTools_SequenceOfShape LS;
+ HYDROData_DTM::Get2dFaceFrom3dPres( newCmp, TopoDS::Face(thePrs.myPrs2D), &LS, ind );
+
+#ifndef NDEBUG
+ TopTools_IndexedMapOfShape EE;
+ TopExp::MapShapes(thePrs.myPrs2D, TopAbs_EDGE, EE);
+ int noncontNb = 0;
+ for (int i = 1; i <= 4; i++)
+ {
+ TopoDS_Shape W = LS(i);
+ TopTools_IndexedMapOfShape EW;
+ TopExp::MapShapes(W, TopAbs_EDGE, EW);
+ for (int k = 1; k <= EW.Extent(); k++)
+ noncontNb += !EE.Contains(EW(k));
+ }
+ //noncontNb > 0 => some problem with edge history
+ assert(noncontNb == 0);
+#endif
- HYDROData_DTM::Get2dFaceFrom3dPres( newCmp, TopoDS::Face(thePrs.myPrs2D) );
+ thePrs.myLeftBank = TopoDS::Wire(LS(1));
+ thePrs.myInlet = TopoDS::Wire(LS(2));
+ thePrs.myOutlet = TopoDS::Wire(LS(3));
+ thePrs.myRightBank = TopoDS::Wire(LS(4));
}
\ No newline at end of file