-// 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
#include "ProcessingController.hxx"
#include <MEDCalcConstants.hxx>
+#include <SALOMEDS_SObject.hxx>
+#include <SALOMEDS_Study.hxx>
+#include CORBA_CLIENT_HEADER(SALOMEDS)
+#include CORBA_CLIENT_HEADER(SALOMEDS_Attributes)
+
#include "MEDFactoryClient.hxx"
#include "MEDModule.hxx"
#include "Basics_Utils.hxx"
STDLOG("Creating ProcessingController actions");
int processingToolbarId = _salomeModule->createTool("Processing", "ProcessingToolbar");
- int processingMenuId = _salomeModule->createMenu(tr("MENU_PROCESSING"), -1, 1);
+ int processingMenuId = _salomeModule->createMenu(tr("MENU_PROCESSING"), -1, -1, 12);
// Change underlying mesh (note that this action creates a new field in
// the workspace that corresponds to a copy of the selected field
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);
void
ProcessingController::OnChangeUnderlyingMesh()
{
- // We need a studyEditor updated on the active study
- _studyEditor->updateActiveStudy();
-
- // 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);
- //int fieldId = _studyEditor->getParameterInt(soField,FIELD_SERIES_ID);
- int fieldId = _studyEditor->getParameterInt(soField,FIELD_ID);
+ SALOMEDS::SObject_var soObj = listOfSObject->at(0);
+ std::string name(_studyEditor->getName(soObj));
+ if (soObj->_is_nil() || name == "MEDCalc")
+ return;
+
+ 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;
+ }
+
// _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
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);
void
ProcessingController::OnInterpolateField()
{
- // We need a studyEditor updated on the active study
- _studyEditor->updateActiveStudy();
-
// 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);
- int fieldId = _studyEditor->getParameterInt(soField,FIELD_ID);
+ SALOMEDS::SObject_var soObj = listOfSObject->at(0);
+ std::string name(_studyEditor->getName(soObj));
+ if (soObj->_is_nil() || name == "MEDCalc")
+ return;
+
+ 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;
+ }
+
// _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
void
ProcessingController::OnInterpolateFieldInputValidated()
{
+ STDLOG("Interpolate Field");
MEDCALC::InterpolationParameters params;
params.precision = _dlgInterpolateField->getPrecision();
STDLOG("precision = " << params.precision);
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);