0% found this document useful (0 votes)
94 views

Dia Orgchart

This document describes a Python program that imports organization chart data from a CSV file into a Dia diagram. The CSV file should have two columns, with the first containing box names and the second containing the parent box name or being empty if there is no parent. The program sorts the CSV data, creates objects for each box and connects them in a hierarchical structure in the diagram. It also centers parent boxes over child boxes and updates connecting lines.

Uploaded by

ax33m144
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
94 views

Dia Orgchart

This document describes a Python program that imports organization chart data from a CSV file into a Dia diagram. The CSV file should have two columns, with the first containing box names and the second containing the parent box name or being empty if there is no parent. The program sorts the CSV data, creates objects for each box and connects them in a hierarchical structure in the diagram. It also centers parent boxes over child boxes and updates connecting lines.

Uploaded by

ax33m144
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 2

#

#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#

PyDia CSV Organization Chart Import


Copyright (c) 2010 Steffen Macke <[email protected]>
First column should contain the box content
Second column should contain a reference (name) to the parent box
If the second column is empty, there is no parent
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA

import string, math, os


class OrgchartImporter :
def __init__(self) :
self.errors = {}
self.objects = []
def Parse(self, sFile) :
import csv, codecs
csvReader = csv.reader(open(sFile, 'rb'), delimiter=';')
table = []
y = 0
ready = []
for row in csvReader:
table.append((unicode(row[1], 'ISO-8859-14').encode('utf
-8'),unicode(row[0], 'ISO-8859-14').encode('utf-8')))
edges = []
left = {}
right = {}
table.sort() # comment this out if you want the order from the C
SV
while len(table) > 0 :
row = []
for t in table :
if t[0] not in [l[1] for l in table]:
row.append(t)
x = -len(row)*5
for t in row:
o, h1, h2 = dia.get_object_type('Flowchart - Box
').create (1, 1)
o.properties['text'] = t[1]
o.move(x, y)
left[t[1]] = x
right[t[1]] = x
for p in self.objects:
if p.properties['text'].value.text == t[
0] :
left[t[0]] = min(left[t[0]], x)

right[t[0]] = max(right[t[0]], x
)
edgeType = dia.get_object_type('
Standard - ZigZagLine')
con, h1, h2 = edgeType.create(x,
y)
h = con.handles[0]
pos = o.connections[2].pos
con.move_handle(h, pos, 0, 0)
h.connect(o.connections[2])
h = con.handles[1]
pos = p.connections[13].pos
con.move_handle(h, pos, 0, 0)
h.connect (p.connections[13])
edges.append(con)
self.objects.append(o)
x = x + 20
table.remove(t)
y = y + 10
for edge in edges:
self.objects.append(edge)
# center parents over children
for o in self.objects:
if 'text' in o.properties.keys() and o.properties['text'
].value.text in right:
y = (o.bounding_box.bottom + o.bounding_box.top)
/2
x = (right[o.properties['text'].value.text] + le
ft[o.properties['text'].value.text])/2
o.move(x,y)
# update connecting lines
for l in self.objects:
if l.type.name == 'Standard - ZigZagLine':
h = l.handles[0]
pos = h.connected_to.object.connections[2].pos
l.move_handle(h, pos, 0, 0)
h = l.handles[1]
pos = h.connected_to.object.connections[13].pos
l.move_handle(h, pos, 0, 0)
def Render(self,data) :
layer = data.active_layer
for o in self.objects :
layer.add_object(o)
data.update_extents ()
def import_csv(sFile, diagramData) :
imp = OrgchartImporter()
f = open(sFile)
imp.Parse(sFile)
return imp.Render(diagramData)
import dia
dia.register_import("CSV Organization Chart", "csv", import_csv);

You might also like