#!/usr/bin/env python # -*- coding: UTF-8 no BOM -*- import string,os,sys from optparse import OptionParser, Option # ----------------------------- class extendableOption(Option): # ----------------------------- # used for definition of new option parser action 'extend', which enables to take multiple option arguments # taken from online tutorial http://docs.python.org/library/optparse.html ACTIONS = Option.ACTIONS + ("extend",) STORE_ACTIONS = Option.STORE_ACTIONS + ("extend",) TYPED_ACTIONS = Option.TYPED_ACTIONS + ("extend",) ALWAYS_TYPED_ACTIONS = Option.ALWAYS_TYPED_ACTIONS + ("extend",) def take_action(self, action, dest, opt, value, values, parser): if action == "extend": lvalue = value.split(",") values.ensure_value(dest, []).extend(lvalue) else: Option.take_action(self, action, dest, opt, value, values, parser) # -------------------------------------------------------------------- # MAIN # -------------------------------------------------------------------- parser = OptionParser(option_class=extendableOption, usage='%prog options [file[s]]', description = """ Converts ang files (EBSD Data) from hexagonal grid to a pixel grid """ + string.replace('$Id$','\n','\\n') ) parser.add_option('-x', dest='columnX', action='store', type='int', \ help='column containing x coordinates [%default]') parser.set_defaults(columnX = 3) (options,filenames) = parser.parse_args() counterX = 0 counterY = 0 addPoints = -1 # No of doubled points (must be the same for each odd/even line, initializing with -1 make countin easy!) # ------------------------------------------ setup file handles --------------------------------------- files = [] if filenames == []: files.append({'name':'STDIN', 'input':sys.stdin, 'output':sys.stdout}) else: for name in filenames: if os.path.exists(name): files.append( {'name':name, 'input':open(name),'output':open(os.path.splitext(name)[0]\ +'_cub'+os.path.splitext(name)[1], 'w')}) # ------------------------------------------ loop over input files --------------------------------------- for file in files: print file['name'] x = 0 for line in file['input']: lineSplit=line.split() if lineSplit[0]=='#': if len(lineSplit)>2: # possibly interesting information if line.split()[2]=='SqrGrid': print 'The file is already a square grid file.' sys.exit() if lineSplit[1]=='XSTEP:': stepSizeX = float(lineSplit[2]) if lineSplit[1]=='YSTEP:': stepSizeY = float(lineSplit[2]) if lineSplit[2]=='HexGrid': line='# GRID: SqrGrid\n' # comments are not read by OIM, but still better to be correct if lineSplit[1]=='NCOLS_ODD:': NCols = int(int(lineSplit[2])*stepSizeX/stepSizeY) line='# NCOLS_ODD: %d\n'% NCols if lineSplit[1]=='NCOLS_EVEN:': line='# NCOLS_EVEN: %d\n'% NCols file['output'].write(line) else: # finished reading of header xOld = x x = float(lineSplit[options.columnX]) # current (original) x positions if x > xOld: # same line, increase X counterX+=1 else: # new line, increase in Y, reset X counterY+=1 addPoints = -1 # to start at zero counterX=0 lineFirstPart ='' # split line around x and y coordinate for i in xrange(options.columnX): lineFirstPart =lineFirstPart+' '+lineSplit[i] lineLastPart ='' for i in xrange(len(lineSplit)- (options.columnX+2)): lineLastPart =lineLastPart+' '+lineSplit[i+options.columnX+2] if counterX+addPoints < NCols: file['output'].write('%s %.6f %.6f %s\n' %(lineFirstPart,(counterX+addPoints)*stepSizeY, # write with new x and y position counterY*stepSizeY,lineLastPart)) if x - (counterX+addPoints)*stepSizeY > 0.5*stepSizeY and counterX+addPoints+1 < NCols: # double point (interpolation error) addPoints+=1 file['output'].write('%s %.6f %.6f %s\n' %(lineFirstPart,(counterX+addPoints)*stepSizeY,\ counterY*stepSizeY,lineLastPart))