summaryrefslogtreecommitdiff
path: root/research/colorspace/csv_to_svg_path.py
blob: 5f638ed0f4581401f78a379761b79a5c7ab09708 (plain)
1
2
3
4
5
6
7
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
#!/usr/bin/env python3
import textwrap

def svg_path_from_points(points, r):
    points_joined = ' '.join(f'{x:.6f} {y:.6f}' for x, y in points)
    return textwrap.dedent(f'''
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <svg
        xmlns:dc="http://purl.org/dc/elements/1.1/"
        xmlns:cc="http://creativecommons.org/ns#"
        xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
        xmlns:svg="http://www.w3.org/2000/svg"
        xmlns="http://www.w3.org/2000/svg"
        xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
        version="1.1"
        width="{r*2}mm"
        height="{r*2}mm"
        viewBox="0 0 {r*2} {r*2}"
        id="svg2">
        <g id="layer1">
            <path id="path2991"
                style="fill:none;stroke:#000000;stroke-width:0.1mm;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
                d="M 0,0 L {points_joined}" />
        </g>
    </svg>
    ''').strip()

if __name__ == '__main__':
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument('locus_csv', help='CSV file containing locus coordinates. Format: lambda, x, y, z.')
    parser.add_argument('-r', '--radius', type=float, default=100, help='Radius of plot area in mm')
    args = parser.parse_args()

    import csv, ast
    points = []
    with open(args.locus_csv, newline='') as f:
        for row in csv.reader(f):
            # use literal_eval to handle entries like "1.153E-5"
            λ, x, y, z = (ast.literal_eval(e.strip()) for e in row)
            points.append((x*args.radius*2, y*args.radius*2))

    print(svg_path_from_points(points, args.radius))