「note」に引っ越し中です。移動したページごとに移動先へのリンクを作っていく予定です。

Inkscapeで描いたオープンパスを探す

 このページでは、Inkscapeで描いた多くのパスの中から、いわゆる「オープンパス」を探す方法を考えてみたいと思います。

(2025.03.27更新)

 なんでも「塗りのオープンパス」と呼ばれるタイプ(妙な呼び名です…)のパスにはいろいろ困ったことがあるらしく、最終的に「塗りのオープンパス」を閉じたパスに修正しておかないといけない場面が一部にあるのだそうです。どんな困ったことがあるのかは分かってません。「印刷事故になるから」と、漠然とした理由が示されているようですが、とにかく「塗りのオープンパス」はデータに含めないようにするほうがよい場合があるとのことです。それがどんな場合なのかは、Inkscapeで描いたドキュメントをどんなデータ形式でどんなシステムに出力するかによるので「これとこれ」とは言えませんが。

 そして、Illustratorではこの「塗りのオープンパス」をキャンバス上で探し出す方法が提供されているそうなのですが、Inkscapeにはそういったものがないので、既存の機能でなんとかする方法を考えてみようというわけです。

 「塗りのオープンパス」とは何だ?

 まず「塗りのオープンパス」はどんなパスかということですが、そんなにきっちりした共通の定義があるわけではなさそうで、だいたい次のような感じです。

 ①は両端がつながっていないのでオープンパスであり、かつ、フィルが塗りつぶされているので「塗りのオープンパス」の1種です。②は両端がつながっていないのでオープンパスですが、フィルが塗りつぶされていないので「塗りのオープンパス」ではないです。③はストロークが塗られていないので分かりにくいですが、ノードツールを使ってアウトラインを表示させてみると③もオープンパスであることが分かります。

 ③のようにストロークが塗られていないオープンパスも「塗りのオープンパス」に含めるのかどうかは「諸説」あるそうです(笑)。

 また、そもそも「オープンパス」とはどんなパスかというと、次のような感じだと思います。

 ④は明らかに閉じていないので「オープンパス」でしょう。⑤はぐるっと一周していて、データの中身にも閉じたパスであることを示す属性(後述)が含まれているので「オープンパス」ではないです。⑥は見た目は⑤とそっくりですが、赤い円で囲ったところの頂点(ノード)は始点と終点がぴったり重なっているだけで、データの中身として閉じたパスではないので「オープンパス」です。

塗りのオープンパスを検索する

 「塗りのオープンパス」をキャンバス上の中から検索して、閉じたパスに修正したいとします。

 「塗りのオープンパス」と呼ばれるパスを他のパスと区別して直接Inkscapeで扱う方法はないので、次のようなことを考えてみました。

 ここで考えた方法はたまたまうまくいっただけのようにも思われます。検索から漏れてしまう例外的な「塗りのオープンパス」がもし描かれていた場合は、さらに工夫が必要かもしれません。

 SVG形式の<path>エレメントの属性に、そのパスが「塗りのオープンパス」であるか否かを区別できる属性がありそうなので、Inkscapeの検索機能を使ってその属性を検索すれば「塗りのオープンパス」オブジェクトをヒットさせて、「塗りのオープンパス」オブジェクトだけが選択されている状態にすることができそうです。

 例えばフィルが塗りつぶされていないパスには「fill:none」という属性が記述されているので、この文字列で検索すれば塗りなしのパスだけを選択できます。

 また、パスを構成するセグメントの座標値を記述した属性値の末尾には、それが閉じたパスの場合「d="M 37.759502,56.002856 16.970563,68.306515 … 56.427121,55.154329 Z"」のように「Z」の1文字が付け加えられているので、「Z」で検索すれば閉じたパスだけを選択できます。

 このことを利用して、「塗りのオープンパス」だけが選択された状態を作ってみます。

「塗りのオープンパス」だけを選択してみた

 次のようないろんなタイプのパスが混じっているサンプルで試してみます。

 まず、検索/置換ダイアログを開いて、次のように「fill:none」で検索します。

 そうすると塗りなしのパスだけが選択されます。

 このパスをロックして、今後は検索時にヒットしないようにします。

 次に「 z」で検索します。文字列中に「z」が混じっているときにヒットしないように「z」の前にスペースを1文字入れて検査してみました。

 そうするとクローズパスだけが選択されるので、これもロックして今後検索時にヒットしないようにします。

 さらに検索キーワードを指定せずに全部のパスを検索します。そうすれば結果的に塗りなしパスと閉じたパスを除外したパス(すなわち塗りのオープンパス)が全部選択された状態になります。

 あとはこの選択状態のパスの始点と終点をつないでクローズパスに修正していけばいいのですが、その方法は別の話です。

「塗りのオープンパス」を閉じる

 選択した「塗りのオープンパス」を見た目を変えずにクローズパスに修正する方法として、いい方法が見つかってません。

 ネットで検索すると、始点と終点をつないでしまえばよいということが書かれていますが、それでは見た目が変わってしまいます(つないだところのセグメントも色が着いてしまう)し、始点と終点がピッタリ重なっているケースでは、そもそもどこで始点と終点が重なっているのかを探さないといけないという問題もあります。

 そこで次のようなことを(完璧な手順とは言えませんが)考えてみました。

 「塗りのオープンパス」を選択した状態でメニューからパス > ストロークをパスに変換を操作します。そうすると見た目を変えずにフィル部分とストローク部分がそれぞれ別のパスに分かれ…

 始点と終点がつながっていなかったストローク部分は次のように細長く、かつ、閉じたパスに変換されます。

 あとはフィル部分のパスのつながっていないところを連結します。

 ノードツールを使ってフィル部分のパスのノードを全部選択しておいて…

 ツールコントロールバーで始点と終点を連結するボタンをクリックします。

 すると次のようにフィル部分のパスも見た目を変えずに閉じたパスになります。