PerfectVector
著者: Irene Kim

SVGを描画する前にAxiDrawのパス順序を確認

AxiDraw オフライン SVG プレビューを比較して、パスの順序、反転、紙からペンを上げたときの動きを確認します。描画ジオメトリを保存し、保存された SVG が保持している内容を理解します。

3 分で読める
目次

AxiDraw で SVG ペンの移動を最適化するには、まずパスが目的のマークを描画していることを確認します。次に、同じジオメトリと固定設定を使用してオフライン プレビューを比較します。順序を変更すると、リフトの回数を減らしたり描画形状を変更したりすることなく、ペンを上げた状態でのペンの動きが短縮される場合があります。

オリジナルの SVG を保存してください。以下のプレビューでは、順序とオプションのパスの反転を確認します。中心線を再構築したり、不要な輪郭を修復したり、元の SVG オブジェクトを永久に再配置したりすることはありません。私たちのテストでは、PerfectVector からのベクトル化されたアウトラインや物理的なペン描画ではなく、8 つの作成されたオープン ストロークを使用します。

お手持ちの画像で試す
フル機能のツールを開く
無料でお試しいただけます。画像をドロップすると、登録なしでベクターのプレビューを確認できます。

順序を変更する前にジャンプを診断する

ペンが紙に触れた状態での移動がマークを付けるルートになります。ペンを紙から上げた状態での移動とは、ペンを上げた状態でのマーク間の移動です。連続したオブジェクトが遠くに離れて配置されている場合、短く見える描画でも、紙からペンを持ち上げた状態での動きが長くなる可能性があります。

プレビューでわかること最初に取り組むべきこと
1 つのストロークであるべき線の周囲の 2 つのエッジ目的の単線ルートを構築します。
日陰の領域が必要な空の周囲明示的なハッチフィル ペン パスを作成する
マークは正しいが、ページをまたいでジャンプが繰り返される以下のパスの順序付けとパス方向の反転設定を比較してください。
別々のマークの間に不要な線が引かれているより短いルートを受け入れる前に、ペンダウンのジオメトリとパスの結合を確認してください。

SVG パスの長さを測定すると、描画ジオメトリの長さがわかります。これ自体には、これらのパス間のマシンの移動は含まれません。

AxiDraw CLI リファレンスでは、これらの設定が区別されます。0 は通常、結合が可能なドキュメントの順序に従います。1 はパスの順序も変更し、2 はパスの反転も許可します。隣接する描画パスを接続するかどうかは、個別に決定します。この比較では、min_gap = -1 で無効にし、隣接するストロークが 1 つの連続マークにならないようにします。

方向に敏感な作業では、反転が重要になることがあります。描画が特定の書き込みシーケンスまたは方向に従う必要がある場合、ペンを上げた状態での移動ルートが短いだけでは、2 の設定を受け入れる十分な理由にはなりません。レイヤーは並べ替えも制限します。ネストされたグループは、最適化時に描画シーケンスを保持すると想定すべきではありません。ドキュメントの実際のプレビューを確認します。

未変更の SVG で 3 回のオフライン プレビューを実行する

この例では、Python と公式の AxiDraw Python API が必要です。 API 3.9.6 を Python 3.9.6 でテストしました。使用している Python 環境にモジュールがインストールされていない場合は、公式のインストール手順に従ってください。

Python API リファレンスでは、プレビューをオフライン シミュレーションとして定義しています。 preview = True を plot_setup の後かつ plot_run の前に設定します。以下のスクリプトは常にそれを設定してアサートします。デバイス接続呼び出しは含まれません。

この小さな例を eight-strokes.svg として保存するか、独自の SVG の複製を使用します。

<svg xmlns="http://www.w3.org/2000/svg" width="100mm" height="80mm" viewBox="0 0 100 80">
  <g fill="none" stroke="#152b3b" stroke-width="0.4">
    <path id="stroke-0" d="M 10 20 L 18 20"/>
    <path id="stroke-1" d="M 88 60 L 80 60"/>
    <path id="stroke-2" d="M 20 20 L 28 20"/>
    <path id="stroke-3" d="M 78 60 L 70 60"/>
    <path id="stroke-4" d="M 30 20 L 38 20"/>
    <path id="stroke-5" d="M 68 60 L 60 60"/>
    <path id="stroke-6" d="M 40 20 L 48 20"/>
    <path id="stroke-7" d="M 58 60 L 50 60"/>
  </g>
