Source code for valvepcf.classes

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals

from builtins import hex
from builtins import super
from future import standard_library
standard_library.install_aliases()

import uuid

from valvepcf.constants import OPERATORS


[docs]class PcfNode(object): """ An abstract class to represent different types of pcf elements and hold their collections of attributes """
[docs] def __init__(self, ename, etype, edesc='', euuid=None): """ :param ename: the element's name :type ename: str :param etype: the element's type :type etype: str :param edesc: the element's description :type edesc: str, optional :param euuid: the element's uuid (autogenerated if not provided) :type euuid: str, optional """ self._type = etype #: :type: (str) - The element's type. self._name = ename or 'untitled' #: :type: (str) - The element's name. #: :type: (str) - The element's uuid (generally autogenerated). self._uuid = euuid or uuid.uuid4().bytes #: :type: (str) - The element's description. self._desc = edesc or 'DmElement' #: :type: (list[PcfAttribute]) - The element's list of attributes. self.attributes = []
[docs] def __repr__(self, indent=0, operator=''): """A printable summary of the PcfNode and its child nodes. :returns: A Python formated string. :rtype: str """ module_ = type(self).__module__ name_ = type(self).__name__ type_ = operator or self._type ret = " " * indent ret += "<{0}.{1} {2}".format(module_, name_, type_) + \ " named '{0}' at {1}>".format(self._name, hex(id(self))) return ret
[docs]class PcfRootNode(PcfNode): """ PcfRootNode is the top level structure which includes a collection of :py:class:`PcfSystemNode<PcfSystemNode>` as well as pcf format and schema versions. """
[docs] def __init__(self, ename, etype, edesc='', euuid=None): super().__init__(ename, etype, edesc, euuid) self.binary_format = 'dmx' #: :type: (str) Always 'dmx' self.binary_version = 3 #: :type: (int) Ranges from 2 to 5 self.pcf_format = 'pcf' #: :type: (str) 'dmx' or 'pcf' self.pcf_version = 2 #: :type: (int) Ranges from 1 to 2 #: :type: (list[PcfSystemNode]) List of particle systems self.systems = [] self._unaccounted_strings = [] self._order = None
def __repr__(self, indent=0): ret = super().__repr__() for syst in self.systems: ret += '\n' + syst.__repr__(indent + 1) return ret
[docs]class PcfSystemNode(PcfNode): """PcfSystemNode is used to define a pcf system which regroups multiple :py:class:`PcfOperatorNode<PcfOperatorNode>`. Operators are separated in specialized lists."""
[docs] def __init__(self, ename, etype, edesc='', euuid=None): super().__init__(ename, etype, edesc, euuid) #: :type: (list[PcfOperatorNode]) - list of renderers self.renderers = [] #: :type: (list[PcfOperatorNode]) - list of operators self.operators = [] #: :type: (list[PcfOperatorNode]) - list of initializers self.initializers = [] #: :type: (list[PcfOperatorNode]) - list of emmiters self.emitters = [] #: :type: (list[PcfRefNode]) - list of childrens self.children = [] #: :type: (list[PcfOperatorNode]) - list of forces self.forces = [] #: :type: (list[PcfOperatorNode]) - list of constraints self.constraints = []
def __repr__(self, indent=0): ret = super().__repr__(indent) for c in reversed(OPERATORS): for node in getattr(self, c): ret += '\n' + node.__repr__(indent + 1, c) return ret
[docs]class PcfOperatorNode(PcfNode): """PcfOperatorNode is used to hold specific collection of attributes for :py:class:`PcfSystemNode<PcfSystemNode>`."""
[docs]class PcfRefNode(PcfNode): """PcfRefNode is used to create child relationships between particle systems."""
[docs] def __init__(self, ename, etype, edesc='', euuid=None): super().__init__(ename, etype, edesc, euuid) #: :type: (PcfSystemNode) - reference an other system self.ref = None
[docs]class PcfAttribute(object): """ PcfAttribute represents an attribute held by an element. """
[docs] def __init__(self, name, type, data): """ :param name: The attribute's name. :param type: The attribute's type. :param data: The attribute's value. """ #: :type: (str) - Name of the attribute self._name = name #: :type: (int) - Ranges (1-28), defines the type of :py:attr:`_data<_data>` self._type = type #: The attribute's value, can be one of many different types, must match :py:attr:`_type<_type>` self._data = data