PyVTK-0.4.74/0000755000175000017500000000000010567304606011604 5ustar pearupearuPyVTK-0.4.74/doc/0000755000175000017500000000000010567304606012351 5ustar pearupearuPyVTK-0.4.74/doc/index.html0000644000175000017500000000735610567254627014370 0ustar pearupearu PyVTK - Manipulate VTK files in Python

PyVTK ­ Tools for manipulating VTK files in Python

by Pearu Peterson

What's new?

0.4.73 (Feb 22, 2007)
Minor bug fixes.
0.4.71 (May 18, 2006)
Added numpy support. Bug fixes.
0.4.66 (January 26, 2003)
Fixed binary write of UnstructuredGrid.
0.4.62 (November 19, 2002)
Minor fixes.
0.4 (September 2, 2002)
Writing binary files works (thanks to Hans Fangohr).
0.4 (June 8, 2001)
VTK files reader (only for Python 2.x). Usage: VtkData(filename)
0.3 (May 21, 2001)
First release.

Introduction

PyVTK provides the following tools for manipulating Visualization Toolkit (VTK) files in Python:

VtkData
Create VTK file from Python objects. It fully supports VTK File Formats Standard 2.0 (see also VTK File Formats Standard 3.0). The features include:

Related software

Requirements

  1. Python (PyVTK is developed under Python 2.1, but it is tested to work also with Python 1.5.2 and 2.0)

Download

Snapshots of release:
rel-0.x/PyVTK-0.latest.tar.gz

Installation

To install PyVTK, unpack the source file, change to directory PyVTK-?.?.? and run python setup.py install, or make install if under Python 1.x.

CVS Repository

PyVTK is being developed under CVS and those who are interested in the latest version of PyVTK (possibly unstable) can get it from the repository as follows:
  1. First you need to login (the password is guest):
    > cvs -d :pserver:anonymous@cens.ioc.ee:/home/cvs login
    
  2. and then do the checkout:
    > cvs -z6 -d :pserver:anonymous@cens.ioc.ee:/home/cvs checkout python/pyvtk
    
  3. In the directory pyvtk you can get the updates by hitting
    > cvs -z6 update -P -d
    
