* src/SubstKeywords.py (__init__): Convert to db.

* src/plugins/AncestorChart.py: Convert to db.
* src/plugins/AncestorChart2.py: Convert to db.
* src/GraphLayout.py: Convert to db.
* src/plugins/DesGraph.py: Convert to db.
* src/plugins/FanChart.py: Convert to db.
* src/Sort.py: Add converted sort.py to CVS.
* src/sort.py: Remove file (obsolete).
* src/plugins/TimeLine.py: Convert to db.


svn: r3127
This commit is contained in:
Alex Roitman 2004-05-05 02:04:30 +00:00
parent 00ec822374
commit a90191199e
9 changed files with 278 additions and 534 deletions

View File

@ -14,6 +14,16 @@
* src/plugins/IndivSummary.py (get_xpm_image): Remove
function, import it from Utils.py instead; Convert to db.
* src/SubstKeywords.py (__init__): Convert to db.
* src/plugins/AncestorChart.py: Convert to db.
* src/plugins/AncestorChart2.py: Convert to db.
* src/GraphLayout.py: Convert to db.
* src/plugins/DesGraph.py: Convert to db.
* src/plugins/FanChart.py: Convert to db.
* src/Sort.py: Add converted sort.py to CVS.
* src/sort.py: Remove file (obsolete).
* src/plugins/TimeLine.py: Convert to db.
2004-05-03 Alex Roitman <shura@alex.neuro.umn.edu>
* src/plugins/DetDescendantReport.py: Convert to db interface.
* src/plugins/DetAncestralReport.py: Translate string.

View File

@ -1,7 +1,7 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2000 Donald N. Allingham
# Copyright (C) 2000-2004 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
@ -18,11 +18,14 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# $Id$
class GraphLayout:
def __init__(self,plist,person):
def __init__(self,database,plist,person_id):
self.database = database
self.plist = plist
self.person = person
self.person_id = person_id
self.v = []
self.e = []
self.maxx = 0
@ -38,33 +41,37 @@ class DescendLine(GraphLayout):
def layout(self):
self.elist = [(0,0)]
self.space_for(self.person)
self.space_for(self.person_id)
return (self.v,self.e[1:])
def space_for(self,person,level=1.0,pos=1.0):
def space_for(self,person_id,level=1.0,pos=1.0):
last = self.elist[-1]
self.elist.append((level,pos))
self.e.append((last[0],last[1],level,pos))
self.v.append((person,level,pos))
self.v.append((person_id,level,pos))
if level > self.maxx:
self.maxx = level
if pos > self.maxy:
self.maxy = pos
for family in person.get_family_id_list():
for child in family.get_child_id_list():
self.space_for(child,level+1.0,pos)
pos = pos + max(self.depth(child),1)
person = self.database.find_person_from_id(person_id)
for family_id in person.get_family_id_list():
family = self.database.find_family_from_id(family_id)
for child_id in family.get_child_id_list():
self.space_for(child_id,level+1.0,pos)
pos = pos + max(self.depth(child_id),1)
if pos > self.maxy:
self.maxy = pos
self.elist.pop()
def depth(self,person,val=0):
for family in person.get_family_id_list():
def depth(self,person_id,val=0):
person = self.database.find_person_from_id(person_id)
for family_id in person.get_family_id_list():
family = self.database.find_family_from_id(family_id)
clist = family.get_child_id_list()
val = val + len(clist)
for child in clist:
d=self.depth(child)
for child_id in clist:
d = self.depth(child_id)
if d > 0:
val = val + d - 1 #first child is always on the same
return val #row as the parent, so subtract 1

View File

