Salome HOME
Profile dialog backgound like it is in OCC viewer.
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_Shape.cxx
index 1491564fe1004bf8c4d78b6bf53b5bc0a4fec4e2..799c09f2b36eb4763ae8c2cba2d89e94ff5971fe 100644 (file)
@@ -40,7 +40,7 @@
 #include <HYDROData_Document.h>
 #include <HYDROData_Image.h>
 #include <HYDROData_ImmersibleZone.h>
-#include <HYDROData_Polyline.h>
+#include <HYDROData_PolylineXY.h>
 #include <HYDROData_Region.h>
 #include <HYDROData_Zone.h>
 #include <HYDROData_Obstacle.h>
 #include <TopoDS_Wire.hxx>
 #include <TopoDS_Face.hxx>
 
+#include <TopExp_Explorer.hxx>
+
+#include <BRep_Builder.hxx>
+
 #include <Precision.hxx>
 
 #include <Prs3d_ShadingAspect.hxx>
 #include <Prs3d_LineAspect.hxx>
 #include <Prs3d_IsoAspect.hxx>
 
+#include <SUIT_MessageBox.h>
+
 #include <QColor>
 #include <QFile>
 
@@ -115,22 +121,45 @@ void HYDROGUI_Shape::update( const bool theIsUpdateViewer )
       Handle(HYDROData_ImmersibleZone) aZoneObj =
         Handle(HYDROData_ImmersibleZone)::DownCast( myObject );
 
+      TopoDS_Shape aZoneShape = aZoneObj->GetTopShape();
+      if ( !aZoneShape.IsNull() ) {
+        if ( aZoneShape.ShapeType() == TopAbs_FACE ) {
+          TopoDS_Face aZoneFace = TopoDS::Face( aZoneShape );
+          setFace( aZoneFace, false, false );
+        } else {
+          myTopoShape = aZoneShape;
+          myDisplayMode = myTextureFileName.isEmpty() ? AIS_Shaded : AIS_Shaded+2;
+
+          buildShape();
+          updateShape( false, false );
+        }
+      }
+
       QColor aFillingColor = aZoneObj->GetFillingColor();
       QColor aBorderColor = aZoneObj->GetBorderColor();
-      TopoDS_Face aZoneFace = TopoDS::Face( aZoneObj->GetTopShape() );
 
       setFillingColor( aFillingColor, false, false );
       setBorderColor( aBorderColor, false, false );
-      setFace( aZoneFace, false, false );
     }
-    else if ( myObject->IsKind( STANDARD_TYPE(HYDROData_Polyline) ) )
+    else if ( myObject->IsKind( STANDARD_TYPE(HYDROData_PolylineXY) ) )
     {
-      Handle(HYDROData_Polyline) aPolyline =
-        Handle(HYDROData_Polyline)::DownCast( myObject );
-
-      TopoDS_Wire aPolylineWire = TopoDS::Wire( aPolyline->GetTopShape() );
-
-      setWire( aPolylineWire, false, false );
+      Handle(HYDROData_PolylineXY) aPolyline =
+        Handle(HYDROData_PolylineXY)::DownCast( myObject );
+
+      TopoDS_Shape aPolylineShape = aPolyline->GetShape();
+
+      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 );
+        }
+      }
     }
     else if ( myObject->IsKind( STANDARD_TYPE(HYDROData_Zone) ) )
     {
@@ -188,14 +217,29 @@ 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 );
-      anImageToSave.save( aTextureFileName );
+      QImage anImageToSave = anImage; //RKV:reduceTexture( anImage, 500 );
 
-      QPointF aPoint1( 0, 0 );
-      QPointF aPoint2( aWidth, 0 );
-      QPointF aPoint3( aWidth, aHeight );
-      QPointF aPoint4( 0, aHeight );
+      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 );
+      }
+
+      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 );
@@ -216,6 +260,7 @@ 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 );
@@ -295,6 +340,35 @@ void HYDROGUI_Shape::setWire( const TopoDS_Wire& theWire,
   updateShape( theToDisplay, theIsUpdateViewer );
 }
 
+void HYDROGUI_Shape::setFaces( const TopoDS_Compound& theWires,
+                               const bool             theToDisplay,
+                               const bool             theIsUpdateViewer )
+{
+  TopExp_Explorer anExp( theWires, TopAbs_WIRE );
+  TopoDS_Compound aCompound;
+  BRep_Builder aBuilder;
+    aBuilder.MakeCompound( aCompound );
+
+  for ( ; anExp.More(); anExp.Next() ) {
+    TopoDS_Wire aWire = TopoDS::Wire( anExp.Current() );
+    if ( aWire.IsNull() ) {
+      continue;
+    }
+
+    BRepBuilderAPI_MakeFace aMakeFace( aWire, Standard_True );
+    aMakeFace.Build();
+    if( aMakeFace.IsDone() ) {
+      aBuilder.Add( aCompound, aMakeFace.Face() );
+    }
+  }
+
+  myTopoShape = aCompound;
+  myDisplayMode = AIS_Shaded;
+
+  buildShape();
+  updateShape( theToDisplay, theIsUpdateViewer );
+}
+
 void HYDROGUI_Shape::setFace( const TopoDS_Wire& theWire,
                               const bool         theToDisplay,
                               const bool         theIsUpdateViewer )
@@ -321,6 +395,17 @@ void HYDROGUI_Shape::setFace( const TopoDS_Face& theFace,
   updateShape( theToDisplay, theIsUpdateViewer );
 }
 
+void HYDROGUI_Shape::setShape( const TopoDS_Shape& theShape,
+                               const bool          theToDisplay,
+                               const bool          theIsUpdateViewer )
+{
+  myTopoShape = theShape;
+  myDisplayMode = AIS_Shaded;
+
+  buildShape();
+  updateShape( theToDisplay, theIsUpdateViewer );
+}
+
 void HYDROGUI_Shape::setFillingColor( const QColor& theColor,
                                       const bool    theToDisplay,
                                       const bool    theIsUpdateViewer )
@@ -403,7 +488,9 @@ 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