Source code for butterfly.sampleDict
# coding=utf-8
"""sampleDict class."""
from foamfile import Condition, foam_file_from_file
from collections import OrderedDict
[docs]class SampleDict(Condition):
"""Probes function."""
# set default valus for this class
__default_values = OrderedDict()
__default_values['libs'] = '("libsampling.so")'
__default_values['interpolationScheme'] = 'cellPoint'
__default_values['setFormat'] = 'raw'
__default_values['type'] = 'sets'
__default_values['fields'] = '(p U)' # Fields
__default_values['sets'] = OrderedDict()
def __init__(self, values=None):
"""Init class."""
super(SampleDict, self).__init__(
name='sampleDict', cls='dictionary', location='system',
default_values=self.__default_values, values=values
)
self._pts = None
self._name = None
self.filename = 'sampleName'
[docs] @classmethod
def from_file(cls, filepath):
"""Create a FoamFile from a file.
Args:
filepath: Full file path to dictionary.
"""
_cls = cls(values=foam_file_from_file(filepath, cls.__name__))
return _cls
[docs] @classmethod
def from_points(cls, name, points, fields):
"""Create sampleDict from points and fields."""
cls_ = cls()
cls_.filename = name
cls_.points = points
cls_.fields = fields
return cls_
@property
def points_count(self):
"""Get number of probes."""
if not self.points:
return 0
else:
return len(' '.join(self.points)[1:-1].split(')')) - 1
@property
def output_filenames(self):
"""A tuple of output file names."""
return tuple('{}_{}.xy'.format(self.filename, f) for f in self.fields)
@property
def points(self):
"""Get and set probe locations from list of tuples."""
return self._pts
@points.setter
def points(self, pts):
self._pts = tuple(str(tuple(pt)).replace(',', ' ') for pt in pts)
self.values['sets'][self._name]['points'] = '({})'.format(' '.join(self._pts))
@property
def filename(self):
"""Get SampleDict filename."""
return self._name
@filename.setter
def filename(self, n):
"""Set SampleDict filename."""
if not n:
return
if self._name in self.values['sets']:
del(self.values['sets'][self._name])
self._name = str(n)
self.values['sets'][self._name] = OrderedDict()
self.values['sets'][self._name]['type'] = 'cloud'
self.values['sets'][self._name]['axis'] = 'xyz'
if self._pts:
self.values['sets'][self._name]['points'] = \
'({})'.format(' '.join(self._pts))
@property
def fields(self):
"""Get and set probes fields from list of tuples."""
return self.values['fields'] \
.replace('(', '').replace(')', '').split()
@fields.setter
def fields(self, fields_list):
if not fields_list:
return
self.values['fields'] = \
str(tuple(fields_list)).replace(',', ' ') \
.replace("'", '').replace('"', '') \
.replace("\\r", '').replace("\\n", ' ')
[docs] def save(self, project_folder, sub_folder=None):
"""Save sampleDict file.
The file will be named
"""
if self.points_count == 0:
return
else:
fp = super(SampleDict, self).save(project_folder, sub_folder)
# update the sets{} for sets();
# This is quite hacky but will work
with open(fp, 'rb') as inf:
f = inf.read()
ff = f.replace('sets\n{', 'sets\n(')[:-1] + ');\n'
with open(fp, 'wb') as outf:
outf.write(ff)
return fp