--- /dev/null
+
+--------------------------------------------------------------------------------
+-- working with groups ---------------------------------------------------------
+
+local function regroup(elem)
+ local groupElem = {}
+ for i, obj in ipairs(elem) do
+ if obj[1] ~= nil then
+ groupElem[#groupElem + 1] = regroup(obj)
+ else
+ groupElem[#groupElem + 1] = obj
+ end
+ end
+ local res = ipe.Group(groupElem)
+ res:setMatrix(elem["matrix"])
+ return res
+end
+
+local function ungroup(group)
+ local elem = group:elements()
+ elem["matrix"] = group:matrix()
+ local plainElem = {}
+ for i, obj in ipairs(elem) do
+ if (obj:type() == "group") then
+ local subElem, subPlainElem = ungroup(obj)
+ elem[i] = subElem;
+ for _, subObj in ipairs(subPlainElem) do
+ table.insert(plainElem, subObj)
+ end
+ else
+ table.insert(plainElem, obj)
+ end
+ end
+ return elem, plainElem
+end
+
+-- Applies the function func to the object page[obj_id]. If
+-- page[obj_id] is a group, func is recursively applied to every
+-- element in this group.
+function apply_recursively(page, obj_id, funct)
+ obj = page[obj_id]
+ if obj:type() == "group" then
+ local elem, plainElem = ungroup(obj)
+ for _,subobj in pairs(plainElem) do
+ funct(subobj)
+ end
+ page:replace(obj_id, regroup(elem))
+ else
+ funct(obj)
+ end
+end
+
+
+
+
+-- Helper for compatibility with different ipe-versions.
+function mainWindow(model)
+ if model.ui.win == nil then
+ return model.ui
+ else
+ return model.ui:win()
+ end
+end
+
+-- Show a warning to the user.
+function report_problem(model, text)
+ ipeui.messageBox(mainWindow(model), "warning", text, nil, nil)
+end
+
+function get_number(model, obj, property, kind)
+ local res = obj:get(property)
+ if (_G.type(res) == "number") then
+ return res
+ else
+ local sheets = model.doc:sheets()
+ return sheets:find(kind, res)
+ end
+end
+
+function scale_property(model, obj, property, kind, factor)
+ obj:set(property, get_number(model, obj, property, kind) * factor)
+end
+
+function scale_unscalable(model, obj, factor)
+ if (obj:type() == "reference") then
+ scale_property(model, obj, "symbolsize", "symbolsize", factor)
+ end
+ if (obj:type() == "path") then
+ scale_property(model, obj, "pen", "pen", factor)
+ scale_property(model, obj, "farrowsize", "arrowsize", factor)
+ scale_property(model, obj, "rarrowsize", "arrowsize", factor)
+ end
+end
+
+function scale_test (model)
+ local p = model:page()
+ local str = model:getString("Enter scale factor")
+ if not str or str:match("^%s*$") or not str:match("^[%+%-%d%.]+$") then
+ return
+ end
+ local factor = tonumber(str)
+
+ local t = { label = "scaling",
+ pno = model.pno,
+ vno = model.vno,
+ selection = model:selection(),
+ original = model:page():clone(),
+ matrix = matrix,
+ undo = _G.revertOriginal,}
+ t.redo = function (t, doc)
+ local p = doc[t.pno]
+ -- for _, i in ipairs(t.selection) do
+ -- p:setSelect(i, 2)
+ -- end
+ local p = doc[t.pno]
+ for i, obj, sel, layer in p:objects() do
+ if sel then
+ apply_recursively(p, i, function (obj) scale_unscalable(model, obj, factor) end)
+ end
+ end
+ end
+ model:register(t)
+end
+
+
+
+label = "scale_test"
+methods = {
+ { label = "scale_test", run=scale_test },
+}