ホームページ >バックエンド開発 >Python チュートリアル >Python 分析の inkscape パス データ ソリューションの簡単な紹介

Python 分析の inkscape パス データ ソリューションの簡単な紹介

WBOY
WBOY転載
2022-09-15 15:29:082577ブラウズ

[関連する推奨事項: Python3 ビデオ チュートリアル ]

開発プロセス中にパス データを使用する必要がある場合がありますが、Python にはパス データが含まれています。独自の SVG または他のベクター ライブラリを使用しますが、これは単なる実験目的であり、深く検討する必要はないため、いくつかの単純な解決策が採用されています。インクスケープを使用して SVG を生成し、Python で分析して出力することで、対応する目的を達成します。

inkscape はパスを生成します

ドキュメント プロパティを設定します:

グリッドを設定します:

png 画像を参照としてインポートします:

インポートされた画像に注意してください。ドキュメントのプロパティは左下隅を原点とします。 :

# レイヤーとオブジェクトのプロパティ バーで、画像の表示/非表示を変更し、画像をロックします。 :

現在のレイヤーの上に新しいレイヤーを作成して道路の強度を描画します
任意に長方形を描画し、対応する形状を作成します。 、2 つの長方形の間のカットはメニューから行うことができます: Path->Difference set

Convert Shape to path

理論的には、保存後, パスに変換できるsvgファイルがありますが、svgファイルは形式が複雑なため、様々な形状データが存在するため、ここではpythonで簡単に解析するために様々な形状を一律にパスに変換する必要があります

その後、上記の例を繰り返す必要があります。さらなる処理:

  • オブジェクトが四角形またはその他の形状の場合は、メニューを実行します: パス->オブジェクトからパスへ
  • 組み合わせの場合 パスの形状については、メニューを実行します: 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>

2 つのパス データは m で始まり、z で終わります。z の終わりは、データの準備ができたことを意味します。

python 分析 svg

ここでは正規表現分析が使用され、結果は lua テーブルとして出力されます。実行後のデータ :

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

【関連する推奨事項:

Python3 ビデオ チュートリアル ]

以上がPython 分析の inkscape パス データ ソリューションの簡単な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjb51.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。