There is a HUGE download link for a whole pile of scripts. I will be trying to go through these and put them into some kind of logical order at some point. When I get a chance I will post this script for download.
For now here is the text of the script. Copy this, paste it into a text document and save it as "stack.lua" and you are good to go:
I tried using "size" so this doesn't take up so much space but apparently it doesn't work with the "code" tag.
Code: Select all
function pj_findStackSwitch(moho)
local current = moho.layer
local targetName = current:Name().." Stack"
local parent = current:Parent()
if (parent == nil) then
local doc = moho.document
for i=0,doc:CountLayers() - 1 do
if (doc:Layer(i):Name() == targetName) then
return doc:Layer(i)
end
end
else
for i=0,parent:CountLayers() do
if (parent:Layer(i):Name() == targetName) then
return parent:Layer(i)
end
end
end
return nil
end
function pj_extractShapeNames(fileName, layerName)
if (fileName == nil) then
print("Nil fileName!")
end
local f = io.open(fileName, "r")
if (f == nil) then
if (pj_global_filename == nil) then
return nil
end
f = io.open(pj_global_filename, "r")
if (f == nil) then
return nil
end
else
pj_global_filename = fileName
end
local line = f:read("*line")
local results = {}
while (true) do
local line = f:read("*line")
-- If EOF, return.
if (line == nil) then
f:close()
return results
end
-- If the line says layer_type 1, then it's a definition
-- of a vector sublayer. See if it has the shapes we want.
start,finish = string.find(line, "^%s*layer_type 1$")
if (start ~= nil) then
pj_processVectorLayer(f, results, layerName)
end
-- Otherwise, if the line starts with layer_type, then it's
-- some other kind of sublayer. Recurse.
start, finish = string.find(line, "^%s*layer_type")
if (start ~= nil) then
pj_processLayer(f, results, layerName)
end
end
end
function pj_processLayer(f, results, layerName)
while (true) do
local line = f:read("*line")
-- If EOF, return.
if (line == nil) then
return
end
-- If the line contains a single }, it is the end
-- of the layer structure; return;
local start,finish
start,finish = string.find(line, "^%s*%}$")
if (start ~= nil) then
return
end
-- If the line says layer_type 1, then it's a definition
-- of a vector sublayer. See if it has the shapes we want.
start,finish = string.find(line, "^%s*layer_type 1$")
if (start ~= nil) then
pj_processVectorLayer(f, results, layerName)
end
-- Otherwise, if the line starts with layer_type, then it's
-- some other kind of sublayer. Recurse.
start,finish = string.find(line, "^%s*layer_type")
if (start ~= nil) then
pj_processLayer(f, results, layerName)
end
end
end
function pj_processVectorLayer(f, results, layerName)
while (true) do
local line = f:read("*line")
-- If EOF, return.
if (line == nil) then
return
end
-- If the line contains a single }, it is the end
-- of the layer structure; return;
local start,finish
start,finish = string.find(line, "^%s*%}$")
if (start ~= nil) then
return
end
-- FIXME: I am assuming that Vector Layers have no child layers.
-- Check if assumption is valid.
-- If the line starts with name, then it's the layer's name.
-- Check to see if the layer's name is the same as the
-- given layerName. If so, we need to scan this layer for
-- shapes.
local name
start,finish,name = string.find(line, "^%s*name \"(.-)\"")
if (start ~= nil) then
if (name == layerName) then
pj_processShapes(f, results)
return
end
end
end
end
function pj_processShapes(f, results)
while (true) do
local line = f:read("*line")
-- If EOF, return.
if (line == nil) then
return
end
-- If the line contains a single }, it is the end
-- of the layer structure; return.
local start,finish
start,finish = string.find(line, "^%s*%}$")
if (start ~= nil) then
return
end
-- If the line starts with "shapes" then
start,finish = string.find(line, "^%s*shapes ")
if (start ~= nil) then
pj_processShapes2(f, results)
return
end
end
end
function pj_processShapes2(f, results)
while (true) do
local line = f:read("*line")
-- If EOF, return.
if (line == nil) then
return
end
-- If the line contains a single }, it is the end
-- of the layer structure; return.
local start,finish
start,finish = string.find(line, "^%s*%}$")
if (start ~= nil) then
return
end
-- If the line looks like this...
--
-- "shape1" true false false false
--
-- ...then it is finally, finally the name of a shape!
--
local name
start,finish,name = string.find(line, "^%s*\"(.-)\" %a+ %a+ %a+ %a+")
if (start ~= nil) then
local last = table.getn(results) + 1
results[last] = name
end
end
end
function pj_findShape(layer, mesh, name)
for i=0,mesh:CountShapes() - 1 do
if (mesh:Shape(i).pj_name == name) then
return i
end
end
return nil
-- idTable = pj_global_shape_id[layer:Name()]
-- if (idTable == nil) then
-- return nil
-- end
-- nameTable = pj_global_shape_name[layer:Name()]
-- if (nameTable == nil) then
-- return nil
-- end
-- local i = 1
-- while (nameTable[i] ~= nil) do
-- if (nameTable[i] == name) then
-- for j=0,mesh:CountShapes() - 1 do
-- local x1 = mesh:Shape(j).fName
-- local x2 = idTable[i]
-- x1 = tostring(x1)
-- x2 = tostring(x2)
-- if (x2 == x1) then
-- return j
-- end
-- end
-- return nil
-- end
-- i = i + 1
-- end
-- return nil
end
function pj_getShapeNames(moho)
local mesh = moho:Mesh()
local current = moho.layer
local shapeNames
shapeNames = pj_extractShapeNames(moho.document:Path(), current:Name())
-- local idTable = {}
if (shapeNames == nil) then
return
end
local i = 1
while (shapeNames[i] ~= nil) do
-- local n = mesh:Shape(i - 1).fName
-- idTable[i] = n
mesh:Shape(i - 1).pj_name = shapeNames[i]
i = i + 1
end
-- pj_global_shape_id[current:Name()] = idTable
-- pj_global_shape_name[current:Name()] = shapeNames
current.pj_shapes = true
end
function LayerScript(moho)
local current = moho.layer
local mesh = moho:Mesh()
local stackSwitch = pj_findStackSwitch(moho)
if (stackSwitch == nil) then
return
end
stackSwitch = moho:LayerAsSwitch(stackSwitch)
-- if (pj_global_shape_id == nil) then
-- pj_global_shape_id = {}
-- pj_global_shape_name = {}
-- end
-- if (pj_global_shape_id[current:Name()] == nil) then
-- pj_getShapeNames(moho)
-- end
if (current.pj_shapes == nil) then
pj_getShapeNames(moho)
end
local value = stackSwitch:GetValue(moho.frame)
for w in string.gfind(value, "([%a_]+),") do
local id = pj_findShape(current, mesh, w)
if (id ~= nil) then
mesh:RaiseShape(id, true)
end
end
end