</svg>

テスト用SVGのビューポートは100 × 80 mmで、viewBoxの寸法も対応しています。SVGのビューポートとviewBoxの対応規則により、この例では座標1単位が1 mmになります。8本あるストロークはそれぞれ8 mmの長さです。

以下を preview-orders.py として保存します。

from pathlib import Path
import json
import sys
from pyaxidraw import axidraw
 
source = Path(sys.argv[1]).resolve()
destination = Path(sys.argv[2])
destination.mkdir()  # Use a new directory; preserve previous results.
reports = []
for order in (0, 1, 2):
    ad = axidraw.AxiDraw()
    ad.plot_setup(str(source))
    ad.options.preview = True
    ad.options.rendering = 3
    ad.options.reordering = order
    ad.options.random_start = False
    ad.options.auto_rotate = False
    ad.options.report_time = False
    ad.params.min_gap = -1
    assert ad.options.preview is True
    output = ad.plot_run(True)
    if ad.errors.code:
        raise RuntimeError(f"Preview error: {ad.errors.code}")
    (destination / f"preview-order-{order}.svg").write_text(output)
    reports.append({
        "order": order,
        "pen_down_m": ad.distance_pendown,
        "pen_up_m": ad.distance_total - ad.distance_pendown,
        "pen_lifts": ad.pen_lifts,
    })
report = json.dumps(reports, indent=2)
(destination / "distances.json").write_text(report + "\n")
print(report)

新しい出力ディレクトリ名を使用して、公式 API を含む Python 環境で実行します。

python3 preview-orders.py eight-strokes.svg preview-check

3 つの診断 SVG と distances.json が保存されます。 rendering = 3 には、上げた動きと描画した動きの両方が含まれます。ランダムスタートと自動回転はオフです。パスの結合は無効になっています。自分のファイルを比較するときは、これらの選択肢を固定しておいてください。このスクリプトはオフライン検査方法であり、プロッタを動作させるコマンドではありません。

ペンを上げた状態と描画したジオメトリの動きを個別に比較します。

8 ストロークの治具では、正確なスクリプトが次のように生成されます。

並べ替え紙からペンを立てた状態での動きの目安ペンが紙に触れた状態での動き報告されたリフト
00.509749メートル0.064メートル8
10.223592メートル0.064メートル8
20.180919メートル0.064メートル8

これらは、出発地から自宅までの移動を含む、このファイルのネイティブ ソフトウェアの見積もりです。ペンダウン距離は 64 mm のまま、リフト数は 8 のままでした。ペンを紙から上げた状態での動きが短くても、ペンを持ち上げる回数が減るわけではありません。物理的なペン描画、プロットの経過時間、または別の描画の改善保証は測定しませんでした。

積み重ねられた AxiDraw プレビューには、8 つの青色の描画ストロークが変更されていないことが示されていますが、ペンを上げた状態でのマゼンタの移動ルートは順序 0 と 2 の間で異なります。表示のコントラストとストロークの太さが強化されます。
resvg でレンダリングされた、スタックされたネイティブ SDK パス表示コピーの実際のプレビュー キャプチャ。青はペンが下にあります。マゼンタはペンアップです。読みやすくするために色とストロークの太さが強化されています。ネイティブ パスの座標は変更されません。プロッターが接続されていませんでした。

積み上げ図は、設定 0 と 2 を比較しています。このテーブルには 1 も含まれています。ネイティブ SDK プレビュー パスのコピーが、より強い青とマゼンタの色と太いストロークで表示され、読みやすくなります。これらは表示スタイルであり、物理的なペンの幅ではありません。ネイティブ パスの座標と変換は変更されません。表示ビューポートは未使用のスペースをトリミングします。 3 つのネイティブ プレビューすべてが検査され、独立したジオメトリ チェックによって同じ 8 つの水平描画セグメントが見つかり、エンドポイントの順序が逆転することが可能になりました。サンプリングされたすべてのペンダウン頂点は、意図したセグメント上に残りました。

