X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_Shape.cxx;h=37eaf35001c6050e1f74bab38968ac0aaa59cef9;hb=a1431f03eac1d1aed4203d0568d987c41ce939b3;hp=5c4aa75a37d79da14e8c3c2988a3ae209f38ffff;hpb=18ce335801a9ea2cb5f267ffc986c93f402bf720;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_Shape.cxx b/src/HYDROGUI/HYDROGUI_Shape.cxx index 5c4aa75a..37eaf350 100644 --- a/src/HYDROGUI/HYDROGUI_Shape.cxx +++ b/src/HYDROGUI/HYDROGUI_Shape.cxx @@ -37,13 +37,19 @@ #include #include +#include #include +#include #include #include +#include #include +#include +#include #include +#include +#include #include -#include #include #include @@ -80,7 +86,7 @@ HYDROGUI_Shape::HYDROGUI_Shape( const Handle(AIS_InteractiveContext)& theContext HYDROGUI_Shape::~HYDROGUI_Shape() { - erase(); + erase( false ); if ( !myShape.IsNull() ) myShape.Nullify(); @@ -111,6 +117,7 @@ void HYDROGUI_Shape::update( const bool theIsUpdateViewer ) if ( myContext.IsNull() ) return; + bool isDeactivateSelection = false; // Try to retrieve information from object if ( !myObject.IsNull() ) { @@ -160,6 +167,32 @@ void HYDROGUI_Shape::update( const bool theIsUpdateViewer ) updateShape( false, false ); } } + + QColor aWireColor = aPolyline->GetWireColor(); + setBorderColor( aWireColor, false, false ); + } + else if ( myObject->IsKind( STANDARD_TYPE(HYDROData_Polyline3D) ) ) + { + Handle(HYDROData_Polyline3D) aPolyline = + Handle(HYDROData_Polyline3D)::DownCast( myObject ); + + TopoDS_Shape aPolylineShape = aPolyline->GetShape3D(); + + if ( !aPolylineShape.IsNull() ) { + if ( aPolylineShape.ShapeType() == TopAbs_WIRE ) { + TopoDS_Wire aPolylineWire = TopoDS::Wire( aPolylineShape ); + setWire( aPolylineWire, false, false ); + } else { + myTopoShape = aPolylineShape; + myDisplayMode = AIS_WireFrame; + + buildShape(); + updateShape( false, false ); + } + } + + QColor aWireColor = aPolyline->GetBorderColor(); + setBorderColor( aWireColor, false, false ); } else if ( myObject->IsKind( STANDARD_TYPE(HYDROData_Zone) ) ) { @@ -168,25 +201,6 @@ void HYDROGUI_Shape::update( const bool theIsUpdateViewer ) TopoDS_Face aZoneFace = TopoDS::Face( aZone->GetShape() ); - // Generate the filling color for zone - QStringList aGeomObjectsNames; - - HYDROData_SequenceOfObjects aRefObjects = aZone->GetGeometryObjects(); - HYDROData_SequenceOfObjects::Iterator anIter( aRefObjects ); - for ( ; anIter.More(); anIter.Next() ) - { - Handle(HYDROData_Object) aRefbject = - Handle(HYDROData_Object)::DownCast( anIter.Value() ); - if ( aRefbject.IsNull() ) - continue; - - QString aRefObjectName = aRefbject->GetName(); - if ( aRefObjectName.isEmpty() ) - continue; - - aGeomObjectsNames.append( aRefObjectName ); - } - setFace( aZoneFace, false, false ); if (aZone->IsMergingNeed() && aZone->GetMergeType() == HYDROData_Zone::Merge_UNKNOWN ) { @@ -195,6 +209,25 @@ void HYDROGUI_Shape::update( const bool theIsUpdateViewer ) } else { + // Generate the filling color for zone + QStringList aGeomObjectsNames; + + HYDROData_SequenceOfObjects aRefObjects = aZone->GetGeometryObjects(); + HYDROData_SequenceOfObjects::Iterator anIter( aRefObjects ); + for ( ; anIter.More(); anIter.Next() ) + { + Handle(HYDROData_Object) aRefbject = + Handle(HYDROData_Object)::DownCast( anIter.Value() ); + if ( aRefbject.IsNull() ) + continue; + + QString aRefObjectName = aRefbject->GetName(); + if ( aRefObjectName.isEmpty() ) + continue; + + aGeomObjectsNames.append( aRefObjectName ); + } + setFillingColor( HYDROGUI_Tool::GenerateFillingColor( aDocument, aGeomObjectsNames ) ); } } @@ -217,8 +250,18 @@ void HYDROGUI_Shape::update( const bool theIsUpdateViewer ) 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 ) + { + aTrsfWidth += ( 4 - aDelta ); + } + anImage = anImage.scaledToWidth( aTrsfWidth ); + // temporary optimization, to reduce the saved image size (and the texture quality) - QImage anImageToSave = reduceTexture( anImage, 500 ); + QImage anImageToSave = anImage; //RKV:reduceTexture( anImage, 500 ); + bool isSaved = anImageToSave.save( aTextureFileName ); if ( !isSaved ) { QString aTitle = QObject::tr( "FILE_ERROR" ); @@ -226,10 +269,10 @@ void HYDROGUI_Shape::update( const bool theIsUpdateViewer ) SUIT_MessageBox::warning( 0, aTitle, aMessage ); } - QPointF aPoint1( 0, 0 ); - QPointF aPoint2( aWidth, 0 ); - QPointF aPoint3( aWidth, aHeight ); - QPointF aPoint4( 0, aHeight ); + QPointF aPoint1( 0, 0 ); // 1: top left + QPointF aPoint2( aWidth, 0 ); // 2: top right + QPointF aPoint3( aWidth, aHeight ); // 3: bottom right + QPointF aPoint4( 0, aHeight ); // 4: bottom left aPoint1 = aTrsf.map( aPoint1 ); aPoint2 = aTrsf.map( aPoint2 ); @@ -250,29 +293,85 @@ void HYDROGUI_Shape::update( const bool theIsUpdateViewer ) TopoDS_Edge anEdge4 = BRepBuilderAPI_MakeEdge( aPnt4, aPnt1 ).Edge(); TopoDS_Wire aWire = BRepBuilderAPI_MakeWire( anEdge1, anEdge2, anEdge3, anEdge4 ).Wire(); + aWire.Closed( true ); setTextureFileName( aTextureFileName, false, false ); setFace( aWire, false, false ); + isDeactivateSelection = true; } - else if ( myObject->IsKind( STANDARD_TYPE(HYDROData_Obstacle) ) ) + else if ( myObject->IsKind( STANDARD_TYPE(HYDROData_Profile) ) ) { - Handle(HYDROData_Obstacle) anObstacle = - Handle(HYDROData_Obstacle)::DownCast( myObject ); + Handle(HYDROData_Profile) aProfile = + Handle(HYDROData_Profile)::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; + TopoDS_Wire aProfileWire; - QColor aFillingColor = anObstacle->GetFillingColor(); - QColor aBorderColor = anObstacle->GetBorderColor(); + if ( aProfile->IsValid() ) { + TopoDS_Shape aProfileShape = aProfile->GetShape3D(); + + if ( !aProfileShape.IsNull() && + aProfileShape.ShapeType() == TopAbs_WIRE ) { + aProfileWire = TopoDS::Wire( aProfileShape ); + } + } + + setWire( aProfileWire, false, false ); + + QColor aWireColor = aProfile->GetBorderColor(); + setBorderColor( aWireColor, false, false ); + } + else if ( myObject->IsKind( STANDARD_TYPE(HYDROData_Stream) ) || + myObject->IsKind( STANDARD_TYPE(HYDROData_Channel) ) || + myObject->IsKind( STANDARD_TYPE(HYDROData_Obstacle) ) ) + { + Handle(HYDROData_Object) aGeomObject = + Handle(HYDROData_Object)::DownCast( myObject ); + + TopoDS_Shape anObjShape = aGeomObject->GetTopShape(); + + setShape( anObjShape, false, false ); + + QColor aFillingColor = aGeomObject->GetFillingColor(); + QColor aBorderColor = aGeomObject->GetBorderColor(); setFillingColor( aFillingColor, false, false ); setBorderColor( aBorderColor, false, false ); + } + else if ( myObject->IsKind( STANDARD_TYPE(HYDROData_DummyObject3D) ) ) + { + Handle(HYDROData_DummyObject3D) anObject3D = + Handle(HYDROData_DummyObject3D)::DownCast( myObject ); + TopoDS_Shape aShape3D = anObject3D->GetShape(); + + setShape( aShape3D, false, false ); - buildShape(); - updateShape( false, false ); - //TODO END of the block of code to be reimplemented + 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 ); + + BRepBuilderAPI_MakeWire aMakeWire; + + for ( int i = 1, n = aShapes.Length(); i <= n; ++i ) + { + TopoDS_Edge anEdge = TopoDS::Edge( aShapes.Value( i ) ); + aMakeWire.Add( anEdge ); + } + + aMakeWire.Build(); + TopoDS_Wire aResWire = aMakeWire.Wire(); + + setWire( aResWire, false, false ); + setBorderColor( Qt::red, false, false ); } } @@ -280,6 +379,8 @@ void HYDROGUI_Shape::update( const bool theIsUpdateViewer ) return; myContext->Display( myShape, theIsUpdateViewer ); + if (isDeactivateSelection) + myContext->Deactivate(myShape); } void HYDROGUI_Shape::setVisible( const bool theState, @@ -299,7 +400,7 @@ void HYDROGUI_Shape::setVisible( const bool theState, myContext->Erase( myShape, theIsUpdateViewer ); } -void HYDROGUI_Shape::highlight( bool theIsHighlight ) +void HYDROGUI_Shape::highlight( bool theIsHighlight, bool isUpdateViewer ) { if ( myIsHighlight == theIsHighlight ) return; @@ -310,7 +411,7 @@ void HYDROGUI_Shape::highlight( bool theIsHighlight ) return; colorShapeBorder( getActiveColor() ); - myContext->Display( myShape ); + myContext->Display( myShape, isUpdateViewer ); } bool HYDROGUI_Shape::isHighlighted() const @@ -449,8 +550,10 @@ void HYDROGUI_Shape::buildShape() // Erase previously created shape erase(); - if ( myTopoShape.IsNull() ) + if ( myTopoShape.IsNull() ) { + myShape.Nullify(); return; + } QString aTextureFileName = getTextureFileName(); bool anIsTexture = !aTextureFileName.isEmpty(); @@ -477,23 +580,29 @@ void HYDROGUI_Shape::buildShape() aTexturedShape->SetTextureFileName( HYDROGUI_Tool::ToAsciiString( aTextureFileName ) ); aTexturedShape->SetTextureMapOn(); + // Just use the texture image as is aTexturedShape->DisableTextureModulate(); + aTexturedShape->SetTextureRepeat( false ); // don't repeat the texture image on the face } // Init default params for shape const Handle(AIS_Drawer)& anAttributes = myShape->Attributes(); if ( !anAttributes.IsNull() ) { - if ( myDisplayMode == AIS_Shaded ) - { - Handle(Prs3d_IsoAspect) anIsoAspect = anAttributes->UIsoAspect(); - if ( !anIsoAspect.IsNull() ) - anIsoAspect->SetNumber( 0 ); + Handle(Prs3d_IsoAspect) anIsoAspect = anAttributes->UIsoAspect(); + if ( !anIsoAspect.IsNull() ) { + anIsoAspect->SetNumber( 0 ); + anAttributes->SetUIsoAspect( anIsoAspect ); + } - anIsoAspect = anAttributes->VIsoAspect(); - if ( !anIsoAspect.IsNull() ) - anIsoAspect->SetNumber( 0 ); + anIsoAspect = anAttributes->VIsoAspect(); + if ( !anIsoAspect.IsNull() ) { + anIsoAspect->SetNumber( 0 ); + anAttributes->SetVIsoAspect( anIsoAspect ); + } + if ( myDisplayMode == AIS_Shaded ) + { Handle(Prs3d_ShadingAspect) aShadingAspect = anAttributes->ShadingAspect(); if ( !aShadingAspect.IsNull() ) { @@ -585,7 +694,10 @@ void HYDROGUI_Shape::colorShapeBorder( const QColor& theColor ) Handle(Prs3d_LineAspect) aBoundaryAspect = anAttributes->FaceBoundaryAspect(); if ( !aBoundaryAspect.IsNull() ) + { aBoundaryAspect->SetColor( aBorderColor ); + anAttributes->SetFaceBoundaryAspect( aBoundaryAspect ); + } } } else if ( myDisplayMode == AIS_WireFrame )