X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_Profile.cxx;h=99412519316018719820d4057e015a934117ba32;hb=58bb6b7459bebeeb089c9ed486c4683a8bae7288;hp=47418cdf8a0200b45a89d32b4df9534a93abd8b1;hpb=4d6a148db0bc353370c3635c1fae774e89bdcd19;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_Profile.cxx b/src/HYDROData/HYDROData_Profile.cxx old mode 100755 new mode 100644 index 47418cdf..99412519 --- a/src/HYDROData/HYDROData_Profile.cxx +++ b/src/HYDROData/HYDROData_Profile.cxx @@ -23,21 +23,29 @@ #include "HYDROData_Tool.h" #include "HYDROData_PolylineXY.h" -#include - #include #include #include +#include + +#include + +#include #include #include #include +#include +#include +#include #include #include +#include #include #include +#include #include #include @@ -45,11 +53,10 @@ #include #include -IMPLEMENT_STANDARD_HANDLE(HYDROData_Profile, HYDROData_Object) IMPLEMENT_STANDARD_RTTIEXT(HYDROData_Profile, HYDROData_Object) HYDROData_Profile::HYDROData_Profile() -: HYDROData_Object() +: HYDROData_Object( Geom_3d ) { } @@ -57,7 +64,8 @@ HYDROData_Profile::~HYDROData_Profile() { } -QStringList HYDROData_Profile::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const +QStringList HYDROData_Profile::DumpToPython( const QString& thePyScriptPath, + MapOfTreatedObjects& theTreatedObjects ) const { QStringList aResList = dumpObjectCreation( theTreatedObjects ); QString aProfileName = GetObjPyName(); @@ -65,7 +73,7 @@ QStringList HYDROData_Profile::DumpToPython( MapOfTreatedObjects& theTreatedObje //TCollection_AsciiString aFilePath = GetFilePath(); //if ( !aFilePath.IsEmpty() ) //{ - // aResList << QString( "%1.ImportFromFile( \"%2\" );" ) + // aResList << QString( "%1.ImportFromFile( \"%2\" )" ) // .arg( aName ).arg( aFilePath.ToCString() ); //} @@ -108,7 +116,7 @@ QStringList HYDROData_Profile::DumpToPython( MapOfTreatedObjects& theTreatedObje aResList << aPntsDefinition; - aResList << QString( "%1.%3( %2 );" ) + aResList << QString( "%1.%3( %2 )" ) .arg( aProfileName ).arg( aPntsListName ) .arg( anIsValidProfile ? "SetProfilePoints" : "SetParametricPoints" ); @@ -122,13 +130,13 @@ QStringList HYDROData_Profile::DumpToPython( MapOfTreatedObjects& theTreatedObje HYDROData_IPolyline::SectionType aSecType = aPrf->GetSectionType( 0 ); if ( aSecType != HYDROData_IPolyline::SECTION_POLYLINE ) { - aResList << QString( "%1.GetProfileUZ().SetSectionType( 0, %2 );" ) + aResList << QString( "%1.GetProfileUZ().SetSectionType( 0, %2 )" ) .arg( aProfileName ).arg( "HYDROData_IPolyline.SECTION_SPLINE" ); aResList << QString( "" ); } } - aResList << QString( "%1.Update();" ).arg( aProfileName ); + aResList << QString( "%1.Update()" ).arg( aProfileName ); aResList << QString( "" ); return aResList; @@ -156,7 +164,7 @@ TopoDS_Shape HYDROData_Profile::GetTopShape() const TopoDS_Shape HYDROData_Profile::GetShape3D() const { - TopoDS_Shape aShape = getShape3D(); + TopoDS_Shape aShape = HYDROData_Object::GetShape3D(); if( aShape.IsNull() ) aShape = CreateProfileWire( true ); return aShape; @@ -180,30 +188,20 @@ void HYDROData_Profile::Update() { HYDROData_Object::Update(); - TopoDS_Shape aShape = CreateProfileWire( false ); + TopoDS_Shape aShape = CreateProfileWire( true ); SetShape3D( aShape ); } -QColor HYDROData_Profile::DefaultFillingColor() +QColor HYDROData_Profile::DefaultFillingColor() const { return QColor( Qt::transparent ); } -QColor HYDROData_Profile::DefaultBorderColor() +QColor HYDROData_Profile::DefaultBorderColor() const { return QColor( Qt::black ); } -QColor HYDROData_Profile::getDefaultFillingColor() const -{ - return DefaultFillingColor(); -} - -QColor HYDROData_Profile::getDefaultBorderColor() const -{ - return DefaultBorderColor(); -} - bool HYDROData_Profile::IsValid() const { gp_XY aFirstPoint, aLastPoint; @@ -232,7 +230,7 @@ void HYDROData_Profile::SetLeftPoint( const gp_XY& theGPoint, bool IsConvertFrom anArray->SetValue( 0, aLPoint.X() ); anArray->SetValue( 1, aLPoint.Y() ); - SetToUpdate( true ); + Changed( Geom_3d ); } bool HYDROData_Profile::GetLeftPoint( gp_XY& thePoint, bool IsConvertToGlobal, @@ -244,7 +242,7 @@ bool HYDROData_Profile::GetLeftPoint( gp_XY& thePoint, bool IsConvertToGlobal, thePoint = GetParametricPoints().First(); - thePoint.SetX( 0 ); + //thePoint.SetX( 0 ); thePoint.SetY( 0 ); //default left point of not-georeferenced profile TDF_Label aLabel = myLab.FindChild( DataTag_FirstPoint, false ); if ( aLabel.IsNull() ) @@ -284,7 +282,7 @@ void HYDROData_Profile::SetRightPoint( const gp_XY& theGPoint, bool IsConvertFro anArray->SetValue( 0, aLPoint.X() ); anArray->SetValue( 1, aLPoint.Y() ); - SetToUpdate( true ); + Changed( Geom_3d ); } bool HYDROData_Profile::GetRightPoint( gp_XY& thePoint, bool IsConvertToGlobal, @@ -294,7 +292,8 @@ bool HYDROData_Profile::GetRightPoint( gp_XY& thePoint, bool IsConvertToGlobal, if ( aParametricPoints.Length() < 2 ) return false; - thePoint = GetParametricPoints().First(); + thePoint = GetParametricPoints().Last(); + thePoint.SetY( 0 ); TDF_Label aLabel = myLab.FindChild( DataTag_LastPoint, false ); if ( aLabel.IsNull() ) @@ -328,7 +327,7 @@ void HYDROData_Profile::Invalidate() if ( !aLastLabel.IsNull() ) aLastLabel.ForgetAllAttributes(); - SetToUpdate( true ); + Changed( Geom_3d ); } Handle(HYDROData_ProfileUZ) HYDROData_Profile::GetProfileUZ( const bool theIsCreate ) const @@ -361,7 +360,7 @@ void HYDROData_Profile::RemovePoints() if ( !aProfileUZ.IsNull() ) { aProfileUZ->RemoveSections(); - SetToUpdate( true ); + Changed( Geom_3d ); } } @@ -376,7 +375,7 @@ void HYDROData_Profile::SetParametricPoints( const HYDROData_ProfileUZ::PointsLi aProfileUZ->AddPoint( 0, aPoint ); } - SetToUpdate( true ); + Changed( Geom_3d ); } HYDROData_ProfileUZ::PointsList HYDROData_Profile::GetParametricPoints() const @@ -435,8 +434,8 @@ HYDROData_Profile::ProfilePoints HYDROData_Profile::GetProfilePoints const HYDROData_ProfileUZ::Point& aFirstParPoint = aParametricPoints.First(); const HYDROData_ProfileUZ::Point& aLastParPoint = aParametricPoints.Last(); - double aGeoDistance = gp_Pnt2d( aFirstPoint ).Distance( aLastPoint ); - double aParCommonDist = gp_Pnt2d( aFirstParPoint.X(), 0 ).Distance( gp_Pnt2d( aLastParPoint.X(), 0 ) ); + double aFullLength = aLastPoint.X() - aFirstPoint.X(); + double aParFullLength = aLastParPoint.X() - aFirstParPoint.X(); // Add first point as is aResPoints.Append( ProfilePoint( aFirstPoint.X(), aFirstPoint.Y(), aFirstParPoint.Y() ) ); @@ -446,14 +445,11 @@ HYDROData_Profile::ProfilePoints HYDROData_Profile::GetProfilePoints { const HYDROData_ProfileUZ::Point& aParPoint = aParametricPoints.Value( i ); - double aParPointDist = gp_Pnt2d( aFirstParPoint.X(), 0 ).Distance( gp_Pnt2d( aParPoint.X(), 0 ) ); - - double aParLen = ( aParPointDist / aParCommonDist ) * aGeoDistance; - - double aRatio = aParLen / ( aGeoDistance - aParLen ); + double aParPointDist = aParPoint.X() - aFirstParPoint.X(); + double aRatio = aParPointDist / aParFullLength; - double aParX = ( aFirstPoint.X() + aRatio * aLastPoint.X() ) / ( 1 + aRatio ); - double aParY = ( aFirstPoint.Y() + aRatio * aLastPoint.Y() ) / ( 1 + aRatio ); + double aParX = aFirstPoint.X() * (1-aRatio) + aLastPoint.X() * aRatio; + double aParY = aFirstPoint.Y() * (1-aRatio) + aLastPoint.Y() * aRatio; ProfilePoint aCompPoint( aParX, aParY, aParPoint.Y() ); aResPoints.Append( aCompPoint ); @@ -483,7 +479,8 @@ TCollection_AsciiString HYDROData_Profile::GetFilePath() const int HYDROData_Profile::ImportFromFile( const Handle(HYDROData_Document)& theDoc, const TCollection_AsciiString& theFileName, - NCollection_Sequence& theBadProfilesIds ) + NCollection_Sequence& theBadProfilesIds, + bool isToProject ) { if ( theDoc.IsNull() || theFileName.IsEmpty() ) return 0; @@ -506,7 +503,7 @@ int HYDROData_Profile::ImportFromFile( const Handle(HYDROData_Document)& theDoc, aNewProfile = Handle(HYDROData_Profile)::DownCast( theDoc->CreateObject( KIND_PROFILE ) ); bool anIsRead = false; - if ( aNewProfile->ImportFromFile( aFile, &anIsRead ) ) + if ( aNewProfile->ImportFromFile( aFile, isToProject, &anIsRead ) ) { aCreatedProfiles.Append( aNewProfile ); aNewProfile.Nullify(); @@ -532,17 +529,18 @@ int HYDROData_Profile::ImportFromFile( const Handle(HYDROData_Document)& theDoc, aProfile->SetFilePath( theFileName ); - aProfile->SetBorderColor( HYDROData_Profile::DefaultBorderColor() ); + aProfile->SetBorderColor( aProfile->DefaultBorderColor() ); } return aCreatedProfiles.Length(); } bool HYDROData_Profile::ImportFromFile( const TCollection_AsciiString& theFileName, - bool* theIsRead ) + bool isToProject, + bool* isNotEmpty ) { - if ( theIsRead ) - *theIsRead = false; + if( isNotEmpty ) + *isNotEmpty = false; // Try to open the file OSD_File aFile( theFileName ); @@ -553,7 +551,7 @@ bool HYDROData_Profile::ImportFromFile( const TCollection_AsciiString& theFileNa if ( !aFile.IsOpen() ) return false; - bool aRes = ImportFromFile( aFile, theIsRead ); + bool aRes = ImportFromFile( aFile, isToProject, isNotEmpty ); // Close the file aFile.Close(); @@ -568,10 +566,11 @@ bool HYDROData_Profile::ImportFromFile( const TCollection_AsciiString& theFileNa } bool HYDROData_Profile::ImportFromFile( OSD_File& theFile, - bool* theIsRead ) + bool isToProject, + bool* isNotEmpty ) { - if ( theIsRead ) - *theIsRead = false; + if( isNotEmpty ) + *isNotEmpty = false; if ( !theFile.IsOpen() ) return false; @@ -601,8 +600,8 @@ bool HYDROData_Profile::ImportFromFile( OSD_File& theFile, } // Set flag of read status to true - if ( theIsRead ) - *theIsRead = true; + if( isNotEmpty ) + *isNotEmpty = true; TCollection_AsciiString aValX = aLine.Token( " \t", 1 ); TCollection_AsciiString aValY = aLine.Token( " \t", 2 ); @@ -624,8 +623,8 @@ bool HYDROData_Profile::ImportFromFile( OSD_File& theFile, double aCoordX = aValX.RealValue(); double aCoordY = aValY.RealValue(); - if ( boost::math::isnan( aCoordX ) || boost::math::isinf( aCoordX ) || - boost::math::isnan( aCoordY ) || boost::math::isinf( aCoordY ) ) + if ( HYDROData_Tool::IsNan( aCoordX ) || HYDROData_Tool::IsInf( aCoordX ) || + HYDROData_Tool::IsNan( aCoordY ) || HYDROData_Tool::IsInf( aCoordY ) ) aRes = false; if ( anIsParametric ) @@ -651,7 +650,7 @@ bool HYDROData_Profile::ImportFromFile( OSD_File& theFile, } double aCoordZ = aValZ.RealValue(); - if ( boost::math::isnan( aCoordZ ) || boost::math::isinf( aCoordZ ) ) + if ( HYDROData_Tool::IsNan( aCoordZ ) || HYDROData_Tool::IsInf( aCoordZ ) ) aRes = false; ProfilePoint aPoint( aCoordX, aCoordY, aCoordZ ); @@ -670,6 +669,8 @@ bool HYDROData_Profile::ImportFromFile( OSD_File& theFile, } else if ( anIsGeoref ) { + if( isToProject ) + ProjectProfilePoints( aPointsXYZ ); SetProfilePoints( aPointsXYZ, true ); } @@ -748,3 +749,57 @@ HYDROData_Profile::ProfilePoint HYDROData_Profile::GetBottomPoint() const return aBottom; } + HYDROData_Profile::ProfilePoint HYDROData_Profile::GetMiddlePoint( bool CanUseDefault ) const + { + ProfilePoint aMiddlePoint; + + gp_XY aLeftPnt, aRightPnt; + if ( GetLeftPoint( aLeftPnt, true, CanUseDefault ) && GetRightPoint( aRightPnt, true, CanUseDefault ) ) { + gp_XYZ aPnt1( aLeftPnt.X(), aLeftPnt.Y(), 0. ); + gp_XYZ aPnt2( aRightPnt.X(), aRightPnt.Y(), 0. ); + gp_Pnt aMiddlePoint2d( 0.5 * ( aPnt1 + aPnt2 ) ); + + gp_Lin aMidLin( aMiddlePoint2d, gp::DZ() ); + TopoDS_Edge aMidEdge = BRepLib_MakeEdge( aMidLin ); + + TopoDS_Iterator anIt( TopoDS::Wire( GetShape3D() ) ); + for ( ; anIt.More(); anIt.Next()) { + const TopoDS_Edge& anEdge = TopoDS::Edge( anIt.Value() ); + + /* + Standard_Real aStart, anEnd; + Handle(Geom_Curve) aCurve = BRep_Tool::Curve( anEdge, aStart, anEnd ); + gp_Pnt aMiddlePointOnCurve = aCurve->Value( ( aStart + anEnd ) / 2 ); + */ + + BRepExtrema_ExtCC ExtremaEE( aMidEdge, anEdge); + if (ExtremaEE.IsDone() && ExtremaEE.NbExt() != 0) { + for ( Standard_Integer i = 1; i <= ExtremaEE.NbExt(); i++ ) { + if ( ExtremaEE.SquareDistance(i) <= Precision::Confusion() ) { + aMiddlePoint = ExtremaEE.PointOnE1(i).XYZ(); + break; + } + } + } + } + } + + return aMiddlePoint; + } + +void HYDROData_Profile::ProjectProfilePoints( ProfilePoints& thePoints ) +{ + int low = thePoints.Lower(), up = thePoints.Upper(); + gp_Pnt aFirst = thePoints.Value( low ); + gp_Pnt aLast = thePoints.Value( up ); + gp_Vec d( aFirst, aLast ); + gp_Vec n( d.Y(), -d.X(), 0 ); + + Handle(Geom_Plane) aPlane = new Geom_Plane( aFirst, gp_Dir( n ) ); + for( int i=low; i<=up; i++ ) + { + gp_XYZ p = thePoints.Value( i ); + gp_Pnt pp = GeomAPI_ProjectPointOnSurf( p, aPlane ); + thePoints.SetValue( i, pp.XYZ() ); + } +}