@ -1,7 +1,7 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2000 Donald N. Allingham
# Copyright (C) 2000-2004 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
@ -17,6 +17,9 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# $Id$
"""
Provides sorting routines for use in GRAMPS. Since these functions are
intended to provide fast sorting, they tend to bypass access methods,
@ -68,31 +71,52 @@ def build_sort_date(n):
d = 99
return "%04d%02d%02d" % (y,m,d)
def by_last_name(first, second):
"""Sort routine for comparing two last names. If last names are equal,
uses the given name and suffix"""
name1 = first.get_primary_name()
name2 = second.get_primary_name()
class Sort:
def __init__(self,database):
self.database = database
fsn = name1.get_surname().upper()
ssn = name2.get_surname().upper()
if fsn == ssn :
ffn = name1.get_first_name().upper()
sfn = name2.get_first_name().upper()
if ffn == sfn :
return cmp(name1.get_suffix().upper(), name2.get_suffix().upper())
else :
return cmp(ffn, sfn)
else :
return cmp(fsn, ssn)
def by_last_name(self,first_id,second_id):
"""Sort routine for comparing two last names. If last names are equal,
uses the given name and suffix"""
first = self.database.find_person_from_id(first_id)
second = self.database.find_person_from_id(second_id)
name1 = first.get_primary_name()
name2 = second.get_primary_name()
def by_birthdate(first, second) :
"""Sort routine for comparing two people by birth dates. If the birth dates
are equal, sorts by name"""
date1 = first.get_birth().get_date_object()
date2 = second.get_birth().get_date_object()
val = Date.compare_dates(date1,date2)
if val == 0:
return by_last_name(first,second)
return val
fsn = name1.get_surname().upper()
ssn = name2.get_surname().upper()
if fsn == ssn :
ffn = name1.get_first_name().upper()
sfn = name2.get_first_name().upper()
if ffn == sfn:
return cmp(name1.get_suffix().upper(), name2.get_suffix().upper())
else:
return cmp(ffn, sfn)
else:
return cmp(fsn, ssn)
def by_birthdate(self,first_id,second_id):
"""Sort routine for comparing two people by birth dates. If the birth dates
are equal, sorts by name"""
first = self.database.find_person_from_id(first_id)
second = self.database.find_person_from_id(second_id)
birth_id1 = first.get_birth_id()
if birth_id1:
date1 = self.database.find_event_from_id(birth_id1).get_date_object()
else:
date1 = Date.Date()
birth_id2 = second.get_birth_id()
if birth_id2:
date2 = self.database.find_event_from_id(birth_id2).get_date_object()
else:
date2 = Date.Date()
val = Date.compare_dates(date1,date2)
if val == 0:
return self.by_last_name(first_id,second_id)
return val

View File

@ -1,7 +1,7 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2000 Donald N. Allingham
# Copyright (C) 2000-2004 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
@ -18,6 +18,8 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# $Id$
"""
Provides the SubstKeywords class that will replace keywords in a passed
string with informatin about the person. For sample:
@ -63,36 +65,61 @@ class SubstKeywords:
$M -> Place of preferred marriage
"""
def __init__(self,person):
def __init__(self,database,person_id):
"""Creates a new object and associates a person with it."""
person = database.find_person_from_id(person_id)
self.n = person.get_primary_name().get_regular_name()
self.N = person.get_primary_name().get_name()
self.b = person.get_birth().get_date()
self.d = person.get_death().get_date()
self.B = person.get_birth().get_place_name()
self.D = person.get_death().get_place_name()
self.i = str(person.get_id())
self.b = ""
self.B = ""
self.d = ""
self.D = ""
self.s = ""
self.S = ""
self.m = ""
self.M = ""
birth_id = person.get_birth_id()
if birth_id:
birth = database.find_event_from_id(birth_id)
self.b = birth.get_date()
bplace_id = birth.get_place_id()
if bplace_id:
self.B = database.find_place_from_id(bplace_id).get_title()
death_id = person.get_death_id()
if death_id:
death = database.find_event_from_id(death_id)
self.d = death.get_date()
dplace_id = death.get_place_id()
if dplace_id:
self.D = database.find_place_from_id(dplace_id).get_title()
self.i = str(person_id)
if person.get_family_id_list():
f = person.get_family_id_list()[0]
if f.get_father_id() == person:
if f.get_mother_id():
self.s = f.get_mother_id().get_primary_name().get_regular_name()
self.S = f.get_mother_id().get_primary_name().get_name()
f_id = person.get_family_id_list()[0]
f = database.find_family_from_id(f_id)
father_id = f.get_father_id()
mother_id = f.get_mother_id
if father_id == person_id:
if mother_id:
mother = database.find_person_from_id(mother_id)
self.s = mother.get_primary_name().get_regular_name()
self.S = mother.get_primary_name().get_name()
else:
if f.get_father_id():
self.s = f.get_father_id().get_primary_name().get_regular_name()
self.S = f.get_father_id().get_primary_name().get_name()
for e in f.get_event_list():
if father_id:
father = database.find_person_from_id(father_id)
self.s = father.get_primary_name().get_regular_name()
self.S = father.get_primary_name().get_name()
for e_id in f.get_event_list():
if not e_id:
continue
e = database.find_event_from_id(e_id)
if e.get_name() == 'Marriage':
self.m = e.get_date()
self.M = e.get_place_name()
mplace_id = e.get_place_id()
if mplace_id:
self.M = database.find_place_from_id(mplace_id).get_title()
def replace(self,line):
"""Returns a new line of text with the substitutions performed."""

View File

@ -49,6 +49,7 @@ import Errors
import FontScale
from QuestionDialog import ErrorDialog
from SubstKeywords import SubstKeywords
from Utils import get_xpm_image
from gettext import gettext as _
_BORN = _('b.')
@ -70,6 +71,7 @@ def pt2cm(pt):
class AncestorChart:
def __init__(self,database,person,max,display,doc,output,newpage=0):
self.database = database
self.doc = doc
self.doc.creator(database.get_researcher().get_name())
self.map = {}
@ -77,8 +79,8 @@ class AncestorChart:
self.start = person
self.max_generations = max
self.output = output
self.box_width = 0
self.height = 0
self.box_width = 0
self.height = 0
self.lines = 0
self.display = display
self.newpage = newpage
@ -87,32 +89,34 @@ class AncestorChart:
self.doc.open(output)
else:
self.standalone = 0
self.calc()
self.calc()
def filter(self,person,index):
def filter(self,person_id,index):
"""traverse the ancestors recursively until either the end
of a line is found, or until we reach the maximum number of
generations that we want to deal with"""
if person == None or index >= 2**self.max_generations:
if (not person_id) or (index >= 2**self.max_generations):
return
self.map[index] = person
self.map[index] = person_id
self.text[index] = []
self.text[index] = []
subst = SubstKeywords(person)
subst = SubstKeywords(self.database,person_id)
for line in self.display:
self.text[index].append(subst.replace(line))
self.font = self.doc.style_list["AC-Normal"].get_font()
for line in self.text[index]:
self.box_width = max(self.box_width,FontScale.string_width(self.font,line))
for line in self.text[index]:
self.box_width = max(self.box_width,FontScale.string_width(self.font,line))
self.lines = max(self.lines,len(self.text[index]))
self.lines = max(self.lines,len(self.text[index]))
family = person.get_main_parents_family_id()
if family != None:
person = self.database.find_person_from_id(person_id)
family_id = person.get_main_parents_family_id()
if family_id:
family = self.database.find_family_from_id(family_id)
self.filter(family.get_father_id(),index*2)
self.filter(family.get_mother_id(),(index*2)+1)
@ -144,13 +148,13 @@ class AncestorChart:
that and the page dimensions, calculate the proper place to put
the elements on a page.
"""
self.filter(self.start,1)
self.filter(self.start.get_id(),1)
self.height = self.lines*pt2cm((125.0*self.font.get_size())/100.0)
self.box_width = pt2cm(self.box_width+20)
self.height = self.lines*pt2cm((125.0*self.font.get_size())/100.0)
self.box_width = pt2cm(self.box_width+20)
start = 0
delta = (self.doc.get_usable_width() - (self.box_width + (5.0/10.0)))/3.0
delta = (self.doc.get_usable_width() - (self.box_width + (5.0/10.0)))/3.0
uh = self.doc.get_usable_height()
ystart = -self.height/2.0
@ -192,9 +196,9 @@ class AncestorChart:
def draw_graph(self,index,start,level):
if self.map.has_key(start) and index <= 15:
text = self.text[start]
text = self.text[start]
name = string.join(text,"\n")
name = string.join(text,"\n")
self.doc.draw_box("AC-box",name,self.x[level],self.y[index-1])
if index > 1:
@ -407,148 +411,6 @@ def write_book_item(database,person,doc,options,newpage=0):
import DisplayTrace
DisplayTrace.DisplayTrace()
#------------------------------------------------------------------------
#
#
#
#------------------------------------------------------------------------
def get_xpm_image():
return [
"48 48 85 1",
" c None",
". c #887D6C",
"+ c #8C8A87",
"@ c #787775",
"# c #766D5F",
"$ c #67655F",
"% c #5E5A54",
"& c #55524C",
"* c #BBBAB8",
"= c #B7AFA2",
"- c #A9A5A0",
"; c #99948A",
"> c #FAFAFA",
", c #F8F6F2",
"' c #F6F2EC",
") c #E6E5E5",
"! c #D2CCBF",
"~ c #C7C6C3",
"{ c #413F3F",
"] c #DCD9D4",
"^ c #322E2B",
"/ c #4F4E4C",
"( c #908F8D",
"_ c #989897",
": c #8A8986",
"< c #898885",
"[ c #F5EEE5",
"} c #F5F5F5",
"| c #979695",
"1 c #888784",
"2 c #8B8A87",
"3 c #1A1A1A",
"4 c #858582",
"5 c #949390",
"6 c #858480",
"7 c #92918E",
"8 c #8F8E8B",
"9 c #8E8D8A",
"0 c #797773",
"a c #7B7975",
"b c #81807C",
"c c #817F7C",
"d c #989796",
"e c #807E7B",
"f c #8C8B88",
"g c #E3CAA5",
"h c #F2EADF",
"i c #DDCDB4",
"j c #8E8E8B",
"k c #888785",
"l c #EFE4D2",
"m c #969694",
"n c #9F9F9D",
"o c #E6D4B7",
"p c #A5967E",
"q c #8A8987",
"r c #EBDCC4",
"s c #878683",
"t c #9B9995",
"u c #9A9892",
"v c #807F7B",
"w c #7E7C79",
"x c #8E8C88",
"y c #8F8E8C",
"z c #8D8B88",
"A c #B59871",
"B c #878581",
"C c #8E8B87",
"D c #848480",
"E c #898785",
"F c #8A8886",
"G c #7D7B77",
"H c #8D8C89",
"I c #8B8A86",
"J c #918F8B",
"K c #989795",
"L c #BBA382",
"M c #8D8B86",
"N c #868480",
"O c #8E8C87",
"P c #8E8B86",
"Q c #8A8985",
"R c #807F7A",
"S c #8D8A84",
"T c #898884",
" ",
" ",
" .+....@@#####$$$%$%&$@ ",
" .**************=*-;+%%@ ",
" .*>>,>>>>>>,>>>>')!*..;& ",
" .*>>>>>>>>>>>>>>>,)!=@~;{ ",
" .*,>>>>>>>>>>>>>>>,]]%)~+^ ",
" .*>>>>>>>>>>>>>>>>>))/>)~+^ ",
" .*>>>>>>>>>>>>>>>>>(_/>>)~+^ ",
" .*>>>>>>>>>>>>>>>>>:>/)>>)~+{ ",
" @*>>>>>>>>>>>>>>>>><>/]'>>)~;& ",
" @*>>>>>>>>>>>>>>>>>:>/~][>>)~;$ ",
" #*>>>>>>>>>}}|1<<2>:>/33^{{%$@$@ ",
" .*>>>>>>>>>4:<<<<<56>)~*-;+@$%{$ ",
" #*>>>>>>>>><>|<1<7>8>>)!~=-;+@&{ ",
" #*>>>>>>>>><>>>>>>>9>>,]!~*-;+${ ",
" #*>>>>>>>>><>>>>>>>8>>,))~~*-;@^ ",
" #*>>>>>>>>><>>>>>>>:>(000a!~*-@^ ",
" #*>>>>>>>>>1>>>>>>>b2<<<1c]~~*.^ ",
" #*>>>>>>>>><>>>>>>>,>de<<f]g~*+^ ",
" #*>>>>>>>>><>>>>>>,,,''[h]]ii~+^ ",
" $*>>jkkkkj><>>>>>,>'''[[hl]]ig;^ ",
" $*>>mkkkkjn<>>>>>,,'''h[hl]o!!p^ ",
" $*>>jkkkkq><>>>>,'''[)[hhll]i!p^ ",
" $*>>>>>>>>><>>>,,'),[hh)llrro!p^ ",
" $*>>>>>>>>><>>,,'''h[hhhllrriip^ ",
" $*>>>>>>>>><>,'''h[hhlllllrroip^ ",
" %*>>>>>>>>><,''''[[hh|<s<2rroip^ ",
" %*>>>>>>>>><'''hhh)tu<<v0wrroip^ ",
" $*>>>>>>>>,<''['[[hxly<<<zroooA^ ",
" %*>>>>>>>,,<'hh)hhlxllrrrrrroiA^ ",
" %*>>>>>>,''1[[[[hllxlrlrroooooA^ ",
" %*>>>>>,,''<hqk<<BlClrrrrrooooA^ ",
" %*>>>>,'''hDEF<<<GHIrrrroooogiA^ ",
" %*>>>,,'''h)hJ<1<KrCrrorooooggL^ ",
" &*>>,''[[h[[hllllrlCroroooggogA^ ",
" &*>,,''[h[hlhllrlrrCroooooggggA^ ",
" &=,''[[[[hlhllllrrrMoqkk1NogggL^ ",
" &*''''h)hhlllrrrrrrOPQ<ksRggggA^ ",
" /=''h[[[h)llrllrrrooo2STE6ggggA^ ",
" &=''h)hlhlllrrrrorooooggggggggA^ ",
" /=[[[[hhllrrlrroroooogggggg*ggA^ ",
" /=hhhllllllrrrroooogogggggggggA^ ",
" /=*=======LLLLLLLLLLLLAAAAAAAAA^ ",
" ^^^^^^^^^^^^^^^^^^^^^^^^^^3^^3^^ ",
" ",
" ",
" "]
#------------------------------------------------------------------------
#
#

