SSブログ

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

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

nice! 0

コメント 0

コメントを書く

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

トラックバック 1

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

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