SSブログ

SVG最適化マクロ [花子]

花子の図面をIllustratorに読み込ませたいとき、SVGを使うと良さそうだ、というのは既出の通り。
しかし、実際に花子でSVGで出力し、そのファイルをIllustratorで「配置」させると、一見して図面がぼろぼろになっているように見えるというのも既出の通り。
そして、一見してぼろぼろになっているように見えるものの、実際は線幅が太く読み込まれているだけ(のよう)で、線幅を細くしてやれば、かなり正確に読み込まれる、というのも既出の通り。

さて、Illustratorに読み込ませることを前提に、花子が出力したSVGを都合の良い形に整形する作業が自動化できたらうれしい。うれしいって、もちろん私が。

どうにかうまくいかないだろうか、と実験していたのだが、とりあえず線に関しては変換できたので、ひとまずアップしてみた。

なお、あくまで実験の延長ということもあり、手順もコードもやたらと鈍くさいことをあらかじめ断っておく。

以下、手順(とりあえずメモ程度)。マクロ本体は既に登録したものとして話を進めると…

  1. 花子で作った図面をSVGで保存する
  2. できたSVGファイルをメモ帳で開く
  3. 「名前を付けて保存」で文字コードを「ANSI」にしてそのまま上書き保存
  4. マクロを起動、いま上書きしたSVGファイルを指定する
  5. 一瞬で最適化が終わる(勝手に上書き保存されてる)
  6. 最適化されたSVGファイルを再びメモ帳などで開く
  7. 「名前を付けて保存」で文字コードを「UTF-8」にしてそのまま上書き保存
  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

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

nice! 0

コメント 0

コメントを書く

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

トラックバック 1

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

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