moved "predefined" to colormap init
cleaned interpolate to not change color model fixed color range cropping issue
This commit is contained in:
parent
63569b19b6
commit
6fd8407d6e
|
@ -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':
|
||||
|
@ -326,27 +332,20 @@ class Colormap():
|
|||
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
def invert(self):
|
||||
temp = self.left
|
||||
self.left = self.right
|
||||
self.right = temp
|
||||
return self
|
||||
def __repr__(self):
|
||||
return 'Left: %s Right: %s'%(self.left,self.right)
|
||||
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
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']
|
||||
def invert(self):
|
||||
(self.left, self.right) = (self.right, self.left)
|
||||
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 ='<ColorMap name="'+str(name)+'" space="RGB">\n'
|
||||
colormap ='<ColorMap name="'+str(name)+'" space="Diverging">\n'
|
||||
for i in range(len(RGB_vector)):
|
||||
colormap+='<Point x="'+str(i)+'" o="1" r="'+str(RGB_vector[i][0])+'" g="'+str(RGB_vector[i][1])+'" b="'+str(RGB_vector[i][2])+'"/>\n'
|
||||
colormap+='</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))
|
||||
|
|
|
@ -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 *
|
||||
|
|
Loading…
Reference in New Issue