X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDRO_tests%2FTestViewer.cxx;h=ba0b7b5d059b76a37bb623a5179be8096df2aa77;hb=ac056ee3c8e228f5b79eca9bad0fec624c595b1b;hp=7f891922ce71ed235ff56c2de38143bdea297d17;hpb=bfed092c471d53b817057f691a8f0f555530e21f;p=modules%2Fhydro.git diff --git a/src/HYDRO_tests/TestViewer.cxx b/src/HYDRO_tests/TestViewer.cxx index 7f891922..ba0b7b5d 100644 --- a/src/HYDRO_tests/TestViewer.cxx +++ b/src/HYDRO_tests/TestViewer.cxx @@ -1,17 +1,63 @@ +// Copyright (C) 2014-2015 EDF-R&D +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// #include +#include #include +#ifdef WIN32 + #pragma warning ( disable: 4251 ) +#endif +#include +#ifdef WIN32 + #pragma warning ( disable: 4251 ) +#endif #include -#include -#include +#ifdef WIN32 + #pragma warning ( disable: 4251 ) +#endif +#include +#ifdef WIN32 + #pragma warning ( disable: 4251 ) +#endif #include +#include +#include #include #include #include +#include +#include +#include +#include + +#include +#include +#include + +#ifdef WIN32 + #pragma warning ( default: 4251 ) +#endif + #include OCCViewer_ViewManager* TestViewer::myViewManager = 0; -OCCViewer_ViewWindow* TestViewer::myViewWindow = 0; +OCCViewer_ViewFrame* TestViewer::myViewWindow = 0; +QString TestViewer::myKey = ""; OCCViewer_ViewManager* TestViewer::viewManager() { @@ -26,7 +72,7 @@ OCCViewer_ViewManager* TestViewer::viewManager() aViewer->setZoomingStyle( 1 ); myViewManager->setViewModel( aViewer ); - myViewWindow = dynamic_cast( myViewManager->createViewWindow() ); + myViewWindow = dynamic_cast( myViewManager->createViewWindow() ); return myViewManager; } @@ -36,54 +82,167 @@ OCCViewer_Viewer* TestViewer::viewer() return dynamic_cast( viewManager()->getViewModel() ); } -OCCViewer_ViewWindow* TestViewer::viewWindow() +OCCViewer_ViewFrame* TestViewer::viewWindow() { viewManager(); //to create the view if it was not created earlier return myViewWindow; } -Handle(AIS_InteractiveContext) context() +Handle(AIS_InteractiveContext) TestViewer::context() { - return TestViewer::viewer()->getAISContext(); + return viewer()->getAISContext(); } -void TestViewer::show( const TopoDS_Shape& theShape, const QColor& theColor, int theMode ) +QColor TestViewer::GetColor(int i) { - QColor aColor = theColor; - if( !aColor.isValid() ) + static QVector aCV; + if( aCV.isEmpty() ) { - // random color - int aHue = rand()%255; - aColor = QColor::fromHsl( aHue, 255, 128 ); + aCV << QColor(0,0,255) + << QColor(0,255,0) + << QColor(255,0,0) + << QColor(255,255,20) + << QColor(20,255,255) + << QColor(100,100,20) + << QColor(10,100,150); } + if (i < aCV.size()) + return aCV[i]; + else + { + QColor TestColor = aCV[i % aCV.size()]; + QColor NewColor((TestColor.red() + i * 41) % 256, + (TestColor.green() + i * 13) % 256, + (TestColor.blue() + i * 23) % 256); + return NewColor; + } +} - double r = aColor.red() / 255.0; - double g = aColor.green() / 255.0; - double b = aColor.blue() / 255.0; - - Handle(AIS_Shape) aShape = new AIS_Shape( theShape ); - aShape->SetMaterial( Graphic3d_NOM_PLASTIC ); - aShape->SetColor( Quantity_Color( r, g, b, Quantity_TOC_RGB ) ); - context()->Display( aShape, theMode, 0, Standard_False ); +void TestViewer::eraseAll( bool isUpdate ) +{ + context()->CloseLocalContext( -1, Standard_False ); + context()->EraseAll( isUpdate ); } -void TestViewer::show( const TopoDS_Shape& theShape, int theMode, bool isFitAll ) +void TestViewer::show( const Handle(AIS_InteractiveObject)& theObject, + int theMode, int theSelectionMode, bool isFitAll, const char* theKey ) { - context()->EraseAll(); + QString aNewKey = theKey; + if( !aNewKey.isEmpty() ) + { + myKey = aNewKey; + eraseAll( false ); + } - if( theShape.ShapeType()==TopAbs_COMPOUND ) + if( theSelectionMode > 0 ) { - TopoDS_Iterator anIt( theShape ); - for( ; anIt.More(); anIt.Next() ) - show( anIt.Value(), QColor(), theMode ); + context()->OpenLocalContext(); + context()->Display( theObject, theMode, theSelectionMode ); + context()->Activate( theObject, theSelectionMode, Standard_True ); } else - show( theShape, QColor(), theMode ); + context()->Display( theObject, theMode, theSelectionMode ); + if( isFitAll ) + fitAll(); +} + +void TestViewer::fitAll() +{ viewWindow()->onTopView(); viewWindow()->onFitAll(); } +void TestViewer::show( const TopoDS_Shape& theShape, int theMode, bool isFitAll, const QColor& theColor, + int theUIANb, int theVIANb) +{ + Handle(AIS_Shape) aShape = new AIS_Shape( theShape ); + if( theShape.ShapeType()==TopAbs_VERTEX ) + aShape->Attributes()->PointAspect()->SetTypeOfMarker( Aspect_TOM_X ); + if (theShape.ShapeType()==TopAbs_FACE) + { + context()->DefaultDrawer()->UIsoAspect()->SetNumber(theUIANb); + context()->DefaultDrawer()->VIsoAspect()->SetNumber(theVIANb); + Handle_Prs3d_Drawer aDrawer = aShape->Attributes(); + aDrawer->UIsoAspect()->SetNumber(theUIANb); + aDrawer->VIsoAspect()->SetNumber(theVIANb); + } + aShape->SetMaterial( Graphic3d_NOM_PLASTIC ); + aShape->SetColor( HYDROData_Tool::toOccColor( theColor ) ); + context()->Display( aShape, theMode, 0, Standard_False ); + + if( isFitAll ) + fitAll(); +} +void TestViewer::show( const TopoDS_Shape& theShape, int theMode, bool isFitAll, const char* theKey, + int theUIANb, int theVIANb) +{ + QString aNewKey = theKey; + if( !aNewKey.isEmpty() ) + { + eraseAll( false ); + myKey = aNewKey; + } + + if( theShape.IsNull() ) + return; + + int i = 0; + //show all faces first + TopTools_ListOfShape aListOfFaces; + TopExp_Explorer aFE( theShape, TopAbs_FACE ); + for( ; aFE.More(); aFE.Next() ) + aListOfFaces.Append(aFE.Current()); + GEOMUtils::SortShapes(aListOfFaces); + TopTools_ListIteratorOfListOfShape aLF(aListOfFaces); + for( ; aLF.More(); aLF.Next(), i++) + show( aLF.Value(), theMode, false, GetColor(i), theUIANb, theVIANb ); + + //show all independent wires + TopTools_ListOfShape aListOfWires; + TopExp_Explorer aWE( theShape, TopAbs_WIRE, TopAbs_FACE ); + for( ; aWE.More(); aWE.Next() ) + aListOfWires.Append(aWE.Current()); + GEOMUtils::SortShapes(aListOfWires); + TopTools_ListIteratorOfListOfShape aLW(aListOfWires); + for( ; aLW.More(); aLW.Next(), i++) + show( aLW.Value(), theMode, false, GetColor(i) ); + + //show all independent edges + TopTools_ListOfShape aListOfEdges; + TopExp_Explorer anEE( theShape, TopAbs_EDGE, TopAbs_WIRE ); + for( ; anEE.More(); anEE.Next()) + aListOfEdges.Append(anEE.Current()); + GEOMUtils::SortShapes(aListOfEdges); + TopTools_ListIteratorOfListOfShape aLE(aListOfEdges); + for( ; aLE.More(); aLE.Next(), i++) + show( aLE.Value(), theMode, false, GetColor(i) ); + + if( isFitAll ) + fitAll(); +} + +/*void TestViewer::ShowShape(const TopoDS_Shape& theShape, int theMode, int& i) +{ + if( theShape.ShapeType()==TopAbs_SHELL ) + { + TopoDS_Iterator anIt( theShape ); + for( ; anIt.More(); anIt.Next()) + { + show( anIt.Value(), theMode, false, GetColor(i) ); + i++; + } + } + else if (theShape.ShapeType()==TopAbs_FACE || + theShape.ShapeType()==TopAbs_WIRE || + theShape.ShapeType()==TopAbs_EDGE || + theShape.ShapeType()==TopAbs_VERTEX ) + { + show( theShape, theMode, false, GetColor(i) ); + i++; + } +}*/ + bool AreImagesEqual( const QImage& theImage1, const QImage& theImage2, double theTolerance ) { if( theImage1.isNull() || theImage2.isNull() ) @@ -106,21 +265,40 @@ bool AreImagesEqual( const QImage& theImage1, const QImage& theImage2, double th return true; } -bool TestViewer::AssertEqual( const QString& theUseCaseName ) +bool TestViewer::AssertImages( QString& theMessage, const QImage* theImage, const char* theCase ) { - QImage anActualImage = viewWindow()->dumpView(); + QImage anActualImage; + if( theImage ) + anActualImage = *theImage; + else + anActualImage = viewWindow()->getView(OCCViewer_ViewFrame::MAIN_VIEW)->dumpView(); + + const bool SWAP_RGB_ORDER = true; + if( SWAP_RGB_ORDER ) + { + // A temporary patch for bug in SALOME/OCC dump; the result image contains swapped RGB colors + anActualImage = anActualImage.rgbSwapped(); + } + - QString anExpectedRefFilePath = qgetenv( "HYDRO_REFERENCE_DATA" ); - anExpectedRefFilePath += "/" + theUseCaseName + ".png"; + if( theCase ) + myKey = theCase; + + QString anExpectedRefFilePath = qgetenv( "HYDRO_ROOT_DIR" ) + "/bin/salome/test/HYDRO"; + anExpectedRefFilePath += "/" + myKey + ".png"; QImage anExpectedRefImage; anExpectedRefImage.load( anExpectedRefFilePath ); - if( AreImagesEqual( anActualImage, anExpectedRefImage, 0.2 ) ) + if( AreImagesEqual( anActualImage, anExpectedRefImage, 0.001 ) ) + { + theMessage = ""; return true; + } - QString aPath = QDir::tempPath() + "/" + theUseCaseName + ".png"; + QString aPath = QDir::tempPath() + "/" + myKey + ".png"; anActualImage.save( aPath ); - std::string aMessage = "The viewer contents does not correspond to the reference image: " + theUseCaseName.toStdString(); + //std::cout << anActualImage.width() << "x" << anActualImage.height() << std::endl; + theMessage = "The viewer contents does not correspond to the reference image: " + myKey; QImage aDiff( anExpectedRefImage.width(), anExpectedRefImage.height(), QImage::Format_ARGB32 ); QPainter aPainter( &aDiff ); @@ -128,9 +306,123 @@ bool TestViewer::AssertEqual( const QString& theUseCaseName ) aPainter.setCompositionMode( QPainter::RasterOp_SourceXorDestination ); aPainter.drawImage( 0, 0, anActualImage ); - QString aDiffFilePath = QDir::tempPath() + "/" + theUseCaseName + "_diff.png"; + QString aDiffFilePath = QDir::tempPath() + "/" + myKey + "_diff.png"; aDiff.save( aDiffFilePath ); - CPPUNIT_FAIL( aMessage.c_str() ); + + anExpectedRefImage.save( QDir::tempPath() + "/" + myKey + "_1.png"); return false; } + +Handle(AIS_ColorScale) TestViewer::colorScale() +{ + static Handle(AIS_ColorScale) aColorScale = new AIS_ColorScale(); + + return aColorScale; +} + +void TestViewer::showColorScale( bool isShow ) +{ + Handle(AIS_ColorScale) aColorScale = colorScale(); + if( aColorScale.IsNull() ) + return; + + Standard_Real anXPos = 0.05; + Standard_Real anYPos = 0.1; + Standard_Real aWidth = 0.2; + Standard_Real aHeight = 0.5; + Standard_Integer aTextHeight = 14; + Standard_Integer aNbIntervals = 30; + + aColorScale->SetXPosition( anXPos ); + aColorScale->SetYPosition( anYPos ); + aColorScale->SetWidth( aWidth ); + aColorScale->SetHeight( aHeight ); + aColorScale->SetTextHeight( aTextHeight ); + aColorScale->SetNumberOfIntervals( aNbIntervals ); + + aColorScale->SetTitle( "test" ); + aColorScale->SetRange( 0, 1 ); + + aColorScale->SetToUpdate(); + + if( isShow ) + { + if( !context()->IsDisplayed( aColorScale ) ) + context()->Display( aColorScale ); + } + else + { + if( context()->IsDisplayed( aColorScale ) ) + context()->Erase( aColorScale ); + } +} + +bool TestViewer::ColorScaleIsDisplayed() +{ + return context()->IsDisplayed( colorScale() ); +} + +void TestViewer::select( int theViewX, int theViewY ) +{ + Handle(V3d_View) aView = myViewWindow->getViewPort()->getView(); + context()->MoveTo( theViewX, theViewY, aView ); + context()->Select(); +} + +QString GetLine( QFile& theFile, bool isUtf8 ) +{ + QByteArray aLineData = theFile.readLine(); + QString aLine; + if( isUtf8 ) + aLine = QString::fromUtf8( aLineData ); + else + aLine = aLineData; + return aLine; +} + +bool TestViewer::areScriptsEqual( const QString& theBaseName, + bool isExpectedUtf8, + bool isActualUtf8, + int theLinesToOmit, + QString& theMsg ) +{ + QString anExpectedRefFilePath = qgetenv( "HYDRO_ROOT_DIR" ) + "/bin/salome/test/HYDRO"; + anExpectedRefFilePath += "/" + theBaseName; + + QString anActualFilePath = QDir::tempPath() + "/" + theBaseName; + + QFile anExpected( anExpectedRefFilePath ); + QFile anActual( anActualFilePath ); + if( !anExpected.open( QFile::ReadOnly | QFile::Text ) || + !anActual.open ( QFile::ReadOnly | QFile::Text ) ) + return false; + + for( int i=0; i