Parcourir la source

split toolbox logo svg into two paths. render them both, to try to remove connection line. does not work perfectly yet.

Thomas Buck il y a 10 mois
Parent
révision
d3ee71767e
2 fichiers modifiés avec 74 ajouts et 66 suppressions
  1. 60
    60
      render.py
  2. 14
    6
      toolbox.svg

+ 60
- 60
render.py Voir le fichier

@@ -39,65 +39,56 @@ def rot_p(p_center, p,  angle_d):
39 39
 
40 40
 def read_image(filename, path_steps, volume_percent, angle_d):
41 41
     paths, attributes = svg2paths(filename)
42
-    path = paths[0]
43
-    if len(paths) > 1:
44
-        print("WARNING: multiple paths in file. will just draw first one.")
45
-
46
-    print("paths={} segments={}".format(len(paths), len(path)))
47
-
48
-    points = [[path[0].start.real, path[0].start.imag]]
49
-    p_min = [points[0][0], points[0][1]]
50
-    p_max = [points[0][0], points[0][1]]
51
-
52
-    # find center
53
-    dist_min = float('inf')
54
-    dist_max = 0
55
-    p_prev = p_min
56
-    for segment in path:
57
-        p = [segment.end.real, segment.end.imag]
58
-        for i in range(0, 2):
59
-            if p[i] < p_min[i]:
60
-                p_min[i] = p[i]
61
-            if p[i] > p_max[i]:
62
-                p_max[i] = p[i]
63
-
64
-        dist_curr  = (p[0] - p_prev[0]) * (p[0] - p_prev[0])
65
-        dist_curr += (p[1] - p_prev[1]) * (p[1] - p_prev[1])
66
-        dist_curr  = math.sqrt(dist_curr)
67
-        p_prev = p
68
-        if dist_curr > dist_max:
69
-            dist_max = dist_curr
70
-        if dist_curr < dist_min:
71
-            dist_min = dist_curr
42
+    print("paths={}".format(len(paths)))
72 43
 
73
-    p_center = [ p_min[0] + (p_max[0] - p_min[0]) / 2, p_min[1] + (p_max[1] - p_min[1]) / 2 ]
44
+    p0 = [paths[0][0].start.real, paths[0][0].start.imag]
45
+    p_min = [p0[0], p0[1]]
46
+    p_max = [p0[0], p0[1]]
74 47
 
75
-    # find min max for all rotatations
76
-    for segment in path:
77
-        p_org = [segment.end.real, segment.end.imag]
78
-        for a in range(0, 360, 5):
79
-            p = rot_p(p_center, p_org , a)
48
+    for path in paths:
49
+        print("segments={}".format(len(path)))
50
+
51
+        # find center
52
+        dist_min = float('inf')
53
+        dist_max = 0
54
+        p_prev = p_min
55
+        for segment in path:
56
+            p = [segment.end.real, segment.end.imag]
80 57
             for i in range(0, 2):
81 58
                 if p[i] < p_min[i]:
82 59
                     p_min[i] = p[i]
83 60
                 if p[i] > p_max[i]:
84 61
                     p_max[i] = p[i]
85 62
 
86
-    p = [path[0].start.real, path[0].start.imag]
87
-    p = rot_p(p_center, p , angle_d)
88
-    points = [p]
89
-    # p_min = [points[0][0], points[0][1]]
90
-    # p_max = [points[0][0], points[0][1]]
91
-    for segment in path:
92
-        p = [segment.end.real, segment.end.imag]
93
-        p = rot_p(p_center, p , angle_d)
63
+            dist_curr = math.sqrt((p[0] - p_prev[0]) ** 2 + (p[1] - p_prev[1]) ** 2)
64
+            p_prev = p
65
+            if dist_curr > dist_max:
66
+                dist_max = dist_curr
67
+            if dist_curr < dist_min:
68
+                dist_min = dist_curr
94 69
 
95
-        for i in range(0, 2):
96
-            if p[i] < p_min[i]:
97
-                p_min[i] = p[i]
98
-            if p[i] > p_max[i]:
99
-                p_max[i] = p[i]
100
-        points.append(p)
70
+    p_center = [ p_min[0] + (p_max[0] - p_min[0]) / 2, p_min[1] + (p_max[1] - p_min[1]) / 2 ]
71
+
72
+        # find min max for all rotations
73
+        #for segment in path:
74
+        #    p_org = [segment.end.real, segment.end.imag]
75
+        #    for a in range(0, 360, 5):
76
+        #        p = rot_p(p_center, p_org , a)
77
+        #        for i in range(0, 2):
78
+        #            if p[i] < p_min[i]:
79
+        #                p_min[i] = p[i]
80
+        #            if p[i] > p_max[i]:
81
+        #                p_max[i] = p[i]
82
+
83
+    for path in paths:
84
+        for segment in path:
85
+            p = [segment.end.real, segment.end.imag]
86
+            p = rot_p(p_center, p, angle_d)
87
+            for i in range(0, 2):
88
+                if p[i] < p_min[i]:
89
+                    p_min[i] = p[i]
90
+                if p[i] > p_max[i]:
91
+                    p_max[i] = p[i]
101 92
 
102 93
     print("min={} max={}".format(p_min, p_max))
103 94
     print("center={} ".format(p_center))
