* src/ReportUtils.py: Added
* src/BaseDoc.py: support for graphs * src/docgen/OpenOfficeDoc.py: write_at support * src/Makefile.am: added ReportUtils.py svn: r3926
This commit is contained in:
		| @@ -1,3 +1,9 @@ | |||||||
|  | 2005-01-17  Don Allingham  <dallingham@users.sourceforge.net> | ||||||
|  | 	* src/ReportUtils.py: Added | ||||||
|  | 	* src/BaseDoc.py: support for graphs | ||||||
|  | 	* src/docgen/OpenOfficeDoc.py: write_at support | ||||||
|  | 	* src/Makefile.am: added ReportUtils.py | ||||||
|  |  | ||||||
| 2005-01-17  Martin Hawlisch  <Martin.Hawlisch@gmx.de> | 2005-01-17  Martin Hawlisch  <Martin.Hawlisch@gmx.de> | ||||||
| 	* src/ReadGedcom.py: Handle missing TRLR record. | 	* src/ReadGedcom.py: Handle missing TRLR record. | ||||||
|  |  | ||||||
|   | |||||||
| @@ -86,6 +86,7 @@ gdir_PYTHON = \ | |||||||
| 	RelImage.py\ | 	RelImage.py\ | ||||||
| 	RelLib.py\ | 	RelLib.py\ | ||||||
| 	Report.py\ | 	Report.py\ | ||||||
|  | 	ReportUtils.py\ | ||||||
| 	SelectChild.py\ | 	SelectChild.py\ | ||||||
| 	SelectObject.py\ | 	SelectObject.py\ | ||||||
| 	Sort.py\ | 	Sort.py\ | ||||||
|   | |||||||
							
								
								
									
										197
									
								
								src/ReportUtils.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										197
									
								
								src/ReportUtils.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,197 @@ | |||||||
