Programmatically generate SVG (vector) images, animations, and interactive Jupyter widgets

Support z-ordering

Changed files
+24 -9
drawSvg
+24 -9
drawSvg/drawing.py
···
import base64
import urllib.parse
import re
+
from collections import defaultdict
from . import Raster
from . import elements as elementsModule
···
self.viewBox = (self.viewBox[0], -self.viewBox[1]-self.viewBox[3],
self.viewBox[2], self.viewBox[3])
self.elements = []
+
self.orderedElements = defaultdict(list)
self.otherDefs = []
self.pixelScale = 1
self.renderWidth = None
···
return self.renderWidth, self.height * s
else:
return self.renderWidth, self.renderHeight
-
def draw(self, obj, **kwargs):
+
def draw(self, obj, *, z=None, **kwargs):
if obj is None:
return
if not hasattr(obj, 'writeSvgElement'):
···
else:
assert len(kwargs) == 0
elements = (obj,)
-
self.extend(elements)
-
def append(self, element):
-
self.elements.append(element)
-
def extend(self, iterable):
-
self.elements.extend(iterable)
+
self.extend(elements, z=z)
+
def append(self, element, *, z=None):
+
if z is not None:
+
self.orderedElements[z].append(element)
+
else:
+
self.elements.append(element)
+
def extend(self, iterable, *, z=None):
+
if z is not None:
+
self.orderedElements[z].extend(iterable)
+
else:
+
self.elements.extend(iterable)
def insert(self, i, element):
self.elements.insert(i, element)
def remove(self, element):
···
self.otherDefs.extend(elements)
def appendDef(self, element):
self.otherDefs.append(element)
+
def allElements(self):
+
''' Returns self.elements and self.orderedElements as a single list. '''
+
output = list(self.elements)
+
for z in sorted(self.orderedElements):
+
output.extend(self.orderedElements[z])
+
return output
def asSvg(self, outputFile=None):
returnString = outputFile is None
if returnString:
···
outputFile.write('\n')
except AttributeError:
pass
-
for element in self.elements:
+
allElements = self.allElements()
+
for element in allElements:
try:
element.writeSvgDefs(idGen, isDuplicate, outputFile, False)
except AttributeError:
···
outputFile.write('</defs>\n')
# Generate ids for normal elements
prevDefSet = set(prevSet)
-
for element in self.elements:
+
for element in allElements:
try:
element.writeSvgElement(idGen, isDuplicate, outputFile, True)
except AttributeError:
pass
prevSet = prevDefSet
# Write normal elements
-
for element in self.elements:
+
for element in allElements:
try:
element.writeSvgElement(idGen, isDuplicate, outputFile, False)
outputFile.write('\n')