X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_Profile.cxx;h=494461f2d15ec65cf4ea33924507ca4dc3dab89c;hb=191c33b8fd827caa9af8886728e9df22ae55451e;hp=9832cadb3a4a47fa95a35795a1d2ec5da90c2af5;hpb=deed826b2d6c39ba2ed410108cdf54d64cded321;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_Profile.cxx b/src/HYDROData/HYDROData_Profile.cxx index 9832cadb..494461f2 100755 --- a/src/HYDROData/HYDROData_Profile.cxx +++ b/src/HYDROData/HYDROData_Profile.cxx @@ -4,9 +4,13 @@ #include "HYDROData_Document.h" #include "HYDROData_Iterator.h" #include "HYDROData_Tool.h" +#include "HYDROData_PolylineXY.h" + +#include #include #include +#include #include #include @@ -21,10 +25,9 @@ #include #include +#include #include -#define PYTHON_PROFILE_ID "KIND_PROFILE" - IMPLEMENT_STANDARD_HANDLE(HYDROData_Profile, HYDROData_Object) IMPLEMENT_STANDARD_RTTIEXT(HYDROData_Profile, HYDROData_Object) @@ -37,12 +40,89 @@ HYDROData_Profile::~HYDROData_Profile() { } +QStringList HYDROData_Profile::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const +{ + QStringList aResList = dumpObjectCreation( theTreatedObjects ); + QString aProfileName = GetObjPyName(); + + //TCollection_AsciiString aFilePath = GetFilePath(); + //if ( !aFilePath.IsEmpty() ) + //{ + // aResList << QString( "%1.ImportFromFile( \"%2\" );" ) + // .arg( aName ).arg( aFilePath.ToCString() ); + //} + + bool anIsValidProfile = IsValid(); + + QStringList aPntsDefinition; + QString aPntsListName = HYDROData_Tool::GenerateNameForPython( theTreatedObjects, "profile_points" ); + + QString aGap = QString().fill( ' ', aPntsListName.length() + 5 ); + if ( anIsValidProfile ) + { + HYDROData_Profile::ProfilePoints aPointsList = GetProfilePoints( true ); + for ( int k = 1, aNbPoints = aPointsList.Size(); k <= aNbPoints; ++k ) + { + const ProfilePoint& aPoint = aPointsList.Value( k ); + aPntsDefinition << QString( aGap + "gp_XYZ( %1, %2, %3 )%4" ) + .arg( aPoint.X() ).arg( aPoint.Y() ).arg( aPoint.Z() ) + .arg( ( k < aNbPoints ? "," : "" ) ); + } + } + else + { + HYDROData_IPolyline::PointsList aPointsList = GetParametricPoints(); + for ( int k = 1, aNbPoints = aPointsList.Size(); k <= aNbPoints; ++k ) + { + const HYDROData_IPolyline::Point& aPoint = aPointsList.Value( k ); + aPntsDefinition << QString( aGap + "gp_XY( %1, %2 )%3" ) + .arg( aPoint.X() ).arg( aPoint.Y() ) + .arg( ( k < aNbPoints ? "," : "" ) ); + } + } + + if ( !aPntsDefinition.isEmpty() ) + { + QString& aFirstStr = aPntsDefinition.first(); + aFirstStr = aFirstStr.trimmed(); + aFirstStr.prepend( QString( "%1 = [ " ).arg( aPntsListName ) ); + + aPntsDefinition.last().append( " ];" ); + + aResList << aPntsDefinition; + + aResList << QString( "%1.%3( %2 );" ) + .arg( aProfileName ).arg( aPntsListName ) + .arg( anIsValidProfile ? "SetProfilePoints" : "SetParametricPoints" ); + + aResList << QString( "" ); + } + + // Set a polyline type if it is not default + Handle(HYDROData_ProfileUZ) aPrf = GetProfileUZ( false ); + if ( !aPrf.IsNull() ) + { + HYDROData_IPolyline::SectionType aSecType = aPrf->GetSectionType( 0 ); + if ( aSecType != HYDROData_IPolyline::SECTION_POLYLINE ) + { + aResList << QString( "%1.GetProfileUZ().SetSectionType( 0, %2 );" ) + .arg( aProfileName ).arg( "HYDROData_IPolyline.SECTION_SPLINE" ); + aResList << QString( "" ); + } + } + + aResList << QString( "%1.Update();" ).arg( aProfileName ); + aResList << QString( "" ); + + return aResList; +} + TopoDS_Shape HYDROData_Profile::GetTopShape() const { TopoDS_Wire aWire; gp_XY aFirstPoint, aLastPoint; - if ( !GetFirstPoint( aFirstPoint ) || !GetLastPoint( aLastPoint ) ) + if ( !GetLeftPoint( aFirstPoint, false ) || !GetRightPoint( aLastPoint, false ) ) return aWire; gp_Pnt aPnt1( aFirstPoint.X(), aFirstPoint.Y(), 0 ); @@ -62,81 +142,80 @@ TopoDS_Shape HYDROData_Profile::GetShape3D() const return getShape3D(); } -void HYDROData_Profile::UpdateShape3D() +void HYDROData_Profile::Update() { - BRepBuilderAPI_MakeWire aMakeWire; + HYDROData_Object::Update(); - ProfilePoints aProfilePoints = GetProfilePoints(); - for ( int i = 1, n = aProfilePoints.Length(); i < n ; ++i ) + TopoDS_Wire aWire; + Handle(HYDROData_ProfileUZ) aProfile = GetProfileUZ( false ); + if ( !aProfile.IsNull() ) { - ProfilePoint aFirstPoint = aProfilePoints.Value( i ); - ProfilePoint aSecPoint = aProfilePoints.Value( i + 1 ); + ProfilePoints aProfilePoints = GetProfilePoints( false ); + HYDROData_IPolyline::SectionType aSectionType = aProfile->GetSectionType( 0 ); - gp_Pnt aPnt1( aFirstPoint.X(), aFirstPoint.Y(), aFirstPoint.Z() ); - gp_Pnt aPnt2( aSecPoint.X(), aSecPoint.Y(), aSecPoint.Z() ); - - BRepBuilderAPI_MakeEdge aMakeEdge( aPnt1, aPnt2 ); - TopoDS_Edge anEdge = aMakeEdge; - - aMakeWire.Add( anEdge ); + aWire = HYDROData_PolylineXY::BuildWire( aSectionType, false, aProfilePoints ); } - - TopoDS_Wire aWire; - if ( aMakeWire.IsDone() ) - aWire = aMakeWire; - SetShape3D( aWire ); } -/** - * Dump object to Python script representation. - */ -QStringList HYDROData_Profile::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const +QColor HYDROData_Profile::DefaultFillingColor() { - QStringList aResList; + return QColor( Qt::transparent ); +} - Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( myLab ); - if ( aDocument.IsNull() ) - return aResList; - - QString aDocName = aDocument->GetDocPyName(); - QString aProfileName = GetName(); +QColor HYDROData_Profile::DefaultBorderColor() +{ + return QColor( Qt::black ); +} - aResList << QString( "%1 = %2.CreateObject( %3 );" ) - .arg( aProfileName ).arg( aDocName ).arg( PYTHON_PROFILE_ID ); - aResList << QString( "%1.SetName( \"%1\" );" ).arg( aProfileName ); +QColor HYDROData_Profile::getDefaultFillingColor() const +{ + return DefaultFillingColor(); +} - return aResList; +QColor HYDROData_Profile::getDefaultBorderColor() const +{ + return DefaultBorderColor(); } bool HYDROData_Profile::IsValid() const { gp_XY aFirstPoint, aLastPoint; - if ( !GetFirstPoint( aFirstPoint ) || !GetLastPoint( aLastPoint ) ) + if ( !GetLeftPoint( aFirstPoint, false ) || !GetRightPoint( aLastPoint, false ) ) return false; int aNbPoints = NbPoints(); return aNbPoints > 1; } -void HYDROData_Profile::SetFirstPoint( const gp_XY& thePoint ) +void HYDROData_Profile::SetLeftPoint( const gp_XY& theGPoint, bool IsConvertFromGlobal ) { TDF_Label aLabel = myLab.FindChild( DataTag_FirstPoint ); + if ( aLabel.IsNull() ) + return; + + Handle(HYDROData_Document) aDoc = HYDROData_Document::Document( Label() ); + 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->SetValue( 0, thePoint.X() ); - anArray->SetValue( 1, thePoint.Y() ); + anArray->SetValue( 0, aLPoint.X() ); + anArray->SetValue( 1, aLPoint.Y() ); + + SetToUpdate( true ); } -bool HYDROData_Profile::GetFirstPoint( gp_XY& thePoint ) const +bool HYDROData_Profile::GetLeftPoint( gp_XY& thePoint, bool IsConvertToGlobal ) const { TDF_Label aLabel = myLab.FindChild( DataTag_FirstPoint, false ); if ( aLabel.IsNull() ) return false; + Handle(HYDROData_Document) aDoc = HYDROData_Document::Document( myLab ); Handle(TDataStd_RealArray) anArray; if ( !aLabel.FindAttribute( TDataStd_RealArray::GetID(), anArray ) ) return false; @@ -144,27 +223,38 @@ bool HYDROData_Profile::GetFirstPoint( gp_XY& thePoint ) const thePoint.SetX( anArray->Value( 0 ) ); thePoint.SetY( anArray->Value( 1 ) ); + if( IsConvertToGlobal ) + aDoc->Transform( thePoint, false ); + return true; } -void HYDROData_Profile::SetLastPoint( const gp_XY& thePoint ) +void HYDROData_Profile::SetRightPoint( const gp_XY& theGPoint, bool IsConvertFromGlobal ) { TDF_Label aLabel = myLab.FindChild( DataTag_LastPoint ); + Handle(HYDROData_Document) aDoc = HYDROData_Document::Document( Label() ); + 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->SetValue( 0, thePoint.X() ); - anArray->SetValue( 1, thePoint.Y() ); + anArray->SetValue( 0, aLPoint.X() ); + anArray->SetValue( 1, aLPoint.Y() ); + + SetToUpdate( true ); } -bool HYDROData_Profile::GetLastPoint( gp_XY& thePoint ) const +bool HYDROData_Profile::GetRightPoint( gp_XY& thePoint, bool IsConvertToGlobal ) const { TDF_Label aLabel = myLab.FindChild( DataTag_LastPoint, false ); if ( aLabel.IsNull() ) return false; + Handle(HYDROData_Document) aDoc = HYDROData_Document::Document( myLab ); Handle(TDataStd_RealArray) anArray; if ( !aLabel.FindAttribute( TDataStd_RealArray::GetID(), anArray ) ) return false; @@ -172,9 +262,25 @@ bool HYDROData_Profile::GetLastPoint( gp_XY& thePoint ) const thePoint.SetX( anArray->Value( 0 ) ); thePoint.SetY( anArray->Value( 1 ) ); + if( IsConvertToGlobal ) + aDoc->Transform( thePoint, false ); + return true; } +void HYDROData_Profile::Invalidate() +{ + TDF_Label aFirstLabel = myLab.FindChild( DataTag_FirstPoint, false ); + if ( !aFirstLabel.IsNull() ) + aFirstLabel.ForgetAllAttributes(); + + TDF_Label aLastLabel = myLab.FindChild( DataTag_LastPoint, false ); + if ( !aLastLabel.IsNull() ) + aLastLabel.ForgetAllAttributes(); + + SetToUpdate( true ); +} + Handle(HYDROData_ProfileUZ) HYDROData_Profile::GetProfileUZ( const bool theIsCreate ) const { Handle(HYDROData_ProfileUZ) aProfileUZ; @@ -203,7 +309,10 @@ void HYDROData_Profile::RemovePoints() { Handle(HYDROData_ProfileUZ) aProfileUZ = GetProfileUZ( false ); if ( !aProfileUZ.IsNull() ) + { aProfileUZ->RemoveSections(); + SetToUpdate( true ); + } } void HYDROData_Profile::SetParametricPoints( const HYDROData_ProfileUZ::PointsList& thePoints ) @@ -216,6 +325,8 @@ void HYDROData_Profile::SetParametricPoints( const HYDROData_ProfileUZ::PointsLi const HYDROData_ProfileUZ::Point& aPoint = thePoints.Value( i ); aProfileUZ->AddPoint( 0, aPoint ); } + + SetToUpdate( true ); } HYDROData_ProfileUZ::PointsList HYDROData_Profile::GetParametricPoints() const @@ -224,7 +335,7 @@ HYDROData_ProfileUZ::PointsList HYDROData_Profile::GetParametricPoints() const return aProfileUZ.IsNull() ? HYDROData_ProfileUZ::PointsList() : aProfileUZ->GetPoints(); } -void HYDROData_Profile::SetProfilePoints( const ProfilePoints& thePoints ) +void HYDROData_Profile::SetProfilePoints( const ProfilePoints& thePoints, bool IsConvertFromGlobal ) { RemovePoints(); if ( thePoints.Length() < 2 ) @@ -232,10 +343,14 @@ void HYDROData_Profile::SetProfilePoints( const ProfilePoints& thePoints ) gp_XY aFirstPoint, aLastPoint; + Handle(HYDROData_Document) aDoc = HYDROData_Document::Document( Label() ); Handle(HYDROData_ProfileUZ) aProfileUZ = GetProfileUZ(); for ( int i = 1, n = thePoints.Length(); i <= n ; ++i ) { - const ProfilePoint& aPoint = thePoints.Value( i ); + ProfilePoint aPoint = thePoints.Value( i ); + if( IsConvertFromGlobal ) + aDoc->Transform( aPoint, true ); + gp_XY aPointXY( aPoint.X(), aPoint.Y() ); if ( i == 1 ) @@ -249,16 +364,17 @@ void HYDROData_Profile::SetProfilePoints( const ProfilePoints& thePoints ) aProfileUZ->AddPoint( 0, aParPoint ); } - SetFirstPoint( aFirstPoint ); - SetLastPoint( aLastPoint ); + SetLeftPoint( aFirstPoint, false );//already converted to local CS + SetRightPoint( aLastPoint, false ); } -HYDROData_Profile::ProfilePoints HYDROData_Profile::GetProfilePoints() const +HYDROData_Profile::ProfilePoints HYDROData_Profile::GetProfilePoints( bool IsConvertToGlobal ) const { ProfilePoints aResPoints; gp_XY aFirstPoint, aLastPoint; - if ( !GetFirstPoint( aFirstPoint ) || !GetLastPoint( aLastPoint ) ) + if ( !GetLeftPoint( aFirstPoint, IsConvertToGlobal ) || + !GetRightPoint( aLastPoint, IsConvertToGlobal ) ) return aResPoints; HYDROData_ProfileUZ::PointsList aParametricPoints = GetParametricPoints(); @@ -314,58 +430,69 @@ TCollection_AsciiString HYDROData_Profile::GetFilePath() const return aRes; } -bool HYDROData_Profile::ImportFromFile( const Handle(HYDROData_Document)& theDoc, - const TCollection_AsciiString& theFileName ) +int HYDROData_Profile::ImportFromFile( const Handle(HYDROData_Document)& theDoc, + const TCollection_AsciiString& theFileName, + NCollection_Sequence& theBadProfilesIds ) { if ( theDoc.IsNull() || theFileName.IsEmpty() ) - return false; + return 0; OSD_File aFile( theFileName ); if ( !aFile.IsReadable() ) - return false; + return 0; aFile.Open( OSD_ReadOnly, OSD_Protection() ); if ( !aFile.IsOpen() ) - return false; - - bool aRes = true; + return 0; NCollection_Sequence aCreatedProfiles; - while ( aRes && !aFile.IsAtEnd() ) + int aProfileId = 1; + Handle(HYDROData_Profile) aNewProfile; + for ( ; !aFile.IsAtEnd(); ++aProfileId ) { - Handle(HYDROData_Profile) aNewProfile = - Handle(HYDROData_Profile)::DownCast( theDoc->CreateObject( KIND_PROFILE ) ); + if ( aNewProfile.IsNull() ) + aNewProfile = Handle(HYDROData_Profile)::DownCast( theDoc->CreateObject( KIND_PROFILE ) ); - aRes = aNewProfile->ImportFromFile( aFile ); - - aCreatedProfiles.Append( aNewProfile ); + bool anIsRead = false; + if ( aNewProfile->ImportFromFile( aFile, &anIsRead ) ) + { + aCreatedProfiles.Append( aNewProfile ); + aNewProfile.Nullify(); + } + else if ( anIsRead ) + { + theBadProfilesIds.Append( aProfileId ); + } } + if ( !aNewProfile.IsNull() ) + aNewProfile->Remove(); + // Close the file aFile.Close(); - for ( int i = 1, n = aCreatedProfiles.Length(); i < n ; ++i ) + for ( int i = 1, n = aCreatedProfiles.Length(); i <= n ; ++i ) { Handle(HYDROData_Profile) aProfile = aCreatedProfiles.Value( i ); - if ( aRes ) - { - QString aProfileName = HYDROData_Tool::GenerateObjectName( theDoc, "Profile" ); - aProfile->SetName( aProfileName ); - aProfile->SetFilePath( theFileName ); - } - else - { - aProfile->Remove(); - } + QString aProfileName = HYDROData_Tool::GenerateObjectName( theDoc, "Profile" ); + aProfile->SetName( aProfileName ); + + aProfile->SetFilePath( theFileName ); + + aProfile->SetBorderColor( HYDROData_Profile::DefaultBorderColor() ); } - return aRes; + return aCreatedProfiles.Length(); } -bool HYDROData_Profile::ImportFromFile( const TCollection_AsciiString& theFileName ) +bool HYDROData_Profile::ImportFromFile( const TCollection_AsciiString& theFileName, + bool* theIsRead ) { + if ( theIsRead ) + *theIsRead = false; + // Try to open the file OSD_File aFile( theFileName ); if ( !aFile.IsReadable() ) @@ -375,7 +502,7 @@ bool HYDROData_Profile::ImportFromFile( const TCollection_AsciiString& theFileNa if ( !aFile.IsOpen() ) return false; - bool aRes = ImportFromFile( aFile ); + bool aRes = ImportFromFile( aFile, theIsRead ); // Close the file aFile.Close(); @@ -389,8 +516,12 @@ bool HYDROData_Profile::ImportFromFile( const TCollection_AsciiString& theFileNa return aRes; } -bool HYDROData_Profile::ImportFromFile( OSD_File& theFile ) +bool HYDROData_Profile::ImportFromFile( OSD_File& theFile, + bool* theIsRead ) { + if ( theIsRead ) + *theIsRead = false; + if ( !theFile.IsOpen() ) return false; @@ -411,7 +542,16 @@ bool HYDROData_Profile::ImportFromFile( OSD_File& theFile ) aLine.LeftAdjust(); aLine.RightAdjust(); if ( aLine.IsEmpty() ) - continue; + { + if ( !anIsParametric && !anIsGeoref ) + continue; // Definition is not started yet + + break; // Next profile started + } + + // Set flag of read status to true + if ( theIsRead ) + *theIsRead = true; TCollection_AsciiString aValX = aLine.Token( " \t", 1 ); TCollection_AsciiString aValY = aLine.Token( " \t", 2 ); @@ -433,6 +573,10 @@ 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 ) ) + aRes = false; + if ( anIsParametric ) { if ( aCoordX < aPrevVal ) @@ -456,6 +600,8 @@ bool HYDROData_Profile::ImportFromFile( OSD_File& theFile ) } double aCoordZ = aValZ.RealValue(); + if ( boost::math::isnan( aCoordZ ) || boost::math::isinf( aCoordZ ) ) + aRes = false; ProfilePoint aPoint( aCoordX, aCoordY, aCoordZ ); aPointsXYZ.Append( aPoint ); @@ -473,12 +619,27 @@ bool HYDROData_Profile::ImportFromFile( OSD_File& theFile ) } else if ( anIsGeoref ) { - SetProfilePoints( aPointsXYZ ); + SetProfilePoints( aPointsXYZ, true ); } + + Update(); } return aRes; } +void HYDROData_Profile::UpdateLocalCS( double theDx, double theDy ) +{ + gp_XY aDelta( theDx, theDy ); + gp_XY aPnt; + + GetLeftPoint( aPnt, false ); + aPnt += aDelta; + SetLeftPoint( aPnt, false ); + + GetRightPoint( aPnt, false ); + aPnt += aDelta; + SetRightPoint( aPnt, false ); +}