Salome HOME
refs #550: fix crash when myObject is NULL
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_Tool.cxx
index f2e3f6fe3e75f8598f610333c0c16313ec175b94..7370fa3150755baf2c1dde3169fcd584ee5a335c 100644 (file)
@@ -1,8 +1,4 @@
-// Copyright (C) 2007-2015  CEA/DEN, EDF R&D, OPEN CASCADE
-//
-// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
+// Copyright (C) 2014-2015  EDF-R&D
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 // License as published by the Free Software Foundation; either
@@ -33,6 +29,7 @@
 #include <HYDROData_Tool.h>
 #include <HYDROData_Profile.h>
 
+#include <GeometryGUI.h>
 #include <GEOMBase.h>
 
 #include <GraphicsView_Viewer.h>
@@ -730,3 +727,86 @@ QString HYDROGUI_Tool::GetCoordinateString( const double theNumber, bool isInLoc
     return QString::number( theNumber, 'f', 2 );
 }
 
+Handle(Image_PixMap) HYDROGUI_Tool::Pixmap( const QImage& theImage )
+{
+    Handle(Image_PixMap) pix;
+    if ( theImage.isNull() || theImage.format() == QImage::Format_Invalid )
+        return pix;
+
+    Handle(Image_PixMap) tmpPix = new Image_PixMap();
+    tmpPix->SetTopDown( false );
+    QImage anImage = theImage.mirrored();
+    if ( !anImage.hasAlphaChannel() && anImage.allGray() )
+    {
+        tmpPix->InitTrash( Image_PixMap::ImgGray, anImage.width(), anImage.height(), anImage.width() );
+        for ( int r = 0; r < anImage.height(); r++ )
+        {
+            Standard_Byte* aRowData = tmpPix->ChangeRow( anImage.height() - r - 1 );
+            for  ( int p = 0; p < anImage.width(); p++ )
+                aRowData[p] = qRed( anImage.pixel( p, r ) );
+        }
+    }
+    else
+    {
+        Image_PixMap::ImgFormat aFormat;
+        if ( anImage.hasAlphaChannel() )
+        {
+            if ( anImage.format() != QImage::Format_ARGB32 )
+                anImage = anImage.convertToFormat( QImage::Format_ARGB32 );
+            aFormat = Image_PixMap::ImgRGBA;
+        }
+        else
+        {
+            if ( anImage.format() != QImage::Format_RGB888 )
+                anImage = anImage.convertToFormat( QImage::Format_RGB888 );
+            aFormat = Image_PixMap::ImgRGB;
+        }
+
+        tmpPix->InitWrapper( aFormat, (Standard_Byte*)anImage.bits(), anImage.width(), anImage.height(), anImage.bytesPerLine() );
+    }
+
+    if ( !tmpPix.IsNull() )
+    {
+        pix = new Image_PixMap();
+        pix->InitCopy( *tmpPix.operator->() );
+        pix->SetTopDown( tmpPix->IsTopDown() );
+    }
+
+    return pix;
+}
+
+void HYDROGUI_Tool::DeleteGeomObjects( HYDROGUI_Module* theModule, const QStringList& theEntries )
+{
+  QStringList anEntryList;
+
+  // Get active SalomeApp_Study
+  SalomeApp_Study* aStudy = NULL;
+  if ( theModule && theModule->getApp() ) {
+    aStudy = dynamic_cast<SalomeApp_Study*>( theModule->getApp()->activeStudy() );
+  }
+  if ( !aStudy ) {
+    return;
+  }
+  // Get GEOM engine
+  GEOM::GEOM_Gen_var aGeomEngine = GeometryGUI::GetGeomGen();
+  if ( aGeomEngine->_is_nil() ) {
+    return;
+  }
+  
+  // Delete GEOM objects
+  _PTR(StudyBuilder) aStudyBuilder( aStudy->studyDS()->NewBuilder() );
+  foreach ( const QString anEntry, theEntries ) {
+    _PTR(SObject) aSObject( aStudy->studyDS()->FindObjectID( qPrintable(anEntry) ) );
+    if ( aSObject ) {
+      GEOM::GEOM_Object_var aGeomObj = 
+        GEOMBase::GetObjectFromIOR( aSObject->GetIOR().c_str() );
+
+      if ( !aGeomObj->_is_nil() ) {
+        aGeomEngine->RemoveObject( aGeomObj );
+      }
+
+      aStudyBuilder->RemoveObject( aSObject );
+    }
+  }
+}
\ No newline at end of file