def convertPolyline(self, node): getAttr = node.getAttribute points = getAttr("points") points = points.replace(',', ' ') points = points.split() points = list(map(self.attrConverter.convertLength, points)) if len(points) % 2 != 0 or len(points) == 0: # Odd number of coordinates or no coordinates, invalid polyline return None polyline = PolyLine(points) self.applyStyleOnShape(polyline, node) has_fill = self.attrConverter.findAttr(node, 'fill') not in ('', 'none') if has_fill: # ReportLab doesn't fill polylines, so we are creating a polygon # polygon copy of the polyline, but without stroke. group = Group() polygon = Polygon(points) self.applyStyleOnShape(polygon, node) polygon.strokeColor = None group.add(polygon) group.add(polyline) return group return polyline
def makeFilledDiamond(x, y, size, color): "Make a filled diamond marker." d = size/2.0 poly = Polygon((x-d,y, x,y+d, x+d,y, x,y-d)) poly.strokeColor = color poly.fillColor = color return poly
def makeFilledDiamond(x, y, size, color): "Make a filled diamond marker." d = size / 2.0 poly = Polygon((x - d, y, x, y + d, x + d, y, x, y - d)) poly.strokeColor = color poly.fillColor = color return poly
def convert_polyline(self, node): points = attributes.convert_length_list(node_attr(node, "points")) has_fill = node_attr(node, 'fill') not in ('', 'none') if len(points) % 2 != 0 or len(points) == 0: _logger.warn("Invalid Polyline points: %s" % points) return None polyline = PolyLine(points) self.apply_style(polyline, node) if has_fill: # Need to use two shapes, because standard RLG polylines do not support filling... # Polygon is the same as the polyline but without a border (stroke) gr = Group() polygon = Polygon(points) self.apply_style(polygon, node) polygon.strokeColor = None gr.add(polygon) gr.add(polyline) return gr else: return polyline
def draw(self): # normalize slice data g = self.makeBackground() or Group() xradius = self.width/2.0 yradius = self.height/2.0 self._radius = radius = min(xradius, yradius) cx = self.x + xradius cy = self.y + yradius data = self.normalizeData() self._seriesCount = len(data) n = len(data[0]) #labels if self.labels is None: labels = [''] * n else: labels = self.labels #there's no point in raising errors for less than enough errors if #we silently create all for the extreme case of no labels. i = n-len(labels) if i>0: labels = labels + ['']*i S = [] STRANDS = [] STRANDAREAS = [] syms = [] labs = [] csa = [] angle = self.startAngle*pi/180 direction = self.direction == "clockwise" and -1 or 1 angleBetween = direction*(2 * pi)/float(n) spokes = self.spokes spokeLabels = self.spokeLabels for i in xrange(n): car = cos(angle)*radius sar = sin(angle)*radius csa.append((car,sar,angle)) si = self.spokes[i] if si.visible: spoke = Line(cx, cy, cx + car, cy + sar, strokeWidth = si.strokeWidth, strokeColor=si.strokeColor, strokeDashArray=si.strokeDashArray) S.append(spoke) sli = spokeLabels[i] text = sli._text if not text: text = labels[i] if text: S.append(_setupLabel(WedgeLabel, text, si.labelRadius, cx, cy, angle, car, sar, sli)) angle += angleBetween # now plot the polygons rowIdx = 0 strands = self.strands strandLabels = self.strandLabels for row in data: # series plot rsty = strands[rowIdx] points = [] car, sar = csa[-1][:2] r = row[-1] points.append(cx+car*r) points.append(cy+sar*r) for i in xrange(n): car, sar, angle = csa[i] r = row[i] points.append(cx+car*r) points.append(cy+sar*r) L = self._innerDrawLabel(strandLabels[(rowIdx,i)], r, cx, cy, angle, car, sar, labelClass=StrandLabel) if L: labs.append(L) sty = strands[(rowIdx,i)] uSymbol = sty.symbol # put in a marker, if it needs one if uSymbol: s_x = cx+car*r s_y = cy+sar*r s_fillColor = sty.fillColor s_strokeColor = sty.strokeColor s_strokeWidth = sty.strokeWidth s_angle = 0 s_size = sty.symbolSize if type(uSymbol) is type(''): symbol = makeMarker(uSymbol, size = s_size, x = s_x, y = s_y, fillColor = s_fillColor, strokeColor = s_strokeColor, strokeWidth = s_strokeWidth, angle = s_angle, ) else: symbol = uSymbol2Symbol(uSymbol,s_x,s_y,s_fillColor) for k,v in (('size', s_size), ('fillColor', s_fillColor), ('x', s_x), ('y', s_y), ('strokeColor',s_strokeColor), ('strokeWidth',s_strokeWidth), ('angle',s_angle),): if getattr(symbol,k,None) is None: try: setattr(symbol,k,v) except: pass syms.append(symbol) # make up the 'strand' if rsty.fillColor: strand = Polygon(points) strand.fillColor = rsty.fillColor strand.strokeColor = None strand.strokeWidth = 0 STRANDAREAS.append(strand) if rsty.strokeColor and rsty.strokeWidth: strand = PolyLine(points) strand.strokeColor = rsty.strokeColor strand.strokeWidth = rsty.strokeWidth strand.strokeDashArray = rsty.strokeDashArray STRANDS.append(strand) rowIdx += 1 map(g.add,STRANDAREAS+STRANDS+syms+S+labs) return g
def draw(self): # normalize slice data g = self.makeBackground() or Group() xradius = self.width/2.0 yradius = self.height/2.0 self._radius = radius = min(xradius, yradius) centerx = self.x + xradius centery = self.y + yradius data = self.normalizeData() n = len(data[0]) #labels if self.labels is None: labels = [''] * n else: labels = self.labels #there's no point in raising errors for less than enough errors if #we silently create all for the extreme case of no labels. i = n-len(labels) if i>0: labels = labels + ['']*i spokes = [] csa = [] angle = self.startAngle*pi/180 direction = self.direction == "clockwise" and -1 or 1 angleBetween = direction*(2 * pi)/n markers = self.strands.markers for i in xrange(n): car = cos(angle)*radius sar = sin(angle)*radius csa.append((car,sar,angle)) spoke = Line(centerx, centery, centerx + car, centery + sar, strokeWidth = 0.5) #print 'added spoke (%0.2f, %0.2f) -> (%0.2f, %0.2f)' % (spoke.x1, spoke.y1, spoke.x2, spoke.y2) spokes.append(spoke) if labels: si = self.strands[i] text = si.label_text if text is None: text = labels[i] if text: labelRadius = si.labelRadius L = WedgeLabel() L.x = centerx + labelRadius*car L.y = centery + labelRadius*sar L.boxAnchor = si.label_boxAnchor L._pmv = angle*180/pi L.dx = si.label_dx L.dy = si.label_dy L.angle = si.label_angle L.boxAnchor = si.label_boxAnchor L.boxStrokeColor = si.label_boxStrokeColor L.boxStrokeWidth = si.label_boxStrokeWidth L.boxFillColor = si.label_boxFillColor L.strokeColor = si.label_strokeColor L.strokeWidth = si.label_strokeWidth L._text = text L.leading = si.label_leading L.width = si.label_width L.maxWidth = si.label_maxWidth L.height = si.label_height L.textAnchor = si.label_textAnchor L.visible = si.label_visible L.topPadding = si.label_topPadding L.leftPadding = si.label_leftPadding L.rightPadding = si.label_rightPadding L.bottomPadding = si.label_bottomPadding L.fontName = si.fontName L.fontSize = si.fontSize L.fillColor = si.fontColor spokes.append(L) angle = angle + angleBetween # now plot the polygons rowIdx = 0 for row in data: # series plot points = [] car, sar = csa[-1][:2] r = row[-1] points.append(centerx+car*r) points.append(centery+sar*r) for i in xrange(n): car, sar = csa[i][:2] r = row[i] points.append(centerx+car*r) points.append(centery+sar*r) # make up the 'strand' strand = Polygon(points) strand.fillColor = self.strands[rowIdx].fillColor strand.strokeColor = self.strands[rowIdx].strokeColor strand.strokeWidth = self.strands[rowIdx].strokeWidth strand.strokeDashArray = self.strands[rowIdx].strokeDashArray g.add(strand) # put in a marker, if it needs one if markers: if hasattr(self.strands[rowIdx], 'markerType'): uSymbol = self.strands[rowIdx].markerType elif hasattr(self.strands, 'markerType'): uSymbol = self.strands.markerType else: uSymbol = None m_x = centerx+car*r m_y = centery+sar*r m_size = self.strands[rowIdx].markerSize m_fillColor = self.strands[rowIdx].fillColor m_strokeColor = self.strands[rowIdx].strokeColor m_strokeWidth = self.strands[rowIdx].strokeWidth m_angle = 0 if type(uSymbol) is type(''): symbol = makeMarker(uSymbol, size = m_size, x = m_x, y = m_y, fillColor = m_fillColor, strokeColor = m_strokeColor, strokeWidth = m_strokeWidth, angle = m_angle, ) else: symbol = uSymbol2Symbol(uSymbol,m_x,m_y,m_fillColor) for k,v in (('size', m_size), ('fillColor', m_fillColor), ('x', m_x), ('y', m_y), ('strokeColor',m_strokeColor), ('strokeWidth',m_strokeWidth), ('angle',m_angle),): try: setattr(uSymbol,k,v) except: pass g.add(symbol) rowIdx = rowIdx + 1 # spokes go over strands for spoke in spokes: g.add(spoke) return g