php零基礎到就業直播視訊課:進入學習
【相關推薦: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>
其中有兩條path資料都是以m打頭,以z結尾,說明資料已經準備妥當。
這裡採用正規表示式分析,並將結果輸出為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), }, }
【相關推薦:Python3視訊教學 】
以上就是python分析inkscape路徑資料方案簡單介紹的詳細內容,更多請關注TW511.COM其它相關文章!