118 lines
4.7 KiB
Python
Executable File
118 lines
4.7 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# -*- coding: UTF-8 no BOM -*-
|
|
|
|
import os,sys,vtk
|
|
import numpy as np
|
|
from optparse import OptionParser
|
|
import damask
|
|
|
|
scriptName = os.path.splitext(os.path.basename(__file__))[0]
|
|
scriptID = ' '.join([scriptName,damask.version])
|
|
|
|
|
|
# --------------------------------------------------------------------
|
|
# MAIN
|
|
# --------------------------------------------------------------------
|
|
|
|
parser = OptionParser(option_class=damask.extendableOption, usage='%prog options [file[s]]', description = """
|
|
Create hexahedral voxels around points in an ASCIItable.
|
|
|
|
""", version = scriptID)
|
|
|
|
parser.add_option('-d', '--deformed',
|
|
dest = 'deformed',
|
|
type = 'string', metavar = 'string',
|
|
help = 'deformed coordinate label [%default]')
|
|
parser.add_option('-c','--coordinates',
|
|
dest = 'coords',
|
|
type = 'string', metavar='string',
|
|
help = 'undeformed coordinates label [%default]')
|
|
parser.set_defaults(deformed = 'ipdeformedcoord',
|
|
coords = 'ipinitialcoord',
|
|
)
|
|
|
|
(options, filenames) = parser.parse_args()
|
|
|
|
|
|
# --- loop over input files -------------------------------------------------------------------------
|
|
|
|
if filenames == []: filenames = [None]
|
|
|
|
for name in filenames:
|
|
try:
|
|
table = damask.ASCIItable(name = name,
|
|
buffered = False, readonly = True)
|
|
except: continue
|
|
damask.util.report(scriptName,name)
|
|
|
|
# --------------- interprete header -----------------------------------------------------------------
|
|
table.head_read()
|
|
errors=[]
|
|
if table.label_dimension(options.deformed) != 3: errors.append('columns "{}" have dimension {}'.format(options.deformed,
|
|
table.label_dimension(options.deformed)))
|
|
if table.label_dimension(options.coords) != 3: errors.append('coordinates {} are not a vector.'.format(options.coords))
|
|
|
|
table.data_readArray([options.coords,options.deformed])
|
|
|
|
# --------------- figure out size and grid ---------------------------------------------------------
|
|
coords = [{},{},{}]
|
|
for i in xrange(len(table.data)):
|
|
for j in xrange(3):
|
|
coords[j][str(table.data[i,table.label_index(options.coords)+j])] = True
|
|
grid = np.array(map(len,coords),'i')
|
|
size = grid/np.maximum(np.ones(3,'d'),grid-1.0)* \
|
|
np.array([max(map(float,coords[0].keys()))-min(map(float,coords[0].keys())),\
|
|
max(map(float,coords[1].keys()))-min(map(float,coords[1].keys())),\
|
|
max(map(float,coords[2].keys()))-min(map(float,coords[2].keys())),\
|
|
],'d') # size from bounding box, corrected for cell-centeredness
|
|
|
|
size = np.where(grid > 1, size, min(size[grid > 1]/grid[grid > 1])) # spacing for grid==1 set to smallest among other spacings
|
|
|
|
# ------------------------------------------ process data ---------------------------------------
|
|
hexPoints = np.array([[-1,-1,-1],
|
|
[ 1,-1,-1],
|
|
[ 1, 1,-1],
|
|
[-1, 1,-1],
|
|
[-1,-1, 1],
|
|
[ 1,-1, 1],
|
|
[ 1, 1, 1],
|
|
[-1, 1, 1],
|
|
])
|
|
|
|
halfDelta = 0.5*size/grid
|
|
|
|
Points = vtk.vtkPoints()
|
|
Hex = vtk.vtkHexahedron()
|
|
uGrid = vtk.vtkUnstructuredGrid()
|
|
|
|
for p in table.data:
|
|
for i,h in enumerate(hexPoints):
|
|
pointID = Points.InsertNextPoint(p[table.label_index(options.deformed):table.label_index(options.deformed)+3]+h*halfDelta)
|
|
Hex.GetPointIds().SetId(i,pointID)
|
|
|
|
uGrid.InsertNextCell(Hex.GetCellType(), Hex.GetPointIds())
|
|
|
|
uGrid.SetPoints(Points)
|
|
|
|
# ------------------------------------------ output result ---------------------------------------
|
|
|
|
if name:
|
|
writer = vtk.vtkXMLUnstructuredGridWriter()
|
|
(directory,filename) = os.path.split(name)
|
|
writer.SetDataModeToBinary()
|
|
writer.SetCompressorTypeToZLib()
|
|
writer.SetFileName(os.path.join(directory,os.path.splitext(filename)[0]\
|
|
+'.'+writer.GetDefaultFileExtension()))
|
|
else:
|
|
writer = vtk.vtkDataSetWriter()
|
|
writer.WriteToOutputStringOn()
|
|
writer.SetHeader('# powered by '+scriptID)
|
|
|
|
if vtk.VTK_MAJOR_VERSION <= 5: writer.SetInput(uGrid)
|
|
else: writer.SetInputData(uGrid)
|
|
writer.Write()
|
|
if name is None: sys.stdout.write(writer.GetOutputString()[0:writer.GetOutputStringLength()])
|
|
|
|
table.close() # close input ASCII table
|
|
|