SVG最適化マクロ-2008 [花子]
定番になってきたSVG最適化マクロの最新版である(補足すると、花子のデータをSVGを介してIllustratorに読み込ませるうえで、花子が書き出すSVGを最適化させてみよう、というお話)。頭の悪いところはそのままに透明度の最適化を行う。
さて、本題に入る前に。熱烈な要望を出したのが功を奏したのか、2008になってSVG出力したときに透明度がちゃんと反映されるようになった。
さて、適当なブラウザで実際に表示させてみると、確かにちゃんと透明度が反映されている。ちょっと感動である。Illustratorで読み込んでも、確かにちゃんと透明度が反映されている。やはり感動である。
さて、ここでちょっと注意しなければならない点がある。Illustrator cs3 に読み込んだSVG、表示は確かに透明になっているのだが、透明なはずの図形の不透明度が100%になっている。
これでは、Illustratorに読み込んだ後に(ちゃんと表示されているが)ちゃんと透明度を編集できないということになってしまう。これまでか、というとそんなことないわけで。
花子が吐き出すSVGとIllustratorが吐き出すSVGのソースを比較すれば解決法は一目瞭然。花子のSVGに記述されている「fill-opacity」を「opacity」に書き換えれば(どういうわけか)良さそうだというのが分かる。実際に試してみると、
不透明度がちゃんと25%になっている。というわけで最適化マクロも透明度周りを調整するようさっそく改変。
肝心のコードは以下。
!!************** !! SVG最適化 !!************** Ver.1.2.β !! (C)臼田 隆行 !! 2008-02-09 !!************** !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!======================================================== !!macroname(SVG最適化) !!title(Illustrator読み込み用にSVGを最適化) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! $delay1 = 0.5 $delay2 = 0.2 !!SVGファイルを指定 %para("DEFAULTEXT") = "svg" %para("FILTER") = "SVG ファイル(*.svg)|*.svg" %para("FILTERINDEX") = 1 %para("TITLE") = "SVGファイルの選択" %para("FLAGS") = &H0002 $info = OpenFileDialog(%para) if $info = nil then stop end if %path = BreakDownPath($info("FILENAME", 1)) $file = %path("FILE") !!notepadを使ってANSIにする set $wsh = CreateObject("WScript.Shell") $wsh.Run("notepad " & $info("FILENAME", 1)) Wait($delay1) $wsh.AppActivate($file) $wsh.SendKeys("%F") Wait($delay2) $wsh.SendKeys("A") Wait($delay2) $wsh.SendKeys("%E") Wait($delay2) $wsh.SendKeys("{HOME}") Wait($delay1) $wsh.SendKeys("%S") Wait($delay1) $wsh.SendKeys("Y") Wait($delay2) $wsh.SendKeys("%F") Wait($delay1) $wsh.SendKeys("X") !!ファイル読み込み Open(1, $info("FILENAME", 1), "OUTIN", "text") %size = Ask(1, "SIZE") Read(1, %size, $data) Close(1) !!ちょっと確認 %hana = Find('xmlns:jsh="http://www.justsystem.co.jp/hanako13/svg"', $data, ) if %hana = 0 then Message("花子で出力したSVGではない可能性があるため処理を中止します", 1) ansi2utf8() Message("処理を中止しました", 1) stop end if %conv = Find('mm" ', $data, 350) if %conv <> 0 then %para = {.Title = "SVGが異常になる可能性があります", .Icon = 4, .Button = 5, .Default = 2} %ret = MsgBox("既に最適化された可能性があります。続行しますか?", %para) if %ret = 7 then ansi2utf8() Message("処理を中止しました", 1) stop end if end if !!枠が表示されるように調整 ReplaceAll(' visibility="hidden"', '') !!線幅調整 %n1 = 1 %n2 = 1 do %n1 = Find('stroke-width="', $data, %n2) if %n1 = 0 then exit do end if %n1 = %n1 + 14 %n2 = Find('"', $data, %n1) %txt = Mid($data, %n1, %n2-%n1) %num = %txt / 40 & "mm" $data = Replace($data, %n1, %n2-%n1, %num) loop !!線種パターン調整 ConvDasharray() !!線種パターン調整(臼田私用) !!ReplaceAll('stroke-dasharray="3mm,3mm"', 'stroke-dasharray="4,3"') !!ReplaceAll('stroke-dasharray="2mm,2mm"', 'stroke-dasharray="0.2,1.2"') !!ReplaceAll('stroke-dasharray="4mm,2mm,2mm,2mm"', 'stroke-dasharray="5.5,1.4,0.3,1.4,0.3,1.4"') !!透明度の表記を調整 ReplaceAll('fill-opacity', 'opacity') !!保存 %size = LenB($data) Create(2, $info("FILENAME", 1), , ) Write(2, %size, $data) Close(2) ansi2utf8() Message("最適化完了", 1) !!stroke-dasharrayの値を1/40にし単位mmを付加する sub ConvDasharray() %n1 = 930 %n2 = 930 do %n1 = Find('stroke-dasharray="', $data, %n2) if %n1 = 0 then exit do end if %n1 = %n1 + 18 %n2 = Find('"', $data, %n1) %dasharray = Mid($data, %n1, %n2 - %n1) %num2 = Len(%dasharray) %n3 = 1 %n4 = 1 do %n4 = Find(',', %dasharray, %n3) if %n4 = 0 then %n4 = Len(%dasharray) + 1 %dash = Mid(%dasharray, %n3, %n4 - %n3) %dash = %dash / 40 & "mm" %dasharrayf = %dasharrayf & %dash %num1 = Len(%dasharrayf) exit do end if %dash = Mid(%dasharray, %n3, %n4 - %n3) %dash = %dash / 40 & "mm" %dasharrayf = %dasharrayf & %dash & "," %n3 = %n4 + 1 loop $data = Replace($data, %n1, %num2, %dasharrayf) %dasharrayf = nil %n2 = %n1 + %num1 %n1 = %n1 + %num2 loop end sub !!文字列の全文置換 function ReplaceAll(%txt1, %txt2) %n1 = 1 %n2 = 1 %num1 = Len(%txt1) %num2 = Len(%txt2) do %n1 = Find(%txt1, $data, %n2) if %n1 = 0 then %txt1 = nil %txt2 = nil exit do end if $data = Replace($data, %n1, %num1, %txt2) %n2 = %n1 + %num1 %n1 = %n1 + %num2 loop !!%txt1:検索文字列 !!%txt2:置換文字列 end function !!notepadを使ってUTF-8にする sub ansi2utf8() $wsh.Run("notepad " & $info("FILENAME", 1)) Wait($delay1) $wsh.AppActivate($file) $wsh.SendKeys("%F") Wait($delay2) $wsh.SendKeys("A") Wait($delay2) $wsh.SendKeys("%E") Wait($delay2) $wsh.SendKeys("{END}") Wait($delay1) $wsh.SendKeys("%S") Wait($delay1) $wsh.SendKeys("Y") Wait($delay2) $wsh.SendKeys("%F") Wait($delay1) $wsh.SendKeys("X") end sub
タグ:マクロ
2008-02-09 00:00
nice!(0)
コメント(2)
トラックバック(1)
まだ花子のSVG対応には課題はたくさんありますが、花子2008のSVGエンジンは2007年のものと比べてかなりよくなったようですね。透明度がようやく正しく(?)出力されるようになって嬉しいです。
話が変わりますが、Just Suite 2008に搭載されたPDF Driver経由で花子からPDFを出力(印刷)するときに、文字関係が前よりきちんとした状態で表示されます。花子2008自体も、文字回転の字つぶれがだいぶ解消されて、本当によかったです。
by jchap (2008-02-09 23:13)
なぜIllustratorは、塗りの透明度を指定するfill-opacityで指定した透明度はちゃんと処理できず、図形全体の透明度を指定するopacityで指定した透明度はちゃんと処理できるのか、理由がよく分からないところです。
ちゃんと調べていないので断定的には言えませんが、Illustratorのバグ?なのか何なのか…。
ともかく、ちょっといじるだけで問題なくやりとりできるので、非常にありがたいです。
by t-usuda (2008-02-10 20:51)