1. --!parent
  2.  
  3. -- ************************************************************************
  4. -- SVG Exporter
  5. --
  6. -- @author Valentin Schmidt
  7. -- @version 0.1
  8. -- @requires xtra "FileIO", xtra "Shell", xtra "swfExport", swf2svg.exe
  9. -- ************************************************************************
  10.  
  11. property _fx
  12. property _sx
  13. property _tmp_dir
  14.  
  15. ----------------------------------------
  16. -- @constructor
  17. ----------------------------------------
  18. on new (me)
  19.     me._fx = xtra("FileIO").new()
  20.     me._sx = xtra("Shell").new()
  21.     me._tmp_dir = me._sx.shell_getEnvVar("TMP")
  22.     return me
  23. end
  24.  
  25. ----------------------------------------
  26. -- Exports vector shape as SVG
  27. -- @param {member} vs_mem - the vector shape as memberRef
  28. -- @param {string} svg_file - the SVG file
  29. -- @return {integer} success - TRUE or error code<0
  30. ----------------------------------------
  31. on exportSvg (me, vs_mem, svg_file)
  32.     if ilk(vs_mem)<>#member or ilk(svg_file)<>#string then return -1 -- wrong arguments
  33.     if vs_mem.type<>#vectorShape then return -2 -- wrong member type
  34.    
  35.     q = QUOTE
  36.    
  37.     -- export vector shape as SWF in TMP
  38.     tmp_name = me._tmp_dir & "\" & random(9999)
  39.     ok = exportSWF(vs_mem, tmp_name & ".swf")
  40.     if not ok then return -3 -- failed to export swf
  41.    
  42.     -- run swf2svg.exe
  43.     swf_file = tmp_name & ".swf"
  44.     if swf_file contains SPACE then swf_file = q&swf_file&q
  45.     props = [:]
  46.     props["directory"] = me._tmp_dir
  47.     props["show_cmd"] = 0
  48.     props["wait"] = 1
  49.     props["parameters"] = swf_file & " --nodots"
  50.     exit_code = me._sx.shell_execex(_movie.path & "bin\swf2svg.exe", props)
  51.     if exit_code<>0 then
  52.         res = -4 -- swf2svg.exe failed
  53.     else
  54.         -- read the SVG
  55.         svg_data = me._getString(tmp_name & ".svg")
  56.         if not stringP(svg_data) then
  57.             res = -5 -- failed to read temporary svg
  58.         else
  59.             -- remove <defs> and </defs>
  60.             svg_data = me._replace("<defs>", "", svg_data)
  61.             svg_data = me._replace("</defs>", "", svg_data)
  62.            
  63.             -- translate to center
  64.             w = vs_mem.width/2 + (vs_mem.width mod 2)
  65.             h = vs_mem.height/2 + (vs_mem.height mod 2)
  66.             t = " transform="&q&"translate("&w&&h&")"&q
  67.             svg_data = me._replace("<g id="&q&"shape1"&q&">", "<g id="&q&"shape1"&q&t&">", svg_data)
  68.            
  69.             -- save as new file
  70.             ok = me._putString(svg_file, svg_data)
  71.             if not ok then
  72.                 res = -6 -- failed to write final svg
  73.             else
  74.                 res = TRUE
  75.             end if
  76.         end if
  77.     end if
  78.    
  79.     -- delete temporary files
  80.     me._delete(tmp_name & ".swf")
  81.     me._delete(tmp_name & ".svg")
  82.     me._delete(me._tmp_dir & "\details.svg")
  83.    
  84.     return res
  85. end
  86.  
  87. ----------------------------------------
  88. -- @private
  89. ----------------------------------------
  90. on _getString (me, tFile)
  91.     me._fx.openFile(tFile, 1)
  92.     err = me._fx.status()
  93.     if (err) then return FALSE
  94.     ret = me._fx.readFile()
  95.     me._fx.closeFile()
  96.     return ret
  97. end
  98.  
  99. ----------------------------------------
  100. -- @private
  101. ----------------------------------------
  102. on _putString (me, tFile, tString)
  103.     me._fx.openFile(tFile, 2)
  104.     err = me._fx.status()
  105.     if not (err) then me._fx.delete()
  106.     else if (err and not (err = -37)) then return FALSE
  107.     me._fx.createFile(tFile)
  108.     err = me._fx.status()
  109.     if (err) then return FALSE
  110.     me._fx.openFile(tFile, 2)
  111.     err = me._fx.status()
  112.     if (err) then return FALSE
  113.     me._fx.writeString(tString)
  114.     me._fx.closeFile()
  115.     return TRUE
  116. end
  117.  
  118. ----------------------------------------
  119. -- @private
  120. ----------------------------------------
  121. on _delete (me, tFile)
  122.     me._fx.openFile(tFile, 0)
  123.     err = me._fx.status()
  124.     if not (err) then err = me._fx.delete()
  125.     return (err=0)
  126. end
  127.  
  128. ----------------------------------------
  129. -- @private
  130. ----------------------------------------
  131. on _replace (me, stringToFind, stringToInsert, input)
  132.     output = ""
  133.     findLen = stringToFind.length - 1
  134.     repeat while true
  135.         currOffset = offset(stringToFind, input)
  136.         if currOffset=0 then exit repeat
  137.         put input.char [1..currOffset] after output
  138.         delete the last char of output
  139.         put stringToInsert after output
  140.         delete input.char [1.. (currOffset + findLen)]
  141.     end repeat
  142.     put input after output
  143.     return output
  144. end
  145.  
[raw code]