forked from bartvdbraak/blender
196 lines
4.6 KiB
Python
196 lines
4.6 KiB
Python
#
|
|
# Blender mid level modules
|
|
# author: strubi@blender.nl
|
|
#
|
|
#
|
|
|
|
"""Shadow class module
|
|
|
|
These classes shadow the internal Blender objects
|
|
|
|
There is no need for you to use the shadow module really - it is
|
|
just there for documentation. Blender object classes with a common
|
|
subset of function members derive from these sub classes.
|
|
"""
|
|
|
|
|
|
def _List(list, Wrapper):
|
|
"""This function returns list of wrappers, taking a list of raw objects
|
|
and the wrapper method"""
|
|
return map(Wrapper, list)
|
|
|
|
def _getModeBits(dict, attr):
|
|
list = []
|
|
for k in dict.keys():
|
|
i = dict[k]
|
|
if attr & i:
|
|
list.append(k)
|
|
return list
|
|
|
|
def _setModeBits(dict, args):
|
|
flags = 0
|
|
try:
|
|
for a in args:
|
|
flags |= dict[a]
|
|
except:
|
|
raise TypeError, "mode must be one of %s" % dict.keys()
|
|
return flags
|
|
|
|
|
|
def _link(self, data):
|
|
"""Links Object 'self' with data 'data'. The data type must match
|
|
the Object's type, so you cannot link a Lamp to a mesh type Object"""
|
|
try:
|
|
self._object.link(data._object)
|
|
except:
|
|
print "Users:", self._object.users
|
|
|
|
class shadow:
|
|
"""This is the shadow base class"""
|
|
_getters = {}
|
|
_setters = {}
|
|
_emulation = {}
|
|
|
|
def __init__(self, object):
|
|
self._object = object
|
|
|
|
def __getattr__(self, a):
|
|
try:
|
|
return getattr(self._object, a)
|
|
except:
|
|
if self._emulation.has_key(a):
|
|
return getattr(self._object, self._emulation[a])
|
|
elif self._getters.has_key(a):
|
|
return self._getters[a](self)
|
|
else:
|
|
raise AttributeError, a
|
|
|
|
def __setattr__(self, a, val):
|
|
if a == "_object":
|
|
self.__dict__['_object'] = val
|
|
return
|
|
|
|
try:
|
|
setattr(self.__dict__['_object'], a, val)
|
|
except:
|
|
if self._emulation.has_key(a):
|
|
setattr(self.__dict__['_object'], self._emulation[a], val)
|
|
elif self._setters.has_key(a):
|
|
self._setters[a](self, val)
|
|
else:
|
|
raise AttributeError, a
|
|
link = _link
|
|
|
|
def rename(self, name):
|
|
"""Tries to set the name of the object to 'name'. If the name already
|
|
exists, a unique name is created by appending a version number (e.g. '.001')
|
|
to 'name'. The effective name is returned."""
|
|
self._object.name = name
|
|
return self._object.name
|
|
|
|
def _getattrEx(self, a):
|
|
if self._emulation.has_key(a):
|
|
return getattr(self._object, self._emulation[a])
|
|
elif self._getters.has_key(a):
|
|
return self._getters[a](self)
|
|
else:
|
|
return getattr(self._object, a)
|
|
|
|
class shadowEx:
|
|
"""This is the shadow base class with a minor change; check for
|
|
emulation attributes happens before access to the raw object's attributes"""
|
|
_getters = {}
|
|
_setters = {}
|
|
_emulation = {}
|
|
|
|
def __del__(self):
|
|
self.__dict__.clear()
|
|
|
|
def __init__(self, object):
|
|
self._object = object
|
|
|
|
def __getattr__(self, a):
|
|
return _getattrEx(self, a)
|
|
|
|
def __setattr__(self, a, val):
|
|
if a == "_object":
|
|
self.__dict__['_object'] = val
|
|
return
|
|
|
|
if self._emulation.has_key(a):
|
|
setattr(self.__dict__['_object'], self._emulation[a], val)
|
|
elif self._setters.has_key(a):
|
|
self._setters[a](self, val)
|
|
else:
|
|
setattr(self.__dict__['_object'], a, val)
|
|
|
|
def __repr__(self):
|
|
return repr(self._object)
|
|
|
|
def rename(self, name):
|
|
"""Tries to set the name of the object to 'name'. If the name already
|
|
exists, a unique name is created by appending a version number (e.g. '.001')
|
|
to 'name'. The effective name is returned."""
|
|
self._object.name = name
|
|
return self._object.name
|
|
|
|
link = _link
|
|
|
|
class hasIPO(shadowEx):
|
|
"""Object class which has Ipo curves assigned"""
|
|
|
|
def getIpo(self):
|
|
"Returns the Ipo assigned to 'self'"
|
|
import Ipo
|
|
return Ipo.IpoBlock(self._object.ipo)
|
|
|
|
def setIpo(self, ipo):
|
|
"Assigns the IpoBlock 'ipo' to 'self'"
|
|
return self._object.assignIpo(ipo._object)
|
|
|
|
def __getattr__(self, a):
|
|
if a == "ipo":
|
|
print "ipo member access deprecated, use self.getIpo() instead!"
|
|
return self.getIpo()
|
|
else:
|
|
return _getattrEx(self, a)
|
|
|
|
class hasModes(shadowEx):
|
|
"""Object class which has different Modes"""
|
|
def getMode(self):
|
|
"""Returns a list of the modes which are set for 'self'"""
|
|
list = []
|
|
for k in self.Modes.keys():
|
|
i = self.Modes[k]
|
|
if self._object.mode & i:
|
|
list.append(k)
|
|
return list
|
|
|
|
def setMode(self, *args):
|
|
"""Set the mode of 'self'. This function takes a variable number
|
|
of string arguments of the types listed in self.Modes"""
|
|
flags = 0
|
|
try:
|
|
for a in args:
|
|
flags |= self.Modes[a]
|
|
except:
|
|
raise TypeError, "mode must be one of" % self.Modes.keys()
|
|
self._object.mode = flags
|
|
|
|
class dict:
|
|
"""readonly dictionary shadow"""
|
|
_emulation = {}
|
|
|
|
def __init__(self, dict):
|
|
self._dict = dict
|
|
|
|
def __getitem__(self, key):
|
|
try:
|
|
return self._dict[key]
|
|
except:
|
|
key = _emulation[key]
|
|
return self._dict[key]
|
|
|
|
def __repr__(self):
|
|
return repr(self._dict)
|