Maison > développement back-end > Tutoriel Python > 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

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Libérer: 2022-09-15 15:29:08
avant
2633 Les gens l'ont consulté

[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>
Copier après la connexion

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")
Copier après la connexion

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),
},
}
Copier après la connexion

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

Étiquettes associées:
source:jb51.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal