X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDRO_tests%2FTestViewer.cxx;h=cc8c7c61d287202e0c7d6c86578c936275f58ff1;hb=3bece499e83cc9ca95536228c7f6740030e9d5d8;hp=3ed66129a2aee16840ece1d89b7fd1790695b981;hpb=e7325b62fba96a5a6cbc89ee0f57d86f7cc8d6df;p=modules%2Fhydro.git diff --git a/src/HYDRO_tests/TestViewer.cxx b/src/HYDRO_tests/TestViewer.cxx index 3ed66129..cc8c7c61 100644 --- a/src/HYDRO_tests/TestViewer.cxx +++ b/src/HYDRO_tests/TestViewer.cxx @@ -30,13 +30,12 @@ #ifdef WIN32 #pragma warning ( disable: 4251 ) #endif -#include +#include #ifdef WIN32 #pragma warning ( disable: 4251 ) #endif -#include #include -#include +#include #include #include #include @@ -44,17 +43,26 @@ #include #include #include +#include + +#include +#include +#include #ifdef WIN32 #pragma warning ( default: 4251 ) #endif #include +#include OCCViewer_ViewManager* TestViewer::myViewManager = 0; -OCCViewer_ViewWindow* TestViewer::myViewWindow = 0; +OCCViewer_ViewFrame* TestViewer::myViewWindow = 0; QString TestViewer::myKey = ""; +extern QString REF_DATA_PATH; +extern QString TMP_DIR; + OCCViewer_ViewManager* TestViewer::viewManager() { if( myViewManager ) @@ -63,13 +71,13 @@ OCCViewer_ViewManager* TestViewer::viewManager() myViewManager = new OCCViewer_ViewManager( 0, 0 ); OCCViewer_Viewer* aViewer = new OCCViewer_Viewer( true ); - aViewer->setTrihedronSize( 100, true ); + aViewer->setTrihedronSize( 0, true ); aViewer->setInteractionStyle( 0 ); aViewer->setZoomingStyle( 1 ); myViewManager->setViewModel( aViewer ); - myViewWindow = dynamic_cast( myViewManager->createViewWindow() ); - + myViewWindow = dynamic_cast( myViewManager->createViewWindow() ); + aViewer->setTrihedronShown( false ); return myViewManager; } @@ -78,15 +86,15 @@ 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(); } QColor TestViewer::GetColor(int i) @@ -94,12 +102,12 @@ QColor TestViewer::GetColor(int i) static QVector aCV; if( aCV.isEmpty() ) { - aCV << QColor(0,0,255) + 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(255,255,20) + << QColor(20,255,255) + << QColor(100,100,20) << QColor(10,100,150); } if (i < aCV.size()) @@ -107,13 +115,30 @@ QColor TestViewer::GetColor(int i) else { QColor TestColor = aCV[i % aCV.size()]; - QColor NewColor((TestColor.red() + i * 41) % 256, - (TestColor.green() + i * 13) % 256, + QColor NewColor((TestColor.red() + i * 41) % 256, + (TestColor.green() + i * 13) % 256, (TestColor.blue() + i * 23) % 256); return NewColor; } } +void TestViewer::eraseAll( bool isUpdate, bool eraseStructures ) +{ + context()->EraseAll( isUpdate ); + if( eraseStructures ) + { + Graphic3d_MapOfStructure GmapS; + viewer()->getViewer3d()->StructureManager()->DisplayedStructures(GmapS); + for (Graphic3d_MapOfStructure::Iterator it(GmapS); it.More(); it.Next()) + { + Handle(Graphic3d_Structure) GS = it.Key(); + GS->Erase(); + } + } + viewer()->setTrihedronShown( false ); + qApp->processEvents(); +} + void TestViewer::show( const Handle(AIS_InteractiveObject)& theObject, int theMode, int theSelectionMode, bool isFitAll, const char* theKey ) { @@ -121,47 +146,58 @@ void TestViewer::show( const Handle(AIS_InteractiveObject)& theObject, if( !aNewKey.isEmpty() ) { myKey = aNewKey; - context()->CloseLocalContext(); - context()->EraseAll( Standard_False ); + eraseAll( false, true ); } - - context()->Display( theObject, theMode, theSelectionMode ); + if( theSelectionMode > 0 ) { - context()->OpenLocalContext(); + context()->Deactivate(); //OpenLocalContext(); + context()->Display( theObject, theMode, theSelectionMode, true ); context()->Activate( theObject, theSelectionMode, Standard_True ); } + else + context()->Display( theObject, theMode, theSelectionMode, true ); if( isFitAll ) - { - viewWindow()->onTopView(); - viewWindow()->onFitAll(); - } + fitAll(); +} + +void TestViewer::fitAll() +{ + viewWindow()->onTopView(); + viewWindow()->onFitAll(); } -void TestViewer::show( const TopoDS_Shape& theShape, int theMode, bool isFitAll, const QColor& theColor ) +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 ); + std::cout <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 ) - { - viewWindow()->onTopView(); - viewWindow()->onFitAll(); - } + fitAll(); } -void TestViewer::show( const TopoDS_Shape& theShape, int theMode, bool isFitAll, const char* theKey ) +void TestViewer::show( const TopoDS_Shape& theShape, int theMode, bool isFitAll, const char* theKey, + int theUIANb, int theVIANb) { QString aNewKey = theKey; if( !aNewKey.isEmpty() ) { - context()->CloseLocalContext(); - context()->EraseAll( Standard_False ); + eraseAll( false ); myKey = aNewKey; } @@ -169,24 +205,41 @@ void TestViewer::show( const TopoDS_Shape& theShape, int theMode, bool isFitAll, return; int i = 0; - if( theShape.ShapeType()==TopAbs_COMPOUND ) - { - TopExp_Explorer anExplorer( theShape, TopAbs_FACE ); - for( ; anExplorer.More(); anExplorer.Next() ) - ShowShape (anExplorer.Current(), theMode, i); - } - else - ShowShape(theShape, theMode, i); - + //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 ) - { - viewWindow()->onTopView(); - viewWindow()->onFitAll(); - } + fitAll(); } -void TestViewer::ShowShape(const TopoDS_Shape& theShape, int theMode, int& i) +/*void TestViewer::ShowShape(const TopoDS_Shape& theShape, int theMode, int& i) { if( theShape.ShapeType()==TopAbs_SHELL ) { @@ -205,7 +258,7 @@ void TestViewer::ShowShape(const TopoDS_Shape& theShape, int theMode, int& i) show( theShape, theMode, false, GetColor(i) ); i++; } -} +}*/ bool AreImagesEqual( const QImage& theImage1, const QImage& theImage2, double theTolerance ) { @@ -229,14 +282,53 @@ bool AreImagesEqual( const QImage& theImage1, const QImage& theImage2, double th return true; } -bool TestViewer::AssertImages( QString& theMessage ) +QImage TestViewer::diff( const QImage& theExpectedRefImage, const QImage& theActualImage ) +{ + const QImage::Format aFormat = QImage::Format_RGB32; + + QImage anExpectedRefImage = theExpectedRefImage.convertToFormat( aFormat ); + QImage anActualImage = theActualImage.convertToFormat( aFormat ); + + QImage aDiff( anExpectedRefImage.width(), anExpectedRefImage.height(), aFormat ); + QPainter aPainter( &aDiff ); + aPainter.drawImage( 0, 0, anExpectedRefImage ); + aPainter.setCompositionMode( QPainter::RasterOp_SourceXorDestination ); + aPainter.drawImage( 0, 0, anActualImage ); + return aDiff; +} + +bool TestViewer::AssertImages( QString& theMessage, const QImage* theImage, const char* theCase, bool swapRGB ) { - QImage anActualImage = viewWindow()->dumpView(); + QImage anActualImage; + if( theImage ) + anActualImage = *theImage; + else + anActualImage = viewWindow()->getView(OCCViewer_ViewFrame::MAIN_VIEW)->dumpView(); + + if( swapRGB ) + { + // 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" ); + + if( theCase ) + myKey = theCase; + + QString anExpectedRefFilePath = REF_DATA_PATH; anExpectedRefFilePath += "/" + myKey + ".png"; - QImage anExpectedRefImage; + std::ifstream file(anExpectedRefFilePath.toStdString().c_str()); + if (!file) + { + std::cerr << "Missing reference image " << anExpectedRefFilePath.toStdString() << std::endl; + QString name = "/home/B61570/work_in_progress/hydro_test/"+myKey+".png"; + anActualImage.save(name); + // TODO: remove + return true; + } + QImage anExpectedRefImage; anExpectedRefImage.load( anExpectedRefFilePath ); + //std::cout << "Expected image loading: " << anExpectedRefFilePath.toStdString() << std::endl; if( AreImagesEqual( anActualImage, anExpectedRefImage, 0.001 ) ) { @@ -244,32 +336,38 @@ bool TestViewer::AssertImages( QString& theMessage ) return true; } - QString aPath = QDir::tempPath() + "/" + myKey + ".png"; + QString aPath = TMP_DIR + "/" + myKey + ".png"; anActualImage.save( aPath ); + //std::cout << "Actual image: " << aPath.toStdString() << std::endl; + //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 ); - aPainter.drawImage( 0, 0, anExpectedRefImage ); - aPainter.setCompositionMode( QPainter::RasterOp_SourceXorDestination ); - aPainter.drawImage( 0, 0, anActualImage ); - QString aDiffFilePath = QDir::tempPath() + "/" + myKey + "_diff.png"; + QImage aDiff = diff( anExpectedRefImage, anActualImage ); + + QString aDiffFilePath = TMP_DIR + "/" + myKey + "_diff.png"; aDiff.save( aDiffFilePath ); + //std::cout << "Diff image: " << aDiffFilePath.toStdString() << std::endl; + + QString anExpected = TMP_DIR + "/" + myKey + "_1.png"; + //std::cout << "Expected image: " << anExpected.toStdString() << std::endl; + anExpectedRefImage.save( anExpected ); return false; } -Handle_Aspect_ColorScale TestViewer::showColorScale( bool isShow ) +Handle(AIS_ColorScale) TestViewer::colorScale() { - Handle(V3d_View) aView = myViewWindow->getViewPort()->getView(); - if( aView.IsNull() ) - return Handle(Aspect_ColorScale)(); + static Handle(AIS_ColorScale) aColorScale = new AIS_ColorScale(); + + return aColorScale; +} - Handle(Aspect_ColorScale) aColorScale = aView->ColorScale(); +void TestViewer::showColorScale( bool isShow ) +{ + Handle(AIS_ColorScale) aColorScale = colorScale(); if( aColorScale.IsNull() ) - return aColorScale; + return; Standard_Real anXPos = 0.05; Standard_Real anYPos = 0.1; @@ -288,56 +386,99 @@ Handle_Aspect_ColorScale TestViewer::showColorScale( bool isShow ) aColorScale->SetTitle( "test" ); aColorScale->SetRange( 0, 1 ); + aColorScale->SetToUpdate(); + if( isShow ) { - if( !aView->ColorScaleIsDisplayed() ) - aView->ColorScaleDisplay(); + if( !context()->IsDisplayed( aColorScale ) ) + context()->Display( aColorScale, true ); } else { - if( aView->ColorScaleIsDisplayed() ) - aView->ColorScaleErase(); + if( context()->IsDisplayed( aColorScale ) ) + context()->Erase( aColorScale, true ); } - return 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(); + context()->MoveTo( theViewX, theViewY, aView, true); + context()->Select(true); + // context()->CloseAllContexts(); +} + +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 TestViewer::areScriptsEqual( const QString& theBaseName, + bool isExpectedUtf8, + bool isActualUtf8, + int theLinesToOmit, + QString& theMsg ) { - QString anExpectedRefFilePath = qgetenv( "HYDRO_REFERENCE_DATA" ); + QString anExpectedRefFilePath = REF_DATA_PATH; anExpectedRefFilePath += "/" + theBaseName; - - QString anActualFilePath = QDir::tempPath() + "/" + theBaseName; + + QString anActualFilePath = TMP_DIR + "/" + theBaseName; QFile anExpected( anExpectedRefFilePath ); QFile anActual( anActualFilePath ); - if( !anExpected.open( QFile::ReadOnly | QFile::Text ) || - !anActual.open ( QFile::ReadOnly | QFile::Text ) ) + if( !anExpected.open( QFile::ReadOnly | QFile::Text ) ) + { + theMsg = "Expected file cannot be opened: " + anExpectedRefFilePath; + return false; + } + + if( !anActual.open( QFile::ReadOnly | QFile::Text ) ) + { + theMsg = "Actual file cannot be opened: " + anActualFilePath; return false; + } - const int aLinesToOmit = 20; - for( int i=0; i