2 --------------------------------------------------------------------------------
3 -- working with groups ---------------------------------------------------------
5 local function regroup(elem)
7 for i, obj in ipairs(elem) do
9 groupElem[#groupElem + 1] = regroup(obj)
11 groupElem[#groupElem + 1] = obj
14 local res = ipe.Group(groupElem)
15 res:setMatrix(elem["matrix"])
19 local function ungroup(group)
20 local elem = group:elements()
21 elem["matrix"] = group:matrix()
23 for i, obj in ipairs(elem) do
24 if (obj:type() == "group") then
25 local subElem, subPlainElem = ungroup(obj)
27 for _, subObj in ipairs(subPlainElem) do
28 table.insert(plainElem, subObj)
31 table.insert(plainElem, obj)
34 return elem, plainElem
37 -- Applies the function func to the object page[obj_id]. If
38 -- page[obj_id] is a group, func is recursively applied to every
39 -- element in this group.
40 function apply_recursively(page, obj_id, funct)
42 if obj:type() == "group" then
43 local elem, plainElem = ungroup(obj)
44 for _,subobj in pairs(plainElem) do
47 page:replace(obj_id, regroup(elem))
56 -- Helper for compatibility with different ipe-versions.
57 function mainWindow(model)
58 if model.ui.win == nil then
65 -- Show a warning to the user.
66 function report_problem(model, text)
67 ipeui.messageBox(mainWindow(model), "warning", text, nil, nil)
70 function get_number(model, obj, property, kind)
71 local res = obj:get(property)
72 if (_G.type(res) == "number") then
75 local sheets = model.doc:sheets()
76 return sheets:find(kind, res)
80 function scale_property(model, obj, property, kind, factor)
81 obj:set(property, get_number(model, obj, property, kind) * factor)
84 function scale_unscalable(model, obj, factor)
85 if (obj:type() == "reference") then
86 scale_property(model, obj, "symbolsize", "symbolsize", factor)
88 if (obj:type() == "path") then
89 scale_property(model, obj, "pen", "pen", factor)
90 scale_property(model, obj, "farrowsize", "arrowsize", factor)
91 scale_property(model, obj, "rarrowsize", "arrowsize", factor)
95 function scale_test (model)
96 local p = model:page()
97 local str = model:getString("Enter scale factor")
98 if not str or str:match("^%s*$") or not str:match("^[%+%-%d%.]+$") then
101 local factor = tonumber(str)
103 local t = { label = "scaling",
106 selection = model:selection(),
107 original = model:page():clone(),
109 undo = _G.revertOriginal,}
110 t.redo = function (t, doc)
112 -- for _, i in ipairs(t.selection) do
116 for i, obj, sel, layer in p:objects() do
118 apply_recursively(p, i, function (obj) scale_unscalable(model, obj, factor) end)
129 { label = "scale_test", run=scale_test },