# Modified from: http://drumcoder.co.uk/blog/2010/nov/16/python-code-generate-svg-pie-chart/
import os
import math
class GeneratePie():
def __init__(self, progress_percent, temp_dir=None):
self.progress_percent = int(progress_percent)
self.temp_dir = temp_dir
def generate(self):
lSlices = (self.progress_percent, 100 - self.progress_percent) # percentages to show in pie
lOffsetX = 150
lOffsetY = 150
lRadius = 100
def endpoint(pAngleInRadians, pRadius, pCentreOffsetX, pCentreOffsetY):
"""
Calculate position of point on circle given an angle, a radius,
and the location of the center of the circle
Zero line points west.
"""
lCosAngle = math.cos(pAngleInRadians)
lSinAngle = math.sin(pAngleInRadians)
lStartLineDestinationX = pCentreOffsetX - (lRadius * lCosAngle)
lStartLineDestinationY = pCentreOffsetY - (lRadius * lSinAngle)
return (lStartLineDestinationX, lStartLineDestinationY)
GRADIENTS = ('myRadialGradientGreen', 'myRadialGradientOrange',
'myRadialGradientGreen', 'myRadialGradientOrange')
DEGREES_IN_CIRCLE = 360.0
lSvgPath = ""
lCurrentAngle = 0
lTotalSlices = 0
lIndex = 0
lSvgPath = ""
for x in lSlices:
lTotalSlices += x
for lSlice in lSlices:
lLineOneX, lLineOneY = endpoint(lCurrentAngle, lRadius, lOffsetX, lOffsetY)
lLineOne = "M%d,%d L%d,%d" % (lOffsetX, lOffsetY, lLineOneX, lLineOneY)
lDegrees = (DEGREES_IN_CIRCLE / lTotalSlices) * lSlice
lRadians = math.radians(lDegrees)
lCurrentAngle += lRadians
lLineTwoX, lLineTwoY = endpoint(lCurrentAngle, lRadius, lOffsetX, lOffsetY)
lRoute = 0
if lDegrees > 180:
lRoute = 1
lArc = "A%d,%d 0 %d,1 %d %d" % (
lRadius, lRadius, lRoute, lLineTwoX, lLineTwoY)
lLineTwo = "L%d,%d" % (lOffsetX, lOffsetY)
lPath = "%s %s %s" % (lLineOne, lArc, lLineTwo)
lGradient = GRADIENTS[lIndex]
lSvgPath += "" % (
lPath, lGradient)
lIndex += 1
lSvg = """
""" % (lSvgPath, lOffsetX, lOffsetY)
if self.temp_dir:
svg_path = os.path.join(self.temp_dir, 'lector_progress.svg')
lFile = open(svg_path, 'w')
lFile.write(lSvg)
lFile.close()
else:
return lSvg