@@ -133,15 +124,24 @@ def read_image(filename, path_steps, volume_percent, angle_d):
133 124
         for step in range(0, ps):
134 125
             add_segment(p1, p2, step / ps)
135 126
 
136
-    # walk path forwards
137
-    for n in range(0, len(points) - 1):
138
-        add_path(points[n], points[n + 1])
139
-    add_point(points[len(points) - 1])
140
-
141
-    # walk path backwards
142
-    for n in range(len(points) - 2, -1, -1):
143
-        add_path(points[n + 1], points[n])
144
-    add_point(points[0])
127
+    for path in paths:
128
+        p = [path[0].start.real, path[0].start.imag]
129
+        p = rot_p(p_center, p , angle_d)
130
+        points = [p]
131
+        for segment in path:
132
+            p = [segment.end.real, segment.end.imag]
133
+            p = rot_p(p_center, p , angle_d)
134
+            points.append(p)
135
+
136
+        # walk path forwards
137
+        for n in range(0, len(points) - 1):
138
+            add_path(points[n], points[n + 1])
139
+        add_point(points[len(points) - 1])
140
+
141
+        # walk path backwards
142
+        for n in range(len(points) - 2, -1, -1):
143
+            add_path(points[n + 1], points[n])
144
+        add_point(points[0])
145 145
 
146 146
     return data
147 147
 
@@ -156,7 +156,7 @@ def main():
156 156
     parser = argparse.ArgumentParser(
157 157
         prog=sys.argv[0],
158 158
         description='Render SVG path to vector XY audio file',
159
-        epilog='Made by Thomas Buck <thomas@xythobuz.de>. Licensed as GPLv3.')
159
+        epilog='Made by Thomas Buck (thomas@xythobuz.de) and Philipp Schönberger (mail@phschoen.de). Licensed as GPLv3.')
160 160
 
161 161
     parser.add_argument("input", help="Input SVG image file path.")
162 162
     parser.add_argument("-o", "--output", dest="output", default="out.wav",

+ 14
- 6
toolbox.svg Voir le fichier

@@ -23,9 +23,9 @@
23 23
      inkscape:pagecheckerboard="0"
24 24
      inkscape:deskcolor="#d1d1d1"
25 25
      inkscape:document-units="mm"
26
-     inkscape:zoom="16"
27
-     inkscape:cx="27.6875"
28
-     inkscape:cy="45.875"
26
+     inkscape:zoom="8"
27
+     inkscape:cx="14.5"
28
+     inkscape:cy="40.375"
29 29
      inkscape:window-width="1920"
30 30
      inkscape:window-height="1020"
31 31
      inkscape:window-x="0"
@@ -38,12 +38,20 @@
38 38
      inkscape:label="Layer 1"
39 39
      inkscape:groupmode="layer"
40 40
      id="layer1"
41
-     transform="translate(-45.755199,-45.487921)">
41
+     transform="translate(-45.755199,-45.487921)"
42
+     style="display:inline">
42 43
     <path
43 44
        inkscape:connector-curvature="0"
44 45
        id="path32"
45 46
        style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.0352778;stroke-opacity:1"
46
-       d="m 54.805794,66.484453 -9.032612,-5.199858 0.0025,-10.567302 9.035378,-5.20901 9.028924,5.208587 v 4.160979 l -1.862843,1.104657 1.862843,1.074702 c -9.33e-4,1.40583 -1.88e-4,2.812388 0,4.218482 l -9.033236,5.209579 m 0.910765,-2.706542 5.99e-4,-0.0022 6.246178,-3.577918 0.0047,-2.060667 -1.864043,-1.075267 -1.899073,1.095516 V 55.99825 l 3.763116,-2.170818 v -2.029848 l -7.160824,-4.130957 -7.164416,4.133003 v 8.395441 l 6.190862,3.564702 v -7.281566 l -1.492427,0.863212 -1.871098,-1.079429 5.594315,-3.236454 1.871909,1.079994 -2.233905,1.290426 0.01604,8.376379"
47
-       sodipodi:nodetypes="cccccccccccccccccccccccccccccc" />
47
+       d="m 54.805794,66.484453 -9.032612,-5.199858 0.0025,-10.567302 9.035378,-5.20901 9.028924,5.208587 v 4.160979 l -1.862843,1.104657 1.862843,1.074702 c -9.33e-4,1.40583 -1.88e-4,2.812388 0,4.218482 l -9.033236,5.209579"
48
+       sodipodi:nodetypes="cccccccccc" />
49
+    <path
50
+       inkscape:connector-curvature="0"
51
+       id="path1"
52
+       style="display:inline;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.0352778;stroke-opacity:1"
53
+       d="m 55.717513,63.778727 5.99e-4,-0.0022 6.246178,-3.577918 0.0047,-2.060667 -1.864043,-1.075267 -1.899073,1.095516 V 55.99825 L 61.96899,53.827432 V 51.797584 L 54.808166,47.666627 47.64375,51.79963 v 8.395441 l 6.190862,3.564702 v -7.281566 l -1.492427,0.863212 -1.871098,-1.079429 5.594315,-3.236454 1.871909,1.079994 -2.233905,1.290426 0.01604,8.376379"
54
+       sodipodi:nodetypes="cccccccccccccccccccc"
55
+       transform="translate(-1.1666667e-6)" />
48 56
   </g>
49 57
 </svg>

Chargement…
Annuler
Enregistrer