From 5875b067c1dffa0bd68b31c018b0ee4091775344 Mon Sep 17 00:00:00 2001 From: Paul RASCLE Date: Tue, 4 Aug 2015 18:57:35 +0200 Subject: [PATCH] middle z for 3D guideline --- src/HYDROData/HYDROData_ChannelAltitude.cxx | 29 +++------------------ src/HYDROData/HYDROData_Object.cxx | 24 +++++++++++++++++ src/HYDROData/HYDROData_Object.h | 12 ++++++++- src/HYDROData/HYDROData_Polyline3D.cxx | 9 +++++++ 4 files changed, 48 insertions(+), 26 deletions(-) diff --git a/src/HYDROData/HYDROData_ChannelAltitude.cxx b/src/HYDROData/HYDROData_ChannelAltitude.cxx index fd3917cc..4031dc82 100644 --- a/src/HYDROData/HYDROData_ChannelAltitude.cxx +++ b/src/HYDROData/HYDROData_ChannelAltitude.cxx @@ -93,7 +93,9 @@ double HYDROData_ChannelAltitude::GetAltitudeForPoint( const gp_XY& thePoint ) c // --- See GEOMImpl_ProjectionDriver.cxx TopoDS_Shape aShape = aGuideLine->GetShape3D(); - gp_Pnt P1(thePoint.X(), thePoint.Y(), 0); // plutot altitude moyenne + double middleZ = -9999; + aGuideLine->GetMiddleZ(middleZ); // use the middle Z value of the 3d line to help the projection. + gp_Pnt P1(thePoint.X(), thePoint.Y(), middleZ); TopoDS_Shape aPoint = BRepBuilderAPI_MakeVertex(P1).Shape(); if (aPoint.IsNull() || aShape.IsNull()) @@ -235,34 +237,11 @@ double HYDROData_ChannelAltitude::GetAltitudeForPoint( const gp_XY& thePoint ) c return aResAltitude; } -// aParam = (aParam - aF) / (aL - aF); -// aProj.SetU(aParam); -// -// // Compute edge index. -// TopExp_Explorer anExp(aShape, TopAbs_EDGE); -// int anIndex = 0; -// -// for (; anExp.More(); anExp.Next(), anIndex++) -// { -// if (aSupportShape.IsSame(anExp.Current())) -// { -// aProj.SetIndex(anIndex); -// break; -// } -// } -// -// if (!anExp.More()) -// { -// DEBTRACE("Projection aborted : Can't define edge index"); -// return aResAltitude; -// } - // Construct a projection vertex. const gp_Pnt &aPntProj = aDistShSh.PointOnShape2(i); TopoDS_Shape aProj = BRepBuilderAPI_MakeVertex(aPntProj).Shape(); DEBTRACE("projection: (" << aPntProj.X() << ", " << aPntProj.Y() << ", " << aPntProj.Z() << ")"); - return aPntProj.Z(); - //aFunction->SetValue(aProj); + return aPntProj.Z() + 2.; } } diff --git a/src/HYDROData/HYDROData_Object.cxx b/src/HYDROData/HYDROData_Object.cxx index 1ffc9cd5..fdd7e8fd 100644 --- a/src/HYDROData/HYDROData_Object.cxx +++ b/src/HYDROData/HYDROData_Object.cxx @@ -29,6 +29,7 @@ #include #include +#include #include @@ -120,6 +121,29 @@ void HYDROData_Object::SetShape3D( const TopoDS_Shape& theShape ) checkAndSetObject3D(); } +Standard_Boolean HYDROData_Object::GetMiddleZ( Standard_Real& theMiddleZ ) const +{ + theMiddleZ = -9999; + TDF_Label aLabel = myLab.FindChild( DataTag_MiddleZ, false ); + if ( !aLabel.IsNull() ) + { + Handle(TDataStd_Real) aRealVal; + if ( aLabel.FindAttribute( TDataStd_Real::GetID(), aRealVal ) ) + { + theMiddleZ = aRealVal->Get(); + return Standard_True; + } + } + + return Standard_False; + +} + +void HYDROData_Object::SetMiddleZ( const Standard_Real& theMiddleZ ) +{ + TDataStd_Real::Set( myLab.FindChild( DataTag_MiddleZ ), theMiddleZ ); +} + Handle(HYDROData_DummyObject3D) HYDROData_Object::GetObject3D() const { Handle(HYDROData_DummyObject3D) anObject; diff --git a/src/HYDROData/HYDROData_Object.h b/src/HYDROData/HYDROData_Object.h index 520a70ab..cd4cf20a 100644 --- a/src/HYDROData/HYDROData_Object.h +++ b/src/HYDROData/HYDROData_Object.h @@ -50,6 +50,7 @@ protected: DataTag_EdgesGroup, ///< child group objects DataTag_ChildAltitudeObject, ///< child altitude object DataTag_IsSubmersible, ///< the attribute "is submersible" + DataTag_MiddleZ, ///< middle Z value of Shape3D }; public: @@ -99,7 +100,16 @@ public: */ HYDRODATA_EXPORT virtual TopoDS_Shape GetShape3D() const = 0; - + /** + * Returns the middle z value of 3D object representation or -9999 if no value. + */ + HYDRODATA_EXPORT virtual Standard_Boolean GetMiddleZ( Standard_Real& theMiddleZ ) const; + + /** + * Set the middle z value of 3D object representation. + */ + HYDRODATA_EXPORT virtual void SetMiddleZ( const Standard_Real& theMiddleZ ); + /** * Returns reference object which represent the 3D shape of object. */ diff --git a/src/HYDROData/HYDROData_Polyline3D.cxx b/src/HYDROData/HYDROData_Polyline3D.cxx index 67098e95..0ae2a44f 100644 --- a/src/HYDROData/HYDROData_Polyline3D.cxx +++ b/src/HYDROData/HYDROData_Polyline3D.cxx @@ -28,6 +28,9 @@ #include +#include +#include + #include #include @@ -207,6 +210,12 @@ void HYDROData_Polyline3D::Update() TopoDS_Wire aResWire = HYDROData_PolylineXY::BuildWire( aSectionType, anIsSectionClosed, aResPoints ); SetTopShape( aResWire ); SetShape3D( aResWire ); + + double Xmin=0, Xmax=0, Ymin=0, Ymax=0, Zmin=-9999, Zmax=-9999; + Bnd_Box B; + BRepBndLib::Add(aResWire, B); + B.Get(Xmin, Ymin, Zmin, Xmax, Ymax, Zmax); + SetMiddleZ((Zmin+Zmax)/2.); } QColor HYDROData_Polyline3D::DefaultFillingColor() -- 2.39.2