Salome HOME
refs #524: draft implementation of "Recognize contours" operation.
[modules/hydro.git] / src / HYDROData / HYDROData_CalculationCase.cxx
index 5c5760130d4124f270dfc528dd99a1e8612f68f8..56f5259ac9eb0f9b9e817026cd5804f27af0b224 100644 (file)
@@ -1,3 +1,20 @@
+// 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
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
 
 #include "HYDROData_CalculationCase.h"
 
@@ -11,6 +28,7 @@
 #include "HYDROData_SplittedShapesGroup.h"
 #include "HYDROData_Region.h"
 #include "HYDROData_Tool.h"
+#include "HYDROData_GeomTool.h"
 
 #include <GEOMBase.h>
 
 
 #define EXPORT_NAME "HYDRO_" + GetName()
 
-#include <SALOME_NamingService.hxx>
-#include <SALOME_LifeCycleCORBA.hxx>
-
-
-
-
-
 IMPLEMENT_STANDARD_HANDLE(HYDROData_CalculationCase, HYDROData_Entity)
 IMPLEMENT_STANDARD_RTTIEXT(HYDROData_CalculationCase, HYDROData_Entity)
 
@@ -117,6 +128,7 @@ void HYDROData_CalculationCase::SetName( const QString& theName )
 QStringList HYDROData_CalculationCase::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const
 {
   QStringList aResList = dumpObjectCreation( theTreatedObjects );
+  aResList.prepend( "# Calculation case" );
 
   QString aCalculName = GetObjPyName();
 
@@ -156,18 +168,16 @@ QStringList HYDROData_CalculationCase::DumpToPython( MapOfTreatedObjects& theTre
 
     aResList << QString( "%1.AddGeometryGroup( %2 );" ).arg( aCalculName ).arg( aGroupName );
   }
-  aResList << QString( "" );
 
   Handle(HYDROData_PolylineXY) aBoundaryPolyline = GetBoundaryPolyline();
   setPythonReferenceObject( theTreatedObjects, aResList, aBoundaryPolyline, "SetBoundaryPolyline" );
-  aResList << QString( "" );
 
   if( aMode==AUTOMATIC )
     DumpRulesToPython( aCalculName, aResList );
 
   aResList << QString( "" );
+  aResList << "# Start the algorithm of the partition and assignment";
   aResList << QString( "%1.Update();" ).arg( aCalculName );
-  aResList << QString( "" );
 
   if( aMode==MANUAL )
   {
@@ -181,26 +191,73 @@ QStringList HYDROData_CalculationCase::DumpToPython( MapOfTreatedObjects& theTre
       if ( aRegion.IsNull() )
         continue;
 
-      QString aRegionName = aRegion->GetName();
-
-      HYDROData_SequenceOfObjects aZones = aRegion->GetZones();
-      HYDROData_SequenceOfObjects::Iterator aZonesIter( aZones );
-      for ( ; aZonesIter.More(); aZonesIter.Next() )
-      {
-        Handle(HYDROData_Zone) aRegZone =
-          Handle(HYDROData_Zone)::DownCast( aZonesIter.Value() );
-        if ( aRegZone.IsNull() )
-          continue;
-
-        // TODO
-      }
+      theTreatedObjects.insert( aRegion->GetName(), aRegion );
+      QStringList aRegDump = aRegion->DumpToPython( theTreatedObjects );
+      aResList << aRegDump;
     }
   }
 
+  // Export calculation case
+  aResList << QString( "" );
+  aResList << "# Export of the calculation case";
+  QString aStudyName = "theStudy";
+  QString anEntryVar = aCalculName + "_entry";
+  aResList << QString( "%1 = %2.Export( %3._get_StudyId() )" ).arg( anEntryVar ).arg( aCalculName ).arg( aStudyName );
+
+  // Get geometry object and print debug information
+  aResList << "";
+  aResList << "# Get geometry shape and print debug information";
+  aResList << "import GEOM";
+  aResList << QString( "print \"Entry:\", %1" ).arg( anEntryVar );
+  QString aGeomShapeName = aCalculName + "_geom";
+  aResList << QString( "%1 = salome.IDToObject( str( %2 ) )" ).arg( aGeomShapeName ).arg( anEntryVar );
+  aResList << QString( "print \"Geom shape:\", %1" ).arg( aGeomShapeName );
+  aResList << QString( "print \"Geom shape name:\", %1.GetName()" ).arg( aGeomShapeName );
+
+  DumpSampleMeshing( aResList, aStudyName, aGeomShapeName, aCalculName+"_mesh" );
+
   aResList << QString( "" );
   return aResList;
 }
 
