diff --git a/lib/damask/colormaps.py b/lib/damask/colormaps.py index 801f41174..c53289498 100644 --- a/lib/damask/colormaps.py +++ b/lib/damask/colormaps.py @@ -313,8 +313,14 @@ class Colormap(): left = Color('RGB',[1,1,1]), right = Color('RGB',[0,0,0]), interpolate = 'perceptualuniform', + predefined = None ): - + + if str(predefined).lower() in self.__predefined__: + left = self.__predefined__[predefined.lower()]['left'] + right= self.__predefined__[predefined.lower()]['right'] + interpolate = self.__predefined__[predefined.lower()]['interpolate'] + if left.__class__.__name__ != 'Color': left = Color() if right.__class__.__name__ != 'Color': @@ -325,28 +331,21 @@ class Colormap(): self.interpolate = interpolate + # ------------------------------------------------------------------ + def __repr__(self): + return 'Left: %s Right: %s'%(self.left,self.right) + + # ------------------------------------------------------------------ def invert(self): - temp = self.left - self.left = self.right - self.right = temp + (self.left, self.right) = (self.right, self.left) return self - - # ------------------------------------------------------------------ - def usePredefined(self,name='bluered'): - if name.lower() not in self.__predefined__: - raise KeyError('colormap "%s" is not defined, use one of "%s"'%(name,'" "'.join(self.__predefined__.keys()))) - self.left = self.__predefined__[name.lower()]['left'] - self.right= self.__predefined__[name.lower()]['right'] - self.interpolate = self.__predefined__[name.lower()]['interpolate'] - return self - # ------------------------------------------------------------------ def export(self,name = 'uniformPerceptualColorMap',\ format = 'paraview',\ - steps = 10,\ + steps = 2,\ crop = [-1.0,1.0], model = 'RGB'): ''' @@ -354,19 +353,18 @@ class Colormap(): arguments: name, format, steps, crop. format is one of (paraview, gmsh, raw, list). crop selects a (sub)range in [-1.0,1.0]. - generates - sequential map if one limiting color is either white or black, - diverging map otherwise. + generates sequential map if one limiting color is either white or black, + diverging map otherwise. ''' import copy,numpy,math - def interpolate_Msh(lo,hi,frac,model='RGB'): + def interpolate_Msh(lo, hi, frac): def rad_diff(a,b): return abs(a[2]-b[2]) - def adjust_hue(Msh_sat,Msh_unsat): # if saturation of one of the two colors is too less than the other, hue of the less + def adjust_hue(Msh_sat, Msh_unsat): # if saturation of one of the two colors is too less than the other, hue of the less if Msh_sat[0] >= Msh_unsat[0]: return Msh_sat[2] else: @@ -381,23 +379,28 @@ class Colormap(): M_mid = max(Msh1[0],Msh2[0],88.0) if frac < 0.5: Msh2 = numpy.array([M_mid,0.0,0.0],'d') - frac = 2.0*frac + frac *= 2.0 else: Msh1 = numpy.array([M_mid,0.0,0.0],'d') frac = 2.0*frac - 1.0 if Msh1[1] < 0.05 and Msh2[1] > 0.05: Msh1[2] = adjust_hue(Msh2,Msh1) elif Msh1[1] > 0.05 and Msh2[1] < 0.05: Msh2[2] = adjust_hue(Msh1,Msh2) - Msh = (1.0-frac)*Msh1 + frac*Msh2 - return Color('MSH',Msh).convertTo(model) + Msh = (1.0 - frac) * Msh1 + frac * Msh2 - def linearInterpolate(lo,hi,frac,model='RGB'): - color1 = numpy.array(lo.color[:]) - color2 = numpy.array(hi.expressAs(lo.model).color[:]) - color = (1.0 - frac) * color1 + frac * color2 - return Color(lo.model,color).convertTo(model) + return Color('MSH',Msh) + + def interpolate_linear(lo, hi, frac): + ''' + linearly interpolate color at given fraction between lower and higher color in model of lower color + ''' + + interpolation = (1.0 - frac) * numpy.array(lo.color[:]) \ + + frac * numpy.array(hi.expressAs(lo.model).color[:]) + + return Color(lo.model,interpolation) def write_paraview(RGB_vector): - colormap ='\n' + colormap ='\n' for i in range(len(RGB_vector)): colormap+='\n' colormap+='' @@ -418,23 +421,25 @@ class Colormap(): colors = [] - totalSteps = int(2.0*steps/(crop[1] - crop[0])) + frac = (numpy.array(crop) + 1.0)/2.0 - for i in range(totalSteps): - if self.interpolate == 'perceptualuniform': - color = interpolate_Msh(self.left.expressAs('MSH').color,self.right.expressAs('MSH').color,float(i)/(totalSteps-1),model) - elif self.interpolate == 'linear': - color = linearInterpolate(self.left,self.right,float(i)/(totalSteps-1),model) - else: - raise NameError('unknown interpolation method') - colors.append(color.color) + if self.interpolate == 'perceptualuniform': + for i in range(steps): + colors.append(interpolate_Msh(self.left.expressAs('MSH').color, + self.right.expressAs('MSH').color, + float(i)/(steps-1)*(frac[1]-frac[0])+frac[0])) + elif self.interpolate == 'linear': + for i in range(steps): + colors.append(interpolate_linear(self.left, + self.right, + float(i)/(steps-1)*(frac[1]-frac[0])+frac[0])) + else: + raise NameError('unknown interpolation method') - leftIndex = int(round((crop[0]-(-1.0))/(2.0/(totalSteps-1)))) - rightIndex = leftIndex + steps return {\ 'paraview': write_paraview, 'gmsh': write_gmsh, 'gom': write_GOM, 'raw': write_raw, 'list': lambda x: x, - }[format.lower()](colors[max(leftIndex,0):min(rightIndex,totalSteps)]) + }[format.lower()](map(lambda x:x.expressAs(model).color,colors)) diff --git a/processing/post/mentat_colorMap.py b/processing/post/mentat_colorMap.py index 786be7875..d096e92ff 100755 --- a/processing/post/mentat_colorMap.py +++ b/processing/post/mentat_colorMap.py @@ -56,7 +56,7 @@ def colorMap(colors,baseIdx=32): # MAIN FUNCTION STARTS HERE # ----------------------------- -parser = OptionParser(usage="%prog [options] configured scheme | (lower_h,s,l upper_h,s,l)", description = """ +parser = OptionParser(usage="%prog [options] predefinedScheme | (lower_h,s,l upper_h,s,l)", description = """ Changes the color map in MSC.Mentat. Interpolates colors between "lower_hsl" and "upper_hsl". @@ -84,7 +84,7 @@ parser.add_option("-n", "--colorcount", type = "int",\ help = "number of colors [%default]") parser.add_option("-v", "--verbose", action="store_true",\ dest = "verbose",\ - help = "write Mentat command stream also to stdout [%default]") + help = "write Mentat command stream also to STDOUT [%default]") parser.set_defaults(port = 40007) parser.set_defaults(baseIdx = 32) @@ -98,16 +98,19 @@ msg = [] (options, colors) = parser.parse_args() -if len(colors) > 0 and colors[0] in damask.Colormap.__predefined__: - theMap = damask.Colormap().usePredefined(colors[0]) +if len(colors) == 0: + parser.error('missing color information') + +elif len(colors) == 1: + theMap = damask.Colormap(predefined = colors[0]) + +elif len(colors) == 2: + theMap = damask.Colormap(damask.Color('HSL',map(float, colors[0].split(','))), + damask.Color('HSL',map(float, colors[1].split(','))) ) + else: - if len(colors) == 2: - left = map(float, colors[0].split(',')) - right = map(float, colors[1].split(',')) - else: - left = [0.0,0.0,1.0] - right = [0.0,0.0,0.0] - theMap = damask.Colormap(damask.Color('HSL',left),damask.Color('HSL',right)) + theMap = damask.Colormap() + if options.inverse: theMap = theMap.invert() @@ -117,7 +120,7 @@ elif options.palette: for theColor in theMap.export(format='list',steps=options.colorcount): print '\t'.join(map(lambda x: str(int(255*x)),theColor)) else: -### connect to mentat and change colorMap +### connect to Mentat and change colorMap sys.path.append(damask.solver.Marc().libraryPath('../../')) try: from py_mentat import *