View File

@ -46,6 +46,7 @@ import Errors
import FontScale
from QuestionDialog import ErrorDialog
from SubstKeywords import SubstKeywords
from Utils import get_xpm_image
from gettext import gettext as _
_BORN = _('b.')
@ -172,6 +173,7 @@ class AncestorChart:
def __init__(self,database,person,max,display,doc,output,scale,compress,
title,newpage=0):
self.database = database
self.doc = doc
self.title = title.strip()
self.doc.creator(database.get_researcher().get_name())
@ -193,7 +195,7 @@ class AncestorChart:
self.font = self.doc.style_list["AC2-Normal"].get_font()
self.tfont = self.doc.style_list["AC2-Title"].get_font()
self.filter(self.start,1)
self.filter(self.start.get_id(),1)
keys = self.map.keys()
keys.sort()
@ -202,31 +204,33 @@ class AncestorChart:
self.genchart = GenChart(max_key+1)
for key in self.map.keys():
self.genchart.set(key,self.map[key])
self.calc()
self.calc()
def filter(self,person,index):
def filter(self,person_id,index):
"""traverse the ancestors recursively until either the end
of a line is found, or until we reach the maximum number of
generations that we want to deal with"""
if person == None or index >= 2**self.max_generations:
if (not person_id) or (index >= 2**self.max_generations):
return
self.map[index] = person
self.map[index] = person_id
self.text[index] = []
self.text[index] = []
subst = SubstKeywords(person)
subst = SubstKeywords(self.database,person_id)
for line in self.display:
self.text[index].append(subst.replace(line))
for line in self.text[index]:
self.box_width = max(self.box_width,FontScale.string_width(self.font,line))
for line in self.text[index]:
self.box_width = max(self.box_width,FontScale.string_width(self.font,line))
self.lines = max(self.lines,len(self.text[index]))
self.lines = max(self.lines,len(self.text[index]))
family = person.get_main_parents_family_id()
if family:
person = self.database.find_person_from_id(person_id)
family_id = person.get_main_parents_family_id()
if family_id:
family = self.database.find_family_from_id(family_id)
self.filter(family.get_father_id(),index*2)
self.filter(family.get_mother_id(),(index*2)+1)
@ -279,9 +283,9 @@ class AncestorChart:
self.uh = self.doc.get_usable_height() - self.offset
uw = self.doc.get_usable_width()-pt2cm(self.box_pad_pts)
calc_width = pt2cm(self.box_width + self.box_pad_pts) + 0.2
self.box_width = pt2cm(self.box_width)
self.box_height = self.lines*pt2cm(1.25*self.font.get_size())
calc_width = pt2cm(self.box_width + self.box_pad_pts) + 0.2
self.box_width = pt2cm(self.box_width)
self.box_height = self.lines*pt2cm(1.25*self.font.get_size())
self.scale = 1
@ -639,7 +643,7 @@ class AncestorChartBareDialog(Report.BareReportDialog):
self.title.set_text(self.the_title)
new_name = new_person.getPrimaryName().getRegularName()
if new_name:
if new_name:
self.person_label.set_text( "<i>%s</i>" % new_name )
self.person_label.set_use_markup(gtk.TRUE)
@ -692,148 +696,6 @@ def write_book_item(database,person,doc,options,newpage=0):
import DisplayTrace
DisplayTrace.DisplayTrace()
#------------------------------------------------------------------------
#
#
#
#------------------------------------------------------------------------
def get_xpm_image():
return [
"48 48 85 1",
" c None",
". c #887D6C",
"+ c #8C8A87",
"@ c #787775",
"# c #766D5F",
"$ c #67655F",
"% c #5E5A54",
"& c #55524C",
"* c #BBBAB8",
"= c #B7AFA2",
"- c #A9A5A0",
"; c #99948A",
"> c #FAFAFA",
", c #F8F6F2",
"' c #F6F2EC",
") c #E6E5E5",
"! c #D2CCBF",
"~ c #C7C6C3",
"{ c #413F3F",
"] c #DCD9D4",
"^ c #322E2B",
"/ c #4F4E4C",
"( c #908F8D",
"_ c #989897",
": c #8A8986",
"< c #898885",
"[ c #F5EEE5",
"} c #F5F5F5",
"| c #979695",
"1 c #888784",
"2 c #8B8A87",
"3 c #1A1A1A",
"4 c #858582",
"5 c #949390",
"6 c #858480",
"7 c #92918E",
"8 c #8F8E8B",
"9 c #8E8D8A",
"0 c #797773",
"a c #7B7975",
"b c #81807C",
"c c #817F7C",
"d c #989796",
"e c #807E7B",
"f c #8C8B88",
"g c #E3CAA5",
"h c #F2EADF",
"i c #DDCDB4",
"j c #8E8E8B",
"k c #888785",
"l c #EFE4D2",
"m c #969694",
"n c #9F9F9D",
"o c #E6D4B7",
"p c #A5967E",
"q c #8A8987",
"r c #EBDCC4",
"s c #878683",
"t c #9B9995",
"u c #9A9892",
"v c #807F7B",
"w c #7E7C79",
"x c #8E8C88",
"y c #8F8E8C",
"z c #8D8B88",
"A c #B59871",
"B c #878581",
"C c #8E8B87",
"D c #848480",
"E c #898785",
"F c #8A8886",
"G c #7D7B77",
"H c #8D8C89",
"I c #8B8A86",
"J c #918F8B",
"K c #989795",
"L c #BBA382",
"M c #8D8B86",
"N c #868480",
"O c #8E8C87",
"P c #8E8B86",
"Q c #8A8985",
"R c #807F7A",
"S c #8D8A84",
"T c #898884",
" ",
" ",
" .+....@@#####$$$%$%&$@ ",
" .**************=*-;+%%@ ",
" .*>>,>>>>>>,>>>>')!*..;& ",
" .*>>>>>>>>>>>>>>>,)!=@~;{ ",
" .*,>>>>>>>>>>>>>>>,]]%)~+^ ",
" .*>>>>>>>>>>>>>>>>>))/>)~+^ ",
" .*>>>>>>>>>>>>>>>>>(_/>>)~+^ ",
" .*>>>>>>>>>>>>>>>>>:>/)>>)~+{ ",
" @*>>>>>>>>>>>>>>>>><>/]'>>)~;& ",
" @*>>>>>>>>>>>>>>>>>:>/~][>>)~;$ ",
" #*>>>>>>>>>}}|1<<2>:>/33^{{%$@$@ ",
" .*>>>>>>>>>4:<<<<<56>)~*-;+@$%{$ ",
" #*>>>>>>>>><>|<1<7>8>>)!~=-;+@&{ ",
" #*>>>>>>>>><>>>>>>>9>>,]!~*-;+${ ",
" #*>>>>>>>>><>>>>>>>8>>,))~~*-;@^ ",
" #*>>>>>>>>><>>>>>>>:>(000a!~*-@^ ",
" #*>>>>>>>>>1>>>>>>>b2<<<1c]~~*.^ ",
" #*>>>>>>>>><>>>>>>>,>de<<f]g~*+^ ",
" #*>>>>>>>>><>>>>>>,,,''[h]]ii~+^ ",
" $*>>jkkkkj><>>>>>,>'''[[hl]]ig;^ ",
" $*>>mkkkkjn<>>>>>,,'''h[hl]o!!p^ ",
" $*>>jkkkkq><>>>>,'''[)[hhll]i!p^ ",
" $*>>>>>>>>><>>>,,'),[hh)llrro!p^ ",
" $*>>>>>>>>><>>,,'''h[hhhllrriip^ ",
" $*>>>>>>>>><>,'''h[hhlllllrroip^ ",
" %*>>>>>>>>><,''''[[hh|<s<2rroip^ ",
" %*>>>>>>>>><'''hhh)tu<<v0wrroip^ ",
" $*>>>>>>>>,<''['[[hxly<<<zroooA^ ",
" %*>>>>>>>,,<'hh)hhlxllrrrrrroiA^ ",
" %*>>>>>>,''1[[[[hllxlrlrroooooA^ ",
" %*>>>>>,,''<hqk<<BlClrrrrrooooA^ ",
" %*>>>>,'''hDEF<<<GHIrrrroooogiA^ ",
" %*>>>,,'''h)hJ<1<KrCrrorooooggL^ ",
" &*>>,''[[h[[hllllrlCroroooggogA^ ",
" &*>,,''[h[hlhllrlrrCroooooggggA^ ",
" &=,''[[[[hlhllllrrrMoqkk1NogggL^ ",
" &*''''h)hhlllrrrrrrOPQ<ksRggggA^ ",
" /=''h[[[h)llrllrrrooo2STE6ggggA^ ",
" &=''h)hlhlllrrrrorooooggggggggA^ ",
" /=[[[[hhllrrlrroroooogggggg*ggA^ ",
" /=hhhllllllrrrroooogogggggggggA^ ",
" /=*=======LLLLLLLLLLLLAAAAAAAAA^ ",
" ^^^^^^^^^^^^^^^^^^^^^^^^^^3^^3^^ ",
" ",
" ",
" "]
#------------------------------------------------------------------------
#
#