You can browse PyVTK CVS repository here.
Pearu Peterson <pearu@cens.ioc.ee>
Last modified: Fri May 18 16:44:25 EET 2006
PyVTK-0.4.74/examples/0000755000175000017500000000000010567304606013422 5ustar pearupearuPyVTK-0.4.74/examples/example1.py0000644000175000017500000000221107304773331015504 0ustar pearupearu#!/usr/bin/env python import sys sys.path = ['..']+sys.path if sys.version[:3]=='1.5': from lib152 import * else: from lib import * #from pyvtk import * structure = PolyData(points=[[0,0,0],[1,0,0],[1,1,0],[0,1,0], [0,0,1],[1,0,1],[1,1,1],[0,1,1]], polygons=[[0,1,2,3],[4,5,6,7],[0,1,5,4], [2,3,7,6],[0,4,7,3],[1,2,6,5]]) pointdata = PointData(\ Scalars([0,1,2,3,4,5,6,7], name='sample_scalars', lookup_table='my_table'), LookupTable([[0,0,0,1],[1,0,0,1],[0,1,0,1],[1,1,0,1], [0,0,1,1],[1,0,1,1],[0,1,1,1],[1,1,1,1]], name='my_table')) celldata = CellData(\ Scalars([0,1,2,3,4,5], name='cell_scalars'), Normals([[0,0,-1],[0,0,1],[0,-1,0], [0,1,0],[-1,0,0],[1,0,0]], name='cell_normals'), Field('FieldData', cellIds=[[0],[1],[2],[3],[4],[5]], faceAttributes=[[0,1],[1,2],[2,3],[3,4],[4,5],[5,6]])) vtk = VtkData(structure,pointdata,celldata) vtk.tofile('example1','ascii') vtk.tofile('example1b','binary') vtk2 = VtkData('example1') PyVTK-0.4.74/examples/example2.py0000644000175000017500000000307407305502006015503 0ustar pearupearu#!/usr/bin/env python import sys sys.path = ['..']+sys.path if sys.version[:3]=='1.5': from lib152 import * else: from lib import * #from pyvtk import * vtk = VtkData(StructuredPoints([3,4,6]), PointData(Scalars([0,0,0,0,0,0,0,0,0,0,0,0, 0,5,10,15,20,25,25,20,15,10,5,0, 0,10,20,30,40,50,50,40,30,20,10,0, 0,10,20,30,40,50,50,40,30,20,10,0, 0,5,10,15,20,25,25,20,15,10,5,0, 0,0,0,0,0,0,0,0,0,0,0,0 ]))) vtk.tofile('example2') vtk.tofile('example2b','binary') vtk = VtkData('example2',only_structure = 1) def f(x,y,z): return x*y*z vtk.point_data.append(vtk.structure.Scalars(f,'x*y*z')) vtk.tofile('example2f_sp') pp = [(i,j,k) for k in range(6) for j in range(4) for i in range(3)] vtk = VtkData(StructuredGrid([3,4,6],pp)) vtk.point_data.append(vtk.structure.Scalars(f,'x*y*z')) vtk.tofile('example2f_sg') vtk = VtkData(RectilinearGrid(range(3),range(4),range(6))) vtk.point_data.append(vtk.structure.Scalars(f,'x*y*z')) vtk.tofile('example2f_rg') voxels = [] points = [] n = 0 for k in range(6): for j in range(4): for i in range(3): points.append((i,j,k)) if not (k==5 or j==3 or i==2): voxels.append([n,n+1,n+3,n+3+1,n+3*4,n+3*4+1,n+3*4+3,n+3*4+3+1]) n += 1 vtk = VtkData(UnstructuredGrid(points,voxel=voxels)) vtk.point_data.append(vtk.structure.Scalars(f,'x*y*z')) vtk.tofile('example2f_usg') PyVTK-0.4.74/examples/example3.py0000644000175000017500000000277107305502006015507 0ustar pearupearu#!/usr/bin/env python import sys sys.path = ['..']+sys.path if sys.version[:3]=='1.5': from lib152 import * else: from lib import * #from pyvtk import * points = [[0,0,0],[1,0,0],[2,0,0],[0,1,0],[1,1,0],[2,1,0], [0,0,1],[1,0,1],[2,0,1],[0,1,1],[1,1,1],[2,1,1], [0,1,2],[1,1,2],[2,1,2],[0,1,3],[1,1,3],[2,1,3], [0,1,4],[1,1,4],[2,1,4],[0,1,5],[1,1,5],[2,1,5], [0,1,6],[1,1,6],[2,1,6] ] vectors = [[1,0,0],[1,1,0],[0,2,0],[1,0,0],[1,1,0],[0,2,0], [1,0,0],[1,1,0],[0,2,0],[1,0,0],[1,1,0],[0,2,0], [0,0,1],[0,0,1],[0,0,1],[0,0,1],[0,0,1],[0,0,1], [0,0,1],[0,0,1],[0,0,1],[0,0,1],[0,0,1],[0,0,1], [0,0,1],[0,0,1],[0,0,1] ] vtk = VtkData(\ UnstructuredGrid(points, hexahedron=[[0,1,4,3,6,7,10,9], [1,2,5,4,7,8,11,10]], tetra=[[6,10,9,12], [5,11,10,14]], polygon=[15,16,17,14,13,12], triangle_strip=[18,15,19,16,20,17], quad=[22,23,20,19], triangle=[[21,22,18], [22,19,18]], line=[26,25], vertex=[24] ), PointData(Vectors(vectors),Scalars(range(27))), 'Unstructured Grid Example' ) vtk.tofile('example3') vtk.tofile('example3b','binary') VtkData('example3') PyVTK-0.4.74/lib/0000755000175000017500000000000010567304606012352 5ustar pearupearuPyVTK-0.4.74/lib/ColorScalars.py0000644000175000017500000000371107305502006015303 0ustar pearupearu#!/usr/bin/env python """ ColorScalars """ """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.2 $ $Date: 2001-05-31 17:48:54 $ Pearu Peterson """ __version__ = "$Id: ColorScalars.py,v 1.2 2001-05-31 17:48:54 pearu Exp $" import common import DataSetAttr class ColorScalars(DataSetAttr.DataSetAttr): """Holds VTK color scalars. Usage: ColorScalars( ,name = ) Attributes: scalars name Public methods: get_size() to_string(format = 'ascii') """ def __init__(self,scalars,name=None): self.name = self._get_name(name) self.scalars = self.get_n_seq_seq(scalars,self.default_value) def to_string(self,format='ascii'): ret = ['COLOR_SCALARS %s %s'%(self.name,len(self.scalars[0]))] seq = self.scalars if format=='binary': if not common.is_int255(seq): seq = self.float01_to_int255(seq) ret.append(self.seq_to_string(seq,format,'unsigned char')) else: if not common.is_float01(seq): seq = self.int255_to_float01(seq) ret.append(self.seq_to_string(seq,format,'float')) return '\n'.join(ret) def get_size(self): return len(self.scalars) def color_scalars_fromfile(f,n,sl): assert len(sl)==2 dataname = sl[0].strip() nvals = eval(sl[1]) scalars = [] while len(scalars) Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.3 $ $Date: 2001-06-13 08:35:00 $ Pearu Peterson """ __version__ = "$Id: Data.py,v 1.3 2001-06-13 08:35:00 pearu Exp $" import common class Data(common.Common): data_type = None def __init__(self,*args): if self.__class__.__name__ not in ['PointData','CellData']: raise TypeError,'use PointData or CellData instead of Data' self.data = [] self.length = None map(self.append,args) def append(self,obj): if not common.is_datasetattr(obj): self.error('expected DataSetAttr argument but got %s'%(type(obj))) raise TypeError if self.length is None: self.length = obj.get_size() if not isinstance(obj,LookupTable.LookupTable) and self.length != obj.get_size(): self.error('attribute data %s must be of length %s (as defined by first DataSetAttr) but got %s'%(`obj.__class__.__name__`,self.length,obj.get_size())) raise ValueError self.data.append(obj) def get_size(self): return self.length def to_string(self,format='ascii'): if self.data_type is None: raise TypeError,'use PointData or CellData instead of Data' ret = ['%s %s'%(self.data_type,self.length)] ret += [a.to_string(format) for a in self.data] return '\n'.join(ret) class PointData(Data): """ Usage: PointData() Attributes: data - list of DataSetAttr instances Public methods: get_size() to_string(format = 'ascii') append() """ data_type = 'POINT_DATA' class CellData(Data): """ Usage: CellData() Attributes: data - list of DataSetAttr instances Public methods: get_size() to_string(format = 'ascii') append() """ data_type = 'CELL_DATA' import LookupTable if __name__ == "__main__": import Scalars print PointData(Scalars.Scalars([2,3])) PyVTK-0.4.74/lib/DataSet.py0000644000175000017500000000663607305502006014252 0ustar pearupearu#!/usr/bin/env python """ DataSet """ """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.3 $ $Date: 2001-05-31 17:48:54 $ Pearu Peterson """ __version__ = "$Id: DataSet.py,v 1.3 2001-05-31 17:48:54 pearu Exp $" import common class DataSet(common.Common): """Abstract class. It describes the geometry and topology of VTK dataset. """ def get_size(self): if hasattr(self,'points'): return len(self.points) return reduce(lambda x,y:x*y,self.dimensions,1) def get_cell_size(self): return 0 def _check_dimensions(self): for i in range(3): d = self.dimensions[i] if not common.is_int(d): self.error('dimensions[%s] must be int but got %s'%(i,type(d))) return 1 if d<=0: self.error('dimensions[%s] must be positive int but got %s'%(i,d)) return 1 if hasattr(self,'points'): d = reduce(lambda x,y:x*y,self.dimensions,1) if len(self.points)!=d: self.error('mismatch of points length (%s) and dimensions size (%s)'%(len(self.points),d)) return 1 return 0 def _check_origin(self): for i in range(3): d = self.origin[i] if not common.is_number(d): self.error('origin[%s] must be number but got %s'%(i,type(d))) return 1 return 0 def _check_spacing(self): for i in range(3): d = self.spacing[i] if not common.is_number(d): self.error('spacing[%s] must be number but got %s'%(i,type(d))) return 1 if d<=0: self.error('spacing[%s] must be positive number but got %s'%(i,d)) return 1 return 0 def _check_int_seq(self,obj,mx_int): if common.is_sequence(obj): for o in obj: if self._check_int_seq(o,mx_int): return 1 elif not common.is_int(obj) or obj>=mx_int: return 1 return 0 def Scalars(self,func,name = None,lookup_table = None): return Scalars.Scalars([func(*p) for p in self.get_points()],name,lookup_table) def ColorScalars(self,func,name = None): return ColorScalars.ColorScalars([func(*p) for p in self.get_points()],name) def LookupTable(self,func,name = None): return LookupTable.LookupTable([func(*p) for p in self.get_points()],name) def Vectors(self,func,name = None): return Vectors.Vectors([func(*p) for p in self.get_points()],name) def Normals(self,func,name = None): return Normals.Normals([func(*p) for p in self.get_points()],name) def TextureCoordinates(self,func,name = None): return TextureCoordinates.TextureCoordinates([func(*p) for p in self.get_points()],name) def Tensors(self,func,name = None): return Tensors.Tensors([func(*p) for p in self.get_points()],name) def Field(self,func,name = None, **kws): return Field.Field([func(*p) for p in self.get_points()],name, **kws) import Scalars import ColorScalars import LookupTable import Vectors import Normals import TextureCoordinates import Tensors import Field PyVTK-0.4.74/lib/DataSetAttr.py0000644000175000017500000000312207305502006015070 0ustar pearupearu#!/usr/bin/env python """ DataSetAttr """ """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.2 $ $Date: 2001-05-31 17:48:54 $ Pearu Peterson """ __version__ = "$Id: DataSetAttr.py,v 1.2 2001-05-31 17:48:54 pearu Exp $" import common class DataSetAttr(common.Common): """Abstract class for VTK data.""" counters = {} default_value = 0 def _get_default_name(self): n = self.__class__.__name__ try: self.counters[n] += 1 except KeyError: self.counters[n] = 0 return self.__class__.__name__+str(self.counters[n]) def _get_name(self,name): if name is None: name = self._get_default_name() self.warning('Using name=%s'%(`name`)) return name if common.is_string(name): name = name.strip().replace(' ','_') if name: return name raise ValueError,'name=%s must be non-empty string'%(`name`) def _get_lookup_table(self,name): if name is None: name = 'default' self.warning('Using lookup_table=%s'%(`name`)) return name if common.is_string(name): name = name.strip().replace(' ','_') if name: return name raise ValueError,'lookup_table=%s must be nonempty string'%(`name`) if __name__ == "__main__": pass PyVTK-0.4.74/lib/Field.py0000644000175000017500000000530407305502006013737 0ustar pearupearu#!/usr/bin/env python """ Field """ """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.2 $ $Date: 2001-05-31 17:48:54 $ Pearu Peterson """ import DataSetAttr import common class Field(DataSetAttr.DataSetAttr): """Holds VTK Field. Usage: Field([,] arrname_1=, ..., arrname_k=) Attributes: data - dictionary of arrays name Public methods: get_size() to_string(format = 'ascii') """ def __init__(self,*args,**kws): if len(args): name = args[0] else: name = None if len(args)>1: self.warning('Ignoring all arguments except the first') self.name = self._get_name(name) data = {} mx = 0 for k,v in kws.items(): data[k] = self.get_n_seq_seq(v,self.default_value) mx = max([len(l) for l in data.values()]) for k,v in data.items(): if len(v) Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.2 $ $Date: 2001-05-31 17:48:54 $ Pearu Peterson """ __version__ = "$Id: LookupTable.py,v 1.2 2001-05-31 17:48:54 pearu Exp $" import common import DataSetAttr class LookupTable(DataSetAttr.DataSetAttr): """Holds VTK LookupTable. Usage: LookupTable( ,name = ) Attributes: table name Public methods: get_size() to_string(format = 'ascii') """ def __init__(self,table,name=None): self.name = self._get_name(name) self.table = self.get_n_seq_seq(table,[0,0,0,0]) if len(self.table[0])!=4: raise ValueError,'expected sequence of 4-sequences but got %s'%(len(self.table[0])) def to_string(self,format='ascii'): ret = ['LOOKUP_TABLE %s %s'%(self.name,len(self.table))] seq = self.table if format=='binary': if not common.is_int255(seq): seq = self.float01_to_int255(seq) ret.append(self.seq_to_string(seq,format,'unsigned char')) else: if not common.is_float01(seq): seq = self.int255_to_float01(seq) ret.append(self.seq_to_string(seq,format,'float')) return '\n'.join(ret) def get_size(self): return len(self.table) def lookup_table_fromfile(f,n,sl): tablename = sl[0] size = eval(sl[1]) table = [] while len(table)<4*size: table += map(eval,common._getline(f).split(' ')) assert len(table) == 4*size table2 = [] for i in range(0,len(table),4): table2.append(table[i:i+4]) return LookupTable(table2,tablename) if __name__ == "__main__": print LookupTable([[3,3],[4,3],240,3,2]).to_string() PyVTK-0.4.74/lib/Normals.py0000644000175000017500000000361407305502006014331 0ustar pearupearu#!/usr/bin/env python """ Normals """ """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.3 $ $Date: 2001-05-31 17:48:54 $ Pearu Peterson """ import DataSetAttr import math import common class Normals(DataSetAttr.DataSetAttr): """Holds VTK Normals. Usage: Normals( ,name = ) Attributes: normals name Public methods: get_size() to_string(format = 'ascii') """ def __init__(self,normals,name=None): self.name = self._get_name(name) seq = [] for v in self.get_3_tuple_list(normals,(self.default_value,)*3): n = math.sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]) if n==0: self.warning('cannot normalize zero vector') seq.append(v) elif n==1: seq.append(v) else: seq.append(tuple([c/n for c in v])) self.normals = seq def to_string(self,format='ascii'): t = self.get_datatype(self.normals) ret = ['NORMALS %s %s'%(self.name,t), self.seq_to_string(self.normals,format,t)] return '\n'.join(ret) def get_size(self): return len(self.normals) def normals_fromfile(f,n,sl): dataname = sl[0] datatype = sl[1].lower() assert datatype in ['bit','unsigned_char','char','unsigned_short','short','unsigned_int','int','unsigned_long','long','float','double'],`datatype` normals = [] while len(normals) < 3*n: normals += map(eval,common._getline(f).split(' ')) assert len(normals) == 3*n return Normals(normals,dataname) if __name__ == "__main__": print Normals([[3,3],[4,3.],240,3,2]).to_string() PyVTK-0.4.74/lib/PolyData.py0000644000175000017500000000753107566520653014456 0ustar pearupearu#!/usr/bin/env python """ PolyData """ """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.6 $ $Date: 2002-11-19 20:40:11 $ Pearu Peterson """ import DataSet import common class PolyData(DataSet.DataSet): """ Usage: PolyData(, vertices = lines = , polygons = triangle_strips = , ) Attributes: points vertices lines polygons triangle_strips Public methods: get_size() get_cell_size() to_string(format = 'ascii') get_points() (...) """ def __init__(self,points, vertices=[],lines=[],polygons=[],triangle_strips=[]): self.points = self.get_3_tuple_list(points,(0,0,0)) self.vertices = self.get_seq_seq(vertices,[]) self.lines = self.get_seq_seq(lines,[]) self.polygons = self.get_seq_seq(polygons,[]) self.triangle_strips = self.get_seq_seq(triangle_strips,[]) sz = len(self.points) for k in ['vertices','lines','polygons','triangle_strips']: if self._check_int_seq(getattr(self,k),sz): raise ValueError,'%s must be (seq of seq|seq) integers less than %s'%(k,sz) def to_string(self, format='ascii'): t = self.get_datatype(self.points) ret = ['DATASET POLYDATA', 'POINTS %s %s'%(self.get_size(),t), self.seq_to_string(self.points,format,t)] for k in ['vertices','lines','polygons','triangle_strips']: kv = getattr(self,k) if kv==[] or kv[0]==[]: continue sz = self._get_nof_objs(kv)+len(kv) ret += ['%s %s %s'%(k.upper(),len(kv),sz), self.seq_to_string([[len(v)]+list(v) for v in kv],format,'int')] return '\n'.join(ret) def get_cell_size(self): sz = 0 for k in ['vertices','lines','polygons','triangle_strips']: kv = getattr(self,k) if kv==[] or kv[0]==[]: continue sz += len(kv) return sz def get_points(self): return self.points def polydata_fromfile(f,self): """Use VtkData().""" points = [] vertices = [] lines = [] polygons = [] triangle_strips = [] l = common._getline(f) k,n,datatype = [s.strip().lower() for s in l.split(' ')] if k!='points': raise ValueError, 'expected points but got %s'%(`k`) n = eval(n) assert datatype in ['bit','unsigned_char','char','unsigned_short','short','unsigned_int','int','unsigned_long','long','float','double'],`datatype` self.message('\tgetting %s points'%n) while len(points) < 3*n: l = common._getline(f) points += map(eval,l.split(' ')) assert len(points)==3*n while 1: l = common._getline(f) if l is None: break sl = l.split(' ') k = sl[0].strip().lower() if k not in ['vertices','lines','polygons','triangle_strips']: break assert len(sl)==3 n,size = map(eval,[sl[1],sl[2]]) lst = [] while len(lst) < size: l = common._getline(f) lst += map(eval,l.split(' ')) assert len(lst)==size lst2 = [] j = 0 for i in range(n): lst2.append(lst[j+1:j+lst[j]+1]) j += lst[j]+1 exec '%s = lst2'%k return PolyData(points,vertices,lines,polygons,triangle_strips),l if __name__ == "__main__": print PolyData([[1,2],[2,4],4,5.4],[[1],[0]],[],[1,2,3]) PyVTK-0.4.74/lib/RectilinearGrid.py0000644000175000017500000000545107305502006015766 0ustar pearupearu#!/usr/bin/env python """ RectilinearGrid """ """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.3 $ $Date: 2001-05-31 17:48:54 $ Pearu Peterson """ import DataSet import common class RectilinearGrid(DataSet.DataSet): """ Usage: RectilinearGrid(x = , y = , z = ) Attributes: x y z dimensions Public methods: get_size() get_cell_size() to_string(format = 'ascii') get_points() (...) """ def __init__(self,x=None,y=None,z=None): self.x = self.get_seq(x,[0]) self.y = self.get_seq(y,[0]) self.z = self.get_seq(z,[0]) self.dimensions = (len(self.x),len(self.y),len(self.z)) if self._check_dimensions(): raise ValueError,'dimensions must be 3-tuple of ints >=1' def to_string(self, format='ascii'): tx = self.get_datatype(self.x) ty = self.get_datatype(self.y) tz = self.get_datatype(self.z) ret = ['DATASET RECTILINEAR_GRID', 'DIMENSIONS %s %s %s'%self.dimensions, 'X_COORDINATES %s %s'%(len(self.x),tx), self.seq_to_string(self.x,format,tx), 'Y_COORDINATES %s %s'%(len(self.y),ty), self.seq_to_string(self.y,format,ty), 'Z_COORDINATES %s %s'%(len(self.z),tz), self.seq_to_string(self.z,format,tz)] return '\n'.join(ret) def get_points(self): if hasattr(self,'points'): return self.points arr = [(x,y,z) for z in self.z for y in self.y for x in self.x] self.points = arr return arr def rectilinear_grid_fromfile(f,self): l = common._getline(f).split(' ') assert l[0].strip().lower() == 'dimensions' dims = map(eval,l[1:]) assert len(dims)==3 for c in 'xyz': l = common._getline(f) k,n,datatype = [s.strip().lower() for s in l.split(' ')] if k!=c+'_coordinates': raise ValueError, 'expected %s_coordinates but got %s'%(c,`k`) n = eval(n) assert datatype in ['bit','unsigned_char','char','unsigned_short','short','unsigned_int','int','unsigned_long','long','float','double'],`datatype` points = [] while len(points) < n: points += map(eval,common._getline(f).split(' ')) assert len(points)==n exec '%s_coords = points'%c assert map(len,[x_coords,y_coords,z_coords]) == dims return RectilinearGrid(x_coords,y_coords,z_coords),common._getline(f) if __name__ == "__main__": print RectilinearGrid([1,2,2,4,4,5.4]) PyVTK-0.4.74/lib/Scalars.py0000644000175000017500000000372707305502006014313 0ustar pearupearu#!/usr/bin/env python """ Scalars """ """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.3 $ $Date: 2001-05-31 17:48:54 $ Pearu Peterson """ __version__ = "$Id: Scalars.py,v 1.3 2001-05-31 17:48:54 pearu Exp $" import DataSetAttr import common class Scalars(DataSetAttr.DataSetAttr): """Holds VTK scalars. Usage: Scalars( ,name = , lookup_table = 'default') Attributes: scalars name lookup_table Public methods: get_size() to_string(format = 'ascii') """ def __init__(self,scalars,name=None,lookup_table=None): self.name = self._get_name(name) self.lookup_table = self._get_lookup_table(lookup_table) self.scalars = self.get_seq(scalars,[]) def to_string(self,format='ascii'): t = self.get_datatype(self.scalars) ret = ['SCALARS %s %s %s'%(self.name,t,1), 'LOOKUP_TABLE %s'%(self.lookup_table), self.seq_to_string(self.scalars,format,t)] return '\n'.join(ret) def get_size(self): return len(self.scalars) def scalars_fromfile(f,n,sl): dataname = sl[0] datatype = sl[1].lower() assert datatype in ['bit','unsigned_char','char','unsigned_short','short','unsigned_int','int','unsigned_long','long','float','double'],`datatype` if len(sl)>2: numcomp = eval(sl[2]) else: numcomp = 1 l = common._getline(f) l = l.split(' ') assert len(l)==2 and l[0].lower() == 'lookup_table' tablename = l[1] scalars = [] while len(scalars) < n: scalars += map(eval,common._getline(f).split(' ')) assert len(scalars)==n return Scalars(scalars,dataname,tablename) if __name__ == "__main__": print Scalars([3,4,240]).to_string('binary') PyVTK-0.4.74/lib/StructuredGrid.py0000644000175000017500000000445410567253673015714 0ustar pearupearu#!/usr/bin/env python """ StructuredGrid """ """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.4 $ $Date: 2007-02-22 08:43:39 $ Pearu Peterson """ import DataSet import common class StructuredGrid(DataSet.DataSet): """ Usage: StructuredGrid(<3-tuple of dimensions>, ) Attributes: dimensions points Public methods: get_points() get_size() get_cell_size() to_string(format = 'ascii') get_points() (...) """ def __init__(self,dimensions,points): self.dimensions = self.get_3_tuple(dimensions,(1,1,1)) self.points = self.get_3_tuple_list(points,(0,0,0)) if self._check_dimensions(): raise ValueError,'dimensions must be 3-tuple of ints >=1 and matching with the size of points' def to_string(self, format='ascii'): t = self.get_datatype(self.points) ret = ['DATASET STRUCTURED_GRID', 'DIMENSIONS %s %s %s'%self.dimensions, 'POINTS %s %s'%(self.get_size(),t), self.seq_to_string(self.points,format,t)] return '\n'.join(ret) def get_points(self): return self.points def get_cell_size(self): return len(self.points) def structured_grid_fromfile(f,self): l = common._getline(f).split(' ') assert l[0].strip().lower() == 'dimensions' dims = map(eval,l[1:]) assert len(dims)==3 l = common._getline(f) k,n,datatype = [s.strip().lower() for s in l.split(' ')] if k!='points': raise ValueError, 'expected points but got %s'%(`k`) n = eval(n) assert datatype in ['bit','unsigned_char','char','unsigned_short','short','unsigned_int','int','unsigned_long','long','float','double'],`datatype` points = [] self.message('\tgetting %s points'%n) while len(points) < 3*n: l = common._getline(f) points += map(eval,l.split(' ')) assert len(points)==3*n return StructuredGrid(dims,points),common._getline(f) if __name__ == "__main__": print StructuredGrid((1,2),[1,2,2,4,4,5.4]) PyVTK-0.4.74/lib/StructuredPoints.py0000644000175000017500000000537407305502006016264 0ustar pearupearu#!/usr/bin/env python """ StructuredPoints """ """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.2 $ $Date: 2001-05-31 17:48:54 $ Pearu Peterson """ import DataSet import common class StructuredPoints(DataSet.DataSet): """ Usage: StructuredPoints(<3-tuple of dimensions>, origin = <3-tuple>, spacing = <3-tuple>) Attributes: dimensions origin spacing Public methods: get_size() get_cell_size() to_string(format = 'ascii') get_points() (...) """ def __init__(self,dimensions,origin=(0,0,0),spacing=(1,1,1)): self.dimensions = self.get_3_tuple(dimensions,(1,1,1)) if self._check_dimensions(): raise ValueError,'dimensions must be 3-tuple of ints >=1' self.origin = self.get_3_tuple(origin,(1,1,1)) if self._check_origin(): raise ValueError,'origin must be 3-tuple of numbers' self.spacing = self.get_3_tuple(spacing,(1,1,1)) if self._check_spacing(): raise ValueError,'spacing must be 3-tuple of positive numbers' def to_string(self,format = 'ascii'): ret = ['DATASET STRUCTURED_POINTS', 'DIMENSIONS %s %s %s'%self.dimensions, 'ORIGIN %s %s %s'%self.origin, 'SPACING %s %s %s'%self.spacing] return '\n'.join(ret) def get_points(self): if hasattr(self,'points'): return self.points arr = [] for k in range(self.dimensions[2]): z = self.origin[2] + k * self.spacing[2] for j in range(self.dimensions[1]): y = self.origin[1] + j * self.spacing[1] for i in range(self.dimensions[0]): x = self.origin[0] + i * self.spacing[0] arr.append((x,y,z)) self.points = arr return arr def structured_points_fromfile(f,self): l = common._getline(f).split(' ') assert l[0].strip().lower() == 'dimensions' dims = map(eval,l[1:]) assert len(dims)==3 l = common._getline(f).split(' ') assert l[0].strip().lower() == 'origin' origin = map(eval,l[1:]) assert len(origin)==3 l = common._getline(f).split(' ') assert l[0].strip().lower() == 'spacing' spacing = map(eval,l[1:]) assert len(spacing)==3 return StructuredPoints(dims,origin,spacing),common._getline(f) if __name__ == "__main__": print StructuredPoints((2,3,4)) print StructuredPoints((2,3)) print StructuredPoints(5) print StructuredPoints([2,3,5,6]).get_size() PyVTK-0.4.74/lib/Tensors.py0000644000175000017500000000337607742570661014401 0ustar pearupearu#!/usr/bin/env python """ Tensors """ """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.4 $ $Date: 2003-10-13 18:40:49 $ Pearu Peterson """ import DataSetAttr import common class Tensors(DataSetAttr.DataSetAttr): """Holds VTK Tensors. Usage: Tensors( , name = ) Attributes: tensors name Public methods: get_size() to_string(format = 'ascii') """ def __init__(self,tensors,name=None): self.name = self._get_name(name) self.tensors = self.get_3_3_tuple_list(tensors,(self.default_value,)*3) def to_string(self,format='ascii'): t = self.get_datatype(self.tensors) ret = ['TENSORS %s %s'%(self.name,t), self.seq_to_string(self.tensors,format,t)] return '\n'.join(ret) def get_size(self): return len(self.tensors) def tensors_fromfile(f,n,sl): assert len(sl)==2 dataname = sl[0].strip() datatype = sl[1].strip().lower() assert datatype in ['bit','unsigned_char','char','unsigned_short','short','unsigned_int','int','unsigned_long','long','float','double'],`datatype` arr = [] while len(arr)<9*n: arr += map(eval,common._getline(f).split(' ')) assert len(arr)==9*n arr2 = [] for i in range(0,len(arr),9): arr2.append(tuple(map(tuple,[arr[i:i+3],arr[i+3:i+6],arr[i+6:i+9]]))) return Tensors(arr2,dataname) if __name__ == "__main__": print Tensors([[[3,3]],[4,3.],[[240]],3,2,3]).to_string('ascii') print Tensors(3).to_string('ascii') PyVTK-0.4.74/lib/TextureCoordinates.py0000644000175000017500000000366007305502007016553 0ustar pearupearu#!/usr/bin/env python """ TextureCoordinates """ """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.3 $ $Date: 2001-05-31 17:48:55 $ Pearu Peterson """ import DataSetAttr class TextureCoordinates(DataSetAttr.DataSetAttr): """Holds VTK Texture Coordinates. Usage: TextureCoordinates( ,name = ) Attributes: coords name Public methods: get_size() to_string(format = 'ascii') """ def __init__(self,scalars,name=None): self.name = self._get_name(name) self.coords = self.get_n_seq_seq(scalars,self.default_value) if not 1<=len(self.coords[0])<=3: raise ValueError,'texture coordinates dimension must be 1, 2, or 3 but got %s'%(len(self.coords[0])) def to_string(self,format='ascii'): t = self.get_datatype(self.coords) ret = ['TEXTURE_COORDINATES %s %s %s'%(self.name,len(self.coords[0]),t), self.seq_to_string(self.coords,format,t)] return '\n'.join(ret) def get_size(self): return len(self.coords) def texture_coordinates_fromfile(f,n,sl): assert len(sl)==3 dataname = sl[0].strip() dim = eval(sl[1]) datatype = sl[2].strip().lower() assert datatype in ['bit','unsigned_char','char','unsigned_short','short','unsigned_int','int','unsigned_long','long','float','double'],`datatype` arr = [] while len(arr) Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.6 $ $Date: 2003-01-26 10:05:27 $ Pearu Peterson """ import DataSet import common class UnstructuredGrid(DataSet.DataSet): """ Usage: UnstructuredGrid(, vertex = poly_vertex = , line = , poly_line = , triangle = , triangle_strip = , polygon = , pixel = , quad = , tetra = , voxel = , hexahedron = , wedge = , pyramid = ) Attributes: points vertex poly_vertex, line, poly_line, triangle, triangle_strip, polygon, pixel, quad, tetra, voxel, hexahedron, wedge, pyramid Public methods: get_size() get_cell_size() to_string(format = 'ascii') get_points() (...) """ _vtk_cell_types_map = {'vertex':1,'poly_vertex':2,'line':3,'poly_line':4, 'triangle':5,'triangle_strip':6,'polygon':7,'pixel':8, 'quad':9,'tetra':10,'voxel':11,'hexahedron':12, 'wedge':13,'pyramid':14} _vtk_cell_nums_map = {'vertex':1,'poly_vertex':-1,'line':2,'poly_line':-1, 'triangle':3,'triangle_strip':-1,'polygon':-1,'pixel':4, 'quad':4,'tetra':4,'voxel':8,'hexahedron':8, 'wedge':6,'pyramid':5} _vtk_cell_types_imap = {1:'vertex',2:'poly_vertex',3:'line',4:'poly_line', 5:'triangle',6:'triangle_strip',7:'polygon', 8:'pixel',9:'quad',10:'tetra',11:'voxel',12:'hexahedron', 13:'wedge',14:'pyramid'} def __init__(self,points,vertex=[],poly_vertex=[],line=[],poly_line=[], triangle=[],triangle_strip=[],polygon=[],pixel=[], quad=[],tetra=[],voxel=[],hexahedron=[],wedge=[],pyramid=[]): self.points = self.get_3_tuple_list(points,(0,0,0)) sz = len(self.points) for k in self._vtk_cell_types_map.keys(): exec 'self.%s = self.get_seq_seq(%s,[])'%(k,k) if k=='vertex': r = [] for v in self.vertex: r += map(lambda a:[a],v) self.vertex = r if self._check_int_seq(getattr(self,k),sz): raise ValueError,'In cell %s: must be (seq of seq|seq) integers less than %s'%(k,sz) for k,n in self._vtk_cell_nums_map.items(): if n==-1: continue kv = getattr(self,k) if kv==[] or kv[0]==[]: continue for v in kv: if len(v)!=n: raise ValueError,'Cell %s requires exactly %s points but got %s: %s'%(`k`,n,len(v),v) def to_string(self,format='ascii'): t = self.get_datatype(self.points) ret = ['DATASET UNSTRUCTURED_GRID', 'POINTS %s %s'%(self.get_size(),t), self.seq_to_string(self.points,format,t)] tps = [] r = [] sz = 0 for k in self._vtk_cell_types_map.keys(): kv = getattr(self,k) if kv==[] or kv[0]==[]: continue s = self.seq_to_string([[len(v)]+list(v) for v in kv],format,'int') r .append(s) for v in kv: tps.append(self._vtk_cell_types_map[k]) sz += len(v)+1 sep = (format=='ascii' and '\n') or (format=='binary' and '') r = sep.join(r) ret += ['CELLS %s %s'%(len(tps),sz), r, 'CELL_TYPES %s'%(len(tps)), self.seq_to_string(tps,format,'int')] return '\n'.join(ret) def get_cell_size(self): sz = 0 for k in self._vtk_cell_types_map.keys(): kv = getattr(self,k) if kv==[] or kv[0]==[]: continue sz += len(kv) return sz def get_points(self): return self.points def unstructured_grid_fromfile(f,self): l = common._getline(f) k,n,datatype = [s.strip().lower() for s in l.split(' ')] if k!='points': raise ValueError, 'expected points but got %s'%(`k`) n = eval(n) assert datatype in ['bit','unsigned_char','char','unsigned_short','short','unsigned_int','int','unsigned_long','long','float','double'],`datatype` points = [] self.message('\tgetting %s points'%n) while len(points) < 3*n: points += map(eval,common._getline(f).split(' ')) assert len(points)==3*n l = common._getline(f).split(' ') assert len(l)==3 and l[0].strip().lower() == 'cells',`l` n = eval(l[1]) size = eval(l[2]) lst = [] self.message('\tgetting %s cell indexes'%size) while len(lst) < size: lst += map(eval,common._getline(f).split(' ')) assert len(lst)==size lst2 = [] j = 0 for i in range(n): lst2.append(lst[j+1:j+lst[j]+1]) j += lst[j]+1 l = common._getline(f).split(' ') assert len(l)==2 and l[0].strip().lower() == 'cell_types' and eval(l[1])==n,`l` tps = [] self.message('\tgetting %s cell types'%n) while len(tps) < n: tps += map(eval,common._getline(f).split(' ')) assert len(tps)==n dict = {} for i,t in zip(lst2,tps): k = UnstructuredGrid._vtk_cell_types_imap[t] if not dict.has_key(k): dict[k] = [] dict[k].append(i) self.message('\tdone') return UnstructuredGrid(points,**dict),common._getline(f) if __name__ == "__main__": print UnstructuredGrid([[1,2],[2,4],3,5], line = [[2,3],[1,2],[2,3]], vertex=2) PyVTK-0.4.74/lib/Vectors.py0000644000175000017500000000306507305502007014344 0ustar pearupearu#!/usr/bin/env python """ Vectors """ """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.2 $ $Date: 2001-05-31 17:48:55 $ Pearu Peterson """ import DataSetAttr import common class Vectors(DataSetAttr.DataSetAttr): """Holds VTK Vectors. Usage: Vectors( ,name = ) Attributes: vectors name Public methods: get_size() to_string(format = 'ascii') """ def __init__(self,vectors,name=None): self.name = self._get_name(name) self.vectors = self.get_3_tuple_list(vectors,(self.default_value,)*3) def to_string(self,format='ascii'): t = self.get_datatype(self.vectors) ret = ['VECTORS %s %s'%(self.name,t), self.seq_to_string(self.vectors,format,t)] return '\n'.join(ret) def get_size(self): return len(self.vectors) def vectors_fromfile(f,n,sl): dataname = sl[0] datatype = sl[1].lower() assert datatype in ['bit','unsigned_char','char','unsigned_short','short','unsigned_int','int','unsigned_long','long','float','double'],`datatype` vectors = [] while len(vectors) < 3*n: vectors += map(eval,common._getline(f).split(' ')) assert len(vectors) == 3*n return Vectors(vectors,dataname) if __name__ == "__main__": print Vectors([[3,3],[4,3.],240,3,2]).to_string() PyVTK-0.4.74/lib/__init__.py0000644000175000017500000002351107644310610014457 0ustar pearupearu#!/usr/bin/env python """ PyVTK provides tools for manipulating VTK files in Python. VtkData - create VTK files from Python / read VTK files to Python """ """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.11 $ $Date: 2003-04-07 14:56:08 $ Pearu Peterson """ __author__ = "Pearu Peterson " __license__ = "LGPL (see http://www.fsf.org)" from __version__ import __version__ __all__ = ['StructuredPoints','StructuredGrid','UnstructuredGrid', 'RectilinearGrid','PolyData', 'Scalars','ColorScalars','LookupTable','Vectors','Normals', 'TextureCoordinates','Tensors','Field', 'PointData','CellData', 'VtkData'] import types import os import common from StructuredPoints import StructuredPoints, structured_points_fromfile from StructuredGrid import StructuredGrid, structured_grid_fromfile from UnstructuredGrid import UnstructuredGrid, unstructured_grid_fromfile from RectilinearGrid import RectilinearGrid, rectilinear_grid_fromfile from PolyData import PolyData, polydata_fromfile from Scalars import Scalars,scalars_fromfile from ColorScalars import ColorScalars, color_scalars_fromfile from LookupTable import LookupTable, lookup_table_fromfile from Vectors import Vectors, vectors_fromfile from Normals import Normals, normals_fromfile from TextureCoordinates import TextureCoordinates, texture_coordinates_fromfile from Tensors import Tensors, tensors_fromfile from Field import Field, field_fromfile from Data import PointData,CellData class VtkData(common.Common): """ VtkData ======= Represents VTK file that has four relevant parts: header - string up to length 255 format - string: ascii | binary DataSet - StructuredPoints | StructuredGrid | UnstructuredGrid | RectilinearGrid | PolyData Data - PointData | CellData Usage: ------ v = VtkData( [,
,,..]) v = VtkData(, only_structure = 0) - read VTK data from file. v.tofile(filename, format = 'ascii') - save VTK data to file. Attributes: header structure point_data cell_data Public methods: to_string(format = 'ascii') tofile(filename, format = 'ascii') DataSet ======= StructuredPoints(<3-sequence of dimensions> [,<3-sequence of origin> [, <3-sequence of spacing>]]) StructuredGrid(<3-sequence of dimensions>, ) UnstructuredGrid( [, = ]) cell - vertex | poly_vertex | line | poly_line | triangle | triangle_strip | polygon | pixel | quad | tetra | voxel | hexahedron | wedge | pyramid RectilinearGrid([x = ], [y = ], [z = ]) PolyData(, [vertices = ], [lines = ], [polygons = ], [triangle_strips = ]) Data ==== PointData | CellData ([]) - construct Data instance DataSetAttr =========== DataSetAttr - Scalars | ColorScalars | LookupTable | Vectors | Normals | TextureCoordinates | Tensors | Field Scalars( [,name[, lookup_table]]) ColorScalars( [,name]) LookupTable( [,name]) Vectors( [,name]) Normals( [,name]) TextureCoordinates( [,name]) Tensors( [,name]) Field([name,] [arrayname_1 = sequence of n_1-sequences, ... arrayname_m = sequence of n_m-sequences,]) where len(array_1) == .. == len(array_m) must hold. """ header = None point_data = None cell_data = None def __init__(self,*args,**kws): assert args,'expected at least one argument' if type(args[0]) is types.StringType: if kws.has_key('only_structure') and kws['only_structure']: self.fromfile(args[0],1) else: self.fromfile(args[0]) return else: structure = args[0] args = list(args)[1:] if not common.is_dataset(structure): raise TypeError,'argument structure must be StructuredPoints|StructuredGrid|UnstructuredGrid|RectilinearGrid|PolyData but got %s'%(type(structure)) self.structure = structure for a in args: if common.is_string(a): if len(a)>255: self.skipping('striping header string to a length =255') self.header = a[:255] elif common.is_pointdata(a): self.point_data = a elif common.is_celldata(a): self.cell_data = a else: self.skipping('unexpexted argument %s'%(type(a))) if self.header is None: self.header = 'Really cool data' self.warning('Using header=%s'%(`self.header`)) if self.point_data is None and self.cell_data is None: self.warning('No data defined') if self.point_data is not None: s = self.structure.get_size() s1 = self.point_data.get_size() if s1 != s: raise ValueError,'DataSet (size=%s) and PointData (size=%s) have different sizes'%(s,s1) else: self.point_data = PointData() if self.cell_data is not None: s = self.structure.get_cell_size() s1 = self.cell_data.get_size() if s1 != s: raise ValueError,'DataSet (cell_size=%s) and CellData (size=%s) have different sizes'%(s,s1) else: self.cell_data = CellData() def to_string(self, format = 'ascii'): ret = ['# vtk DataFile Version 2.0', self.header, format.upper(), self.structure.to_string(format) ] if self.cell_data.data: ret.append(self.cell_data.to_string(format)) if self.point_data.data: ret.append(self.point_data.to_string(format)) #print `ret` return '\n'.join(ret) def tofile(self, filename, format = 'ascii'): """Save VTK data to file. """ if not common.is_string(filename): raise TypeError,'argument filename must be string but got %s'%(type(filename)) if format not in ['ascii','binary']: raise TypeError,'argument format must be ascii | binary' filename = filename.strip() if not filename: raise ValueError,'filename must be non-empty string' if filename[-4:]!='.vtk': filename += '.vtk' #print 'Creating file',`filename` f = open(filename,'wb') f.write(self.to_string(format)) f.close() def fromfile(self,filename, only_structure = 0): filename = filename.strip() if filename[-4:]!='.vtk': filename += '.vtk' #print 'Reading file',`filename` f = open(filename,'rb') l = f.readline() if not l.strip().replace(' ','').lower() == '#vtkdatafileversion2.0': raise TypeError, 'File '+`filename`+' is not VTK 2.0 format' self.header = f.readline().rstrip() format = f.readline().strip().lower() if format not in ['ascii','binary']: raise ValueError,'Expected ascii|binary but got %s'%(`format`) if format == 'binary': raise NotImplementedError,'reading vtk binary format' l = common._getline(f).lower().split(' ') if l[0].strip() != 'dataset': raise ValueError,'expected dataset but got %s'%(l[0]) try: ff = eval(l[1]+'_fromfile') except NameError: raise NotImplementedError,'%s_fromfile'%(l[1]) self.structure,l = ff(f,self) for i in range(2): if only_structure: break if not l: break l = [s.strip() for s in l.lower().split(' ')] assert len(l)==2 and l[0] in ['cell_data','point_data'], l[0] data = l[0] n = eval(l[1]) lst = [] while 1: l = common._getline(f) if not l: break sl = [s.strip() for s in l.split()] k = sl[0].lower() if k not in ['scalars','color_scalars','lookup_table','vectors', 'normals','texture_coordinates','tensors','field']: break try: ff = eval(k+'_fromfile') except NameError: raise NotImplementedError,'%s_fromfile'%(k) lst.append(ff(f,n,sl[1:])) if data == 'point_data': self.point_data = PointData(*lst) if data == 'cell_data': self.cell_data = CellData(*lst) if self.point_data is None: self.point_data = PointData() if self.cell_data is None: self.cell_data = CellData() f.close() if __name__ == "__main__": vtk = VtkData(StructuredPoints((3,1,1)), 'This is title', PointData(Scalars([3,4,5])) ) vtk.tofile('test') PyVTK-0.4.74/lib/__version__.py0000644000175000017500000000002710567304606015204 0ustar pearupearu__version__ = "0.4.74" PyVTK-0.4.74/lib/common.py0000644000175000017500000002472610567304562014230 0ustar pearupearu#!/usr/bin/env python """ Common functions/methods. """ """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.13 $ $Date: 2007-02-22 12:15:46 $ Pearu Peterson """ import types import sys import struct def is_sequence(obj): """Check if obj is sequence.""" try: len(obj) return 1 except TypeError: return 0 def is_sequence2(obj): """Check if obj is sequence of sequences.""" return is_sequence(obj) and len(obj) and is_sequence(obj[0]) def is_sequence3(obj): """Check if obj is sequence of sequences of sequences.""" return is_sequence(obj) and len(obj) and is_sequence2(obj[0]) def is_number(obj): """Check if obj is number.""" return isinstance(obj, (int, float)) def is_int(obj): """Check if obj is integer.""" return isinstance(obj, int) def is_float(obj): """Check if obj is float.""" return isinstance(obj, float) def is_string(obj): """Check if obj is string.""" return isinstance(obj, str) def is_int255(obj): if is_sequence(obj): for v in obj: r = is_int255(v) if not r: return 0 return 1 return 0<=obj<256 def is_float01(obj): if is_sequence(obj): for v in obj: r = is_float01(v) if not r: return 0 return 1 return 0<=obj<=1 def is_datasetattr(obj): return type(obj) is types.InstanceType and isinstance(obj,DataSetAttr.DataSetAttr) def is_dataset(obj): return type(obj) is types.InstanceType and isinstance(obj,DataSet.DataSet) def is_pointdata(obj): return type(obj) is types.InstanceType and isinstance(obj,Data.PointData) def is_celldata(obj): return type(obj) is types.InstanceType and isinstance(obj,Data.CellData) def _getline(f): l = ' ' while l: l = f.readline() if l.strip(): return l.strip() return None class Common: """Abstract class. Defines output, checker, and getter functions.""" struct_fmt_map = {'char':'c', 'long':'l','double':'d', 'int':'i','float':'f', 'unsigned char':'B'} default_int = 'int' default_float = 'float' def _get_trace(self,m): try: frame = sys._getframe().f_back except AttributeError: # Python 2.0 does not have sys._getframe frame = None n = '' while frame: i = frame.f_code.co_name n = '%s.%s'%(i,n) if i=='__init__': break frame = frame.f_back print >>sys.stderr,'%s.%s:\n\t%s'%(self.__class__.__name__,n[:-1],m) def warning(self,m=''): self._get_trace(m) def skipping(self,m=''): self._get_trace(m) def error(self,m=''): self._get_trace(m) def message(self,m=''): self._get_trace(m) def __str__(self): return self.to_string() def get_datatype(self,obj): typecode = None if hasattr(obj,'dtype'): # obj is numpy array typecode = obj.dtype.char elif hasattr(obj,'typecode'): # obj is Numeric array typecode = obj.typecode() if typecode is not None: r = {'b':'unsigned_char', #'bit'?? 'f':'float', 'd':'double', 'i':'int', 'l':'long', '1':'char', 's':'short', 'w':'unsigned_short', 'u':'unsigned_int' #'?':'unsigned_long' }.get(typecode) if r is not None: return r if is_int(obj): return self.default_int if is_float(obj): return self.default_float if not is_sequence(obj): raise ValueError,'expected int|float|non-empty sequence but got %s'\ %(type(obj)) if not len(obj): self.warning('no data, no datatype, using int') r = 'int' for o in obj: r = self.get_datatype(o) if r==self.default_float: break return r def get_seq(self,obj,default=None): """Return sequence.""" if is_sequence(obj): return obj if is_number(obj): return [obj] if obj is None and default is not None: self.warning('using default value (%s)'%(default)) return self.get_seq(default) raise ValueError,'expected sequence|number but got %s'%(type(obj)) def get_seq_seq(self,obj,default=None): """Return sequence of sequences.""" if is_sequence2(obj): return [self.get_seq(o,default) for o in obj] else: return [self.get_seq(obj,default)] def get_n_seq_seq(self,obj,default): seq = self.get_seq_seq(obj,default) if is_sequence(default): n = len(default) else: n = max(map(len,seq)) default = [default]*n ret = [] flag = 0 for v in seq: if len(v)!=n: ret.append(list(v)+default[len(v):]) flag = 1 else: ret.append(list(v)) if flag: self.warning('Some items were filled with default value (%s) to obtain size=%s'%(default[0],n)) return ret def get_3_tuple(self,obj,default=None): """Return 3-tuple from number -> (obj,default[1],default[2]) 0-sequence|None -> default 1-sequence -> (obj[0],default[1],default[2]) 2-sequence -> (obj[0],obj[1],default[2]) (3 or more)-sequence -> (obj[0],obj[1],obj[2]) """ if not (default is not None \ and type(default) is types.TupleType \ and len(default)==3): raise ValueError,'argument default must be 3-tuple|None but got %s'%(default) if is_sequence(obj): n = len(obj) if n>3: self.warning('expected 3-sequence but got %s-%s'%(n,type(obj))) if n>=3: return tuple(obj) self.warning('filling with default value (%s) to obtain size=3'%(default[0])) if default is not None: if n==0: return default elif n==1: return (obj[0],default[1],default[2]) elif n==2: return (obj[0],obj[1],default[2]) elif is_number(obj) and default is not None: self.warning('filling with default value (%s) to obtain size=3'%(default[0])) return (obj,default[1],default[2]) elif obj is None and default is not None: self.warning('filling with default value (%s) to obtain size=3'%(default[0])) return default raise ValueError,'failed to construct 3-tuple from %s-%s'%(n,type(obj)) def get_3_tuple_list(self,obj,default=None): """Return list of 3-tuples from sequence of a sequence, sequence - it is mapped to sequence of 3-sequences if possible number """ if is_sequence2(obj): return [self.get_3_tuple(o,default) for o in obj] elif is_sequence(obj): return [self.get_3_tuple(obj[i:i+3],default) for i in range(0,len(obj),3)] else: return [self.get_3_tuple(obj,default)] def get_3_3_tuple(self,obj,default=None): """Return tuple of 3-tuples """ if is_sequence2(obj): ret = [] for i in range(3): if i9: self.warning('ignoring elements obj[i], i>=9') r = obj[:9] r = [self.get_3_tuple(r[j:j+3],default) for j in range(0,len(r),3)] if len(r)<3: self.warning('filling with default value (%s) to obtain size=3'%(default[0])) while len(r)<3: r.append(self.get_3_tuple(default,default)) return tuple(r) self.warning('filling with default value (%s) to obtain size=3'%(default[0])) r1 = self.get_3_tuple(obj,default) r2 = self.get_3_tuple(default,default) r3 = self.get_3_tuple(default,default) return (r1,r2,r3) def get_3_3_tuple_list(self,obj,default=None): """Return list of 3x3-tuples. """ if is_sequence3(obj): return [self.get_3_3_tuple(o,default) for o in obj] return [self.get_3_3_tuple(obj,default)] def _get_nof_objs(self,seq): if is_sequence2(seq): return reduce(lambda x,y:x+y,map(self._get_nof_objs,seq),0) #return reduce(lambda x,y:x+y,[self._get_nof_objs(s) for s in seq],0) return len(seq) def seq_to_string(self,seq,format,datatype): assert is_sequence(seq),'expected sequence but got %s'%(type(seq)) if format == 'ascii': if is_sequence2(seq): sep = '\n' if is_sequence3(seq): sep = '\n\n' return sep.join([self.seq_to_string(v,format,datatype) for v in seq]) else: return ' '.join(map(str,seq)) elif format == 'binary': if is_sequence2(seq): r = ''.join([self.seq_to_string(v,format,datatype) for v in seq]) return r else: try: fmt = self.struct_fmt_map[datatype] except KeyError: fmt = None if fmt: r = struct.pack('!'+fmt*len(seq),*seq) return r raise NotImplementedError,'format=%s, datatype=%s'%(format,datatype) def float01_to_int255(self,seq): assert is_float01(seq) if is_sequence(seq): return map(self.float01_to_int255,seq) #return [self.float01_to_int255(l) for l in seq] else: return int(seq*255) def int255_to_float01(self,seq): assert is_int255(seq) if is_sequence(seq): return map(self.int255_to_float01,seq) #return [self.int255_to_float01(l) for l in seq] else: return round(seq/255.0,6) import Data import DataSet import DataSetAttr PyVTK-0.4.74/lib152/0000755000175000017500000000000010567304606012602 5ustar pearupearuPyVTK-0.4.74/lib152/ColorScalars.py0000644000175000017500000000257507301736721015553 0ustar pearupearu#!/usr/bin/env python """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.1 $ $Date: 2001-05-20 12:51:29 $ Pearu Peterson """ __version__ = "$Id: ColorScalars.py,v 1.1 2001-05-20 12:51:29 pearu Exp $" import common import DataSetAttr import string class ColorScalars(DataSetAttr.DataSetAttr): """Holds VTK color scalars. """ def __init__(self,scalars,name=None): self.name = self._get_name(name) self.scalars = self.get_n_seq_seq(scalars,self.default_value) def to_string(self,format='ascii'): ret = ['COLOR_SCALARS %s %s'%(self.name,len(self.scalars[0]))] seq = self.scalars if format=='binary': if not common.is_int255(seq): seq = self.float01_to_int255(seq) ret.append(self.seq_to_string(seq,format,'unsigned char')) else: if not common.is_float01(seq): seq = self.int255_to_float01(seq) ret.append(self.seq_to_string(seq,format,'float')) return string.join(ret,'\n') def get_size(self): return len(self.scalars) if __name__ == "__main__": print ColorScalars([[3,3],[4,3],240,3,2]).to_string() PyVTK-0.4.74/lib152/Data.py0000644000175000017500000000400507301736721014023 0ustar pearupearu#!/usr/bin/env python """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.1 $ $Date: 2001-05-20 12:51:29 $ Pearu Peterson """ __version__ = "$Id: Data.py,v 1.1 2001-05-20 12:51:29 pearu Exp $" import string import common class Data(common.Common): data_type = None def __init__(self,*args): if self.__class__.__name__ not in ['PointData','CellData']: raise TypeError,'use PointData or CellData instead of Data' if not args: raise TypeError,self.__class__.__name__+'() takes at least 1 argument: Scalars|ColorScalars|LookupTable|Vectors|Normals|TextureCoordinates|Tensors|Field' args = list(args) length = None for a in args: if not common.is_datasetattr(a): self.skipping('expected DataSetAttr argument but got %s'%(type(a))) continue if length is None: length = a.get_size() elif length != a.get_size(): self.skipping('attribute data %s must be of length %s (as defined by first DataSetAttr) but got %s'%(`a.__class__.__name__`,length,a.get_size())) continue self.length = length self.data = args def get_size(self): return self.length def to_string(self,format='ascii'): if self.data_type is None: raise TypeError,'use PointData or CellData instead of Data' ret = ['%s %s'%(self.data_type,self.length)] for a in self.data: ret.append(a.to_string(format)) #ret += [a.to_string(format) for a in self.data] return string.join(ret,'\n') class PointData(Data): data_type = 'POINT_DATA' class CellData(Data): data_type = 'CELL_DATA' if __name__ == "__main__": import Scalars print PointData(Scalars.Scalars([2,3])) PyVTK-0.4.74/lib152/DataSet.py0000644000175000017500000000442207301736721014502 0ustar pearupearu#!/usr/bin/env python """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.1 $ $Date: 2001-05-20 12:51:29 $ Pearu Peterson """ __version__ = "$Id: DataSet.py,v 1.1 2001-05-20 12:51:29 pearu Exp $" import common class DataSet(common.Common): """Abstract class. It describes the geometry and topology of VTK dataset. """ def get_size(self): if hasattr(self,'points'): return len(self.points) return reduce(lambda x,y:x*y,self.dimensions,1) def get_cell_size(self): return 0 def _check_dimensions(self): for i in range(3): d = self.dimensions[i] if not common.is_int(d): self.error('dimensions[%s] must be int but got %s'%(i,type(d))) return 1 if d<=0: self.error('dimensions[%s] must be positive int but got %s'%(i,d)) return 1 if hasattr(self,'points'): d = reduce(lambda x,y:x*y,self.dimensions,1) if len(self.points)!=d: self.error('mismatch of points length (%s) and dimensions size (%s)'%(len(self.points),d)) return 1 return 0 def _check_origin(self): for i in range(3): d = self.origin[i] if not common.is_number(d): self.error('origin[%s] must be number but got %s'%(i,type(d))) return 1 return 0 def _check_spacing(self): for i in range(3): d = self.spacing[i] if not common.is_number(d): self.error('spacing[%s] must be number but got %s'%(i,type(d))) return 1 if d<=0: self.error('spacing[%s] must be positive number but got %s'%(i,d)) return 1 return 0 def _check_int_seq(self,obj,mx_int): if common.is_sequence(obj): for o in obj: if self._check_int_seq(o,mx_int): return 1 elif not common.is_int(obj) or obj>=mx_int: return 1 return 0 PyVTK-0.4.74/lib152/DataSetAttr.py0000644000175000017500000000333607301736721015340 0ustar pearupearu#!/usr/bin/env python """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.1 $ $Date: 2001-05-20 12:51:29 $ Pearu Peterson """ __version__ = "$Id: DataSetAttr.py,v 1.1 2001-05-20 12:51:29 pearu Exp $" import common import string class DataSetAttr(common.Common): """Abstract class for VTK data.""" counters = {} default_value = 0 def _get_default_name(self): n = self.__class__.__name__ try: self.counters[n] = self.counters[n] + 1 except KeyError: self.counters[n] = 0 return self.__class__.__name__+str(self.counters[n]) def _get_name(self,name): if name is None: name = self._get_default_name() self.warning('Using name=%s'%(`name`)) return name if common.is_string(name): name = string.replace(string.strip(name),' ','_') #name = name.strip().replace(' ','_') if name: return name raise ValueError,'name=%s must be non-empty string'%(`name`) def _get_lookup_table(self,name): if name is None: name = 'default' self.warning('Using lookup_table=%s'%(`name`)) return name if common.is_string(name): name = string.replace(string.strip(name),' ','_') #name = name.strip().replace(' ','_') if name: return name raise ValueError,'lookup_table=%s must be nonempty string'%(`name`) if __name__ == "__main__": pass PyVTK-0.4.74/lib152/Field.py0000644000175000017500000000324407301736721014201 0ustar pearupearu#!/usr/bin/env python """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.1 $ $Date: 2001-05-20 12:51:29 $ Pearu Peterson """ import DataSetAttr import string class Field(DataSetAttr.DataSetAttr): """Holds VTK Field. """ def __init__(self,*args,**kws): if len(args): name = args[0] else: name = None if len(args)>1: self.warning('Ignoring all arguments except the first') self.name = self._get_name(name) data = {} mx = 0 for k,v in kws.items(): data[k] = self.get_n_seq_seq(v,self.default_value) mx = max(map(len,data.values())) #mx = max([len(l) for l in data.values()]) for k,v in data.items(): if len(v) Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.1 $ $Date: 2001-05-20 12:51:29 $ Pearu Peterson """ __version__ = "$Id: LookupTable.py,v 1.1 2001-05-20 12:51:29 pearu Exp $" import common import DataSetAttr import string class LookupTable(DataSetAttr.DataSetAttr): """Holds VTK LookupTable. """ def __init__(self,table,name=None): self.name = self._get_name(name) self.table = self.get_n_seq_seq(table,[0,0,0,0]) if len(self.table[0])!=4: raise ValueError,'expected sequence of 4-sequences but got %s'%(len(self.table[0])) def to_string(self,format='ascii'): ret = ['LOOKUP_TABLE %s %s'%(self.name,len(self.table))] seq = self.table if format=='binary': if not common.is_int255(seq): seq = self.float01_to_int255(seq) ret.append(self.seq_to_string(seq,format,'unsigned char')) else: if not common.is_float01(seq): seq = self.int255_to_float01(seq) ret.append(self.seq_to_string(seq,format,'float')) return string.join(ret,'\n') def get_size(self): return len(self.table) if __name__ == "__main__": print LookupTable([[3,3],[4,3],240,3,2]).to_string() PyVTK-0.4.74/lib152/Normals.py0000644000175000017500000000260707301736721014573 0ustar pearupearu#!/usr/bin/env python """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.1 $ $Date: 2001-05-20 12:51:29 $ Pearu Peterson """ import DataSetAttr import math import string class Normals(DataSetAttr.DataSetAttr): """Holds VTK Normals. """ def __init__(self,normals,name=None): self.name = self._get_name(name) seq = [] for v in self.get_3_tuple_list(normals,(self.default_value,)*3): n = math.sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]) if n==0: self.warning('Cannot normalize zero vector to 1-length') seq.append(v) elif n==1: seq.append(v) else: seq.append(tuple(map(lambda c,n=n:c/n,v))) #seq.append(tuple([c/n for c in v])) self.normals = seq def to_string(self,format='ascii'): t = self.get_datatype(self.normals) ret = ['NORMALS %s %s'%(self.name,t)] ret.append(self.seq_to_string(self.normals,format,t)) return string.join(ret,'\n') def get_size(self): return len(self.normals) if __name__ == "__main__": print Normals([[3,3],[4,3.],240,3,2]).to_string() PyVTK-0.4.74/lib152/PolyData.py0000644000175000017500000000434207301736721014673 0ustar pearupearu#!/usr/bin/env python """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.1 $ $Date: 2001-05-20 12:51:29 $ Pearu Peterson """ import DataSet import string class PolyData(DataSet.DataSet): """The topology of a dataset is described by points vertices lines polygons triangle_strips """ def __init__(self,points, vertices=[],lines=[],polygons=[],triangle_strips=[]): self.points = self.get_3_tuple_list(points,(0,0,0)) self.vertices = self.get_seq_seq(vertices,[]) self.lines = self.get_seq_seq(lines,[]) self.polygons = self.get_seq_seq(polygons,[]) self.triangle_strips = self.get_seq_seq(triangle_strips,[]) sz = len(self.points) for k in ['vertices','lines','polygons','triangle_strips']: if self._check_int_seq(getattr(self,k),sz): raise ValueError,'%s must be (seq of seq|seq) integers less than %s'%(k,sz) def to_string(self, format='ascii'): t = self.get_datatype(self.points) ret = ['DATASET POLYDATA', 'POINTS %s %s'%(self.get_size(),t)] ret.append(self.seq_to_string(self.points,format,t)) for k in ['vertices','lines','polygons','triangle_strips']: kv = getattr(self,k) if kv==[] or kv[0]==[]: continue sz = self._get_nof_objs(kv)+len(kv) ret = ret + ['%s %s %s'%(string.upper(k),len(kv),sz), self.seq_to_string(map(lambda v:[len(v)]+list(v),kv),format,'int')] #ret = ret + ['%s %s %s'%(k.upper(),len(kv),sz), # self.seq_to_string([[len(v)]+list(v) for v in kv],format,'int')] return string.join(ret,'\n') def get_cell_size(self): sz = 0 for k in ['vertices','lines','polygons','triangle_strips']: kv = getattr(self,k) if kv==[] or kv[0]==[]: continue sz = sz + len(kv) return sz if __name__ == "__main__": print PolyData([[1,2],[2,4],4,5.4],[[1],[0]],[],[1,2,3]) PyVTK-0.4.74/lib152/RectilinearGrid.py0000644000175000017500000000303007301736721016216 0ustar pearupearu#!/usr/bin/env python """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.1 $ $Date: 2001-05-20 12:51:29 $ Pearu Peterson """ import DataSet import string class RectilinearGrid(DataSet.DataSet): """The topology of a dataset is described by x-coordinates y-coordinates z-coordinates """ def __init__(self,x=None,y=None,z=None): self.x = self.get_seq(x,[0]) self.y = self.get_seq(y,[0]) self.z = self.get_seq(z,[0]) self.dimensions = (len(self.x),len(self.y),len(self.z)) if self._check_dimensions(): raise ValueError,'dimensions must be 3-tuple of ints >=1' def to_string(self, format='ascii'): tx = self.get_datatype(self.x) ty = self.get_datatype(self.y) tz = self.get_datatype(self.z) ret = ['DATASET RECTILINEAR_GRID', 'DIMENSIONS %s %s %s'%self.dimensions, 'X_COORDINATES %s %s'%(len(self.x),tx), self.seq_to_string(self.x,format,tx), 'Y_COORDINATES %s %s'%(len(self.y),ty), self.seq_to_string(self.y,format,ty), 'Z_COORDINATES %s %s'%(len(self.z),tz), self.seq_to_string(self.z,format,tz)] return string.join(ret,'\n') if __name__ == "__main__": print RectilinearGrid([1,2,2,4,4,5.4]) PyVTK-0.4.74/lib152/Scalars.py0000644000175000017500000000223207301736721014542 0ustar pearupearu#!/usr/bin/env python """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.1 $ $Date: 2001-05-20 12:51:29 $ Pearu Peterson """ __version__ = "$Id: Scalars.py,v 1.1 2001-05-20 12:51:29 pearu Exp $" import DataSetAttr import string class Scalars(DataSetAttr.DataSetAttr): """Holds VTK scalars. """ def __init__(self,scalars,name=None,lookup_table=None): self.name = self._get_name(name) self.lookup_table = self._get_lookup_table(lookup_table) self.scalars = self.get_seq(scalars,[]) def to_string(self,format='ascii'): t = self.get_datatype(self.scalars) ret = ['SCALARS %s %s %s'%(self.name,t,1), 'LOOKUP_TABLE %s'%(self.lookup_table)] ret.append(self.seq_to_string(self.scalars,format,t)) return string.join(ret,'\n') def get_size(self): return len(self.scalars) if __name__ == "__main__": print Scalars([3,4,240]).to_string('binary') PyVTK-0.4.74/lib152/StructuredGrid.py0000644000175000017500000000244707301736721016134 0ustar pearupearu#!/usr/bin/env python """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.1 $ $Date: 2001-05-20 12:51:29 $ Pearu Peterson """ import DataSet import string class StructuredGrid(DataSet.DataSet): """The topology of a dataset is described by dimensions - 3-sequence of positive integers points - sequence of 3-sequences|3x-sequence """ def __init__(self,dimensions,points): self.dimensions = self.get_3_tuple(dimensions,(1,1,1)) self.points = self.get_3_tuple_list(points,(0,0,0)) if self._check_dimensions(): raise ValueError,'dimensions must be 3-tuple of ints >=1 and matching with the size of points' def to_string(self, format='ascii'): t = self.get_datatype(self.points) ret = ['DATASET STRUCTURED_GRID', 'DIMENSIONS %s %s %s'%self.dimensions, 'POINTS %s %s'%(self.get_size(),t) ] ret.append(self.seq_to_string(self.points,format,t)) return string.join(ret,'\n') if __name__ == "__main__": print StructuredGrid((1,2),[1,2,2,4,4,5.4]) PyVTK-0.4.74/lib152/StructuredPoints.py0000644000175000017500000000313707301736721016520 0ustar pearupearu#!/usr/bin/env python """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.1 $ $Date: 2001-05-20 12:51:29 $ Pearu Peterson """ import DataSet import string class StructuredPoints(DataSet.DataSet): """The topology of a dataset is described by dimensions - int|(1-3)-int sequence (>=1) origin - number|(1-3)-number sequence spacing - number|(1-3)-number sequence (>0) """ def __init__(self,dimensions,origin=(0,0,0),spacing=(1,1,1)): self.dimensions = self.get_3_tuple(dimensions,(1,1,1)) if self._check_dimensions(): raise ValueError,'dimensions must be 3-tuple of ints >=1' self.origin = self.get_3_tuple(origin,(1,1,1)) if self._check_origin(): raise ValueError,'origin must be 3-tuple of numbers' self.spacing = self.get_3_tuple(spacing,(1,1,1)) if self._check_spacing(): raise ValueError,'spacing must be 3-tuple of positive numbers' def to_string(self,format = 'ascii'): ret = ['DATASET STRUCTURED_POINTS', 'DIMENSIONS %s %s %s'%self.dimensions, 'ORIGIN %s %s %s'%self.origin, 'SPACING %s %s %s'%self.spacing] return string.join(ret,'\n') if __name__ == "__main__": print StructuredPoints((2,3,4)) print StructuredPoints((2,3)) print StructuredPoints(5) print StructuredPoints([2,3,5,6]).get_size() PyVTK-0.4.74/lib152/Tensors.py0000644000175000017500000000204107301736721014605 0ustar pearupearu#!/usr/bin/env python """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.1 $ $Date: 2001-05-20 12:51:29 $ Pearu Peterson """ import DataSetAttr import string class Tensors(DataSetAttr.DataSetAttr): """Holds VTK Tensors. """ def __init__(self,tensors,name=None): self.name = self._get_name(name) self.tensors = self.get_3_3_tuple_list(tensors,(self.default_value,)*3) def to_string(self,format='ascii'): t = self.get_datatype(self.tensors) ret = ['TENSORS %s %s'%(self.name,t)] ret.append(self.seq_to_string(self.tensors,format,t)) return string.join(ret,'\n') def get_size(self): return len(self.tensors) if __name__ == "__main__": print Tensors([[[3,3]],[4,3.],[[240]],3,2,3]).to_string('ascii') print Tensors(3).to_string('ascii') PyVTK-0.4.74/lib152/TextureCoordinates.py0000644000175000017500000000227307301736721017012 0ustar pearupearu#!/usr/bin/env python """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.1 $ $Date: 2001-05-20 12:51:29 $ Pearu Peterson """ import DataSetAttr import string class TextureCoordinates(DataSetAttr.DataSetAttr): """Holds VTK Texture Coordinates. """ def __init__(self,scalars,name=None): self.name = self._get_name(name) self.coords = self.get_n_seq_seq(scalars,self.default_value) if not 1<=len(self.coords[0])<=3: raise ValueError,'texture coordinates dimension must be 1, 2, or 3 but got %s'%(len(self.coords[0])) def to_string(self,format='ascii'): t = self.get_datatype(self.coords) ret = ['TEXTURE_COORDINATES %s %s %s'%(self.name,len(self.coords[0]),t)] ret.append(self.seq_to_string(self.coords,format,t)) return string.join(ret,'\n') def get_size(self): return len(self.coords) if __name__ == "__main__": print TextureCoordinates([[3,3],[4,3],240,3,2]).to_string() PyVTK-0.4.74/lib152/UnstructuredGrid.py0000644000175000017500000000647207301736721016501 0ustar pearupearu#!/usr/bin/env python """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.1 $ $Date: 2001-05-20 12:51:29 $ Pearu Peterson """ import DataSet import string class UnstructuredGrid(DataSet.DataSet): _vtk_cell_types_map = {'vertex':1,'poly_vertex':2,'line':3,'poly_line':4, 'triangle':5,'triangle_strip':6,'polygon':7,'pixel':8, 'quad':9,'tetra':10,'voxel':11,'hexahedron':12, 'wedge':13,'pyramid':14} _vtk_cell_nums_map = {'vertex':1,'poly_vertex':-1,'line':2,'poly_line':-1, 'triangle':3,'triangle_strip':-1,'polygon':-1,'pixel':4, 'quad':4,'tetra':4,'voxel':8,'hexahedron':8, 'wedge':6,'pyramid':5} def __init__(self,points,vertex=[],poly_vertex=[],line=[],poly_line=[], triangle=[],triangle_strip=[],polygon=[],pixel=[], quad=[],tetra=[],voxel=[],hexahedron=[],wedge=[],pyramid=[]): self.points = self.get_3_tuple_list(points,(0,0,0)) sz = len(self.points) for k in self._vtk_cell_types_map.keys(): exec 'self.%s = self.get_seq_seq(%s,[])'%(k,k) if k=='vertex': r = [] for v in self.vertex: r = r + map(lambda a:[a],v) self.vertex = r if self._check_int_seq(getattr(self,k),sz): raise ValueError,'In cell %s: must be (seq of seq|seq) integers less than %s'%(k,sz) for k,n in self._vtk_cell_nums_map.items(): if n==-1: continue kv = getattr(self,k) if kv==[] or kv[0]==[]: continue for v in kv: if len(v)!=n: raise ValueError,'Cell %s requires exactly %s points but got %s: %s'%(`k`,n,len(v),v) def to_string(self,format='ascii'): t = self.get_datatype(self.points) ret = ['DATASET UNSTRUCTURED_GRID', 'POINTS %s %s'%(self.get_size(),t) ] ret.append(self.seq_to_string(self.points,format,t)) tps = [] r = '' sz = 0 for k in self._vtk_cell_types_map.keys(): kv = getattr(self,k) if kv==[] or kv[0]==[]: continue r = r + self.seq_to_string(map(lambda v:[len(v)]+list(v),kv),format,'int') #r = r + self.seq_to_string([[len(v)]+list(v) for v in kv],format,'int') for v in kv: tps.append(self._vtk_cell_types_map[k]) sz = sz + len(v)+1 ret = ret + ['CELLS %s %s'%(len(tps),sz), r, 'CELL_TYPES %s'%(len(tps)), self.seq_to_string(tps,format,'int')] return string.join(ret,'\n') def get_cell_size(self): sz = 0 for k in self._vtk_cell_types_map.keys(): kv = getattr(self,k) if kv==[] or kv[0]==[]: continue sz = sz + len(kv) return sz if __name__ == "__main__": print UnstructuredGrid([[1,2],[2,4],3,5], line = [[2,3],[1,2],[2,3]], vertex=2) PyVTK-0.4.74/lib152/Vectors.py0000644000175000017500000000174307301736721014605 0ustar pearupearu#!/usr/bin/env python """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.1 $ $Date: 2001-05-20 12:51:29 $ Pearu Peterson """ import DataSetAttr import string class Vectors(DataSetAttr.DataSetAttr): """Holds VTK Vectors. """ def __init__(self,vectors,name=None): self.name = self._get_name(name) self.vectors = self.get_3_tuple_list(vectors,(self.default_value,)*3) def to_string(self,format='ascii'): t = self.get_datatype(self.vectors) ret = ['VECTORS %s %s'%(self.name,t), self.seq_to_string(self.vectors,format,t)] return string.join(ret,'\n') def get_size(self): return len(self.vectors) if __name__ == "__main__": print Vectors([[3,3],[4,3.],240,3,2]).to_string() PyVTK-0.4.74/lib152/__init__.py0000644000175000017500000001465007301736721014720 0ustar pearupearu#!/usr/bin/env python """ PyVTK provides tools for manipulating VTK files in Python. VtkData - create VTK files from Python objects. """ """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.1 $ $Date: 2001-05-20 12:51:29 $ Pearu Peterson """ __author__ = "Pearu Peterson " __license__ = "LGPL (see http://www.fsf.org)" from __version__ import __version__ __all__ = ['StructuredPoints','StructuredGrid','UnstructuredGrid','RectilinearGrid', 'RectilinearGrid','PolyData', 'Scalars','ColorScalars','LookupTable','Vectors','Normals', 'TextureCoordinates','Tensors','Field', 'PointData','CellData', 'VtkData'] import common import string from StructuredPoints import StructuredPoints from StructuredGrid import StructuredGrid from UnstructuredGrid import UnstructuredGrid from RectilinearGrid import RectilinearGrid from PolyData import PolyData from Scalars import Scalars from ColorScalars import ColorScalars from LookupTable import LookupTable from Vectors import Vectors from Normals import Normals from TextureCoordinates import TextureCoordinates from Tensors import Tensors from Field import Field from Data import PointData,CellData class VtkData(common.Common): """ VtkData ======= Represents VTK file that has four relevant parts: header - string up to length 256 format - string: ascii | binary DataSet - StructuredPoints | StructuredGrid | UnstructuredGrid | RectilinearGrid | PolyData Data - PointData | CellData Usage: ------ v = VtkData( [,
,,..]) v.tofile(filename, format = 'ascii') - save VTK data to file. DataSet ======= StructuredPoints(<3-sequence of dimensions> [,<3-sequence of origin> [, <3-sequence of spacing>]]) StructuredGrid(<3-sequence of dimensions>, ) UnstructuredGrid( [, = ]) cell - vertex | poly_vertex | line | poly_line | triangle | triangle_strip | polygon | pixel | quad | tetra | voxel | hexahedron | wedge | pyramid RectilinearGrid([x = ], [y = ], [z = ]) PolyData(, [vertices = ], [lines = ], [polygons = ], [triangle_strips = ]) Data ==== PointData | CellData ([]) - construct Data instance DataSetAttr =========== DataSetAttr - Scalars | ColorScalars | LookupTable | Vectors | Normals | TextureCoordinates | Tensors | Field Scalars( [,name[, lookup_table]]) ColorScalars( [,name]) LookupTable( [,name]) Vectors( [,name]) Normals( [,name]) TextureCoordinates( [,name]) Tensors( [,name]) Field([name,] [arrayname_1 = sequence of n_1-sequences, ... arrayname_m = sequence of n_m-sequences,]) where len(array_1) == .. == len(array_m) must hold. """ header = None point_data = None cell_data = None def __init__(self,structure,*args): if not common.is_dataset(structure): raise TypeError,'argument structure must be StructuredPoints|StructuredGrid|UnstructuredGrid|RectilinearGrid|PolyData but got %s'%(type(structure)) self.structure = structure for a in args: if common.is_string(a): if len(a)>255: self.skipping('striping header string to length 256') self.header = a[:256] elif common.is_pointdata(a): self.point_data = a elif common.is_celldata(a): self.cell_data = a else: self.skipping('unexpexted argument %s'%(type(a))) if self.header is None: self.header = 'Really cool data' self.warning('Using header=%s'%(`self.header`)) if self.point_data is None and self.cell_data is None: self.warning('No data defined') if self.point_data is not None: s = self.structure.get_size() s1 = self.point_data.get_size() if s1 != s: raise ValueError,'DataSet (size=%s) and PointData (size=%s) have different sizes'%(s,s1) if self.cell_data is not None: s = self.structure.get_cell_size() s1 = self.cell_data.get_size() if s1 != s: raise ValueError,'DataSet (cell_size=%s) and CellData (size=%s) have different sizes'%(s,s1) def tofile(self, filename, format = 'ascii'): if not common.is_string(filename): raise TypeError,'argument filename must be string but got %s'%(type(filename)) if format not in ['ascii','binary']: raise TypeError,'argument format must be ascii | binary' filename = string.strip(filename) if not filename: raise ValueError,'filename must be non-empty string' if filename[-4:]!='.vtk': filename = filename + '.vtk' f = open(filename,'wb') f.write('# vtk DataFile Version 2.0\n') f.write(self.header+'\n') f.write(string.upper(format)+'\n') f.write(self.structure.to_string(format)+'\n') if self.cell_data: f.write(self.cell_data.to_string(format)+'\n') if self.point_data: f.write(self.point_data.to_string(format)) f.close() if __name__ == "__main__": vtk = VtkData(StructuredPoints((3,1,1)), 'This is title', PointData(Scalars([3,4,5])) ) vtk.tofile('test') PyVTK-0.4.74/lib152/__version__.py0000644000175000017500000000002710567304606015434 0ustar pearupearu__version__ = "0.4.74" PyVTK-0.4.74/lib152/common.py0000644000175000017500000002420407301736721014445 0ustar pearupearu#!/usr/bin/env python """ Copyright 2001 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.1 $ $Date: 2001-05-20 12:51:29 $ Pearu Peterson """ import types import sys import struct import string def is_sequence(obj): """Check if obj is sequence.""" try: len(obj) return 1 except TypeError: return 0 def is_sequence2(obj): """Check if obj is sequence of sequences.""" return is_sequence(obj) and len(obj) and is_sequence(obj[0]) def is_sequence3(obj): """Check if obj is sequence of sequences of sequences.""" return is_sequence(obj) and len(obj) and is_sequence2(obj[0]) def is_number(obj): """Check if obj is number.""" return type(obj) in [types.IntType,types.FloatType] def is_int(obj): """Check if obj is integer.""" return type(obj) is types.IntType def is_string(obj): """Check if obj is string.""" return type(obj) is types.StringType def is_int255(obj): if is_sequence(obj): for v in obj: r = is_int255(v) if not r: return 0 return 1 return 0<=obj<256 def is_float01(obj): if is_sequence(obj): for v in obj: r = is_float01(v) if not r: return 0 return 1 return 0<=obj<=1 def is_datasetattr(obj): return type(obj) is types.InstanceType and isinstance(obj,DataSetAttr.DataSetAttr) def is_dataset(obj): return type(obj) is types.InstanceType and isinstance(obj,DataSet.DataSet) def is_pointdata(obj): return type(obj) is types.InstanceType and isinstance(obj,Data.PointData) def is_celldata(obj): return type(obj) is types.InstanceType and isinstance(obj,Data.CellData) class Common: """Abstract class. Defines output, checker, and getter functions.""" struct_fmt_map = {'char':'c', 'long':'l','double':'d', 'int':'i','float':'f', 'unsigned char':'B'} default_int = 'int' default_float = 'float' def _get_trace(self,m): try: frame = sys._getframe().f_back except AttributeError: # Python 2.0 does not have sys._getframe frame = None n = '' while frame: i = frame.f_code.co_name n = '%s.%s'%(i,n) if i=='__init__': break frame = frame.f_back sys.stderr.write('%s.%s:\n\t%s\n'%(self.__class__.__name__,n[:-1],m)) def warning(self,m=''): self._get_trace(m) def skipping(self,m=''): self._get_trace(m) def error(self,m=''): self._get_trace(m) def __str__(self): return self.to_string() def get_datatype(self,obj): t = type(obj) if t is types.IntType: return self.default_int if t is types.FloatType: return self.default_float if not (is_sequence(obj) and len(obj)): raise ValueError,'expected int|float|non-empty sequence but got %s'%t for o in obj: r = self.get_datatype(o) if r==self.default_float: break return r def get_seq(self,obj,default=None): """Return sequence.""" if is_sequence(obj): return obj if is_number(obj): return [obj] if obj is None and default is not None: self.warning('using default value (%s)'%(default)) return self.get_seq(default) raise ValueError,'expected sequence|number but got %s'%(type(obj)) def get_seq_seq(self,obj,default=None): """Return sequence of sequences.""" if is_sequence2(obj): return map(lambda o,s=self,d=default:s.get_seq(o,d),obj) else: return [self.get_seq(obj,default)] def get_n_seq_seq(self,obj,default): seq = self.get_seq_seq(obj,default) if is_sequence(default): n = len(default) else: n = max(map(len,seq)) default = [default]*n ret = [] flag = 0 for v in seq: if len(v)!=n: ret.append(list(v)+default[len(v):]) flag = 1 else: ret.append(list(v)) if flag: self.warning('Some items were filled with default value (%s) to obtain size=%s'%(default[0],n)) return ret def get_3_tuple(self,obj,default=None): """Return 3-tuple from number -> (obj,default[1],default[2]) 0-sequence|None -> default 1-sequence -> (obj[0],default[1],default[2]) 2-sequence -> (obj[0],obj[1],default[2]) (3 or more)-sequence -> (obj[0],obj[1],obj[2]) """ if not (default is not None \ and type(default) is types.TupleType \ and len(default)==3): raise ValueError,'argument default must be 3-tuple|None but got %s'%(default) if is_sequence(obj): n = len(obj) if n>3: self.warning('expected 3-sequence but got %s-%s'%(n,type(obj))) if n>=3: return tuple(obj) self.warning('filling with default value (%s) to obtain size=3'%(default[0])) if default is not None: if n==0: return default elif n==1: return (obj[0],default[1],default[2]) elif n==2: return (obj[0],obj[1],default[2]) elif is_number(obj) and default is not None: self.warning('filling with default value (%s) to obtain size=3'%(default[0])) return (obj,default[1],default[2]) elif obj is None and default is not None: self.warning('filling with default value (%s) to obtain size=3'%(default[0])) return default raise ValueError,'failed to construct 3-tuple from %s-%s'%(n,type(obj)) def get_3_tuple_list(self,obj,default=None): """Return list of 3-tuples from sequence of a sequence, sequence - it is mapped to sequence of 3-sequences if possible number """ if is_sequence2(obj): return map(lambda o,s=self,d=default:s.get_3_tuple(o,d),obj) #return [self.get_3_tuple(o,default) for o in obj] elif is_sequence(obj): ret = [] for i in range(0,len(obj),3): ret.append(self.get_3_tuple(obj[i:i+3],default)) return ret #return [self.get_3_tuple(obj[i:i+3],default) for i in range(0,len(obj),3)] else: return [self.get_3_tuple(obj,default)] def get_3_3_tuple(self,obj,default=None): """Return tuple of 3-tuples """ if is_sequence2(obj): ret = [] for i in range(3): if i9: self.warning('ignoring elements obj[i], i>=9') r = obj[:9] rr = [] for j in range(0,len(r),3): rr.append(self.get_3_tuple(r[j:j+3],default)) r = rr #r = [self.get_3_tuple(r[j:j+3],default) for j in range(0,len(r),3)] if len(r)<3: self.warning('filling with default value (%s) to obtain size=3'%(default[0])) while len(r)<3: r.append(self.get_3_tuple(default,default)) return tuple(r) self.warning('filling with default value (%s) to obtain size=3'%(default[0])) r1 = self.get_3_tuple(obj,default) r2 = self.get_3_tuple(default,default) r3 = self.get_3_tuple(default,default) return (r1,r2,r3) def get_3_3_tuple_list(self,obj,default=None): """Return list of 3x3-tuples. """ if is_sequence3(obj): return map(lambda o,s=self,d=default:s.get_3_3_tuple(o,d),obj) #return [self.get_3_3_tuple(o,default) for o in obj] return [self.get_3_3_tuple(obj,default)] def _get_nof_objs(self,seq): if is_sequence2(seq): return reduce(lambda x,y:x+y,map(self._get_nof_objs,seq),0) #return reduce(lambda x,y:x+y,[self._get_nof_objs(s) for s in seq],0) return len(seq) def seq_to_string(self,seq,format,datatype): assert is_sequence(seq),'expected sequence but got %s'%(type(seq)) if format == 'ascii': if is_sequence2(seq): sep = '\n' if is_sequence3(seq): sep = '\n\n' return string.join(map(lambda v,s=self,f=format,d=datatype:s.seq_to_string(v,f,d),seq),sep) #return sep.join([self.seq_to_string(v,format,datatype) for v in seq]) else: return string.join(map(str,seq),' ') elif format == 'binary': if is_sequence2(seq): return string.join(map(lambda v,s=self,f=format,d=datatype:s.seq_to_string(v,f,d),seq),'') #return ''.join([''.join(self.seq_to_string(v,format,datatype)) for v in seq]) else: try: fmt = self.struct_fmt_map[datatype] except KeyError: fmt = None if fmt: return apply(struct.pack,tuple([fmt*len(seq)]+list(seq))) #return struct.pack(fmt*len(seq),*seq) raise NotImplementedError,'format=%s, datatype=%s'%(format,datatype) def float01_to_int255(self,seq): assert is_float01(seq) if is_sequence(seq): return map(self.float01_to_int255,seq) #return [self.float01_to_int255(l) for l in seq] else: return int(seq*255) def int255_to_float01(self,seq): assert is_int255(seq) if is_sequence(seq): return map(self.int255_to_float01,seq) #return [self.int255_to_float01(l) for l in seq] else: return round(seq/255.0,6) import Data import DataSet import DataSetAttr PyVTK-0.4.74/tools/0000755000175000017500000000000010567304606012744 5ustar pearupearuPyVTK-0.4.74/tools/get_revision.py0000644000175000017500000000170607301736721016016 0ustar pearupearu#!/usr/bin/env python """ This file is executed from ../setup.py only. Calculate cumulative version from Revision strings. Copyright 2000 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the LGPL. See http://www.fsf.org NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Revision: 1.1 $ $Date: 2001-05-20 12:51:29 $ Pearu Peterson """ import os,fileinput,re files=[] for d in ['lib']: for f in os.listdir(d): if f[-3:]=='.py' or f[-2:]=='.c': fn = os.path.join(d,f) if os.path.exists(fn): files.append(fn) else: print 'File "%s" does not exists. Skipping.'%(fn) revision_version = 0 for l in fileinput.input(files): m = re.match(r'.*?\$Re[v]ision:\s*\d+[.](?P\d+)\s*\$',l) if m: revision_version = revision_version + eval(m.group('rev')) fileinput.nextfile() PyVTK-0.4.74/BUGS.txt0000644000175000017500000000002607534676265013120 0ustar pearupearu None at this moment. PyVTK-0.4.74/MANIFEST.in0000644000175000017500000000034107644310610013332 0ustar pearupearurecursive-include tools *.py recursive-include examples *.py recursive-include lib *.py recursive-include lib152 *.py include doc/*.html include BUGS.txt include TODO.txt include NEWS.txt include Makefile include MANIFEST.in PyVTK-0.4.74/Makefile0000644000175000017500000000173607301736721013252 0ustar pearupearu# Makefile for installing Python package under Python 1.x. # Use GNU make for making. # $Revision: 1.1 $ # $Date: 2001-05-20 12:51:29 $ # Pearu Peterson PYTHON = python PREFIX=$(shell $(PYTHON) -c "import sys;print sys.prefix") VERSION=$(shell $(PYTHON) -c "import sys;print sys.version[:3]") PACKAGE = pyvtk LIBDIR=$(shell $(PYTHON) -c "import sys;print{'1':'lib152','2':'lib'}[sys.version[0]]") INSTALLDIRECTORY = $(PREFIX)/lib/python$(VERSION)/site-packages/$(PACKAGE) INSTALLDIR = install -d INSTALLEXEC = install -m 755 INSTALLDATA = install -m 644 .PHONY: install all: @echo "Use 'make install' to install $(PACKAGE) (in $(LIBDIR)) to" $(INSTALLDIRECTORY) install: rm -f $(INSTALLDIRECTORY)/*.pyc $(INSTALLDIRECTORY)/*.pyo $(INSTALLDIR) $(INSTALLDIRECTORY) $(INSTALLDATA) $(LIBDIR)/*.py $(INSTALLDIRECTORY) cd $(INSTALLDIRECTORY) && echo "$(PACKAGE)" > ../$(PACKAGE).pth @echo "***********" @echo "$(PACKAGE) is installed succesfully to" $(INSTALLDIRECTORY) PyVTK-0.4.74/NEWS.txt0000644000175000017500000000231210567253561013122 0ustar pearupearu 0.4 (???) * Fixed Bug#401063: python-pyvtk in Debian (note from Steve M. Robbins). * Fixed numpy scalar testing (thanks to Andrew Straw, David M. Cooke). * Added numpy array support (thanks to Norbert Nemec). * Support for different types of Numeric arrays. * Fixed missing `import common` in Tensors.py. * Updated vtk file formats link. * Added MANIFEST.in to MANIFEST.in; disabled print statements (feature request: Konrad Hinsen) * Fixed binary writer for UnstructuredGrid. * Fixed 256 characters limit bug in header of VTK file (bug report and fix: Steve M. Robbins) * Fixed interruption of a `while 1: ..` cycle in PolyData.py * Fixed writing binary files (bug report and fix: Hans Fangohr) * Support for Python 1.5, 2.0 is dropped until one asks for it. * Implemented .append(). * .get_points() returns sequence of 3-tuples of points. * Introduced .() for constructing VTK data from VTK data structure. * Implemented VTK data reader from a file with ASCII format. Usage: VtkData(, only_structure = 0) * Finished documentation strings of relevant classes/methods. * `No data' gives warning (was ValueError). 0.3 (21 May 2001) * First public release.PyVTK-0.4.74/README.txt0000644000175000017500000000314507305502006013273 0ustar pearupearu PyVTK "Collection of tools for manipulating VTK files in Python" by Pearu Peterson http://cens.ioc.ee/projects/pyvtk/ INTRODUCTION ------------ PyVTK provides tools for manipulating VTK files in Python: VtkData - Create VTK file from Python objects. It fully supports VTK File Formats Standard 2.0. The features includes: *** ascii and binary output, ascii input *** DataSet formats: StructuredPoints, StructuredGrid, RectilinearGrid, PolyData, UnstructuredGrid *** Data formats: PointData, CellData *** DataSetAttr formats: Scalars, ColorScalars, LookupTable, Vectors, Normals, TextureCoordinates, Tensors, Field LICENSE ------- GNU LGPL (see http://www.fsf.org) REQUIREMENTS ------------ Python - pyvtk is developed under Python 2.1. But it is tested to work also under Python 2.0 and Python 1.5.2. In future, Python 1.5 will be supported only if one asks for it. BUILDING and INSTALLING ----------------------- Python 2.x users, execute python setup.py install Python 1.x users, execute make install USAGE ----- >>> import pyvtk To learn how to use pyvtk.VtkData, see examples in examples/ directory. For reference, execute pydoc pyvtk.VtkData or in Python: >>> from pydoc import help >>> help(pyvtk.VtkData) --- Pearu Peterson, 21 May 2001 PyVTK-0.4.74/TODO.txt0000644000175000017500000000054107733256075013121 0ustar pearupearu* April 7, 2003 Implement vtk File Formats 3.0 support * May 31, 2001: Need more efficient VTK data reader. * May 21, 2001: Get binary output working [DONE. Thanks to Hans Fangohr]. Document relevant classes and relevant methods [DONE]. Figure out how to use the SCALARS numComp flag and implement its support. More tests and examples ... PyVTK-0.4.74/setup.py0000755000175000017500000000350007742570661013326 0ustar pearupearu#!/usr/bin/env python import os import sys from distutils.core import setup version_file = os.path.join('lib','__version__.py') if 1 or not os.path.exists(version_file): major_version = 0 minor_version = 4 execfile(os.path.join('tools','get_revision.py')) __version__='%d.%d.%d'%(major_version,minor_version,revision_version) for l in ['lib','lib152']: f = open(os.path.join(l,'__version__.py'),'w') f.write('__version__ = "%s"\n'%(__version__)) f.close() execfile(version_file) if sys.version[:3]>='2.3': config = dict(\ download_url='http://cens.ioc.ee/projects/pyvtk/rel-0.x/PyVTK-0.latest.tar.gz', keywords = ['VTK'], classifiers=[ 'Development Status :: 4 - Beta', 'Intended Audience :: Science/Research', 'License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)', 'Natural Language :: English', 'Operating System :: OS Independent', 'Programming Language :: Python', 'Topic :: Scientific/Engineering :: Visualization', ], platforms = 'All') else: config = {} print "PyVTK Version",__version__ setup (name = "PyVTK", version = __version__, description = "PyVTK - tools for manipulating VTK files in Python", author = "Pearu Peterson", author_email = "pearu@cens.ioc.ee", maintainer = "Pearu Peterson", maintainer_email = "pearu@cens.ioc.ee", license = "LGPL", long_description= """\ PyVTK provides tools for manipulating VTK (Visualization Toolkit) files in Python: VtkData - create VTK files from Python / read VTK files to Python.""", url = "http://cens.ioc.ee/projects/pyvtk/", packages = ['pyvtk'], package_dir = {'pyvtk':{'2':'lib','1':'lib152'}[sys.version[0]]}, **config ) PyVTK-0.4.74/PKG-INFO0000644000175000017500000000156510567304606012710 0ustar pearupearuMetadata-Version: 1.0 Name: PyVTK Version: 0.4.74 Summary: PyVTK - tools for manipulating VTK files in Python Home-page: http://cens.ioc.ee/projects/pyvtk/ Author: Pearu Peterson Author-email: pearu@cens.ioc.ee License: LGPL Download-URL: http://cens.ioc.ee/projects/pyvtk/rel-0.x/PyVTK-0.latest.tar.gz Description: PyVTK provides tools for manipulating VTK (Visualization Toolkit) files in Python: VtkData - create VTK files from Python / read VTK files to Python. Keywords: VTK Platform: All Classifier: Development Status :: 4 - Beta Classifier: Intended Audience :: Science/Research Classifier: License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL) Classifier: Natural Language :: English Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Topic :: Scientific/Engineering :: Visualization