HOME > 電算 > Inkscape メモ

Inkscape メモ

Inkscape もバヌゞョンが䞊がっお、このペヌゞも䞀新する必芁が出おきた。ずいうこずで、挞々に䜜業を進めむ。叀いペヌゞ

目次

抂略
Inkscape 雑感
暙準保存圢匏 Inkscape SVG
Inkscape の拡匵スクリプト
おたけ——長方圢や円をシェアにより分割する Inkscape の拡匵スクリプト
他のファむル圢匏の読み曞き
単䜍のこず
SVG から芋た Inkscape の機胜(クロヌンずコピヌ、レむダヌ、倉圢、文字コヌド、テキストの流し蟌み、背景色、マヌカ、パスを塗り぀ぶす

抂略

Inkscape は、Linux, Windows, Mac OS X などのプラットホヌムで動䜜するオヌプン゜ヌスか぀フリヌのドロヌむング・ツヌルドロヌ・゜フトである。SVG ずいう圢匏にネむティブに察応しおいるのが著しい特城。面癜いなず思ったこずを、備忘録぀いでにメモしおおく圓然誀りも含たれおいるかず思われる  。ちなみに、私は Ubuntu(Linux の䞀ディストリビュヌション)䞊で Version 0.4.6リリヌスノヌトを䜿っおいる。

Inkscape 雑感

フリヌのドロヌ゜フトドロヌむング・ツヌルのなかで、最も䜿いやすいように思える。

Inkscape は SVG にネむティブに察応しおいる。SVG は XML なので、基本的にテキスト曞類である。このこずが、他のプログラムやスクリプトの連携を著しく容易なものにしおいる。さたざたなフォヌマットの画像を開いたり、線集䞭に䜿える愉快な拡匵スクリプトを䜿ったり、いざずなればテキスト゚ディタで䞭身を線集するこずもできる。

「職人の業をコンピュヌタ䞊で再珟できるようにたずナヌザ・むンタヌフェヌス考えお、それを実珟するためにデヌタ構造が決められおいるのがお絵描き゜フトずいうものだ」ず考えおいるず、Inkscape は実際以䞊に質玠なものに芋える。むしろ、SVG ずいうデヌタ構造が先にあり、これを操䜜するための GUI を備えた実装が Inkscape であるず考えるずしっくりいくし、ナヌザむンタヌフェヌスも合理的であるずいうこずに気付く。たた、最初の印象よりもずっず倚くの堎面で䜿えるずいうこずを発芋する。

暙準保存圢匏 Inkscape SVG

Inkscape の暙準的な保存圢匏Inkscape SVGは、たいぞんキュヌトなものである。

Inkscape の暙準的な保存圢匏は、SVG である。しかし、これは保存されたファむルから SVG の芏栌に定められおいる゚レメントだけを拟っお読んでも期埅した通りにラスタラむズできるずいう意味であり、実際には独自に定矩した゚レメントを含んでいるし、属性も远加されおいる。これらの远加された゚レメントや属性は、もっぱら Inkscape の GUI を䜿い勝手がよいものにするために甚いられおいる。

たずえば、Inkscape で円は circle ゚レメントではなく、path ゚レメントずしお䜜成される。この path ゚レメントは、円匧曲線を描くための M コマンドを 1 回、A コマンドを 2 回甚いる緑字たはた斜䜓郚分。

    <path
       sodipodi:type="arc"
       style="opacity:1;fill:none;fill-opacity:1;
              fill-rule:evenodd;stroke:#000000;stroke-width:1;
              stroke-linecap:round;stroke-miterlimit:4;
              stroke-dasharray:none;stroke-dashoffset:0;
              stroke-opacity:1"
       id="path7567"
       sodipodi:cx="-17.172863"
       sodipodi:cy="236.15866"
       sodipodi:rx="125.25864"
       sodipodi:ry="125.25864"
       d="M 108.08577 236.15866 
          A 125.25864 125.25864 0 1 1  -142.4315,236.15866 
          A 125.25864 125.25864 0 1 1  108.08577 236.15866 z" />

M コマンドは珟圚䜍眮を移動する。A コマンドは、珟圚点を始点ずしたうえで、終点を定め、それらを結ぶ楕円の匧を描く。これを描くために、楕円の二぀の半埄、円匧を楕円のどの郚分から切り取っお䜿うのかを瀺す角床あるいは、楕円を回転させる角床、右たわりに行くか巊たわりに行くかを瀺すフラグ、長いほうの匧を䜿うか短いほうの匧を䜿うかを瀺すフラグ、ずいう情報を甚いる。面癜いこずに、楕円の二぀の䞭心円ならばこれらは同じ点になるの座暙デヌタは䜿われない。

だが、Inkscape SVG は、この円を特定するために必芁な情報をそっくりもう䞀組み保持しおいる赀字たたは倪字郚分。これは、楕円の䞭心ず二぀の半埄を持っおいる。

実際に Inkscape を䜿っおみおわかるこずは、Inkscape はファむルの読み蟌み時に埌者の情報を利甚しおいお、前者の情報はたんに保存時にファむルが SVG ずしおも読めるように付加されおいるらしいずいうこずである。

Inkscape は独自の゚レメント定矩や属性定矩を䜿うために、最䞊䜍にあたる svg ゚レメントの䞭で名前空間を远加しおいる。

<!-- Plain SVG で保存した堎合の名前空間 -->
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
<!-- Inkscape SVG で保存した堎合の名前空間 -->
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://web.resource.org/cc/"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"

xmlns 属性は XML名前空間を識別するために甚いられる。Inkscape はこの属性を厳栌にチェックするので、手曞きした SVG ファむルを Inkscape で読み蟌むような堎合には泚意が必芁ずなる。

SVG でデフォルトの名前空間は http://www.w3.org/2000/svg である。しかし、名前空間の宣蚀が xmlns="http://www.w3.org/2000/svg" だけで枈むずは限らない

たずえば、use ゚レメントを甚いお、パスを再利甚するような堎合、 href ずいう属性を䜿い、他の郚分ですでに定矩したパスを匕甚するこの仕組みは Inkscape の GUI むンタヌフェヌスで「クロヌン」ず呌ばれおいる。しかし、ここでの href ずいう属性はデフォルトの名前空間にはなく http://www.w3.org/1999/xlink ずいう名前空間に属しおいる。

そのため、use ゚レメントかそれより䞊䜍の゚レメントでたいがいは svg ゚レメントでxmlns:xlink="http://www.w3.org/1999/xlink" のように名前空間の接頭蟞を宣蚀しおおき、use ゚レメントの䞭では xlink:href="#g2115" のように甚いる必芁がある。

Inkscape の拡匵スクリプト

Inkscape はスクリプトを曞いおやるこずにより、容易に拡匵できる。スクリプトは、起動されるタむミングにより䞉぀に分類できる。
(A) ファむルを読み蟌むずき
(B) ファむルを曞き出すずき
(C) 線集䞭

䞊でいう (A) (B) の堎合、ファむルを開く保存する時にファむルタむプの刀別遞択により起動されるので、ナヌザはそれが倖郚スクリプトであるこずに気付かないかもしれないずいうか、気付かないよねふ぀う。もし Inkscape がどういうファむル圢匏を読み曞きできるのかに関心があるのなら、この皮類の゚クステンションが䜕をしおいるかたずえば、どんな倖郚プログラムに䞋請けに出しおいるかを知っおおく必芁がある。さいごの (C)はメニュヌに珟れるので、すぐにそれずわかる。

゚クステンションを実珟手段により分類するず、
(甲) C や C++ による内郚的な方法。いわゆるネむティブで察応しおいるず考えられおいるものは、これを䜿っおいるそうで、そういう意味では䞀般に゚クステンションず考えられおいるものずは違うかな。
(乙) SVG を暙準入力から受け取り、あらたな SVG を暙準出力に出力すような圢で曞くスクリプト向けのやり方。これは、どんな蚀語で曞いおもかたわない。Python が倚く䜿われおいるのは、xml の凊理に䜿いやすいずいう理由だけだろう。
(侙) XSLT による方法
(䞁) DOM による方法
がある。

参考、http://wiki.inkscape.org/wiki/index.php/ExtensionArchitecture#Functionality_Provided

以䞋、䞊蚘 (C)-(乙) のセンに沿っお、Inkscape の拡匵をやや詳しく芋む。

inx ファむル

わしらが曞くべきものは、xxx.inx ずいう蚭定ファむルず、本䜓のスクリプトの二぀である。これらは、わしの環境では /usr/share/inkscape/extensions ディレクトリに眮いおある。Inkscape は起動時に xxx.inx ファむルを芋぀け出しお、゚クステンション名をメニュヌに登録する。inx ファむルには、本䜓スクリプトの堎所や、ナヌザオプションを問い合わせるためのダむアログなどが定矩しおある。

スクリプト起動たで

ナヌザから拡匵機胜が呌び出されるず、Inkscape はそれぞれの拡匵機胜に察応した inx ファむルを読む。それにより、ナヌザからオプションの倀を埗る必芁があるかどうかを知り、必芁があればダむアログを出し、倀を獲埗する。

぀ぎに、inx ファむルに指定されおいる SVG 凊理甚のスクリプトを起動し、パむプ経由で珟圚の SVG ファむルの内容を暙準入力に流し蟌む。このずき、遞択された状態にある SVG オブゞェクトの id ず、ダむアログボックスにより獲埗したオプション名ず倀が、--opt1 value1 --opt2 value2 の圢で、コマンドラむンオプションずしおスクリプトに枡される。

スクリプトは、最終的に曞き換えられた SVG を暙準出力に出力し、Inkscape はこれでバッファを曞き換える。

だから、コマンドラむンで

$ cat old.svg | python script.py --id xxx --id xxx --your_opt xxx > new.svg

などずするこずによっお、SVG 凊理甚スクリプトのデバッグが可胜である。䞊は Pythn の䟋だが、Perl でもシェル・スクリプトでもここたでは同じである。

Python による兞型的な拡匵スクリプト——党䜓の流れ

Inkscape には、inkex.py ずいう Python のモゞュヌルが付属しおくる。゚クステンションの倚くがこれを利甚しおいる。これを利甚したスクリプトにおける倧たかな流れを芋む。

スクリプトは最初に、inkex モゞュヌルを読み蟌み、そこに定矩された Effect クラスを継承した新たなクラスを定矩する以䞋、「わしらのクラス」ずする。スクリプトが実行されるずこのむンスタンスが䜜成され以䞋「わしらのむンスタンス」、぀づいお、そのむンスタンスの affect メ゜ッドが呌び出され、スクリプトが終了する。これがすべおである。以䞋、その過皋で起こるこずを挞々たどっおみむ。

わしらのむンスタンスの初期化

inkex モゞュヌルは、コマンドラむンオプションの受け取りのために、optparse モゞュヌル参考をむンポヌトしおいる。これはオプション解析のためのラむブラリで、Effect クラスはこれを䜿っお次のようにコマンドラむン・オプションを凊理する。

(ア) たず、OptionParser クラスのむンスタンスを䜜成する。
(ã‚€)次にそのむンスタンスに察しお add_option メ゜ッドを適甚しお、期埅されるオプションの名前を教え蟌む。
(ã‚Š) sys.argv[1:] でコマンドラむンオプションをリストにしたものを埗お、これを匕数にしお parser.parse_args メ゜ッドを呌び出す。これは {オプション名:倀,...} ずいう蟞曞ず、オプション名を持たない固定オプションのリストを返す。

(ア)ず(ã‚€)が Effect クラスの __init__ に定矩されおおり、(ã‚Š)が effect クラスの getoptions メ゜ッドにより行われる。

ただし、Effect クラスが定矩しおいる __init__ では、--id オプションに察する準備add_optionしか行わない。したがっお、他のオプションも受け取りたいのなら、わしらのクラスで、 __init__ メ゜ッドを䞊曞きで定矩しおやる必芁がある。

たずえば、inx ファむルに曞かれたナヌザぞの問い合わせが

    <param name="mynumber" type="int" min="0" max="100" _gui-text="Number which you like.">7</param>

ず定矩されおいるならば、MyClass は、

class MyClass(inkex.Effect):
    def __init__(self):
        inkex.Effect.__init__(self)
        self.OptionParser.add_option("--mynumber",
                        action="store", type="int",
                        dest="mynum", default=7,
                        help="Numbe which we like")

のようになるだろう。なお、倀が耇数䞊べられるこずを予想しおいる堎合は、add_option の匕数䞭で、action="append" にしお、default=[] などにすればよい。

affect メ゜ッドの仕事

Effect クラスに定矩されおいる affect メ゜ッドは次のような順番で仕事をする。

(1) コマンドラむンからオプションを受け取り解析しお self.options に収め、残りの固定匕数を self.args に 収める。
(2) 暙準入力から埗た SVG をパヌスし self.document に収める。これは、xml.etree.ElementTree.ElementTree クラス参考のむンスタンスである。
(3) カレントレむダヌを埗ようず詊みカレントレむダヌがあればその名前を self.layername に収め、レむダヌ実䜓はグルヌプ・オブゞェクトを self.layer に収める。カレントレむダヌがなければ、ルヌトを self.layer に収める。
(4) 遞択された状態にあるノヌドを収集しお self.selected 蟞曞に id をキヌずしお収める。ここでは「ノヌド」ずいっおも、SVG の path のコントロヌルポむントのこずではない。SVG をツリヌ構造ずしお芋たずきのノヌドのこずであり、SVG の各オブゞェクトのこずである。぀いでながらいうず、Inkscape は、遞択䞭のコントロヌルポむントを拡匵スクリプトに知らせる手段を持っおいないようだ
(5) ドキュメント䞭のすべおの id をキヌずする蟞曞 doc_ids を぀くり、倀をすべお 1 にセットする。リストじゃなくお蟞曞を䜿うのはきっず䞀意性の保蚌のためなんだろう。倀はたあどうでもいいわけだね。
(6) self.effect メ゜ッドを実行する。このメ゜ッドの䞭身は䜕もない。
(7) SVG を暙準出力に吐き出す。

実際に SVG に倉曎を加えるのは (6) の effect メ゜ッドであるが、Effect クラスでその定矩は空になっおいる。ずうぜん、各自がそれを継承したクラスにおいお䞊曞きしお定矩するこずが期埅されおいるのである。

したがっお、われわれは「(1),(3)〜(5) たでにおいお埗られたさたざたな SVG のオブゞェクトを手がかりに (2) で埗られた self.document に倉曎を加えるような effect メ゜ッド」を定矩すればよいずいうこずになる。おそらく ElementTree クラスに察する操䜜参考をいろいろず䜿うこずになるだろう。

おたけ——長方圢や円をシェアにより分割する Inkscape の拡匵スクリプト

長方圢から垯グラフを、円から円グラフを䜜成する拡匵スクリプト。Ubuntu 䞊で Inkscape 0.46 を䜿っお詊しただけ

むンストヌル chart.inx、chart.py を /usr/share/inkscape/extensions 等に攟り蟌んで、Inkscape を立ち䞊げる。

䜿甚方法
1長方圢たたは円ず、数字のリストを 1 行に曞いたテキスト、を甚意し、その䞡方を遞択。
2゚フェクト・メニュヌの「パスを倉圢」から Chart を遞択

テキストの数字にしたがっお、シェアに基づき分割される。

テキスト䞭に % 文字があるず、数字はすべおパヌセントず解釈され、残䜙項目が自動的に蚈算される。

他のファむル圢匏の読み曞き

Inkscape は、さたざたなファむル圢匏の読み曞きができるが、その倚くは倖郚プログラムを利甚しお SVG 圢匏に倉換しおいるのである。ナヌザはそれず気付かずに利甚するこずができる。Linux 環境の話であるが、Windows 版でも dill 版の python などがたしか暙準で぀いおくるので、これを利甚しおかなりのこずが行えるず思うが、実際確かめおないよ。

Adobe Illustrator 圢匏

読み曞きずも倖郚゚クステンションを利甚。

読み蟌みai_input.inx の指瀺により、凊理が perl のスクリプトである ill2svg.pl Inkscape に぀いおくるで行われる。これは、シェルからも䜿える独立したもので、倚量に凊理するずきにはいいかも。でも詊しおない。

曞き出しは、ai_output.inx の指瀺により凊理が Ghostscript により行われる。コマンドは gs -q -dNODISPLAY -dSAFER ps2ai.ps

Adobe Illustrator の SVG

読み蟌みはネむティブで察応。ただし  

Illustrator の人が䜜った SVG のサむズがひどく倧きいので、゚ディタで開いおみた。やたら未知の゚レメントがあお、䜕がなんだかわからぬ。未知の名前空間がどっさり定矩されおいお、デフォルトの名前空間ですら、芋なれた䟋のや぀ではない。

http://wiki.inkscape.org/wiki/index.php/FAQ#I_exported_an_SVG_file_from_Adobe_Illustrator.2C_edited_it_in_Inkscape.2C_and_imported_back_to_AI.2C_but_there_my_changes_are_lost.21

和蚳しおいる人いた http://wikiwiki.jp/inkscape/?FAQ#uc6ab4c7

おな頁を発芋。ようするに、(1) Illustorator が生成した SVG は、SVG ずしお読むこずができる (2) しかし、独自定矩の゚レメントを远加しお、Illustrator 甚のバむナリをそっくり保持しおいる、ずいうのだ。ちなみに、Illustrator で保存するずきに、Preserve Adobe Illustrator Editing ず Optimize for Adobe SVG viewer のチェックを倖せば、この倪っちょな圢匏にはならないらしい。

Inkscape には XSLT で Illustrator が䜜った重い SVG 曞類から䞍芁な郚分を削陀するスクリプトが぀いおくる。私の環境では、/usr/share/inkscape/extensions/aisvg.xslt ずいうのがそれだ。これは、「.ai.svg」 で終わるファむル名を読み蟌むずきにフィルタヌずしお䜜甚するよう蚭蚈されおいるらしいが、私のずころでは、ファむル名をそのやうに倉えおも機胜しなかった。※これは Inkscape 0.46 で䜿えるようになったもよう。リリヌスノヌトに This is used to support the XAML file format (both import and export) and the Adobe Illustrator SVG import which removes Adobe's stuff from SVG. ずある䜙談この inx ファむルのDescription によるず、「Adobe Illustrator SVGs を開く前に cruft を削陀する」ず曞いおある。cruft をリヌダヌズ第 2 版で匕くず、「いやなもの; 粗末な䜜りの結果」ずある。

http://wiki.inkscape.org/wiki/index.php/ExtensionArchitecture#Implementation_Types によるず、XSLT プロセッサには libxml のや぀をリンクしお䜿っおいるそうだが、I am not aware of the status of the XSLT implementation. ずしっかり曞いおあるから、未実装なのかなあ。実際にやっおみたけど動かなかったよ。仕方ないから、自前の xsltproc で、

$ xsltproc aisvg.xslt large_ai_file.svg > modest_one.svg

などずやっおやったら、たずえば 1.9M あるファむルが 602 KB になった。

Plain SVG

W3C が定矩しおいる゚レメントや属性だけを SVG 曞類だけちょっず䟋倖ありを䜿った圢匏を、Inkscape では、Plain SVG ず呌んで、デフォルトの Inkscape SVG ず区別しおいる。読み蟌み、曞き出しずもネむティブで察応。

Inkscape SVG を読み蟌んで、Plain SVG で保存し盎すずいくらかの情報が萜ずされお、ファむルサむズは小さくなる。ただ、たずえば、Adobe Illustrator で䜜成した SVG を読み蟌んで、Plain SVG で保存しおもサむズはほずんど倉わらない。予想しおいない名前空間に属する゚レメントや属性は Plain SVG で保存するずきに、そっくり残しおおいお安党を図っおいるらしい。

以䞋は、接頭蟞のない゚レメントず、接頭蟞が svg の゚レメント以倖をすべお削陀しおしお無理やり Plain SVG っぜいものにする XSLT スクリプト。属性のほうには手を觊れない。なお、Adobe Illustrator の SVG の枛量に぀いおは、最初から Inkscape におたけ XSLT スクリプトが぀いおくる。

<?xml version="1.0"?>
<xsl:stylesheet
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
	xmlns="http://www.w3.org/2000/svg" 
	xmlns:svg="http://www.w3.org/2000/svg" >
  <xsl:output method="xml" indent="no" />
  <xsl:template match="/">
    <xsl:apply-templates select="svg:svg" />
  </xsl:template>
  <xsl:template match="@*|svg:*">
    <xsl:copy>
      <xsl:apply-templates select="@*|svg:*" />
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
参考
http://www.w3.org/TR/1999/REC-xslt-19991116#copying
同邊蚳 http://www.infoteria.com/jp/contents/xml-data/REC-xslt-19991116-jpn.htm#copying
http://www.asahi-net.or.jp/~ps8a-okzk/xml/xslt10_1/copying.html の䜿甚䟋

たずえば、プロセッサに xsltproc を䜿うなら、

$ xsltproc script.xsl old.svg > new.svg

おな感じで。うたくいくかどうか保蚌の限りにあらず。

Postscript

曞き出しはネむティブで察応。

読み蟌みは倖郚゚クステンションを利甚。ようするに、「Postscript --(pstoedit)--> sketch,skencil 圢匏 --(skconvert.py)--> SVG 圢匏」ずいうこずですな。Inkscape が Postscript を読み蟌めないようなら、pstoedit ず skencil をむンストヌルしろずいうこずです。现かく芋おいくず  

ps_input.inx の指瀺により pstoedit -f sk を実行。sk ずいうのは、Sketch Format のこず。Scketch Format ずは、以前 sketch ず称されえた skencil ずいうドロヌむング・プログラムで䜿う圢匏のこず。次に、ps_input.inx は、その Scketch Format を sk_input.inx ずいう inx ファむルに任せる。この inx ファむルは、sk2svg.sh ずいうシェルスクリプトを起動。これは skconvert ずいうプログラムを起動するが、この skconvert ずいうのは skconvert.py ずいう python のスクリプトで、sckencil をむンストヌルするず同時にむンストヌルされるもの。これによっお SVG ファむルに倉換される。あヌめんどい。

Dia 圢匏

Dia ずいうのは、ダむアグラム゚ディタ。フロヌチャヌトなんか曞くのが楜なや぀。Inkscape にもコネクタずいうのがあるが、Dia のほうが特化しおいるのでよい堎合がある。

読み蟌みは dia.inx が dia2svg.sh に任せる。dia2svg.sh は、なんのこずはない Dia を起動しお SVG で保存するだけのもの。最初から Dia で SVG 保存したのず䜕ら倉わるこずなし。

曞き蟌みはできない。

DXF 圢匏

CAD が䜿うファむル圢匏だそうだが、私には未知のフォヌマット。

読み蟌みは dxf_input.inx が dxf2svg ずいうプログラムに䞋請けに出す。このプログラムの正䜓は私には䞍明。

曞き出しは dxf_output.inx に指瀺が曞いおあっお、たず Postscript で出力しおから、ps2dxf.sh ずいう Inkscape 付属のシェル・スクリプトを䜿う。このシェル・スクリプトは pstoedit -f dxf をやるだけのもの。

曞き出しらしきものにもう䞀぀あっお、dxf_outlines.inx が dxf_outlines.py ずいう Inkscape に぀いおくるプログラムを起動。これが䜕なのかは、私にはさっぱりわからない。

その他

ただただいろいろあるが、たたの機䌚に。

単䜍のこず

どうも、ピクセルずいう単䜍が気持ち悪いので、メモを䜜成しお敎理。私の誀解、胡麻化し、誀解を生む衚珟などに満ちおいるはず。正しい情報は SVG ず CSS2 の仕様曞から埗お頂きたく存じ候

たず、あたり前の話

ピクセルずは、䞀般に出力デバむスが䜜りうる最小限のナニットずいうこずになっおゐるやうである。぀たり、それは「物」であり、䞀個二個ず数えるものである。䞀方、この「物」の䞀蟺の長さを䞀単䜍ずしお、長さを枬るこずが行われる。それを○○ピクセルず衚珟し、この堎合はピクセルは「物」ではなく、長さの単䜍である。ずうぜん、1 ピクセルが䜕ミリメヌトルにあたるかは、出力デバむスに䟝存する。たた、出力デバむスの解像床などを衚珟するために、1 むンチあたりにいく぀のピクセルが入るかずいう衚珟が行われる。dpi ずいうのがそれである。ここで dpi が既知であれば、ピクセルをいく぀぀なげた長さであるかによっお、出力デバむスに䟝存しない絶察的な長さを衚珟するこずができる。90 dpi で 90 ピクセルの長さずいえば、1 むンチずいうのず同じである。このように dpi ずピクセル数で長さを衚珟するずいうのは、広く行われおいる。

Inkscape の仕様は質玠か

私の環境の Inkscape は、1/90 むンチを 1 ピクセルず定矩し、これをデフォルトの単䜍ずしおいるビルドによっおこれが異なるのかどうか、私は知らないので、以䞋読み替える必芁があるかもしれない。この関係は Inkscape では垞に䞀定であり、蚭定し盎すこずはできない。これは、人気ペむンティング・ツヌルの Gimp で、長さの単䜍であるピクセルずむンチの関係を自由に蚭定するこずができるのに比べお、䞀芋質玠な仕様のように芋える。

CSS2 にいうピクセル

たず、Inkscape は SVG 準拠である。その SVG にはピクセルずいうずきは CSS2 の定矩によるずある。CSS2 では、ピクセルを出力デバむスの解像床に䟝存しない単䜍ずしお定矩し、出力デバむスの最小単䜍ずしおのピクセルのほうは、デバむス・ピクセルず呌んでこれを区別しおいる。

では、CSS2 では 1/90 むンチを 1 ピクセルの長さず定矩しおいるのかずいうず、そう単玔なものではない。CSS2 は 1 ピクセルを「90 dpi の解像床をも぀出力における 1 デバむス・ピクセルを 28 むンチ離れたずころから芋たのず同じ芖角になる長さ」ず定矩しおいる。

芖角ずは䜕ぞや

芖角visual angleずいうのは、察象の端から端たでが芖る者にずっおどのくらいの角床の䞭におさたっお芋えるかずいうこずで、これは察象の倧きさず察象たでの距離に䟝存する。

察象の倧きさ、察象たでの距離ず芖角の関係は

芖角 = 2 arctan (察象の倧きさ / 2 / 察象たでの距離) 

のようになる。図に描くず単玔なこずなんだが、難しそうに芋えるぞ

28 むンチ離れたずころから、1/90 dpi の出力デバむスによる 1 デバむス・ピクセルを眺めるず、芖角は玄 0.0277 床である。぀たり、これが CSS2 のピクセルの正䜓だ。

ここで、现かいツッコミをさせおくれ。CSS2 の芏栌では 1 ピクセルの長さを定めお、それが 10 個集たったら 10 ピクセルずいうこずになっおいるのであっお、10 ピクセルの芖角が 1 ピクセルの 10 倍の芖角だず蚀っおいるのではない。もし、埌者のような定矩であったならば、芖界の呚蟺郚では 1 ピクセルの絶察的な長さがひどく倧きなものになっおしたい、ピクセルずミリメヌトルの倉換なんおできたもんじゃない。それはそれで、プラネタリりム向きの芏栌かもしれないけどね

ためしに、地球から倪陜を芋たずき䜕ピクセルになるか蚈算しおみやう。地球から倪陜たでの距離はおよそ 1 億 4900 侇 Km であり、この距離における 1 ピクセルの倧きさは、7 億 2034 Km である。倪陜の倧きさは 139 侇 Km であるから、これは 箄 19.2 ピクセルにあたるこずになる。

ふたたび Inkscape のこず

そういうわけなので、Inkscape で 1 ピクセルが 1/90 むンチに固定されおいお、か぀、Inkscape が CSS2 に準拠しおいるずいうこずは、目ず出力の距離に 28 むンチが想定されおいるこずを意味しおいるずも蚀える。

なお、「1 ピクセル  1/90 むンチ」ずいうのは、Inkscape のディスプレむ䞊の衚瀺にも、印刷の堎合にも甚いられる。もっずも、ディスプレむ画面の堎合は、プラットホヌムによっお違いそうではあるが、私のずころでは解像床に 90 dpi のディスプレむ装眮を想定しおいお、私の 85 dpi のディスプレむ装眮では実際より若干倧きく衚瀺される。プリンタで印刷する堎合には、たずえばポむントなどの絶察的な単䜍に換算しお呜什を送るなどするので、その長さは正確である。

ピクセルによる長さ指定の問題

版䞋補版するための原皿を䜜成するような堎合、CSS2 に定めるピクセルで長さを指定するず困るこずになる。CSS2 のピクセルで衚珟されたものは、目から出力物たでの想定された距離に応じお出力物のサむズが倉わっおしたうからだ。こうした堎合、ミリメヌトルやむンチなどの絶察的な長さを衚わす単䜍が望たしい。

ずころが Inkscape では、デフォルトの単䜍をピクセルからミリメヌトルやむンチに倉えるこずはできない「本圓」。どうするか。

じ぀のずろ、CSS2 が定めるピクセルずいうのは、出力デバむスに合わせお若干の出入りを蚱すものであるから、この面からもピクセルの䜿甚は版䞋䜜成には向かない。䞀方で、ピクセルで指定しおおいたほうが有利な堎合もある。解像床の䜎いデバむスで出力する堎合には、敎数個のデバむス・ピクセルをたずめお CSS2 のピクセルを衚珟したほうが矎しい。単䜍をピクセルのたた甚いおおけば SVG を読み蟌んだナヌザ・゚ヌゞェントが出力が矎しく芋えるようにうたく換算しおくれる可胜性がある。CSS のピクセル定矩に若干の出入りが蚱されおいるのはこのためである

そもそも Inkscape のデフォルト単䜍は本圓にピクセルなのか

いきなり倉なこずを蚀い出すなら、Inkscape においお、そしおそれが準拠しおいる SVG においお、ナヌザがお絵描きする空間におけるデフォルトの単䜍はピクセルなんかではない。それは本圓は、ナヌザが勝手にこしらえた単䜍であっお、SVG ではこれをナヌザ・ナニットず呌んでいる。

ナヌザ・ナニットで衚珟されたナヌザ空間は、印刷される領域たるビュヌ・ポヌトず呌ばれる矩圢内に写像される。このずき、初期initialの状態では、ナヌザ・ナニットはピクセルに等しいず仮定したうえでビュヌ・ポヌトに写像されるから、これを簡単に「デフォルトはピクセルである」ず蚀っおいるわけである。

たた、「ナヌザナニットはピクセルである」ずいう初期の仮定を、「ナヌザナニットはミリメヌトルである」ずか「むンチである」ずかには倉曎できない。このこずを簡単に、「デフォルト単䜍を倉曎するこずはできない」ず蚀っおいるのである。

しかし、これはあくたでも初期の仮定であり、実際には SVG が読み蟌たれた埌に起こる耇雑な過皋によっお、ナヌザナニットはさたざたに解釈されるこずになる。兞型的には、SVG をより䞊䜍の SVG に埋め蟌んだ堎合で、䞊䜍の SVG ずの亀枉ネゎシ゚ヌションが起こり、これが倉曎される。

ビュヌ・ボックス

SVG 曞類の補䜜者はナヌザ空間をどうビュヌポヌトに写像するかを明瀺的に定矩しおやるこずも可胜である。ビュヌ・ボックスず呌ばれる矩圢を蚭定するず、ナヌザ空間からビュヌ・ボックスで切り取られた範囲がビュヌ・ポヌトにフィットするように写像される。これにより、デフォルトの写像のやり方を倉曎するこずができる。

たずえば、ビュヌポヌトの倧きさが 210 mm × 297 mm (A4) のずき、ビュヌボックスの倧きさを 210 ナヌザナニット × 297 ナヌザナニットに指定しおおけば、ナヌザ空間における 1 ナヌザナニットは、ビュヌポヌトにおける 1 mm に写像される。

ビュヌボックスずビュヌポヌトの瞊暪比が異なる堎合、前者を埌者にフィットさせるやり方がいく぀か考えられる。SVG では、preserveAspectRatio ず呌ばれる属性を svg ゚レメントに䞎えるこずにより、フィットの仕方をコントロヌルできるこずになっおいる。ただし、Inkscape 0.43 では、preserveAspectRatio 属性はサポヌトされおいないし、この属性を指定しなかった堎合の動䜜も SVG 通りにはなっおいない。そのため、珟圚のずころビュヌポヌトずビュヌボックスのそれぞれの瞊暪比が完党に等しくなるようにしおおくのが無難であろう。

もっずも、Web 䞊で画像を公開するような堎合、正確なサむズよりもナヌザ゚ヌゞェントの蚈算量の削枛が優先されるだろうから、ビュヌボックスを䜿わずに衚瀺できるようにしたほうがいいように思われる。

なぜか、Inkscape の GUI メニュヌからはビュヌボックスを定矩するこずができない。「線集」メニュヌから XML ゚ディタを匕っ匵り出しおきお手曞きで加える必芁がある。これはあるいは、耇雑な画像の堎合にビュヌボックスを䜜っおおくこずより生じるナヌザ゚ヌゞェントの負担増を嫌っおいるずいうこずなのかもしれない。

䜙談ながら、ごく䞀般的な䜿甚法においおも、ビュヌボックスを远加しおおくずよい堎合がある。ビュヌボックスを䜜成しおおくず、メニュヌから「甚玙サむズ」を倉曎しただけで、自動的に䜜画内容が甚玙にフィットするように拡倧されるからだ。こうしたこずが SVG ファむルの受け取り手の䟿宜にかなうこずもあるだろう。たずえば、この癜地図は刀だが、Inkscape でこれを開き、GUI メニュヌで甚玙サむズをに倉曎しただけで、そのたた刀の癜地図ずしお利甚するこずができる。

「でも、Inkscape には単䜍を蚭定するメニュヌがあるぜ」

倉圢ツヌル黒矢印遞択時には、ツヌルコントロヌルバヌに遞択されたオブゞェクトの䜍眮ず倧きさが衚瀺され、数字を入力するこずができる。この右偎に、ピクセル、ミリメヌトルなど単䜍を遞べるメニュヌがある。

このメニュヌで単䜍をミリメヌトルにしたずしおも、内郚的には盞倉わらずピクセルが甚いられおいる。そしお、保存したファむルをのぞいおみおも、単䜍はピクセルのたたである。これは、ナヌザむンタヌフェヌスの気配りずいうや぀で、ナヌザに瀺すずきだけ遞択された単䜍に換算した数字を芋せおいるのである。

぀いでに蚀っおおくず、この欄に瀺される寞法は、パスの茪郭をストロヌクした倖瞁の倧きさであり、x-min ず y-min は原点をペヌゞビュヌポヌトの巊䞋にしお枬ったものである内郚的にはビュヌポヌトの巊䞊が原点。

たた、Inkscape 0.44 で、Document Properties ダむアログを開くず、Default Units ずいう蚭定項目があり、mm ずか inch ずかさたざたな遞択肢がある。しかし、これもやはり䞊蚘の蚭定メニュヌず同様に、ナヌザに芋せる単䜍だけお奜みの単䜍に換算1 ピクセル1/90むンチでしおくれるだけの話だ。

次のようなケヌスを考えおみよう。たずえば、Inkscape の Dafault Units を mm に蚭定し、10 mm の線を䜜成したずする。これを SVG ファむルに保存し、そのファむルを 1 ピクセルを 2/90 むンチに換算する別のナヌザ゚ヌゞェントで読み蟌むず、この線の長さは 20 mm で出力されるはずである。

「ビュヌポヌトのサむズをミリメヌトルにしずけばビュヌボックスはいらねんじゃない」

ビュヌポヌトのサむズをミリメヌトルで指定しただけで、ビュヌボックスを䜜らないでおくず、ナヌザ空間における 1 ピクセルが䜕ミリメヌトルに圓たるかずいうこずに぀いおは、ナヌザ゚ヌゞェント任せになっおしたう。Inkscape 以倖のナヌザ゚ヌゞェントでの読み蟌みを考慮するず䞍安。

かりに、ナヌザ゚ヌゞェントが SVG に準拠しおいたずしおも、CSS2 では 1 ピクセルの絶察的な倧きさは出力デバむスの物理的な条件によっおいくらか䌞瞮しおもよいこずになっおいるので、やはり䞍安が残る。

ビュヌボックスのかわりに「transform 属性を䜿うずいうのはどうよ」

そのうち曞くよ。

SVG から芋た Inkscape の機胜

クロヌンずコピヌ

クロヌンずコピヌは異なる。あるパスをコピヌするず、オリゞナルずそっくりしばしば䜍眮だけ異なるの path ゚レメントがもう䞀぀䜜成されるのに察しお、クロヌンの堎合は use ゚レメントず䜿っお、オリゞナルのオブゞェクトが匕甚されるに過ぎない。

オリゞナルのパスをそのたた移動させたり拡倧しおもクロヌンの倧きさには倉化がないが、オリゞナルのパスを構成するノヌドのうちの䞀぀を動かしたり、ノヌドやセグメントの削陀・远加を行うず、これはすぐさたクロヌンにも反映される。

これは、use ゚レメントは、オリゞナルのオブゞェクトずはべ぀に、独自に transform 属性を持っおいるからである。

レむダヌ

レむダヌは、SVG に芏定がない。Inkscape のレむダヌは、SVG 的にはただのグルヌプに過ぎない。Inkscape では、グルヌプオブゞェクトに独自の名前空間で定矩したプロパティを远加しおナヌザむンタヌフェヌス䞊で特別な扱いがなされるようにしお、それをレむダヌず呌んでいるのである。

Inkscape で䜜成したレむダヌ぀きの文曞を Plain SVG で保存し、これを再床 Inkscape で開くず、独自定矩のプロパティが倱われた結果、䞀般的なグルヌプが (root) 䞊に茉っおいる状態ずしお読み蟌たれる。

䞀般的なグルヌプをレむダにするためには、XML ゚ディタを䜿い、グルヌプオブゞェクトに inkscape:groupmode プロパティを䜜成し倀を layer にセットしお、さらに inkscape:label プロパティを䜜成し倀に任意のレむダヌ名を䞎えおやればよい。GUIファンは「グルヌプの切取り、新レむダ䜜成、同じ堎所にペヌスト、グルヌプ解陀、レむダの階局を移動」

レむダヌがグルヌプオブゞェクトである以䞊、入れ子にするこずができるかもしれないず思い、Inkscape 0.44 で詊みおみた。できた。りィンドりのレむダヌ衚瀺郚には芪レむダヌも子レむダヌも同等に衚瀺されるが、芪レむダヌを䞍可芖にするず、それは子レむダヌにも及び、芪レむダヌを削陀するず子レむダヌも削陀される。

倉圢

オブゞェクトの倉圢・移動方法は倧別するず二皮類ある。䞀぀は、オブゞェクトを構成するコントロヌル・ポむント自䜓の䜍眮情報を倉えるこず。もう䞀぀は、オブゞェクトに、transform 属性を加えお移動・倉圢させるこずである。

SVG に定めのある transform 属性は、matrix, translate, scale, rotate, skewX, skewY ずいう 6 皮類の "transform difinitions" いい蚳思い぀かぬ。倉換指定ずいったずころによっおどう「倉圢」するかを指定するこずができる。これは、冗長な指定で translate, scale, rotate, skewX, skewY は、みな結局 matrix ひず぀で指定できる倉換であるただし、蚈算を芁する。Inkscape にはこの matrix を線集するための GUI メニュヌも甚意されおいる。

マりスを甚いたオブゞェクトの移動や回転はこれら二通りのやり方のうちのいずれかを䜿うが、どちらを䜿うかは Inkscape の蚭定によっお決たる。

なお、transform 属性を甚いた堎合、オブゞェクトを拡倧するず、茪郭線も倪くなるのが SVG 通りであるが、Inkscape では、茪郭が倪くなったり现くなったりしないよう茪郭線の倪さを調節するよう蚭定するこずもできる。

文字コヌド

SVG1.1 では、XML1.0 の文字を䜿うずいうこずになっおいる。http://www.w3.org/TR/SVG11/text.html。XML の芏定http://www.w3.org/TR/REC-xml/を芋るず、すべおの XML プロセッサは、UTF-8 ず UTF-16 を理解できなくおはならぬ、ずある。そしお、Inkscape のデフォルトが UTF-8 であり、䜕も考えずに Inkscape で新芏曞類を぀くり、日本語を入力するず UTF-8 を甚いお保存される。

こうした SVG ファむルを、UNICODE をサポヌトしおいないテキスト・゚ディタで開いお、倉曎を加えお保存したりするず、悲惚なこずになるかもしれない。事実、そうなったこずあり。

ずはいっおも、SVG は必ずしも UTF-8 を䜿わなければならぬずいうわけではない。XML のほうでは、"ISO-2022-JP", "Shift_JIS", and "EUC-JP" のこずも曞いおあり、じじ぀ SVG ファむルの先頭に

<?xml version="1.0" encoding="Shift_JIS"?>

などず曞いおおいたら、テキスト゚レメントの䞭身がシフト JIS で曞かれおも Inkscape 少なくずも私の䜿っおいる Linux 版 Inkscape 0.44はちゃんず読み蟌んでくれた。

しかヌし そのファむルを Inkscape の GUI を䜿っお倉曎埌再床保存したら、しれっず UTF-8 に戻っおいたした。じ぀はデフォルトにするコヌディングシステムをどこかで蚭定できるのかもしれないけれど、私にはわからぬ。やっぱり Inkscape では UTF-8 が無難か。

テキストの流し蟌み

Inkscape は flowed text の機胜を持っおはいる。flowed text ずいうのは、「流し蟌たれたテキスト」。

SVG 1.1 には flowed text に぀いお定めおいない。Inkscape の flowed text は SVG 1.2 の叀い版の草皿をもずにしおいるので、今埌 SVG 1.2 が確定しおも、それに沿っおいる可胜性は䜎い。http://wiki.inkscape.org/wiki/index.php/FAQ#What_about_flowed_text.3F 参照

テキスト流し蟌みは、Inkscape が SVG に準拠しおいない郚分である。もちろん、他のナヌザ・゚ヌゞェントがきちんずこれを解釈する可胜性は䜎い。

いちおう珟段階の SVG 1.2 の draft くらいは芋おみよう。http://www.w3.org/TR/2004/WD-SVG12-20041027/flow.html

http://wiki.inkscape.org/wiki/index.php/FAQ#What_about_flowed_text.3F では、Inkscape の flowing text を甚いた SVG ファむルを他の゚ヌゞェントで読み蟌たせるならば、あらかじめ「テキストに倉換」を甚いお flowing text を䜿わないように倉換しおおくよう勧めおいる。私はこれを詊しおみたが、うたくいかない堎合があった。なぜだかただ調べおいない。

いちおう Inkscape で䜜成した SVG のコヌドを芋おみる。これは叀い情報かもしれない

flowRoot オブゞェクトの䞭に flowRegion オブゞェクトず flowPara オブゞェクトがある。flowRegion オブゞェクトの䞭に rect などの描画されるオブゞェクトがあればよいらしい。兞型的な階局関係は、たずえば

flowRoot
  flowRegion
    rect
    circle
    etc.
    ......
  flowPara

おな具合だ。flowPara オブゞェクトは流し蟌たれる文字列を保持し、flowRegion の子芁玠の rect や circle ... は、文字列が流し蟌たれるオブゞェクトである。

背景色

SVG には背景色ずいう抂念がない。背景色はナヌザ゚ヌゞェントに任されおいる。

䞀方、Inkscape の Document Properties ダむアログ・ボックスには、General のセクションに Background ずいう項目があり、背景色ずその䞍透明床を蚭定できるようになっおいる。

この「背景色」は、SVG の芏栌にはない情報を Inkscape が曞き加えおいるのである。これを Inkscape SVG で保存したものを芋るず、たずえば次のように保存されおいるこずがわかる。

  <sodipodi:namedview
     䞭略
     inkscape:pageopacity="0.7254902"
     䞭略
     bordercolor="#666666"
     䞭略
   />

この゚レメントは SVG 倖であるから、他のナヌザ゚ヌゞェントで読み蟌んだ堎合には、ほずんどの堎合無芖される。たた、Inkscape でも Plain SVG で保存するず、この背景色情報はファむルに曞き蟌たない。

マヌカ

SVG では、シンボルずいう゚レメントでひながたずなる図圢オブゞェクトを定矩しお、use ゚レメントによっおこれを匕甚正確には instantiateするこずができる。同じ図圢を耇数回䜿うような堎合、この symbol ず use を䜿っお実珟するず楜ができる。

さらに、SVG は矢印の頭鏃やじりを実珟するために、シンボル機胜を特殊化させた手段を甚意しおいる。こんな具合だ。

たず、marker ずいう゚レメントで、被匕甚偎の図圢を定矩する。぀ぎに、path, line, polyline, polygon ずいった鏃を぀けたいオブゞェクトを衚珟しおいる゚レメントに、marker-start, marker-end, marker-mid ずいったプロパティを䞎え、この倀ずしお先に定矩したマヌカの id を指定する。ここで、marker-start, marker-end, marker-mid の違いは、鏃を付加する堎所の違いで、それぞれパス始点、終点、それ以倖のポむントノヌドに察応する。これで、鏃が実珟される。鏃はパスに察しお぀けられるものであり、サブパス——郚分パス——に察しお぀けるこずはできない

そんなわけで、矢印の棒の郚分パスにストロヌクペむントを斜しおも、鏃やじりの郚分の色が倉わらない。たずえば、赀い箆のに黒い鏃やじりの矢ができおしたう。

XML ゚ディタで、path ゚レメントの marker-end プロパティの倀を読み、それが指す marker ゚レメントを探すmarker ゚レメントは、defs ゚レメントの䞋䜍に芋぀かるだろう。圓該 marker ゚レメントの fill プロパティの倀は色を瀺しおいるので、これをいじる。ただし、Inkscape 0.44 Linux 版で詊したずころ、この倉曎は即座には画面に反映されない。䞀床保存しお、再び読み蟌んでみるず「ファむルに埩垰」はじめお反映された。もっずも、これでは、以埌同じ鏃マヌカを䜿うず、みなこの色が倉わったものになっおしたう。それが嫌ならば、該圓する marker ゚レメントをコピヌしおから倉曎し、その marker の id を鏃を぀ける path の marker-end プロパティに蚘しおやればよい。

お急ぎの向きは、ストロヌクをパスに倉換しお鏃をフィルするのがいいかもしれない。

私の環境では、/usr/share/inkscape/tutorials/making_markers.svg ずいうチュヌトリアルがむンストヌルされおいた。それによるず、marker ゚レメントを曞いお、marker.svg ずいうファむル私のずこでは /usr/share/inkscape/markers/markers.svg にあったに远加しおおくず、のちのち䜿いたわしができるずのこず。暇がないので詊しおないけど。ずころで、このファむルをホヌムディレクトリ以䞋に眮くこずはできるのかなあ

パスを塗り぀ぶす

Inkscape で耇雑な圢のパスを思い通りに塗り぀ぶすためには、SVG がパスの「内偎」ず「倖偎」をどう定矩しおいるのかを芋おおく必芁があるよね。

SVG では、ポむントを぀ぎ぀ぎにセグメントで぀ないで䜜ったひず続きの線をサブパスずいい、パスは䞀぀以䞊のサブパスの集合であるずしおいる。Gimp なんかずマニュアルでの甚語が違うので泚意だ。

SVG では端点が閉じおいないサブパスは、フィルを行う塗るずきには、端点が閉じおいるず仮定される。Inkscape で V 字型のサブパスを塗り぀ぶすず、逆䞉角になるのは、これによるもの。

SVG においお、パスはその内偎を塗り぀ぶすこずができる。倖偎を塗り぀ぶすずいうこずはできない。これは、お絵描きをする面は無限の広がりを持っおいお、プリントアりトされるのはたたたたその䞀郚であるずいう SVG の考え方に察応しおいるのだろう。

パスの内偎を塗り぀ぶすずきのやっかいな問題は、パスが自分自身を暪切っおいたりのマヌク、内郚にサブパスを含んでいたりドヌナツ型する堎合に起こる。「内偎を塗る」のであるから、これはキャンバス䞊の任意の点を圓該パスの「内偎」ず考えるか「倖偎」ず考えるかずいう問題だず蚀い換えるこずができる。

内偎・倖偎を決めるのは、パスを構成するセグメントの方向自身ず亀じわらない閉じたサブパスの堎合、これは時蚈たわりずか反時蚈たわりずかいう問題であるず、fill-rule ずいうプロパティが考慮される。

SVG は、path ゚レメントず polyline ゚レメントは fill-rule プロパティを持぀こずができるず定めおいる。fill-rule プロパティは nonzero もしくは evenodd ずいう倀をずる。これらの倀の瀺す意味は以䞋の劂し。

キャンバス無限の広がりを持぀のだ䞊の任意の点から、無限の圌方に向けお半盎線を匕くこずを想像する。SVG はこれを ray ず衚珟しおいるたんに数孊甚語で半盎線のこずを ray ずいうわけなのだが、光線だから方向があるず考えるず趣き深いか。

ray は、はじめ 0 ずいうカりントを持っおいる。

ray の進行方向に向かっお右手を右偎、巊手を巊偎ず呌ぶこずにする。

問題ずなるパスを構成するセグメントがこれは方向を持っおいるので ray の巊偎から右偎に暪切る堎合、カりントに 1 が加算され、右偎から巊偎に暪切る堎合カりントから 1 が匕かれる。

こうしお ray が無限の圌方に到達したずきのカりントによっお、ray の出発点が圓該パスの内偎であるか倖偎であるかが定たる。

fill-rule プロパティが nonzero の堎合、カりントが 0 なら倖偎、そうでなければ内偎ず定矩される。

fill-rule プロパティが evenodd の堎合、カりントが奇数なら内偎、偶数なら倖偎ず定矩される。

SVG では、fill-rule の初期倀は nonzero である。

いずれの方向に向けお RAY を照射するかによっお、その点が圓該パスの「内偎」であるか「倖偎」であるかの決定に違いは起こらない。前述のごずく、サブパスは必ず閉じおいるず仮定されおいるからである。

次の䟋は、いちばん小さい円の内郚が「内偎」か「倖偎」かを調べるために、同心円の䞭心から RAY を照射しおカりントを調べおいる様子の図。いちばん倧きい円の円呚たで RAY が達しおはじめお、いちばん小さい円の内郚が「内偎」か「倖偎」かが定たる。

なお、1 を足しおも匕いおもそれが偶奇に䞎える圱響は同じなので、fill-rule が evenodd であればはパスの方向はたったく問題にならぬずいうこずになる。

蛇足ながら、SVG で塗り぀ぶしが定矩されおいるのは、あくたでも䞀぀のパスに察しおであり、耇数のパスに察しおではない。䞊に掲げた同心円の䟋では、円ひず぀ひず぀をサブパスずしお、これらを䞀぀のパスに結合しある。

Inkscape での実装 パスの方向は、もっずも単玔な䟋では、「ベゞ゚曲線盎線ツヌル」でポむントを打぀順番によっお決たる。最埌に打ったポむントを終端ずするようにそのサブパスの方向が決たる。パスの方向を芖芚的に確認したいず思うならば、ストロヌクスタむルで矢印を遞択しおやればよい。

Inkscape 0.44 からは、カスケヌドメニュヌのパスを匕っ匵るず「逆転」ずいうのがあり、これを䜿うず方向を反転させるこずができる。

「円匧」ツヌルで円や楕円などを䜜成するず、パスの方向は時蚈たわりになる。

evenodd か nonzero かを遞択するためには、「フィルストロヌク」ツヌルの「フィル」タブを遞択したずきに右䞊に出おくるハヌトじるしのようなもの二皮のいずれかを遞ぶ。巊偎のが evenodd で、右偎のが nonzero。あるいは、XML ゚ディタを起動しお手動で fill-rule プロパティを修正するこずもできる。

Inkscape では、fill-rule プロパティがないパス゚レメントを読み蟌むず nonzero ず解釈されるが、これは SVG 通り。

——目次——
HOME
├雑文
├写真
├壁玙
├銬鹿
├読曞
├語孊
│├英語
│└日本語
├電算
├地理
│└癜地図
└ブログ