|  | # | ||||||
|  | # Gramps - a GTK+/GNOME based genealogy program | ||||||
|  | # | ||||||
|  | # Copyright (C) 2000-2005  Donald N. Allingham | ||||||
|  | # | ||||||
|  | # | ||||||
|  | # This program is free software; you can redistribute it and/or modify | ||||||
|  | # it under the terms of the GNU General Public License as published by | ||||||
|  | # the Free Software Foundation; either version 2 of the License, or | ||||||
|  | # (at your option) any later version. | ||||||
|  | # | ||||||
|  | # This program is distributed in the hope that it will be useful, | ||||||
|  | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | # GNU General Public License for more details. | ||||||
|  | # | ||||||
|  | # You should have received a copy of the GNU General Public License | ||||||
|  | # along with this program; if not, write to the Free Software | ||||||
|  | # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | ||||||
|  | # | ||||||
|  |  | ||||||
|  | # $Id$ | ||||||
|  |  | ||||||
|  | def pt2cm(pt): | ||||||
|  |     """ | ||||||
|  |     Converts points to centimeters. Fonts are typically specified in points, | ||||||
|  |     but the BaseDoc classes use centimeters. | ||||||
|  |  | ||||||
|  |     @param pt: points | ||||||
|  |     @type pt: float or int | ||||||
|  |     @returns: equivalent units in centimeters | ||||||
|  |     @rtype: float | ||||||
|  |     """ | ||||||
|  |     return pt/28.3465 | ||||||
|  |  | ||||||
|  | def cm2pt(cm): | ||||||
|  |     """ | ||||||
|  |     Converts centimeters to points. Fonts are typically specified in points, | ||||||
|  |     but the BaseDoc classes use centimeters. | ||||||
|  |  | ||||||
|  |     @param cm: centimeters | ||||||
|  |     @type cm: float or int | ||||||
|  |     @returns: equivalent units in points | ||||||
|  |     @rtype: float | ||||||
|  |     """ | ||||||
|  |     return cm*182.88 | ||||||
|  |  | ||||||
|  | def draw_pie_chart(doc, center_x, center_y, radius, data, start=0): | ||||||
|  |     """ | ||||||
|  |     Draws a pie chart in the specified document. The data passed is plotted as | ||||||
|  |     a pie chart. The data should consist of the actual data. Percentages of | ||||||
|  |     each slice are determined by the routine. | ||||||
|  |  | ||||||
|  |     @param doc: Document to which the pie chart should be added | ||||||
|  |     @type doc: BaseDoc derived class | ||||||
|  |     @param center_x: x coordinate in centimeters where the center of the pie | ||||||
|  |        chart should be. 0 is the left hand edge of the document. | ||||||
|  |     @type center_x: float | ||||||
|  |     @param center_y: y coordinate in centimeters where the center of the pie | ||||||
|  |        chart should be. 0 is the top edge of the document | ||||||
|  |     @param center_y: float | ||||||
|  |     @type radius: radius of the pie chart. The pie charts width and height will | ||||||
|  |        be twice this value. | ||||||
|  |     @type radius: float | ||||||
|  |     @param data: List of tuples containing the data to be plotted. The values | ||||||
|  |        are (graphics_format, value), where graphics_format is a BaseDoc | ||||||
|  |        GraphicsStyle, and value is a floating point number. Any other items in | ||||||
|  |        the tuple are ignored. This allows you to share the same data list with | ||||||
|  |        the L{draw_legend} function. | ||||||
|  |     @type data: list | ||||||
|  |     @param start: starting point in degrees, where the default of 0 indicates | ||||||
|  |        a start point extending from the center to right in a horizontal line. | ||||||
|  |     @type start: float | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |     total = 0.0 | ||||||
|  |     for item in data: | ||||||
|  |         total += item[1] | ||||||
|  |  | ||||||
|  |     for item in data: | ||||||
|  |         incr = 360.0*(item[1]/total) | ||||||
|  |         doc.draw_wedge(item[0], center_x, center_y, radius, start, start + incr) | ||||||
|  |         start += incr | ||||||
|  |  | ||||||
|  | def draw_legend(doc, start_x, start_y, data): | ||||||
|  |     """ | ||||||
|  |     Draws a legend for a graph in the specified document. The data passed is | ||||||
|  |     used to define the legend. | ||||||
|  |  | ||||||
|  |     @param doc: Document to which the legend chart should be added | ||||||
|  |     @type doc: BaseDoc derived class | ||||||
|  |     @param start_x: x coordinate in centimeters where the left hand corner | ||||||
|  |         of the legend is placed. 0 is the left hand edge of the document. | ||||||
|  |     @type center_x: float | ||||||
|  |     @param center_y: y coordinate in centimeters where the top of the legend | ||||||
|  |         should be. 0 is the top edge of the document | ||||||
|  |     @param center_y: float | ||||||
|  |     @param data: List of tuples containing the data to be used to create the | ||||||
|  |        legend. In order to be compatible with the graph plots, the first and | ||||||
|  |        third values of the tuple used. The format is (graphics_format, value, | ||||||
|  |        legend_description). | ||||||
|  |     @type data: list | ||||||
|  |     """ | ||||||
|  |     for (format, size, legend) in data: | ||||||
|  |         gstyle = doc.get_draw_style(format) | ||||||
|  |         pstyle = gstyle.get_paragraph_style() | ||||||
|  |         size = pt2cm(doc.get_style(pstyle).get_font().get_size()) | ||||||
|  |          | ||||||
|  |         doc.draw_bar(format, start_x, start_y, start_x + (2*size), start_y + size) | ||||||
|  |         doc.write_at(format, legend, start_x + (3*size), start_y - (size*0.25)) | ||||||
|  |         start_y += size * 1.3 | ||||||
|  |          | ||||||
|  | def draw_vertical_bar_graph(doc, format, start_x, start_y, height, width, data): | ||||||
|  |     doc.draw_line(format,start_x,start_y,start_x,start_y+height) | ||||||
|  |     doc.draw_line(format,start_x,start_y+height,start_x+width,start_y+height) | ||||||
|  |  | ||||||
|  |     largest = 0.0 | ||||||
|  |     for item in data: | ||||||
|  |         largest = max(item[1],largest) | ||||||
|  |  | ||||||
|  |     scale = float(height)/float(largest) | ||||||
|  |     units = len(data) | ||||||
|  |     box_width = (float(width) / (units*3.0+1.0))*2 | ||||||
|  |  | ||||||
|  |     bottom = float(start_y)+float(height) | ||||||
|  |  | ||||||
|  |     start = 0.5*box_width + start_x | ||||||
|  |     for index in range(units): | ||||||
|  |         print height, float(data[index][1]) * scale | ||||||
|  |         size = float(data[index][1]) * scale | ||||||
|  |         doc.draw_bar(data[index][0],start,bottom-size,start+box_width,bottom) | ||||||
|  |         start += box_width * 1.5 | ||||||
|  |  | ||||||
|  | def age_of(person): | ||||||
|  |     pass | ||||||
|  |  | ||||||
|  | if __name__ == "__main__": | ||||||
|  |     import BaseDoc | ||||||
|  |     import OpenOfficeDoc | ||||||
|  |  | ||||||
|  |     sheet = BaseDoc.StyleSheet() | ||||||
|  |     paper = BaseDoc.PaperStyle("Letter",27.94,21.59) | ||||||
|  |     doc = OpenOfficeDoc.OpenOfficeDoc(sheet,paper,None) | ||||||
|  |  | ||||||
|  |     font = BaseDoc.FontStyle() | ||||||
|  |     font.set_size(10) | ||||||
|  |  | ||||||
|  |     para = BaseDoc.ParagraphStyle() | ||||||
|  |     para.set_font(font) | ||||||
|  |     sheet.add_style('Normal', para) | ||||||
|  |  | ||||||
|  |     g = BaseDoc.GraphicsStyle() | ||||||
|  |     g.set_fill_color((0,255,0)) | ||||||
|  |     g.set_paragraph_style('Normal') | ||||||
|  |     g.set_line_width(1) | ||||||
|  |     doc.add_draw_style("green",g) | ||||||
|  |  | ||||||
|  |     g = BaseDoc.GraphicsStyle() | ||||||
|  |     g.set_fill_color((255,0,0)) | ||||||
|  |     g.set_paragraph_style('Normal') | ||||||
|  |     g.set_line_width(1) | ||||||
|  |     doc.add_draw_style("red",g) | ||||||
|  |  | ||||||
|  |     g = BaseDoc.GraphicsStyle() | ||||||
|  |     g.set_fill_color((0,0,255)) | ||||||
|  |     g.set_paragraph_style('Normal') | ||||||
|  |     g.set_line_width(1) | ||||||
|  |     doc.add_draw_style("blue",g) | ||||||
|  |  | ||||||
|  |     g = BaseDoc.GraphicsStyle() | ||||||
|  |     g.set_fill_color((0,255,255)) | ||||||
|  |     g.set_paragraph_style('Normal') | ||||||
|  |     g.set_line_width(1) | ||||||
|  |     doc.add_draw_style("yellow",g) | ||||||
|  |  | ||||||
|  |     g = BaseDoc.GraphicsStyle() | ||||||
|  |     g.set_fill_color((0,0,0)) | ||||||
|  |     g.set_paragraph_style('Normal') | ||||||
|  |     g.set_line_width(1) | ||||||
|  |     doc.add_draw_style("black",g) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     doc.open("foo.sxw") | ||||||
|  |     doc.init() | ||||||
|  |     chart_data = [ | ||||||
|  |         ('red',250,'red label'), | ||||||
|  |         ('green',35,'green label'), | ||||||
|  |         ('blue', 158, 'blue label'), | ||||||
|  |         ('yellow', 100, 'yellow label'), | ||||||
|  |         ] | ||||||
|  |      | ||||||
|  |     draw_pie_chart(doc, 4, 4, 3, chart_data) | ||||||
|  |     draw_legend(doc, 7.5, 2, chart_data) | ||||||
|  |  | ||||||
|  |     draw_vertical_bar_graph(doc, "black", 2, 10, 8, 12, chart_data) | ||||||
|  |      | ||||||
|  |     doc.close() | ||||||
		Reference in New Issue
	
	Block a user