【관련 권장 사항: Python3 비디오 튜토리얼】
때때로 개발 과정에서 경로 데이터를 사용해야 할 때가 있습니다. Python에는 자체 SVG 또는 기타 벡터 라이브러리가 있지만 이는 단지 실험 목적일 뿐이며 사용할 수 있는 것은 없습니다. 깊이 연구해야 하므로 몇 가지 간단한 솔루션을 채택합니다. inkscape를 사용하여 svg를 생성한 다음 python은 해당 목적을 달성하기 위해 이를 분석하고 출력합니다.
문서 속성 설정:
그리드 설정:
참조로 png 이미지 가져오기:
가져온 이미지 및 문서 속성의 왼쪽 하단 모서리가 원본으로 있습니다.
레이어에서 및 객체 속성 표시줄, 이미지 가시성 수정, 이미지 잠금:
현재 레이어 위에 새 레이어를 만들어 도로 강도를 그립니다.
마음대로 직사각형을 그리고 해당 모양을 만듭니다. 예를 들어 자르기. 두 직사각형 사이의 작업은 메뉴를 통해 수행할 수 있습니다: 경로->차이 세트
이론적으로는 저장 후 경로로 변환할 수 있는 svg 파일이 있지만 svg 파일의 복잡한 형식에는 다양한 모양 데이터가 있으므로 여기에서는 Python을 통한 간단한 분석을 위해 다양한 모양을 경로로 균일하게 변환해야 합니다
그런 다음 위의 예에는 추가 처리가 필요합니다.
최종 얻은 레이어는 다음과 같습니다.
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로 끝납니다. 데이터가 준비되었음을 나타냅니다.
여기에서는 정규식 분석을 사용하고 결과를 루아 테이블로 출력합니다.
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")
실행 후 데이터 가져오기:
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!