centralize functionality
This commit is contained in:
parent
a26cba1457
commit
3231a49107
|
@ -40,35 +40,22 @@ parser.add_option('-f','--fill',
|
||||||
parser.set_defaults(offset = (0,0,0))
|
parser.set_defaults(offset = (0,0,0))
|
||||||
|
|
||||||
(options, filenames) = parser.parse_args()
|
(options, filenames) = parser.parse_args()
|
||||||
|
|
||||||
|
|
||||||
if filenames == []: filenames = [None]
|
if filenames == []: filenames = [None]
|
||||||
|
|
||||||
|
|
||||||
for name in filenames:
|
for name in filenames:
|
||||||
damask.util.report(scriptName,name)
|
damask.util.report(scriptName,name)
|
||||||
|
|
||||||
geom = damask.Geom.from_file(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
geom = damask.Geom.from_file(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||||
origin = geom.get_origin()
|
|
||||||
size = geom.get_size()
|
|
||||||
old = new = geom.get_grid()
|
|
||||||
offset = np.asarray(options.offset)
|
offset = np.asarray(options.offset)
|
||||||
|
|
||||||
if options.grid is not None:
|
if options.grid is not None:
|
||||||
new = np.maximum(1,
|
grid = np.maximum(1,
|
||||||
np.array([int(o*float(n.lower().replace('x',''))) if n.lower().endswith('x') \
|
np.array([int(o*float(n.lower().replace('x',''))) if n.lower().endswith('x') \
|
||||||
else int(n) for o,n in zip(old,options.grid)],dtype=int))
|
else int(n) for o,n in zip(geom.grid,options.grid)],dtype=int))
|
||||||
|
else:
|
||||||
|
grid = np.array(options.grid,dtype=int)
|
||||||
|
|
||||||
canvas = np.full(new,options.fill if options.fill is not None
|
damask.util.croak(geom.canvas(grid,np.asarray(options.offset),options.fill))
|
||||||
else np.nanmax(geom.microstructure)+1,geom.microstructure.dtype)
|
|
||||||
|
|
||||||
l = np.clip( offset, 0,np.minimum(old +offset,new)) # noqa
|
|
||||||
r = np.clip( offset+old,0,np.minimum(old*2+offset,new))
|
|
||||||
L = np.clip(-offset, 0,np.minimum(new -offset,old))
|
|
||||||
R = np.clip(-offset+new,0,np.minimum(new*2-offset,old))
|
|
||||||
canvas[l[0]:r[0],l[1]:r[1],l[2]:r[2]] = geom.microstructure[L[0]:R[0],L[1]:R[1],L[2]:R[2]]
|
|
||||||
|
|
||||||
|
|
||||||
damask.util.croak(geom.update(canvas,origin=origin+offset*size/old,rescale=True))
|
|
||||||
geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:]))
|
geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:]))
|
||||||
|
|
||||||
geom.to_file(sys.stdout if name is None else name,pack=False)
|
geom.to_file(sys.stdout if name is None else name,pack=False)
|
||||||
|
|
|
@ -22,8 +22,6 @@ Renumber sorted microstructure indices to 1,...,N.
|
||||||
""", version=scriptID)
|
""", version=scriptID)
|
||||||
|
|
||||||
(options, filenames) = parser.parse_args()
|
(options, filenames) = parser.parse_args()
|
||||||
|
|
||||||
|
|
||||||
if filenames == []: filenames = [None]
|
if filenames == []: filenames = [None]
|
||||||
|
|
||||||
for name in filenames:
|
for name in filenames:
|
||||||
|
|
|
@ -52,6 +52,7 @@ parser.add_option('-f', '--fill',
|
||||||
parser.set_defaults(degrees = False)
|
parser.set_defaults(degrees = False)
|
||||||
|
|
||||||
(options, filenames) = parser.parse_args()
|
(options, filenames) = parser.parse_args()
|
||||||
|
if filenames == []: filenames = [None]
|
||||||
|
|
||||||
if [options.rotation,options.eulers,options.matrix,options.quaternion].count(None) < 3:
|
if [options.rotation,options.eulers,options.matrix,options.quaternion].count(None) < 3:
|
||||||
parser.error('more than one rotation specified.')
|
parser.error('more than one rotation specified.')
|
||||||
|
@ -67,32 +68,11 @@ if options.matrix is not None:
|
||||||
if options.eulers is not None:
|
if options.eulers is not None:
|
||||||
rot = damask.Rotation.from_Eulers(np.array(options.eulers),degrees=options.degrees)
|
rot = damask.Rotation.from_Eulers(np.array(options.eulers),degrees=options.degrees)
|
||||||
|
|
||||||
eulers = rot.as_Eulers(degrees=True)
|
|
||||||
|
|
||||||
|
|
||||||
if filenames == []: filenames = [None]
|
|
||||||
|
|
||||||
for name in filenames:
|
for name in filenames:
|
||||||
damask.util.report(scriptName,name)
|
damask.util.report(scriptName,name)
|
||||||
|
|
||||||
geom = damask.Geom.from_file(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
geom = damask.Geom.from_file(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||||
size = geom.get_size()
|
damask.util.croak(geom.rotate(rot,options.fill))
|
||||||
grid = geom.get_grid()
|
|
||||||
origin = geom.get_origin()
|
|
||||||
microstructure = geom.get_microstructure()
|
|
||||||
fill = np.nanmax(microstructure)+1 if options.fill is None else options.fill
|
|
||||||
dtype = float if np.isnan(fill) or int(fill) != fill or microstructure.dtype==np.float else int
|
|
||||||
|
|
||||||
# These rotations are always applied in the reference coordinate system, i.e. (z,x,z) not (z,x',z'')
|
|
||||||
# this seems to be ok, see https://www.cs.utexas.edu/~theshark/courses/cs354/lectures/cs354-14.pdf
|
|
||||||
microstructure = ndimage.rotate(microstructure,eulers[2],(0,1),order=0,
|
|
||||||
prefilter=False,output=dtype,cval=fill) # rotation around z
|
|
||||||
microstructure = ndimage.rotate(microstructure,eulers[1],(1,2),order=0,
|
|
||||||
prefilter=False,output=dtype,cval=fill) # rotation around x
|
|
||||||
microstructure = ndimage.rotate(microstructure,eulers[0],(0,1),order=0,
|
|
||||||
prefilter=False,output=dtype,cval=fill) # rotation around z
|
|
||||||
|
|
||||||
damask.util.croak(geom.update(microstructure,origin=origin-(np.asarray(microstructure.shape)-grid)/2*size/grid,rescale=True))
|
|
||||||
geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:]))
|
geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:]))
|
||||||
|
|
||||||
geom.to_file(sys.stdout if name is None else name,pack=False)
|
geom.to_file(sys.stdout if name is None else name,pack=False)
|
||||||
|
|
|
@ -40,22 +40,16 @@ parser.set_defaults(origin = (0.0,0.0,0.0),
|
||||||
)
|
)
|
||||||
|
|
||||||
(options, filenames) = parser.parse_args()
|
(options, filenames) = parser.parse_args()
|
||||||
|
if filenames == []: filenames = [None]
|
||||||
|
|
||||||
sub = list(map(int,options.substitute))
|
sub = list(map(int,options.substitute))
|
||||||
|
|
||||||
|
|
||||||
if filenames == []: filenames = [None]
|
|
||||||
|
|
||||||
for name in filenames:
|
for name in filenames:
|
||||||
damask.util.report(scriptName,name)
|
damask.util.report(scriptName,name)
|
||||||
|
|
||||||
geom = damask.Geom.from_file(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
geom = damask.Geom.from_file(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||||
|
geom.renumber(sub[0::2],sub[1::2],origin=geom.origin+options.origin)
|
||||||
substituted = geom.get_microstructure()
|
geom.microstructure+= option.microstructure
|
||||||
for old,new in zip(sub[0::2],sub[1::2]): substituted[geom.microstructure==old] = new # substitute microstructure indices
|
damask.util.croak(geom)
|
||||||
substituted += options.microstructure # constant shift
|
|
||||||
|
|
||||||
damask.util.croak(geom.update(substituted,origin=geom.get_origin()+options.origin))
|
|
||||||
geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:]))
|
geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:]))
|
||||||
|
|
||||||
geom.to_file(sys.stdout if name is None else name,pack=False)
|
geom.to_file(sys.stdout if name is None else name,pack=False)
|
||||||
|
|
|
@ -10,6 +10,7 @@ from . import VTK
|
||||||
from . import util
|
from . import util
|
||||||
from . import Environment
|
from . import Environment
|
||||||
from . import grid_filters
|
from . import grid_filters
|
||||||
|
from . import Rotation
|
||||||
|
|
||||||
|
|
||||||
class Geom:
|
class Geom:
|
||||||
|
@ -581,3 +582,54 @@ class Geom:
|
||||||
|
|
||||||
#self.add_comments('geom.py:renumber v{}'.format(version)
|
#self.add_comments('geom.py:renumber v{}'.format(version)
|
||||||
return self.update(renumbered)
|
return self.update(renumbered)
|
||||||
|
|
||||||
|
|
||||||
|
def rotate(self,R,fill=None):
|
||||||
|
"""Rotate microstructure (pad if required)."""
|
||||||
|
if fill is None: fill = np.nanmax(self.microstructure) + 1
|
||||||
|
dtype = float if np.isnan(fill) or int(fill) != fill or self.microstructure.dtype==np.float else int
|
||||||
|
|
||||||
|
Eulers = R.as_Eulers(degrees=True)
|
||||||
|
# These rotations are always applied in the reference coordinate system, i.e. (z,x,z) not (z,x',z'')
|
||||||
|
# this seems to be ok, see https://www.cs.utexas.edu/~theshark/courses/cs354/lectures/cs354-14.pdf
|
||||||
|
microstructure = ndimage.rotate(self.microstructure,Eulers[2],(0,1),order=0,
|
||||||
|
prefilter=False,output=dtype,cval=fill) # rotation around z
|
||||||
|
microstructure = ndimage.rotate(microstructure,Eulers[1],(1,2),order=0,
|
||||||
|
prefilter=False,output=dtype,cval=fill) # rotation around x
|
||||||
|
microstructure = ndimage.rotate(microstructure,Eulers[0],(0,1),order=0,
|
||||||
|
prefilter=False,output=dtype,cval=fill) # rotation around z
|
||||||
|
|
||||||
|
origin = self.origin-(np.asarray(microstructure.shape)-self.grid)//2 * self.size/self.grid
|
||||||
|
|
||||||
|
#self.add_comments('geom.py:renumber v{}'.format(version)
|
||||||
|
return self.update(microstructure,origin=origin,rescale=True)
|
||||||
|
|
||||||
|
|
||||||
|
def canvas(self,grid=None,offset=None,fill=None):
|
||||||
|
"""Rotate microstructure (pad if required)."""
|
||||||
|
if fill is None: fill = np.nanmax(self.microstructure) + 1
|
||||||
|
dtype = float if np.isnan(fill) or int(fill) != fill or self.microstructure.dtype==np.float else int
|
||||||
|
|
||||||
|
canvas = np.full(self.grid if grid is None else grid,
|
||||||
|
fill if fill is not None else np.nanmax(self.microstructure)+1,
|
||||||
|
self.microstructure.dtype)
|
||||||
|
if offset is None: offset = 0
|
||||||
|
|
||||||
|
l = np.clip( offset, 0,np.minimum(self.grid +offset,grid)) # noqa
|
||||||
|
r = np.clip( offset+self.grid,0,np.minimum(self.grid*2+offset,grid))
|
||||||
|
L = np.clip(-offset, 0,np.minimum(grid -offset,self.grid))
|
||||||
|
R = np.clip(-offset+grid, 0,np.minimum(grid*2 -offset,self.grid))
|
||||||
|
|
||||||
|
canvas[l[0]:r[0],l[1]:r[1],l[2]:r[2]] = self.microstructure[L[0]:R[0],L[1]:R[1],L[2]:R[2]]
|
||||||
|
|
||||||
|
#self.add_comments('geom.py:renumber v{}'.format(version)
|
||||||
|
return self.update(canvas,origin=self.origin+offset*self.size/self.grid,rescale=True)
|
||||||
|
|
||||||
|
|
||||||
|
def substitute(self,from_microstructure,to_microstructure):
|
||||||
|
"""Substitude microstructure indices."""
|
||||||
|
substituted = self.get_microstructure()
|
||||||
|
for from_ms,to_ms in zip(from_microstructure,to_microstructure):
|
||||||
|
substituted[self.microstructure==from_ms] = to_ms
|
||||||
|
|
||||||
|
return self.update(substituted)
|
||||||
|
|
Loading…
Reference in New Issue