ファイルについて、各プレビュー SVG を開き、レイズドトラベル レイヤーとは別に描画レイヤーを調べます。意図したページ サイズと位置、予期されるすべてのマーク、変更されていない穴やギャップ、および新たに描画されたコネクタがないことを確認します。逆ストロークが許容されることを確認してください。距離レポートが小さい場合でも、間違ったマークを描画するルートは拒否されます。

保存されたプレビューの内容を理解する

AxiDraw の並べ替えドキュメントでは、最適化は一時コピーで行われると説明しています。保存された出力 SVG 内の元のオブジェクトは、元の順序を保持します。出力も同様に、すべての元の stroke-* パスとその元のシーケンスを保持しました。

したがって、preview-order-2.svg は診断プレビューであり、別のプログラムが永久に並べ替えられたアートワーク ファイルを読み取ることを証明するものではありません。ソース、選択したオプション、比較レポートをまとめて保管します。後でオリジナルを AxiDraw で使用する場合は、適切なプロット ワークフローで目的の順序設定を再度適用します。

問題が不要な描画ジオメトリである場合は、ルート構築の手順に戻ります。ペンを立てた移動ルートだけではもったいない場合は、固定設定のプレビューを比較してください。物理的なサイズ、ペンの動作、マシンの動作については、依然として独自のチェックが必要です。このオフライン管理はそれらを証明するものではありません。

このチェックの前に PerfectVector が収まる場所

まだラスター アートワークしかなく、編集可能なベクター シェイプとして色で塗りつぶされた表示されるアウトライン シェイプが必要な場合は、PerfectVector のイメージ ベクタライザーが初期のステップとして適しています。プレビューをソースの輪郭や穴と照らし合わせて検査します。単一の中心線を推測したり、AxiDraw パスの順序を最適化したりすることはありません。これらのルートが必要な場合は、中心線またはハッチングのワークフローを使用します。

正しい SVG ルートがすでにある場合は、それを保持し、オフライン チェックを直接実行します。 SVG を再トレースしても、欠落している順序情報は追加されません。 PerfectVector の保護されたプレビューは表示専用です。結果を編集およびエクスポートするには、ロックを解除する必要があります。

よくある質問

AxiDraw の順序を変更すると、SVG のオブジェクトの順序が永続的に変更されますか? いいえ。文書化された最適化では一時コピーが使用されます。保存されたプレビューには診断動作レイヤーが含まれていますが、元のアートワーク オブジェクトは順序を保持しています。選択した設定を個別に保存します。

ペンを紙から持ち上げる回数は同じなのに、ペンを紙から持ち上げたときの動きが小さくなったのはなぜですか? 同じ 8 つの別々のストロークを、異なる順序または方向で訪問することができます。パス結合を無効にしたテスト リファレンスでは、すべての設定で 8 つのリフトと 64 mm の描画が報告されましたが、ペンを上げたときの動きが変化しました。

注文により二重輪郭トレースを修正したり、シェーディングを生成したりできますか? いいえ、まず描画ルートを修正してください。単一のストロークに対して中心線ワークフローを使用するか、エリア シェーディングに対して明示的なハッチング パスを構築し、受け入れられたジオメトリの順序を比較します。

情報源

  1. AxiDraw — Python API リファレンス — オフライン プレビューとレンダリングを定義し、プレビュー SVG を返す例を示します。
  2. AxiDraw — CLI リファレンス — インストール、パスの順序付けとパス方向の反転の設定、レイヤーの処理、一時的な最適化について説明します。
  3. W3C — SVG 座標系、変換、および単位 — 寸法記入例で使用されるビューポート マッピングについて説明します。

まだラスター図面から始めているのですが、輪郭を描いた形状にカラーで塗りつぶす必要がありますか? 独自の画像を使用して自由に開始し、ソースに対してプレビューの輪郭と穴を検査します。目的のペン ルートが存在したら、上記のオフライン方法で順序を個別に確認します。

ブログのその他の記事

PerfectVector

画像を
編集可能なSVGに変換

ベクター化とプレビューの確認は無料で、1日あたりの上限はありません。