SVG最適化マクロ [花子]
花子の図面をIllustratorに読み込ませたいとき、SVGを使うと良さそうだ、というのは既出の通り。
しかし、実際に花子でSVGで出力し、そのファイルをIllustratorで「配置」させると、一見して図面がぼろぼろになっているように見えるというのも既出の通り。
そして、一見してぼろぼろになっているように見えるものの、実際は線幅が太く読み込まれているだけ(のよう)で、線幅を細くしてやれば、かなり正確に読み込まれる、というのも既出の通り。
さて、Illustratorに読み込ませることを前提に、花子が出力したSVGを都合の良い形に整形する作業が自動化できたらうれしい。うれしいって、もちろん私が。
どうにかうまくいかないだろうか、と実験していたのだが、とりあえず線に関しては変換できたので、ひとまずアップしてみた。
なお、あくまで実験の延長ということもあり、手順もコードもやたらと鈍くさいことをあらかじめ断っておく。
以下、手順(とりあえずメモ程度)。マクロ本体は既に登録したものとして話を進めると…
- 花子で作った図面をSVGで保存する
- できたSVGファイルをメモ帳で開く
- 「名前を付けて保存」で文字コードを「ANSI」にしてそのまま上書き保存
- マクロを起動、いま上書きしたSVGファイルを指定する
- 一瞬で最適化が終わる(勝手に上書き保存されてる)
- 最適化されたSVGファイルを再びメモ帳などで開く
- 「名前を付けて保存」で文字コードを「UTF-8」にしてそのまま上書き保存
- Illustrator上で、いまできたSVGファイルを「配置」する
肝心のコードは以下。やっていることは、線幅、線種パターンを1/40にし単位mmを付ける、という、ただそけだけ。一部コメントアウトしている部分は私用に付けた処理なので無視してOK
!!************** !! SVG最適化 !!************** Ver.1.0.β !! (C)臼田 隆行 !! 2007-10-22 !!************** !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!======================================================== !!macroname(SVG最適化) !!title(Illustrator読み込み用にSVGを最適化) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!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 !!ファイル読み込み 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) stop end if %code = Find('ソ<?xml', $data, ) if %code <> 0 then Message("文字コードがUTF-8のままのため処理を中止します", 1) stop end if !!線幅調整 %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) Message("最適化完了-UTF-8で上書き保存して下さい", 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
タグ:マクロ
2007-10-22 00:00
nice!(0)
コメント(0)
トラックバック(1)
コメント 0