# coding=utf-8
"""Class for the entire SVG object."""
import os
from ladybug.config import folders
from . import _mixins as m
from ._types import PreserveAspectRatio, ViewBoxSpec, _number, _number_or_length, \
_str, _str_enum, _obj, _list_of_objs
from .element import Element, OVERFLOWS
[docs]
class SVG(
Element,
m.GraphicsElementEvents,
m.Color,
m.Graphics,
):
"""The svg element is a container that defines a new coordinate system and viewport.
It is used as the outermost element of SVG documents, but it can also be used
to embed an SVG fragment inside an SVG or HTML document.
https://developer.mozilla.org/en-US/docs/Web/SVG/Element/svg
"""
OVERFLOWS = OVERFLOWS
element_name = 'svg'
def __init__(self, xmlns=None, viewBox=None, preserveAspectRatio=None,
x=None, y=None, width=None, height=None, class_=None,
mask=None, opacity=None, clip_path=None, overflow=None,
onunload=None, onabort=None, onerror=None, onresize=None,
onscroll=None, onzoom=None):
super(SVG, self).__init__()
self.xmlns = xmlns
self.viewBox = viewBox
self.preserveAspectRatio = preserveAspectRatio
self.x = x
self.y = y
self.width = width
self.height = height
self.class_ = class_
self.mask = mask
self.opacity = opacity
self.clip_path = clip_path
self.overflow = overflow
self.onunload = onunload
self.onabort = onabort
self.onerror = onerror
self.onresize = onresize
self.onscroll = onscroll
self.onzoom = onzoom
@property
def xmlns(self):
"""[str]"""
return self._xmlns
@xmlns.setter
def xmlns(self, value):
self._xmlns = _str(value, 'xmlns') \
if value is not None else 'http://www.w3.org/2000/svg'
@property
def viewBox(self):
"""[obj]
https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/viewBox
"""
return self._viewBox
@viewBox.setter
def viewBox(self, value):
self._viewBox = _obj(value, ViewBoxSpec, 'viewBox', True)
@property
def preserveAspectRatio(self):
"""[obj]
https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio
"""
return self._preserveAspectRatio
@preserveAspectRatio.setter
def preserveAspectRatio(self, value):
self._preserveAspectRatio = _obj(
value, PreserveAspectRatio, 'preserveAspectRatio', True)
@property
def x(self):
"""[number or length]
https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/x
"""
return self._x
@x.setter
def x(self, value):
self._x = _number_or_length(value, 'x', True)
@property
def y(self):
"""[number or length]
https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/y
"""
return self._y
@y.setter
def y(self, value):
self._y = _number_or_length(value, 'y', True)
@property
def width(self):
"""[number or length]
https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/width
"""
return self._width
@width.setter
def width(self, value):
self._width = _number_or_length(value, 'width', True)
@property
def height(self):
"""[number or length]
https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/height
"""
return self._height
@height.setter
def height(self, value):
self._height = _number_or_length(value, 'height', True)
@property
def class_(self):
"""[list of objs]
https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/class
"""
return self._class_
@class_.setter
def class_(self, value):
self._class_ = _list_of_objs(value, str, 'class_', True)
@property
def mask(self):
"""[str]
https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/mask
"""
return self._mask
@mask.setter
def mask(self, value):
self._mask = _str(value, 'mask', True)
@property
def opacity(self):
"""[number]
https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/opacity
"""
return self._opacity
@opacity.setter
def opacity(self, value):
self._opacity = _number(value, 'opacity', True)
@property
def clip_path(self):
"""[str]
https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/clip-path
"""
return self._clip_path
@clip_path.setter
def clip_path(self, value):
self._clip_path = _str(value, 'clip_path', True)
@property
def overflow(self):
"""[str enum]
https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/overflow
"""
return self._overflow
@overflow.setter
def overflow(self, value):
self._overflow = _str_enum(value, OVERFLOWS, 'overflow', True)
@property
def onunload(self):
"""[str]"""
return self._onunload
@onunload.setter
def onunload(self, value):
self._onunload = _str(value, 'onunload', True)
@property
def onabort(self):
"""[str]"""
return self._onabort
@onabort.setter
def onabort(self, value):
self._onabort = _str(value, 'onabort', True)
@property
def onerror(self):
"""[str]"""
return self._onerror
@onerror.setter
def onerror(self, value):
self._onerror = _str(value, 'onerror', True)
@property
def onresize(self):
"""[str]"""
return self._onresize
@onresize.setter
def onresize(self, value):
self._onresize = _str(value, 'onresize', True)
@property
def onscroll(self):
"""[str]"""
return self._onscroll
@onscroll.setter
def onscroll(self, value):
self._onscroll = _str(value, 'onscroll', True)
@property
def onzoom(self):
"""[str]"""
return self._onzoom
@onzoom.setter
def onzoom(self, value):
self._onzoom = _str(value, 'onzoom', True)
[docs]
def to_file(self, name='Unnamed', folder=None):
"""Write SVG object to a file.
Args:
name: A text string for the name of the SVG file. (Default: Unnamed).
folder: A text string for the directory where the file will be written.
If unspecified, a svg subdirectory with default_epw_folder will
be used. This is usually at
"C:\\Users\\USERNAME\\APPDATA\\Roaming\\ladybug_tools\\weather."
"""
# set up a name and folder for the SVG
if name is None:
name = self.identifier
file_name = name if name.lower().endswith('.svg') else '{}.svg'.format(name)
folder = folder if folder is not None else \
os.path.join(folders.default_epw_folder, 'svg')
if not os.path.isdir(folder):
os.makedirs(folder)
svg_file = os.path.join(folder, file_name)
# write SVG
with open(svg_file, 'w') as fp:
fp.write(str(self))
return svg_file