+
+class Drawing(object):
+ def __init__(self):
+ self.paths = []
+
+ def addPath(self, x, y, matrix=numpy.matrix(numpy.identity(3, numpy.float64))):
+ p = Path(x, y, matrix)
+ self.paths.append(p)
+ return p
+
+ def _postProcessPaths(self):
+ for path in self.paths:
+ if not path.isClosed():
+ if abs(path._nodes[-1].position - path._startPoint) < 0.001:
+ path._isClosed = True
+ if path.isClosed() and len(path._nodes) == 2 and path._nodes[0].type == Node.ARC and path._nodes[1].type == Node.ARC:
+ if abs(path._nodes[0].radius - path._nodes[1].radius) < 0.001:
+ pass
+ #path._nodes = []
+
+ def dumpToFile(self, file):
+ file.write("%d\n" % (len(self.paths)))
+ for path in self.paths:
+ file.write("%s\n" % (path.getPathString()))
+
+ def readFromFile(self, file):
+ self.paths = []
+ pathCount = int(file.readline())
+ for n in xrange(0, pathCount):
+ line = map(str.split, file.readline().strip().split('|'))
+ path = Path(float(line[0][0]), float(line[0][1]))
+ for item in line[1:]:
+ if item[0] == 'L':
+ path.addLineTo(float(item[1]), float(item[2]))
+ elif item[0] == 'A':
+ path.addArcTo(float(item[1]), float(item[2]), 0, float(item[3]), float(item[4]), int(item[5]) != 0, int(item[6]) != 0)
+ elif item[0] == 'C':
+ path.addCurveTo(float(item[1]), float(item[2]), float(item[3]), float(item[4]), float(item[5]), float(item[6]))
+ self.paths.append(path)
+ self._postProcessPaths()
+
+ def saveAsHtml(self, filename):
+ f = open(filename, "w")
+
+ posMax = complex(-1000, -1000)
+ posMin = complex( 1000, 1000)
+ for path in self.paths:
+ points = path.getPoints()
+ for p in points:
+ if p.real > posMax.real:
+ posMax = complex(p.real, posMax.imag)
+ if p.imag > posMax.imag:
+ posMax = complex(posMax.real, p.imag)
+ if p.real < posMin.real:
+ posMin = complex(p.real, posMin.imag)
+ if p.imag < posMin.imag:
+ posMin = complex(posMin.real, p.imag)
+
+ f.write("<!DOCTYPE html><html><body>\n")
+ f.write("<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" style='width:%dpx;height:%dpx'>\n" % ((posMax - posMin).real, (posMax - posMin).imag))
+ f.write("<g fill-rule='evenodd' style=\"fill: gray; stroke:black;stroke-width:2\">\n")
+ f.write("<path d=\"")
+ for path in self.paths:
+ points = path.getPoints()
+ f.write("M %f %f " % (points[0].real - posMin.real, points[0].imag - posMin.imag))
+ for point in points[1:]:
+ f.write("L %f %f " % (point.real - posMin.real, point.imag - posMin.imag))
+ f.write("\"/>")
+ f.write("</g>\n")
+
+ f.write("<g style=\"fill: none; stroke:red;stroke-width:1\">\n")
+ f.write("<path d=\"")
+ for path in self.paths:
+ f.write(path.getSVGPath())
+ f.write("\"/>")
+ f.write("</g>\n")
+
+ f.write("</svg>\n")
+ f.write("</body></html>")
+ f.close()