View File

@ -1,7 +1,7 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2000-2003 Donald N. Allingham
# Copyright (C) 2000-2004 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
@ -18,6 +18,8 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# $Id$
"Generate files/Descendant Report"
#------------------------------------------------------------------------
@ -46,6 +48,7 @@ import BaseDoc
import Errors
from SubstKeywords import SubstKeywords
from Utils import get_xpm_image
from gettext import gettext as _
from QuestionDialog import ErrorDialog
@ -75,14 +78,15 @@ def pt2cm(pt):
class DescendantReport:
def __init__(self,database,person,display,doc,output,newpage=0):
self.database = database
self.doc = doc
self.doc.creator(database.get_researcher().get_name())
self.map = {}
self.text = {}
self.start = person
self.output = output
self.box_width = 0
self.height = 0
self.box_width = 0
self.height = 0
self.lines = 0
self.display = display
self.newpage = newpage
@ -92,24 +96,24 @@ class DescendantReport:
else:
self.standalone = 0
plist = database.get_person_id_map().values()
self.layout = GraphLayout.DescendLine(plist,person)
plist = self.database.get_person_keys()
self.layout = GraphLayout.DescendLine(self.database,plist,person.get_id())
(self.v,self.e) = self.layout.layout()
self.text = {}
for (p,x,y) in self.v:
for (p_id,x,y) in self.v:
self.text[p.get_id()] = []
subst = SubstKeywords(p)
self.text[p_id] = []
subst = SubstKeywords(self.database,p_id)
for line in self.display:
self.text[p.get_id()].append(subst.replace(line))
self.text[p_id].append(subst.replace(line))
self.font = self.doc.style_list["DG-Normal"].get_font()
for line in self.text[p.get_id()]:
for line in self.text[p_id]:
new_width = FontScale.string_width(self.font,line)
self.box_width = max(self.box_width,new_width)
self.lines = max(self.lines,len(self.text[p.get_id()]))
self.lines = max(self.lines,len(self.text[p_id]))
def write_report(self):
@ -129,7 +133,7 @@ class DescendantReport:
self.pg.append([None]*(cols+1))
self.ln.append([None]*(cols+1))
for (p,x,y) in self.v:
for (p_id,x,y) in self.v:
r = int((y-1)/self.maxy)
c = int((x-1)/self.maxx)
@ -137,9 +141,9 @@ class DescendantReport:
ny = y - (self.maxy)*r
l = self.pg[r]
if l[c] == None:
l[c] = [(p,nx,ny)]
l[c] = [(p_id,nx,ny)]
else:
l[c].append((p,nx,ny))
l[c].append((p_id,nx,ny))
for (x1,y1,x2,y2) in self.e:
r1 = int((y1-1)/self.maxy)
@ -226,10 +230,10 @@ class DescendantReport:
"""calc - calculate the maximum width that a box needs to be. From
that and the page dimensions, calculate the proper place to put
the elements on a page."""
self.height = self.lines*pt2cm(1.25*self.font.get_size())
self.box_width = pt2cm(self.box_width+20)
self.height = self.lines*pt2cm(1.25*self.font.get_size())
self.box_width = pt2cm(self.box_width+20)
self.maxx = int(self.doc.get_usable_width()/(self.box_width+_sep))
self.maxx = int(self.doc.get_usable_width()/(self.box_width+_sep))
self.maxy = int(self.doc.get_usable_height()/(self.height+_sep))
g = BaseDoc.GraphicsStyle()
@ -254,8 +258,8 @@ class DescendantReport:
right = self.doc.get_usable_width() - (2*_sep)
if plist:
for (p,x,y) in plist:
name = string.join(self.text[p.get_id()],"\n")
for (p_id,x,y) in plist:
name = string.join(self.text[p_id],"\n")
x = (x-1)*delta + left + _sep
y = (y-1)*(self.height+_sep)+top
self.doc.draw_box("box",name,x,y)
@ -483,96 +487,6 @@ def write_book_item(database,person,doc,options,newpage=0):
import DisplayTrace
DisplayTrace.DisplayTrace()
#------------------------------------------------------------------------
#
#
#
#------------------------------------------------------------------------
def get_xpm_image():
return [
"48 48 33 1",
" c None",
". c #1A1A1A",
"+ c #7E7C76",
"@ c #918E8A",
"# c #B6AEA2",
"$ c #E2CAA6",
"% c #E6D6B6",
"& c #322E2A",
"* c #423E3E",
"= c #EADEC6",
"- c #F2EADE",
"; c #4E4E4E",
"> c #56524E",
", c #5E5A56",
"' c #F6EEE6",
") c #9A968A",
"! c #66665E",
"~ c #F6F2EE",
"{ c #C6C6C1",
"] c #A6967E",
"^ c #8D8A86",
"/ c #736D62",
"( c #E6E6E6",
"_ c #FAFAF9",
": c #DEDAD6",
"< c #AAA6A2",
"[ c #EEE6D2",
"} c #BABABA",
"| c #878680",
"1 c #8A7E6E",
"2 c #78756F",
"3 c #B89D78",
"4 c #D9CEB9",
" ",
" ",
" 1^111122/////!!!,!,>!2 ",
" 1}}}}}}}}}}}}}}#}<)^,,2 ",
" 1}__~___________~(4}11)> ",
" 1}_______________~(4#+{)* ",
" 1}~_______________~::,({^& ",
" 1}_________________((;_({^& ",
" 1}__|++++___+2//2___+;__({^& ",
" 1}__++++2|||///2/|2|2;(__({^* ",
" +}__|++++_@_+2/22_^_+;:~__({)> ",
" 2}________@_______|__;{:'__({)! ",
" /}________@_______|__;..&**,!2!2 ",
" 1}________@_______|__({}<)^2!,*! ",
" /}________@_______|_|222+#<)^2>* ",
" /}________@_______^^|+22/{}<)@!* ",
" /}________@_________|++++{{}<)+& ",
" /}________@___________~'(:4{}<2& ",
" /}________@__________~~((::{{}1& ",
" /}________^_|+2++__~_~_--%:${}^& ",
" /}________+@2++++__~_~~'-::44{^& ",
" !}________@_+++++~_~~~''-=::$$)& ",
" !}________@_______~~~~-'-[:%{4]& ",
" !}________@_____~~~~'('--=[:4{]& ",
" !}________@_____~~(~'--([[==%4]& ",
" !}________@~+++++~~'++2+2===$4]& ",
" !}________2@+++++||)2+|2/[==%4]& ",
" ,}________+_2++2|''[+222+=%=%$]& ",
" ,}________+~~'~---(-[[[=[==%%4]& ",
" !}________+~~~'~''-=[[===%=%%%3& ",
" ,}_______~+~~--(--[[{=====%=%$]& ",
" ,}_______~+~|+222[[=+1222%%$%%3& ",
" ,}_____~_~++/+++/+/+/222/=%%%$3& ",
" ,}_____~~~-'+2221[2=2212/%%%$$3& ",
" ,}___~_~~~-('-[[[=+=%=%%%%%%$$3& ",
" >}___~~''-''-=[=[=2==%=%%%$$%$3& ",
" >}_~_~~'-'-[-[[===2==%$%$%$$$$3& ",
" >#_~~-'''-[-[[=[==2%22+22$$$$$3& ",
" >}~~~~-(--[[======12/2/2/$$$$$3& ",
" ;#~~-'''-(=[=[==%=%%2+2//$$$$$]& ",
" >#~~-(-=-[[[====%%%%%%$$$$$$$$3& ",
" ;#-~''--[===[==$=%%$%$$$$$$}$$3& ",
" ;#---[[[[[==%==%%$%$%$$$$$$$$$3& ",
" ;#}#######3333333333333333333]3& ",
" &&&&&&&&&*&&*&&*&*&&&&&&&&.&&.&& ",
" ",
" ",
" "]
#------------------------------------------------------------------------
#
#