+void HYDROData_CalculationCase::DumpSampleMeshing( QStringList& theResList,
+                                                   const QString& theStudyName,
+                                                   const QString& theGeomShapeName,
+                                                   const QString& theMeshName ) const
+{
+  theResList << "";
+  theResList << "# Meshing";
+  theResList << "import SMESH, SALOMEDS";
+  theResList << "from salome.smesh import smeshBuilder";
+  theResList << "from salome.geom import geomBuilder";
+
+  theResList << QString( "smesh = smeshBuilder.New( %1 )" ).arg( theStudyName );
+  theResList << QString( "%1 = smesh.Mesh( %2 )" ).arg( theMeshName ).arg( theGeomShapeName );
+  theResList << QString( "MEFISTO_2D = %1.Triangle( algo=smeshBuilder.MEFISTO )" ).arg( theMeshName );
+  theResList << "Max_Element_Area_1 = MEFISTO_2D.MaxElementArea( 10 )";
+  theResList << QString( "Regular_1D = %1.Segment()" ).arg( theMeshName );
+  theResList << "Max_Size_1 = Regular_1D.MaxSize(10)";
+  theResList << QString( "isDone = %1.Compute()" ).arg( theMeshName );
+
+  theResList << "";
+  theResList << "# Set names of Mesh objects";
+  theResList << "smesh.SetName( MEFISTO_2D.GetAlgorithm(), 'MEFISTO_2D' )";
+  theResList << "smesh.SetName( Regular_1D.GetAlgorithm(), 'Regular_1D' )";
+  theResList << "smesh.SetName( Max_Size_1, 'Max Size_1' )";
+  theResList << "smesh.SetName( Max_Element_Area_1, 'Max. Element Area_1' )";
+  theResList << QString( "smesh.SetName( %1.GetMesh(), '%1' )" ).arg( theMeshName );
+
+  theResList << "";
+  theResList << "# Greate SMESH groups";
+  theResList << QString( "geompy = geomBuilder.New( %1 )" ).arg( theStudyName );
+  theResList << QString( "geom_groups = geompy.GetGroups( %1 )" ).arg( theGeomShapeName );
+  theResList << QString( "for group in geom_groups:" );
+  theResList << QString( "    smesh_group = %1.GroupOnGeom(group, group.GetName(), SMESH.EDGE)" )
+                .arg( theMeshName );
+  theResList << QString( "    smesh.SetName(smesh_group, group.GetName())" );
+  theResList << QString( "    print \"SMESH group '%s': %s\" % (smesh_group.GetName(), smesh_group)" );
+}
+
 HYDROData_SequenceOfObjects HYDROData_CalculationCase::GetAllReferenceObjects() const
 {
   HYDROData_SequenceOfObjects aResSeq = HYDROData_Entity::GetAllReferenceObjects();
@@ -834,6 +891,7 @@ Handle(HYDROData_Region) HYDROData_CalculationCase::addNewRegion( const Handle(H
                                                                   bool isPrefix )
 {
   TDF_Label aNewLab = myLab.FindChild( DataTag_ChildRegion ).NewChild();
+  int aTag = aNewLab.Tag();
 
   Handle(HYDROData_Region) aNewRegion =
     Handle(HYDROData_Region)::DownCast( HYDROData_Iterator::CreateObject( aNewLab, KIND_REGION ) );
@@ -861,18 +919,9 @@ Handle(HYDROData_SplittedShapesGroup) HYDROData_CalculationCase::addNewSplittedG
 
 QString HYDROData_CalculationCase::Export( int theStudyId ) const
 {
-  int argc = 0;
-  char** argv = 0;
-  CORBA::ORB_var anORB = CORBA::ORB_init( argc, argv, "omniORB4"/*CORBA::ORB_ID*/ );
-  SALOME_NamingService aNameService( anORB );
-  SALOME_LifeCycleCORBA aLCC( &aNameService );
-  Engines::EngineComponent_var aComponent = aLCC.FindOrLoad_Component( "FactoryServer", "GEOM" );
-  GEOM::GEOM_Gen_var aGEOMEngine = GEOM::GEOM_Gen::_narrow( aComponent );
+  GEOM::GEOM_Gen_var aGEOMEngine = HYDROData_GeomTool::GetGeomGen();
+  SALOMEDS::Study_var aDSStudy = HYDROData_GeomTool::GetStudyByID( theStudyId );
   
-  CORBA::Object_var aSMObject = aNameService.Resolve("/myStudyManager");
-  SALOMEDS::StudyManager_var aStudyManager = SALOMEDS::StudyManager::_narrow(aSMObject);
-  SALOMEDS::Study_var aDSStudy = aStudyManager->GetStudyByID( theStudyId );
-
   QString aGeomObjEntry;
   bool isOK = Export( aGEOMEngine, aDSStudy, aGeomObjEntry );
   return isOK ? aGeomObjEntry : QString();
@@ -912,7 +961,7 @@ bool HYDROData_CalculationCase::Export( GEOM::GEOM_Gen_var  theGeomEngine,
   {
     Handle(HYDROData_Region) aRegion =
       Handle(HYDROData_Region)::DownCast( aRegionIter.Value() );
-    if( aRegion.IsNull() )
+    if( aRegion.IsNull() || !aRegion->IsSubmersible() )
       continue;
 
     TopoDS_Shape aRegionShape = aRegion->GetShape( &aSeqOfGroupsDefs );
@@ -980,7 +1029,7 @@ bool HYDROData_CalculationCase::Export( GEOM::GEOM_Gen_var
   // Publish the sewed shape
   QString aName = EXPORT_NAME;
   GEOM::GEOM_Object_ptr aMainShape = 
-    publishShapeInGEOM( theGeomEngine, theStudy, aSewedShape, aName, theGeomObjEntry );
+    HYDROData_GeomTool::publishShapeInGEOM( theGeomEngine, theStudy, aSewedShape, aName, theGeomObjEntry );
 
   if ( aMainShape->_is_nil() )  
     return false;
@@ -1077,52 +1126,6 @@ bool HYDROData_CalculationCase::Export( GEOM::GEOM_Gen_var
   return true;
 }
 
-GEOM::GEOM_Object_ptr HYDROData_CalculationCase::publishShapeInGEOM( 
-  GEOM::GEOM_Gen_var theGeomEngine, SALOMEDS::Study_ptr theStudy,
-  const TopoDS_Shape& theShape, const QString& theName,
-  QString& theGeomObjEntry ) const
-{
-  theGeomObjEntry = "";
-  GEOM::GEOM_Object_var aGeomObj;
-
-  if ( theGeomEngine->_is_nil() || theStudy->_is_nil() ||
-       theShape.IsNull() ) {
-    return aGeomObj._retn();
-  }
-
-  std::ostringstream aStreamShape;
-  // Write TopoDS_Shape in ASCII format to the stream
-  BRepTools::Write( theShape, aStreamShape );
-  // Returns the number of bytes that have been stored in the stream's buffer.
-  int aSize = aStreamShape.str().size();
-  // Allocate octect buffer of required size
-  CORBA::Octet* anOctetBuf = SALOMEDS::TMPFile::allocbuf( aSize );
-  // Copy ostrstream content to the octect buffer
-  memcpy( anOctetBuf, aStreamShape.str().c_str(), aSize );
-  // Create TMPFile
-  SALOMEDS::TMPFile_var aSeqFile = new SALOMEDS::TMPFile( aSize, aSize, anOctetBuf, 1 );
-
-  // Restore shape from the stream and get the GEOM object
-  GEOM::GEOM_IInsertOperations_var anInsOp = theGeomEngine->GetIInsertOperations( theStudy->StudyId() );
-  aGeomObj = anInsOp->RestoreShape( aSeqFile );
-  
-  // Puplish the GEOM object
-  if ( !aGeomObj->_is_nil() ) {
-    QString aName = GEOMBase::GetDefaultName( theName );
-
-    SALOMEDS::SObject_var aResultSO = 
-      theGeomEngine->PublishInStudy( theStudy, SALOMEDS::SObject::_nil(), 
-                                     aGeomObj, qPrintable( aName ) );
-    if ( aResultSO->_is_nil() ) {
-      aGeomObj = GEOM::GEOM_Object::_nil();
-    }
-    else
-      theGeomObjEntry = aResultSO->GetID();
-  }
-
-  return aGeomObj._retn();
-}
-
 void HYDROData_CalculationCase::ClearRules( const bool theIsSetToUpdate )
 {
   TDF_Label aRulesLab = myLab.FindChild( DataTag_CustomRules );