X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FMEDCalc%2Fgui%2FProcessingController.cxx;h=3a55776052e1970676e2b1c9fed743c6e2098072;hb=0946beb4bbeefcdea393f97fcb63654e1dca2eab;hp=0665f3726ccb45bac1e8b534ac34097b92d8be45;hpb=118534af383c5242acbacca5f98d2ad0baf3fa38;p=modules%2Fmed.git diff --git a/src/MEDCalc/gui/ProcessingController.cxx b/src/MEDCalc/gui/ProcessingController.cxx index 0665f3726..3a5577605 100644 --- a/src/MEDCalc/gui/ProcessingController.cxx +++ b/src/MEDCalc/gui/ProcessingController.cxx @@ -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);