X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FMEDCalc%2Ftui%2Fmedpresentation.py;h=870220a09afb8a8ccb87ed597fee1bcaaac1c3c1;hb=a0b5c06463265eb41b0deb37aff955065aece96f;hp=0395826b586f6d214a8a72bfd7147bb567ae0f44;hpb=b23988dad1f2a39ed6630f1ee4eb090e240d9b27;p=modules%2Fmed.git diff --git a/src/MEDCalc/tui/medpresentation.py b/src/MEDCalc/tui/medpresentation.py index 0395826b5..870220a09 100644 --- a/src/MEDCalc/tui/medpresentation.py +++ b/src/MEDCalc/tui/medpresentation.py @@ -1,4 +1,4 @@ -# Copyright (C) 2011-2015 CEA/DEN, EDF R&D +# Copyright (C) 2011-2019 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 @@ -18,40 +18,222 @@ # import medcalc -import MEDCALC -from medcalc.medevents import notifyGui_addPresentation +import MEDCALC, SALOME +from medcalc.medevents import notifyGui_addPresentation, notifyGui_removePresentation, notifyGui_error, notifyGui_modifyPresentation +from functools import reduce __manager = medcalc.medcorba.factory.getPresentationManager() -def MakeScalarMap(proxy, viewMode=MEDCALC.VIEW_MODE_REPLACE): +def MakeMeshView(meshID, + viewMode=MEDCALC.VIEW_MODE_DEFAULT, + meshMode=MEDCALC.MESH_MODE_DEFAULT): # Create the presentation instance in CORBA engine # The engine in turn creates the ParaView pipeline elements + params = MEDCALC.MeshViewParameters(meshID, meshMode) + try: + presentation_id = __manager.makeMeshView(params, viewMode) + notifyGui_addPresentation(meshID, presentation_id) + return presentation_id + except SALOME.SALOME_Exception as e: + notifyGui_error("An error occurred while creating the mesh view:\n" + e.details.text) + raise Exception(e.details.text) - print "In MakeScalarMap (Python)" - print "viewMode:", viewMode, " [", type(viewMode), "]" +def MakeScalarMap(proxy, + viewMode=MEDCALC.VIEW_MODE_DEFAULT, + displayedComponent=MEDCALC.DISPLAY_DEFAULT, + scalarBarRange=MEDCALC.SCALAR_BAR_RANGE_DEFAULT, + colorMap=MEDCALC.COLOR_MAP_DEFAULT + ): + # Create the presentation instance in CORBA engine + # The engine in turn creates the ParaView pipeline elements + params = MEDCALC.ScalarMapParameters(proxy.id, displayedComponent, scalarBarRange, colorMap) + try: + presentation_id = __manager.makeScalarMap(params, viewMode) + notifyGui_addPresentation(proxy.id, presentation_id) + return presentation_id + except SALOME.SALOME_Exception as e: + notifyGui_error("An error occurred while creating the scalar map:\n" + e.details.text) + raise Exception(e.details.text) - params = MEDCALC.ScalarMapParameters(proxy.id, viewMode) - presentation_id = __manager.makeScalarMap(params) - notifyGui_addPresentation(proxy.id, presentation_id) -# +def MakeContour(proxy, + viewMode=MEDCALC.VIEW_MODE_DEFAULT, + scalarBarRange=MEDCALC.SCALAR_BAR_RANGE_DEFAULT, + colorMap=MEDCALC.COLOR_MAP_DEFAULT, + nbContours=MEDCALC.NB_CONTOURS_DEFAULT + ): + params = MEDCALC.ContourParameters(proxy.id, scalarBarRange, colorMap, nbContours) + try: + presentation_id = __manager.makeContour(params, viewMode) + notifyGui_addPresentation(proxy.id, presentation_id) + return presentation_id + except SALOME.SALOME_Exception as e: + notifyGui_error("An error occurred while creating the contour:\n" + e.details.text) + raise Exception(e.details.text) -def MakeIsoSurface(): - print "Not implemented yet" # -def MakeVectorField(): - print "Not implemented yet" -# +def MakeVectorField(proxy, + viewMode=MEDCALC.VIEW_MODE_DEFAULT, + scalarBarRange=MEDCALC.SCALAR_BAR_RANGE_DEFAULT, + colorMap=MEDCALC.COLOR_MAP_DEFAULT + ): + # Create the presentation instance in CORBA engine + # The engine in turn creates the ParaView pipeline elements + params = MEDCALC.VectorFieldParameters(proxy.id, scalarBarRange, colorMap) + try: + presentation_id = __manager.makeVectorField(params, viewMode) + notifyGui_addPresentation(proxy.id, presentation_id) + return presentation_id + except SALOME.SALOME_Exception as e: + notifyGui_error("An error occurred while creating the vector field:\n" + e.details.text) + raise Exception(e.details.text) -def MakeSlices(): - print "Not implemented yet" -# +def MakeSlices(proxy, + viewMode=MEDCALC.VIEW_MODE_DEFAULT, + displayedComponent=MEDCALC.DISPLAY_DEFAULT, + scalarBarRange=MEDCALC.SCALAR_BAR_RANGE_DEFAULT, + colorMap=MEDCALC.COLOR_MAP_DEFAULT, + sliceOrientation=MEDCALC.SLICE_ORIENTATION_DEFAULT, + nbSlices=MEDCALC.NB_SLICES_DEFAULT): + # Create the presentation instance in CORBA engine + # The engine in turn creates the ParaView pipeline elements + params = MEDCALC.SlicesParameters(proxy.id, displayedComponent,scalarBarRange, colorMap, + sliceOrientation, nbSlices) + try: + presentation_id = __manager.makeSlices(params, viewMode) + notifyGui_addPresentation(proxy.id, presentation_id) + return presentation_id + except SALOME.SALOME_Exception as e: + notifyGui_error("An error occurred while creating the slices:\n" + e.details.text) + raise Exception(e.details.text) -def MakeDeflectionShape(): - print "Not implemented yet" -# -def MakePointSprite(): - print "Not implemented yet" +def MakeDeflectionShape(proxy, + viewMode=MEDCALC.VIEW_MODE_DEFAULT, + scalarBarRange=MEDCALC.SCALAR_BAR_RANGE_DEFAULT, + colorMap=MEDCALC.COLOR_MAP_DEFAULT + ): + # Create the presentation instance in CORBA engine + # The engine in turn creates the ParaView pipeline elements + params = MEDCALC.DeflectionShapeParameters(proxy.id, scalarBarRange, colorMap) + try: + presentation_id = __manager.makeDeflectionShape(params, viewMode) + notifyGui_addPresentation(proxy.id, presentation_id) + return presentation_id + except SALOME.SALOME_Exception as e: + notifyGui_error("An error occurred while creating the deflection shape:\n" + e.details.text) + raise Exception(e.details.text) + + +def MakePointSprite(proxy, + viewMode=MEDCALC.VIEW_MODE_DEFAULT, + displayedComponent=MEDCALC.DISPLAY_DEFAULT, + scalarBarRange=MEDCALC.SCALAR_BAR_RANGE_DEFAULT, + colorMap=MEDCALC.COLOR_MAP_DEFAULT + ): + # Create the presentation instance in CORBA engine + # The engine in turn creates the ParaView pipeline elements + params = MEDCALC.PointSpriteParameters(proxy.id, displayedComponent, scalarBarRange, colorMap) + try: + presentation_id = __manager.makePointSprite(params, viewMode) + notifyGui_addPresentation(proxy.id, presentation_id) + return presentation_id + except SALOME.SALOME_Exception as e: + notifyGui_error("An error occurred while creating the point sprite:\n" + e.details.text) + raise Exception(e.details.text) + +def RemovePresentation(presentation_id): + ok = __manager.removePresentation(presentation_id) + if ok: + notifyGui_removePresentation(presentation_id) # + +def __GetGENERICParameters(tag, presentation_id): + exec("params = __manager.get%sParameters(presentation_id)" % tag) + return locals()['params'] + +GetMeshViewParameters = lambda pres_id: __GetGENERICParameters("MeshView", pres_id) +GetScalarMapParameters = lambda pres_id: __GetGENERICParameters("ScalarMap", pres_id) +GetContourParameters = lambda pres_id: __GetGENERICParameters("Contour", pres_id) +GetSlicesParameters = lambda pres_id: __GetGENERICParameters("Slices", pres_id) +GetPointSpriteParameters = lambda pres_id: __GetGENERICParameters("PointSprite", pres_id) +GetVectorFieldParameters = lambda pres_id: __GetGENERICParameters("VectorField", pres_id) +GetDeflectionShapeParameters = lambda pres_id: __GetGENERICParameters("DeflectionShape", pres_id) + + +def __UpdateGENERIC(tag, presentation_id, params): + exec("__manager.update%s(presentation_id, params)" % tag) + notifyGui_modifyPresentation(presentation_id) + +UpdateMeshView = lambda pres_id, params: __UpdateGENERIC("MeshView", pres_id, params) +UpdateScalarMap = lambda pres_id, params: __UpdateGENERIC("ScalarMap", pres_id, params) +UpdateContour = lambda pres_id, params: __UpdateGENERIC("Contour", pres_id, params) +UpdateSlices = lambda pres_id, params: __UpdateGENERIC("Slices", pres_id, params) +UpdateVectorField = lambda pres_id, params: __UpdateGENERIC("VectorField", pres_id, params) +UpdatePointSprite = lambda pres_id, params: __UpdateGENERIC("PointSprite", pres_id, params) +UpdateDeflectionShape = lambda pres_id, params: __UpdateGENERIC("DeflectionShape", pres_id, params) + +def ComputeCellAverageSize(obj): + """ + @return the average cell size + """ + bb, nCells = obj.GetDataInformation().GetBounds(), obj.GetDataInformation().GetNumberOfCells() + bb = list(zip(bb[::2], bb[1::2])) + deltas = [x[1]-x[0] for x in bb] + ## Filter out null dimensions: + avgDelta = sum(deltas) / 3.0 + deltas = [d for d in deltas if abs(d) > 1.0e-12*avgDelta] + ## + vol = reduce(lambda x,y:x*y, deltas, 1.0) + cellSize = (vol/nCells)**(1.0/float(len(deltas))) + return cellSize + +def GetDomainCenter(obj): + """ + @return the center of the domain as the central point of the bounding box + """ + bb = obj.GetDataInformation().GetBounds() + bb = list(zip(bb[::2], bb[1::2])) + mids = [x[0] + 0.5*(x[1]-x[0]) for x in bb] + return mids + +def GetSliceOrigins(obj, nbSlices, normal): + """ + Compute all origin points for the position of the slices. + @param normal is a list of 3 floats either 0 or 1 indicating the normal vector of the slices + """ + from math import sqrt + bb = obj.GetDataInformation().GetBounds() + bb = list(zip(bb[::2], bb[1::2])) + origin = [x[0] + 0.5*(x[1]-x[0]) for x in bb] + deltas = [x[1]-x[0] for x in bb] + # Compute extent of slices: + l = [normal[i]*deltas[i]**2 for i in range(3)] # either the X extend, or the XY diagonal, or the XYZ diagonal + plus = lambda x,y: x+y + extent = sqrt(reduce(plus, l, 0.0)) + norm = sqrt(reduce(plus, normal, 0.0)) + normal = [normal[i]/norm for i in range(3)] + origins = [] + step = extent/nbSlices + for j in range(nbSlices): + orig_j = [origin[i]+normal[i]*(-0.5*extent + step*(0.5+j)) for i in range(3)] + origins.append(orig_j) + return origins + +def SelectSourceField(obj, meshName, fieldName, discretisation): + """ + Properly set the AllArrays property of a MEDReader source to point to the correct field. + Setting the fieldName to void string is allowed (meaning we work on the mesh only). + """ + if fieldName == "": + return + tree = obj.GetProperty("FieldsTreeInfo")[::2] + it = None + for t in tree: + arr = t.split("/") + arr = arr[:-1] + arr[-1].split("@@][@@") + if arr[1] == meshName and arr[3] == fieldName and arr[4] == discretisation: + obj.AllArrays = [t] + return + raise Exception("Field not found")