古い制作メモ

以前「制作メモ」に載せていたメモのうち、ノウハウの蓄積や状況変化により対応したものはこちらに移動しています。

Illustrator CS6 との相性について

自動処理する場合、アクションの一時停止が必要

Illustrator CS6 でフィルタをアクションに登録した場合、そのフィルタの完了を待たずに次のアクションに進んでしまう現象が発生しました。これを回避するには、アクション の再生オプションで「一時停止 1秒間」を設定する必要がありました。0.8秒など、少しでも時間を切り詰められないか試してみましたが、どうもダメでした。

これにより、1つのアクションに対して1秒ずつ待ってしまうため、ひととおり一周するのに12時間近くもかかってしまいまた。今回は3バリエーション生成したので、試行錯誤の時間抜きでも、自動処理の放置だけで1日半を要すという大がかりな事態となりました。

これを回避するには、アクションの一部をスクリプトに置き換えるなどの工夫が必要そうです。

(追記) Xtream Path プラグインを最新バージョンに更新したころ、フィルタの完了を待たずに次に進んでしまう現象がなくなり、待ち時間を設定しなくてもよくなりました。

Illustrator CS6 と AutoHotKey のスクリプトの相性

Illustrator CS6 では、フィルタのダイアログが独自の GUI となっており、ボタンなどにウインドウクラスなどが存在しないようです。したがって、AutoHotKey の OK ボタンをクリックするスクリプトでは、ウインドウクラスではなく、座標で指定する必要がありました。

さらに、まれにダイアログと関係ない領域が自動クリックされ、選択が解除されるなどして、以降の自動処理がうまくいかない場合があります。これを回 避するために、アクションを実行する前に「長方形ツール」に切り替えておきました。これにより、万が一関係ない領域がクリックされた場合「長方形ツール」 ダイアログを出すのみとなり、なおかつ AutoHotKey でキャンセルボタンを自動的に押させることで作業領域に影響を与えないようにしました。

以下が、今回使用した AutoHotKey のスクリプトです。

#Persistent                         ;ホットキーなどを使用せず、スクリプトを常駐
SetTimer,OnTimer,1000               ;指定サブルーチンを1秒ごとに実行
return                              ;スクリプト起動時の実行部分終了
OnTimer:                            ;タイマーに割り当てられるサブルーチンラベル
IfWinActive, スマートラウンド フィルタ ahk_class #32770
{
  SetControlDelay -1                ;動作安定度を上げるおまじない http://www.autohotkey.com/docs/commands/ControlClick.htm
  Click 232,104                     ;「同率」にチェック (以降、アクティブダイアログ左上からの相対座標) 
  Click 258,206                     ;OKボタンを押す
}
IfWinActive, 長方形 ahk_class #32770
{
  SetControlDelay -1                ;動作安定度を上げるおまじない
  Click 170,129                     ;キャンセルボタンを押す
}
return                              ;タイマーサブルーチンの終了

(追記) Xtream Path プラグインを最新バージョンに更新したころ、ダイアログの UI の構造が変更されており、ウインドウクラスを持つようになりました。さらに、アクションの一部としてフィルタを実行したときに、フィルタ設定のダイアログを表示しない設定があることがわかったため、AutoHotKey を使用する必要がなくなりました。

SVG ファイルから <circle> タグを除去する、より効率的な方法

ひととおり角丸の変換を行ったあと、SVG ファイルに混じった <circle> タグを手で編集して除去する必要があります。本家の解説では、どの部分かを見つけ出す手段として、<circle> の r 属性の値を増やして半径を大きくする方法が紹介されていました。

これだと見つけ出しすためのものとは別の SVG ファイルを開いて編集しなければならないので、かわりに思いついた手段として、テキストエディタの GREP 置換機能 (今回は EmEditor を使用) を用いて「<circle 」を「<circle fill="#ff0000" 」に一括置換し、半径を変えないままにすべての <circle> の塗りを赤くする方法を行いました。

<circle> を赤くした SVG ファイル群は目印として赤くしたまま編集できるので、アンカーポイントを編集して円ではなくし、ひととおり作業したあとで「 fill="#ff0000"」を空文字列に一括置換して、色を抜きました。

(追記) 利用している M+ FONTS 向けのフォント生成スクリプトの一部 (svg ファイルを分割する svg.pm) の機能が改善され、<circle> タグを <path> に変換する必要がなくなったことで、そのままでよくなりました。感謝!

フォント生成時に FontForge がクラッシュする

全ての svg ファイルの処理が完了し、さぁ、フォント生成するか! と意気込んだものの、Cygwin / Ubuntu のどちらでも、フォントの make 中にエラーが発生し途中で生成が中断されてしまいます。これはなかなか原因が分からず、しかもある程度時間がかかったあとに発生するので、詰んでしまう一 歩寸前となりかなり参ってしまいました。

しばらく悩んだあと、scripts/build-ttf.py に 2 行追加し、処理した svg ファイルの名前を出力することで、特定の分割済み svg ファイルが原因となっていないかを調べてみることにしました。

def import_svg(svgpath, svgfile):
    name, ext = os.path.splitext(os.path.basename(svgfile))
    if ext != '.svg':
        raise Exception('%s is not SVG file' % os.path.join(svgpath, svgfile))
    glyphname = svgname_to_glyphname(name)
    c = f.createChar(*glyphname)
    c.width = em
    c.vwidth = em
    c.clear()
    print(svgfile) # この行を追加
    c.importOutlines(os.path.join(svgpath, svgfile),
        ('removeoverlap', 'correctdir'))
    print("OK")    # この行を追加
    f.selection.select(('more',), c)

これによると、やはり以下の svg ファイルをインポートする際に、必ずクラッシュしていることが判明しました。

  • work.d\splitted\black\miscellaneous1\u2461.svg
  • work.d\splitted\black\miscellaneous1\u2781.svg
  • work.d\splitted\thin\miscellaneous1\u2471.svg

これらのファイルは、FontForge の GUI から直接インポートしてみてもクラッシュします。しかし、SVG ファイル自体にはまったく問題が無いように見受けられます。

これらのファイルを Inkscape を使って保存し直しても改善されず。そこで、一部のアンカーポイントを削減したところ、クラッシュしなくなりました。

(追記) これは FontForge 2.0.20120731 および同バーションベースの Unofficial FontForge-Cygwin で発生していた現象ですが、作業環境を FontForge 2.0.20140101 ベースである Unofficial FontForge-Cygwin 2014-01-04 に更新したところ、この問題は発生しなくなりました。