def __init__(self, *args, **kws): assert args, 'expected at least one argument' if type(args[0]) is str: if 'only_structure' in kws 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 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: log.warning('striping header string to a length =255') self.header = a[:255] elif is_pointdata(a): self.point_data = a elif is_celldata(a): self.cell_data = a else: log.warning('unexpexted argument %s', type(a)) if self.header is None: self.header = 'Really cool data' log.info('Using default header=%s' % (repr(self.header))) if self.point_data is None and self.cell_data is None: log.info('No point/cell 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 fromfile(self, filename, only_structure=0): filename = filename.strip() if filename[-4:] != '.vtk': filename += '.vtk' f = open(filename, 'rb') l = f.readline() fileversion = l.strip().replace(b' ', b'').lower() if not fileversion == b'#vtkdatafileversion2.0': print( 'File %s is not in VTK 2.0 format, got %s but continuing anyway..' % (filename, fileversion)) self.header = f.readline().rstrip().decode('ascii', 'replace') format = f.readline().strip().lower() if format not in [b'ascii', b'binary']: raise ValueError('Expected ascii|binary but got %s' % (repr(format))) if format == b'binary': raise NotImplementedError('reading vtk binary format') l = common._getline(f).decode('ascii').lower().split(' ') if l[0].strip() != 'dataset': raise ValueError('expected dataset but got %s' % (l[0])) try: ff = parsers[l[1]] except KeyError: 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.decode('ascii').lower().split(' ')] assert len(l) == 2 and l[0] in ['cell_data', 'point_data'], l[0] data = l[0] n = int(l[1]) lst = [] while 1: l = common._getline(f) if not l: break sl = [s.strip() for s in l.decode('ascii').split()] k = sl[0].lower() if k not in [ 'scalars', 'color_scalars', 'lookup_table', 'vectors', 'normals', 'texture_coordinates', 'tensors', 'field' ]: break try: ff = parsers[k] except KeyError: 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()