Source code for sknano.generators._base

# -*- coding: utf-8 -*-
"""
===============================================================================
Structure generator base module (:mod:`sknano.generators._base`)
===============================================================================

.. currentmodule:: sknano.generators._base

"""
from __future__ import absolute_import, division, print_function
__docformat__ = 'restructuredtext en'

import copy
import os

from sknano.core.atoms import StructureAtom as Atom, StructureAtoms as Atoms
from sknano.io import StructureData, StructureWriter, \
    default_structure_format, supported_structure_formats

__all__ = ['Atom', 'Atoms', 'GeneratorBase', 'STRUCTURE_GENERATORS']


#: Tuple of structure generator classes.
STRUCTURE_GENERATORS = ('FullereneGenerator',
                        'GrapheneGenerator',
                        'BilayerGrapheneGenerator',
                        'UnrolledSWNTGenerator',
                        'SWNTGenerator',
                        'SWNTBundleGenerator',
                        'MWNTGenerator',
                        'MWNTBundleGenerator')


[docs]class GeneratorBase(object): """Base class for generator classes""" def __init__(self, **kwargs): self.structure_data = StructureData() super(GeneratorBase, self).__init__(**kwargs) @property def atoms(self): """Return structure :class:`~sknano.core.atoms.Atoms`.""" return self.structure_data.atoms @atoms.setter def atoms(self, value): if not isinstance(value, Atoms): raise TypeError('Expected an `Atoms` object.') self.structure_data.atoms = value @atoms.deleter def atoms(self): del self.structure_data.atoms @property def structure_data(self): """Return :class:`~sknano.io.StructureData` instance.""" return self._structure_data @structure_data.setter def structure_data(self, value): """Set :class:`~sknano.io.StructureData` instance.""" if not isinstance(value, StructureData): raise TypeError('Expected a `StructureData` object.') self._structure_data = value @structure_data.deleter def structure_data(self): del self._structure_data @property def structure(self): """Alias to :attr:`~GeneratorBase.structure_data`.""" return self.structure_data @structure.setter def structure(self, value): """Alias to :attr:`~GeneratorBase.structure_data`.""" self.structure_data = value @structure.deleter def structure(self): del self.structure_data
[docs] def save_data(self, fname=None, outpath=None, structure_format=None, rotation_angle=None, rot_axis=None, anchor_point=None, deg2rad=True, center_CM=True, savecopy=True, **kwargs): """Save structure data. .. todo:: Use the unit cell to set the bounds on output. Parameters ---------- fname : {None, str}, optional file name string outpath : str, optional Output path for structure data file. structure_format : {None, str}, optional chemical file format of saved structure data. Must be one of: - `xyz` - `data` If `None`, then guess based on `fname` file extension or default to `xyz` format. rotation_angle : {None, float}, optional Angle of rotation rot_axis : {'x', 'y', 'z'}, optional Rotation axis anchor_point : array_like, optional Rotation axis origin deg2rad : bool, optional Convert `rotation_angle` from degrees to radians. center_CM : bool, optional Center center-of-mass on origin. """ if fname.endswith(supported_structure_formats) and \ structure_format is None: for ext in supported_structure_formats: if fname.endswith(ext): structure_format = ext break elif structure_format is None or \ structure_format not in supported_structure_formats or \ (not fname.endswith(supported_structure_formats) and structure_format not in supported_structure_formats): structure_format = default_structure_format if not fname.endswith(structure_format): fname += '.' + structure_format self.fname = fname if outpath is not None: fpath = os.path.join(outpath, fname) else: fpath = os.path.join(os.getcwd(), fname) self.fpath = fpath #self._structure_format = structure_format if savecopy: atoms = copy.deepcopy(self.atoms) else: atoms = self.atoms if center_CM: atoms.center_CM() if rotation_angle is not None: atoms.rotate(angle=rotation_angle, rot_axis=rot_axis, anchor_point=anchor_point, deg2rad=deg2rad) StructureWriter.write(fname=fname, outpath=outpath, atoms=atoms, structure_format=structure_format)