Merge branch 'master' of openobject-server into mdv-gpl3
Conflicts: bin/tools/translate.py bzr revid: p_christ@hol.gr-20081124152658-xvkszq1j9xrm98mv
This commit is contained in:
commit
17631aef94
|
@ -1,7 +1,7 @@
|
|||
# -*- encoding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2008 Tiny SPRL (<http://tiny.be>). All Rights Reserved
|
||||
# $Id$
|
||||
#
|
||||
|
@ -45,6 +45,9 @@ sys.path.insert(1, _ad)
|
|||
if ad != _ad:
|
||||
sys.path.insert(1, ad)
|
||||
|
||||
# Modules already loaded
|
||||
loaded = []
|
||||
|
||||
class Graph(dict):
|
||||
|
||||
def addNode(self, name, deps):
|
||||
|
@ -152,12 +155,15 @@ def get_module_resource(module, *args):
|
|||
def get_modules():
|
||||
"""Returns the list of module names
|
||||
"""
|
||||
def listdir(dir):
|
||||
def clean(name):
|
||||
name = os.path.basename(name)
|
||||
if name[-4:] == '.zip':
|
||||
name = name[:-4]
|
||||
return name
|
||||
return map(clean, os.listdir(dir))
|
||||
|
||||
module_list = os.listdir(ad)
|
||||
module_names = [os.path.basename(m) for m in module_list]
|
||||
module_list += [m for m in os.listdir(_ad) if m not in module_names]
|
||||
|
||||
return module_list
|
||||
return list(set(listdir(ad) + listdir(_ad)))
|
||||
|
||||
def create_graph(module_list, force=None):
|
||||
if not force:
|
||||
|
@ -166,8 +172,6 @@ def create_graph(module_list, force=None):
|
|||
packages = []
|
||||
|
||||
for module in module_list:
|
||||
if module[-4:]=='.zip':
|
||||
module = module[:-4]
|
||||
try:
|
||||
mod_path = get_module_path(module)
|
||||
if not mod_path:
|
||||
|
@ -176,7 +180,7 @@ def create_graph(module_list, force=None):
|
|||
continue
|
||||
terp_file = get_module_resource(module, '__terp__.py')
|
||||
if not terp_file: continue
|
||||
if os.path.isfile(terp_file) or zipfile.is_zipfile(mod_path):
|
||||
if os.path.isfile(terp_file) or zipfile.is_zipfile(mod_path+'.zip'):
|
||||
try:
|
||||
info = eval(tools.file_open(terp_file).read())
|
||||
except:
|
||||
|
@ -184,8 +188,9 @@ def create_graph(module_list, force=None):
|
|||
raise
|
||||
if info.get('installable', True):
|
||||
packages.append((module, info.get('depends', []), info))
|
||||
|
||||
current,later = Set([p for p, dep, data in packages]), Set()
|
||||
|
||||
dependencies = dict([(p, deps) for p, deps, data in packages])
|
||||
current, later = Set([p for p, dep, data in packages]), Set()
|
||||
while packages and current > later:
|
||||
package, deps, datas = packages[0]
|
||||
|
||||
|
@ -208,7 +213,8 @@ def create_graph(module_list, force=None):
|
|||
packages.pop(0)
|
||||
|
||||
for package in later:
|
||||
logger.notifyChannel('init', netsvc.LOG_ERROR, 'addon:%s:Unmet dependency' % package)
|
||||
unmet_deps = filter(lambda p: p not in graph, dependencies[package])
|
||||
logger.notifyChannel('init', netsvc.LOG_ERROR, 'addon:%s:Unmet dependencies: %s' % (package, ', '.join(unmet_deps)))
|
||||
|
||||
return graph
|
||||
|
||||
|
@ -221,6 +227,36 @@ def init_module_objects(cr, module_name, obj_list):
|
|||
obj._auto_init(cr, {'module': module_name})
|
||||
cr.commit()
|
||||
|
||||
#
|
||||
# Register module named m, if not already registered
|
||||
#
|
||||
def register_class(m):
|
||||
global loaded
|
||||
if m in loaded:
|
||||
return
|
||||
logger.notifyChannel('init', netsvc.LOG_INFO, 'addon:%s:registering classes' % m)
|
||||
sys.stdout.flush()
|
||||
loaded.append(m)
|
||||
mod_path = get_module_path(m)
|
||||
if not os.path.isfile(mod_path+'.zip'):
|
||||
imp.load_module(m, *imp.find_module(m))
|
||||
else:
|
||||
import zipimport
|
||||
try:
|
||||
zimp = zipimport.zipimporter(mod_path+'.zip')
|
||||
zimp.load_module(m)
|
||||
except zipimport.ZipImportError:
|
||||
logger.notifyChannel('init', netsvc.LOG_ERROR, 'Couldn\'t find module %s' % m)
|
||||
|
||||
def register_classes():
|
||||
return
|
||||
module_list = get_modules()
|
||||
for package in create_graph(module_list):
|
||||
m = package.name
|
||||
register_class(m)
|
||||
logger.notifyChannel('init', netsvc.LOG_INFO, 'addon:%s:registering classes' % m)
|
||||
sys.stdout.flush()
|
||||
|
||||
def load_module_graph(cr, graph, status=None, **kwargs):
|
||||
# **kwargs is passed directly to convert_xml_import
|
||||
if not status:
|
||||
|
@ -232,11 +268,12 @@ def load_module_graph(cr, graph, status=None, **kwargs):
|
|||
for package in graph:
|
||||
status['progress'] = (float(statusi)+0.1)/len(graph)
|
||||
m = package.name
|
||||
register_class(m)
|
||||
logger.notifyChannel('init', netsvc.LOG_INFO, 'addon:%s' % m)
|
||||
sys.stdout.flush()
|
||||
pool = pooler.get_pool(cr.dbname)
|
||||
modules = pool.instanciate(m, cr)
|
||||
|
||||
|
||||
cr.execute('select id from ir_module_module where name=%s', (m,))
|
||||
mid = int(cr.rowcount and cr.fetchone()[0] or 0)
|
||||
|
||||
|
@ -277,7 +314,7 @@ def load_module_graph(cr, graph, status=None, **kwargs):
|
|||
cr.execute("update ir_module_module set state='installed' where state in ('to upgrade', 'to install') and id=%d", (mid,))
|
||||
|
||||
cr.commit()
|
||||
|
||||
|
||||
# Update translations for all installed languages
|
||||
modobj = pool.get('ir.module.module')
|
||||
if modobj:
|
||||
|
@ -289,7 +326,7 @@ def load_module_graph(cr, graph, status=None, **kwargs):
|
|||
cr.execute("""select model,name from ir_model where id not in (select model_id from ir_model_access)""")
|
||||
for (model,name) in cr.fetchall():
|
||||
logger.notifyChannel('init', netsvc.LOG_WARNING, 'addon:object %s (%s) has no access rules!' % (model,name))
|
||||
|
||||
|
||||
pool = pooler.get_pool(cr.dbname)
|
||||
cr.execute('select * from ir_model where state=%s', ('manual',))
|
||||
for model in cr.dictfetchall():
|
||||
|
@ -298,25 +335,6 @@ def load_module_graph(cr, graph, status=None, **kwargs):
|
|||
pool.get('ir.model.data')._process_end(cr, 1, package_todo)
|
||||
cr.commit()
|
||||
|
||||
def register_classes():
|
||||
module_list = get_modules()
|
||||
for package in create_graph(module_list):
|
||||
m = package.name
|
||||
logger.notifyChannel('init', netsvc.LOG_INFO, 'addon:%s:registering classes' % m)
|
||||
sys.stdout.flush()
|
||||
|
||||
mod_path = get_module_path(m)
|
||||
if not os.path.isfile(mod_path+'.zip'):
|
||||
# XXX must restrict to only addons paths
|
||||
imp.load_module(m, *imp.find_module(m))
|
||||
else:
|
||||
import zipimport
|
||||
try:
|
||||
zimp = zipimport.zipimporter(mod_path+'.zip')
|
||||
zimp.load_module(m)
|
||||
except zipimport.ZipImportError:
|
||||
logger.notifyChannel('init', netsvc.LOG_ERROR, 'Couldn\'t find module %s' % m)
|
||||
|
||||
def load_modules(db, force_demo=False, status=None, update_module=False):
|
||||
if not status:
|
||||
status={}
|
||||
|
|
|
@ -43,9 +43,9 @@
|
|||
"ir/wizard/wizard_menu_view.xml",
|
||||
"ir/ir.xml",
|
||||
"ir/workflow/workflow_view.xml",
|
||||
"module/module_data.xml",
|
||||
"module/module_wizard.xml",
|
||||
"module/module_view.xml",
|
||||
"module/module_data.xml",
|
||||
"module/module_report.xml",
|
||||
"res/res_request_view.xml",
|
||||
"res/res_lang_view.xml",
|
||||
|
|
|
@ -220,10 +220,15 @@
|
|||
<field name="name">Costa Rica</field>
|
||||
<field name="code">cr</field>
|
||||
</record>
|
||||
<record id="cs" model="res.country">
|
||||
<field name="name">Serbia and Montenegro</field>
|
||||
<field name="code">cs</field>
|
||||
<record id="rs" model="res.country">
|
||||
<field name="name">Serbia</field>
|
||||
<field name="code">rs</field>
|
||||
</record>
|
||||
<record id="me" model="res.country">
|
||||
<field name="name">Montenegro</field>
|
||||
<field name="code">me</field>
|
||||
</record>
|
||||
|
||||
<record id="cu" model="res.country">
|
||||
<field name="name">Cuba</field>
|
||||
<field name="code">cu</field>
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -70,9 +70,26 @@
|
|||
<field name="number_increment"/>
|
||||
<field name="number_next"/>
|
||||
<separator colspan="4" string="Legend (for prefix, suffix)"/>
|
||||
<label colspan="4" string="Year: %%(year)s"/>
|
||||
<label colspan="4" string="Month: %%(month)s"/>
|
||||
<label colspan="4" string="Day: %%(day)s"/>
|
||||
<group col="8" colspan="4">
|
||||
<group>
|
||||
<label colspan="4" string="Year with century: %%(year)s"/>
|
||||
<label colspan="4" string="Year without century: %%(y)s"/>
|
||||
<label colspan="4" string="Month: %%(month)s"/>
|
||||
<label colspan="4" string="Day: %%(day)s"/>
|
||||
</group>
|
||||
<group>
|
||||
<label colspan="4" string="Day of the year: %%(doy)s"/>
|
||||
<label colspan="4" string="Week of the year: %%(woy)s"/>
|
||||
<label colspan="4" string="Day of the week (0:Monday): %%(weekday)s"/>
|
||||
</group>
|
||||
<group>
|
||||
<label colspan="4" string="Hour 00->24: %%(h24)s"/>
|
||||
<label colspan="4" string="Hour 00->12: %%(h12)s"/>
|
||||
<label colspan="4" string="Minute: %%(min)s"/>
|
||||
<label colspan="4" string="Seconde: %%(sec)s"/>
|
||||
</group>
|
||||
</group>
|
||||
<separator colspan="4" string=""/>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
@ -486,14 +503,37 @@
|
|||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Attachments">
|
||||
<field colspan="4" name="name" select="1"/>
|
||||
<field colspan="4" name="datas"/>
|
||||
<field name="datas_fname"/>
|
||||
<newline/>
|
||||
<field name="res_model" select="1"/>
|
||||
<field name="res_id"/>
|
||||
<separator colspan="4" string="Description"/>
|
||||
<field colspan="4" name="description" nolabel="1"/>
|
||||
<group colspan="4" col="6">
|
||||
<field name="name" select="1" />
|
||||
<field name="create_uid" select="1"/>
|
||||
<field name="create_date" select="1"/>
|
||||
</group>
|
||||
<notebook colspan="4">
|
||||
<page string="Attachment">
|
||||
<group col="2" colspan="2">
|
||||
<separator string="Data" colspan="2"/>
|
||||
<field name="datas" filename="datas_fname"/>
|
||||
<field name="datas_fname" select="1"/>
|
||||
</group>
|
||||
<group col="2" colspan="2">
|
||||
<separator string="Attached To" colspan="2"/>
|
||||
<field name="res_model" select="1"/>
|
||||
<field name="res_id"/>
|
||||
</group>
|
||||
<separator string="Preview" colspan="4"/>
|
||||
<field
|
||||
name="preview"
|
||||
widget="image"
|
||||
readonly="1"
|
||||
nolabel="1"
|
||||
colspan="4"
|
||||
img_height="400"
|
||||
img_width="800"/>
|
||||
</page>
|
||||
<page string="Notes">
|
||||
<field colspan="4" name="description" nolabel="1"/>
|
||||
</page>
|
||||
</notebook>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
@ -504,8 +544,9 @@
|
|||
<field name="arch" type="xml">
|
||||
<tree string="Attachments">
|
||||
<field name="name"/>
|
||||
<field name="res_model"/>
|
||||
<field name="res_id"/>
|
||||
<field name="datas_fname"/>
|
||||
<field name="create_uid"/>
|
||||
<field name="create_date"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
@ -515,7 +556,7 @@
|
|||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">ir.attachment</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_id" ref="view_attachment_tree"/>
|
||||
<field name="view_id" eval="False"/>
|
||||
</record>
|
||||
<menuitem action="action_attachment" id="menu_action_attachment" parent="base.next_id_4"/>
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
# -*- encoding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2008 Tiny SPRL (<http://tiny.be>). All Rights Reserved
|
||||
# $Id$
|
||||
#
|
||||
|
@ -164,21 +164,16 @@ class act_window(osv.osv):
|
|||
res={}
|
||||
for act in self.browse(cr, uid, ids):
|
||||
res[act.id]=[(view.view_id.id, view.view_mode) for view in act.view_ids]
|
||||
if (not act.view_ids):
|
||||
modes = act.view_mode.split(',')
|
||||
modes = act.view_mode.split(',')
|
||||
if len(modes)>len(act.view_ids):
|
||||
find = False
|
||||
if act.view_id:
|
||||
res[act.id].append((act.view_id.id, act.view_id.type))
|
||||
for t in modes:
|
||||
for t in modes[len(act.view_ids):]:
|
||||
if act.view_id and (t == act.view_id.type) and not find:
|
||||
find = True
|
||||
continue
|
||||
res[act.id].append((False, t))
|
||||
|
||||
if 'calendar' not in modes:
|
||||
mobj = self.pool.get(act.res_model)
|
||||
if hasattr(mobj, '_date_name') and mobj._date_name in mobj._columns:
|
||||
res[act.id].append((False, 'calendar'))
|
||||
return res
|
||||
|
||||
_columns = {
|
||||
|
@ -593,26 +588,26 @@ act_window_close()
|
|||
# - if start_type='auto', it will be start on auto starting from start date, and stop on stop date
|
||||
# - if start_type="manual", it will start and stop on manually
|
||||
class ir_actions_todo(osv.osv):
|
||||
_name = 'ir.actions.todo'
|
||||
_name = 'ir.actions.todo'
|
||||
_columns={
|
||||
'name':fields.char('Name',size=64,required=True, select=True),
|
||||
'note':fields.text('Text'),
|
||||
'start_date': fields.datetime('Start Date'),
|
||||
'end_date': fields.datetime('End Date'),
|
||||
'start_date': fields.datetime('Start Date'),
|
||||
'end_date': fields.datetime('End Date'),
|
||||
'action_id':fields.many2one('ir.actions.act_window', 'Action', select=True,required=True, ondelete='cascade'),
|
||||
'sequence':fields.integer('Sequence'),
|
||||
'active': fields.boolean('Active'),
|
||||
'type':fields.selection([('configure', 'Configure'),('service', 'Service'),('other','Other')], string='Type', required=True),
|
||||
'start_on':fields.selection([('at_once', 'At Once'),('auto', 'Auto'),('manual','Manual')], string='Start On'),
|
||||
'groups_id': fields.many2many('res.groups', 'res_groups_act_todo_rel', 'act_todo_id', 'group_id', 'Groups'),
|
||||
'users_id': fields.many2many('res.users', 'res_users_act_todo_rel', 'act_todo_id', 'user_id', 'Users'),
|
||||
'active': fields.boolean('Active'),
|
||||
'type':fields.selection([('configure', 'Configure'),('service', 'Service'),('other','Other')], string='Type', required=True),
|
||||
'start_on':fields.selection([('at_once', 'At Once'),('auto', 'Auto'),('manual','Manual')], string='Start On'),
|
||||
'groups_id': fields.many2many('res.groups', 'res_groups_act_todo_rel', 'act_todo_id', 'group_id', 'Groups'),
|
||||
'users_id': fields.many2many('res.users', 'res_users_act_todo_rel', 'act_todo_id', 'user_id', 'Users'),
|
||||
'state':fields.selection([('open', 'Not Started'),('done', 'Done'),('skip','Skipped'),('cancel','Cancel')], string='State', required=True)
|
||||
}
|
||||
_defaults={
|
||||
'state': lambda *a: 'open',
|
||||
'sequence': lambda *a: 10,
|
||||
'active':lambda *a:True,
|
||||
'type':lambda *a:'configure'
|
||||
'active':lambda *a:True,
|
||||
'type':lambda *a:'configure'
|
||||
}
|
||||
_order="sequence"
|
||||
ir_actions_todo()
|
||||
|
|
|
@ -86,6 +86,12 @@ class ir_attachment(osv.osv):
|
|||
|
||||
def clear_cache(self):
|
||||
self.check()
|
||||
|
||||
def action_get(self, cr, uid, context=None):
|
||||
dataobj = self.pool.get('ir.model.data')
|
||||
data_id = dataobj._get_id(cr, 1, 'base', 'action_attachment')
|
||||
res_id = dataobj.browse(cr, uid, data_id, context).res_id
|
||||
return self.pool.get('ir.actions.act_window').read(cr, uid, res_id, [], context)
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
r = super(ir_attachment, self).__init__(*args, **kwargs)
|
||||
|
@ -96,16 +102,32 @@ class ir_attachment(osv.osv):
|
|||
self.pool.get('ir.model.access').unregister_cache_clearing_method(self._name, 'clear_cache')
|
||||
return super(ir_attachment, self).__del__()
|
||||
|
||||
def _get_preview(self, cr, uid, ids, name, arg, context=None):
|
||||
result = {}
|
||||
if context is None:
|
||||
context = {}
|
||||
context['bin_size'] = False
|
||||
for i in self.browse(cr, uid, ids, context=context):
|
||||
result[i.id] = False
|
||||
for format in ('png','PNG','jpg','JPG'):
|
||||
if (i.datas_fname or '').endswith(format):
|
||||
result[i.id]= i.datas
|
||||
return result
|
||||
|
||||
_name = 'ir.attachment'
|
||||
_columns = {
|
||||
'name': fields.char('Attachment Name',size=64, required=True),
|
||||
'datas': fields.binary('Data'),
|
||||
'datas_fname': fields.char('Data Filename',size=64),
|
||||
'preview': fields.function(_get_preview, type='binary', string='Image Preview', method=True),
|
||||
'datas_fname': fields.char('Filename',size=64),
|
||||
'description': fields.text('Description'),
|
||||
# Not required due to the document module !
|
||||
'res_model': fields.char('Resource Object',size=64, readonly=True),
|
||||
'res_id': fields.integer('Resource ID', readonly=True),
|
||||
'link': fields.char('Link', size=256)
|
||||
'link': fields.char('Link', size=256),
|
||||
|
||||
'create_date': fields.datetime('Date Created', readonly=True),
|
||||
'create_uid': fields.many2one('res.users', 'Creator', readonly=True),
|
||||
}
|
||||
ir_attachment()
|
||||
|
||||
|
|
|
@ -55,7 +55,19 @@ class ir_sequence(osv.osv):
|
|||
}
|
||||
|
||||
def _process(self, s):
|
||||
return (s or '') % {'year':time.strftime('%Y'), 'month': time.strftime('%m'), 'day':time.strftime('%d')}
|
||||
return (s or '') % {
|
||||
'year':time.strftime('%Y'),
|
||||
'month': time.strftime('%m'),
|
||||
'day':time.strftime('%d'),
|
||||
'y': time.strftime('%y'),
|
||||
'doy': time.strftime('%j'),
|
||||
'woy': time.strftime('%W'),
|
||||
'weekday': time.strftime('%w'),
|
||||
'h24': time.strftime('%H'),
|
||||
'h12': time.strftime('%I'),
|
||||
'min': time.strftime('%M'),
|
||||
'sec': time.strftime('%S'),
|
||||
}
|
||||
|
||||
def get_id(self, cr, uid, sequence_id, test='id=%d'):
|
||||
cr.execute('select id,number_next,number_increment,prefix,suffix,padding from ir_sequence where '+test+' and active=True FOR UPDATE', (sequence_id,))
|
||||
|
|
|
@ -48,7 +48,7 @@ class ir_translation(osv.osv, Cacheable):
|
|||
lang_ids = lang_obj.search(cr, uid, [('translatable', '=', True)],
|
||||
context=context)
|
||||
langs = lang_obj.browse(cr, uid, lang_ids, context=context)
|
||||
res = [(lang.code, lang.name) for lang in langs]
|
||||
res = [(lang.code, unicode(lang.name,'utf-8')) for lang in langs]
|
||||
for lang_dict in tools.scan_languages():
|
||||
if lang_dict not in res:
|
||||
res.append(lang_dict)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
# -*- encoding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2008 Tiny SPRL (<http://tiny.be>). All Rights Reserved
|
||||
# $Id$
|
||||
#
|
||||
|
@ -73,6 +73,23 @@ class view(osv.osv):
|
|||
(_check_xml, 'Invalid XML for View Architecture!', ['arch'])
|
||||
]
|
||||
|
||||
def create(self, cr, uid, vals, context={}):
|
||||
if 'inherit_id' in vals:
|
||||
obj=self.browse(cr,uid,vals['inherit_id'])
|
||||
child=self.pool.get(vals['model'])
|
||||
error="Inherited view model [%s] and \
|
||||
\n\n base view model [%s] do not match \
|
||||
\n\n It should be same as base view model " \
|
||||
%(vals['model'],obj.model)
|
||||
try:
|
||||
if obj.model==child._inherit:
|
||||
pass
|
||||
except:
|
||||
if not obj.model==vals['model']:
|
||||
raise Exception(error)
|
||||
|
||||
return super(view,self).create(cr, uid, vals, context={})
|
||||
|
||||
def read(self, cr, uid, ids, fields=None, context={}, load='_classic_read'):
|
||||
|
||||
if not isinstance(ids, (list, tuple)):
|
||||
|
|
|
@ -38,7 +38,7 @@ def graph_get(cr, graph, wkf_id, nested=False, workitem={}):
|
|||
if n['subflow_id'] and nested:
|
||||
cr.execute('select * from wkf where id=%d', (n['subflow_id'],))
|
||||
wkfinfo = cr.dictfetchone()
|
||||
graph2 = pydot.Cluster('subflow'+str(n['subflow_id']), fontsize=12, label = "Subflow: "+n['name']+'\\nOSV: '+wkfinfo['osv'])
|
||||
graph2 = pydot.Cluster('subflow'+str(n['subflow_id']), fontsize='12', label = "Subflow: "+n['name']+'\\nOSV: '+wkfinfo['osv'])
|
||||
(s1,s2) = graph_get(cr, graph2, n['subflow_id'], nested,workitem)
|
||||
graph.add_subgraph(graph2)
|
||||
actfrom[n['id']] = s2
|
||||
|
@ -76,7 +76,7 @@ def graph_get(cr, graph, wkf_id, nested=False, workitem={}):
|
|||
|
||||
activity_from = actfrom[t['act_from']][1].get(t['signal'], actfrom[t['act_from']][0])
|
||||
activity_to = actto[t['act_to']][1].get(t['signal'], actto[t['act_to']][0])
|
||||
graph.add_edge(pydot.Edge( activity_from ,activity_to, fontsize=10, **args))
|
||||
graph.add_edge(pydot.Edge( str(activity_from) ,str(activity_to), fontsize='10', **args))
|
||||
nodes = cr.dictfetchall()
|
||||
cr.execute('select id from wkf_activity where flow_start=True and wkf_id=%d limit 1', (wkf_id,))
|
||||
start = cr.fetchone()[0]
|
||||
|
@ -143,14 +143,14 @@ showpage'''
|
|||
showpage'''
|
||||
else:
|
||||
inst_id = inst_id[0]
|
||||
graph = pydot.Dot(fontsize=16, label="\\n\\nWorkflow: %s\\n OSV: %s" % (wkfinfo['name'],wkfinfo['osv']))
|
||||
graph = pydot.Dot(fontsize='16', label="""\\\n\\nWorkflow: %s\\n OSV: %s""" % (wkfinfo['name'],wkfinfo['osv']))
|
||||
graph.set('size', '10.7,7.3')
|
||||
graph.set('center', '1')
|
||||
graph.set('ratio', 'auto')
|
||||
graph.set('rotate', '90')
|
||||
graph.set('rankdir', 'LR')
|
||||
graph_instance_get(cr, graph, inst_id, data.get('nested', False))
|
||||
ps_string = graph.create_ps(prog='dot')
|
||||
ps_string = graph.create(prog='dot', format='ps')
|
||||
except Exception, e:
|
||||
import traceback, sys
|
||||
tb_s = reduce(lambda x, y: x+y, traceback.format_exception(sys.exc_type, sys.exc_value, sys.exc_traceback))
|
||||
|
|
|
@ -1,16 +0,0 @@
|
|||
Copyright (c) 2004 Ero Carrera
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
|
||||
associated documentation files (the "Software"), to deal in the Software without restriction,
|
||||
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial
|
||||
portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
||||
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -1,33 +0,0 @@
|
|||
Metadata-Version: 1.0
|
||||
Name: pydot
|
||||
Version: 0.9.9
|
||||
Summary: Python interface to Graphiz's Dot
|
||||
Home-page: http://dkbza.org/pydot.html
|
||||
Author: Ero Carrera
|
||||
Author-email: ero@dkbza.org
|
||||
License: MIT
|
||||
Description: Graphviz's dot language Python interface.
|
||||
|
||||
This module provides with a full interface to create handle modify
|
||||
and process graphs in Graphviz's dot language.
|
||||
|
||||
References:
|
||||
|
||||
pydot Homepage: http://www.dkbza.org/pydot.html
|
||||
Graphviz: http://www.research.att.com/sw/tools/graphviz/
|
||||
DOT Language: http://www.research.att.com/~erg/graphviz/info/lang.html
|
||||
|
||||
Programmed and tested with Graphviz 1.12 and Python 2.3.3 on GNU/Linux
|
||||
by Ero Carrera (c) 2004 [ero@dkbza.org]
|
||||
|
||||
Distributed under MIT license [http://opensource.org/licenses/mit-license.html].
|
||||
|
||||
Platform: any
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Intended Audience :: Science/Research
|
||||
Classifier: License :: OSI Approved :: MIT License
|
||||
Classifier: Natural Language :: English
|
||||
Classifier: Operating System :: OS Independent
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Topic :: Scientific/Engineering :: Visualization
|
||||
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
@ -1,29 +0,0 @@
|
|||
pydot - Python interface to Graphviz's Dot language
|
||||
Ero Carrera (c) 2004
|
||||
ero@dkbza.org
|
||||
|
||||
This code is distributed under the MIT license.
|
||||
|
||||
Requirements:
|
||||
-------------
|
||||
|
||||
pyparsing: pydot requires the pyparsing module in order to be
|
||||
able to load DOT files.
|
||||
|
||||
GraphViz: is needed in order to render the graphs into any of
|
||||
the plethora of output formats supported.
|
||||
|
||||
Installation:
|
||||
-------------
|
||||
|
||||
Should suffice with doing:
|
||||
|
||||
python setup.py install
|
||||
|
||||
Needless to say, no installation is needed just to use the module. A mere:
|
||||
|
||||
import pydot
|
||||
|
||||
should do it, provided that the directory containing the modules is on Python
|
||||
module search path.
|
||||
|
|
@ -1 +0,0 @@
|
|||
from pydot import *
|
|
@ -1,352 +0,0 @@
|
|||
#!/bin/env python
|
||||
|
||||
"""
|
||||
The dotparser parses graphviz files in dot and dot files and transforms them
|
||||
into a class representation defined by pydot.
|
||||
|
||||
The module needs pyparsing (tested with version 1.2) and pydot (tested with 0.9.9)
|
||||
|
||||
Author: Michael Krause <michael@krause-software.de>
|
||||
"""
|
||||
|
||||
import sys
|
||||
import glob
|
||||
import pydot
|
||||
|
||||
from pyparsing import __version__ as pyparsing_version
|
||||
from pyparsing import Literal, CaselessLiteral, Word, \
|
||||
Upcase, OneOrMore, ZeroOrMore, Forward, NotAny, \
|
||||
delimitedList, oneOf, Group, Optional, Combine, \
|
||||
alphas, nums, restOfLine, cStyleComment, nums, \
|
||||
alphanums, printables, empty, quotedString, \
|
||||
ParseException, ParseResults, CharsNotIn, _noncomma
|
||||
|
||||
|
||||
class P_AttrList:
|
||||
def __init__(self, toks):
|
||||
self.attrs = {}
|
||||
i = 0
|
||||
while i < len(toks):
|
||||
attrname = toks[i]
|
||||
attrvalue = toks[i+1]
|
||||
self.attrs[attrname] = attrvalue
|
||||
i += 2
|
||||
|
||||
def __repr__(self):
|
||||
return "%s(%r)" % (self.__class__.__name__, self.attrs)
|
||||
|
||||
|
||||
class DefaultStatement(P_AttrList):
|
||||
def __init__(self, default_type, attrs):
|
||||
self.default_type = default_type
|
||||
self.attrs = attrs
|
||||
|
||||
def __repr__(self):
|
||||
return "%s(%s, %r)" % \
|
||||
(self.__class__.__name__, self.default_type, self.attrs)
|
||||
|
||||
|
||||
def push_top_graph_stmt(str, loc, toks):
|
||||
attrs = {}
|
||||
g = None
|
||||
|
||||
for element in toks:
|
||||
if isinstance(element, ParseResults) or \
|
||||
isinstance(element, tuple) or \
|
||||
isinstance(element, list):
|
||||
|
||||
element = element[0]
|
||||
|
||||
if element == 'strict':
|
||||
attrs['strict'] = True
|
||||
elif element in ['graph', 'digraph']:
|
||||
attrs['graph_type'] = element
|
||||
elif type(element) == type(''):
|
||||
attrs['graph_name'] = element
|
||||
elif isinstance(element, pydot.Graph):
|
||||
g = pydot.Graph(**attrs)
|
||||
g.__dict__.update(element.__dict__)
|
||||
for e in g.get_edge_list():
|
||||
e.parent_graph = g
|
||||
for e in g.get_node_list():
|
||||
e.parent_graph = g
|
||||
for e in g.get_subgraph_list():
|
||||
e.set_graph_parent(g)
|
||||
|
||||
elif isinstance(element, P_AttrList):
|
||||
attrs.update(element.attrs)
|
||||
else:
|
||||
raise ValueError, "Unknown element statement: %r " % element
|
||||
|
||||
if g is not None:
|
||||
g.__dict__.update(attrs)
|
||||
return g
|
||||
|
||||
|
||||
def add_defaults(element, defaults):
|
||||
d = element.__dict__
|
||||
for key, value in defaults.items():
|
||||
if not d.get(key):
|
||||
d[key] = value
|
||||
|
||||
|
||||
def add_elements(g, toks, defaults_graph=None, defaults_node=None, defaults_edge=None):
|
||||
|
||||
if defaults_graph is None:
|
||||
defaults_graph = {}
|
||||
if defaults_node is None:
|
||||
defaults_node = {}
|
||||
if defaults_edge is None:
|
||||
defaults_edge = {}
|
||||
|
||||
for element in toks:
|
||||
if isinstance(element, pydot.Graph):
|
||||
add_defaults(element, defaults_graph)
|
||||
g.add_subgraph(element)
|
||||
elif isinstance(element, pydot.Node):
|
||||
add_defaults(element, defaults_node)
|
||||
g.add_node(element)
|
||||
elif isinstance(element, pydot.Edge):
|
||||
add_defaults(element, defaults_edge)
|
||||
g.add_edge(element)
|
||||
elif isinstance(element, ParseResults):
|
||||
for e in element:
|
||||
add_elements(g, [e], defaults_graph, defaults_node, defaults_edge)
|
||||
elif isinstance(element, DefaultStatement):
|
||||
if element.default_type == 'graph':
|
||||
default_graph_attrs = pydot.Node('graph')
|
||||
default_graph_attrs.__dict__.update(element.attrs)
|
||||
g.add_node(default_graph_attrs)
|
||||
# defaults_graph.update(element.attrs)
|
||||
# g.__dict__.update(element.attrs)
|
||||
elif element.default_type == 'node':
|
||||
default_node_attrs = pydot.Node('node')
|
||||
default_node_attrs.__dict__.update(element.attrs)
|
||||
g.add_node(default_node_attrs)
|
||||
#defaults_node.update(element.attrs)
|
||||
elif element.default_type == 'edge':
|
||||
default_edge_attrs = pydot.Node('edge')
|
||||
default_edge_attrs.__dict__.update(element.attrs)
|
||||
g.add_node(default_edge_attrs)
|
||||
#defaults_edge.update(element.attrs)
|
||||
else:
|
||||
raise ValueError, "Unknown DefaultStatement: %s " % element.default_type
|
||||
elif isinstance(element, P_AttrList):
|
||||
g.__dict__.update(element.attrs)
|
||||
else:
|
||||
raise ValueError, "Unknown element statement: %r " % element
|
||||
|
||||
|
||||
def push_graph_stmt(str, loc, toks):
|
||||
g = pydot.Subgraph()
|
||||
add_elements(g, toks)
|
||||
return g
|
||||
|
||||
|
||||
def push_subgraph_stmt(str, loc, toks):
|
||||
for e in toks:
|
||||
if len(e)==3:
|
||||
g = e[2]
|
||||
g.set_name(e[1])
|
||||
|
||||
return g
|
||||
|
||||
|
||||
def push_default_stmt(str, loc, toks):
|
||||
# The pydot class instances should be marked as
|
||||
# default statements to be inherited by actual
|
||||
# graphs, nodes and edges.
|
||||
# print "push_default_stmt", toks
|
||||
default_type = toks[0][0]
|
||||
if len(toks) > 1:
|
||||
attrs = toks[1].attrs
|
||||
else:
|
||||
attrs = {}
|
||||
|
||||
if default_type in ['graph', 'node', 'edge']:
|
||||
return DefaultStatement(default_type, attrs)
|
||||
else:
|
||||
raise ValueError, "Unknown default statement: %r " % toks
|
||||
|
||||
|
||||
def push_attr_list(str, loc, toks):
|
||||
p = P_AttrList(toks)
|
||||
return p
|
||||
|
||||
|
||||
def get_port(node):
|
||||
|
||||
if len(node)>1:
|
||||
if isinstance(node[1], ParseResults):
|
||||
if len(node[1][0])==2:
|
||||
if node[1][0][0]==':':
|
||||
return node[1][0][1]
|
||||
|
||||
return None
|
||||
|
||||
|
||||
def push_edge_stmt(str, loc, toks):
|
||||
|
||||
tok_attrs = [a for a in toks if isinstance(a, P_AttrList)]
|
||||
attrs = {}
|
||||
for a in tok_attrs:
|
||||
attrs.update(a.attrs)
|
||||
|
||||
n_prev = toks[0]
|
||||
e = []
|
||||
for n_next in tuple(toks)[2::2]:
|
||||
port = get_port(n_prev)
|
||||
if port is not None:
|
||||
n_prev_port = ':'+port
|
||||
else:
|
||||
n_prev_port = ''
|
||||
|
||||
port = get_port(n_next)
|
||||
if port is not None:
|
||||
n_next_port = ':'+port
|
||||
else:
|
||||
n_next_port = ''
|
||||
|
||||
e.append(pydot.Edge(n_prev[0]+n_prev_port, n_next[0]+n_next_port, **attrs))
|
||||
n_prev = n_next
|
||||
return e
|
||||
|
||||
|
||||
def push_node_stmt(str, loc, toks):
|
||||
|
||||
if len(toks) == 2:
|
||||
attrs = toks[1].attrs
|
||||
else:
|
||||
attrs = {}
|
||||
|
||||
node_name = toks[0]
|
||||
if isinstance(node_name, list) or isinstance(node_name, tuple):
|
||||
if len(node_name)>0:
|
||||
node_name = node_name[0]
|
||||
|
||||
n = pydot.Node(node_name, **attrs)
|
||||
return n
|
||||
|
||||
|
||||
def strip_quotes( s, l, t ):
|
||||
return [ t[0].strip('"') ]
|
||||
|
||||
|
||||
graphparser = None
|
||||
def GRAPH_DEF():
|
||||
global graphparser
|
||||
|
||||
if not graphparser:
|
||||
# punctuation
|
||||
colon = Literal(":")
|
||||
lbrace = Literal("{")
|
||||
rbrace = Literal("}")
|
||||
lbrack = Literal("[")
|
||||
rbrack = Literal("]")
|
||||
lparen = Literal("(")
|
||||
rparen = Literal(")")
|
||||
equals = Literal("=")
|
||||
comma = Literal(",")
|
||||
dot = Literal(".")
|
||||
slash = Literal("/")
|
||||
bslash = Literal("\\")
|
||||
star = Literal("*")
|
||||
semi = Literal(";")
|
||||
at = Literal("@")
|
||||
minus = Literal("-")
|
||||
|
||||
# keywords
|
||||
strict_ = Literal("strict")
|
||||
graph_ = Literal("graph")
|
||||
digraph_ = Literal("digraph")
|
||||
subgraph_ = Literal("subgraph")
|
||||
node_ = Literal("node")
|
||||
edge_ = Literal("edge")
|
||||
|
||||
identifier = Word(alphanums + "_" ).setName("identifier")
|
||||
|
||||
double_quote = Literal('"')
|
||||
double_quoted_string = \
|
||||
Combine( double_quote + ZeroOrMore(CharsNotIn('"')) + double_quote )
|
||||
|
||||
alphastring_ = OneOrMore(CharsNotIn(_noncomma))
|
||||
|
||||
ID = (identifier | double_quoted_string.setParseAction(strip_quotes) |\
|
||||
alphastring_).setName("ID")
|
||||
|
||||
html_text = Combine(Literal("<<") + OneOrMore(CharsNotIn(",]")))
|
||||
|
||||
float_number = Combine(Optional(minus) + \
|
||||
OneOrMore(Word(nums + "."))).setName("float_number")
|
||||
|
||||
righthand_id = (float_number | ID | html_text).setName("righthand_id")
|
||||
|
||||
port_angle = (at + ID).setName("port_angle")
|
||||
|
||||
port_location = (Group(colon + ID) | \
|
||||
Group(colon + lparen + ID + comma + ID + rparen)).setName("port_location")
|
||||
|
||||
port = (Group(port_location + Optional(port_angle)) | \
|
||||
Group(port_angle + Optional(port_location))).setName("port")
|
||||
|
||||
node_id = (ID + Optional(port))
|
||||
a_list = OneOrMore(ID + Optional(equals.suppress() + righthand_id) + \
|
||||
Optional(comma.suppress())).setName("a_list")
|
||||
|
||||
attr_list = OneOrMore(lbrack.suppress() + Optional(a_list) + \
|
||||
rbrack.suppress()).setName("attr_list")
|
||||
|
||||
attr_stmt = (Group(graph_ | node_ | edge_) + attr_list).setName("attr_stmt")
|
||||
|
||||
edgeop = (Literal("--") | Literal("->")).setName("edgeop")
|
||||
|
||||
stmt_list = Forward()
|
||||
graph_stmt = Group(lbrace.suppress() + Optional(stmt_list) + \
|
||||
rbrace.suppress()).setName("graph_stmt")
|
||||
|
||||
subgraph = (Group(Optional(subgraph_ + Optional(ID)) + graph_stmt) | \
|
||||
Group(subgraph_ + ID)).setName("subgraph")
|
||||
|
||||
edgeRHS = OneOrMore(edgeop + Group(node_id | subgraph))
|
||||
|
||||
edge_stmt = Group(node_id | subgraph) + edgeRHS + Optional(attr_list)
|
||||
|
||||
node_stmt = (node_id + Optional(attr_list) + semi.suppress()).setName("node_stmt")
|
||||
|
||||
assignment = (ID + equals.suppress() + righthand_id).setName("assignment")
|
||||
stmt = (assignment | edge_stmt | attr_stmt | node_stmt | subgraph).setName("stmt")
|
||||
stmt_list << OneOrMore(stmt + Optional(semi.suppress()))
|
||||
|
||||
graphparser = (Optional(strict_) + Group((graph_ | digraph_)) + \
|
||||
Optional(ID) + graph_stmt).setResultsName("graph")
|
||||
|
||||
singleLineComment = "//" + restOfLine
|
||||
graphparser.ignore(singleLineComment)
|
||||
graphparser.ignore(cStyleComment)
|
||||
|
||||
assignment.setParseAction(push_attr_list)
|
||||
a_list.setParseAction(push_attr_list)
|
||||
edge_stmt.setParseAction(push_edge_stmt)
|
||||
node_stmt.setParseAction(push_node_stmt)
|
||||
attr_stmt.setParseAction(push_default_stmt)
|
||||
|
||||
subgraph.setParseAction(push_subgraph_stmt)
|
||||
graph_stmt.setParseAction(push_graph_stmt)
|
||||
graphparser.setParseAction(push_top_graph_stmt)
|
||||
|
||||
return graphparser
|
||||
|
||||
|
||||
def parse_dot_data(data):
|
||||
try:
|
||||
graphparser = GRAPH_DEF()
|
||||
if pyparsing_version >= '1.2':
|
||||
graphparser.parseWithTabs()
|
||||
tokens = graphparser.parseString(data)
|
||||
graph = tokens.graph
|
||||
return graph
|
||||
except ParseException, err:
|
||||
print err.line
|
||||
print " "*(err.column-1) + "^"
|
||||
print err
|
||||
return None
|
File diff suppressed because it is too large
Load Diff
|
@ -1,23 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
from distutils.core import setup
|
||||
import pydot
|
||||
|
||||
setup( name = 'pydot',
|
||||
version = pydot.__version__,
|
||||
description = 'Python interface to Graphiz\'s Dot',
|
||||
author = 'Ero Carrera',
|
||||
author_email = 'ero@dkbza.org',
|
||||
url = 'http://dkbza.org/pydot.html',
|
||||
license = 'MIT',
|
||||
platforms = ["any"],
|
||||
classifiers = ['Development Status :: 5 - Production/Stable', \
|
||||
'Intended Audience :: Science/Research', \
|
||||
'License :: OSI Approved :: MIT License',\
|
||||
'Natural Language :: English', \
|
||||
'Operating System :: OS Independent', \
|
||||
'Programming Language :: Python', \
|
||||
'Topic :: Scientific/Engineering :: Visualization',\
|
||||
'Topic :: Software Development :: Libraries :: Python Modules'],
|
||||
long_description = "\n".join(pydot.__doc__.split('\n')),
|
||||
py_modules = ['pydot', 'dot_parser'])
|
|
@ -428,13 +428,15 @@ class module(osv.osv):
|
|||
terp = self.get_module_info(mod_name)
|
||||
if not terp or not terp.get('installable', True):
|
||||
continue
|
||||
if not os.path.isfile(mod_path+'.zip'):
|
||||
|
||||
if not os.path.isfile( mod_path ):
|
||||
import imp
|
||||
# XXX must restrict to only addons paths
|
||||
imp.load_module(name, *imp.find_module(mod_name))
|
||||
path = imp.find_module(mod_name)
|
||||
imp.load_module(name, *path)
|
||||
else:
|
||||
import zipimport
|
||||
zimp = zipimport.zipimporter(mod_path+'.zip')
|
||||
zimp = zipimport.zipimporter(mod_path)
|
||||
zimp.load_module(mod_name)
|
||||
id = self.create(cr, uid, {
|
||||
'name': mod_name,
|
||||
|
@ -571,17 +573,6 @@ class module(osv.osv):
|
|||
categs = categs[1:]
|
||||
self.write(cr, uid, [id], {'category_id': p_id})
|
||||
|
||||
def action_install(self,cr,uid,ids,context=None):
|
||||
for module in self.browse(cr, uid, ids, context):
|
||||
if module.state <> 'uninstalled':
|
||||
continue
|
||||
self.write(cr , uid, [module.id] ,{'state' : 'to install'})
|
||||
self.download(cr, uid, [module.id], context=context)
|
||||
cr.execute("select m.id as id from ir_module_module_dependency d inner join ir_module_module m on (m.name=d.name) where d.module_id=%d and m.state='uninstalled'",(module.id,))
|
||||
dep_ids = map(lambda x:x[0],cr.fetchall())
|
||||
if len(dep_ids):
|
||||
self.action_install(cr,uid,dep_ids,context=context)
|
||||
|
||||
def update_translations(self, cr, uid, ids, filter_lang=None):
|
||||
logger = netsvc.Logger()
|
||||
|
||||
|
|
|
@ -7,5 +7,12 @@
|
|||
<field eval="False" name="active"/>
|
||||
<field eval="'href="([a-zA-Z0-9_]+)-('+version+'.(\\d+)((\\.\\d+)*)([a-z]?)((_(pre|p|beta|alpha|rc)\\d*)*)(-r(\\d+))?)(\.zip)"'" name="filter"/>
|
||||
</record>
|
||||
|
||||
<record id="ir_ui_view_sc_modules0" model="ir.ui.view_sc">
|
||||
<field name="name">Modules</field>
|
||||
<field name="resource">ir.ui.menu</field>
|
||||
<field name="user_id" ref="base.user_root"/>
|
||||
<field name="res_id" ref="base.menu_module_tree"/>
|
||||
</record>
|
||||
</data>
|
||||
</openerp>
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
<menuitem action="wizard_upgrade" id="menu_wizard_upgrade" parent="menu_management" type="wizard"/>
|
||||
|
||||
<record id="wizard_lang_install" model="ir.actions.wizard">
|
||||
<field name="name">Reload an Official Translation</field>
|
||||
<field name="name">Load an Official Translation</field>
|
||||
<field name="wiz_name">module.lang.install</field>
|
||||
</record>
|
||||
<menuitem action="wizard_lang_install" id="menu_wizard_lang_install" parent="menu_translation" type="wizard"/>
|
||||
|
@ -28,15 +28,20 @@
|
|||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<form col="3" string="Export language">
|
||||
<notebook>
|
||||
<notebook>
|
||||
<page string="Export Data">
|
||||
<group col="2" states="choose" fill="0" height="500">
|
||||
<separator string="Export translation file" colspan="2"/>
|
||||
<field name="lang" width="300" required="1"/>
|
||||
<group col="2" fill="0" states="choose">
|
||||
<separator colspan="2" string="Export translation file"/>
|
||||
<field name="lang" required="1" width="300"/>
|
||||
<field name="format" required="1"/>
|
||||
<field name="modules" width="500" height="200"/>
|
||||
|
||||
<field name="state" invisible="1"/>
|
||||
<field height="200" name="modules" width="500"/>
|
||||
<field invisible="1" name="state"/>
|
||||
</group>
|
||||
<group col="1" fill="0" states="get">
|
||||
<separator string="Export done"/>
|
||||
<field name="name" invisible="1"/>
|
||||
<field name="data" nolabel="1" readonly="1" fieldname="name"/>
|
||||
<field height="80" name="advice" nolabel="1"/>
|
||||
</group>
|
||||
</page>
|
||||
<page string="Help">
|
||||
|
@ -46,15 +51,11 @@
|
|||
<label align="0.0" colspan="4" string="https://translations.launchpad.net/openobject"/>
|
||||
</page>
|
||||
</notebook>
|
||||
<group col="1" states="get" fill="0">
|
||||
<separator string="Export done"/>
|
||||
<field name="data" readonly="1" nolabel="1"/>
|
||||
<field name="advice" nolabel="1" height="80"/>
|
||||
</group>
|
||||
|
||||
<group col="2" colspan="3" fill="0">
|
||||
<button states="choose" icon="gtk-cancel" name="act_cancel" special="cancel" string="Cancel" type="object"/>
|
||||
<button states="choose" icon="gtk-ok" name="act_getfile" string="Get file" type="object"/>
|
||||
<button states="get" icon="gtk-close" name="act_destroy" special="cancel" string="Close" type="object"/>
|
||||
<button icon="gtk-cancel" name="act_cancel" special="cancel" states="choose" string="Cancel" type="object"/>
|
||||
<button icon="gtk-ok" name="act_getfile" states="choose" string="Get file" type="object"/>
|
||||
<button icon="gtk-close" name="act_destroy" special="cancel" states="get" string="Close" type="object"/>
|
||||
</group>
|
||||
</form>
|
||||
</field>
|
||||
|
|
|
@ -13,32 +13,38 @@
|
|||
<blockTableStyle id="Table1">
|
||||
<blockAlignment value="LEFT"/>
|
||||
<blockValign value="TOP"/>
|
||||
<blockBackground colorName="#e6e6e6" start="0,0" stop="0,0"/>
|
||||
<blockBackground colorName="#e6e6e6" start="1,0" stop="1,0"/>
|
||||
<blockBackground colorName="#e6e6e6" start="2,0" stop="2,0"/>
|
||||
<blockBackground colorName="#e6e6e6" start="0,1" stop="0,1"/>
|
||||
<blockBackground colorName="#e6e6e6" start="1,1" stop="1,1"/>
|
||||
<blockBackground colorName="#e6e6e6" start="2,1" stop="2,1"/>
|
||||
<blockBackground colorName="#e6e6e6" start="0,0" stop="0,-1"/>
|
||||
<blockBackground colorName="#e6e6e6" start="1,0" stop="1,-1"/>
|
||||
<blockBackground colorName="#e6e6e6" start="2,0" stop="2,-1"/>
|
||||
<blockBackground colorName="#e6e6e6" start="0,1" stop="0,-1"/>
|
||||
<blockBackground colorName="#e6e6e6" start="1,1" stop="1,-1"/>
|
||||
<blockBackground colorName="#e6e6e6" start="2,1" stop="2,-1"/>
|
||||
</blockTableStyle>
|
||||
<blockTableStyle id="Tableau1">
|
||||
<blockAlignment value="LEFT"/>
|
||||
<blockValign value="TOP"/>
|
||||
<lineStyle kind="GRID" colorName="black"/>
|
||||
<blockBackground colorName="#ff6633" start="0,0" stop="0,0"/>
|
||||
<lineStyle kind="LINEBEFORE" colorName="#000000" start="0,0" stop="0,-1"/>
|
||||
<lineStyle kind="LINEAFTER" colorName="#000000" start="0,0" stop="0,-1"/>
|
||||
<lineStyle kind="LINEABOVE" colorName="#000000" start="0,0" stop="0,0"/>
|
||||
<lineStyle kind="LINEBELOW" colorName="#000000" start="0,-1" stop="0,-1"/>
|
||||
<blockBackground colorName="#ff6633" start="0,0" stop="0,-1"/>
|
||||
</blockTableStyle>
|
||||
<blockTableStyle id="Tableau2">
|
||||
<blockAlignment value="LEFT"/>
|
||||
<blockValign value="TOP"/>
|
||||
<blockBackground colorName="#e6e6e6" start="0,0" stop="0,0"/>
|
||||
<blockBackground colorName="#e6e6e6" start="1,0" stop="1,0"/>
|
||||
<blockBackground colorName="#e6e6e6" start="0,1" stop="0,1"/>
|
||||
<blockBackground colorName="#e6e6e6" start="1,1" stop="1,1"/>
|
||||
<blockBackground colorName="#e6e6e6" start="0,0" stop="0,-1"/>
|
||||
<blockBackground colorName="#e6e6e6" start="1,0" stop="1,-1"/>
|
||||
<blockBackground colorName="#e6e6e6" start="0,1" stop="0,-1"/>
|
||||
<blockBackground colorName="#e6e6e6" start="1,1" stop="1,-1"/>
|
||||
</blockTableStyle>
|
||||
<blockTableStyle id="Tableau3">
|
||||
<blockAlignment value="LEFT"/>
|
||||
<blockValign value="TOP"/>
|
||||
<lineStyle kind="GRID" colorName="black"/>
|
||||
<blockBackground colorName="#ffcc99" start="0,0" stop="0,0"/>
|
||||
<lineStyle kind="LINEBEFORE" colorName="#800000" start="0,0" stop="0,-1"/>
|
||||
<lineStyle kind="LINEAFTER" colorName="#800000" start="0,0" stop="0,-1"/>
|
||||
<lineStyle kind="LINEABOVE" colorName="#800000" start="0,0" stop="0,0"/>
|
||||
<lineStyle kind="LINEBELOW" colorName="#800000" start="0,-1" stop="0,-1"/>
|
||||
<blockBackground colorName="#ffcc99" start="0,0" stop="0,-1"/>
|
||||
</blockTableStyle>
|
||||
<blockTableStyle id="Tableau4">
|
||||
<blockAlignment value="LEFT"/>
|
||||
|
@ -51,11 +57,13 @@
|
|||
<paraStyle name="P2" fontName="Times-Roman" fontSize="10.0" leading="13" alignment="RIGHT" spaceBefore="0.0" spaceAfter="6.0"/>
|
||||
<paraStyle name="P3" fontName="Times-Roman" alignment="CENTER" spaceBefore="0.0" spaceAfter="6.0"/>
|
||||
<paraStyle name="P4" fontName="Times-Roman" fontSize="11.0" leading="14" alignment="RIGHT" spaceBefore="0.0" spaceAfter="6.0"/>
|
||||
<paraStyle name="P5" fontName="Times-Roman" fontSize="16.0" leading="20" alignment="CENTER" spaceBefore="0.0" spaceAfter="6.0"/>
|
||||
<paraStyle name="P5" fontName="Times-Roman" fontSize="11.0" leading="14" alignment="LEFT" spaceBefore="0.0" spaceAfter="6.0"/>
|
||||
<paraStyle name="P6" fontName="Times-Roman"/>
|
||||
<paraStyle name="P7" fontName="Times-Roman" fontSize="15.0" leading="19" alignment="CENTER" spaceBefore="0.0" spaceAfter="6.0"/>
|
||||
<paraStyle name="P8" fontName="Times-Roman" fontSize="11.0" leading="14" alignment="LEFT" spaceBefore="0.0" spaceAfter="6.0"/>
|
||||
<paraStyle name="P9" fontName="Times-Roman" alignment="LEFT" spaceBefore="0.0" spaceAfter="6.0"/>
|
||||
<paraStyle name="P7" fontName="Times-Roman" alignment="LEFT" spaceBefore="0.0" spaceAfter="6.0"/>
|
||||
<paraStyle name="P8" fontName="Times-Roman"/>
|
||||
<paraStyle name="P9" fontName="Times-Roman" fontSize="16.0" leading="20" alignment="CENTER" spaceBefore="0.0" spaceAfter="6.0"/>
|
||||
<paraStyle name="P10" fontName="Times-Roman" fontSize="15.0" leading="19" alignment="CENTER" spaceBefore="0.0" spaceAfter="6.0"/>
|
||||
<paraStyle name="P11" fontName="Times-Roman" fontSize="12.0" leading="15" alignment="CENTER" spaceBefore="0.0" spaceAfter="6.0"/>
|
||||
<paraStyle name="Standard" fontName="Times-Roman"/>
|
||||
<paraStyle name="Text body" fontName="Times-Roman" spaceBefore="0.0" spaceAfter="6.0"/>
|
||||
<paraStyle name="Heading" fontName="Helvetica" fontSize="14.0" leading="17" spaceBefore="12.0" spaceAfter="6.0"/>
|
||||
|
@ -65,6 +73,7 @@
|
|||
<paraStyle name="Caption" fontName="Times-Roman" fontSize="12.0" leading="15" spaceBefore="6.0" spaceAfter="6.0"/>
|
||||
<paraStyle name="Index" fontName="Times-Roman"/>
|
||||
</stylesheet>
|
||||
<images/>
|
||||
<story>
|
||||
<para style="Standard">
|
||||
<font color="white"> </font>
|
||||
|
@ -105,14 +114,14 @@
|
|||
<blockTable colWidths="510.0" repeatRows="1" style="Tableau1">
|
||||
<tr>
|
||||
<td>
|
||||
<para style="P5">Module: [[ module.name ]]</para>
|
||||
<para style="P9">Module: [[ module.name ]]</para>
|
||||
</td>
|
||||
</tr>
|
||||
</blockTable>
|
||||
<blockTable colWidths="276.0,234.0" repeatRows="1" style="Tableau2">
|
||||
<blockTable colWidths="277.0,234.0" repeatRows="1" style="Tableau2">
|
||||
<tr>
|
||||
<td>
|
||||
<pre style="Standard">Name: [[ objdoc(module.shortdesc) ]]</pre>
|
||||
<para style="Standard">Name: [[ module.shortdesc]]</para>
|
||||
</td>
|
||||
<td>
|
||||
<para style="Standard">Version: [[module.latest_version]]</para>
|
||||
|
@ -127,26 +136,25 @@
|
|||
</td>
|
||||
</tr>
|
||||
</blockTable>
|
||||
<pre style="P6">[[ module.description ]]</pre>
|
||||
<para style="P6">[[ format(module.description or '') ]]</para>
|
||||
<section>
|
||||
<para style="Standard">[[ repeatIn(findobj(module.name) ,'object') ]]</para>
|
||||
<blockTable colWidths="510.0" repeatRows="1" style="Tableau3">
|
||||
<tr>
|
||||
<td>
|
||||
<para style="P7">Object: [[ object.name ]]</para>
|
||||
<pre style="P8">[[ objdoc(object.model) ]]</pre>
|
||||
<para style="P10">Object: [[ object.model ]]</para>
|
||||
<para style="P11">Description : [[ object.name ]]</para>
|
||||
<para style="P5">[[ format(objdoc(object.model)) ]]</para>
|
||||
</td>
|
||||
</tr>
|
||||
</blockTable>
|
||||
<blockTable colWidths="113.0,397.0" repeatRows="1" style="Tableau4">
|
||||
<tr>
|
||||
<td>
|
||||
<para style="P9"><font face="Times-Roman">[[ repeatIn(findflds(object.model), 'field') ]]</font> [[ field[0] ]]</para>
|
||||
<para style="P7">[[ repeatIn(findflds(object.model), 'field') ]] <i>[[ field[0] ]]</i></para>
|
||||
</td>
|
||||
<td>
|
||||
<para style="Standard">
|
||||
<font face="Times-Roman">[[ field[1].get('string', 'Unknown') ]], [[ field[1]['type'] ]] [[field[1].get('required',False) and ', required']] [[field[1].get('readonly',False) and ', readonly']], [[str(field[1].get('selection',''))]] </font>
|
||||
</para>
|
||||
<para style="P8">[[ field[1].get('string', 'Unknown') ]], [[ field[1]['type'] ]] [[field[1].get('required',False) and ', required']] [[field[1].get('readonly',False) and ', readonly']] </para>
|
||||
<para style="Standard">[[ field[1].get('help', '') ]]</para>
|
||||
</td>
|
||||
</tr>
|
||||
|
@ -170,4 +178,3 @@
|
|||
</para>
|
||||
</story>
|
||||
</document>
|
||||
|
||||
|
|
|
@ -37,12 +37,11 @@ class ir_module_reference_print(report_sxw.rml_parse):
|
|||
return modobj.__doc__
|
||||
|
||||
def _object_find(self, module):
|
||||
ids2 = self.pool.get('ir.model.data').search(self.cr, self.uid, [('module','=',module), ('model','=','ir.model')])
|
||||
ids = []
|
||||
for mod in self.pool.get('ir.model.data').browse(self.cr, self.uid, ids2):
|
||||
ids.append(mod.res_id)
|
||||
modobj = self.pool.get('ir.model')
|
||||
if module=='base':
|
||||
ids = modobj.search(self.cr, self.uid, [('model','=like','res%')])
|
||||
ids += modobj.search(self.cr, self.uid, [('model','=like','ir%')])
|
||||
else:
|
||||
ids = modobj.search(self.cr, self.uid, [('model','=like',module+'%')])
|
||||
return modobj.browse(self.cr, self.uid, ids)
|
||||
|
||||
def _fields_find(self, obj):
|
||||
|
|
|
@ -31,11 +31,14 @@ view_form="""<?xml version="1.0"?>
|
|||
<image name="gtk-dialog-info" colspan="2"/>
|
||||
<group colspan="2" col="4">
|
||||
<separator string="Import new language" colspan="4"/>
|
||||
<field name="name"/>
|
||||
<field name="name" width="200"/>
|
||||
<field name="code"/>
|
||||
<field name="data" colspan="3"/>
|
||||
<label string="You have to import a .CSV file wich is encoded in UTF-8.\nPlease check that the first line of your file is:" colspan="4" align="0.0"/>
|
||||
<field name="data" colspan="4"/>
|
||||
<label string="You have to import a .CSV file wich is encoded in UTF-8.\n
|
||||
Please check that the first line of your file is one of the following:" colspan="4" align="0.0"/>
|
||||
<label string="type,name,res_id,src,value" colspan="4"/>
|
||||
<label string="module,type,name,res_id,src,value" colspan="4"/>
|
||||
<label string="You can also import .po files." colspan="4" align="0.0"/>
|
||||
</group>
|
||||
</form>"""
|
||||
|
||||
|
@ -54,7 +57,7 @@ class wizard_import_lang(wizard.interface):
|
|||
|
||||
# now we determine the file format
|
||||
fileobj.seek(0)
|
||||
first_line = fileobj.readline().strip()
|
||||
first_line = fileobj.readline().strip().replace('"', '').replace(' ', '')
|
||||
fileformat = first_line.endswith("type,name,res_id,src,value") and 'csv' or 'po'
|
||||
fileobj.seek(0)
|
||||
|
||||
|
|
|
@ -146,5 +146,99 @@ class wizard_info_get(wizard.interface):
|
|||
wizard_info_get('module.upgrade')
|
||||
|
||||
|
||||
class wizard_info_get_simple(wizard.interface):
|
||||
def _get_install(self, cr, uid, data, context):
|
||||
pool=pooler.get_pool(cr.dbname)
|
||||
mod_obj = pool.get('ir.module.module')
|
||||
ids = mod_obj.search(cr, uid, [
|
||||
('state', 'in', ['to upgrade', 'to remove', 'to install'])])
|
||||
res = mod_obj.read(cr, uid, ids, ['name','state'], context)
|
||||
url = mod_obj.download(cr, uid, ids, download=False, context=context)
|
||||
return {'module_info': '\n'.join(map(lambda x: x['name']+' : '+x['state'], res)),
|
||||
'module_download': '\n'.join(url)}
|
||||
|
||||
def _check_upgrade_module(self,cr,uid,data,context):
|
||||
db, pool = pooler.get_db_and_pool(cr.dbname)
|
||||
cr = db.cursor()
|
||||
mod_obj = pool.get('ir.module.module')
|
||||
ids = mod_obj.search(cr, uid, [
|
||||
('state', 'in', ['to upgrade', 'to remove', 'to install'])])
|
||||
if ids and len(ids):
|
||||
return 'next'
|
||||
else:
|
||||
return 'end'
|
||||
|
||||
def _upgrade_module(self, cr, uid, data, context):
|
||||
db, pool = pooler.get_db_and_pool(cr.dbname)
|
||||
cr = db.cursor()
|
||||
mod_obj = pool.get('ir.module.module')
|
||||
ids = mod_obj.search(cr, uid, [('state', 'in', ['to upgrade', 'to remove', 'to install'])])
|
||||
unmet_packages = []
|
||||
mod_dep_obj = pool.get('ir.module.module.dependency')
|
||||
for mod in mod_obj.browse(cr, uid, ids):
|
||||
depends_mod_ids = mod_dep_obj.search(cr, uid, [('module_id', '=', mod.id)])
|
||||
for dep_mod in mod_dep_obj.browse(cr, uid, depends_mod_ids):
|
||||
if dep_mod.state in ('unknown','uninstalled'):
|
||||
unmet_packages.append(dep_mod.name)
|
||||
if len(unmet_packages):
|
||||
raise wizard.except_wizard('Unmet dependency !', 'Following modules are uninstalled or unknown. \n\n'+'\n'.join(unmet_packages))
|
||||
mod_obj.download(cr, uid, ids, context=context)
|
||||
cr.commit()
|
||||
db, pool = pooler.restart_pool(cr.dbname, update_module=True)
|
||||
return {}
|
||||
|
||||
def _config(self, cr, uid, data, context=None):
|
||||
return {
|
||||
'view_type': 'form',
|
||||
"view_mode": 'form',
|
||||
'res_model': 'ir.actions.configuration.wizard',
|
||||
'type': 'ir.actions.act_window',
|
||||
'target':'new',
|
||||
}
|
||||
|
||||
states = {
|
||||
'init': {
|
||||
'actions': [],
|
||||
'result' : {'type': 'choice', 'next_state': _check_upgrade_module }
|
||||
},
|
||||
'next': {
|
||||
'actions': [_get_install],
|
||||
'result': {'type':'form', 'arch':view_form, 'fields': view_field,
|
||||
'state':[
|
||||
('end', 'Cancel', 'gtk-cancel'),
|
||||
('start', 'Start Upgrade', 'gtk-ok', True)
|
||||
]
|
||||
}
|
||||
},
|
||||
'start': {
|
||||
'actions': [_upgrade_module],
|
||||
'result': {'type':'form', 'arch':view_form_end, 'fields': {},
|
||||
'state':[
|
||||
('end', 'Close', 'gtk-close', True),
|
||||
('config', 'Start configuration', 'gtk-ok', True)
|
||||
]
|
||||
}
|
||||
},
|
||||
'end': {
|
||||
'actions': [],
|
||||
'result': {'type':'form', 'arch':view_form_end, 'fields': {},
|
||||
'state':[
|
||||
('end', 'Close', 'gtk-close', True),
|
||||
('config', 'Start configuration', 'gtk-ok', True)
|
||||
]
|
||||
}
|
||||
},
|
||||
'config':{
|
||||
'result': {
|
||||
'type': 'action',
|
||||
'action': _config,
|
||||
'state': 'end',
|
||||
},
|
||||
}
|
||||
}
|
||||
wizard_info_get_simple('module.upgrade.simple')
|
||||
|
||||
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
|
|
|
@ -14,19 +14,21 @@
|
|||
|
||||
<xsl:template name="stylesheet">
|
||||
<paraStyle name="title" fontName="Helvetica-Bold" fontSize="22" alignment="center"/>
|
||||
|
||||
|
||||
<blockTableStyle id="products">
|
||||
<blockBackground colorName="grey" start="0,0" stop="-1,0"/>
|
||||
<!--<blockBackground colorName="grey" start="0,0" stop="-1,0"/> -->
|
||||
<lineStyle kind="LINEBELOW" colorName="#000000" start="0,0" stop="-1,0"/>
|
||||
<blockValign value="TOP"/>
|
||||
<blockAlignment value="RIGHT"/>
|
||||
<lineStyle kind="GRID" colorName="black"/>
|
||||
<lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="0,1" stop="-1,-1"/>
|
||||
<!-- <lineStyle kind="GRID" colorName="black"/> -->
|
||||
</blockTableStyle>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="story">
|
||||
<xsl:apply-templates select="report"/>
|
||||
</xsl:template>
|
||||
|
||||
|
||||
<xsl:template match="report">
|
||||
<xsl:apply-templates select="config"/>
|
||||
<!--<setNextTemplate name="other_pages"/>-->
|
||||
|
@ -36,7 +38,7 @@
|
|||
<xsl:value-of select="./config/tableSize"/>
|
||||
</xsl:attribute>
|
||||
</xsl:if>
|
||||
|
||||
|
||||
<xsl:apply-templates select="header"/>
|
||||
<xsl:apply-templates select="lines"/>
|
||||
</blockTable>
|
||||
|
@ -53,8 +55,8 @@
|
|||
<tr>
|
||||
<xsl:for-each select="field">
|
||||
<td>
|
||||
<para>
|
||||
<xsl:value-of select="."/>
|
||||
<para><font fontName="Helvetica-Bold" fontSize="9">
|
||||
<xsl:value-of select="."/></font>
|
||||
</para>
|
||||
</td>
|
||||
</xsl:for-each>
|
||||
|
@ -79,12 +81,16 @@
|
|||
<xsl:when test="@tree='yes'">
|
||||
<para>
|
||||
<xsl:attribute name="leftIndent"><xsl:value-of select="@space"/></xsl:attribute>
|
||||
<font fontName="Helvetica" fontSize="9">
|
||||
<xsl:value-of select="."/>
|
||||
</font>
|
||||
</para>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<para>
|
||||
<font fontName="Helvetica" fontSize="9">
|
||||
<xsl:value-of select="."/>
|
||||
</font>
|
||||
</para>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
# -*- encoding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2008 Tiny SPRL (<http://tiny.be>). All Rights Reserved
|
||||
# $Id$
|
||||
#
|
||||
|
@ -142,14 +142,21 @@ class res_partner(osv.osv):
|
|||
'credit_limit': fields.float(string='Credit Limit'),
|
||||
'ean13': fields.char('EAN13', size=13),
|
||||
'active': fields.boolean('Active'),
|
||||
'customer': fields.boolean('Customer', help="Check this box if the partner if a customer."),
|
||||
'supplier': fields.boolean('Supplier', help="Check this box if the partner if a supplier. If it's not checked, purchase people will not see it when encoding a purchase order."),
|
||||
'customer': fields.boolean('Customer', help="Check this box if the partner is a customer."),
|
||||
'supplier': fields.boolean('Supplier', help="Check this box if the partner is a supplier. If it's not checked, purchase people will not see it when encoding a purchase order."),
|
||||
'city':fields.related('address','city',type='char', string='City'),
|
||||
'country':fields.related('address','country_id',type='many2one', relation='res.country', string='Country'),
|
||||
}
|
||||
|
||||
def _default_category(self, cr, uid, context={}):
|
||||
if 'category_id' in context and context['category_id']:
|
||||
return [context['category_id']]
|
||||
return []
|
||||
|
||||
_defaults = {
|
||||
'active': lambda *a: 1,
|
||||
'customer': lambda *a: 1,
|
||||
'category_id': _default_category,
|
||||
}
|
||||
_sql_constraints = [
|
||||
('name_uniq', 'unique (name)', 'The name of the partner must be unique !')
|
||||
|
@ -269,7 +276,7 @@ class res_partner_address(osv.osv):
|
|||
_name = 'res.partner.address'
|
||||
_order = 'id'
|
||||
_columns = {
|
||||
'partner_id': fields.many2one('res.partner', 'Partner', ondelete='cascade', select=True, help="Keep empty for a private address, not related to partner."),
|
||||
'partner_id': fields.many2one('res.partner', 'Partner', ondelete='set null', select=True, help="Keep empty for a private address, not related to partner."),
|
||||
'type': fields.selection( [ ('default','Default'),('invoice','Invoice'), ('delivery','Delivery'), ('contact','Contact'), ('other','Other') ],'Address Type', help="Used to select automatically the right address according to the context in sales and purchases documents."),
|
||||
'function': fields.many2one('res.partner.function', 'Function'),
|
||||
'title': fields.selection(_contact_title_get, 'Title', size=32),
|
||||
|
|
|
@ -1,6 +1,50 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
|
||||
<!--
|
||||
Resource: res.partner.title
|
||||
-->
|
||||
<record id="res_partner_title_pvt_ltd" model="res.partner.title">
|
||||
<field name="domain">partner</field>
|
||||
<field name="name">Corp.</field>
|
||||
<field name="shortcut">Corp.</field>
|
||||
</record>
|
||||
|
||||
<record id="res_partner_title_ltd" model="res.partner.title">
|
||||
<field name="domain">partner</field>
|
||||
<field name="name">Ltd</field>
|
||||
<field name="shortcut">ltd</field>
|
||||
</record>
|
||||
|
||||
<record id="res_partner_title_madam" model="res.partner.title">
|
||||
<field name="domain">contact</field>
|
||||
<field name="name">Madam</field>
|
||||
<field name="shortcut">Ms.</field>
|
||||
</record>
|
||||
<record id="res_partner_title_miss" model="res.partner.title">
|
||||
<field name="domain">contact</field>
|
||||
<field name="name">Miss</field>
|
||||
<field name="shortcut">Mss</field>
|
||||
</record>
|
||||
<record id="res_partner_title_sir" model="res.partner.title">
|
||||
<field name="domain">contact</field>
|
||||
<field name="name">Sir</field>
|
||||
<field name="shortcut">M.</field>
|
||||
</record>
|
||||
|
||||
<record id="function_director" model="res.partner.function">
|
||||
<field name="name">Director</field>
|
||||
<field name="code">CEO</field>
|
||||
</record>
|
||||
<record id="function_it" model="res.partner.function">
|
||||
<field name="name">Chief Technical Officer</field>
|
||||
<field name="code">CTO</field>
|
||||
</record>
|
||||
<record id="function_sale" model="res.partner.function">
|
||||
<field name="name">Salesman</field>
|
||||
</record>
|
||||
|
||||
<!-- Default bank account description -->
|
||||
<record id="bank_normal" model="res.partner.bank.type">
|
||||
<field name="name">Bank account</field>
|
||||
|
|
|
@ -1,52 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data noupdate="1">
|
||||
|
||||
<!--
|
||||
Resource: res.partner.title
|
||||
-->
|
||||
<record id="res_partner_title_pvt_ltd" model="res.partner.title">
|
||||
<field name="domain">partner</field>
|
||||
<field name="name">Corp.</field>
|
||||
<field name="shortcut">Corp.</field>
|
||||
</record>
|
||||
|
||||
<record id="res_partner_title_ltd" model="res.partner.title">
|
||||
<field name="domain">partner</field>
|
||||
<field name="name">Ltd</field>
|
||||
<field name="shortcut">ltd</field>
|
||||
</record>
|
||||
|
||||
<record id="res_partner_title_madam" model="res.partner.title">
|
||||
<field name="domain">contact</field>
|
||||
<field name="name">Madam</field>
|
||||
<field name="shortcut">Ms.</field>
|
||||
</record>
|
||||
<record id="res_partner_title_miss" model="res.partner.title">
|
||||
<field name="domain">contact</field>
|
||||
<field name="name">Miss</field>
|
||||
<field name="shortcut">Mss</field>
|
||||
</record>
|
||||
<record id="res_partner_title_sir" model="res.partner.title">
|
||||
<field name="domain">contact</field>
|
||||
<field name="name">Sir</field>
|
||||
<field name="shortcut">M.</field>
|
||||
</record>
|
||||
|
||||
<record id="function_director" model="res.partner.function">
|
||||
<field name="name">Director</field>
|
||||
<field name="code">CEO</field>
|
||||
</record>
|
||||
<record id="function_it" model="res.partner.function">
|
||||
<field name="name">Chief Technical Officer</field>
|
||||
<field name="code">CTO</field>
|
||||
</record>
|
||||
<record id="function_sale" model="res.partner.function">
|
||||
<field name="name">Salesman</field>
|
||||
</record>
|
||||
|
||||
|
||||
|
||||
<!--
|
||||
Resource: res.partner.category
|
||||
-->
|
||||
|
@ -127,6 +81,7 @@
|
|||
<field name="supplier">1</field>
|
||||
</record>
|
||||
<record id="res_partner_sednacom" model="res.partner">
|
||||
<field name="website">http://www.syleam.fr</field>
|
||||
<field name="name">Syleam</field>
|
||||
<field eval="[(6, 0, [ref('res_partner_category_5')])]" name="category_id"/>
|
||||
</record>
|
||||
|
@ -317,6 +272,18 @@
|
|||
<field name="type">default</field>
|
||||
<field name="partner_id" ref="res_partner_2"/>
|
||||
</record>
|
||||
<record id="res_partner_address_11" model="res.partner.address">
|
||||
<field name="city">Alencon</field>
|
||||
<field name="name">Sebastien LANGE</field>
|
||||
<field name="zip">61000</field>
|
||||
<field name="title">M.</field>
|
||||
<field name="email">contact@syleam.fr</field>
|
||||
<field name="street">1 place de l'Église</field>
|
||||
<field name="phone">+33 (0) 2 33 31 22 10</field>
|
||||
<field model="res.country" name="country_id" search="[('name','=','France')]"/>
|
||||
<field name="type">default</field>
|
||||
<field name="partner_id" ref="res_partner_sednacom"/>
|
||||
</record>
|
||||
<record id="res_partner_address_10" model="res.partner.address">
|
||||
<field name="city">Liege</field>
|
||||
<field name="name">Karine Lesbrouffe</field>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
# -*- encoding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2008 Tiny SPRL (<http://tiny.be>). All Rights Reserved
|
||||
# $Id$
|
||||
#
|
||||
|
@ -96,7 +96,7 @@ class users(osv.osv):
|
|||
_columns = {
|
||||
'name': fields.char('Name', size=64, required=True, select=True),
|
||||
'login': fields.char('Login', size=64, required=True),
|
||||
'password': fields.char('Password', size=64, invisible=True),
|
||||
'password': fields.char('Password', size=64, invisible=True, help="Keep empty if you don't want the user to be able to connect on the system."),
|
||||
'signature': fields.text('Signature', size=64),
|
||||
'address_id': fields.many2one('res.partner.address', 'Address'),
|
||||
'active': fields.boolean('Active'),
|
||||
|
@ -138,6 +138,10 @@ class users(osv.osv):
|
|||
ids = self.pool.get('ir.actions.act_window').search(cr, uid, [('usage','=','menu')])
|
||||
return ids and ids[0] or False
|
||||
|
||||
def _get_group(self,cr, uid, context={}):
|
||||
ids = self.pool.get('res.groups').search(cr, uid, [('name','=','Employee')])
|
||||
return ids or False
|
||||
|
||||
_defaults = {
|
||||
'password' : lambda obj,cr,uid,context={} : '',
|
||||
'context_lang': lambda *args: 'en_US',
|
||||
|
@ -145,6 +149,7 @@ class users(osv.osv):
|
|||
'menu_id': _get_menu,
|
||||
'action_id': _get_menu,
|
||||
'company_id': _get_company,
|
||||
'groups_id': _get_group,
|
||||
}
|
||||
def company_get(self, cr, uid, uid2):
|
||||
company_id = self.pool.get('res.users').browse(cr, uid, uid).company_id.id
|
||||
|
|
|
@ -81,8 +81,6 @@ dispatcher.monitor(signal.SIGINT)
|
|||
#---------------------------------------------------------------
|
||||
# connect to the database and initialize it with base if needed
|
||||
#---------------------------------------------------------------
|
||||
logger.notifyChannel("init", netsvc.LOG_INFO, 'connecting to database')
|
||||
|
||||
import psycopg
|
||||
import pooler
|
||||
|
||||
|
@ -129,7 +127,6 @@ import osv, workflow, report, service
|
|||
#----------------------------------------------------------
|
||||
import addons
|
||||
|
||||
addons.register_classes()
|
||||
if tools.config['init'] or tools.config['update']:
|
||||
pooler.get_db_and_pool(tools.config['db_name'], update_module=True)
|
||||
|
||||
|
@ -203,7 +200,7 @@ if tools.config['netrpc']:
|
|||
netinterface = tools.config["netinterface"]
|
||||
|
||||
tinySocket = netsvc.TinySocketServerThread(netinterface, netport, False)
|
||||
logger.notifyChannel("web-services", netsvc.LOG_INFO, "starting netrpc service, port "+str(netport))
|
||||
logger.notifyChannel("web-services", netsvc.LOG_INFO, "starting NET-RPC service, port "+str(netport))
|
||||
|
||||
|
||||
def handler(signum, frame):
|
||||
|
|
|
@ -678,7 +678,8 @@ class related(function):
|
|||
where += " %s.%s %s '%s' and" % (obj_child._table, self._arg[i], context[0][1], context[0][2])
|
||||
if field_detail[1] in ['integer', 'long', 'float','integer_big']:
|
||||
where += " %s.%s %s '%d' and" % (obj_child._table, self._arg[i], context[0][1], context[0][2])
|
||||
query += where.rstrip('and')
|
||||
if len(where)>10:
|
||||
query += where.rstrip('and')
|
||||
cr.execute(query)
|
||||
ids = []
|
||||
for id in cr.fetchall():
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
# -*- encoding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2008 Tiny SPRL (<http://tiny.be>). All Rights Reserved
|
||||
# $Id$
|
||||
#
|
||||
|
@ -116,7 +116,7 @@ class browse_record(object):
|
|||
'''
|
||||
if not context:
|
||||
context = {}
|
||||
assert id, _('Wrong ID for the browse record, got %s, expected an integer.') % str(id)
|
||||
assert id and isinstance(id, (int, long,)), _('Wrong ID for the browse record, got %r, expected an integer.') % (id,)
|
||||
self._list_class = list_class or browse_record_list
|
||||
self._cr = cr
|
||||
self._uid = uid
|
||||
|
@ -128,9 +128,12 @@ class browse_record(object):
|
|||
|
||||
cache.setdefault(table._name, {})
|
||||
self._data = cache[table._name]
|
||||
|
||||
if not id in self._data:
|
||||
self._data[id] = {'id': id}
|
||||
|
||||
self._cache = cache
|
||||
pass
|
||||
|
||||
def __getitem__(self, name):
|
||||
if name == 'id':
|
||||
|
@ -183,7 +186,7 @@ class browse_record(object):
|
|||
if data[n]:
|
||||
obj = self._table.pool.get(f._obj)
|
||||
compids = False
|
||||
if not f._classic_write:
|
||||
if type(data[n]) in (type([]),type( (1,) )):
|
||||
ids2 = data[n][0]
|
||||
else:
|
||||
ids2 = data[n]
|
||||
|
@ -300,6 +303,7 @@ class orm_template(object):
|
|||
_description = None
|
||||
_inherits = {}
|
||||
_table = None
|
||||
_invalids=[]
|
||||
|
||||
def _field_create(self, cr, context={}):
|
||||
cr.execute("SELECT id FROM ir_model_data WHERE name='%s'" % ('model_'+self._name.replace('.','_'),))
|
||||
|
@ -362,7 +366,7 @@ class orm_template(object):
|
|||
view_load=%s, select_level=%s, readonly=%s ,required=%s
|
||||
WHERE
|
||||
model=%s AND name=%s""", (
|
||||
vals['model_id'], vals['field_description'], vals['ttype'],
|
||||
vals['model_id'], vals['field_description'], vals['ttype'],
|
||||
vals['relation'], bool(vals['view_load']),
|
||||
vals['select_level'], bool(vals['readonly']),bool(vals['required']), vals['model'], vals['name']
|
||||
))
|
||||
|
@ -651,6 +655,9 @@ class orm_template(object):
|
|||
def read(self, cr, user, ids, fields=None, context=None, load='_classic_read'):
|
||||
raise _('The read method is not implemented on this object !')
|
||||
|
||||
def get_invalid_fields(self,cr,uid):
|
||||
return self._invalids.__str__()
|
||||
|
||||
def _validate(self, cr, uid, ids, context=None):
|
||||
context = context or {}
|
||||
lng = context.get('lang', False) or 'en_US'
|
||||
|
@ -663,9 +670,12 @@ class orm_template(object):
|
|||
error_msgs.append(
|
||||
_("Error occured while validating the field(s) %s: %s") % (','.join(fields), translated_msg)
|
||||
)
|
||||
self._invalids.extend(fields)
|
||||
if error_msgs:
|
||||
cr.rollback()
|
||||
raise except_orm('ValidateError', '\n'.join(error_msgs))
|
||||
else:
|
||||
self._invalids=[]
|
||||
|
||||
def default_get(self, cr, uid, fields_list, context=None):
|
||||
return {}
|
||||
|
@ -729,7 +739,7 @@ class orm_template(object):
|
|||
if val:
|
||||
val2 = translation_obj._get_source(cr, user,
|
||||
self._name + ',' + f, 'selection',
|
||||
context.get('lang', False) or 'en_US', val)
|
||||
context.get('lang', False) or 'en_US', val)
|
||||
sel2.append((key, val2 or val))
|
||||
sel = sel2
|
||||
res[f]['selection'] = sel
|
||||
|
@ -797,6 +807,12 @@ class orm_template(object):
|
|||
result = self.view_header_get(cr, user, False, node.localName, context)
|
||||
if result:
|
||||
node.setAttribute('string', result.decode('utf-8'))
|
||||
|
||||
elif node.nodeType==node.ELEMENT_NODE and node.localName == 'calendar':
|
||||
for additional_field in ('date_start', 'date_delay', 'date_stop', 'color'):
|
||||
if node.hasAttribute(additional_field) and node.getAttribute(additional_field):
|
||||
fields[node.getAttribute(additional_field)] = {}
|
||||
|
||||
if node.nodeType == node.ELEMENT_NODE and node.hasAttribute('groups'):
|
||||
if node.getAttribute('groups'):
|
||||
groups = node.getAttribute('groups').split(',')
|
||||
|
@ -837,7 +853,7 @@ class orm_template(object):
|
|||
continue
|
||||
|
||||
ok = True
|
||||
|
||||
|
||||
if user != 1: # admin user has all roles
|
||||
serv = netsvc.LocalService('object_proxy')
|
||||
user_roles = serv.execute_cr(cr, user, 'res.users', 'read', [user], ['roles_id'])[0]['roles_id']
|
||||
|
@ -2364,7 +2380,12 @@ class orm(orm_template):
|
|||
# records unless they were explicitely asked for
|
||||
if 'active' in self._columns and (active_test and context.get('active_test', True)):
|
||||
if args:
|
||||
args.insert(0, ('active', '=', 1))
|
||||
active_in_args = False
|
||||
for a in args:
|
||||
if a[0] == 'active':
|
||||
active_in_args = True
|
||||
if not active_in_args:
|
||||
args.insert(0, ('active', '=', 1))
|
||||
else:
|
||||
args = [('active', '=', 1)]
|
||||
|
||||
|
|
|
@ -229,7 +229,18 @@ class osv(orm.orm):
|
|||
if hasattr(new, 'update'):
|
||||
new.update(cls.__dict__.get(s, {}))
|
||||
else:
|
||||
new.extend(cls.__dict__.get(s, []))
|
||||
if s=='_constraints':
|
||||
for c in cls.__dict__.get(s, []):
|
||||
exist = False
|
||||
for c2 in range(len(new)):
|
||||
if new[c2][2]==c[2]:
|
||||
new[c2] = c
|
||||
exist = True
|
||||
break
|
||||
if not exist:
|
||||
new.append(c)
|
||||
else:
|
||||
new.extend(cls.__dict__.get(s, []))
|
||||
nattr[s] = new
|
||||
name = hasattr(cls, '_name') and cls._name or cls._inherit
|
||||
cls = type(name, (cls, parent_class), nattr)
|
||||
|
|
|
@ -1,21 +0,0 @@
|
|||
#
|
||||
# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
|
||||
#
|
||||
# Jockey 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, or (at your option) any
|
||||
# later version.
|
||||
#
|
||||
# Jockey 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.
|
||||
#
|
||||
__all__ = [ "axis", "area", "basecanvas", "canvas",
|
||||
"line_plot", "pie_plot", "rose_plot", "tick_mark",
|
||||
"bar_plot", "chart_data", "arrow", "text_box", "color", "font",
|
||||
"fill_style", "error_bar", "range_plot", "chart_object",
|
||||
"line_style", "legend", "pychart_util", "theme", "scaling",
|
||||
"zap", "coord", "linear_coord", "log_coord",
|
||||
"category_coord", "afm", "interval_bar_plot" ]
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font AvantGarde-Book (path: /usr/share/fonts/afms/adobe/pagk8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["AvantGarde-Book"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 277, 295, 309, 554, 554, 775, 757, 351, 369, 369, 425, 606, 277, 332, 277, 437, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 277, 277, 606, 606, 606, 591, 867, 740, 574, 813, 744, 536, 485, 872, 683, 226, 482, 591, 462, 919, 740, 869, 592, 871, 607, 498, 426, 655, 702, 960, 609, 592, 480, 351, 605, 351, 606, 500, 351, 683, 682, 647, 685, 650, 314, 673, 610, 200, 203, 502, 200, 938, 610, 655, 682, 682, 301, 388, 339, 608, 554, 831, 480, 536, 425, 351, 672, 351, 606, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 295, 554, 554, 166, 554, 554, 615, 554, 198, 502, 425, 251, 251, 487, 485, 500, 500, 553, 553, 277, 500, 564, 606, 354, 502, 484, 425, 1000, 1174, 500, 591, 500, 378, 375, 502, 439, 485, 453, 222, 369, 500, 332, 324, 500, 552, 302, 502, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 992, 500, 369, 500, 500, 500, 500, 517, 868, 1194, 369, 500, 500, 500, 500, 500, 1157, 500, 500, 500, 200, 500, 500, 300, 653, 1137, 554, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font AvantGarde-BookOblique (path: /usr/share/fonts/afms/adobe/pagko8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["AvantGarde-BookOblique"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 277, 295, 309, 554, 554, 775, 757, 351, 369, 369, 425, 606, 277, 332, 277, 437, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 277, 277, 606, 606, 606, 591, 867, 740, 574, 813, 744, 536, 485, 872, 683, 226, 482, 591, 462, 919, 740, 869, 592, 871, 607, 498, 426, 655, 702, 960, 609, 592, 480, 351, 605, 351, 606, 500, 351, 683, 682, 647, 685, 650, 314, 673, 610, 200, 203, 502, 200, 938, 610, 655, 682, 682, 301, 388, 339, 608, 554, 831, 480, 536, 425, 351, 672, 351, 606, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 295, 554, 554, 166, 554, 554, 615, 554, 198, 502, 425, 251, 251, 487, 485, 500, 500, 553, 553, 277, 500, 564, 606, 354, 502, 484, 425, 1000, 1174, 500, 591, 500, 378, 375, 502, 439, 485, 453, 222, 369, 500, 332, 324, 500, 552, 302, 502, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 992, 500, 369, 500, 500, 500, 500, 517, 868, 1194, 369, 500, 500, 500, 500, 500, 1157, 500, 500, 500, 200, 500, 500, 300, 653, 1137, 554, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font AvantGarde-Demi (path: /usr/share/fonts/afms/adobe/pagd8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["AvantGarde-Demi"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 280, 280, 360, 560, 560, 860, 680, 280, 380, 380, 440, 600, 280, 420, 280, 460, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 280, 280, 600, 600, 600, 560, 740, 740, 580, 780, 700, 520, 480, 840, 680, 280, 480, 620, 440, 900, 740, 840, 560, 840, 580, 520, 420, 640, 700, 900, 680, 620, 500, 320, 640, 320, 600, 500, 280, 660, 660, 640, 660, 640, 280, 660, 600, 240, 260, 580, 240, 940, 600, 640, 660, 660, 320, 440, 300, 600, 560, 800, 560, 580, 460, 340, 600, 340, 600, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 280, 560, 560, 160, 560, 560, 560, 560, 220, 480, 460, 240, 240, 520, 520, 500, 500, 560, 560, 280, 500, 600, 600, 280, 480, 480, 460, 1000, 1280, 500, 560, 500, 420, 420, 540, 480, 420, 480, 280, 500, 500, 360, 340, 500, 700, 340, 540, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 900, 500, 360, 500, 500, 500, 500, 480, 840, 1060, 360, 500, 500, 500, 500, 500, 1080, 500, 500, 500, 240, 500, 500, 320, 660, 1080, 600, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font AvantGarde-DemiOblique (path: /usr/share/fonts/afms/adobe/pagdo8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["AvantGarde-DemiOblique"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 280, 280, 360, 560, 560, 860, 680, 280, 380, 380, 440, 600, 280, 420, 280, 460, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 280, 280, 600, 600, 600, 560, 740, 740, 580, 780, 700, 520, 480, 840, 680, 280, 480, 620, 440, 900, 740, 840, 560, 840, 580, 520, 420, 640, 700, 900, 680, 620, 500, 320, 640, 320, 600, 500, 280, 660, 660, 640, 660, 640, 280, 660, 600, 240, 260, 580, 240, 940, 600, 640, 660, 660, 320, 440, 300, 600, 560, 800, 560, 580, 460, 340, 600, 340, 600, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 280, 560, 560, 160, 560, 560, 560, 560, 220, 480, 460, 240, 240, 520, 520, 500, 500, 560, 560, 280, 500, 600, 600, 280, 480, 480, 460, 1000, 1280, 500, 560, 500, 420, 420, 540, 480, 420, 480, 280, 500, 500, 360, 340, 500, 700, 340, 540, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 900, 500, 360, 500, 500, 500, 500, 480, 840, 1060, 360, 500, 500, 500, 500, 500, 1080, 500, 500, 500, 240, 500, 500, 320, 660, 1080, 600, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font Bookman-Demi (path: /usr/share/fonts/afms/adobe/pbkd8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["Bookman-Demi"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 340, 360, 420, 660, 660, 940, 800, 320, 320, 320, 460, 600, 340, 360, 340, 600, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 340, 340, 600, 600, 600, 660, 820, 720, 720, 740, 780, 720, 680, 780, 820, 400, 640, 800, 640, 940, 740, 800, 660, 800, 780, 660, 700, 740, 720, 940, 780, 700, 640, 300, 600, 300, 600, 500, 320, 580, 600, 580, 640, 580, 380, 580, 680, 360, 340, 660, 340, 1000, 680, 620, 640, 620, 460, 520, 460, 660, 600, 800, 600, 620, 560, 320, 600, 320, 600, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 360, 660, 660, 120, 660, 660, 600, 660, 240, 540, 400, 220, 220, 740, 740, 500, 500, 440, 380, 340, 500, 800, 460, 320, 540, 540, 400, 1000, 1360, 500, 660, 500, 400, 400, 500, 480, 460, 500, 320, 500, 500, 340, 360, 500, 440, 320, 500, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1140, 500, 400, 500, 500, 500, 500, 640, 800, 1220, 400, 500, 500, 500, 500, 500, 880, 500, 500, 500, 360, 500, 500, 340, 620, 940, 660, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font Bookman-DemiItalic (path: /usr/share/fonts/afms/adobe/pbkdi8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["Bookman-DemiItalic"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 340, 320, 380, 680, 680, 880, 980, 320, 260, 260, 460, 600, 340, 280, 340, 360, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 340, 340, 620, 600, 620, 620, 780, 720, 720, 700, 760, 720, 660, 760, 800, 380, 620, 780, 640, 860, 740, 760, 640, 760, 740, 700, 700, 740, 660, 1000, 740, 660, 680, 260, 580, 260, 620, 500, 320, 680, 600, 560, 680, 560, 420, 620, 700, 380, 320, 700, 380, 960, 680, 600, 660, 620, 500, 540, 440, 680, 540, 860, 620, 600, 560, 300, 620, 300, 620, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 320, 680, 680, 120, 680, 680, 620, 680, 180, 520, 380, 220, 220, 820, 820, 500, 500, 420, 420, 340, 500, 680, 360, 300, 520, 520, 380, 1000, 1360, 500, 620, 500, 380, 340, 480, 480, 480, 460, 380, 520, 500, 360, 360, 500, 560, 320, 480, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1140, 500, 440, 500, 500, 500, 500, 640, 760, 1180, 440, 500, 500, 500, 500, 500, 880, 500, 500, 500, 380, 500, 500, 380, 600, 920, 660, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font Bookman-Light (path: /usr/share/fonts/afms/adobe/pbkl8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["Bookman-Light"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 320, 300, 380, 620, 620, 900, 800, 220, 300, 300, 440, 600, 320, 400, 320, 600, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 320, 320, 600, 600, 600, 540, 820, 680, 740, 740, 800, 720, 640, 800, 800, 340, 600, 720, 600, 920, 740, 800, 620, 820, 720, 660, 620, 780, 700, 960, 720, 640, 640, 300, 600, 300, 600, 500, 220, 580, 620, 520, 620, 520, 320, 540, 660, 300, 300, 620, 300, 940, 660, 560, 620, 580, 440, 520, 380, 680, 520, 780, 560, 540, 480, 280, 600, 280, 600, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 300, 620, 620, 140, 620, 620, 520, 620, 220, 400, 360, 240, 240, 620, 620, 500, 500, 540, 540, 320, 500, 600, 460, 220, 400, 400, 360, 1000, 1280, 500, 540, 500, 340, 340, 420, 440, 440, 460, 260, 420, 500, 320, 320, 500, 380, 320, 420, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1260, 500, 420, 500, 500, 500, 500, 600, 800, 1240, 420, 500, 500, 500, 500, 500, 860, 500, 500, 500, 300, 500, 500, 320, 560, 900, 660, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font Bookman-LightItalic (path: /usr/share/fonts/afms/adobe/pbkli8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["Bookman-LightItalic"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 300, 320, 360, 620, 620, 800, 820, 280, 280, 280, 440, 600, 300, 320, 300, 600, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 300, 300, 600, 600, 600, 540, 780, 700, 720, 720, 740, 680, 620, 760, 800, 320, 560, 720, 580, 860, 720, 760, 600, 780, 700, 640, 600, 720, 680, 960, 700, 660, 580, 260, 600, 260, 600, 500, 280, 620, 600, 480, 640, 540, 340, 560, 620, 280, 280, 600, 280, 880, 620, 540, 600, 560, 400, 540, 340, 620, 540, 880, 540, 600, 520, 360, 600, 380, 600, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 320, 620, 620, 20, 620, 620, 620, 620, 200, 440, 300, 180, 180, 640, 660, 500, 500, 620, 620, 300, 500, 620, 460, 320, 480, 440, 300, 1000, 1180, 500, 540, 500, 340, 320, 440, 440, 440, 440, 260, 420, 500, 300, 320, 500, 340, 260, 440, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1220, 500, 440, 500, 500, 500, 500, 580, 760, 1180, 400, 500, 500, 500, 500, 500, 880, 500, 500, 500, 280, 500, 500, 340, 540, 900, 620, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font Courier (path: /usr/share/fonts/afms/adobe/pcrr8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["Courier"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 500, 600, 600, 600, 600, 500, 600, 600, 600, 600, 600, 600, 600, 600, 500, 600, 500, 600, 600, 600, 600, 600, 600, 600, 600, 500, 600, 600, 500, 600, 600, 600, 600, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 600, 500, 600, 500, 500, 500, 500, 600, 600, 600, 600, 500, 500, 500, 500, 500, 600, 500, 500, 500, 600, 500, 500, 600, 600, 600, 600, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font Courier-Bold (path: /usr/share/fonts/afms/adobe/pcrb8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["Courier-Bold"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 500, 600, 600, 600, 600, 500, 600, 600, 600, 600, 600, 600, 600, 600, 500, 600, 500, 600, 600, 600, 600, 600, 600, 600, 600, 500, 600, 600, 500, 600, 600, 600, 600, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 600, 500, 600, 500, 500, 500, 500, 600, 600, 600, 600, 500, 500, 500, 500, 500, 600, 500, 500, 500, 600, 500, 500, 600, 600, 600, 600, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font Courier-BoldOblique (path: /usr/share/fonts/afms/adobe/pcrbo8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["Courier-BoldOblique"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 500, 600, 600, 600, 600, 500, 600, 600, 600, 600, 600, 600, 600, 600, 500, 600, 500, 600, 600, 600, 600, 600, 600, 600, 600, 500, 600, 600, 500, 600, 600, 600, 600, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 600, 500, 600, 500, 500, 500, 500, 600, 600, 600, 600, 500, 500, 500, 500, 500, 600, 500, 500, 500, 600, 500, 500, 600, 600, 600, 600, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font Courier-Oblique (path: /usr/share/fonts/afms/adobe/pcrro8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["Courier-Oblique"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 500, 600, 600, 600, 600, 500, 600, 600, 600, 600, 600, 600, 600, 600, 500, 600, 500, 600, 600, 600, 600, 600, 600, 600, 600, 500, 600, 600, 500, 600, 600, 600, 600, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 600, 500, 600, 500, 500, 500, 500, 600, 600, 600, 600, 500, 500, 500, 500, 500, 600, 500, 500, 500, 600, 500, 500, 600, 600, 600, 600, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font Helvetica (path: /usr/share/fonts/afms/adobe/phvr8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["Helvetica"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 278, 355, 556, 556, 889, 667, 222, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 584, 584, 584, 556, 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 278, 278, 278, 469, 556, 222, 556, 556, 500, 556, 556, 278, 556, 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334, 260, 334, 584, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 556, 556, 167, 556, 556, 556, 556, 191, 333, 556, 333, 333, 500, 500, 500, 556, 556, 556, 278, 500, 537, 350, 222, 333, 333, 556, 1000, 1000, 500, 611, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1000, 500, 370, 500, 500, 500, 500, 556, 778, 1000, 365, 500, 500, 500, 500, 500, 889, 500, 500, 500, 278, 500, 500, 222, 611, 944, 611, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font Helvetica-Bold (path: /usr/share/fonts/afms/adobe/phvb8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["Helvetica-Bold"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 333, 474, 556, 556, 889, 722, 278, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333, 584, 584, 584, 611, 975, 722, 722, 722, 722, 667, 611, 778, 722, 278, 556, 722, 611, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 333, 278, 333, 584, 556, 278, 556, 611, 556, 611, 556, 333, 611, 611, 278, 278, 556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, 778, 556, 556, 500, 389, 280, 389, 584, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 556, 556, 167, 556, 556, 556, 556, 238, 500, 556, 333, 333, 611, 611, 500, 556, 556, 556, 278, 500, 556, 350, 278, 500, 500, 556, 1000, 1000, 500, 611, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1000, 500, 370, 500, 500, 500, 500, 611, 778, 1000, 365, 500, 500, 500, 500, 500, 889, 500, 500, 500, 278, 500, 500, 278, 611, 944, 611, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font Helvetica-BoldOblique (path: /usr/share/fonts/afms/adobe/phvbo8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["Helvetica-BoldOblique"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 333, 474, 556, 556, 889, 722, 278, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333, 584, 584, 584, 611, 975, 722, 722, 722, 722, 667, 611, 778, 722, 278, 556, 722, 611, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 333, 278, 333, 584, 556, 278, 556, 611, 556, 611, 556, 333, 611, 611, 278, 278, 556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, 778, 556, 556, 500, 389, 280, 389, 584, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 556, 556, 167, 556, 556, 556, 556, 238, 500, 556, 333, 333, 611, 611, 500, 556, 556, 556, 278, 500, 556, 350, 278, 500, 500, 556, 1000, 1000, 500, 611, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1000, 500, 370, 500, 500, 500, 500, 611, 778, 1000, 365, 500, 500, 500, 500, 500, 889, 500, 500, 500, 278, 500, 500, 278, 611, 944, 611, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font Helvetica-Light (path: /usr/share/fonts/afms/adobe/phvl8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["Helvetica-Light"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 333, 278, 556, 556, 889, 667, 222, 333, 333, 389, 660, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 660, 660, 660, 500, 800, 667, 667, 722, 722, 611, 556, 778, 722, 278, 500, 667, 556, 833, 722, 778, 611, 778, 667, 611, 556, 722, 611, 889, 611, 611, 611, 333, 278, 333, 660, 500, 222, 556, 611, 556, 611, 556, 278, 611, 556, 222, 222, 500, 222, 833, 556, 556, 611, 611, 333, 500, 278, 556, 500, 722, 500, 500, 500, 333, 222, 333, 660, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 556, 556, 167, 556, 556, 556, 556, 222, 389, 556, 389, 389, 500, 500, 500, 500, 556, 556, 278, 500, 650, 500, 222, 389, 389, 556, 1000, 1000, 500, 500, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1000, 500, 334, 500, 500, 500, 500, 556, 778, 1000, 334, 500, 500, 500, 500, 500, 889, 500, 500, 500, 222, 500, 500, 222, 556, 944, 500, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font Helvetica-LightOblique (path: /usr/share/fonts/afms/adobe/phvlo8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["Helvetica-LightOblique"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 333, 278, 556, 556, 889, 667, 222, 333, 333, 389, 660, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 660, 660, 660, 500, 800, 667, 667, 722, 722, 611, 556, 778, 722, 278, 500, 667, 556, 833, 722, 778, 611, 778, 667, 611, 556, 722, 611, 889, 611, 611, 611, 333, 278, 333, 660, 500, 222, 556, 611, 556, 611, 556, 278, 611, 556, 222, 222, 500, 222, 833, 556, 556, 611, 611, 333, 500, 278, 556, 500, 722, 500, 500, 500, 333, 222, 333, 660, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 556, 556, 167, 556, 556, 556, 556, 222, 389, 556, 389, 389, 500, 500, 500, 500, 556, 556, 278, 500, 650, 500, 222, 389, 389, 556, 1000, 1000, 500, 500, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1000, 500, 334, 500, 500, 500, 500, 556, 778, 1000, 334, 500, 500, 500, 500, 500, 889, 500, 500, 500, 222, 500, 500, 222, 556, 944, 500, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font Helvetica-Narrow (path: /usr/share/fonts/afms/adobe/phvr8an.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["Helvetica-Narrow"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 228, 228, 291, 456, 456, 729, 547, 182, 273, 273, 319, 479, 228, 273, 228, 228, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 228, 228, 479, 479, 479, 456, 832, 547, 547, 592, 592, 547, 501, 638, 592, 228, 410, 547, 456, 683, 592, 638, 547, 638, 592, 547, 501, 592, 547, 774, 547, 547, 501, 228, 228, 228, 385, 456, 182, 456, 456, 410, 456, 456, 228, 456, 456, 182, 182, 410, 182, 683, 456, 456, 456, 456, 273, 410, 228, 456, 410, 592, 410, 410, 410, 274, 213, 274, 479, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 273, 456, 456, 137, 456, 456, 456, 456, 157, 273, 456, 273, 273, 410, 410, 500, 456, 456, 456, 228, 500, 440, 287, 182, 273, 273, 456, 820, 820, 500, 501, 500, 273, 273, 273, 273, 273, 273, 273, 273, 500, 273, 273, 500, 273, 273, 273, 820, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 820, 500, 303, 500, 500, 500, 500, 456, 638, 820, 299, 500, 500, 500, 500, 500, 729, 500, 500, 500, 228, 500, 500, 182, 501, 774, 501, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font Helvetica-Narrow-Bold (path: /usr/share/fonts/afms/adobe/phvb8an.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["Helvetica-Narrow-Bold"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 228, 273, 389, 456, 456, 729, 592, 228, 273, 273, 319, 479, 228, 273, 228, 228, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 273, 273, 479, 479, 479, 501, 800, 592, 592, 592, 592, 547, 501, 638, 592, 228, 456, 592, 501, 683, 592, 638, 547, 638, 592, 547, 501, 592, 547, 774, 547, 547, 501, 273, 228, 273, 479, 456, 228, 456, 501, 456, 501, 456, 273, 501, 501, 228, 228, 456, 228, 729, 501, 501, 501, 501, 319, 456, 273, 501, 456, 638, 456, 456, 410, 319, 230, 319, 479, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 273, 456, 456, 137, 456, 456, 456, 456, 195, 410, 456, 273, 273, 501, 501, 500, 456, 456, 456, 228, 500, 456, 287, 228, 410, 410, 456, 820, 820, 500, 501, 500, 273, 273, 273, 273, 273, 273, 273, 273, 500, 273, 273, 500, 273, 273, 273, 820, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 820, 500, 303, 500, 500, 500, 500, 501, 638, 820, 299, 500, 500, 500, 500, 500, 729, 500, 500, 500, 228, 500, 500, 228, 501, 774, 501, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font Helvetica-Narrow-BoldOblique (path: /usr/share/fonts/afms/adobe/phvbo8an.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["Helvetica-Narrow-BoldOblique"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 228, 273, 389, 456, 456, 729, 592, 228, 273, 273, 319, 479, 228, 273, 228, 228, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 273, 273, 479, 479, 479, 501, 800, 592, 592, 592, 592, 547, 501, 638, 592, 228, 456, 592, 501, 683, 592, 638, 547, 638, 592, 547, 501, 592, 547, 774, 547, 547, 501, 273, 228, 273, 479, 456, 228, 456, 501, 456, 501, 456, 273, 501, 501, 228, 228, 456, 228, 729, 501, 501, 501, 501, 319, 456, 273, 501, 456, 638, 456, 456, 410, 319, 230, 319, 479, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 273, 456, 456, 137, 456, 456, 456, 456, 195, 410, 456, 273, 273, 501, 501, 500, 456, 456, 456, 228, 500, 456, 287, 228, 410, 410, 456, 820, 820, 500, 501, 500, 273, 273, 273, 273, 273, 273, 273, 273, 500, 273, 273, 500, 273, 273, 273, 820, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 820, 500, 303, 500, 500, 500, 500, 501, 638, 820, 299, 500, 500, 500, 500, 500, 729, 500, 500, 500, 228, 500, 500, 228, 501, 774, 501, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font Helvetica-Narrow-Oblique (path: /usr/share/fonts/afms/adobe/phvro8an.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["Helvetica-Narrow-Oblique"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 228, 228, 291, 456, 456, 729, 547, 182, 273, 273, 319, 479, 228, 273, 228, 228, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 228, 228, 479, 479, 479, 456, 832, 547, 547, 592, 592, 547, 501, 638, 592, 228, 410, 547, 456, 683, 592, 638, 547, 638, 592, 547, 501, 592, 547, 774, 547, 547, 501, 228, 228, 228, 385, 456, 182, 456, 456, 410, 456, 456, 228, 456, 456, 182, 182, 410, 182, 683, 456, 456, 456, 456, 273, 410, 228, 456, 410, 592, 410, 410, 410, 274, 213, 274, 479, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 273, 456, 456, 137, 456, 456, 456, 456, 157, 273, 456, 273, 273, 410, 410, 500, 456, 456, 456, 228, 500, 440, 287, 182, 273, 273, 456, 820, 820, 500, 501, 500, 273, 273, 273, 273, 273, 273, 273, 273, 500, 273, 273, 500, 273, 273, 273, 820, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 820, 500, 303, 500, 500, 500, 500, 456, 638, 820, 299, 500, 500, 500, 500, 500, 729, 500, 500, 500, 228, 500, 500, 182, 501, 774, 501, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font Helvetica-Oblique (path: /usr/share/fonts/afms/adobe/phvro8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["Helvetica-Oblique"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 278, 355, 556, 556, 889, 667, 222, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 584, 584, 584, 556, 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 278, 278, 278, 469, 556, 222, 556, 556, 500, 556, 556, 278, 556, 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334, 260, 334, 584, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 556, 556, 167, 556, 556, 556, 556, 191, 333, 556, 333, 333, 500, 500, 500, 556, 556, 556, 278, 500, 537, 350, 222, 333, 333, 556, 1000, 1000, 500, 611, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1000, 500, 370, 500, 500, 500, 500, 556, 778, 1000, 365, 500, 500, 500, 500, 500, 889, 500, 500, 500, 278, 500, 500, 222, 611, 944, 611, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font NewCenturySchlbk-Bold (path: /usr/share/fonts/afms/adobe/pncb8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["NewCenturySchlbk-Bold"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 287, 296, 333, 574, 574, 833, 852, 241, 389, 389, 500, 606, 278, 333, 278, 278, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 278, 278, 606, 606, 606, 500, 747, 759, 778, 778, 833, 759, 722, 833, 870, 444, 648, 815, 722, 981, 833, 833, 759, 833, 815, 667, 722, 833, 759, 981, 722, 722, 667, 389, 606, 389, 606, 500, 241, 611, 648, 556, 667, 574, 389, 611, 685, 370, 352, 667, 352, 963, 685, 611, 667, 648, 519, 500, 426, 685, 611, 889, 611, 611, 537, 389, 606, 389, 606, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 296, 574, 574, 167, 574, 574, 500, 574, 241, 481, 500, 333, 333, 685, 685, 500, 500, 500, 500, 278, 500, 747, 606, 241, 481, 481, 500, 1000, 1000, 500, 500, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 981, 500, 367, 500, 500, 500, 500, 722, 833, 1000, 367, 500, 500, 500, 500, 500, 870, 500, 500, 500, 370, 500, 500, 352, 611, 907, 611, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font NewCenturySchlbk-BoldItalic (path: /usr/share/fonts/afms/adobe/pncbi8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["NewCenturySchlbk-BoldItalic"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 287, 333, 400, 574, 574, 889, 889, 259, 407, 407, 500, 606, 287, 333, 287, 278, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 287, 287, 606, 606, 606, 481, 747, 741, 759, 759, 833, 741, 704, 815, 870, 444, 667, 778, 704, 944, 852, 833, 741, 833, 796, 685, 722, 833, 741, 944, 741, 704, 704, 407, 606, 407, 606, 500, 259, 667, 611, 537, 667, 519, 389, 611, 685, 389, 370, 648, 389, 944, 685, 574, 648, 630, 519, 481, 407, 685, 556, 833, 574, 519, 519, 407, 606, 407, 606, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 574, 574, 167, 574, 574, 500, 574, 287, 481, 481, 278, 278, 685, 685, 500, 500, 500, 500, 287, 500, 650, 606, 259, 481, 481, 481, 1000, 1167, 500, 481, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 889, 500, 412, 500, 500, 500, 500, 704, 833, 963, 356, 500, 500, 500, 500, 500, 815, 500, 500, 500, 389, 500, 500, 389, 574, 852, 574, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font NewCenturySchlbk-Italic (path: /usr/share/fonts/afms/adobe/pncri8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["NewCenturySchlbk-Italic"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 333, 400, 556, 556, 833, 852, 204, 333, 333, 500, 606, 278, 333, 278, 606, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 606, 606, 606, 444, 747, 704, 722, 722, 778, 722, 667, 778, 833, 407, 611, 741, 667, 944, 815, 778, 667, 778, 741, 667, 685, 815, 704, 926, 704, 685, 667, 333, 606, 333, 606, 500, 204, 574, 556, 444, 611, 444, 333, 537, 611, 333, 315, 556, 333, 889, 611, 500, 574, 556, 444, 444, 352, 611, 519, 778, 500, 500, 463, 333, 606, 333, 606, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 556, 556, 167, 556, 556, 500, 556, 278, 389, 426, 333, 333, 611, 611, 500, 500, 500, 500, 278, 500, 650, 606, 204, 389, 389, 426, 1000, 1000, 500, 444, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 870, 500, 422, 500, 500, 500, 500, 667, 778, 981, 372, 500, 500, 500, 500, 500, 722, 500, 500, 500, 333, 500, 500, 333, 500, 778, 556, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font NewCenturySchlbk-Roman (path: /usr/share/fonts/afms/adobe/pncr8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["NewCenturySchlbk-Roman"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 296, 389, 556, 556, 833, 815, 204, 333, 333, 500, 606, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 606, 606, 606, 444, 737, 722, 722, 722, 778, 722, 667, 778, 833, 407, 556, 778, 667, 944, 815, 778, 667, 778, 722, 630, 667, 815, 722, 981, 704, 704, 611, 333, 606, 333, 606, 500, 204, 556, 556, 444, 574, 500, 333, 537, 611, 315, 296, 593, 315, 889, 611, 500, 574, 556, 444, 463, 389, 611, 537, 778, 537, 537, 481, 333, 606, 333, 606, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 296, 556, 556, 167, 556, 556, 500, 556, 204, 389, 426, 259, 259, 611, 611, 500, 556, 500, 500, 278, 500, 606, 606, 204, 389, 389, 426, 1000, 1000, 500, 444, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1000, 500, 334, 500, 500, 500, 500, 667, 778, 1000, 300, 500, 500, 500, 500, 500, 796, 500, 500, 500, 315, 500, 500, 315, 500, 833, 574, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font Palatino-Bold (path: /usr/share/fonts/afms/adobe/pplb8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["Palatino-Bold"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 278, 402, 500, 500, 889, 833, 278, 333, 333, 444, 606, 250, 333, 250, 296, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 250, 606, 606, 606, 444, 747, 778, 667, 722, 833, 611, 556, 833, 833, 389, 389, 778, 611, 1000, 833, 833, 611, 833, 722, 611, 667, 778, 778, 1000, 667, 667, 667, 333, 606, 333, 606, 500, 278, 500, 611, 444, 611, 500, 389, 556, 611, 333, 333, 611, 333, 889, 611, 556, 611, 611, 389, 444, 333, 611, 556, 833, 500, 556, 500, 310, 606, 310, 606, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 500, 500, 167, 500, 500, 500, 500, 227, 500, 500, 389, 389, 611, 611, 500, 500, 500, 500, 250, 500, 641, 606, 333, 500, 500, 500, 1000, 1000, 500, 444, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1000, 500, 438, 500, 500, 500, 500, 611, 833, 1000, 488, 500, 500, 500, 500, 500, 778, 500, 500, 500, 333, 500, 500, 333, 556, 833, 611, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font Palatino-BoldItalic (path: /usr/share/fonts/afms/adobe/pplbi8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["Palatino-BoldItalic"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 333, 500, 500, 500, 889, 833, 278, 333, 333, 444, 606, 250, 389, 250, 315, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 250, 606, 606, 606, 444, 833, 722, 667, 685, 778, 611, 556, 778, 778, 389, 389, 722, 611, 944, 778, 833, 667, 833, 722, 556, 611, 778, 667, 1000, 722, 611, 667, 333, 606, 333, 606, 500, 278, 556, 537, 444, 556, 444, 333, 500, 556, 333, 333, 556, 333, 833, 556, 556, 556, 537, 389, 444, 389, 556, 556, 833, 500, 556, 500, 333, 606, 333, 606, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 500, 500, 167, 500, 500, 556, 500, 250, 500, 500, 333, 333, 611, 611, 500, 500, 556, 556, 250, 500, 556, 606, 250, 500, 500, 500, 1000, 1000, 500, 444, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 556, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 944, 500, 333, 500, 500, 500, 500, 611, 833, 944, 333, 500, 500, 500, 500, 500, 738, 500, 500, 500, 333, 500, 500, 333, 556, 778, 556, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font Palatino-Italic (path: /usr/share/fonts/afms/adobe/pplri8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["Palatino-Italic"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 333, 500, 500, 500, 889, 778, 278, 333, 333, 389, 606, 250, 333, 250, 296, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 250, 606, 606, 606, 500, 747, 722, 611, 667, 778, 611, 556, 722, 778, 333, 333, 667, 556, 944, 778, 778, 611, 778, 667, 556, 611, 778, 722, 944, 722, 667, 667, 333, 606, 333, 606, 500, 278, 444, 463, 407, 500, 389, 278, 500, 500, 278, 278, 444, 278, 778, 556, 444, 500, 463, 389, 389, 333, 556, 500, 722, 500, 500, 444, 333, 606, 333, 606, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 500, 500, 167, 500, 500, 500, 500, 333, 500, 500, 333, 333, 528, 545, 500, 500, 500, 500, 250, 500, 500, 500, 278, 500, 500, 500, 1000, 1000, 500, 500, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 941, 500, 333, 500, 500, 500, 500, 556, 778, 1028, 333, 500, 500, 500, 500, 500, 638, 500, 500, 500, 278, 500, 500, 278, 444, 669, 500, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font Palatino-Roman (path: /usr/share/fonts/afms/adobe/pplr8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["Palatino-Roman"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 278, 371, 500, 500, 840, 778, 278, 333, 333, 389, 606, 250, 333, 250, 606, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 250, 606, 606, 606, 444, 747, 778, 611, 709, 774, 611, 556, 763, 832, 337, 333, 726, 611, 946, 831, 786, 604, 786, 668, 525, 613, 778, 722, 1000, 667, 667, 667, 333, 606, 333, 606, 500, 278, 500, 553, 444, 611, 479, 333, 556, 582, 291, 234, 556, 291, 883, 582, 546, 601, 560, 395, 424, 326, 603, 565, 834, 516, 556, 500, 333, 606, 333, 606, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 500, 500, 167, 500, 500, 500, 500, 208, 500, 500, 331, 331, 605, 608, 500, 500, 500, 500, 250, 500, 628, 606, 278, 500, 500, 500, 1000, 1144, 500, 444, 500, 333, 333, 333, 333, 333, 333, 250, 333, 500, 333, 333, 500, 380, 313, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 944, 500, 333, 500, 500, 500, 500, 611, 833, 998, 333, 500, 500, 500, 500, 500, 758, 500, 500, 500, 287, 500, 500, 291, 556, 827, 556, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font Symbol (path: /usr/share/fonts/afms/adobe/psyr.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["Symbol"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 333, 713, 500, 549, 833, 778, 439, 333, 333, 500, 549, 250, 549, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 278, 549, 549, 549, 444, 549, 722, 667, 722, 612, 611, 763, 603, 722, 333, 631, 722, 686, 889, 722, 722, 768, 741, 556, 592, 611, 690, 439, 768, 645, 795, 611, 333, 863, 333, 658, 500, 500, 631, 549, 549, 494, 439, 521, 411, 603, 329, 603, 549, 549, 576, 521, 549, 549, 521, 549, 603, 439, 576, 713, 686, 493, 686, 494, 480, 200, 480, 549, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 620, 247, 549, 167, 713, 500, 753, 753, 753, 753, 1042, 987, 603, 987, 603, 400, 549, 411, 549, 549, 713, 494, 460, 549, 549, 549, 549, 1000, 603, 1000, 658, 823, 686, 795, 987, 768, 768, 823, 768, 768, 713, 713, 713, 713, 713, 713, 713, 768, 713, 790, 790, 890, 823, 549, 250, 713, 603, 603, 1042, 987, 603, 987, 603, 494, 329, 790, 790, 786, 713, 384, 384, 384, 384, 384, 384, 494, 494, 494, 494, 500, 329, 274, 686, 686, 686, 384, 384, 384, 384, 384, 384, 494, 494, 494, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font Times-Bold (path: /usr/share/fonts/afms/adobe/ptmb8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["Times-Bold"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 333, 555, 500, 500, 1000, 833, 333, 333, 333, 500, 570, 250, 333, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 333, 570, 570, 570, 500, 930, 722, 667, 722, 722, 667, 611, 778, 778, 389, 500, 778, 667, 944, 722, 778, 611, 778, 722, 556, 667, 722, 722, 1000, 722, 722, 667, 333, 278, 333, 581, 500, 333, 500, 556, 444, 556, 444, 333, 500, 556, 278, 333, 556, 278, 833, 556, 500, 556, 556, 444, 389, 333, 556, 500, 722, 500, 500, 444, 394, 220, 394, 520, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 500, 500, 167, 500, 500, 500, 500, 278, 500, 500, 333, 333, 556, 556, 500, 500, 500, 500, 250, 500, 540, 350, 333, 500, 500, 500, 1000, 1000, 500, 500, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1000, 500, 300, 500, 500, 500, 500, 667, 778, 1000, 330, 500, 500, 500, 500, 500, 722, 500, 500, 500, 278, 500, 500, 278, 500, 722, 556, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font Times-BoldItalic (path: /usr/share/fonts/afms/adobe/ptmbi8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["Times-BoldItalic"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 389, 555, 500, 500, 833, 778, 333, 333, 333, 500, 570, 250, 333, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 333, 570, 570, 570, 500, 832, 667, 667, 667, 722, 667, 667, 722, 778, 389, 500, 667, 611, 889, 722, 722, 611, 722, 667, 556, 611, 722, 667, 889, 667, 611, 611, 333, 278, 333, 570, 500, 333, 500, 500, 444, 500, 444, 333, 500, 556, 278, 278, 500, 278, 778, 556, 500, 500, 500, 389, 389, 278, 556, 444, 667, 500, 444, 389, 348, 220, 348, 570, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 389, 500, 500, 167, 500, 500, 500, 500, 278, 500, 500, 333, 333, 556, 556, 500, 500, 500, 500, 250, 500, 500, 350, 333, 500, 500, 500, 1000, 1000, 500, 500, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 944, 500, 266, 500, 500, 500, 500, 611, 722, 944, 300, 500, 500, 500, 500, 500, 722, 500, 500, 500, 278, 500, 500, 278, 500, 722, 500, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font Times-Italic (path: /usr/share/fonts/afms/adobe/ptmri8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["Times-Italic"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 333, 420, 500, 500, 833, 778, 333, 333, 333, 500, 675, 250, 333, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 333, 675, 675, 675, 500, 920, 611, 611, 667, 722, 611, 611, 722, 722, 333, 444, 667, 556, 833, 667, 722, 611, 722, 611, 500, 556, 722, 611, 833, 611, 556, 556, 389, 278, 389, 422, 500, 333, 500, 500, 444, 500, 444, 278, 500, 500, 278, 278, 444, 278, 722, 500, 500, 500, 500, 389, 389, 278, 500, 444, 667, 444, 444, 389, 400, 275, 400, 541, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 389, 500, 500, 167, 500, 500, 500, 500, 214, 556, 500, 333, 333, 500, 500, 500, 500, 500, 500, 250, 500, 523, 350, 333, 556, 556, 500, 889, 1000, 500, 500, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 889, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 889, 500, 276, 500, 500, 500, 500, 556, 722, 944, 310, 500, 500, 500, 500, 500, 667, 500, 500, 500, 278, 500, 500, 278, 500, 667, 500, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font Times-Roman (path: /usr/share/fonts/afms/adobe/ptmr8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["Times-Roman"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 333, 408, 500, 500, 833, 778, 333, 333, 333, 500, 564, 250, 333, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 278, 564, 564, 564, 444, 921, 722, 667, 667, 722, 611, 556, 722, 722, 333, 389, 722, 611, 889, 722, 722, 556, 722, 667, 556, 611, 722, 722, 944, 722, 722, 611, 333, 278, 333, 469, 500, 333, 444, 500, 444, 500, 444, 333, 500, 500, 278, 278, 500, 278, 778, 500, 500, 500, 500, 333, 389, 278, 500, 500, 722, 500, 500, 444, 480, 200, 480, 541, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 500, 500, 167, 500, 500, 500, 500, 180, 444, 500, 333, 333, 556, 556, 500, 500, 500, 500, 250, 500, 453, 350, 333, 444, 444, 500, 1000, 1000, 500, 444, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 889, 500, 276, 500, 500, 500, 500, 611, 722, 889, 310, 500, 500, 500, 500, 500, 667, 500, 500, 500, 278, 500, 500, 278, 500, 722, 500, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font Utopia-Bold (path: /usr/share/fonts/afms/adobe/putb8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["Utopia-Bold"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 210, 278, 473, 560, 560, 887, 748, 252, 365, 365, 442, 600, 280, 392, 280, 378, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 280, 280, 600, 600, 600, 456, 833, 644, 683, 689, 777, 629, 593, 726, 807, 384, 386, 707, 585, 918, 739, 768, 650, 768, 684, 561, 624, 786, 645, 933, 634, 617, 614, 335, 379, 335, 600, 500, 252, 544, 605, 494, 605, 519, 342, 533, 631, 316, 316, 582, 309, 948, 638, 585, 615, 597, 440, 446, 370, 629, 520, 774, 522, 524, 483, 365, 284, 365, 600, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 560, 560, 100, 560, 560, 566, 560, 252, 473, 487, 287, 287, 639, 639, 500, 500, 510, 486, 280, 500, 552, 455, 252, 473, 473, 487, 1000, 1289, 500, 456, 500, 430, 430, 430, 430, 430, 430, 430, 430, 500, 430, 430, 500, 430, 430, 430, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 879, 500, 405, 500, 500, 500, 500, 591, 768, 1049, 427, 500, 500, 500, 500, 500, 806, 500, 500, 500, 316, 500, 500, 321, 585, 866, 662, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font Utopia-BoldItalic (path: /usr/share/fonts/afms/adobe/putbi8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["Utopia-BoldItalic"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 210, 285, 455, 560, 560, 896, 752, 246, 350, 350, 500, 600, 280, 392, 280, 260, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 280, 280, 600, 600, 600, 454, 828, 634, 680, 672, 774, 622, 585, 726, 800, 386, 388, 688, 586, 921, 741, 761, 660, 761, 681, 551, 616, 776, 630, 920, 630, 622, 618, 350, 460, 350, 600, 500, 246, 596, 586, 456, 609, 476, 348, 522, 629, 339, 333, 570, 327, 914, 635, 562, 606, 584, 440, 417, 359, 634, 518, 795, 516, 489, 466, 340, 265, 340, 600, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 285, 560, 560, 100, 560, 560, 568, 560, 246, 455, 560, 360, 360, 651, 652, 500, 500, 514, 490, 280, 500, 580, 465, 246, 455, 455, 560, 1000, 1297, 500, 454, 500, 400, 400, 400, 400, 400, 400, 402, 400, 500, 400, 400, 500, 400, 350, 400, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 890, 500, 444, 500, 500, 500, 500, 592, 761, 1016, 412, 500, 500, 500, 500, 500, 789, 500, 500, 500, 339, 500, 500, 339, 562, 811, 628, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font Utopia-Italic (path: /usr/share/fonts/afms/adobe/putri8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["Utopia-Italic"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 225, 240, 402, 530, 530, 826, 725, 216, 350, 350, 412, 570, 265, 392, 265, 270, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 265, 265, 570, 570, 570, 425, 794, 624, 632, 661, 763, 596, 571, 709, 775, 345, 352, 650, 565, 920, 763, 753, 614, 753, 640, 533, 606, 794, 637, 946, 632, 591, 622, 330, 390, 330, 570, 500, 216, 561, 559, 441, 587, 453, 315, 499, 607, 317, 309, 545, 306, 912, 618, 537, 590, 559, 402, 389, 341, 618, 510, 785, 516, 468, 468, 340, 270, 340, 570, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 240, 530, 530, 100, 530, 530, 530, 530, 216, 402, 462, 277, 277, 607, 603, 500, 500, 500, 490, 265, 500, 560, 500, 216, 402, 402, 462, 1000, 1200, 500, 425, 500, 400, 400, 400, 400, 400, 400, 402, 400, 500, 400, 400, 500, 400, 350, 400, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 880, 500, 425, 500, 500, 500, 500, 571, 753, 1020, 389, 500, 500, 500, 500, 500, 779, 500, 500, 500, 317, 500, 500, 318, 537, 806, 577, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font Utopia-Regular (path: /usr/share/fonts/afms/adobe/putr8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["Utopia-Regular"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 225, 242, 458, 530, 530, 838, 706, 278, 350, 350, 412, 570, 265, 392, 265, 460, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 265, 265, 570, 570, 570, 389, 793, 635, 646, 684, 779, 606, 580, 734, 798, 349, 350, 658, 568, 944, 780, 762, 600, 762, 644, 541, 621, 791, 634, 940, 624, 588, 610, 330, 460, 330, 570, 500, 278, 523, 598, 496, 598, 514, 319, 520, 607, 291, 280, 524, 279, 923, 619, 577, 608, 591, 389, 436, 344, 606, 504, 768, 486, 506, 480, 340, 228, 340, 570, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 242, 530, 530, 150, 530, 530, 554, 530, 278, 458, 442, 257, 257, 610, 610, 500, 500, 504, 488, 265, 500, 555, 409, 278, 458, 458, 442, 1000, 1208, 500, 389, 500, 400, 400, 400, 400, 400, 400, 400, 400, 500, 400, 400, 500, 400, 400, 400, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 876, 500, 390, 500, 500, 500, 500, 574, 762, 1025, 398, 500, 500, 500, 500, 500, 797, 500, 500, 500, 291, 500, 500, 294, 577, 882, 601, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font ZapfChancery-MediumItalic (path: /usr/share/fonts/afms/adobe/pzcmi8a.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["ZapfChancery-MediumItalic"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 220, 280, 220, 440, 440, 680, 780, 240, 260, 220, 420, 520, 220, 280, 220, 340, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 260, 240, 520, 520, 520, 380, 700, 620, 600, 520, 700, 620, 580, 620, 680, 380, 400, 660, 580, 840, 700, 600, 540, 600, 600, 460, 500, 740, 640, 880, 560, 560, 620, 240, 480, 320, 520, 500, 240, 420, 420, 340, 440, 340, 320, 400, 440, 240, 220, 440, 240, 620, 460, 400, 440, 400, 300, 320, 320, 460, 440, 680, 420, 400, 440, 240, 520, 240, 520, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 280, 440, 440, 60, 440, 440, 420, 440, 160, 340, 340, 240, 260, 520, 520, 500, 500, 460, 480, 220, 500, 500, 600, 180, 280, 360, 380, 1000, 960, 500, 400, 500, 220, 300, 340, 440, 440, 440, 220, 360, 500, 300, 300, 500, 400, 280, 340, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 740, 500, 260, 500, 500, 500, 500, 580, 660, 820, 260, 500, 500, 500, 500, 500, 540, 500, 500, 500, 240, 500, 500, 300, 440, 560, 420, )
|
|
@ -1,5 +0,0 @@
|
|||
# AFM font ZapfDingbats (path: /usr/share/fonts/afms/adobe/pzdr.afm).
|
||||
# Derived from Ghostscript distribution.
|
||||
# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
|
||||
import dir
|
||||
dir.afm["ZapfDingbats"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 974, 961, 974, 980, 719, 789, 790, 791, 690, 960, 939, 549, 855, 911, 933, 911, 945, 974, 755, 846, 762, 761, 571, 677, 763, 760, 759, 754, 494, 552, 537, 577, 692, 786, 788, 788, 790, 793, 794, 816, 823, 789, 841, 823, 833, 816, 831, 923, 744, 723, 749, 790, 792, 695, 776, 768, 792, 759, 707, 708, 682, 701, 826, 815, 789, 789, 707, 687, 696, 689, 786, 787, 713, 791, 785, 791, 873, 761, 762, 762, 759, 759, 892, 892, 788, 784, 438, 138, 277, 415, 392, 392, 668, 668, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 732, 544, 544, 910, 667, 760, 760, 776, 595, 694, 626, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 894, 838, 1016, 458, 748, 924, 748, 918, 927, 928, 928, 834, 873, 828, 924, 924, 917, 930, 931, 463, 883, 836, 836, 867, 867, 696, 696, 874, 500, 874, 760, 946, 771, 865, 771, 888, 967, 888, 831, 873, 927, 970, 918, )
|
|
@ -1 +0,0 @@
|
|||
__all__ = ["Courier_Oblique", "AvantGarde_BookOblique", "Times_Italic", "Helvetica_Bold", "NewCenturySchlbk_Roman", "Helvetica", "Helvetica_Narrow", "AvantGarde_Demi", "Times_BoldItalic", "Helvetica_Narrow_Bold", "Helvetica_Light", "Bookman_DemiItalic", "Utopia_Regular", "Times_Roman", "Palatino_Italic", "Courier_Bold", "ZapfChancery_MediumItalic", "NewCenturySchlbk_Italic", "NewCenturySchlbk_BoldItalic", "Helvetica_Narrow_BoldOblique", "Courier", "AvantGarde_DemiOblique", "Courier_BoldOblique", "Bookman_LightItalic", "Symbol", "Utopia_Bold", "Times_Bold", "Helvetica_BoldOblique", "Utopia_BoldItalic", "AvantGarde_Book", "Bookman_Demi", "Palatino_Roman", "Bookman_Light", "Utopia_Italic", "NewCenturySchlbk_Bold", "Helvetica_LightOblique", "ZapfDingbats", "Helvetica_Narrow_Oblique", "Helvetica_Oblique", "Palatino_BoldItalic", "Palatino_Bold", "dir"]
|
|
@ -1,2 +0,0 @@
|
|||
afm = {}
|
||||
|
|
@ -1,249 +0,0 @@
|
|||
#
|
||||
# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
|
||||
#
|
||||
# Jockey 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, or (at your option) any
|
||||
# later version.
|
||||
#
|
||||
# Jockey 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.
|
||||
#
|
||||
import coord
|
||||
import line_style
|
||||
import legend
|
||||
import axis
|
||||
import pychart_util
|
||||
import chart_object
|
||||
import fill_style
|
||||
import canvas
|
||||
import area_doc
|
||||
import linear_coord
|
||||
import category_coord
|
||||
import theme
|
||||
from pychart_types import *
|
||||
from types import *
|
||||
|
||||
_dummy_legend = legend.T()
|
||||
|
||||
def range_doc(t):
|
||||
u = t.upper()
|
||||
|
||||
return """Specifies the range of %s values that are displayed in the
|
||||
chart. IF the value is None, both the values are computed
|
||||
automatically from the samples. Otherwise, the value must be a
|
||||
tuple of format (MIN, MAX). MIN and MAX must be either None or a
|
||||
number. If None, the value is computed automatically from the
|
||||
samples. For example, if %s_range = (None,5), then the minimum %s
|
||||
value is computed automatically, but the maximum %s value is fixed
|
||||
at 5.""" % (u, t, u, u)
|
||||
|
||||
_keys = {
|
||||
"loc" : (CoordType, (0,0),
|
||||
"""The location of the bottom-left corner of the chart.
|
||||
@cindex chart location
|
||||
@cindex location, chart
|
||||
"""),
|
||||
"size" : (CoordType, (120,110),
|
||||
"""The size of the chart-drawing area, excluding axis labels,
|
||||
legends, tick marks, etc.
|
||||
@cindex chart size
|
||||
@cindex size, chart
|
||||
"""),
|
||||
"bg_style": (fill_style.T, None, "Background fill-pattern."),
|
||||
"border_line_style": (line_style.T, None, "Line style of the outer frame of the chart."),
|
||||
"x_coord":
|
||||
(coord.T, linear_coord.T(),
|
||||
"""Set the X coordinate system.""",
|
||||
"""A linear coordinate system."""),
|
||||
"y_coord": (coord.T, linear_coord.T(),
|
||||
"Set the Y coordinate system.",
|
||||
"""A linear coordinate system."""),
|
||||
"x_range": (CoordType, None, range_doc("x")),
|
||||
"y_range": (CoordType, None, range_doc("y")),
|
||||
"x_axis": (axis.X, None, "The X axis. <<axis>>."),
|
||||
"x_axis2": (axis.X, None, """The second X axis. This axis should be non-None either when you want to display plots with two distinct domains or when
|
||||
you just want to display two axes at the top and bottom of the chart.
|
||||
<<axis>>"""),
|
||||
"y_axis": (axis.Y, None, "The Y axis. <<axis>>."),
|
||||
"y_axis2": (axis.Y, None,
|
||||
"""The second Y axis. This axis should be non-None either when you want to display plots with two distinct ranges or when
|
||||
you just want to display two axes at the left and right of the chart. <<axis>>"""),
|
||||
"x_grid_style" : (line_style.T, None,
|
||||
"""The style of horizontal grid lines.
|
||||
@cindex grid lines"""),
|
||||
"y_grid_style" : (line_style.T, line_style.gray70_dash3,
|
||||
"The style of vertical grid lines."),
|
||||
"x_grid_interval": (IntervalType, None,
|
||||
"""The horizontal grid-line interval.
|
||||
A numeric value
|
||||
specifies the interval at which
|
||||
lines are drawn. If value is a function, it
|
||||
takes two arguments, (MIN, MAX), that tells
|
||||
the minimum and maximum values found in the
|
||||
sample data. The function should return a list
|
||||
of values at which lines are drawn."""),
|
||||
"y_grid_interval": (IntervalType, None,
|
||||
"The vertical grid-line interval. See also x_grid_interval"),
|
||||
"x_grid_over_plot": (IntType, False,
|
||||
"If True, grid lines are drawn over plots. Otherwise, plots are drawn over grid lines."),
|
||||
"y_grid_over_plot": (IntType, False, "See x_grid_over_plot."),
|
||||
"plots": (ListType, pychart_util.new_list,
|
||||
"""Used only internally by pychart."""),
|
||||
"legend": (legend.T, _dummy_legend, "The legend of the chart.",
|
||||
"""a legend is by default displayed
|
||||
in the right-center of the chart."""),
|
||||
}
|
||||
|
||||
|
||||
class T(chart_object.T):
|
||||
keys = _keys
|
||||
__doc__ = area_doc.doc
|
||||
##AUTOMATICALLY GENERATED
|
||||
|
||||
##END AUTOMATICALLY GENERATED
|
||||
def x_pos(self, xval):
|
||||
"Return the x position (on the canvas) corresponding to XVAL."
|
||||
off = self.x_coord.get_canvas_pos(self.size[0], xval,
|
||||
self.x_range[0], self.x_range[1])
|
||||
return self.loc[0] + off
|
||||
|
||||
def y_pos(self, yval):
|
||||
"Return the y position (on the canvas) corresponding to YVAL."
|
||||
off = self.y_coord.get_canvas_pos(self.size[1], yval,
|
||||
self.y_range[0], self.y_range[1])
|
||||
return self.loc[1] + off
|
||||
|
||||
def x_tic_points(self, interval):
|
||||
"Return the list of X values for which tick marks and grid lines are drawn."
|
||||
if type(interval) == FunctionType:
|
||||
return apply(interval, self.x_range)
|
||||
|
||||
return self.x_coord.get_tics(self.x_range[0], self.x_range[1], interval)
|
||||
def y_tic_points(self, interval):
|
||||
"Return the list of Y values for which tick marks and grid lines are drawn."
|
||||
if type(interval) == FunctionType:
|
||||
return apply(interval, self.y_range)
|
||||
|
||||
return self.y_coord.get_tics(self.y_range[0], self.y_range[1], interval)
|
||||
def __draw_x_grid_and_axis(self, can):
|
||||
if self.x_grid_style:
|
||||
for i in self.x_tic_points(self.x_grid_interval):
|
||||
x = self.x_pos(i)
|
||||
if x > self.loc[0]:
|
||||
can.line(self.x_grid_style,
|
||||
x, self.loc[1], x, self.loc[1]+self.size[1])
|
||||
if self.x_axis:
|
||||
self.x_axis.draw(self, can)
|
||||
if self.x_axis2:
|
||||
self.x_axis2.draw(self, can)
|
||||
def __draw_y_grid_and_axis(self, can):
|
||||
if self.y_grid_style:
|
||||
for i in self.y_tic_points(self.y_grid_interval):
|
||||
y = self.y_pos(i)
|
||||
if y > self.loc[1]:
|
||||
can.line(self.y_grid_style,
|
||||
self.loc[0], y,
|
||||
self.loc[0]+self.size[0], y)
|
||||
if self.y_axis:
|
||||
self.y_axis.draw(self, can)
|
||||
if self.y_axis2:
|
||||
self.y_axis2.draw(self, can)
|
||||
|
||||
def __get_data_range(self, r, which, coord, interval):
|
||||
if isinstance(coord, category_coord.T):
|
||||
# This info is unused for the category coord type.
|
||||
# So I just return a random value.
|
||||
return ((0,0), 1)
|
||||
|
||||
r = r or (None, None)
|
||||
|
||||
if len(self.plots) == 0:
|
||||
raise ValueError, "No chart to draw, and no data range specified.\n";
|
||||
dmin, dmax = 999999, -999999
|
||||
|
||||
for plot in self.plots:
|
||||
this_min, this_max = plot.get_data_range(which)
|
||||
dmin = min(this_min, dmin)
|
||||
dmax = max(this_max, dmax)
|
||||
|
||||
if interval and type(interval) == FunctionType:
|
||||
tics = apply(interval, (dmin, dmax))
|
||||
dmin = tics[0]
|
||||
dmax = tics[len(tics)-1]
|
||||
else:
|
||||
dmin, dmax, interval = coord.get_min_max(dmin, dmax, interval)
|
||||
|
||||
if r[0] != None:
|
||||
dmin = r[0]
|
||||
if r[1] != None:
|
||||
dmax = r[1]
|
||||
return ((dmin, dmax), interval)
|
||||
def draw(self, can = None):
|
||||
"Draw the charts."
|
||||
|
||||
if can == None:
|
||||
can = canvas.default_canvas()
|
||||
|
||||
self.type_check()
|
||||
for plot in self.plots:
|
||||
plot.check_integrity()
|
||||
|
||||
self.x_range, self.x_grid_interval = \
|
||||
self.__get_data_range(self.x_range, 'X',
|
||||
self.x_coord,
|
||||
self.x_grid_interval)
|
||||
|
||||
self.y_range, self.y_grid_interval = \
|
||||
self.__get_data_range(self.y_range, 'Y',
|
||||
self.y_coord,
|
||||
self.y_grid_interval)
|
||||
|
||||
can.rectangle(self.border_line_style, self.bg_style,
|
||||
self.loc[0], self.loc[1],
|
||||
self.loc[0] + self.size[0], self.loc[1] + self.size[1])
|
||||
|
||||
if not self.x_grid_over_plot:
|
||||
self.__draw_x_grid_and_axis(can)
|
||||
|
||||
if not self.y_grid_over_plot:
|
||||
self.__draw_y_grid_and_axis(can)
|
||||
|
||||
clipbox = theme.adjust_bounding_box([self.loc[0], self.loc[1],
|
||||
self.loc[0] + self.size[0],
|
||||
self.loc[1] + self.size[1]])
|
||||
|
||||
can.clip(clipbox[0], clipbox[1],
|
||||
clipbox[2], clipbox[3])
|
||||
|
||||
for plot in self.plots:
|
||||
plot.draw(self, can)
|
||||
|
||||
can.endclip()
|
||||
|
||||
if self.x_grid_over_plot:
|
||||
self.__draw_x_grid_and_axis(can)
|
||||
if self.y_grid_over_plot:
|
||||
self.__draw_y_grid_and_axis(can)
|
||||
|
||||
if self.legend == _dummy_legend:
|
||||
self.legend = legend.T()
|
||||
|
||||
if self.legend:
|
||||
legends = []
|
||||
for plot in self.plots:
|
||||
entry = plot.get_legend_entry()
|
||||
if entry == None:
|
||||
pass
|
||||
elif type(entry) != ListType:
|
||||
legends.append(entry)
|
||||
else:
|
||||
for e in entry:
|
||||
legends.append(e)
|
||||
self.legend.draw(self, legends, can)
|
||||
|
||||
def add_plot(self, *plots):
|
||||
"Add PLOTS... to the area."
|
||||
self.plots.extend(plots)
|
|
@ -1,63 +0,0 @@
|
|||
# automatically generated by generate_docs.py.
|
||||
doc="""Attributes supported by this class are:
|
||||
plots(type:list) default="Used only internally by pychart.".
|
||||
loc(type:(x,y)) default="The location of the bottom-left corner of the chart.
|
||||
@cindex chart location
|
||||
@cindex location, chart
|
||||
".
|
||||
y_grid_style(type:line_style.T) default="The style of vertical grid lines.".
|
||||
y_grid_interval(type:Number or function) default="The vertical grid-line interval. See also x_grid_interval".
|
||||
x_grid_over_plot(type:int) default="If True, grid lines are drawn over plots. Otherwise, plots are drawn over grid lines.".
|
||||
x_range(type:(x,y)) default="Specifies the range of X values that are displayed in the
|
||||
chart. IF the value is None, both the values are computed
|
||||
automatically from the samples. Otherwise, the value must be a
|
||||
tuple of format (MIN, MAX). MIN and MAX must be either None or a
|
||||
number. If None, the value is computed automatically from the
|
||||
samples. For example, if x_range = (None,5), then the minimum X
|
||||
value is computed automatically, but the maximum X value is fixed
|
||||
at 5.".
|
||||
y_coord(type:coord.T) default="Set the Y coordinate system.".
|
||||
A linear coordinate system.
|
||||
|
||||
y_range(type:(x,y)) default="Specifies the range of Y values that are displayed in the
|
||||
chart. IF the value is None, both the values are computed
|
||||
automatically from the samples. Otherwise, the value must be a
|
||||
tuple of format (MIN, MAX). MIN and MAX must be either None or a
|
||||
number. If None, the value is computed automatically from the
|
||||
samples. For example, if y_range = (None,5), then the minimum Y
|
||||
value is computed automatically, but the maximum Y value is fixed
|
||||
at 5.".
|
||||
x_axis(type:axis.X) default="The X axis. <<axis>>.".
|
||||
bg_style(type:fill_style.T) default="Background fill-pattern.".
|
||||
x_coord(type:coord.T) default="Set the X coordinate system.".
|
||||
A linear coordinate system.
|
||||
|
||||
legend(type:legend.T) default="The legend of the chart.".
|
||||
a legend is by default displayed in the right-center of the
|
||||
chart.
|
||||
|
||||
y_grid_over_plot(type:int) default="See x_grid_over_plot.".
|
||||
x_axis2(type:axis.X) default="The second X axis. This axis should be non-None either when you want to display plots with two distinct domains or when
|
||||
you just want to display two axes at the top and bottom of the chart.
|
||||
<<axis>>".
|
||||
y_axis2(type:axis.Y) default="The second Y axis. This axis should be non-None either when you want to display plots with two distinct ranges or when
|
||||
you just want to display two axes at the left and right of the chart. <<axis>>".
|
||||
x_grid_style(type:line_style.T) default="The style of horizontal grid lines.
|
||||
@cindex grid lines".
|
||||
y_axis(type:axis.Y) default="The Y axis. <<axis>>.".
|
||||
border_line_style(type:line_style.T) default="Line style of the outer frame of the chart.".
|
||||
x_grid_interval(type:Number or function) default="The horizontal grid-line interval.
|
||||
A numeric value
|
||||
specifies the interval at which
|
||||
lines are drawn. If value is a function, it
|
||||
takes two arguments, (MIN, MAX), that tells
|
||||
the minimum and maximum values found in the
|
||||
sample data. The function should return a list
|
||||
of values at which lines are drawn.".
|
||||
size(type:(x,y)) default="The size of the chart-drawing area, excluding axis labels,
|
||||
legends, tick marks, etc.
|
||||
@cindex chart size
|
||||
@cindex size, chart
|
||||
".
|
||||
"""
|
||||
|
|
@ -1,184 +0,0 @@
|
|||
#
|
||||
# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
|
||||
#
|
||||
# Jockey 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, or (at your option) any
|
||||
# later version.
|
||||
#
|
||||
# Jockey 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.
|
||||
#
|
||||
import line_style
|
||||
import color
|
||||
import chart_object
|
||||
import object_set
|
||||
import math
|
||||
import arrow_doc
|
||||
import canvas
|
||||
|
||||
from pychart_types import *
|
||||
from types import *
|
||||
from scaling import *
|
||||
|
||||
__doc__ = """
|
||||
Arrow is an optional component of a chart that draws line segments with
|
||||
an arrowhead. To draw an arrow, one creates an arrow.T object, and calls
|
||||
its "draw" method usually after area.draw() is called (otherwise, area.draw()
|
||||
may overwrite the arrow). For example, the below code draws an arrow
|
||||
from (10,10) to (20,30).
|
||||
|
||||
ar = area.T(...)
|
||||
a = arrow.T(head_style = 1)
|
||||
ar.draw()
|
||||
a.draw([(10,10), (20,30)])
|
||||
"""
|
||||
|
||||
def draw_arrowhead(can, tailx, taily, tipx, tipy, thickness, head_len, style):
|
||||
can.comment("ARROWHEAD tail=(%d,%d) tip=(%d,%d)\n"
|
||||
% (tailx, taily, tipx, tipy))
|
||||
|
||||
halfthickness = thickness/2.0
|
||||
dx = tipx - tailx
|
||||
dy = tipy - taily
|
||||
arrow_len = math.sqrt(dx*dx + dy*dy)
|
||||
angle = math.atan2(dy, dx) * 360 / (2*math.pi)
|
||||
base = arrow_len - head_len
|
||||
can.push_transformation((tailx, taily), None, angle)
|
||||
|
||||
can.newpath()
|
||||
if style == 0:
|
||||
can.moveto(base, - halfthickness)
|
||||
can.lineto(base, halfthickness)
|
||||
can.lineto(arrow_len, 0)
|
||||
can.closepath()
|
||||
elif style == 1:
|
||||
depth = head_len / 2.5
|
||||
can.moveto(base - depth, -halfthickness)
|
||||
can.lineto(base, 0)
|
||||
can.lineto(base - depth, halfthickness)
|
||||
can.lineto(arrow_len, 0)
|
||||
can.closepath()
|
||||
elif style == 2:
|
||||
can.moveto(base + head_len/2.0, 0)
|
||||
can.path_arc(base + head_len / 2.0, 0, head_len / 2.0, 1.0, 0, 400)
|
||||
elif style == 3:
|
||||
can.moveto(base, 0)
|
||||
can.lineto(base + head_len/2.0, -halfthickness)
|
||||
can.lineto(arrow_len, 0)
|
||||
can.lineto(base + head_len/2.0, halfthickness)
|
||||
can.closepath()
|
||||
else:
|
||||
raise Exception, "Arrow style must be a number between 0 and 3."
|
||||
can.fill()
|
||||
can.pop_transformation()
|
||||
can.comment("end ARROWHEAD.\n")
|
||||
|
||||
def draw_arrowbody(can, tailx, taily, tipx, tipy, head_len):
|
||||
dx = tipx - tailx
|
||||
dy = tipy - taily
|
||||
arrow_len = math.sqrt(dx*dx + dy*dy)
|
||||
angle = math.atan2(dy, dx) * 360 / (2*math.pi)
|
||||
base = arrow_len - head_len
|
||||
can.push_transformation((tailx, taily), None, angle)
|
||||
can.moveto(0, 0)
|
||||
can.lineto(base+head_len*0.1, 0)
|
||||
can.stroke()
|
||||
can.pop_transformation()
|
||||
|
||||
|
||||
class T(chart_object.T):
|
||||
__doc__ = arrow_doc.doc
|
||||
keys = {
|
||||
"thickness" : (UnitType, 4,
|
||||
"The width of the arrow head."),
|
||||
"head_len": (UnitType, 8,
|
||||
"The length of the arrow head."),
|
||||
"head_color": (color.T, color.default,
|
||||
"The color of the arrow head."),
|
||||
"line_style": (line_style.T, line_style.default,
|
||||
"Line style."),
|
||||
"head_style": (IntType, 1,
|
||||
"The value of 0 draws a triangular arrow head. The value of 1 draws a swallow-tail arrow head. The value of 2 draws a circular head. The value of 3 draws a diamond-shaped head.")
|
||||
}
|
||||
##AUTOMATICALLY GENERATED
|
||||
|
||||
##END AUTOMATICALLY GENERATED
|
||||
def draw(self, points, can = None):
|
||||
"""Parameter <points> specifies the
|
||||
list of points the arrow traverses through.
|
||||
It should contain at least two points, i.e.,
|
||||
the tail and tip. Parameter
|
||||
<can> is an optional parameter that specifies the output.
|
||||
<<canvas>>
|
||||
"""
|
||||
if can == None: can = canvas.default_canvas()
|
||||
self.type_check()
|
||||
xtip = points[-1][0]
|
||||
ytip = points[-1][1]
|
||||
|
||||
xtail = points[-2][0]
|
||||
ytail = points[-2][1]
|
||||
|
||||
can.newpath()
|
||||
can.set_line_style(self.line_style)
|
||||
if len(points) > 2:
|
||||
can.moveto(points[0][0], points[0][1])
|
||||
for i in range(1, len(points)-1):
|
||||
can.lineto(points[i][0], points[i][1])
|
||||
|
||||
draw_arrowbody(can, xscale(xtail), yscale(ytail),
|
||||
yscale(xtip), yscale(ytip),
|
||||
nscale(self.head_len))
|
||||
|
||||
can.set_fill_color(self.head_color)
|
||||
draw_arrowhead(can, xscale(xtail), yscale(ytail),
|
||||
xscale(xtip), yscale(ytip),
|
||||
nscale(self.thickness),
|
||||
nscale(self.head_len),
|
||||
self.head_style)
|
||||
|
||||
can.setbb(xtail, ytail)
|
||||
can.setbb(xtip, ytip)
|
||||
|
||||
standards = object_set.T()
|
||||
def _intern(a):
|
||||
global standards
|
||||
standards.add(a)
|
||||
return a
|
||||
|
||||
a0 = _intern(T(head_style=0))
|
||||
a1 = _intern(T(head_style=1))
|
||||
a2 = _intern(T(head_style=2))
|
||||
a3 = _intern(T(head_style=3))
|
||||
gray0 = _intern(T(head_style=0, head_color = color.gray50,
|
||||
line_style=line_style.T(color=color.gray50)))
|
||||
gray1 = _intern(T(head_style=1, head_color = color.gray50,
|
||||
line_style=line_style.T(color=color.gray50)))
|
||||
gray2 = _intern(T(head_style=2, head_color = color.gray50,
|
||||
line_style=line_style.T(color=color.gray50)))
|
||||
gray3 = _intern(T(head_style=3, head_color = color.gray50,
|
||||
line_style=line_style.T(color=color.gray50)))
|
||||
|
||||
fat0 = _intern(T(head_style=0, head_len=12, thickness=10, line_style=line_style.T(width=2)))
|
||||
fat1 = _intern(T(head_style=1, head_len=12, thickness=10, line_style=line_style.T(width=2)))
|
||||
fat2 = _intern(T(head_style=2, head_len=12, thickness=10, line_style=line_style.T(width=2)))
|
||||
fat3 = _intern(T(head_style=3, head_len=12, thickness=10, line_style=line_style.T(width=2)))
|
||||
fatgray0 = _intern(T(head_style=0, head_len=12, thickness=10,
|
||||
head_color = color.gray50,
|
||||
line_style=line_style.T(width=2, color=color.gray50)))
|
||||
fatgray1 = _intern(T(head_style=1, head_len=12, thickness=10,
|
||||
head_color = color.gray50,
|
||||
line_style=line_style.T(width=2, color=color.gray50)))
|
||||
fatgray2 = _intern(T(head_style=2, head_len=12, thickness=10,
|
||||
head_color = color.gray50,
|
||||
line_style=line_style.T(width=2, color=color.gray50)))
|
||||
fatgray3 = _intern(T(head_style=3, head_len=12, thickness=10,
|
||||
head_color = color.gray50,
|
||||
line_style=line_style.T(width=2, color=color.gray50)))
|
||||
|
||||
default = a1
|
||||
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
# automatically generated by generate_docs.py.
|
||||
doc="""Attributes supported by this class are:
|
||||
head_color(type:color.T) default="The color of the arrow head.".
|
||||
head_style(type:int) default="The value of 0 draws a triangular arrow head. The value of 1 draws a swallow-tail arrow head. The value of 2 draws a circular head. The value of 3 draws a diamond-shaped head.".
|
||||
head_len(type:length in points (\\xref{unit})) default="The length of the arrow head.".
|
||||
line_style(type:line_style.T) default="Line style.".
|
||||
thickness(type:length in points (\\xref{unit})) default="The width of the arrow head.".
|
||||
"""
|
||||
|
|
@ -1,241 +0,0 @@
|
|||
#
|
||||
# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
|
||||
#
|
||||
# Jockey 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, or (at your option) any
|
||||
# later version.
|
||||
#
|
||||
# Jockey 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.
|
||||
#
|
||||
import font
|
||||
import pychart_util
|
||||
import chart_object
|
||||
import line_style
|
||||
import math
|
||||
import theme
|
||||
import axis_doc
|
||||
from pychart_types import *
|
||||
from types import *
|
||||
|
||||
class T(chart_object.T):
|
||||
keys = {
|
||||
"tic_interval" : (IntervalType, None,
|
||||
pychart_util.interval_desc("tick marks")),
|
||||
"tic_len" : (UnitType, 6, """The length of tick lines. The value can be negative, in which case the tick lines are drawn right of (or above) the axis."""),
|
||||
"minor_tic_interval" : (IntervalType, None,
|
||||
pychart_util.interval_desc("minor tick marks")),
|
||||
"minor_tic_len" : (UnitType, 3, """The length of minor tick marks. The value can be negative, in which case the tick lines are drawn right of (or above) the axis."""),
|
||||
"line_style": (line_style.T, line_style.default,
|
||||
"Specifies the style of axis and tick lines."),
|
||||
"label": (types.StringType, "axis label",
|
||||
"The descriptive string displayed below (or to the left of) the axis. <<font>>."),
|
||||
"format": (FormatType, "%s",
|
||||
"""The format string for tick labels.
|
||||
It can be a `printf' style format string, or
|
||||
a single-parameter function that takes an X (or Y) value
|
||||
and returns a string. """ +
|
||||
pychart_util.string_desc),
|
||||
"label_offset": (CoordOrNoneType, (None,None),
|
||||
"""The location for drawing the axis label,
|
||||
relative to the middle point of the axis.
|
||||
If the value is None, the label is displayed
|
||||
below (or to the left of) of axis at the middle."""),
|
||||
"tic_label_offset": (CoordType, (0,0),
|
||||
"""The location for drawing tick labels,
|
||||
relative to the tip of the tick line."""),
|
||||
"offset": (UnitType, 0,
|
||||
"""The location of the axis.
|
||||
The value of 0 draws the
|
||||
axis at the left (for the Y axis) or bottom (for the X axis)
|
||||
edge of the drawing area.
|
||||
""")
|
||||
}
|
||||
|
||||
class X(T):
|
||||
keys = pychart_util.union_dict(T.keys,
|
||||
{"draw_tics_above": (IntType, 0,
|
||||
"If true, tick lines and labels are drawn above the axis line.")})
|
||||
__doc__ = axis_doc.doc_x
|
||||
##AUTOMATICALLY GENERATED
|
||||
|
||||
##END AUTOMATICALLY GENERATED
|
||||
def draw_below(self, ar, can):
|
||||
self.type_check()
|
||||
self.tic_interval = self.tic_interval or ar.x_grid_interval
|
||||
y_base = ar.loc[1] + self.offset
|
||||
|
||||
can.line(self.line_style, ar.loc[0], y_base,
|
||||
ar.loc[0]+ ar.size[0], y_base)
|
||||
|
||||
tic_dic = {}
|
||||
max_tic_height = 0
|
||||
|
||||
for i in ar.x_tic_points(self.tic_interval):
|
||||
tic_dic[i] = 1
|
||||
ticx = ar.x_pos(i)
|
||||
|
||||
str = "/hC" + pychart_util.apply_format(self.format, (i, ), 0)
|
||||
|
||||
(total_height, base_height) = font.text_height(str)
|
||||
max_tic_height = max(max_tic_height, total_height)
|
||||
|
||||
can.line(self.line_style, ticx, y_base, ticx, y_base-self.tic_len)
|
||||
can.show(ticx+self.tic_label_offset[0],
|
||||
y_base-self.tic_len-base_height+self.tic_label_offset[1],
|
||||
str)
|
||||
|
||||
if self.minor_tic_interval:
|
||||
for i in ar.x_tic_points(self.minor_tic_interval):
|
||||
if tic_dic.has_key(i):
|
||||
# a major tic was drawn already.
|
||||
pass
|
||||
else:
|
||||
ticx = ar.x_pos(i)
|
||||
can.line(self.line_style, ticx, y_base, ticx,
|
||||
y_base-self.minor_tic_len)
|
||||
|
||||
self.draw_label(ar, can, y_base - self.tic_len - max_tic_height - 10)
|
||||
|
||||
def draw_above(self, ar, can):
|
||||
y_base = ar.loc[1] + self.offset
|
||||
|
||||
tic_dic = {}
|
||||
max_tic_height = 0
|
||||
|
||||
for i in ar.x_tic_points(self.tic_interval):
|
||||
tic_dic[i] = 1
|
||||
ticx = ar.x_pos(i)
|
||||
|
||||
str = "/hC" + pychart_util.apply_format(self.format, (i, ), 0)
|
||||
|
||||
(total_height, base_height) = font.text_height(str)
|
||||
max_tic_height = max(max_tic_height, total_height)
|
||||
|
||||
can.line(self.line_style, ticx, y_base, ticx, y_base + self.tic_len)
|
||||
can.show(ticx+self.tic_label_offset[0],
|
||||
y_base + self.tic_len + base_height + self.tic_label_offset[1],
|
||||
str)
|
||||
|
||||
if self.minor_tic_interval:
|
||||
for i in ar.x_tic_points(self.minor_tic_interval):
|
||||
if tic_dic.has_key(i):
|
||||
# a major tic was drawn already.
|
||||
pass
|
||||
else:
|
||||
ticx = ar.x_pos(i)
|
||||
can.line(self.line_style, ticx, y_base, ticx,
|
||||
y_base + self.minor_tic_len)
|
||||
self.draw_label(ar, can, y_base + self.tic_len + max_tic_height + 10)
|
||||
|
||||
def draw_label(self, ar, can, ylabel):
|
||||
if self.label == None: return
|
||||
|
||||
str = "/hC/vM" + self.label
|
||||
(label_height, base_height) = font.text_height(str)
|
||||
xlabel = ar.loc[0] + ar.size[0]/2.0
|
||||
if self.label_offset[0] != None:
|
||||
xlabel += self.label_offset[0]
|
||||
if self.label_offset[1] != None:
|
||||
ylabel += self.label_offset[1]
|
||||
can.show(xlabel, ylabel, str)
|
||||
|
||||
def draw(self, ar, can):
|
||||
self.type_check()
|
||||
self.tic_interval = self.tic_interval or ar.x_grid_interval
|
||||
y_base = ar.loc[1] + self.offset
|
||||
can.line(self.line_style, ar.loc[0], y_base,
|
||||
ar.loc[0]+ ar.size[0], y_base)
|
||||
if self.draw_tics_above:
|
||||
self.draw_above(ar, can)
|
||||
else:
|
||||
self.draw_below(ar, can)
|
||||
class Y(T):
|
||||
__doc__ = axis_doc.doc_y
|
||||
keys = pychart_util.union_dict(T.keys,
|
||||
{"draw_tics_right": (IntType, 0,
|
||||
"If true, tick lines and labels are drawn right of the axis line.")})
|
||||
|
||||
def draw_left(self, ar, can):
|
||||
x_base = ar.loc[0] + self.offset
|
||||
xmin = 999999
|
||||
tic_dic = {}
|
||||
for i in ar.y_tic_points(self.tic_interval):
|
||||
y_tic = ar.y_pos(i)
|
||||
tic_dic[i] = 1
|
||||
can.line(self.line_style, x_base, y_tic,
|
||||
x_base - self.tic_len, y_tic)
|
||||
str = pychart_util.apply_format(self.format, (i,), 0)
|
||||
if self.tic_len > 0: str = "/hR" + str
|
||||
|
||||
tic_height, base_height = font.text_height(str)
|
||||
x = x_base - self.tic_len + self.tic_label_offset[0]
|
||||
can.show(x, y_tic - tic_height/2.0 + self.tic_label_offset[1],
|
||||
str)
|
||||
xmin = min(xmin, x - font.text_width(str))
|
||||
|
||||
if self.minor_tic_interval:
|
||||
for i in ar.y_tic_points(self.minor_tic_interval):
|
||||
if tic_dic.has_key(i):
|
||||
# a major tic line was drawn already.
|
||||
pass
|
||||
else:
|
||||
y_tic = ar.y_pos(i)
|
||||
can.line(self.line_style, x_base, y_tic,
|
||||
x_base - self.minor_tic_len, y_tic)
|
||||
|
||||
self.draw_label(ar, can, xmin - theme.default_font_size/2.0)
|
||||
|
||||
def draw_right(self, ar, can):
|
||||
x_base = ar.loc[0] + self.offset
|
||||
xmax = 0
|
||||
tic_dic = {}
|
||||
for i in ar.y_tic_points(self.tic_interval):
|
||||
y_tic = ar.y_pos(i)
|
||||
tic_dic[i] = 1
|
||||
can.line(self.line_style, x_base, y_tic,
|
||||
x_base + self.tic_len, y_tic)
|
||||
str = pychart_util.apply_format(self.format, (i,), 0)
|
||||
if self.tic_len > 0: str = "/hL" + str
|
||||
|
||||
tic_height, base_height = font.text_height(str)
|
||||
x = x_base + self.tic_len + self.tic_label_offset[0]
|
||||
can.show(x, y_tic - tic_height/2.0 + self.tic_label_offset[1],
|
||||
str)
|
||||
xmax = max(xmax, x + font.text_width(str))
|
||||
|
||||
if self.minor_tic_interval:
|
||||
for i in ar.y_tic_points(self.minor_tic_interval):
|
||||
if tic_dic.has_key(i):
|
||||
# a major tic line was drawn already.
|
||||
pass
|
||||
else:
|
||||
y_tic = ar.y_pos(i)
|
||||
can.line(self.line_style, x_base, y_tic,
|
||||
x_base + self.minor_tic_len, y_tic)
|
||||
|
||||
self.draw_label(ar, can, xmax + theme.default_font_size)
|
||||
|
||||
def draw_label(self, ar, can, xlabel):
|
||||
if self.label == None:
|
||||
return
|
||||
ylabel = ar.loc[1] + ar.size[1] / 2
|
||||
if self.label_offset[0] != None:
|
||||
xlabel += self.label_offset[0]
|
||||
if self.label_offset[1] != None:
|
||||
ylabel += self.label_offset[1]
|
||||
can.show(xlabel, ylabel, "/a90/hC" + self.label)
|
||||
|
||||
def draw(self, ar, can):
|
||||
self.type_check()
|
||||
self.tic_interval = self.tic_interval or ar.y_grid_interval
|
||||
|
||||
x_base = ar.loc[0] + self.offset
|
||||
can.line(self.line_style, x_base, ar.loc[1], x_base, ar.loc[1]+ar.size[1])
|
||||
if self.draw_tics_right:
|
||||
self.draw_right(ar, can)
|
||||
else:
|
||||
self.draw_left(ar, can)
|
|
@ -1,53 +0,0 @@
|
|||
# automatically generated by generate_docs.py.
|
||||
doc_x="""Attributes supported by this class are:
|
||||
draw_tics_above(type:int) default="If true, tick lines and labels are drawn above the axis line.".
|
||||
minor_tic_len(type:length in points (\\xref{unit})) default="The length of minor tick marks. The value can be negative, in which case the tick lines are drawn right of (or above) the axis.".
|
||||
tic_label_offset(type:(x,y)) default="The location for drawing tick labels,
|
||||
relative to the tip of the tick line.".
|
||||
format(type:printf format string) default="The format string for tick labels.
|
||||
It can be a `printf' style format string, or
|
||||
a single-parameter function that takes an X (or Y) value
|
||||
and returns a string. The appearance of the string produced here can be
|
||||
controlled using escape sequences. <<font>>".
|
||||
label_offset(type:(x,y) or None) default="The location for drawing the axis label,
|
||||
relative to the middle point of the axis.
|
||||
If the value is None, the label is displayed
|
||||
below (or to the left of) of axis at the middle.".
|
||||
label(type:str) default="The descriptive string displayed below (or to the left of) the axis. <<font>>.".
|
||||
offset(type:length in points (\\xref{unit})) default="The location of the axis.
|
||||
The value of 0 draws the
|
||||
axis at the left (for the Y axis) or bottom (for the X axis)
|
||||
edge of the drawing area.
|
||||
".
|
||||
tic_interval(type:Number or function) default="When the value is a number, it specifies the interval at which tick marks are drawn. Otherwise, the value must be a function that takes no argument and returns the list of numbers. The return value specifies the X or Y points at which tick marks are drawn.".
|
||||
line_style(type:line_style.T) default="Specifies the style of axis and tick lines.".
|
||||
tic_len(type:length in points (\\xref{unit})) default="The length of tick lines. The value can be negative, in which case the tick lines are drawn right of (or above) the axis.".
|
||||
minor_tic_interval(type:Number or function) default="When the value is a number, it specifies the interval at which minor tick marks are drawn. Otherwise, the value must be a function that takes no argument and returns the list of numbers. The return value specifies the X or Y points at which minor tick marks are drawn.".
|
||||
"""
|
||||
|
||||
doc_y="""Attributes supported by this class are:
|
||||
draw_tics_right(type:int) default="If true, tick lines and labels are drawn right of the axis line.".
|
||||
minor_tic_len(type:length in points (\\xref{unit})) default="The length of minor tick marks. The value can be negative, in which case the tick lines are drawn right of (or above) the axis.".
|
||||
tic_label_offset(type:(x,y)) default="The location for drawing tick labels,
|
||||
relative to the tip of the tick line.".
|
||||
format(type:printf format string) default="The format string for tick labels.
|
||||
It can be a `printf' style format string, or
|
||||
a single-parameter function that takes an X (or Y) value
|
||||
and returns a string. The appearance of the string produced here can be
|
||||
controlled using escape sequences. <<font>>".
|
||||
label_offset(type:(x,y) or None) default="The location for drawing the axis label,
|
||||
relative to the middle point of the axis.
|
||||
If the value is None, the label is displayed
|
||||
below (or to the left of) of axis at the middle.".
|
||||
label(type:str) default="The descriptive string displayed below (or to the left of) the axis. <<font>>.".
|
||||
offset(type:length in points (\\xref{unit})) default="The location of the axis.
|
||||
The value of 0 draws the
|
||||
axis at the left (for the Y axis) or bottom (for the X axis)
|
||||
edge of the drawing area.
|
||||
".
|
||||
tic_interval(type:Number or function) default="When the value is a number, it specifies the interval at which tick marks are drawn. Otherwise, the value must be a function that takes no argument and returns the list of numbers. The return value specifies the X or Y points at which tick marks are drawn.".
|
||||
line_style(type:line_style.T) default="Specifies the style of axis and tick lines.".
|
||||
tic_len(type:length in points (\\xref{unit})) default="The length of tick lines. The value can be negative, in which case the tick lines are drawn right of (or above) the axis.".
|
||||
minor_tic_interval(type:Number or function) default="When the value is a number, it specifies the interval at which minor tick marks are drawn. Otherwise, the value must be a function that takes no argument and returns the list of numbers. The return value specifies the X or Y points at which minor tick marks are drawn.".
|
||||
"""
|
||||
|
|
@ -1,65 +0,0 @@
|
|||
#
|
||||
# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
|
||||
#
|
||||
# Jockey 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, or (at your option) any
|
||||
# later version.
|
||||
#
|
||||
# Jockey 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.
|
||||
#
|
||||
doc="""Attributes supported by this class are:
|
||||
tic_label_offset(type:(x,y)):
|
||||
The location where the tick labels is drawn. Relative to the
|
||||
tip of the tick mark.
|
||||
default value=(0, 0).
|
||||
format(type:printf format string):
|
||||
The format string for tick labels. It can be a `printf' style
|
||||
format string, or a single-parameter function that returns a
|
||||
string. See also font.
|
||||
default value=%s.
|
||||
minor_tic_len(type:number):
|
||||
The length of minor tick marks.
|
||||
default value=3.
|
||||
label_offset(type:(x,y) or None):
|
||||
The location where the axis label is drawn. Relative to the
|
||||
left-bottom corner of the axis.
|
||||
default value=(None, None).
|
||||
grid_interval(type:Number or function):
|
||||
When the value is a number, it specifies the interval with which
|
||||
grid lines are drawn. Otherwise, the value must be a function.
|
||||
It must take no argument and return the list of numbers, which
|
||||
specifies the X or Y points where grid lines are drawn.
|
||||
default value=None.
|
||||
label(type:str):
|
||||
The description of the axis. See also font.
|
||||
default value=axis label.
|
||||
grid_style(type:line_style.T):
|
||||
The style of grid lines.
|
||||
default value=None.
|
||||
tic_interval(type:Number or function):
|
||||
When the value is a number, it specifies the interval with which
|
||||
tick marks are drawn. Otherwise, the value must be a function.
|
||||
It must take no argument and return the list of numbers, which
|
||||
specifies the X or Y points where tick marks are drawn.
|
||||
default value=None.
|
||||
line_style(type:line_style.T):
|
||||
The style of tick lines.
|
||||
default value=default.
|
||||
tic_len(type:number):
|
||||
The length of tick lines
|
||||
default value=6.
|
||||
minor_tic_interval(type:Number or function):
|
||||
When the value is a number, it specifies the interval with which
|
||||
minor tick marks are drawn. Otherwise, the value must be a function.
|
||||
It must take no argument and return the list of numbers, which
|
||||
specifies the X or Y points where minor tick marks are drawn.
|
||||
default value=None.
|
||||
first_tic_value(type:number):
|
||||
The location of the first tick mark. Defaults to the x_range[0]
|
||||
(or y_range[0]) of the area.
|
||||
default value=None.
|
||||
"""
|
|
@ -1,65 +0,0 @@
|
|||
#
|
||||
# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
|
||||
#
|
||||
# Jockey 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, or (at your option) any
|
||||
# later version.
|
||||
#
|
||||
# Jockey 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.
|
||||
#
|
||||
doc="""Attributes supported by this class are:
|
||||
minor_tic_len(type:number):
|
||||
The length of minor tick marks.
|
||||
default value=3.
|
||||
tic_label_offset(type:(x,y)):
|
||||
The location where the tick labels is drawn. Relative to the
|
||||
tip of the tick mark.
|
||||
default value=(0, 0).
|
||||
format(type:printf format string):
|
||||
The format string for tick labels. It can be a `printf' style
|
||||
format string, or a single-parameter function that returns a
|
||||
string. See also font.
|
||||
default value=%s.
|
||||
label_offset(type:(x,y) or None):
|
||||
The location where the axis label is drawn. Relative to the
|
||||
left-bottom corner of the axis.
|
||||
default value=(None, None).
|
||||
grid_interval(type:Number or function):
|
||||
When the value is a number, it specifies the interval with which
|
||||
grid lines are drawn. Otherwise, the value must be a function.
|
||||
It must take no argument and return the list of numbers, which
|
||||
specifies the X or Y points where grid lines are drawn.
|
||||
default value=None.
|
||||
tic_len(type:number):
|
||||
The length of tick lines
|
||||
default value=6.
|
||||
grid_style(type:line_style.T):
|
||||
|
||||
default value=gray70dash3.
|
||||
tic_interval(type:Number or function):
|
||||
When the value is a number, it specifies the interval with which
|
||||
tick marks are drawn. Otherwise, the value must be a function.
|
||||
It must take no argument and return the list of numbers, which
|
||||
specifies the X or Y points where tick marks are drawn.
|
||||
default value=None.
|
||||
line_style(type:line_style.T):
|
||||
The style of tick lines.
|
||||
default value=default.
|
||||
label(type:str):
|
||||
The description of the axis. See also font.
|
||||
default value=axis label.
|
||||
minor_tic_interval(type:Number or function):
|
||||
When the value is a number, it specifies the interval with which
|
||||
minor tick marks are drawn. Otherwise, the value must be a function.
|
||||
It must take no argument and return the list of numbers, which
|
||||
specifies the X or Y points where minor tick marks are drawn.
|
||||
default value=None.
|
||||
first_tic_value(type:number):
|
||||
The location of the first tick mark. Defaults to the x_range[0]
|
||||
(or y_range[0]) of the area.
|
||||
default value=None.
|
||||
"""
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue