Salome HOME
Copyright update 2021
[modules/med.git] / src / MEDCalc / gui / ProcessingController.cxx
index 0665f3726ccb45bac1e8b534ac34097b92d8be45..3a55776052e1970676e2b1c9fed743c6e2098072 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2016  CEA/DEN, EDF R&D
+// Copyright (C) 2016-2021  CEA/DEN, 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
@@ -73,7 +73,8 @@ ProcessingController::createActions()
 
   label   = tr("LAB_PROCESSING_INTERPOLATE_FIELD");
   icon = tr("ICO_PROCESSING_INTERPOLATE_FIELD");
-  actionId = _salomeModule->createStandardAction(label,this, SLOT(OnInterpolateField()),icon,label);
+  actionId = _salomeModule->createStandardAction(label, this, SLOT(OnInterpolateField()),
+                                                 icon, label, FIELDSOp::OpProcessingInterpolation);
   _salomeModule->createTool(actionId, processingToolbarId);
   _salomeModule->action(actionId)->setIconVisibleInMenu(true);
   _salomeModule->createMenu(actionId, processingMenuId);
@@ -82,23 +83,35 @@ ProcessingController::createActions()
 void
 ProcessingController::OnChangeUnderlyingMesh()
 {
-  // Get the selected objects in the study (SObject). In cas of a
+  // Get the selected objects in the study (SObject). In case of a
   // multiple selection, we consider only the first item. At least one
   // item must be selected.
   SALOME_StudyEditor::SObjectList* listOfSObject = _studyEditor->getSelectedObjects();
   if ( listOfSObject->size() > 0 ) {
-    SALOMEDS::SObject_var soField = listOfSObject->at(0);
-    std::string name(_studyEditor->getName(soField));
-    if (soField->_is_nil() || name == "MEDCalc")
+    SALOMEDS::SObject_var soObj = listOfSObject->at(0);
+    std::string name(_studyEditor->getName(soObj));
+    if (soObj->_is_nil() || name == "MEDCalc")
       return;
-    SALOMEDS::GenericAttribute_var anAttr;
-    SALOMEDS::AttributeParameter_var aParam;
-    if ( soField->FindAttribute(anAttr,"AttributeParameter") ) {
-      aParam = SALOMEDS::AttributeParameter::_narrow(anAttr);
-      if (! aParam->IsSet(FIELD_SERIES_ID, PT_INTEGER))
+
+    int fieldId = _salomeModule->getIntParamFromStudyEditor(soObj, FIELD_ID);
+    if (fieldId < 0) { // is it a field series?
+      int fieldSeriesId = _salomeModule->getIntParamFromStudyEditor(soObj, FIELD_SERIES_ID);
+      // If fieldId and fieldSeriesId equals -1, then it means that it is not a field
+      // managed by the MED module, and we stop this function process.
+      if ( fieldSeriesId < 0)
+        return;
+      MEDCALC::FieldHandlerList* fieldHandlerList = MEDFactoryClient::getDataManager()->getFieldListInFieldseries(fieldSeriesId);
+      /* todo: always false!
+      if (fieldHandlerList->length() < 0)
+        return;
+      */
+      // For a field series, get the first real field entry:
+      MEDCALC::FieldHandler fieldHandler = (*fieldHandlerList)[0];
+      fieldId = fieldHandler.id;
+      if (fieldId < 0)
         return;
     }
-    int fieldId = aParam->GetInt(FIELD_SERIES_ID);
+
     // _GBO_ : the dialog should not be modal, so that we can choose a
     // mesh in the browser. Then we have to emit a signal from the
     // dialog.accept, connected to a slot of the DatasourceControler
@@ -112,30 +125,16 @@ ProcessingController::OnChangeUnderlyingMesh()
 void
 ProcessingController::OnChangeUnderlyingMeshInputValidated()
 {
+  STDLOG("Change Underlying Mesh");
   int meshId = _dlgChangeUnderlyingMesh->getMeshId();
   STDLOG("meshId = " << ToString(meshId));
   int fieldId = _dlgChangeUnderlyingMesh->getFieldId();
-  MEDCALC::FieldHandler* fieldHandler =
-    MEDFactoryClient::getDataManager()->getFieldHandler(fieldId);
-
-  // We don't modify the original field but create first a duplicate
-  MEDCALC::FieldHandler* duplicate = MEDFactoryClient::getCalculator()->dup(*fieldHandler);
-  MEDFactoryClient::getDataManager()->changeUnderlyingMesh(duplicate->id, meshId);
-
-  // Request once more the duplicate to update the meta-data on this
-  // client side
-  duplicate = MEDFactoryClient::getDataManager()->getFieldHandler(duplicate->id);
 
-  // >>>
-  // WARN: the following is a temporary code for test purpose
-  // Automatically add in ws
   ProcessingEvent* event = new ProcessingEvent();
-  event->eventtype = ProcessingEvent::EVENT_IMPORT_OBJECT;
-  XmedDataObject* dataObject = new XmedDataObject();
-  dataObject->setFieldHandler(*duplicate);
-  event->objectdata = dataObject;
-  emit processingSignal(event);
-  // Note that this signal is processed by the WorkspaceController
+  event->eventtype = ProcessingEvent::EVENT_CHANGE_UNDERLYING_MESH;
+  event->fieldId = fieldId;
+  event->meshId = meshId;
+  emit processingSignal(event); // --> WorkspaceController::processProcessingEvent()
 
   // Tag the item to prevent double import
   //_studyEditor->setParameterBool(soField,OBJECT_IS_IN_WORKSPACE,true);
@@ -149,18 +148,30 @@ ProcessingController::OnInterpolateField()
   // item must be selected.
   SALOME_StudyEditor::SObjectList* listOfSObject = _studyEditor->getSelectedObjects();
   if ( listOfSObject->size() > 0 ) {
-    SALOMEDS::SObject_var soField = listOfSObject->at(0);
-    std::string name(_studyEditor->getName(soField));
-    if (soField->_is_nil() || name == "MEDCalc")
+    SALOMEDS::SObject_var soObj = listOfSObject->at(0);
+    std::string name(_studyEditor->getName(soObj));
+    if (soObj->_is_nil() || name == "MEDCalc")
       return;
-    SALOMEDS::GenericAttribute_var anAttr;
-    SALOMEDS::AttributeParameter_var aParam;
-    if ( soField->FindAttribute(anAttr,"AttributeParameter") ) {
-      aParam = SALOMEDS::AttributeParameter::_narrow(anAttr);
-      if (! aParam->IsSet(FIELD_SERIES_ID, PT_INTEGER))
+
+    int fieldId = _salomeModule->getIntParamFromStudyEditor(soObj, FIELD_ID);
+    if (fieldId < 0) { // is it a field series?
+      int fieldSeriesId = _salomeModule->getIntParamFromStudyEditor(soObj, FIELD_SERIES_ID);
+      // If fieldId and fieldSeriesId equals -1, then it means that it is not a field
+      // managed by the MED module, and we stop this function process.
+      if ( fieldSeriesId < 0)
+        return;
+      MEDCALC::FieldHandlerList* fieldHandlerList = MEDFactoryClient::getDataManager()->getFieldListInFieldseries(fieldSeriesId);
+      /* todo: always false!
+      if (fieldHandlerList->length() < 0)
+        return;
+      */
+      // For a field series, get the first real field entry:
+      MEDCALC::FieldHandler fieldHandler = (*fieldHandlerList)[0];
+      fieldId = fieldHandler.id;
+      if (fieldId < 0)
         return;
     }
-    int fieldId = aParam->GetInt(FIELD_SERIES_ID);
+
     // _GBO_ : the dialog should not be modal, so that we can choose a
     // mesh in the browser. Then we have to emit a signal from the
     // dialog.accept, connected to a slot of the DatasourceControler
@@ -174,6 +185,7 @@ ProcessingController::OnInterpolateField()
 void
 ProcessingController::OnInterpolateFieldInputValidated()
 {
+  STDLOG("Interpolate Field");
   MEDCALC::InterpolationParameters params;
   params.precision = _dlgInterpolateField->getPrecision();
   STDLOG("precision = " << params.precision);
@@ -191,37 +203,13 @@ ProcessingController::OnInterpolateFieldInputValidated()
   int meshId = _dlgInterpolateField->getMeshId();
   STDLOG("meshId = " << ToString(meshId));
   int fieldId = _dlgInterpolateField->getFieldId();
-  MEDCALC::FieldHandler* fieldHandler = MEDFactoryClient::getDataManager()->getFieldHandler(fieldId);
-
-  // We don't modify the original field but create first a duplicate
-  // MEDCALC::FieldHandler* duplicate = MEDFactoryClient::getCalculator()->dup(*fieldHandler);
-  //MEDFactoryClient::getDataManager()->changeUnderlyingMesh(duplicate->id, meshId);
-  MEDCALC::FieldHandler* result = NULL;
-  try {
-    result = MEDFactoryClient::getDataManager()->interpolateField(fieldId, meshId, params);
-  }
-  catch(...) {
-    STDLOG("Unable to process field interpolation; please check interpolation parameters");
-    QMessageBox::critical(_salomeModule->getApp()->desktop(),
-                          tr("Operation failed"),
-                          tr("Unable to process field interpolation; please check interpolation parameters"));
-    return;
-  }
-
-  // Request once more the duplicate to update the meta-data on this
-  // client side
-  // duplicate = MEDFactoryClient::getDataManager()->getFieldHandler(duplicate->id);
 
-  // >>>
-  // WARN: the following is a temporary code for test purpose
-  // Automatically add in ws
   ProcessingEvent* event = new ProcessingEvent();
-  event->eventtype = ProcessingEvent::EVENT_IMPORT_OBJECT;
-  XmedDataObject* dataObject = new XmedDataObject();
-  dataObject->setFieldHandler(*result);
-  event->objectdata = dataObject;
-  emit processingSignal(event);
-  // Note that this signal is processed by the WorkspaceController
+  event->eventtype = ProcessingEvent::EVENT_INTERPOLATE_FIELD;
+  event->fieldId = fieldId;
+  event->meshId = meshId;
+  event->interpParams = params;
+  emit processingSignal(event); // --> WorkspaceController::processProcessingEvent()
 
   // // Tag the item to prevent double import
   // //_studyEditor->setParameterBool(soField,OBJECT_IS_IN_WORKSPACE,true);