SVG最適化マクロ-その2 [花子]
少し改良、なのか?
やっていることは相当に頭が悪いが、従来の「SVGファイルをメモ帳で開いて文字コードを変えて上書き保存」といういちいち面倒な操作を含めて自動化。
どこがどう頭が悪いのか、というと、文字コードを変更する行程を、本当にメモ帳で開き、WSHのSendKeysで実際に操作する、というあたり。鈍くさいにも程がある。
前回詳しく触れなかった「一部コメントアウトしている部分は私用に付けた処理」というのは、花子では扱えない細かいパターンの線種に変更する、カスタム設定な部分。
http://blog.so-net.ne.jp/t-usuda/2007-03-22
ようは↑の処理をするところ。
細かいところだが、花子が出力するSVGには、用紙全面と、マージンを除いた印字全面それぞれの枠が非表示の状態で含まれている。これはこれで編集するときに便利なので、あえて表示されるように書き換えるようにしてみた。
肝心のコードは以下。
!!************** !! SVG最適化 !!************** Ver.1.1.β !! (C)臼田 隆行 !! 2007-10-24 !!************** !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!======================================================== !!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 !!線種パターン調整(臼田私用) !!ReplaceAll('stroke-dasharray="120,120"', 'stroke-dasharray="4,3"') !!ReplaceAll('stroke-dasharray="80,80"', 'stroke-dasharray="0.2,1.2"') !!ReplaceAll('stroke-dasharray="160,80,80,80"', 'stroke-dasharray="5.5,1.4,0.3,1.4,0.3,1.4"') !!線種パターン調整 ConvDasharray() !!保存 %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
タグ:マクロ
2007-10-24 00:00
nice!(0)
コメント(0)
トラックバック(1)
コメント 0