X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_Shape.cxx;h=7739a90ed91925faf577af9c7c5c45b407847c7e;hb=f34b90e9e4e02ba65419134d5d37a2e42aecfabf;hp=f37fe90051c061ca6b1765bd183b3482b294862b;hpb=dc3aede73d0b7a4be38f0a09ee14c2ca10ff8fea;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_Shape.cxx b/src/HYDROGUI/HYDROGUI_Shape.cxx index f37fe900..7739a90e 100644 --- a/src/HYDROGUI/HYDROGUI_Shape.cxx +++ b/src/HYDROGUI/HYDROGUI_Shape.cxx @@ -28,6 +28,8 @@ #include #include +#include + #include #include #include @@ -37,14 +39,19 @@ #include #include +#include #include +#include #include #include +#include #include +#include +#include #include +#include +#include #include -#include -#include #include #include @@ -81,7 +88,7 @@ HYDROGUI_Shape::HYDROGUI_Shape( const Handle(AIS_InteractiveContext)& theContext HYDROGUI_Shape::~HYDROGUI_Shape() { - erase(); + erase( false ); if ( !myShape.IsNull() ) myShape.Nullify(); @@ -105,13 +112,15 @@ void HYDROGUI_Shape::erase( const bool theIsUpdateViewer ) myContext->Erase( myShape, theIsUpdateViewer ); } -void HYDROGUI_Shape::update( const bool theIsUpdateViewer ) +void HYDROGUI_Shape::update( const bool theIsUpdateViewer, + const bool theIsDisplayOnTop ) { setIsToUpdate( false ); if ( myContext.IsNull() ) return; + bool isDeactivateSelection = false; // Try to retrieve information from object if ( !myObject.IsNull() ) { @@ -161,6 +170,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) ) ) { @@ -169,25 +204,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 ) { @@ -196,6 +212,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 ) ); } } @@ -265,48 +300,79 @@ void HYDROGUI_Shape::update( const bool theIsUpdateViewer ) setTextureFileName( aTextureFileName, false, false ); setFace( aWire, false, false ); + isDeactivateSelection = true; + } + else if ( myObject->IsKind( STANDARD_TYPE(HYDROData_Profile) ) ) + { + Handle(HYDROData_Profile) aProfile = + Handle(HYDROData_Profile)::DownCast( myObject ); + + TopoDS_Wire aProfileWire; + + 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_Obstacle) ) ) + else if ( myObject->IsKind( STANDARD_TYPE(HYDROData_Stream) ) || + myObject->IsKind( STANDARD_TYPE(HYDROData_Channel) ) || + myObject->IsKind( STANDARD_TYPE(HYDROData_Obstacle) ) ) { - Handle(HYDROData_Obstacle) anObstacle = - Handle(HYDROData_Obstacle)::DownCast( myObject ); + Handle(HYDROData_Object) aGeomObject = + Handle(HYDROData_Object)::DownCast( myObject ); + + TopoDS_Shape anObjShape = aGeomObject->GetTopShape(); - //TODO BEGIN of the block of code to be reimplemented - //TODO GetTopShape() to be used in future - myTopoShape = anObstacle->GetShape3D(); - myDisplayMode = AIS_Shaded; + setShape( anObjShape, false, false ); - QColor aFillingColor = anObstacle->GetFillingColor(); - QColor aBorderColor = anObstacle->GetBorderColor(); + 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(); - buildShape(); - updateShape( false, false ); - //TODO END of the block of code to be reimplemented + setShape( aShape3D, false, false ); + + QColor aFillingColor = anObject3D->GetFillingColor(); + QColor aBorderColor = anObject3D->GetBorderColor(); + + setFillingColor( aFillingColor, false, false ); + setBorderColor( aBorderColor, false, false ); } - else if ( myObject->IsKind( STANDARD_TYPE(HYDROData_Profile) ) ) + else if ( myObject->IsKind( STANDARD_TYPE(HYDROData_ShapesGroup) ) ) { - Handle(HYDROData_Profile) aProfile = - Handle(HYDROData_Profile)::DownCast( myObject ); + Handle(HYDROData_ShapesGroup) aShapesGroup = + Handle(HYDROData_ShapesGroup)::DownCast( myObject ); - if ( aProfile->IsValid() ) { - TopoDS_Shape aProfileShape = aProfile->GetShape3D(); + TopTools_SequenceOfShape aShapes; + aShapesGroup->GetShapes( aShapes ); - if ( !aProfileShape.IsNull() ) { - if ( aProfileShape.ShapeType() == TopAbs_WIRE ) { - TopoDS_Wire aProfileWire = TopoDS::Wire( aProfileShape ); - setWire( aProfileWire, false, false ); - } else { - myTopoShape = aProfileShape; - myDisplayMode = AIS_WireFrame; - - buildShape(); - updateShape( false, false ); - } - } + 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 ); } } @@ -314,6 +380,19 @@ void HYDROGUI_Shape::update( const bool theIsUpdateViewer ) return; myContext->Display( myShape, theIsUpdateViewer ); + + if ( theIsDisplayOnTop ) { + // Display the shape on the top Z layer + Standard_Integer aNewLayerId = -1; + if ( myContext->CurrentViewer() && + myContext->CurrentViewer()->AddZLayer( aNewLayerId ) && + aNewLayerId > 0 ) { + myContext->SetZLayer( myShape, aNewLayerId ); + } + } + + if (isDeactivateSelection) + myContext->Deactivate(myShape); } void HYDROGUI_Shape::setVisible( const bool theState, @@ -333,7 +412,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; @@ -344,7 +423,7 @@ void HYDROGUI_Shape::highlight( bool theIsHighlight ) return; colorShapeBorder( getActiveColor() ); - myContext->Display( myShape ); + myContext->Display( myShape, isUpdateViewer ); } bool HYDROGUI_Shape::isHighlighted() const @@ -483,8 +562,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(); @@ -498,6 +579,8 @@ void HYDROGUI_Shape::buildShape() myShape = new AIS_Shape( myTopoShape ); } + myShape->SetHLRAngleAndDeviation( 0.001 ); + if ( !myObject.IsNull() ) myShape->SetOwner( myObject ); @@ -520,22 +603,26 @@ void HYDROGUI_Shape::buildShape() 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() ) { - 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 ); @@ -621,7 +708,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 )