#!/usr/bin/env python3
# ---------------------------------------------------------------------------- #
## \file faces2edges.py
## \author Sebastien Beaugrand
## \sa http://beaugrand.chez.com/
## \copyright CeCILL 2.1 Free Software license
# ---------------------------------------------------------------------------- #
import sys
import argparse
from os import path
parser = argparse.ArgumentParser()
parser.add_argument('-f',
'--file',
default=sys.stdin,
type=argparse.FileType('r'))
args = parser.parse_args()
# ---------------------------------------------------------------------------- #
## \fn points
# ---------------------------------------------------------------------------- #
def points(line):
pos = line.find('points="') + len('points="')
end = line.find('"', pos)
return line[pos:end].split()
# ---------------------------------------------------------------------------- #
## \fn color
# ---------------------------------------------------------------------------- #
def color(line):
pos = line.find('fill="') + len('fill="')
end = line.find('"', pos)
return line[pos:end].split()
# ---------------------------------------------------------------------------- #
## \fn tri2quadri
# ---------------------------------------------------------------------------- #
def tri2quadri(line1, line2):
if color(line1) != color(line2):
return False
t1 = points(line1)
t2 = points(line2)
links = []
if t2[0] == t1[0]:
links.append((0, 0))
elif t2[0] == t1[1]:
links.append((1, 0))
elif t2[0] == t1[2]:
links.append((2, 0))
if t2[1] == t1[0]:
links.append((0, 1))
elif t2[1] == t1[1]:
links.append((1, 1))
elif t2[1] == t1[2]:
links.append((2, 1))
if t2[2] == t1[0]:
links.append((0, 2))
elif t2[2] == t1[1]:
links.append((1, 2))
elif t2[2] == t1[2]:
links.append((2, 2))
if len(links) != 2:
return False
p1 = t1[0]
p2 = t1[1]
p3 = t1[2]
p4 = t2[3 - links[0][1] - links[1][1]]
if links[0][0] + links[1][0] == 1:
p = p2
p2 = p3
p3 = p
elif links[0][0] + links[1][0] == 3:
p = p3
p3 = p4
p4 = p
print('<polygon fill="white" stroke="black" stroke-width="2"'
' points="{} {} {} {}"/>'.format(p1, p2, p3, p4))
return True
# ---------------------------------------------------------------------------- #
# main
# ---------------------------------------------------------------------------- #
lines = []
for line in args.file:
if 'shape-rendering' not in line:
if '</g>' in line or '</svg>' in line:
continue
print(line.replace('fill="#000000"', 'fill="white"'), end='')
else:
lines.append(line)
n = len(lines)
prec = None
errors = 0
for i in range(0, n):
line = lines[i]
if prec is None:
prec = line
continue
found = False
#for j in range(i, n):
for j in range(i, i + 1):
if tri2quadri(prec, lines[j]):
found = True
prec = None
break
if not found:
errors += 1
pos = prec.find('points="') + len('points="')
end = prec.find('"', pos)
print('<polygon fill="white" stroke="black" stroke-width="2"'
' points="{}"/>'.format(prec[pos:end]))
prec = line
print('</g>')
print('</svg>')
if errors > 0:
print('errors: {}'.format(errors), file=sys.stderr)