Salome HOME
Bug on dragging rectangle in overview: Fatal error "ZFar should be greater than ZNear...
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_Overview.cxx
index d236e332725cfa099f71647dfd79bca637056578..f1075782abd5986c35147eeedfb1bf45a6c55bf3 100644 (file)
@@ -27,6 +27,9 @@
 #include <QMouseEvent>
 #include <QLayout>
 
+//#define _DEVDEBUG_
+#include "HYDRO_trace.hxx"
+
 class HYDROGUI_OverviewBand : public QtxPolyRubberBand
 {
 public:
@@ -121,6 +124,7 @@ QPoint HYDROGUI_OverviewBand::center() const
 
 void HYDROGUI_OverviewBand::drag( const QPoint& thePoint, bool isStart )
 {
+  DEBTRACE("drag");
   if( myIsDrag==isStart )
     return;
 
@@ -148,6 +152,7 @@ bool HYDROGUI_OverviewBand::isDrag() const
 
 void HYDROGUI_OverviewBand::dragging( const QPoint& thePoint )
 {
+  DEBTRACE("dragging");
   int n = myPoints.size();
   QPoint delta = thePoint - myStartPnt;
   for( int i=0; i<n; i++ )
@@ -192,13 +197,14 @@ void HYDROGUI_OverviewBand::update( bool isFromMain )
     QPoint c = center();
     double x1, y1, z1, x2, y2, z2;
     main->getView()->Convert( main->width()/2, main->height()/2, x1, y1, z1 );
-
+    DEBTRACE("x1, y1, z1 " << x1 << " " << y1 << " " << z1);
     // Patch for OCCT 6.9.1, on 7.0.0 the moving of point to plane XY is not necessary
-    gp_Dir dm = main->getView()->Camera()->Direction();
-    double t1 = -z1/dm.Z();
-    x1 += dm.X()*t1;
-    y1 += dm.Y()*t1;
-    z1 += dm.Z()*t1;
+//    gp_Dir dm = main->getView()->Camera()->Direction();
+//    double t1 = -z1/dm.Z();
+//    x1 += dm.X()*t1;
+//    y1 += dm.Y()*t1;
+//    z1 += dm.Z()*t1;
+//    DEBTRACE("x1, y1, z1 " << x1 << " " << y1 << " " << z1);
 
     overview->getView()->Convert( c.x(), c.y(), x2, y2, z2 );
     gp_Dir dov = overview->getView()->Camera()->Direction();
@@ -206,27 +212,37 @@ void HYDROGUI_OverviewBand::update( bool isFromMain )
     x2 += dov.X()*t2;
     y2 += dov.Y()*t2;
     z2 += dov.Z()*t2;
+    DEBTRACE("x2, y2, z2 " << x2 << " " << y2 << " " << z2);
 
     gp_Trsf aTrsf;
     aTrsf.SetTranslation( gp_Pnt( x1, y1, z1 ), gp_Pnt( x2, y2, z2 ) );
 
     // Temporary patch for bug in OCCT 6.9.1
-    Handle(Graphic3d_Camera) cam = main->getView()->Camera();
-    gp_Dir u = cam->Up(), nu = u.Transformed (aTrsf);
-    gp_Pnt e = cam->Eye(), ne = e.Transformed (aTrsf);
-    gp_Pnt cen = cam->Center(), ncen = cen.Transformed (aTrsf);
-
-    if (!nu.IsEqual (u, 0.0))
-      cam->SetUp(nu);
-
-    if (!ne.IsEqual (e, 0.0))
-      cam->SetEye(ne);
-
-    if (!ncen.IsEqual(cen, 0.0))
-      cam->SetCenter (ncen);
+//    Handle(Graphic3d_Camera) cam = main->getView()->Camera();
+//    gp_Dir u = cam->Up(), nu = u.Transformed (aTrsf);
+//    gp_Pnt e = cam->Eye(), ne = e.Transformed (aTrsf);
+//    gp_Pnt cen = cam->Center(), ncen = cen.Transformed (aTrsf);
+//
+//    if (!nu.IsEqual (u, 0.0))
+//    {
+//      cam->SetUp(nu);
+//      DEBTRACE("nu " << nu.X() << " "  << nu.Y() << " "  << nu.Z());
+//    }
+//
+//    if (!ne.IsEqual (e, 0.0))
+//    {
+//      cam->SetEye(ne);
+//      DEBTRACE("ne " << ne.X() << " "  << ne.Y() << " "  << ne.Z())
+//    }
+//
+//    if (!ncen.IsEqual(cen, 0.0))
+//    {
+//      cam->SetCenter (ncen);
+//      DEBTRACE("ncen " << ncen.X() << " "  << ncen.Y() << " "  << ncen.Z())
+//    }
 
     //version for new OCCT:
-    //main->getView()->Camera()->Transform( aTrsf );
+    main->getView()->Camera()->Transform( aTrsf );
     main->repaint();
   }
 }
@@ -244,10 +260,7 @@ void HYDROGUI_OverviewBand::paintEvent( QPaintEvent* thePaintEvent )
   painter.drawPolygon( myPoints );
 }
 
-
-
-
-
+//////////////
 
 HYDROGUI_Overview::HYDROGUI_Overview( const QString& theTitle, int theMargin, QWidget* theParent )
   : QFrame( theParent ), myMargin( theMargin ),
