Maison  >  Article  >  développement back-end  >  Une brève introduction à la solution de données de chemin Inkscape d'analyse Python

Une brève introduction à la solution de données de chemin Inkscape d'analyse Python

WBOY
WBOYavant
2022-09-15 15:29:082515parcourir

[Recommandation associée : Tutoriel vidéo Python3 ]

Parfois, vous devez utiliser des données de chemin pendant le processus de développement. Bien que Python ait sa propre bibliothèque SVG ou d'autres bibliothèques vectorielles, c'est uniquement à des fins expérimentales. besoin d'étudier en profondeur, donc quelques solutions simples sont adoptées : utiliser inkscape pour générer du svg, puis python l'analyse et le génère pour atteindre l'objectif correspondant

inkscape générer le chemin

Définir les propriétés du document :

Définir la grille :

Importer des images png comme référence :

Notez que les propriétés de l'image et du document importés ont le coin inférieur gauche comme origine :

Dans le Barre de propriétés du calque et de l'objet, modifiez la visibilité de l'image, Verrouillez l'image :

Créez un nouveau calque au-dessus du calque actuel pour dessiner la force de la route
Dessinez un rectangle à volonté et créez la forme correspondante. Par exemple, la découpe entre deux rectangles peut être effectuée via le menu : Chemin->Jeu de différences

Convertir la forme en chemin

En théorie, après l'enregistrement, il existe un fichier svg qui peut être converti en chemin, mais en raison de le format complexe du fichier svg, il y aura une variété de données de forme, nous devons donc ici convertir uniformément diverses formes en chemins pour une analyse simple par python

Ensuite, l'exemple ci-dessus nécessite un traitement ultérieur :

  • Si l'objet est un rectangle ou une autre forme, exécutez le menu : Chemin - >Convertir l'objet en chemin
  • Pour la forme du chemin combiné, exécutez le menu : Road Jin->Split Road Jin

La couche finale obtenue est la suivante :

Après avoir enregistré le fichier svg, utilisez Ouvrir avec le Bloc-notes, et vous verrez le contenu clé suivant :

     <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>

Il y a deux données de chemin commençant par m et se terminant avec z, indiquant que les données ont été préparées.

Analyse Python svg

Ici, nous utilisons l'analyse d'expressions régulières et générons les résultats sous forme de table Lua :

import re
import sys
f=open("绘图.svg","r",encoding=&#39;utf-8&#39;)
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")

Obtenir les données après l'exécution :

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),
},
}

[Recommandations associées : Tutoriel vidéo Python3 ]

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer