#include <gp_Pnt.hxx>
#include <gp_Pln.hxx>
#include <gp.hxx>
+#include <Bnd_Box.hxx>
+#include <BRepBndLib.hxx>
+#include <TColStd_Array1OfReal.hxx>
#include <Precision.hxx>
#include <QStringList>
+#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 <SortTools_QuickSortOfReal.hxx>
+//#define DEB_HASINT 1
+#ifdef DEB_HASINT
+#include <BRepTools.hxx>
+#include <TCollection_AsciiString.hxx>
+#include <BRep_Builder.hxx>
+#endif
+
#define PYTHON_STREAM_ID "KIND_STREAM"
IMPLEMENT_STANDARD_HANDLE(HYDROData_Stream,HYDROData_NaturalObject)
return false;
// TODO
- return true; // temporary
+ //return true; // temporary
BRepProj_Projection aProjector (aProfileWire, thePlane, gp::OZ().Direction());
if(!aProjector.IsDone())
return false;
const TopoDS_Edge& anEdg1 = TopoDS::Edge(anExplo.Current());
if(anEdg1.IsNull())
continue;
+ Standard_Boolean hasSol(false);
aCC.Perform(anEdg1);
if(aCC.IsDone()) {
+ // find minimal dist
for(Standard_Integer i=1; i<= aCC.NbExt();i++)
if(aCC.SquareDistance(i) < aSqDist) {
aSqDist = aCC.SquareDistance(i);
anIndx = i;
- hasInt = true;
+ hasSol = true;
}
}
- if(hasInt) {
- if(aSqDist <= SquareTolerance) {
+ if(hasSol) {
+ if(aSqDist <= SquareTolerance) { // hasInt
const gp_Pnt& aPnt = aCC.PointOnE1(anIndx);
if(aNum > 1) {
TopExp::Vertices(anEdg1, aV1, aV2, Standard_True);
Standard_Real aPar = aCC.ParameterOnE1(anIndx);
outPar = aPar;
}
+ hasInt = true;
break;
- } else {
+ } else {
+ // no ints-n
if(aNum > 1) {
TopExp::Vertices(anEdg1, aV1, aV2);
outPar += BRep_Tool::Pnt(aV1).Distance(BRep_Tool::Pnt(aV2));
}
}
- }
+ }
}
- return true;
+ if(hasInt)
+ return true;
+ return false;
}
bool HYDROData_Stream::AddProfile( const Handle(HYDROData_Profile)& theProfile )
{
if ( theProfile.IsNull() )
+ return false;
+ Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis();
+ if ( aHydAxis.IsNull() )
return false;
- gp_Ax2 aX2(gp::XOY());
- gp_Ax3 aX3(aX2);
- gp_Pln aPln(aX3);
- BRepBuilderAPI_MakeFace aMkr(aPln);
- if(!aMkr.IsDone())
- return false;
- const TopoDS_Face& aPlane = TopoDS::Face(aMkr.Shape());
+ TopoDS_Face aPlane;
+ if(!BuildFace(aHydAxis, aPlane))
+ return false;
Standard_Real aPar(.0);
if ( HasReference( theProfile, DataTag_Profile ) || !HasIntersection( theProfile, aPlane, aPar ) )
return false; // Object is already in reference list or it has no intersection
-
+
insertProfileInToOrder( theProfile );
// Indicate model of the need to update the stream presentation
AddReferenceObject( theProfile, DataTag_Profile ); // temporary for testing only
}
+bool HYDROData_Stream::BuildFace( const Handle(HYDROData_PolylineXY)& theHydAxis, TopoDS_Face& thePlane) const
+{
+ if ( theHydAxis.IsNull() ) return false;
+ TopoDS_Wire aHydraulicWire = TopoDS::Wire( theHydAxis->GetShape() );
+ if(aHydraulicWire.IsNull()) return false;
+ 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 = TopoDS::Face(aMkr.Shape());
+ return true;
+}
void HYDROData_Stream::updateProfilesOrder()
{
HYDROData_SequenceOfObjects aRefProfiles = GetProfiles();
Handle(HYDROData_PolylineXY) aHydAxis = GetHydraulicAxis();
if ( aHydAxis.IsNull() )
+ return;
+ TopoDS_Face aPlane;
+ if(!BuildFace(aHydAxis, aPlane))
return;
- gp_Ax2 aX2(gp::XOY());
- gp_Ax3 aX3(aX2);
- gp_Pln aPln(aX3);
- BRepBuilderAPI_MakeFace aMkr(aPln);
- if(!aMkr.IsDone())
- return;
- const TopoDS_Face& aPlane = TopoDS::Face(aMkr.Shape());
Standard_Real aPar(.0);
+#ifdef DEB_HASINT
+ BRep_Builder aBB;
+ TopoDS_Compound aCmp;
+ aBB.MakeCompound(aCmp);
+#endif
+ HYDROData_DataMapOfRealOfHDProfile aDM;
+ TColStd_ListOfReal aList;
HYDROData_SequenceOfObjects::Iterator anIter( aRefProfiles );
- for ( ; anIter.More(); anIter.Next() )
+ for (int i = 1 ; anIter.More(); anIter.Next(), i++ )
{
Handle(HYDROData_Profile) aProfile =
Handle(HYDROData_Profile)::DownCast( anIter.Value() );
+#ifdef DEB_HASINT
+ TopoDS_Wire aProfileWire = TopoDS::Wire( aProfile->GetTopShape() );
+ aBB.Add( aCmp, aProfileWire);
+#endif
if ( aProfile.IsNull() || !HasIntersection( aProfile, aPlane, aPar ) )
continue;
-
- insertProfileInToOrder( aProfile );
+ aDM.Bind(aPar, aProfile);
+ aList.Append(aPar);
+ //insertProfileInToOrder( aProfile );
}
+ // sorting
+ if(aList.Extent() > 1) {
+ TColStd_Array1OfReal anArr(1, aList.Extent());
+ TColStd_ListIteratorOfListOfReal it(aList);
+ for (int j=1;it.More();it.Next(), j++)
+ anArr(j) = it.Value();
+ TCollection_CompareOfReal Compar;
+ SortTools_QuickSortOfReal::Sort( anArr, Compar);
+ for (int j = 1; j <= anArr.Length(); j++) {
+ const Standard_Real aKey = anArr(j);
+ const Handle(HYDROData_Profile)& aProfile = aDM.Find(aKey);
+ insertProfileInToOrder( aProfile );
+ }
+ } else if(aList.Extent() == 1) {
+ const Standard_Real aKey = aList.Last();
+ const Handle(HYDROData_Profile)& aProfile = aDM.Find(aKey);
+ insertProfileInToOrder( aProfile );
+ }
+
+#ifdef DEB_HASINT
+ TopoDS_Wire aHydraulicWire = TopoDS::Wire( aHydAxis->GetShape() );
+ BRepTools::Write(aHydraulicWire, "Path.brep");
+ BRepTools::Write(aCmp, "Prof.brep");
+#endif
}