X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_Profile.cxx;h=15e91a519143d02f8b19c4eb6e660a3a68b5d875;hb=3bece499e83cc9ca95536228c7f6740030e9d5d8;hp=76b0bed2cfd9b9fecad39e2cece3555fe8c4779c;hpb=51f1f5efbfb19a6e9b39baccdb76a89b04663fbb;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_Profile.cxx b/src/HYDROData/HYDROData_Profile.cxx index 76b0bed2..15e91a51 100644 --- a/src/HYDROData/HYDROData_Profile.cxx +++ b/src/HYDROData/HYDROData_Profile.cxx @@ -23,8 +23,6 @@ #include "HYDROData_Tool.h" #include "HYDROData_PolylineXY.h" -#include - #include #include #include @@ -37,6 +35,9 @@ #include #include #include +#include +#include +#include #include #include @@ -52,7 +53,9 @@ #include #include -IMPLEMENT_STANDARD_HANDLE(HYDROData_Profile, HYDROData_Object) +//#define _DEVDEBUG_ +#include "HYDRO_trace.hxx" + IMPLEMENT_STANDARD_RTTIEXT(HYDROData_Profile, HYDROData_Object) HYDROData_Profile::HYDROData_Profile() @@ -71,14 +74,14 @@ QStringList HYDROData_Profile::DumpToPython( const QString& thePyScriptPat QString aProfileName = GetObjPyName(); //TCollection_AsciiString aFilePath = GetFilePath(); - //if ( !aFilePath.IsEmpty() ) + //if ( !aFilePath.IsEmpty() ) //{ - // aResList << QString( "%1.ImportFromFile( \"%2\" );" ) + // aResList << QString( "%1.ImportFromFile( \"%2\" )" ) // .arg( aName ).arg( aFilePath.ToCString() ); //} bool anIsValidProfile = IsValid(); - + QStringList aPntsDefinition; QString aPntsListName = HYDROData_Tool::GenerateNameForPython( theTreatedObjects, "profile_points" ); @@ -111,15 +114,15 @@ QStringList HYDROData_Profile::DumpToPython( const QString& thePyScriptPat QString& aFirstStr = aPntsDefinition.first(); aFirstStr = aFirstStr.trimmed(); aFirstStr.prepend( QString( "%1 = [ " ).arg( aPntsListName ) ); - + aPntsDefinition.last().append( " ];" ); aResList << aPntsDefinition; - - aResList << QString( "%1.%3( %2 );" ) + + aResList << QString( "%1.%3( %2 )" ) .arg( aProfileName ).arg( aPntsListName ) .arg( anIsValidProfile ? "SetProfilePoints" : "SetParametricPoints" ); - + aResList << QString( "" ); } @@ -130,13 +133,13 @@ QStringList HYDROData_Profile::DumpToPython( const QString& thePyScriptPat 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; @@ -162,15 +165,17 @@ TopoDS_Shape HYDROData_Profile::GetTopShape() const return aWire; } -TopoDS_Shape HYDROData_Profile::GetShape3D() const +TopoDS_Shape HYDROData_Profile::GetShape3D(bool forceRebuild, bool reverseXCoord) const { + if (forceRebuild) + return CreateProfileWire( true, reverseXCoord ); TopoDS_Shape aShape = HYDROData_Object::GetShape3D(); if( aShape.IsNull() ) - aShape = CreateProfileWire( true ); + aShape = CreateProfileWire( true, reverseXCoord ); return aShape; } -TopoDS_Shape HYDROData_Profile::CreateProfileWire( bool canUseDefaultPoints ) const +TopoDS_Shape HYDROData_Profile::CreateProfileWire( bool canUseDefaultPoints, bool reverseXCoord ) const { TopoDS_Wire aWire; Handle(HYDROData_ProfileUZ) aProfile = GetProfileUZ( false ); @@ -178,7 +183,14 @@ TopoDS_Shape HYDROData_Profile::CreateProfileWire( bool canUseDefaultPoints ) co { ProfilePoints aProfilePoints = GetProfilePoints( false, canUseDefaultPoints ); HYDROData_IPolyline::SectionType aSectionType = aProfile->GetSectionType( 0 ); - + if (reverseXCoord) + { + for ( int i = 1; i <= aProfilePoints.Size() ; i++ ) + { + gp_XYZ& aPoint = aProfilePoints.ChangeValue(i); + aPoint.ChangeCoord(1) = -aPoint.X(); + } + } aWire = HYDROData_PolylineXY::BuildWire( aSectionType, false, aProfilePoints ); } return aWire; @@ -218,14 +230,17 @@ void HYDROData_Profile::SetLeftPoint( const gp_XY& theGPoint, bool IsConvertFrom if ( aLabel.IsNull() ) return; - Handle(HYDROData_Document) aDoc = HYDROData_Document::Document( Label() ); + Handle(HYDROData_Document) aDoc = HYDROData_Document::Document(); gp_XY aLPoint = theGPoint; if( IsConvertFromGlobal ) aDoc->Transform( aLPoint, true ); Handle(TDataStd_RealArray) anArray; if ( !aLabel.FindAttribute( TDataStd_RealArray::GetID(), anArray ) ) + { anArray = TDataStd_RealArray::Set( aLabel, 0, 1 ); + anArray->SetID(TDataStd_RealArray::GetID()); + } anArray->SetValue( 0, aLPoint.X() ); anArray->SetValue( 1, aLPoint.Y() ); @@ -250,7 +265,7 @@ bool HYDROData_Profile::GetLeftPoint( gp_XY& thePoint, bool IsConvertToGlobal, return CanUseDefault; } - Handle(HYDROData_Document) aDoc = HYDROData_Document::Document( myLab ); + Handle(HYDROData_Document) aDoc = HYDROData_Document::Document(); Handle(TDataStd_RealArray) anArray; if ( !aLabel.FindAttribute( TDataStd_RealArray::GetID(), anArray ) ) { @@ -270,14 +285,17 @@ void HYDROData_Profile::SetRightPoint( const gp_XY& theGPoint, bool IsConvertFro { TDF_Label aLabel = myLab.FindChild( DataTag_LastPoint ); - Handle(HYDROData_Document) aDoc = HYDROData_Document::Document( Label() ); + Handle(HYDROData_Document) aDoc = HYDROData_Document::Document(); gp_XY aLPoint = theGPoint; if( IsConvertFromGlobal ) aDoc->Transform( aLPoint, true ); Handle(TDataStd_RealArray) anArray; if ( !aLabel.FindAttribute( TDataStd_RealArray::GetID(), anArray ) ) + { anArray = TDataStd_RealArray::Set( aLabel, 0, 1 ); + anArray->SetID(TDataStd_RealArray::GetID()); + } anArray->SetValue( 0, aLPoint.X() ); anArray->SetValue( 1, aLPoint.Y() ); @@ -301,7 +319,7 @@ bool HYDROData_Profile::GetRightPoint( gp_XY& thePoint, bool IsConvertToGlobal, return CanUseDefault; } - Handle(HYDROData_Document) aDoc = HYDROData_Document::Document( myLab ); + Handle(HYDROData_Document) aDoc = HYDROData_Document::Document(); Handle(TDataStd_RealArray) anArray; if ( !aLabel.FindAttribute( TDataStd_RealArray::GetID(), anArray ) ) { @@ -392,7 +410,7 @@ void HYDROData_Profile::SetProfilePoints( const ProfilePoints& thePoints, bool I gp_XY aFirstPoint, aLastPoint; - Handle(HYDROData_Document) aDoc = HYDROData_Document::Document( Label() ); + Handle(HYDROData_Document) aDoc = HYDROData_Document::Document(); Handle(HYDROData_ProfileUZ) aProfileUZ = GetProfileUZ(); for ( int i = 1, n = thePoints.Length(); i <= n ; ++i ) { @@ -408,7 +426,7 @@ void HYDROData_Profile::SetProfilePoints( const ProfilePoints& thePoints, bool I aLastPoint = aPointXY; double aDistance = gp_Pnt2d( aFirstPoint ).Distance( aPointXY ); - + HYDROData_ProfileUZ::Point aParPoint( aDistance, aPoint.Z() ); aProfileUZ->AddPoint( 0, aParPoint ); } @@ -420,19 +438,27 @@ void HYDROData_Profile::SetProfilePoints( const ProfilePoints& thePoints, bool I HYDROData_Profile::ProfilePoints HYDROData_Profile::GetProfilePoints ( bool IsConvertToGlobal, bool CanUseDefaultLeftRight ) const { - ProfilePoints aResPoints; - gp_XY aFirstPoint, aLastPoint; if ( !GetLeftPoint( aFirstPoint, IsConvertToGlobal, CanUseDefaultLeftRight ) || !GetRightPoint( aLastPoint, IsConvertToGlobal, CanUseDefaultLeftRight ) ) - return aResPoints; + return HYDROData_Profile::ProfilePoints(); HYDROData_ProfileUZ::PointsList aParametricPoints = GetParametricPoints(); - if ( aParametricPoints.Length() < 2 ) + + return CalculateProfilePoints(aParametricPoints, aFirstPoint, aLastPoint); +} + +HYDROData_Profile::ProfilePoints HYDROData_Profile::CalculateProfilePoints( + const HYDROData_ProfileUZ::PointsList& theParametricPoints, + const gp_XY& aFirstPoint, const gp_XY& aLastPoint) +{ + ProfilePoints aResPoints; + + if ( theParametricPoints.Length() < 2 ) return aResPoints; - const HYDROData_ProfileUZ::Point& aFirstParPoint = aParametricPoints.First(); - const HYDROData_ProfileUZ::Point& aLastParPoint = aParametricPoints.Last(); + const HYDROData_ProfileUZ::Point& aFirstParPoint = theParametricPoints.First(); + const HYDROData_ProfileUZ::Point& aLastParPoint = theParametricPoints.Last(); double aFullLength = aLastPoint.X() - aFirstPoint.X(); double aParFullLength = aLastParPoint.X() - aFirstParPoint.X(); @@ -441,9 +467,9 @@ HYDROData_Profile::ProfilePoints HYDROData_Profile::GetProfilePoints aResPoints.Append( ProfilePoint( aFirstPoint.X(), aFirstPoint.Y(), aFirstParPoint.Y() ) ); // Compute all other points - for ( int i = 2, n = aParametricPoints.Length(); i < n ; ++i ) + for ( int i = 2, n = theParametricPoints.Length(); i < n ; ++i ) { - const HYDROData_ProfileUZ::Point& aParPoint = aParametricPoints.Value( i ); + const HYDROData_ProfileUZ::Point& aParPoint = theParametricPoints.Value( i ); double aParPointDist = aParPoint.X() - aFirstParPoint.X(); double aRatio = aParPointDist / aParFullLength; @@ -463,7 +489,8 @@ HYDROData_Profile::ProfilePoints HYDROData_Profile::GetProfilePoints void HYDROData_Profile::SetFilePath( const TCollection_AsciiString& theFilePath ) { - TDataStd_AsciiString::Set( myLab.FindChild( DataTag_FilePath ), theFilePath ); + Handle(TDataStd_AsciiString) anAttr = TDataStd_AsciiString::Set( myLab.FindChild( DataTag_FilePath ), theFilePath ); + anAttr->SetID(TDataStd_AsciiString::GetID()); } TCollection_AsciiString HYDROData_Profile::GetFilePath() const @@ -477,9 +504,20 @@ TCollection_AsciiString HYDROData_Profile::GetFilePath() const return aRes; } +void HYDROData_Profile::SetProfileColor( const QColor& theColor ) +{ + SetColor( theColor, DataTag_ProfileColor ); +} + +bool HYDROData_Profile::GetProfileColor(QColor& outColor) const +{ + return GetColor( outColor, DataTag_ProfileColor ); +} + 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; @@ -500,9 +538,9 @@ int HYDROData_Profile::ImportFromFile( const Handle(HYDROData_Document)& theDoc, { if ( aNewProfile.IsNull() ) 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(); @@ -535,10 +573,11 @@ int HYDROData_Profile::ImportFromFile( const Handle(HYDROData_Document)& theDoc, } 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 ); @@ -549,7 +588,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(); @@ -564,10 +603,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; @@ -597,8 +637,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 ); @@ -620,8 +660,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 ) @@ -647,15 +687,15 @@ 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 ); aPointsXYZ.Append( aPoint ); } } - - aRes = aRes && ( anIsParametric && !aPointsUZ.IsEmpty() || + + aRes = aRes && ( anIsParametric && !aPointsUZ.IsEmpty() || anIsGeoref && !aPointsXYZ.IsEmpty() ); if ( aRes ) { @@ -666,6 +706,8 @@ bool HYDROData_Profile::ImportFromFile( OSD_File& theFile, } else if ( anIsGeoref ) { + if( isToProject ) + ProjectProfilePoints( aPointsXYZ ); SetProfilePoints( aPointsXYZ, true ); } @@ -689,7 +731,7 @@ void HYDROData_Profile::UpdateLocalCS( double theDx, double theDy ) SetRightPoint( aPnt, false ); } -HYDROData_Profile::ProfilePoint HYDROData_Profile::GetBottomPoint() const +HYDROData_Profile::ProfilePoint HYDROData_Profile::GetBottomPoint(bool IsConvertToGlobal) const { ProfilePoint aBottom; @@ -736,7 +778,7 @@ HYDROData_Profile::ProfilePoint HYDROData_Profile::GetBottomPoint() const } // Find the corresponding profile point - ProfilePoints aProfilePoints = GetProfilePoints( false ); + ProfilePoints aProfilePoints = GetProfilePoints( IsConvertToGlobal ); if ( aBottomIndex >= 1 && aBottomIndex <= aProfilePoints.Length() ) { aBottom = aProfilePoints.Value( aBottomIndex ); } @@ -747,17 +789,20 @@ HYDROData_Profile::ProfilePoint HYDROData_Profile::GetBottomPoint() const 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_Pnt aMiddlePoint2d( 0.5 * ( aPnt1 + aPnt2 ) ); gp_Lin aMidLin( aMiddlePoint2d, gp::DZ() ); TopoDS_Edge aMidEdge = BRepLib_MakeEdge( aMidLin ); - TopoDS_Iterator anIt( TopoDS::Wire( GetShape3D() ) ); + TopoDS_Shape aProf = TopoDS::Wire( GetShape3D() ); + if (aProf.IsNull()) + return aMiddlePoint; + TopoDS_Iterator anIt( aProf ); for ( ; anIt.More(); anIt.Next()) { const TopoDS_Edge& anEdge = TopoDS::Edge( anIt.Value() ); @@ -780,4 +825,21 @@ HYDROData_Profile::ProfilePoint HYDROData_Profile::GetBottomPoint() const } return aMiddlePoint; - } \ No newline at end of file + } + +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() ); + } +}