SSブログ

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

タグ:マクロ
nice!(0)  コメント(2)  トラックバック(1) 

nice! 0

コメント 2

jchap

まだ花子のSVG対応には課題はたくさんありますが、花子2008のSVGエンジンは2007年のものと比べてかなりよくなったようですね。透明度がようやく正しく(?)出力されるようになって嬉しいです。

話が変わりますが、Just Suite 2008に搭載されたPDF Driver経由で花子からPDFを出力(印刷)するときに、文字関係が前よりきちんとした状態で表示されます。花子2008自体も、文字回転の字つぶれがだいぶ解消されて、本当によかったです。
by jchap (2008-02-09 23:13) 

t-usuda

なぜIllustratorは、塗りの透明度を指定するfill-opacityで指定した透明度はちゃんと処理できず、図形全体の透明度を指定するopacityで指定した透明度はちゃんと処理できるのか、理由がよく分からないところです。
ちゃんと調べていないので断定的には言えませんが、Illustratorのバグ?なのか何なのか…。
ともかく、ちょっといじるだけで問題なくやりとりできるので、非常にありがたいです。
by t-usuda (2008-02-10 20:51) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 1

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。