2010年6月19日土曜日

inkscapeでパターンを作ったときのdefsの様子とパターンのidを書き換えるときの注意

inkscapeで様々なオブジェクトに付くidは数字4桁で分かりにくいですよね? そこで今まで、「分かりやいようにidを書き換えた方が良い」と書いてました。 しかし、パターンのidを書き換えるときは注意が必要のようです。 inkscapeではパターンのidは色々とリンクしています。 下手にidを書き換えると、そのリンクが効かなくなってしまうのです。

パターンを作るときにsvgのコードがどうなっているか、xmlエディタでチェックしながら少しいじってみました。 試したバージョンは0.47です。

パターンを登録すると/svg:svg/svg:defs/にsvg:pattern要素(以降、元パターン)が作成されます。 そしてパターンの元になったオブジェクトはsvg:rect要素に置き換えられます。 そのrect要素を「ノードの編集」状態で見るとパターンの回転や拡大縮小などの変形をするためのマークが表示されます。 パターンの変形をした内容は、最初に登録した元パターンに反映されるケースと、新たなsvg:pattern要素(以降、変形パターン)が作られてそちらに反映されるケースがあります。

  1. そのパターンでまだ何も塗りつぶしていないときは元パターンに反映
  2. オブジェクトを塗りつぶしたことがあり、何も選択していないときは変形記憶用の変形パターン作成
  3. 塗りつぶしたオブジェクトを選択中は、そのオブジェクト用の変形パターン作成

短時間しか調べてないので確実ではないですが、多分こんな感じ。 複雑ですね。 どうやら1つのパターンをオブジェクト毎に変形して使えるようにこうなっているみたいです。 パターンの変形や塗りつぶしを繰り返していると、あっという間にdefsが膨れ上がってしまいます。 計画的にシンプルにパターンを作らないとダメですね。

(ちなみに、変形パターン要素の中身はpatternTransformと元パターンへのリンクだけでした。)

フィル/ストロークダイアログを使ってパターンで塗りつぶすときは、元パターンしか選択できません。 変形パターンはダイアログで表示されません。 せっかくxmlエディタでidを書き換えても選択できないのです。 idを書き換えて意味があるのは元パターンだけのようです。 書き換えるなら、「オブジェクトをパターンに」をした直後にしましょう。

変形用rectのマークで変形するときは注意が必要です。 変形した跡がrectに残るケースがあるからです。 具体的には上のリストで「変形記憶用の変形パターン作成」のとき跡が残ります。 跡の残り方しだいでは、rectの表示と実際の塗りつぶし結果が合わなくなります。 基本的に、塗りつぶした後のオブジェクトを選択中にのみ変形するようにしましょう。 全部のパターンで同じ変形をするときは、パターン登録直後に変形した方が良いです。

塗りつぶされたオブジェクトの塗りつぶしパターンidは変形パターンが作成されたときに、自動で元パターンのid→変形パターンのidと変化しています。 しかしフィル/ストロークダイアログでは元パターンのidしか表示されません。 defsでパターンを探すとき、ダイアログ上のidだけを見て探すと間違えてしまうかもしれません。 オブジェクトのstyle属性からfill:url(#pattern????)を確認して探すようにしましょう。

こんなもんかな? う~ん。 ↑の文章を読み返すとゴッチャゴチャですね。 しかし書き直す気力がない。 ネタがアレだからってことで逃げていいですかね? うん、書き逃げ。