欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python分析inkscape路徑數(shù)據(jù)方案簡(jiǎn)單介紹

 更新時(shí)間:2022年09月14日 17:05:09   作者:皮爾斯巴巴羅  
這篇文章主要介紹了python分析inkscape路徑數(shù)據(jù)方案簡(jiǎn)單介紹,文章通過(guò)圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下

前言

開發(fā)過(guò)程中有時(shí)需要使用路徑數(shù)據(jù),雖然python有自己的svg或其他矢量庫(kù),但這里只是出于實(shí)驗(yàn)的目的,沒(méi)必要深入研究,所以采用一些簡(jiǎn)單的方案:用inkscape生成svg,然后python分析并輸出,從而達(dá)到相應(yīng)目的

inkscape生成路徑

設(shè)置文檔屬性:

設(shè)置網(wǎng)格:

導(dǎo)入png圖像作為參考:

注意導(dǎo)入圖像、文檔屬性,都是已左下角為原點(diǎn):

在圖層與對(duì)象屬性欄,修改圖像可見性、鎖定圖像:

在當(dāng)前圖層之上新建一個(gè)圖層,用來(lái)繪制路勁
隨意繪制矩形,并做好相應(yīng)的形狀,比如兩個(gè)矩形之間切割可通過(guò)菜單:路徑->差集

將形狀轉(zhuǎn)換為路徑

理論上保存完之后,就有svg文件可以進(jìn)行路徑轉(zhuǎn)換,但是由于svg文件格式復(fù)雜,會(huì)有各種各樣的形狀數(shù)據(jù),所以這里需要把各種形狀統(tǒng)一轉(zhuǎn)換為路徑,以便python進(jìn)行簡(jiǎn)單解析

那么上面的例子就需要再進(jìn)一步處理:

  • 如果對(duì)象是rect或其他形狀,執(zhí)行菜單:路徑->對(duì)象轉(zhuǎn)路徑
  • 對(duì)于組合路徑的形狀,執(zhí)行菜單:路勁->分割路勁

最后得到圖層如下:

保存svg文件后,再用記事本將其打開,會(huì)看到如下關(guān)鍵內(nèi)容:

     <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數(shù)據(jù)都是以m打頭,以z結(jié)尾,說(shuō)明數(shù)據(jù)已經(jīng)準(zhǔn)備妥當(dāng)。

python分析svg

這里采用正則表達(dá)式分析,并將結(jié)果輸出為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")

運(yùn)行后得到數(shù)據(jù):

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

到此這篇關(guān)于python分析inkscape路徑數(shù)據(jù)方案簡(jiǎn)單介紹的文章就介紹到這了,更多相關(guān)python inkscape內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 探索Python元類的魅力:靈活定制類的創(chuàng)建過(guò)程

    探索Python元類的魅力:靈活定制類的創(chuàng)建過(guò)程

    在Python編程中,元類(Metaclass)是一項(xiàng)高級(jí)特性,它允許我們?cè)诙x類的時(shí)候動(dòng)態(tài)地控制類的創(chuàng)建過(guò)程。元類提供了一種強(qiáng)大的機(jī)制,可以對(duì)類進(jìn)行定制化,擴(kuò)展其功能,并在類的實(shí)例化過(guò)程中執(zhí)行額外的操作,本文將深入解析
    2023-10-10
  • python計(jì)算導(dǎo)數(shù)并繪圖的實(shí)例

    python計(jì)算導(dǎo)數(shù)并繪圖的實(shí)例

    今天小編就為大家分享一篇python計(jì)算導(dǎo)數(shù)并繪圖的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • 基于Python實(shí)現(xiàn)繪制簡(jiǎn)單動(dòng)圖的示例詳解

    基于Python實(shí)現(xiàn)繪制簡(jiǎn)單動(dòng)圖的示例詳解

    動(dòng)畫是一種高效的可視化工具,能夠提升用戶的吸引力和視覺體驗(yàn),有助于以富有意義的方式呈現(xiàn)數(shù)據(jù)可視化,本文的主要介紹在Python中兩種簡(jiǎn)單制作動(dòng)圖的方法,需要的可以了解下
    2023-10-10
  • python lambda函數(shù)及三個(gè)常用的高階函數(shù)

    python lambda函數(shù)及三個(gè)常用的高階函數(shù)

    這篇文章主要介紹了python lambda函數(shù)及三個(gè)常用的高階函數(shù),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • python線程join方法原理解析

    python線程join方法原理解析

    這篇文章主要介紹了python線程join方法原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 一個(gè)基于flask的web應(yīng)用誕生 記錄用戶賬戶登錄狀態(tài)(6)

    一個(gè)基于flask的web應(yīng)用誕生 記錄用戶賬戶登錄狀態(tài)(6)

    一個(gè)基于flask的web應(yīng)用誕生第六篇,這篇文章主要介紹了記錄用戶賬戶登錄狀態(tài)功能開發(fā),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • python模擬TLS指紋實(shí)現(xiàn)反爬取

    python模擬TLS指紋實(shí)現(xiàn)反爬取

    這篇文章主要為大家詳細(xì)介紹了如何利用python模擬TLS指紋實(shí)現(xiàn)反爬取,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,有需要的小伙伴可以了解一下
    2023-10-10
  • 使用Python實(shí)現(xiàn)將list中的每一項(xiàng)的首字母大寫

    使用Python實(shí)現(xiàn)將list中的每一項(xiàng)的首字母大寫

    今天小編就為大家分享一篇使用Python實(shí)現(xiàn)將list中的每一項(xiàng)的首字母大寫,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • python實(shí)現(xiàn)的漢諾塔算法示例

    python實(shí)現(xiàn)的漢諾塔算法示例

    這篇文章主要介紹了python實(shí)現(xiàn)的漢諾塔算法,結(jié)合實(shí)例形式分析了漢諾塔算法的原理、實(shí)現(xiàn)方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-10-10
  • Pandas的read_csv函數(shù)參數(shù)分析詳解

    Pandas的read_csv函數(shù)參數(shù)分析詳解

    這篇文章主要介紹了Pandas的read_csv函數(shù)參數(shù)分析詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07

最新評(píng)論