X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_Shape.cxx;h=eb05a9b4dd816d214b3f9fb818d9e4a49b1d7e32;hb=81c9f5cdf82909d0aebd2c491c50fa7516cc80b7;hp=b9b656c565561c4eea7f053fe9b8cf4e33309f0f;hpb=98e31f4b1094b875c49a8702548d8abeb7bef812;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_Shape.cxx b/src/HYDROGUI/HYDROGUI_Shape.cxx index b9b656c5..eb05a9b4 100644 --- a/src/HYDROGUI/HYDROGUI_Shape.cxx +++ b/src/HYDROGUI/HYDROGUI_Shape.cxx @@ -28,6 +28,8 @@ #include #include +#include + #include #include #include @@ -39,6 +41,7 @@ #include #include +#include #include #include #include @@ -46,6 +49,7 @@ #include #include #include +#include #include #include @@ -69,9 +73,11 @@ #include HYDROGUI_Shape::HYDROGUI_Shape( const Handle(AIS_InteractiveContext)& theContext, - const Handle(HYDROData_Entity)& theObject ) + const Handle(HYDROData_Entity)& theObject, + const int theZLayer ) : myContext( theContext ), myObject( theObject ), + myZLayer( theZLayer ), myIsHighlight( false ), myFillingColor( Qt::transparent ), myBorderColor( Qt::black ), @@ -97,7 +103,7 @@ void HYDROGUI_Shape::display( const bool theIsUpdateViewer ) if ( myContext.IsNull() || myShape.IsNull() || !isVisible() ) return; - myContext->Display( myShape, theIsUpdateViewer ); + displayShape( theIsUpdateViewer ); } void HYDROGUI_Shape::erase( const bool theIsUpdateViewer ) @@ -115,6 +121,7 @@ void HYDROGUI_Shape::update( const bool theIsUpdateViewer ) if ( myContext.IsNull() ) return; + bool isDeactivateSelection = false; // Try to retrieve information from object if ( !myObject.IsNull() ) { @@ -158,12 +165,17 @@ void HYDROGUI_Shape::update( const bool theIsUpdateViewer ) setWire( aPolylineWire, false, false ); } else { myTopoShape = aPolylineShape; - myDisplayMode = AIS_WireFrame; + // Set shading mode to avoid that hilight presentation is equal to "normal" object presentation. + // Note that hilight presentation is always to be on top ( i.e. in the top Z layer ). + myDisplayMode = AIS_Shaded; buildShape(); updateShape( false, false ); } } + + QColor aWireColor = aPolyline->GetWireColor(); + setBorderColor( aWireColor, false, false ); } else if ( myObject->IsKind( STANDARD_TYPE(HYDROData_Polyline3D) ) ) { @@ -178,12 +190,17 @@ void HYDROGUI_Shape::update( const bool theIsUpdateViewer ) setWire( aPolylineWire, false, false ); } else { myTopoShape = aPolylineShape; - myDisplayMode = AIS_WireFrame; + // Set shading mode to avoid that hilight presentation is equal to "normal" object presentation. + // Note that hilight presentation is always to be on top ( i.e. in the top Z layer ). + myDisplayMode = AIS_Shaded; buildShape(); updateShape( false, false ); } } + + QColor aWireColor = aPolyline->GetBorderColor(); + setBorderColor( aWireColor, false, false ); } else if ( myObject->IsKind( STANDARD_TYPE(HYDROData_Zone) ) ) { @@ -238,26 +255,38 @@ void HYDROGUI_Shape::update( const bool theIsUpdateViewer ) int aWidth = anImage.width(); int aHeight = anImage.height(); + QString anImageError = ""; + QTransform anInversion = QTransform::fromScale( -1, -1 ); anImage = anImage.transformed( anInversion * aTrsf, Qt::SmoothTransformation ); - // Workaround: Scale the texture image to the nearest width multiple 4 due to the CASCADE bug 23813 - int aTrsfWidth = anImage.width(); - int aDelta = aTrsfWidth % 4; - if ( aDelta > 0 ) + if ( anImage.isNull() ) + anImageError = QObject::tr( "IMAGE_TRANSFORMATION_CAN_NOT_BE_APPLYED" ); + else { - aTrsfWidth += ( 4 - aDelta ); - } - anImage = anImage.scaledToWidth( aTrsfWidth ); + // Workaround: Scale the texture image to the nearest width multiple 4 due to the CASCADE bug 23813 + int aTrsfWidth = anImage.width(); + int aDelta = aTrsfWidth % 4; + if ( aDelta > 0 ) + { + aTrsfWidth += ( 4 - aDelta ); + } + anImage = anImage.scaledToWidth( aTrsfWidth ); + + // temporary optimization, to reduce the saved image size (and the texture quality) + QImage anImageToSave = anImage; //RKV:reduceTexture( anImage, 500 ); - // temporary optimization, to reduce the saved image size (and the texture quality) - QImage anImageToSave = anImage; //RKV:reduceTexture( anImage, 500 ); + bool isSaved = anImageToSave.save( aTextureFileName ); + if ( !isSaved ) + anImageError = QObject::tr( "FILE_CAN_NOT_BE_CREATED" ).arg( aTextureFileName ); + else + QFile::setPermissions( aTextureFileName, (QFile::Permissions)0x4FFFF ); + } - bool isSaved = anImageToSave.save( aTextureFileName ); - if ( !isSaved ) { - QString aTitle = QObject::tr( "FILE_ERROR" ); - QString aMessage = QObject::tr( "FILE_CAN_NOT_BE_CREATED" ).arg( aTextureFileName ); - SUIT_MessageBox::warning( 0, aTitle, aMessage ); + if ( !anImageError.isEmpty() ) + { + SUIT_MessageBox::warning( 0, QObject::tr( "SHAPE_IMAGE_ERROR" ), + QObject::tr( "IMAGE_CAN_NOT_BE_CREATED" ) + anImageError ); } QPointF aPoint1( 0, 0 ); // 1: top left @@ -278,6 +307,12 @@ void HYDROGUI_Shape::update( const bool theIsUpdateViewer ) gp_Pnt aPnt3( aRect.bottomRight().x(), aRect.bottomRight().y(), 0 ); gp_Pnt aPnt4( aRect.bottomLeft().x(), aRect.bottomLeft().y(), 0 ); + Handle_HYDROData_Document aDoc = HYDROData_Document::Document( anImageObj->Label() ); + aDoc->Transform( aPnt1, true ); + aDoc->Transform( aPnt2, true ); + aDoc->Transform( aPnt3, true ); + aDoc->Transform( aPnt4, true ); + TopoDS_Edge anEdge1 = BRepBuilderAPI_MakeEdge( aPnt1, aPnt2 ).Edge(); TopoDS_Edge anEdge2 = BRepBuilderAPI_MakeEdge( aPnt2, aPnt3 ).Edge(); TopoDS_Edge anEdge3 = BRepBuilderAPI_MakeEdge( aPnt3, aPnt4 ).Edge(); @@ -288,26 +323,7 @@ void HYDROGUI_Shape::update( const bool theIsUpdateViewer ) setTextureFileName( aTextureFileName, false, false ); setFace( aWire, false, false ); - } - else if ( myObject->IsKind( STANDARD_TYPE(HYDROData_Obstacle) ) ) - { - Handle(HYDROData_Obstacle) anObstacle = - Handle(HYDROData_Obstacle)::DownCast( myObject ); - - //TODO BEGIN of the block of code to be reimplemented - //TODO GetTopShape() to be used in future - myTopoShape = anObstacle->GetShape3D(); - myDisplayMode = AIS_Shaded; - - QColor aFillingColor = anObstacle->GetFillingColor(); - QColor aBorderColor = anObstacle->GetBorderColor(); - - setFillingColor( aFillingColor, false, false ); - setBorderColor( aBorderColor, false, false ); - - buildShape(); - updateShape( false, false ); - //TODO END of the block of code to be reimplemented + isDeactivateSelection = true; } else if ( myObject->IsKind( STANDARD_TYPE(HYDROData_Profile) ) ) { @@ -326,63 +342,92 @@ void HYDROGUI_Shape::update( const bool theIsUpdateViewer ) } setWire( aProfileWire, false, false ); + + QColor aWireColor = aProfile->GetBorderColor(); + setBorderColor( aWireColor, false, false ); } - else if ( myObject->IsKind( STANDARD_TYPE(HYDROData_Stream) ) ) + else if ( myObject->IsKind( STANDARD_TYPE(HYDROData_Stream) ) || + myObject->IsKind( STANDARD_TYPE(HYDROData_Channel) ) || + myObject->IsKind( STANDARD_TYPE(HYDROData_Obstacle) ) ) { - Handle(HYDROData_Stream) aStream = - Handle(HYDROData_Stream)::DownCast( myObject ); + Handle(HYDROData_Object) aGeomObject = + Handle(HYDROData_Object)::DownCast( myObject ); - TopoDS_Shell aStreamShape = TopoDS::Shell( aStream->GetTopShape() ); + TopoDS_Shape anObjShape = aGeomObject->GetTopShape(); - setShape( aStreamShape, false, false ); + setShape( anObjShape, false, false ); - QColor aFillingColor = aStream->GetFillingColor(); - QColor aBorderColor = aStream->GetBorderColor(); + QColor aFillingColor = aGeomObject->GetFillingColor(); + QColor aBorderColor = aGeomObject->GetBorderColor(); setFillingColor( aFillingColor, false, false ); setBorderColor( aBorderColor, false, false ); } - else if ( myObject->IsKind( STANDARD_TYPE(HYDROData_Channel) ) ) + else if ( myObject->IsKind( STANDARD_TYPE(HYDROData_DummyObject3D) ) ) { - Handle(HYDROData_Channel) aChannel = - Handle(HYDROData_Channel)::DownCast( myObject ); + Handle(HYDROData_DummyObject3D) anObject3D = + Handle(HYDROData_DummyObject3D)::DownCast( myObject ); + TopoDS_Shape aShape3D = anObject3D->GetShape(); - TopoDS_Face aChannelShape = TopoDS::Face( aChannel->GetTopShape() ); + setShape( aShape3D, false, false ); - setShape( aChannelShape, false, false ); - - QColor aFillingColor = aChannel->GetFillingColor(); - QColor aBorderColor = aChannel->GetBorderColor(); + QColor aFillingColor = anObject3D->GetFillingColor(); + QColor aBorderColor = anObject3D->GetBorderColor(); setFillingColor( aFillingColor, false, false ); setBorderColor( aBorderColor, false, false ); } + else if ( myObject->IsKind( STANDARD_TYPE(HYDROData_ShapesGroup) ) ) + { + Handle(HYDROData_ShapesGroup) aShapesGroup = + Handle(HYDROData_ShapesGroup)::DownCast( myObject ); + + TopTools_SequenceOfShape aShapes; + aShapesGroup->GetShapes( aShapes ); + + TopoDS_Compound aCompound; + BRep_Builder aCompoundBuilder; + aCompoundBuilder.MakeCompound( aCompound ); + + for ( int i = 1, n = aShapes.Length(); i <= n; ++i ) + { + const TopoDS_Shape& aShape = aShapes.Value( i ); + aCompoundBuilder.Add( aCompound, aShape ); + } + + setShape( aCompound, false, false ); + } } if ( myShape.IsNull() || !isVisible() ) return; - myContext->Display( myShape, theIsUpdateViewer ); + displayShape( theIsUpdateViewer ); + + if (isDeactivateSelection) + myContext->Deactivate(myShape); } void HYDROGUI_Shape::setVisible( const bool theState, const bool theIsUpdateViewer ) { - if ( myIsVisible == theState ) - return; - myIsVisible = theState; if ( myShape.IsNull() ) return; - if ( myIsVisible ) - myContext->Display( myShape, theIsUpdateViewer ); + if ( ( myIsVisible && myContext->IsDisplayed( myShape ) ) || + ( !myIsVisible && !myContext->IsDisplayed( myShape ) ) ) + return; + + if ( myIsVisible ) { + displayShape( theIsUpdateViewer ); + } else myContext->Erase( myShape, theIsUpdateViewer ); } -void HYDROGUI_Shape::highlight( bool theIsHighlight ) +void HYDROGUI_Shape::highlight( bool theIsHighlight, bool isUpdateViewer ) { if ( myIsHighlight == theIsHighlight ) return; @@ -393,7 +438,7 @@ void HYDROGUI_Shape::highlight( bool theIsHighlight ) return; colorShapeBorder( getActiveColor() ); - myContext->Display( myShape ); + displayShape( isUpdateViewer ); } bool HYDROGUI_Shape::isHighlighted() const @@ -406,7 +451,9 @@ void HYDROGUI_Shape::setWire( const TopoDS_Wire& theWire, const bool theIsUpdateViewer ) { myTopoShape = theWire; - myDisplayMode = AIS_WireFrame; + // To avoid that hilight presentation is equal to "normal" object presentation. + // Note that hilight presentation is always to be on top ( i.e. in the top Z layer ). + myDisplayMode = AIS_Shaded; buildShape(); updateShape( theToDisplay, theIsUpdateViewer ); @@ -527,6 +574,16 @@ QString HYDROGUI_Shape::getTextureFileName() const return myTextureFileName; } +void HYDROGUI_Shape::setZLayer( const int theZLayer ) +{ + if ( myZLayer == theZLayer ) + return; + + myZLayer = theZLayer; + if ( !myShape.IsNull() && isVisible() && !myContext.IsNull() && myZLayer >= 0 ) + myContext->SetZLayer( myShape, myZLayer ); +} + void HYDROGUI_Shape::buildShape() { // Erase previously created shape @@ -549,6 +606,8 @@ void HYDROGUI_Shape::buildShape() myShape = new AIS_Shape( myTopoShape ); } + myShape->SetHLRAngleAndDeviation( 0.001 ); + if ( !myObject.IsNull() ) myShape->SetOwner( myObject ); @@ -588,9 +647,9 @@ void HYDROGUI_Shape::buildShape() Handle(Prs3d_ShadingAspect) aShadingAspect = anAttributes->ShadingAspect(); if ( !aShadingAspect.IsNull() ) { - Graphic3d_MaterialAspect aMatAspect; - aMatAspect.SetAmbient( 1 ); - aMatAspect.SetDiffuse( 0 ); + Graphic3d_MaterialAspect aMatAspect( Graphic3d_NOM_PLASTIC ); + //aMatAspect.SetAmbient( 1 ); + //aMatAspect.SetDiffuse( 0 ); aShadingAspect->Aspect()->SetFrontMaterial( aMatAspect ); aShadingAspect->Aspect()->SetBackMaterial( aMatAspect ); @@ -638,7 +697,17 @@ void HYDROGUI_Shape::updateShape( const bool theToDisplay, if ( !theToDisplay || !isVisible() || myContext.IsNull() ) return; - myContext->Display( myShape, theIsUpdateViewer ); + displayShape( theIsUpdateViewer ); +} + +void HYDROGUI_Shape::displayShape( const bool theIsUpdateViewer ) +{ + myContext->Display( myShape, Standard_False ); + + if ( myZLayer >= 0 ) + myContext->SetZLayer( myShape, myZLayer ); + + myContext->UpdateCurrentViewer(); } QColor HYDROGUI_Shape::getActiveColor() const @@ -664,7 +733,12 @@ void HYDROGUI_Shape::colorShapeBorder( const QColor& theColor ) getQuantityColorVal( theColor.green() ), getQuantityColorVal( theColor.blue() ), Quantity_TOC_RGB ); - if ( myDisplayMode == AIS_Shaded ) + + + if ( myTopoShape.ShapeType() == TopAbs_WIRE ) // Note that we display polylines in shaded mode + { + myShape->SetColor( aBorderColor ); + } else if ( myDisplayMode == AIS_Shaded ) { if ( theColor.alpha() == 0 ) { @@ -676,7 +750,16 @@ void HYDROGUI_Shape::colorShapeBorder( const QColor& theColor ) Handle(Prs3d_LineAspect) aBoundaryAspect = anAttributes->FaceBoundaryAspect(); if ( !aBoundaryAspect.IsNull() ) + { aBoundaryAspect->SetColor( aBorderColor ); + anAttributes->SetFaceBoundaryAspect( aBoundaryAspect ); + } + Handle(Prs3d_LineAspect) aWireAspect = anAttributes->WireAspect(); + if ( !aWireAspect.IsNull() ) + { + aWireAspect->SetColor( aBorderColor ); + anAttributes->SetWireAspect( aWireAspect ); + } } } else if ( myDisplayMode == AIS_WireFrame )