2013-05-06 22:07:54 +05:30
#!/usr/bin/env python
2014-04-02 00:11:14 +05:30
# -*- coding: UTF-8 no BOM -*-
2013-05-06 22:07:54 +05:30
2013-05-07 18:27:34 +05:30
import os , numpy , string , math , sys
2013-05-06 22:25:44 +05:30
from optparse import OptionParser , Option
2013-05-08 21:29:51 +05:30
from vtk import *
2013-05-06 22:07:54 +05:30
# -----------------------------
def getHeader ( filename , sizeFastIndex , sizeSlowIndex , stepsize ) :
# -----------------------------
# returns header for ang file
2013-05-07 18:27:34 +05:30
# step size in micrometer
2013-05-06 22:07:54 +05:30
return ' \n ' . join ( [ \
' # TEM_PIXperUM 1.000000 ' , \
' # x-star 1.000000 ' , \
' # y-star 1.000000 ' , \
' # z-star 1.000000 ' , \
' # WorkingDistance 18.000000 ' , \
' # ' , \
' # Phase 1 ' , \
' # MaterialName XX ' , \
' # Formula XX ' , \
' # Info ' , \
' # Symmetry 43 ' , \
' # LatticeConstants 2.870 2.870 2.870 90.000 90.000 90.000 ' , \
' # NumberFamilies 1 ' , \
' # hklFamilies 1 1 0 1 0.000000 1 ' , \
' # Categories 0 0 0 0 0 ' , \
' # ' , \
' # GRID: SqrGrid ' , \
2013-05-07 18:27:34 +05:30
' # XSTEP: ' + str ( stepsize * 1e6 ) , \
' # YSTEP: ' + str ( stepsize * 1e6 ) , \
2013-05-06 22:07:54 +05:30
' # NCOLS_ODD: ' + str ( sizeFastIndex ) , \
' # NCOLS_EVEN: ' + str ( sizeFastIndex ) , \
' # NROWS: ' + str ( sizeSlowIndex ) , \
' # ' , \
' # OPERATOR: ' + string . replace ( ' $Id$ ' , ' \n ' , ' \\ n ' ) , \
' # ' , \
' # SAMPLEID: %s ' % filename , \
' # ' , \
' # SCANID: ' , \
' # ' , \
] ) + ' \n '
# -----------------------------
def positiveRadians ( angle ) :
# -----------------------------
# returns positive angle in radians
# gets angle in degrees
angle = math . radians ( float ( angle ) )
while angle < 0.0 :
angle + = 2.0 * math . pi
return angle
# -----------------------------
2013-05-07 18:27:34 +05:30
def getDataLine ( angles , x , y , validData = True ) :
2013-05-06 22:07:54 +05:30
# -----------------------------
# returns string of one line in ang file
# convention in ang file: y coordinate comes first and is fastest index
2013-05-07 18:27:34 +05:30
# positions in micrometer
2013-05-06 22:07:54 +05:30
info = { True : ( 9999.9 , 1.0 , 0 , 99999 , 0.0 ) ,
False : ( - 1.0 , - 1.0 , - 1 , - 1 , 1.0 ) }
2013-05-07 18:27:34 +05:30
return ' %9.5f %9.5f %9.5f %12.5f %12.5f %6.1f %6.3f %2i %6i %6.3f \n ' % ( tuple ( map ( positiveRadians , angles ) ) + ( y * 1e6 , x * 1e6 ) + info [ validData ] )
2013-05-06 22:07:54 +05:30
# --------------------------------------------------------------------
# MAIN FUNCTION STARTS HERE
# --------------------------------------------------------------------
parser = OptionParser ( usage = ' % prog options [file[s]] ' , description = """
Builds a ang files from a vtk file .
""" + string.replace( ' $Id$ ' , ' \n ' , ' \\ n ' )
)
parser . add_option ( ' --disp ' , ' --displacement ' , dest = ' dispLabel ' , type = ' string ' , \
help = ' label of displacements [ %d efault] ' )
parser . add_option ( ' --euler ' , dest = ' eulerLabel ' , type = ' string ' , nargs = 3 , \
help = ' labels of euler angles [ %d efault] ' )
parser . add_option ( ' -n ' , ' --normal ' , dest = ' normal ' , type = ' float ' , nargs = 3 , \
help = ' normal of slices in direction of increasing slice numbers [ %d efault] ' )
parser . add_option ( ' -u ' , ' --up ' , dest = ' up ' , type = ' float ' , nargs = 3 ,
help = ' up direction of slices [ %d efault] ' )
parser . add_option ( ' -i ' , ' --slices ' , dest = ' Nslices ' , type = ' int ' , \
help = ' number of slices [ %d efault] ' )
parser . add_option ( ' -d ' , ' --distance ' , dest = ' distance ' , type = ' float ' , \
help = ' slice distance [ %d efault] ' )
2013-05-07 18:27:34 +05:30
parser . add_option ( ' -s ' , ' --scale ' , dest = ' scale ' , type = ' float ' , \
help = ' scale length from vtk file [ %d efault] ' )
2013-05-06 22:07:54 +05:30
parser . add_option ( ' -r ' , ' --resolution ' , dest = ' resolution ' , type = ' float ' ,
help = ' scaling factor for resolution [ %d efault] ' )
parser . add_option ( ' --hex ' , ' --hexagonal ' , dest = ' hexagonal ' , action = ' store_true ' ,
help = ' use in plane hexagonal grid [ %d efault] ' )
parser . add_option ( ' --interpolation ' , dest = ' interpolation ' , type = ' int ' , \
help = ' number of points for linear interpolation [ %d efault] ' )
parser . add_option ( ' --verbose ' , dest = ' verbose ' , action = ' store_true ' ,
help = ' verbose mode [ %d efault] ' )
2013-05-08 21:29:51 +05:30
parser . add_option ( ' --visualize ' , dest = ' visualize ' , action = ' store_true ' ,
help = ' visualize geometry [ %d efault] ' )
2013-05-06 22:07:54 +05:30
parser . set_defaults ( dispLabel = ' displacement ' )
2013-05-09 17:02:34 +05:30
parser . set_defaults ( eulerLabel = [ ' 1_1_eulerangles ' , ' 1_2_eulerangles ' , ' 1_3_eulerangles ' ] )
2013-05-06 22:07:54 +05:30
parser . set_defaults ( hexagonal = False )
2013-05-07 18:27:34 +05:30
parser . set_defaults ( normal = [ 0.0 , 0.0 , - 1.0 ] )
2013-05-06 22:07:54 +05:30
parser . set_defaults ( up = [ 0.0 , 1.0 , 0.0 ] )
parser . set_defaults ( Nslices = 1 )
parser . set_defaults ( distance = 0.0 )
2013-05-07 18:27:34 +05:30
parser . set_defaults ( scale = 1.0 )
2013-05-06 22:07:54 +05:30
parser . set_defaults ( resolution = 1.0 )
parser . set_defaults ( dispScaling = 1.0 )
parser . set_defaults ( interpolation = 1 )
2013-05-08 21:29:51 +05:30
parser . set_defaults ( verbose = False )
parser . set_defaults ( visualize = False )
2013-05-06 22:07:54 +05:30
( options , filenames ) = parser . parse_args ( )
#--- SANITY CHECKS
# check for valid filenames
for filename in filenames :
if not os . path . exists ( filename ) :
parser . error ( ' file " %s " does not exist ' % filename )
if not os . path . splitext ( filename ) [ 1 ] == ' .vtk ' :
parser . error ( ' " %s " : need vtk file ' % filename )
# check for othogonality of normal and up vector
if numpy . dot ( numpy . array ( options . normal ) , numpy . array ( options . up ) ) > 1e-3 :
parser . error ( ' normal vector and up vector have to be orthogonal ' )
# check for options that are not yet implemented
if options . interpolation > 1 :
parser . error ( ' interpolation not yet supported ' )
if options . hexagonal :
parser . error ( ' hexagonal grid not yet supported ' )
#--- ITERATE OVER FILES AND PROCESS THEM
for filename in filenames :
# Read the source file
2013-05-07 18:27:34 +05:30
if options . verbose : sys . stdout . write ( " \n READING VTK FILE \n " )
2013-05-06 22:07:54 +05:30
reader = vtkUnstructuredGridReader ( )
reader . SetFileName ( filename )
reader . ReadAllScalarsOn ( )
reader . ReadAllVectorsOn ( )
reader . Update ( )
undeformedMesh = reader . GetOutput ( )
2013-05-07 18:27:34 +05:30
2013-05-06 22:07:54 +05:30
# Get euler angles from cell data
2013-05-07 18:27:34 +05:30
if options . verbose : sys . stdout . write ( " \n GETTING EULER ANGLES \n " )
2013-05-06 22:07:54 +05:30
angles = { }
2013-05-07 18:27:34 +05:30
for i in range ( reader . GetNumberOfScalarsInFile ( ) ) :
2013-05-06 22:07:54 +05:30
scalarName = reader . GetScalarsNameInFile ( i )
if scalarName in options . eulerLabel :
angles [ scalarName ] = undeformedMesh . GetCellData ( ) . GetScalars ( scalarName )
2013-05-07 18:27:34 +05:30
if options . verbose : sys . stdout . write ( " found scalar with name %s \n " % scalarName )
2013-05-06 22:07:54 +05:30
if len ( angles ) < 3 : # found data for all three euler angles?
for label in options . eulerLabel :
if not label in angles . keys ( ) :
parser . error ( ' Could not find scalar data with name %s ' % label )
# Get deformed mesh
2013-05-07 18:27:34 +05:30
if options . verbose : sys . stdout . write ( " \n DEFORM MESH \n " )
2013-05-06 22:07:54 +05:30
warpVector = vtkWarpVector ( )
2013-05-23 02:53:01 +05:30
undeformedMesh . GetPointData ( ) . SetActiveVectors ( options . dispLabel )
2013-05-06 22:07:54 +05:30
warpVector . SetInput ( undeformedMesh )
warpVector . Update ( )
2013-05-23 02:53:01 +05:30
deformedMesh = warpVector . GetOutput ( )
2013-05-06 22:07:54 +05:30
box = deformedMesh . GetBounds ( ) # bounding box in mesh system
if options . verbose :
2013-05-07 18:27:34 +05:30
sys . stdout . write ( " bounding box in lab system \n " )
sys . stdout . write ( " x ( % .8f % .8f ) \n " % ( box [ 0 ] , box [ 1 ] ) )
sys . stdout . write ( " y ( % .8f % .8f ) \n " % ( box [ 2 ] , box [ 3 ] ) )
sys . stdout . write ( " z ( % .8f % .8f ) \n " % ( box [ 4 ] , box [ 5 ] ) )
2013-05-06 22:07:54 +05:30
# Get cell centers of deformed mesh (position of ips)
2013-05-07 18:27:34 +05:30
if options . verbose : sys . stdout . write ( " \n GETTING CELL CENTERS OF DEFORMED MESH \n " )
2013-05-06 22:07:54 +05:30
cellCenter = vtkCellCenters ( )
cellCenter . SetVertexCells ( 0 ) # do not generate vertex cells, just points
cellCenter . SetInput ( deformedMesh )
cellCenter . Update ( )
meshIPs = cellCenter . GetOutput ( )
# Get outer surface of deformed mesh
2013-05-07 18:27:34 +05:30
if options . verbose : sys . stdout . write ( " \n GETTING OUTER SURFACE OF DEFORMED MESH \n " )
2013-05-06 22:07:54 +05:30
surfaceFilter = vtkDataSetSurfaceFilter ( )
surfaceFilter . SetInput ( deformedMesh )
surfaceFilter . Update ( )
surface = surfaceFilter . GetOutput ( )
# Get coordinate system for ang files
# z-vector is normal to slices
# x-vector corresponds to the up-direction
# "R" rotates coordinates from the mesh system into the TSL system
2013-05-07 18:27:34 +05:30
if options . verbose : sys . stdout . write ( " \n GETTING COORDINATE SYSTEM FOR ANG FILES \n " )
2013-05-06 22:07:54 +05:30
z = numpy . array ( options . normal , dtype = ' float ' )
z = z / numpy . linalg . norm ( z )
x = numpy . array ( options . up , dtype = ' float ' )
x = x / numpy . linalg . norm ( x )
y = numpy . cross ( z , x )
R = numpy . array ( [ x , y , z ] )
2013-05-07 18:27:34 +05:30
if options . verbose :
sys . stdout . write ( " axis (x: up direction, z: slice normal) \n " )
sys . stdout . write ( " x ( % .8f % .8f % .8f ) \n " % tuple ( x ) )
sys . stdout . write ( " y ( % .8f % .8f % .8f ) \n " % tuple ( y ) )
sys . stdout . write ( " z ( % .8f % .8f % .8f ) \n " % tuple ( z ) )
2013-05-06 22:07:54 +05:30
# Get bounding box in rotated system (x,y,z)
2013-05-07 18:27:34 +05:30
if options . verbose : sys . stdout . write ( " \n GETTING BOUNDING BOX IN ROTATED SYSTEM \n " )
2013-05-06 22:07:54 +05:30
rotatedbox = [ [ numpy . inf , - numpy . inf ] for i in range ( 3 ) ] # bounding box in rotated TSL system
for n in range ( 8 ) : # loop over eight vertices of mesh bounding box
vert = numpy . array ( [ box [ 0 + ( n / 1 ) % 2 ] ,
box [ 2 + ( n / 2 ) % 2 ] ,
box [ 4 + ( n / 4 ) % 2 ] ] ) # vertex in mesh system
rotatedvert = numpy . dot ( R , vert ) # vertex in rotated system
for i in range ( 3 ) :
rotatedbox [ i ] [ 0 ] = min ( rotatedbox [ i ] [ 0 ] , rotatedvert [ i ] )
rotatedbox [ i ] [ 1 ] = max ( rotatedbox [ i ] [ 1 ] , rotatedvert [ i ] )
2013-05-07 18:27:34 +05:30
if options . verbose :
sys . stdout . write ( " bounding box in rotated system \n " )
sys . stdout . write ( " x ( % .8f % .8f ) \n " % tuple ( rotatedbox [ 0 ] ) )
sys . stdout . write ( " y ( % .8f % .8f ) \n " % tuple ( rotatedbox [ 1 ] ) )
sys . stdout . write ( " z ( % .8f % .8f ) \n " % tuple ( rotatedbox [ 2 ] ) )
2013-05-06 22:07:54 +05:30
# Correct bounding box so that a multiplicity of the resolution fits into it
# and get number of points and extent in each (rotated) axis direction
2013-05-07 18:27:34 +05:30
if options . verbose : sys . stdout . write ( " \n CORRECTING EXTENT OF BOUNDING BOX IN ROTATED SYSTEM \n " )
2013-05-06 22:07:54 +05:30
correction = [ ]
Npoints = [ ]
extent = [ rotatedbox [ i ] [ 1 ] - rotatedbox [ i ] [ 0 ] for i in range ( 3 ) ]
for i in range ( 2 ) :
Npoints . extend ( [ int ( math . ceil ( extent [ i ] / options . resolution ) ) ] )
correction . extend ( [ float ( Npoints [ i ] ) * options . resolution - extent [ i ] ] )
if options . distance > 0.0 :
Npoints . extend ( [ int ( math . ceil ( extent [ 2 ] / options . distance ) ) ] )
correction . extend ( [ float ( Npoints [ 2 ] ) * options . distance - extent [ 2 ] ] )
else :
Npoints . extend ( [ options . Nslices ] )
correction . extend ( [ 0.0 ] )
options . distance = extent [ 2 ] / float ( options . Nslices )
for i in range ( 3 ) :
rotatedbox [ i ] [ 0 ] = rotatedbox [ i ] [ 0 ] - 0.5 * correction [ i ]
rotatedbox [ i ] [ 1 ] = rotatedbox [ i ] [ 1 ] + 0.5 * correction [ i ]
extent [ i ] = rotatedbox [ i ] [ 1 ] - rotatedbox [ i ] [ 0 ]
2013-05-07 18:27:34 +05:30
NpointsPerSlice = Npoints [ 0 ] * Npoints [ 1 ]
totalNpoints = NpointsPerSlice * Npoints [ 2 ]
2013-05-06 22:07:54 +05:30
if options . verbose :
2013-05-07 18:27:34 +05:30
sys . stdout . write ( " corrected bounding box in rotated system \n " )
sys . stdout . write ( " x ( % .8f % .8f ) \n " % tuple ( rotatedbox [ 0 ] ) )
sys . stdout . write ( " y ( % .8f % .8f ) \n " % tuple ( rotatedbox [ 1 ] ) )
sys . stdout . write ( " z ( % .8f % .8f ) \n " % tuple ( rotatedbox [ 2 ] ) )
2013-05-06 22:07:54 +05:30
# Generate new regular point grid for ang files
# Use "polydata" object with points as single vertices
# beware of TSL convention: y direction is fastest index
2013-05-07 18:27:34 +05:30
if options . verbose : sys . stdout . write ( " \n GENERATING POINTS FOR POINT GRID " )
2013-05-06 22:07:54 +05:30
points = vtkPoints ( )
for k in xrange ( Npoints [ 2 ] ) :
for j in xrange ( Npoints [ 0 ] ) :
for i in xrange ( Npoints [ 1 ] ) : # y is fastest index
rotatedpoint = numpy . array ( [ rotatedbox [ 0 ] [ 0 ] + ( float ( j ) + 0.5 ) * options . resolution ,
rotatedbox [ 1 ] [ 0 ] + ( float ( i ) + 0.5 ) * options . resolution ,
rotatedbox [ 2 ] [ 0 ] + ( float ( k ) + 0.5 ) * options . distance ] ) # point in rotated system
point = numpy . dot ( R . T , rotatedpoint ) # point in mesh system
points . InsertNextPoint ( list ( point ) )
2013-05-07 18:27:34 +05:30
if options . verbose :
sys . stdout . write ( " \r GENERATING POINTS FOR POINT GRID %d %% " % ( 100 * ( Npoints [ 1 ] * ( k * Npoints [ 0 ] + j ) + i + 1 ) / totalNpoints ) )
sys . stdout . flush ( )
if options . verbose :
sys . stdout . write ( " \n number of slices: %i \n " % Npoints [ 2 ] )
sys . stdout . write ( " slice spacing: %.8f \n " % options . distance )
2013-05-09 17:02:34 +05:30
if Npoints [ 2 ] > 1 :
sys . stdout . write ( " number of points per slice: %i = %i rows * %i points in row \n " % ( NpointsPerSlice , Npoints [ 0 ] , Npoints [ 1 ] ) )
2013-05-07 18:27:34 +05:30
sys . stdout . write ( " grid resolution: %.8f \n " % options . resolution )
if options . verbose : sys . stdout . write ( " \n GENERATING VERTICES FOR POINT GRID " )
2013-05-06 22:07:54 +05:30
vertices = vtkCellArray ( )
2013-05-07 18:27:34 +05:30
for i in xrange ( totalNpoints ) :
2013-05-06 22:07:54 +05:30
vertex = vtkVertex ( )
vertex . GetPointIds ( ) . SetId ( 0 , i ) # each vertex consists of exactly one (index 0) point with ID "i"
vertices . InsertNextCell ( vertex )
2013-05-07 18:27:34 +05:30
if options . verbose :
sys . stdout . write ( " \r GENERATING VERTICES FOR POINT GRID %d %% " % ( 100 * ( i + 1 ) / totalNpoints ) )
sys . stdout . flush ( )
2013-05-06 22:07:54 +05:30
2013-05-07 18:27:34 +05:30
if options . verbose : sys . stdout . write ( " \n \n GENERATING POINT GRID \n " )
2013-05-06 22:25:44 +05:30
pointgrid = vtkPolyData ( )
2013-05-06 22:07:54 +05:30
pointgrid . SetPoints ( points )
pointgrid . SetVerts ( vertices )
pointgrid . Update ( )
# Find out which points reside inside mesh geometry
2013-05-07 18:27:34 +05:30
if options . verbose : sys . stdout . write ( " \n IDENTIFYING POINTS INSIDE MESH GEOMETRY \n " )
2013-05-06 22:07:54 +05:30
enclosedPoints = vtkSelectEnclosedPoints ( )
enclosedPoints . SetSurface ( surface )
enclosedPoints . SetInput ( pointgrid )
enclosedPoints . Update ( )
# Build kdtree from mesh IPs and match mesh IPs to point grid
# could also be done with nearest neighbor search from damask.core, would possibly be faster ?
2013-05-07 18:27:34 +05:30
if options . verbose : sys . stdout . write ( " \n BUILDING MAPPING OF GRID POINTS " )
2013-05-06 22:07:54 +05:30
kdTree = vtkKdTree ( )
kdTree . BuildLocatorFromPoints ( meshIPs . GetPoints ( ) )
gridToMesh = [ ]
ids = vtkIdList ( )
2013-05-07 18:27:34 +05:30
NenclosedPoints = 0
2013-05-06 22:07:54 +05:30
for i in range ( pointgrid . GetNumberOfPoints ( ) ) :
gridToMesh . append ( [ ] )
if enclosedPoints . IsInside ( i ) :
2013-05-07 18:27:34 +05:30
NenclosedPoints + = 1
2013-05-06 22:07:54 +05:30
kdTree . FindClosestNPoints ( options . interpolation , pointgrid . GetPoint ( i ) , ids ) # here one could use faster(?) "FindClosestPoint" if only first nearest neighbor required
for j in range ( ids . GetNumberOfIds ( ) ) :
gridToMesh [ - 1 ] . extend ( [ ids . GetId ( j ) ] )
2013-05-07 18:27:34 +05:30
if options . verbose :
sys . stdout . write ( " \r BUILDING MAPPING OF GRID POINTS %d %% " % ( 100 * ( i + 1 ) / totalNpoints ) )
sys . stdout . flush ( )
if options . verbose :
sys . stdout . write ( " \n Number of points inside mesh geometry %i \n " % NenclosedPoints )
sys . stdout . write ( " Number of points outside mesh geometry %i \n " % ( totalNpoints - NenclosedPoints ) )
2013-05-06 22:07:54 +05:30
# ITERATE OVER SLICES AND CREATE ANG FILE
2013-05-07 18:27:34 +05:30
if options . verbose :
sys . stdout . write ( " \n WRITING OUT ANG FILES \n " )
sys . stdout . write ( " scaling all length with %f \n " % options . scale )
2013-05-08 21:29:51 +05:30
x0 , y0 , z0 = numpy . dot ( R , pointgrid . GetPoint ( 0 ) ) # first point on slice defines origin
2013-05-06 22:07:54 +05:30
for sliceN in range ( Npoints [ 2 ] ) :
# Open file and write header
2013-05-07 18:27:34 +05:30
angfilename = eval ( ' " ' + eval ( " ' %% s_slice %% 0 %i i.ang ' % (math.log10(Npoints[2])+1) " ) + ' " % (os.path.splitext(filename)[0],sliceN+1) ' )
2013-05-06 22:07:54 +05:30
with open ( angfilename , ' w ' ) as angfile :
2013-05-07 18:27:34 +05:30
if options . verbose : sys . stdout . write ( " %s \n " % angfilename )
angfile . write ( getHeader ( filename , Npoints [ 1 ] , Npoints [ 0 ] , options . resolution * options . scale ) )
2013-05-06 22:07:54 +05:30
for i in xrange ( sliceN * NpointsPerSlice , ( sliceN + 1 ) * NpointsPerSlice ) : # Iterate over points on slice
# Get euler angles of closest IDs
if enclosedPoints . IsInside ( i ) :
phi = [ ]
for j in range ( len ( gridToMesh [ i ] ) ) :
IP = gridToMesh [ i ] [ j ]
phi . append ( [ ] )
for k in range ( 3 ) :
phi [ - 1 ] . extend ( [ angles [ options . eulerLabel [ k ] ] . GetValue ( IP ) ] )
else :
phi = [ [ 720 , 720 , 720 ] ] # fake angles
# Interpolate Euler angle
# NOT YET IMPLEMENTED, simply take the nearest neighbors values
interpolatedPhi = phi [ 0 ]
# write data to ang file
2013-05-07 18:27:34 +05:30
x , y , z = numpy . dot ( R , pointgrid . GetPoint ( i ) ) # point in rotated TSL system
2013-05-08 21:29:51 +05:30
x - = x0 # first point on slice defines origin
y - = y0 # first point on slice defines origin
2013-05-07 18:27:34 +05:30
x * = options . scale
y * = options . scale
angfile . write ( getDataLine ( interpolatedPhi , x , y , enclosedPoints . IsInside ( i ) ) )
2013-05-06 22:07:54 +05:30
2013-05-08 21:29:51 +05:30
# Visualize slices
if options . visualize :
meshMapper = vtkDataSetMapper ( )
meshMapper . SetInput ( surface )
meshMapper . ScalarVisibilityOff ( ) # do not use scalar data for coloring
meshActor = vtkActor ( )
meshActor . SetMapper ( meshMapper )
2013-05-13 15:06:19 +05:30
meshActor . GetProperty ( ) . SetOpacity ( 0.2 )
meshActor . GetProperty ( ) . SetColor ( 1.0 , 1.0 , 0 )
meshActor . GetProperty ( ) . BackfaceCullingOn ( )
# meshActor.GetProperty().SetEdgeColor(1,1,0.5)
# meshActor.GetProperty().EdgeVisibilityOn()
2013-05-08 21:29:51 +05:30
boxpoints = vtkPoints ( )
for n in range ( 8 ) :
P = [ rotatedbox [ 0 ] [ ( n / 1 ) % 2 ] ,
rotatedbox [ 1 ] [ ( n / 2 ) % 2 ] ,
rotatedbox [ 2 ] [ ( n / 4 ) % 2 ] ]
boxpoints . InsertNextPoint ( list ( numpy . dot ( R . T , numpy . array ( P ) ) ) )
box = vtkHexahedron ( )
for n , i in enumerate ( [ 0 , 1 , 3 , 2 , 4 , 5 , 7 , 6 ] ) :
box . GetPointIds ( ) . SetId ( n , i )
boxgrid = vtkUnstructuredGrid ( )
boxgrid . SetPoints ( boxpoints )
boxgrid . InsertNextCell ( box . GetCellType ( ) , box . GetPointIds ( ) )
boxsurfaceFilter = vtkDataSetSurfaceFilter ( )
boxsurfaceFilter . SetInput ( boxgrid )
boxsurfaceFilter . Update ( )
boxsurface = boxsurfaceFilter . GetOutput ( )
boxMapper = vtkDataSetMapper ( )
boxMapper . SetInput ( boxsurface )
boxActor = vtkActor ( )
boxActor . SetMapper ( boxMapper )
boxActor . GetProperty ( ) . SetLineWidth ( 2.0 )
2013-05-13 15:06:19 +05:30
boxActor . GetProperty ( ) . SetRepresentationToWireframe ( )
2013-05-08 21:29:51 +05:30
gridMapper = vtkDataSetMapper ( )
gridMapper . SetInput ( pointgrid )
gridActor = vtkActor ( )
gridActor . SetMapper ( gridMapper )
gridActor . GetProperty ( ) . SetColor ( 0 , 0 , 0 )
gridActor . GetProperty ( ) . SetPointSize ( 3 )
renderer = vtkRenderer ( )
renderWindow = vtkRenderWindow ( )
2013-05-13 15:06:19 +05:30
renderWindow . FullScreenOn ( )
2013-05-08 21:29:51 +05:30
renderWindow . AddRenderer ( renderer )
renderWindowInteractor = vtkRenderWindowInteractor ( )
renderWindowInteractor . SetRenderWindow ( renderWindow )
renderer . AddActor ( meshActor )
renderer . AddActor ( boxActor )
renderer . AddActor ( gridActor )
renderer . SetBackground ( 1 , 1 , 1 )
renderWindow . Render ( )
2013-05-13 15:06:19 +05:30
renderWindowInteractor . SetInteractorStyle ( vtkInteractorStyleTrackballCamera ( ) )
2013-05-08 21:29:51 +05:30
renderWindowInteractor . Start ( )