View File

@ -1,7 +1,7 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2003 Donald N. Allingham
# Copyright (C) 2003-2004 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
@ -18,6 +18,8 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# $Id$
#------------------------------------------------------------------------
#
# gnome/gtk
@ -57,14 +59,15 @@ def pt2cm(pt):
class FanChart:
def __init__(self,database,person,display,doc,output,newpage=0):
self.database = database
self.doc = doc
self.doc.creator(database.get_researcher().get_name())
self.map = {}
self.text = {}
self.start = person
self.output = output
self.box_width = 0
self.height = 0
self.box_width = 0
self.height = 0
self.lines = 0
self.display = display
self.newpage = newpage
@ -135,41 +138,43 @@ class FanChart:
self.doc.add_draw_style("FC-c5n",g)
self.map = [None] * 32
self.text= {}
self.text= {}
self.box_width = 0
if self.standalone:
self.doc.init()
def filter(self,person,index):
def filter(self,person_id,index):
"""traverse the ancestors recursively until either the end
of a line is found, or until we reach the maximum number of
generations that we want to deal with"""
if person == None or index >= 32:
if (not person_id) or (index >= 32):
return
self.map[index-1] = person
self.map[index-1] = person_id
self.text[index-1] = []
self.text[index-1] = []
subst = SubstKeywords(person)
subst = SubstKeywords(self.database,person_id)
for line in self.display:
self.text[index-1].append(subst.replace(line))
self.font = self.doc.style_list["FC-Normal"].get_font()
for line in self.text[index-1]:
self.box_width = max(self.box_width,string_width(self.font,line))
for line in self.text[index-1]:
self.box_width = max(self.box_width,string_width(self.font,line))
self.lines = max(self.lines,len(self.text[index-1]))
self.lines = max(self.lines,len(self.text[index-1]))
family = person.get_main_parents_family_id()
if family != None:
person = self.database.find_person_from_id(person_id)
family_id = person.get_main_parents_family_id()
if family_id:
family = self.database.find_family_from_id(family_id)
self.filter(family.get_father_id(),index*2)
self.filter(family.get_mother_id(),(index*2)+1)
def write_report(self):
self.filter(self.start,1)
self.filter(self.start.get_id(),1)
block_size = self.doc.get_usable_width()/14.0
@ -196,13 +201,24 @@ class FanChart:
if self.standalone:
self.doc.close()
def get_info(self,person):
def get_info(self,person_id):
person = self.database.find_person_from_id(person_id)
pn = person.get_primary_name()
b = person.get_birth().get_date_object().getYear()
d = person.get_death().get_date_object().getYear()
if b == Calendar.UNDEF:
birth_id = person.get_birth_id()
if birth_id:
b = self.database.find_event_from_id(birth_id).get_date_object().get_year()
if b == Calendar.UNDEF:
b = ""
else:
b = ""
if d == Calendar.UNDEF:
death_id = person.get_death_id()
if death_id:
d = self.database.find_event_from_id(death_id).get_date_object().get_year()
if d == Calendar.UNDEF:
d = ""
else:
d = ""
if b or d:

