>  기사  >  백엔드 개발  >  Python 분석 Inkscape 경로 데이터 체계에 대한 간략한 소개

Python 분석 Inkscape 경로 데이터 체계에 대한 간략한 소개

WBOY
WBOY앞으로
2022-09-15 15:29:082515검색

【관련 권장 사항: Python3 비디오 튜토리얼

때때로 개발 과정에서 경로 데이터를 사용해야 할 때가 있습니다. Python에는 자체 SVG 또는 기타 벡터 라이브러리가 있지만 이는 단지 실험 목적일 뿐이며 사용할 수 있는 것은 없습니다. 깊이 연구해야 하므로 몇 가지 간단한 솔루션을 채택합니다. inkscape를 사용하여 svg를 생성한 다음 python은 해당 목적을 달성하기 위해 이를 분석하고 출력합니다.

inkscape 경로 생성

문서 속성 설정:

그리드 설정:

참조로 png 이미지 가져오기:

가져온 이미지 및 문서 속성의 왼쪽 하단 모서리가 원본으로 있습니다.

레이어에서 및 객체 속성 표시줄, 이미지 가시성 수정, 이미지 잠금:

현재 레이어 위에 새 레이어를 만들어 도로 강도를 그립니다.
마음대로 직사각형을 그리고 해당 모양을 만듭니다. 예를 들어 자르기. 두 직사각형 사이의 작업은 메뉴를 통해 수행할 수 있습니다: 경로->차이 세트

모양을 경로로 변환

이론적으로는 저장 후 경로로 변환할 수 있는 svg 파일이 있지만 svg 파일의 복잡한 형식에는 다양한 모양 데이터가 있으므로 여기에서는 Python을 통한 간단한 분석을 위해 다양한 모양을 경로로 균일하게 변환해야 합니다

그런 다음 위의 예에는 추가 처리가 필요합니다.

  • 개체가 직사각형 또는 다른 모양인 경우 메뉴를 실행합니다. Path - >Object to path
  • 결합된 경로의 모양을 보려면 메뉴를 실행합니다. Road Jin->Split Road Jin

최종 얻은 레이어는 다음과 같습니다.

svg 파일을 저장한 후 메모장으로 열기를 사용하면 다음과 같은 주요 내용을 볼 수 있습니다.

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

경로 데이터 중 두 개는 m으로 시작하고 z로 끝납니다. 데이터가 준비되었음을 나타냅니다.

Python 분석 svg

여기에서는 정규식 분석을 사용하고 결과를 루아 테이블로 출력합니다.

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

실행 후 데이터 가져오기:

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

[관련 권장 사항: Python3 비디오 튜토리얼 ]

위 내용은 Python 분석 Inkscape 경로 데이터 체계에 대한 간략한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 jb51.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제