Newer
Older
###########################################################################
#
# lgfilter.py
# - Warning: this assumes that edges and nodes have a single label.
#
# Author: R. Zanibbi, March 2013
# Copyright (c) 2012-2014 Richard Zanibbi and Harold Mouchere
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
###########################################################################
import sys
from lg import *
def main():
if (len(sys.argv) < 2):
print("Usage: python lgfilter.py <infile> [outfile]")
print("")
print("Removes non-tree edges in the graph (assuming a tree is present!)")
print("and produces an .lg file with objects and relationships defined")
print("at the bottom of the file.")
print("")
print("Warning: this assumes that each node and edge has a single label.")
return
fileName = sys.argv[1]
lg = Lg(fileName)
(segmentPrimitiveMap, primitiveSegmentMap, noparentSegments, segmentEdges) = \
lg.segmentGraph()
(rootNodes, treeEdges, otherEdges) = lg.separateTreeEdges()
# Remove all edges that aren't from the set of treeEdges between segments.
removedNotes = ''
for (seg1, seg2) in otherEdges:
seg1prims = segmentPrimitiveMap[ seg1 ][0]
seg2prims = segmentPrimitiveMap[ seg2 ][0]
for prim1 in seg1prims:
for prim2 in seg2prims:
removedNotes += '# Removed (' + str(prim1) + ',' + str(prim2) \
+ ') ' + str(lg.elabels[(prim1,prim2)]) + '\n'
del lg.elabels[(prim1,prim2)]
topString = '# Created by lgfilter.py from ' + fileName + '\n'
topString += removedNotes
topString += lg.csv() +'\n'
# Create a list of segments and relationships.
objectList = '# [ OBJECTS ]\n# Format: [Label] prim1 ... primN\n'
for segment in list(segmentPrimitiveMap):
segString =''
segLabel = 'ERROR'
for stroke in segmentPrimitiveMap[segment][0]:
segString += str(stroke) + ' '
segLabel = str(list(lg.nlabels[stroke])[0])
objectList += '# ' + segLabel + ' ' + segString + '\n'
objectList += '# [ RELS ]\n# Format: [Label] parentPrim1 ... parentPrimN :: childPrim1 ... childPrimM\n'
for (seg1,seg2) in treeEdges:
seg1prims = segmentPrimitiveMap[ seg1 ][0]
seg2prims = segmentPrimitiveMap[ seg2 ][0]
list1 = ''
p1 = ''
for prim1 in seg1prims:
list1 += prim1 + ' '
p1 = prim1
list2 = ''
for prim2 in seg2prims:
list2 += prim2 + ' '
p2 = prim2
objectList += '# ' + str(list(lg.elabels[(p1,p2)])[0]) + ' ' + list1 + ':: ' + list2 + '\n'
# Generate output.
if (len(sys.argv) > 2):
# To file if output file name provided.
outFileHandle = open( sys.argv[2],'w')
outFileHandle.write(topString + objectList)
outFileHandle.close()
else:
# Otherwise to standard output.
print(topString + objectList)
main()