]> git.bts.cx Git - aseprite-tools.git/blob - export-metrics.lua
Added support for specific frame export
[aseprite-tools.git] / export-metrics.lua
1 local pluginKey = "bts/metrics"
2
3 local sprite = app.sprite
4
5 local name = app.fs.fileTitle(sprite.filename)
6
7 local previousExportFilename = sprite.properties(pluginKey).previousExportFilename
8
9 if previousExportFilename == nil then
10         local defaultPath = app.fs.filePath(sprite.filename)
11         local defaultFilename = name..".lua"
12         previousExportFilename = app.fs.joinPath(defaultPath, defaultFilename)
13 end
14
15 local dlg = Dialog()
16 dlg:file{ id="metrics_filename", label="Metrics output:", filename=previousExportFilename, filetypes=".lua", save=true }
17 dlg:button{ id="confirm", text="Confirm" }
18 dlg:button{ id="cancel", text="Cancel" }
19 dlg:show()
20
21 local data = dlg.data
22 if data.confirm then
23         name = app.fs.fileTitle(data.metrics_filename)
24
25         local basePath = app.fs.filePath(data.metrics_filename)
26         local imagePath = app.fs.joinPath(basePath, name)
27
28         local layerLookup = {}
29         local originalLayerVisible = {}
30         
31         for i, layer in ipairs(sprite.layers) do
32                 if layer.parent == layer.sprite then
33                         originalLayerVisible[layer.name] = layer.isVisible
34                         layer.isVisible = false
35                         
36                         layerLookup[layer.name] = layer
37                 end
38         end
39         
40         local imageDetails = {}
41         
42         for i, slice in ipairs(sprite.slices) do
43                 local id = slice.name
44         
45                 if layerLookup[id] then
46                         local layer = layerLookup[id]
47                         local filename = app.fs.joinPath(imagePath, id..".png")
48         
49                         layer.isVisible = true
50                         app.command.SaveFileCopyAs{ ui=false, filename=filename, slice=id }
51                         layer.isVisible = false
52         
53                         table.insert(imageDetails, id)
54                 end
55         end
56         
57         local metricsDetails = {}
58         
59         for i, slice in ipairs(sprite.slices) do
60                 local id = slice.name
61                 local sliceMetrics = {}
62         
63                 sliceMetrics["origin"] = { slice.bounds.x, slice.bounds.y}
64                 sliceMetrics["size"] = { slice.bounds.width, slice.bounds.height}
65                 sliceMetrics["center"] = { (slice.bounds.x + slice.bounds.width / 2), (slice.bounds.y + slice.bounds.height / 2)}
66         
67                 metricsDetails[id] = sliceMetrics
68         end
69         
70         --[[if false then
71                 local metricsFilename = app.fs.joinPath(metricsPath, name..".ui.metrics.json")
72                 local metricsFile = io.open(metricsFilename, "w")
73                 local metricsJson = json.encode(metricsDetails)
74                 metricsFile:write(metricsJson)
75                 io.close(metricsFile)
76         end]]
77         
78         if true then
79                 --local metricsFilename = app.fs.joinPath(metricsPath, data.metrics_filename)
80                 local metricsFile = io.open(data.metrics_filename, "w")
81         
82                 metricsFile:write(name.."ImagesTable = {\n")
83                 for k,v in ipairs(imageDetails) do
84                         metricsFile:write("\t\"" .. v .. "\",\n")
85                 end
86                 metricsFile:write("}\n")
87                 metricsFile:write("\n")
88         
89                 metricsFile:write(name.."MetricsTable = {\n")
90                 for k,v in pairs(metricsDetails) do
91                         metricsFile:write("\n")
92                         metricsFile:write("\t[\"" .. k .. ".origin\"] = { x=" .. v["origin"][1] .. ", y=" .. v["origin"][2] .. " },\n")
93                         metricsFile:write("\t[\"" .. k .. ".size\"] = { w=" .. v["size"][1] .. ", h=" .. v["size"][2] .. " },\n")
94                         metricsFile:write("\t[\"" .. k .. ".center\"] = { x=" .. v["center"][1] .. ", y=" .. v["center"][2] .. " },\n")
95                 end
96                 metricsFile:write("\n")
97                 metricsFile:write("}\n")
98                 metricsFile:write("\n")
99                 metricsFile:write("registerMetrics(\""..name.."\", "..name.."ImagesTable, "..name.."MetricsTable)\n")
100         
101                 io.close(metricsFile)
102         end
103         
104         for k, v in pairs(originalLayerVisible) do
105                 local layer = layerLookup[k]
106                 layer.isVisible = v
107         end
108
109         sprite.properties(pluginKey).previousExportFilename = data.metrics_filename
110 end