Source code for honeybee_radiance.lightsource.ground
"""Radiance ground.
Ground is usually used as part of the sky definition.
"""
import honeybee.typing as typing
import ladybug.futil as futil
[docs]
class Ground(object):
"""Radiance ground.
Ground definition relies on skyfunc and must be used with one of the Radiance
skies generated by gendaylit, gensky, etc. You can adjust the ground reflection
using -g option in gensky / gendaylit. The default value in gensky is %20.
.. code-block:: shell
skyfunc glow ground_glow
0
0
4 1 1 1 0
ground_glow source ground
0
0
4 0 0 -1 180
oconv some.sky ground.rad scene.rad > scene.oct
Note:
For more information see Chapter `6.3.4 The Ground "Glow": An "Upside-Down"
Sky` in Rendering with Radiance. The chapter is also accessible online at the
link below.
https://www.radiance-online.org/community/workshops/2003-berkeley/presentations/Mardaljevic/rwr_ch6.pdf
Properties:
* r_emittance
* g_emittance
* b_emittance
* modifier
"""
def __init__(self, modifier='skyfunc'):
"""Create ground.
Args:
modifier: Optional input to change the modifier from skyfunc.
"""
self.modifier = modifier
self._r_emittance = 1.0
self._g_emittance = 1.0
self._b_emittance = 1.0
@property
def r_emittance(self):
"""Ground emittance values for red channel (Default: 1.0)."""
return self._r_emittance
@r_emittance.setter
def r_emittance(self, value):
self._r_emittance = typing.float_in_range(value, 0, 1, 'r_emittance')
@property
def g_emittance(self):
"""Ground emittance values for green channel (Default: 1.0)."""
return self._g_emittance
@g_emittance.setter
def g_emittance(self, value):
self._g_emittance = typing.float_in_range(value, 0, 1, 'g_emittance')
@property
def b_emittance(self):
"""Ground emittance values for blue channel (Default: 1.0)."""
return self._b_emittance
@b_emittance.setter
def b_emittance(self, value):
self._b_emittance = typing.float_in_range(value, 0, 1, 'b_emittance')
@property
def modifier(self):
"Ground modifier."
return self._modifier
@modifier.setter
def modifier(self, value):
self._modifier = str(value)
[docs]
@classmethod
def from_dict(cls, input_dict):
"""Create ground from_dict.
Args:
input_dict: A python dictionary in the following format
.. code-block:: python
{
'type': 'Ground',
'r_emittance': r_emittance,
'g_emittance': g_emittance,
'b_emittance': b_emittance,
'modifier': modifier
}
"""
assert 'type' in input_dict, \
'Input dict is missing type. Not a valid ground dictionary.'
assert input_dict['type'] == 'Ground', \
'Input type must be Ground not %s' % input_dict['type']
ground = cls()
ground.r_emittance = input_dict['r_emittance']
ground.g_emittance = input_dict['g_emittance']
ground.b_emittance = input_dict['b_emittance']
ground.modifier = input_dict['modifier']
return ground
[docs]
def to_file(self, folder='.', name=None, mkdir=False):
"""Write ground to a .ground Radiance file.
Returns:
Full path to the newly created file.
"""
content = self.to_radiance() + '\n'
name = typing.valid_string(name) if name else 'ground.rad'
return futil.write_to_file_by_name(folder, name, content, mkdir)
[docs]
def to_radiance(self):
"""Get ground as a Radiance input string."""
ground = \
'%s glow ground_glow\n0\n0\n4 %.3f %.3f %.3f 0\n' \
'ground_glow source ground\n0\n0\n4 0 0 -1 180' % (
self._modifier, self.r_emittance, self.g_emittance, self.b_emittance
)
return ground
[docs]
def to_dict(self):
"""Translate ground to a dictionary."""
return {
'type': 'Ground',
'r_emittance': self.r_emittance,
'g_emittance': self.g_emittance,
'b_emittance': self.b_emittance,
'modifier': self.modifier
}
def __eq__(self, value):
if type(value) != type(self):
return False
if (value.modifier, value.r_emittance, value.g_emittance, value.b_emittance) != \
(self.modifier, self.r_emittance, self.g_emittance, self.b_emittance):
return False
return True
def __ne__(self, value):
return not self.__eq__(value)
def __repr__(self):
return self.to_radiance()