-# Copyright (C) 2011-2016 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
import medcalc
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 MakeMeshView(proxy,
+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(proxy.id, meshMode)
+ params = MEDCALC.MeshViewParameters(meshID, meshMode)
try:
presentation_id = __manager.makeMeshView(params, viewMode)
- notifyGui_addPresentation(proxy.id, presentation_id)
+ notifyGui_addPresentation(meshID, presentation_id)
return presentation_id
except SALOME.SALOME_Exception as e:
- notifyGui_error("An error occured while creating the mesh view:\n" + e.details.text)
+ notifyGui_error("An error occurred while creating the mesh view:\n" + e.details.text)
raise Exception(e.details.text)
notifyGui_addPresentation(proxy.id, presentation_id)
return presentation_id
except SALOME.SALOME_Exception as e:
- notifyGui_error("An error occured while creating the scalar map:\n" + e.details.text)
+ notifyGui_error("An error occurred while creating the scalar map:\n" + e.details.text)
raise Exception(e.details.text)
def MakeContour(proxy,
notifyGui_addPresentation(proxy.id, presentation_id)
return presentation_id
except SALOME.SALOME_Exception as e:
- notifyGui_error("An error occured while creating the contour:\n" + e.details.text)
+ notifyGui_error("An error occurred while creating the contour:\n" + e.details.text)
raise Exception(e.details.text)
#
def MakeVectorField(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.VectorFieldParameters(proxy.id, displayedComponent, scalarBarRange, colorMap)
+ 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 occured while creating the vector field:\n" + e.details.text)
+ notifyGui_error("An error occurred while creating the vector field:\n" + e.details.text)
raise Exception(e.details.text)
def MakeSlices(proxy,
notifyGui_addPresentation(proxy.id, presentation_id)
return presentation_id
except SALOME.SALOME_Exception as e:
- notifyGui_error("An error occured while creating the slices:\n" + e.details.text)
+ notifyGui_error("An error occurred while creating the slices:\n" + e.details.text)
raise Exception(e.details.text)
-##
-#
-#def MakeDeflectionShape(proxy,
-# viewMode=MEDCALC.VIEW_MODE_DEFAULT
-# ):
-# params = MEDCALC.DeflectionShapeParameters(proxy.id, viewMode)
-# presentation_id = __manager.makeDeflectionShape(params)
-# notifyGui_addPresentation(proxy.id, presentation_id)
-# return presentation_id
-##
-#
+
+
+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,
notifyGui_addPresentation(proxy.id, presentation_id)
return presentation_id
except SALOME.SALOME_Exception as e:
- notifyGui_error("An error occured while creating the point sprite:\n" + e.details.text)
+ notifyGui_error("An error occurred while creating the point sprite:\n" + e.details.text)
raise Exception(e.details.text)
def RemovePresentation(presentation_id):
#
def __GetGENERICParameters(tag, presentation_id):
- exec "params = __manager.get%sParameters(presentation_id)" % tag
- return params
+ 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)
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)
+GetDeflectionShapeParameters = lambda pres_id: __GetGENERICParameters("DeflectionShape", pres_id)
def __UpdateGENERIC(tag, presentation_id, params):
- exec "__manager.update%s(presentation_id, params)" % tag
+ exec("__manager.update%s(presentation_id, params)" % tag)
notifyGui_modifyPresentation(presentation_id)
UpdateMeshView = lambda pres_id, params: __UpdateGENERIC("MeshView", 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)
+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 = zip(bb[::2], bb[1::2])
+ 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/3.0) # necessarily 3D in ParaView
+ 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 = zip(bb[::2], bb[1::2])
+ bb = list(zip(bb[::2], bb[1::2]))
mids = [x[0] + 0.5*(x[1]-x[0]) for x in bb]
return mids
-# Taken from paraview.simple from CEA ParaView's version:
-def SetDefaultScaleFactor(active=None):
- """Provides a good display to the bounding box of the mesh and min / max of the field.
- This method available for filters: Warp By Vector, Glyph and Tensor Glyph"""
- if not active:
- active = GetActiveSource()
- if not active:
- return
- name = active.__class__.__name__
- if (name == 'WarpByVector' or name == 'TensorGlyph') and hasattr(active, 'ScaleFactor'):
- import math
- datainfo = active.GetProperty("Input").SMProperty.GetProxy(0).GetDataInformation()
- if not datainfo:
- active.ScaleFactor = 1.0
- return
- nbcells = datainfo.GetNumberOfCells()
- nbpoints = datainfo.GetNumberOfPoints()
- nbelem = nbcells
- if nbelem == 0:
- nbelem = nbpoints
- abounds = datainfo.GetBounds()
- volume = 1
- vol = 0
- idim = 0
- i = 0
- eps = 1.0e-38
- while i < 6 :
- vol = math.fabs( abounds[i+1] - abounds[i] )
- if vol > 0:
- idim += 1
- volume *= vol
- i += 2
- if nbelem == 0 or math.fabs(idim) < eps:
- active.ScaleFactor = 0.0
- return
- volume /= nbelem
- scalefactor = pow( volume, 1.0 / idim )
- maximum = 1.0
- property = active.GetProperty('ScaleFactor')
- domain = None
- if property.GetDomain('vector_range').__class__.__name__ == 'vtkSMArrayRangeDomain':
- domain = property.GetDomain('vector_range')
- if property.GetDomain('tensor_range').__class__.__name__ == 'vtkSMArrayRangeDomain':
- domain = property.GetDomain('tensor_range')
- if not domain is None:
- if domain.GetMaximumExists(3):
- maximum = domain.GetMaximum(3)
- if math.fabs(maximum) > eps:
- scalefactor /= maximum
- active.ScaleFactor = scalefactor
- return
- if name == 'Glyph' and hasattr(active, 'ScaleFactor') and hasattr(active, 'UseCellsCenter') and hasattr(active, 'ScaleMode'):
- import math
- scaledextent = 1.0
- property = active.GetProperty('ScaleFactor')
- bounds_domain = property.GetDomain('bounds')
- if bounds_domain.__class__.__name__ == 'vtkSMBoundsDomain':
- if bounds_domain.GetMaximumExists(0):
- scaledextent = bounds_domain.GetMaximum(0)
- usecellscenter = active.GetProperty('UseCellsCenter').GetData()
- sdomain = "cells_"
- if usecellscenter == 0:
- sdomain = "points_"
- divisor = 1.0
- scalemode_domain = active.GetProperty('ScaleMode')
- scalemode = scalemode_domain.ConvertValue(scalemode_domain.GetData())
- if scalemode == 0:
- sdomain += "scalar_range"
- domain = property.GetDomain(sdomain)
- if domain.__class__.__name__ == 'vtkSMArrayRangeDomain':
- if domain.GetMaximumExists(0):
- divisor = domain.GetMaximum(0)
- if scalemode == 1 or scalemode == 2:
- sdomain += "vector_range"
- domain = property.GetDomain(sdomain)
- if domain.__class__.__name__ == 'vtkSMArrayRangeDomain':
- if domain.GetMaximumExists(3):
- divisor = domain.GetMaximum(3)
- divisor = math.fabs(divisor)
- if divisor < 0.000000001:
- divisor = 1
- scalefactor = scaledextent / divisor
- active.ScaleFactor = scalefactor
- return
-
def GetSliceOrigins(obj, nbSlices, normal):
"""
Compute all origin points for the position of the slices.
"""
from math import sqrt
bb = obj.GetDataInformation().GetBounds()
- bb = zip(bb[::2], bb[1::2])
+ 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:
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")