網站首頁 編程語言 正文
前言
開發過程中有時需要使用路徑數據,雖然python有自己的svg或其他矢量庫,但這里只是出于實驗的目的,沒必要深入研究,所以采用一些簡單的方案:用inkscape生成svg,然后python分析并輸出,從而達到相應目的
inkscape生成路徑
設置文檔屬性:
設置網格:
導入png圖像作為參考:
注意導入圖像、文檔屬性,都是已左下角為原點:
在圖層與對象屬性欄,修改圖像可見性、鎖定圖像:
在當前圖層之上新建一個圖層,用來繪制路勁
隨意繪制矩形,并做好相應的形狀,比如兩個矩形之間切割可通過菜單:路徑->差集
將形狀轉換為路徑
理論上保存完之后,就有svg文件可以進行路徑轉換,但是由于svg文件格式復雜,會有各種各樣的形狀數據,所以這里需要把各種形狀統一轉換為路徑,以便python進行簡單解析
那么上面的例子就需要再進一步處理:
- 如果對象是rect或其他形狀,執行菜單:路徑->對象轉路徑
- 對于組合路徑的形狀,執行菜單:路勁->分割路勁
最后得到圖層如下:
保存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>
其中有兩條path數據都是以m打頭,以z結尾,說明數據已經準備妥當。
python分析svg
這里采用正則表達式分析,并將結果輸出為lua表:
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),
},
}
原文鏈接:https://blog.csdn.net/tangyin025/article/details/126798381
相關推薦
- 2022-11-22 React?Context源碼實現原理詳解_React
- 2022-12-09 python返回多個值與賦值多個值的示例代碼_python
- 2022-04-30 WPF在自定義文本框中實現輸入法跟隨光標_實用技巧
- 2022-06-22 android選項卡TabHost功能用法詳解_Android
- 2022-09-12 C++數據結構哈希表詳解_C 語言
- 2022-08-18 C++詳解如何實現動態數組_C 語言
- 2022-11-22 CentOS?7.9?安裝?docker20.10.12的過程解析_docker
- 2021-11-21 關于.NET6?Minimal?API的使用方式詳解_實用技巧
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支