@@ -263,6 +276,7 @@ HYDROGUI_Overview::HYDROGUI_Overview( const QString& theTitle, int theMargin, QW
 
 HYDROGUI_Overview::~HYDROGUI_Overview()
 {
+  //delete myViewPort;
 }
 
 QImage HYDROGUI_Overview::dump() const
@@ -278,12 +292,25 @@ QImage HYDROGUI_Overview::dump() const
   int aHeight = myViewPort->height();
 
   Image_PixMap aPix;
-  view->ToPixMap( aPix,aWidth, aHeight,Graphic3d_BT_RGBA );
 
+#if OCC_VERSION_LARGE >= 0x07020000
+  view->ToPixMap( aPix,aWidth, aHeight,Graphic3d_BT_RGBA );
   QImage anImage( aPix.Data(), aWidth, aHeight, QImage::Format_ARGB32 );
   anImage = anImage.mirrored();
   anImage = anImage.rgbSwapped();
-
+#else
+  view->ToPixMap(aPix, aWidth, aHeight, Graphic3d_BT_RGB);
+  QImage anImage( aWidth, aHeight, QImage::Format_ARGB32 );
+  for ( int i = 0; i < aWidth; i++ ) {
+    for ( int j = 0; j < aHeight; j++ ) {
+      Quantity_Color pixel = aPix.PixelColor( i, j ).GetRGB();
+      QColor color = QColor::fromRgbF( pixel.Red(), pixel.Green(), pixel.Blue() );
+      anImage.setPixelColor( i, j, color );
+    }
+  }
+  if ( aPix.IsTopDown() )
+    anImage = anImage.mirrored();
+#endif
   if( myBand && myBand->isVisible() )
   {
     QPixmap aPixmap = QPixmap::fromImage( anImage );
@@ -291,13 +318,20 @@ QImage HYDROGUI_Overview::dump() const
     myBand->render( &aPixmap, p );
     anImage = aPixmap.toImage();
   }
-
   return anImage;
 }
 
 OCCViewer_ViewPort3d* HYDROGUI_Overview::getViewPort( bool isMain ) const
 {
-  return isMain ? myMainView->getViewPort() : myViewPort;
+  if ( isMain) 
+  {
+    if (myMainView!=NULL)
+      return myMainView->getViewPort();
+    else
+      return NULL;
+  }
+  else
+    return myViewPort;
 }
 
 void HYDROGUI_Overview::setMainView( OCCViewer_ViewFrame* theMainView )
@@ -312,7 +346,9 @@ void HYDROGUI_Overview::setMainView( OCCViewer_ViewFrame* theMainView )
   connect( aMainView->getViewPort(), SIGNAL( vpResizeEvent( QResizeEvent* ) ),
            this,       SLOT( OnResizeEvent( QResizeEvent* ) ) );
   connect( aMainView->getViewPort(), SIGNAL( vpTransformed( OCCViewer_ViewPort* ) ),
-           this,       SLOT( OnTransformation() ) );
+           this,       SLOT( OnTransformation() ) ); 
+
+  connect( myMainView, SIGNAL(destroyed()),  this,  SLOT( onMainViewDestr() ) );
 
   if( !myViewPort )
   {
@@ -322,6 +358,7 @@ void HYDROGUI_Overview::setMainView( OCCViewer_ViewFrame* theMainView )
     {
       myViewPort->setBackgroundColor( myMainView->getViewPort()->backgroundColor() );
 
+      connect( myViewPort, SIGNAL(destroyed()),  this,  SLOT( onViewPortDestr() ) );
       connect( myViewPort, SIGNAL( vpMouseEvent( QMouseEvent* ) ), 
               this,       SLOT( OnMouseEvent( QMouseEvent* ) ) );
       connect( myViewPort, SIGNAL( vpResizeEvent( QResizeEvent* ) ),
@@ -465,8 +502,28 @@ void HYDROGUI_Overview::OnResizeEvent( QResizeEvent* )
     myBand->update( true );
 }
 
+
+void HYDROGUI_Overview::onMainViewDestr()
+{
+  myMainView = NULL;
+  if (myViewPort == NULL)
+    return;
+  Handle(V3d_View) ov = myViewPort->getView();
+  ov->View()->Deactivate();
+  delete myViewPort; //this will delete myBand
+  myViewPort = NULL;
+  myBand = NULL;
+}
+
+void HYDROGUI_Overview::onViewPortDestr()
+{
+  myViewPort = NULL;
+}
+
+
 void HYDROGUI_Overview::CustomFitSelection() const
 {
+  DEBTRACE("CustomFitSelection");
   OCCViewer_ViewPort3d* main = getViewPort( true );
   if( !main )
     return;
@@ -530,6 +587,7 @@ typedef NCollection_DataMap<Handle(SelectMgr_SelectableObject), Handle(SelectMgr
   typedef NCollection_DataMap<Handle(SelectMgr_SelectableObject), Handle(SelectMgr_IndexedMapOfOwner)>::Iterator AIS_MapIteratorOfMapOfObjectOwners1;
 Bnd_Box HYDROGUI_Overview::BoundingForSelection() const
 {
+  DEBTRACE("BoundingForSelection");
   Handle(AIS_InteractiveContext) c = context();
 
   Bnd_Box aBndSelected;