X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FMEDCalc%2Fcmp%2FMEDPresentationContour.cxx;h=f04f44f6b2f3de2a8d7910f27c35d3f3a1b98c78;hb=12e72b16e927a491139cde26adf98395bf222ce1;hp=a0f14a272cff8a35f3d7f4058e8b0faa26fdd18b;hpb=66cadb9dc3ae762594c248a2c407914fa0e39325;p=modules%2Fmed.git diff --git a/src/MEDCalc/cmp/MEDPresentationContour.cxx b/src/MEDCalc/cmp/MEDPresentationContour.cxx index a0f14a272..f04f44f6b 100644 --- a/src/MEDCalc/cmp/MEDPresentationContour.cxx +++ b/src/MEDCalc/cmp/MEDPresentationContour.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 @@ -19,39 +19,131 @@ #include "MEDPresentationContour.hxx" +#include +#undef LOG // should be fixed in KERNEL - double definition +#include + +#include + +const std::string MEDPresentationContour::TYPE_NAME = "MEDPresentationContour"; const std::string MEDPresentationContour::PROP_NB_CONTOUR = "nbContour"; +MEDPresentationContour::MEDPresentationContour(const MEDCALC::ContourParameters& params, + const MEDCALC::ViewModeType viewMode) : + MEDPresentation(params.fieldHandlerId, TYPE_NAME, viewMode, params.colorMap, params.scalarBarRange), + _params(params) +{ + setIntProperty(MEDPresentationContour::PROP_NB_CONTOUR, params.nbContours); +} + +void +MEDPresentationContour::initFieldMeshInfos() +{ + MEDPresentation::initFieldMeshInfos(); + _colorByType = "POINTS"; +} + +void +MEDPresentationContour::setNumberContours() +{ + std::ostringstream oss; + + oss << "min_max = " << _srcObjVar << ".PointData.GetArray('" << _fieldName << "').GetRange();"; + pushAndExecPyLine(oss.str()); oss.str(""); + oss << "delta = (min_max[1]-min_max[0])/float(" << _params.nbContours << ");"; + pushAndExecPyLine(oss.str()); oss.str(""); + oss << _objVar << ".Isosurfaces = [min_max[0]+0.5*delta+i*delta for i in range(" << _params.nbContours << ")];"; + pushAndExecPyLine(oss.str()); oss.str(""); +} + void MEDPresentationContour::internalGeneratePipeline() { -// PyGILState_STATE _gil_state = PyGILState_Ensure(); -// -// std::string cmd = std::string("import pvsimple as pvs;"); -// cmd += getRenderViewCommand(_params.viewMode); // define __view1 -// -// cmd += std::string("__obj1 = pvs.MEDReader(FileName='") + _fileName + std::string("');"); -// cmd += std::string("__isovolume1 = pvs.IsoVolume(Input=__obj1);"); -// cmd += std::string("__disp1 = pvs.Show(__isovolume1, __view1);"); -// cmd += std::string("pvs.ColorBy(__disp1, ('") + _fieldType + std::string("', '") + _fieldName + std::string("'));"); -// cmd += std::string("__disp1.SetScalarBarVisibility(__view1, True);"); -// cmd += std::string("__disp1.RescaleTransferFunctionToDataRangeOverTime();"); -// cmd += std::string("pvs.Render();"); -// -// cmd += getResetCameraCommand(); -// -// //std::cerr << "Python command:" << std::endl; -// //std::cerr << cmd << std::endl; -// PyRun_SimpleString(cmd.c_str()); -// // Retrieve Python object for internal storage: -// PyObject* obj = getPythonObjectFromMain("__isovolume1"); -// PyObject* disp = getPythonObjectFromMain("__disp1"); -// pushInternal(obj, disp); -// -// PyGILState_Release(_gil_state); + MEDPresentation::internalGeneratePipeline(); + + MEDPyLockWrapper lock; + + createSource(); + setTimestamp(); + + // Populate internal array of available components: + fillAvailableFieldComponents(); + if (getIntProperty(MEDPresentation::PROP_NB_COMPONENTS) > 1) + { + const char * msg = "Contour presentation only works for scalar field!"; // this message will appear in GUI too + STDLOG(msg); + throw KERNEL::createSalomeException(msg); + } + if (_params.nbContours < 1) + { + const char * mes = "Invalid number of contours!"; + STDLOG(mes); + throw KERNEL::createSalomeException(mes); + } + + setOrCreateRenderView(); // instantiate __viewXXX, needs to be after the exception above otherwise previous elements in the view will be hidden. + + // Contour needs point data: + applyCellToPointIfNeeded(); + + std::ostringstream oss; + oss << _objVar << " = pvs.Contour(Input=" << _srcObjVar << ");"; + pushAndExecPyLine(oss.str()); oss.str(""); + + showObject(); + + oss << _objVar << ".ContourBy = ['POINTS', '" << _fieldName << "'];"; + pushAndExecPyLine(oss.str()); oss.str(""); + + // Colorize contour + oss << _objVar << ".ComputeScalars = 1;"; + pushAndExecPyLine(oss.str()); oss.str(""); + + // Set number of contours + setNumberContours(); + + colorBy(); // see initFieldInfo() - necessarily POINTS because of the conversion above + showScalarBar(); + selectColorMap(); + rescaleTransferFunction(); + resetCameraAndRender(); } void MEDPresentationContour::updatePipeline(const MEDCALC::ContourParameters& params) { - // :TODO: + if (params.fieldHandlerId != _params.fieldHandlerId) + throw KERNEL::createSalomeException("Unexpected updatePipeline error! Mismatching fieldHandlerId!"); + + if (params.scalarBarRange != _params.scalarBarRange) + updateScalarBarRange(params.scalarBarRange); + if (params.colorMap != _params.colorMap) + updateColorMap(params.colorMap); + + if (params.nbContours != _params.nbContours) + { + if (params.nbContours < 1) + { + const char * mes = "Invalid number of contours!"; + STDLOG(mes); + throw KERNEL::createSalomeException(mes); + } + updateNbContours(params.nbContours); + } +} + +void +MEDPresentationContour::updateNbContours(const int nbContours) +{ + _params.nbContours = nbContours; + + // GUI helper: + setIntProperty(MEDPresentationContour::PROP_NB_CONTOUR, nbContours); + + // Update the pipeline: + { + MEDPyLockWrapper lock; + setNumberContours(); + pushAndExecPyLine("pvs.Render();"); + } }