--!parent
-- ************************************************************************
-- SVG Exporter
--
-- @author Valentin Schmidt
-- @version 0.1
-- @requires xtra "FileIO", xtra "Shell", xtra "swfExport", swf2svg.exe
-- ************************************************************************
property _fx
property _sx
property _tmp_dir
----------------------------------------
-- @constructor
----------------------------------------
on new (me)
me._fx = xtra("FileIO").new()
me._sx = xtra("Shell").new()
me._tmp_dir = me._sx.shell_getEnvVar("TMP")
return me
end
----------------------------------------
-- Exports vector shape as SVG
-- @param {member} vs_mem - the vector shape as memberRef
-- @param {string} svg_file - the SVG file
-- @return {integer} success - TRUE or error code<0
----------------------------------------
on exportSvg (me, vs_mem, svg_file)
if ilk(vs_mem)<>#member or ilk(svg_file)<>#string then return -1 -- wrong arguments
if vs_mem.type<>#vectorShape then return -2 -- wrong member type
q = QUOTE
-- export vector shape as SWF in TMP
tmp_name = me._tmp_dir & "\" & random(9999)
ok = exportSWF(vs_mem, tmp_name & ".swf")
if not ok then return -3 -- failed to export swf
-- run swf2svg.exe
swf_file = tmp_name & ".swf"
if swf_file contains SPACE then swf_file = q&swf_file&q
props = [:]
props["directory"] = me._tmp_dir
props["show_cmd"] = 0
props["wait"] = 1
props["parameters"] = swf_file & " --nodots"
exit_code = me._sx.shell_execex(_movie.path & "bin\swf2svg.exe", props)
if exit_code<>0 then
res = -4 -- swf2svg.exe failed
else
-- read the SVG
svg_data = me._getString(tmp_name & ".svg")
if not stringP(svg_data) then
res = -5 -- failed to read temporary svg
else
-- remove <defs> and </defs>
svg_data = me._replace("<defs>", "", svg_data)
svg_data = me._replace("</defs>", "", svg_data)
-- translate to center
w = vs_mem.width/2 + (vs_mem.width mod 2)
h = vs_mem.height/2 + (vs_mem.height mod 2)
t = " transform="&q&"translate("&w&&h&")"&q
svg_data = me._replace("<g id="&q&"shape1"&q&">", "<g id="&q&"shape1"&q&t&">", svg_data)
-- save as new file
ok = me._putString(svg_file, svg_data)
if not ok then
res = -6 -- failed to write final svg
else
res = TRUE
end if
end if
end if
-- delete temporary files
me._delete(tmp_name & ".swf")
me._delete(tmp_name & ".svg")
me._delete(me._tmp_dir & "\details.svg")
return res
end
----------------------------------------
-- @private
----------------------------------------
on _getString (me, tFile)
me._fx.openFile(tFile, 1)
err = me._fx.status()
if (err) then return FALSE
ret = me._fx.readFile()
me._fx.closeFile()
return ret
end
----------------------------------------
-- @private
----------------------------------------
on _putString (me, tFile, tString)
me._fx.openFile(tFile, 2)
err = me._fx.status()
if not (err) then me._fx.delete()
else if (err and not (err = -37)) then return FALSE
me._fx.createFile(tFile)
err = me._fx.status()
if (err) then return FALSE
me._fx.openFile(tFile, 2)
err = me._fx.status()
if (err) then return FALSE
me._fx.writeString(tString)
me._fx.closeFile()
return TRUE
end
----------------------------------------
-- @private
----------------------------------------
on _delete (me, tFile)
me._fx.openFile(tFile, 0)
err = me._fx.status()
if not (err) then err = me._fx.delete()
return (err=0)
end
----------------------------------------
-- @private
----------------------------------------
on _replace (me, stringToFind, stringToInsert, input)
output = ""
findLen = stringToFind.length - 1
repeat while true
currOffset = offset(stringToFind, input)
if currOffset=0 then exit repeat
put input.char [1..currOffset] after output
delete the last char of output
put stringToInsert after output
delete input.char [1.. (currOffset + findLen)]
end repeat
put input after output
return output
end