Sometimes it is necessary to use path data during the development process. Although python has its own svg or other vector libraries, this is only for experimental purposes, and there is no need to study in depth, so some simple solutions are used: use inkscape to generate svg, and then python analyzes and output, so as to achieve the corresponding purpose
inkscape generation path
Set the document properties
Set the grid
Import the png image as a reference
Note that the imported image and document properties have the lower left corner as the origin
In the layer and object property bar, modify the image visibility and lock the image
Create a new layer above the current layer , used to draw road strength
Draw rectangles at will, and make corresponding shapes, such as cutting between two rectangles, you can use the menu: Path -> Difference
Convert shapes to paths
Theoretically, after saving, there is an svg file that can be converted into a path. However, due to the complexity of the svg file format, there will be various shape data, so it is necessary to convert various shapes into paths in a unified way, so that python can perform simple analysis.
Then The above example requires further processing:
- If the object is a rect or other shape, execute the menu: path -> object to path
- For the shape of the combined path, execute the menu: Road King->Split Road King
Finally get the layer
and save the svg file as follows, then open it with Notepad, you will see the following key content
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="图层 2"><path
style="fill:none;stroke:#000000;stroke-width:0.1;stroke-dasharray:none"
d="m 510.66797,509.15234 3.82812,8.50586 h 3.92383 v -8.50586 z"
id="path11706" /><path
style="fill:none;stroke:#000000;stroke-width:0.1;stroke-dasharray:none"
d="m 504.25195,509.15234 v 8.50586 h 8.14258 l -3.82812,-8.50586 z"
id="rect3684" /></g>
Two of the path data start with m and end with z, indicating that the data is ready.
python analysis svg
Regular expression analysis is used here, and the result is output as a lua table
import re
import sys
f=open("绘图.svg","r",encoding='utf-8')
print("result={")
s=f.read()
for mg in re.finditer("<g.*?</g>",s,re.S):
for mp in re.finditer("<path.*?/>",mg.group(),re.S):
path=[]
pathid=""
md=re.search("\sd=\"(.+?)\"",mp.group(),re.S)
if md:
last_pos=(0,0)
###################### 1 2 3 4 5 6 7 8 9
for ml in re.finditer("(M[^MmLlHhVvZz]+)|(m[^MmLlHhVvZz]+)|(L[^MmLlHhVvZz]+)|(l[^MmLlHhVvZz]+)|(H[^MmLlHhVvZz]+)|(h[^MmLlHhVvZz]+)|(V[^MmLlHhVvZz]+)|(v[^MmLlHhVvZz]+)|(Z|z)",md.group(1)):
if ml.group(1):
###################### 1 3
for mv in re.finditer("(-?\d+(\.\d+)?),(-?\d+(\.\d+)?)",ml.group(1)):
last_pos=(float(mv.group(1)),float(mv.group(3)))
path.append(last_pos)
elif ml.group(2):
for mv in re.finditer("(-?\d+(\.\d+)?),(-?\d+(\.\d+)?)",ml.group(2)):
last_pos=(last_pos[0]+float(mv.group(1)),last_pos[1]+float(mv.group(3)))
path.append(last_pos)
elif ml.group(3):
for mv in re.finditer("(-?\d+(\.\d+)?),(-?\d+(\.\d+)?)",ml.group(3)):
last_pos=(float(mv.group(1)),float(mv.group(3)))
path.append(last_pos)
pass
elif ml.group(4):
for mv in re.finditer("(-?\d+(\.\d+)?),(-?\d+(\.\d+)?)",ml.group(4)):
last_pos=(last_pos[0]+float(mv.group(1)),last_pos[1]+float(mv.group(3)))
path.append(last_pos)
pass
elif ml.group(5):
for mv in re.finditer("(-?\d+(\.\d+)?)",ml.group(5)):
last_pos=(float(mv.group(1)),last_pos[1])
path.append(last_pos)
elif ml.group(6):
for mv in re.finditer("(-?\d+(\.\d+)?)",ml.group(6)):
last_pos=(last_pos[0]+float(mv.group(1)),last_pos[1])
path.append(last_pos)
elif ml.group(7):
for mv in re.finditer("(-?\d+(\.\d+)?)",ml.group(7)):
last_pos=(last_pos[0],float(mv.group(1)))
path.append(last_pos)
elif ml.group(8):
for mv in re.finditer("(-?\d+(\.\d+)?)",ml.group(8)):
last_pos=(last_pos[0],last_pos[1]+float(mv.group(1)))
path.append(last_pos)
elif ml.group(9):
path.append(path[0])
mid=re.search("\sinkscape:label=\"(.+?)\"",mp.group(),re.S) or re.search("\sid=\"(.+?)(-\d+)*?\"",mp.group(),re.S)
if mid:
pathid=mid.group(1)
print("{\nid=\""+pathid+"\",")
for pos in path:
print("Vector2(%f,%f),"%(pos[0],pos[1]))
print("},")
print("}\n")
Get data after running
result={
{
id="path11706",
Vector2(510.667970,509.152340),
Vector2(514.496090,517.658200),
Vector2(518.419920,517.658200),
Vector2(518.419920,509.152340),
Vector2(510.667970,509.152340),
},
{
id="rect3684",
Vector2(504.251950,509.152340),
Vector2(504.251950,517.658200),
Vector2(512.394530,517.658200),
Vector2(508.566410,509.152340),
Vector2(504.251950,509.152340),
},
}