View File

@ -1,7 +1,7 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2003 Donald N. Allingham
# Copyright (C) 2003-2004 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
@ -50,7 +50,7 @@ import GenericFilter
import Errors
import Date
import FontScale
import sort
import Sort
from QuestionDialog import ErrorDialog
from gettext import gettext as _
@ -76,10 +76,10 @@ class TimeLine:
class.
"""
self.d = document
self.filter = filter
self.db = database
self.person = person
self.output = output
self.filter = filter
self.db = database
self.person = person
self.output = output
self.title = title
self.sort_func = sort_func
self.newpage = newpage
@ -183,9 +183,19 @@ class TimeLine:
self.plist.sort(self.sort_func)
for p in self.plist:
b = p.get_birth().get_date_object().getYear()
d = p.get_death().get_date_object().getYear()
for p_id in self.plist:
p = self.db.find_person_from_id(p_id)
b_id = p.get_birth_id()
if b_id:
b = self.db.find_event_from_id(b_id).get_date_object().get_year()
else:
b = Date.UNDEF
d_id = p.get_death_id()
if d_id:
d = self.db.find_event_from_id(d_id).get_date_object().get_year()
else:
d = Date.UNDEF
n = p.get_primary_name().get_name()
self.d.draw_text('TLG-text',n,incr+pad,self.header + (incr+pad)*index)
@ -267,24 +277,34 @@ class TimeLine:
def find_year_range(self):
low = 999999
high = -999999
self.plist = self.filter.apply(self.db,self.db.get_person_id_map().values())
high = -999999
self.plist = self.filter.apply(self.db,self.db.get_person_keys())
for p in self.plist:
b = p.get_birth().get_date_object().getYear()
d = p.get_death().get_date_object().getYear()
for p_id in self.plist:
p = self.db.find_person_from_id(p_id)
b_id = p.get_birth_id()
if b_id:
b = self.db.find_event_from_id(b_id).get_date_object().get_year()
else:
b = Date.UNDEF
if b != Date.UNDEF:
low = min(low,b)
high = max(high,b)
d_id = p.get_death_id()
if d_id:
d = self.db.find_event_from_id(d_id).get_date_object().get_year()
else:
d = Date.UNDEF
if d != Date.UNDEF:
low = min(low,d)
high = max(high,d)
if b != Date.UNDEF:
low = min(low,b)
high = max(high,b)
if d != Date.UNDEF:
low = min(low,d)
high = max(high,d)
low = (low/10)*10
high = ((high+9)/10)*10
low = (low/10)*10
high = ((high+9)/10)*10
if low == Date.UNDEF:
low = high
@ -294,13 +314,14 @@ class TimeLine:
return (low,high)
def name_size(self):
self.plist = self.filter.apply(self.db,self.db.get_person_id_map().values())
self.plist = self.filter.apply(self.db,self.db.get_person_keys())
style_name = self.d.draw_styles['TLG-text'].get_paragraph_style()
font = self.d.style_list[style_name].get_font()
size = 0
for p in self.plist:
for p_id in self.plist:
p = self.db.find_person_from_id(p_id)
n = p.get_primary_name().get_name()
size = max(FontScale.string_width(font,n),size)
return pt2cm(size)
@ -372,7 +393,7 @@ def _get_report_filters(person):
# Builds list of sorting functions for this report
#
#------------------------------------------------------------------------
def _get_sort_functions():
def _get_sort_functions(sort):
return [
(_("Birth Date"),sort.by_birthdate),
(_("Name"),sort.by_last_name),
@ -388,6 +409,7 @@ class TimeLineDialog(Report.DrawReportDialog):
report_options = {}
def __init__(self,database,person):
self.database = database
Report.DrawReportDialog.__init__(self,database,person,self.report_options)
def get_title(self):
@ -421,7 +443,7 @@ class TimeLineDialog(Report.DrawReportDialog):
self.sort_style = gtk.OptionMenu()
self.sort_menu = gtk.Menu()
sort_functions = _get_sort_functions()
sort_functions = _get_sort_functions(Sort.Sort(self.database))
for item in sort_functions:
menuitem = gtk.MenuItem(item[0])
menuitem.set_data('sort',item[1])
@ -564,7 +586,7 @@ class TimeLineBareDialog(Report.BareReportDialog):
self.sort_style = gtk.OptionMenu()
self.sort_menu = gtk.Menu()
sort_functions = _get_sort_functions()
sort_functions = _get_sort_functions(Sort.Sort(self.db))
for item in sort_functions:
menuitem = gtk.MenuItem(item[0])
menuitem.set_data('sort',item[1])