local component = require("component") local event = require("event") local unicode = require("unicode") local serialization = require("serialization") local fs = require("filesystem") local color = require("color") local buffer = require("doubleBuffering") local context = require("context") local bigLetters = require("bigLetters") local ecs = require("ECSAPI") local printer local gpu = component.gpu local hologramAvailable = component.isAvailable("hologram") ------------------------------------------------------------------------------------------------------------------------ if component.isAvailable("printer3d") then printer = component.printer3d else ecs.error("Этой программе требуется 3D-принтер для работы.") return end ------------------------------------------------------------------------------------------------------------------------ local colors = { drawingZoneCYKA = 0xCCCCCC, drawingZoneBackground = 0xFFFFFF, drawingZoneStartPoint = 0x262626, drawingZoneEndPoint = 0x555555, drawingZoneSelection = 0xFF5555, toolbarBackground = 0xEEEEEE, toolbarText = 0x262626, toolbarKeyText = 0x000000, toolbarValueText = 0x666666, toolbarBigLetters = 0x262626, shapeNumbersText = 0xFFFFFF, shapeNumbersBackground = 0xAAAAAA, shapeNumbersActiveBackground = ecs.colors.blue, shapeNumbersActiveText = 0xFFFFFF, toolbarInfoBackground = 0x262626, toolbarInfoText = 0xFFFFFF, toolbarButtonBackground = 0xCCCCCC, toolbarButtonText = 0x262626, } local xOld, yOld = gpu.getResolution() local xSize, ySize = 160, 50 gpu.setResolution(160, 50) buffer.flush() local widthOfToolbar = 33 local xToolbar = xSize - widthOfToolbar + 1 local widthOfDrawingCYKA = xSize - widthOfToolbar local currentLayer = 1 local currentShape = 1 local maxShapeCount = printer.getMaxShapeCount() if maxShapeCount > 24 then maxShapeCount = 24 end local currentMode = 1 local modes = { "неактивная", "активная" } local currentTexture = "planks_oak" local currentTint = ecs.colors.orange local useTint = false local showLayerOnHologram = true local pixelWidth = 6 local pixelHeight = 3 local drawingZoneWidth = pixelWidth * 16 local drawingZoneHeight = pixelHeight * 16 local xDrawingZone = math.floor(widthOfDrawingCYKA / 2 - drawingZoneWidth / 2) local yDrawingZone = 3 local shapeColors = {} local HUE = 0 local HUEAdder = math.floor(360 / maxShapeCount) for i = 1, maxShapeCount do shapeColors[i] = color.HSBToInteger(HUE, 1, 1) HUE = HUE + HUEAdder end HUE, HUEAdder = nil, nil local model = {} ------------------------------------------------------------------------------------------------------------------------ local function swap(a, b) return b, a end local function correctShapeCoords(shapeNumber) if model.shapes[shapeNumber] then if model.shapes[shapeNumber][1] >= model.shapes[currentShape][4] then model.shapes[shapeNumber][1], model.shapes[currentShape][4] = swap(model.shapes[currentShape][1], model.shapes[currentShape][4]) model.shapes[shapeNumber][1] = model.shapes[shapeNumber][1] - 1 model.shapes[shapeNumber][4] = model.shapes[shapeNumber][4] + 1 -- ecs.error("СУКА") end if model.shapes[shapeNumber][2] >= model.shapes[currentShape][5] then model.shapes[shapeNumber][2], model.shapes[currentShape][5] = swap(model.shapes[currentShape][2], model.shapes[currentShape][5]) model.shapes[shapeNumber][2] = model.shapes[shapeNumber][2] - 1 model.shapes[shapeNumber][5] = model.shapes[shapeNumber][5] + 1 -- ecs.error("СУКА2") end if model.shapes[shapeNumber][3] >= model.shapes[currentShape][6] then model.shapes[shapeNumber][3], model.shapes[currentShape][6] = swap(model.shapes[currentShape][3], model.shapes[currentShape][6]) model.shapes[shapeNumber][3] = model.shapes[shapeNumber][3] - 1 model.shapes[shapeNumber][6] = model.shapes[shapeNumber][6] + 1 -- ecs.error("СУКА3") end end end local function loadShapeParameters() if model.shapes[currentShape] then currentTexture = model.shapes[currentShape].texture if model.shapes[currentShape].tint then currentTint = model.shapes[currentShape].tint useTint = true else useTint = false end end end local function fixModelArray() model.label = model.label or "Sample label" model.tooltip = model.tooltip or "Sample tooltip" model.lightLevel = model.lightLevel or 0 model.emitRedstone = model.emitRedstone or false model.buttonMode = model.buttonMode or false model.collidable = model.collidable or {true, true} model.shapes = model.shapes or {} currentLayer = 1 currentShape = 1 currentMode = 1 loadShapeParameters() end --Объекты для тача local obj = {} local function newObj(class, name, ...) obj[class] = obj[class] or {} obj[class][name] = {...} end local function drawShapeNumbers(x, y) local counter = 1 local xStart = x for j = 1, 4 do for i = 1, 6 do if currentShape == counter then newObj("ShapeNumbers", counter, buffer.button(x, y, 4, 1, shapeColors[counter], 0xFFFFFF - shapeColors[counter], tostring(counter))) -- newObj("ShapeNumbers", counter, buffer.button(x, y, 4, 1, colors.shapeNumbersActiveBackground, colors.shapeNumbersActiveText, tostring(counter))) else newObj("ShapeNumbers", counter, buffer.button(x, y, 4, 1, colors.shapeNumbersBackground, colors.shapeNumbersText, tostring(counter))) end x = x + 5 counter = counter + 1 if counter > maxShapeCount then return end end x = xStart y = y + 2 end end local function toolBarInfoLine(y, text) buffer.drawRectangle(xToolbar, y, widthOfToolbar, 1, colors.toolbarInfoBackground, 0xFFFFFF, " ") buffer.drawText(xToolbar + 1, y, colors.toolbarInfoText, text) end local function centerText(y, color, text) local x = math.floor(xToolbar + widthOfToolbar / 2 - unicode.len(text) / 2) buffer.drawText(x, y, color, text) end local function addButton(y, back, fore, text) newObj("ToolbarButtons", text, buffer.button(xToolbar + 2, y, widthOfToolbar - 4, 3, back, fore, text)) end local function printKeyValue(x, y, keyColor, valueColor, key, value, limit) local totalLength = unicode.len(key .. ": " .. value) if totalLength > limit then value = unicode.sub(value, 1, limit - unicode.len(key .. ": ") - 1) .. "…" end buffer.drawText(x, y, keyColor, key .. ":") buffer.drawText(x + unicode.len(key) + 2, y, valueColor, value) end local function getShapeCoords() local coords = "элемент не создан" if model.shapes[currentShape] then coords = "(" .. model.shapes[currentShape][1] .. "," .. model.shapes[currentShape][2] .. "," .. model.shapes[currentShape][3] .. ");(" .. model.shapes[currentShape][4] .. "," .. model.shapes[currentShape][5] .. "," .. model.shapes[currentShape][6] .. ")" end return coords end local function fixNumber(number) if number < 10 then number = "0" .. number end return tostring(number) end local function drawToolbar() buffer.drawRectangle(xToolbar, 1, widthOfToolbar, ySize, colors.toolbarBackground, 0xFFFFFF, " ") local x = xToolbar + 8 local y = 3 --Текущий слой bigLetters.drawText(x, y, colors.toolbarBigLetters, fixNumber(currentLayer)) y = y + 6 centerText(y, colors.toolbarText, "Текущий слой") --Управление элементом y = y + 2 x = xToolbar + 2 toolBarInfoLine(y, "Управление моделью"); y = y + 2 printKeyValue(x, y, colors.toolbarKeyText, colors.toolbarValueText, "Имя", model.label, widthOfToolbar - 4); y = y + 1 printKeyValue(x, y, colors.toolbarKeyText, colors.toolbarValueText, "Описание", model.tooltip, widthOfToolbar - 4); y = y + 1 printKeyValue(x, y, colors.toolbarKeyText, colors.toolbarValueText, "Как кнопка", tostring(model.buttonMode), widthOfToolbar - 4); y = y + 1 printKeyValue(x, y, colors.toolbarKeyText, colors.toolbarValueText, "Редстоун-сигнал", tostring(model.emitRedstone), widthOfToolbar - 4); y = y + 1 printKeyValue(x, y, colors.toolbarKeyText, colors.toolbarValueText, "Коллизия", tostring(model.collidable[currentMode]), widthOfToolbar - 4); y = y + 1 printKeyValue(x, y, colors.toolbarKeyText, colors.toolbarValueText, "Уровень света", tostring(model.lightLevel), widthOfToolbar - 4); y = y + 1 y = y + 1 printKeyValue(x, y, ecs.colors.blue, colors.toolbarValueText, "Состояние", modes[currentMode], widthOfToolbar - 4); y = y + 1 y = y + 1 addButton(y, colors.toolbarButtonBackground, colors.toolbarButtonText, "Изменить параметры"); y = y + 4 addButton(y, colors.toolbarButtonBackground, colors.toolbarButtonText, "Напечатать"); y = y + 4 toolBarInfoLine(y, "Управление элементом " .. currentShape); y = y + 2 printKeyValue(x, y, colors.toolbarKeyText, colors.toolbarValueText, "Текстура", tostring(currentTexture), widthOfToolbar - 4); y = y + 1 printKeyValue(x, y, colors.toolbarKeyText, colors.toolbarValueText, "Оттенок", ecs.HEXtoString(currentTint, 6, true), widthOfToolbar - 4); y = y + 1 printKeyValue(x, y, colors.toolbarKeyText, colors.toolbarValueText, "Использовать оттенок", tostring(useTint), widthOfToolbar - 4); y = y + 1 printKeyValue(x, y, colors.toolbarKeyText, colors.toolbarValueText, "Позиция", getShapeCoords(), widthOfToolbar - 4); y = y + 2 addButton(y, colors.toolbarButtonBackground, colors.toolbarButtonText, "Изменить параметры "); y = y + 4 --Элементы toolBarInfoLine(y, "Выбор элемента"); y = y + 2 drawShapeNumbers(x, y) y = y + 8 end local function drawTopMenu(selected) obj["TopMenu"] = ecs.drawTopMenu(1, 1, xSize - widthOfToolbar, colors.toolbarBackground, selected, {"Файл", 0x262626}, {"Проектор", 0x262626}, {"О программе", 0x262626}) end local function renderCurrentLayerOnHologram(xStart, yStart, zStart) if showLayerOnHologram then for i = yStart, yStart + 16 do component.hologram.set(xStart - 1, i, zStart + (16 - currentLayer), 3) component.hologram.set(xStart + 16, i, zStart + (16 - currentLayer), 3) end for i = (xStart-1), (xStart + 16) do component.hologram.set(i, yStart - 1, zStart + (16 - currentLayer), 3) component.hologram.set(i, yStart + 16, zStart + (16 - currentLayer), 3) end end end local function drawModelOnHologram() if hologramAvailable then local xStart, yStart, zStart = 16,4,16 component.hologram.clear() for shape in pairs(model.shapes) do if (currentMode == 2 and model.shapes[shape].state) or (currentMode == 1 and not model.shapes[shape].state) then if model.shapes[shape] then for x = model.shapes[shape][1], model.shapes[shape][4] - 1 do for y = model.shapes[shape][2], model.shapes[shape][5] - 1 do for z = model.shapes[shape][3], model.shapes[shape][6] - 1 do --Эта хуйня для того, чтобы в разных режимах не ебало мозг if (model.shapes[shape].state and currentMode == 2) or (not model.shapes[shape].state and currentMode == 1) then if shape == currentShape then component.hologram.set(xStart + x, yStart + y, zStart + 15 - z, 2) else component.hologram.set(xStart + x, yStart + y, zStart + 15 - z, 1) end end end end end end end end renderCurrentLayerOnHologram(xStart, yStart, zStart) end end local function printModel(count) printer.reset() printer.setLabel(model.label) printer.setTooltip(model.tooltip) printer.setCollidable(model.collidable[1], model.collidable[2]) printer.setLightLevel(model.lightLevel) printer.setRedstoneEmitter(model.emitRedstone) printer.setButtonMode(model.buttonMode) for i in pairs(model.shapes) do printer.addShape( model.shapes[i][1], (model.shapes[i][2]), (model.shapes[i][3]), model.shapes[i][4], (model.shapes[i][5]), (model.shapes[i][6]), model.shapes[i].texture, model.shapes[i].state, model.shapes[i].tint ) end local success, reason = printer.commit(count) if not success then ecs.error("Ошибка печати: " .. reason) end end local function drawPixel(x, y, width, height, color, trasparency) buffer.drawRectangle(xDrawingZone + x * pixelWidth - pixelWidth, yDrawingZone + y * pixelHeight - pixelHeight, width * pixelWidth, height * pixelHeight, color, 0xFFFFFF, " ", trasparency) end local function setka() drawPixel(1, 1, 16, 16, colors.drawingZoneBackground) local shade = colors.drawingZoneBackground - 0x111111 for j = 1, 16 do for i = 1, 16 do if j % 2 == 0 then if i % 2 == 0 then drawPixel(i, j, 1, 1, shade) end else if i % 2 ~= 0 then drawPixel(i, j, 1, 1, shade) end end end end end local function drawDrawingZone() setka() local selectionStartPoint = {} local selectionEndPoint = {} local trasparency = 70 for shape in pairs(model.shapes) do --Если по состояниям все заебок if ((model.shapes[shape].state and currentMode == 2) or (not model.shapes[shape].state and currentMode == 1)) then selectionStartPoint.x = model.shapes[shape][1] + 1 selectionStartPoint.y = model.shapes[shape][2] + 1 selectionStartPoint.z = model.shapes[shape][3] + 1 selectionEndPoint.x = model.shapes[shape][4] selectionEndPoint.y = model.shapes[shape][5] selectionEndPoint.z = model.shapes[shape][6] local yDifference = selectionEndPoint.y - selectionStartPoint.y + 1 if currentLayer >= selectionStartPoint.z and currentLayer <= selectionEndPoint.z then if shape ~= currentShape then local h, s, b = color.integerToHSB(shapeColors[shape]) s = 0.3 -- ecs.error("РИСУЮ") drawPixel(selectionStartPoint.x, 18 - selectionStartPoint.y - yDifference, selectionEndPoint.x - selectionStartPoint.x + 1, yDifference, color.HSBToInteger(h, s, b)) -- drawPixel(selectionStartPoint.x, selectionStartPoint.z, selectionEndPoint.x - selectionStartPoint.x + 1, selectionEndPoint.z - selectionStartPoint.z + 1, shapeColors[shape], trasparency) else drawPixel(selectionStartPoint.x, 18 - selectionStartPoint.y - yDifference, selectionEndPoint.x - selectionStartPoint.x + 1, yDifference, shapeColors[shape]) --Точки if selectionStartPoint.z == currentLayer then drawPixel(selectionStartPoint.x, 17 - selectionStartPoint.y, 1, 1, colors.drawingZoneStartPoint) end if selectionEndPoint.z == currentLayer then drawPixel(selectionEndPoint.x, 17 - selectionEndPoint.y, 1, 1, colors.drawingZoneEndPoint) end end end end end end local function drawAll() buffer.drawRectangle(1, 2, xSize, ySize, colors.drawingZoneCYKA, 0xFFFFFF, " ") drawDrawingZone() drawToolbar() buffer.drawChanges() drawTopMenu(0) end local function save(path) fs.makeDirectory(fs.path(path) or "") local file = io.open(path, "w") file:write(serialization.serialize(model)) file:close() end local function open(path) if fs.exists(path) then if ecs.getFileFormat(path) == ".3dm" then local file = io.open(path, "r") model = serialization.unserialize(file:read("*a")) fixModelArray() file:close() drawAll() drawModelOnHologram() else ecs.error("Файл имеет неизвестный формат. Поддерживаются только модели в формате .3dm.") end else ecs.error("Файл \"" .. path .. "\" не существует") end end ------------------------------------------------------------------------------------------------------------------------ model = {} fixModelArray() local args = {...} if args[1] and fs.exists(args[1]) then open(args[1]) end drawAll() drawModelOnHologram() ------------------------------------------------------------------------------------------------------------------------ local startPointSelected = false local xShapeStart, yShapeStart, zShapeStart, xShapeEnd, yShapeEnd, zShapeEnd while true do local e = { event.pull() } if e[1] == "touch" then --Если кликнули в зону рисования if ecs.clickedAtArea(e[3], e[4], xDrawingZone, yDrawingZone, xDrawingZone + drawingZoneWidth - 1, yDrawingZone + drawingZoneHeight - 1) then if not startPointSelected then xShapeStart = math.ceil((e[3] - xDrawingZone + 1) / pixelWidth) yShapeStart = math.ceil((e[4] - yDrawingZone + 1) / pixelHeight) zShapeStart = currentLayer startPointSelected = true model.shapes[currentShape] = nil -- buffer.drawRectangle(xDrawingZone, yDrawingZone, drawingZoneWidth, drawingZoneHeight, colors.drawingZoneBackground, 0xFFFFFF, " ") drawPixel(xShapeStart, yShapeStart, 1, 1, colors.drawingZoneStartPoint) buffer.drawChanges() else xShapeEnd = math.ceil((e[3] - xDrawingZone + 1) / pixelWidth) yShapeEnd = math.ceil((e[4] - yDrawingZone + 1) / pixelHeight) zShapeEnd = currentLayer drawPixel(xShapeEnd, yShapeEnd, 1, 1, colors.drawingZoneEndPoint) startPointSelected = false model.shapes[currentShape] = { xShapeStart - 1, 17 - yShapeStart - 1, zShapeStart - 1, xShapeEnd, 17 - yShapeEnd, zShapeEnd, texture = currentTexture, } model.shapes[currentShape].state = nil model.shapes[currentShape].tint = nil if currentMode == 2 then model.shapes[currentShape].state = true end if useTint then model.shapes[currentShape].tint = currentTint end correctShapeCoords(currentShape) drawAll() drawModelOnHologram() end else for key in pairs(obj.ShapeNumbers) do if ecs.clickedAtArea(e[3], e[4], obj.ShapeNumbers[key][1], obj.ShapeNumbers[key][2], obj.ShapeNumbers[key][3], obj.ShapeNumbers[key][4]) then currentShape = key loadShapeParameters() drawAll() drawModelOnHologram() break end end for key in pairs(obj.ToolbarButtons) do if ecs.clickedAtArea(e[3], e[4], obj.ToolbarButtons[key][1], obj.ToolbarButtons[key][2], obj.ToolbarButtons[key][3], obj.ToolbarButtons[key][4]) then buffer.button(obj.ToolbarButtons[key][1], obj.ToolbarButtons[key][2], widthOfToolbar - 4, 3, ecs.colors.blue, 0xFFFFFF, key) buffer.drawChanges() os.sleep(0.2) if key == "Напечатать" then local data = ecs.universalWindow("auto", "auto", 36, 0x262626, true, {"EmptyLine"}, {"CenterText", ecs.colors.orange, "Напечатать"}, {"EmptyLine"}, {"Slider", 0xFFFFFF, ecs.colors.orange, 1, 64, 1, "", " штук"}, {"EmptyLine"}, {"Button", {ecs.colors.orange, 0xffffff, "OK"}, {0x999999, 0xffffff, "Отмена"}} ) if data[2] == "OK" then printModel(data[1]) end elseif key == "Изменить параметры" then local data = ecs.universalWindow("auto", "auto", 36, 0x262626, true, {"EmptyLine"}, {"CenterText", ecs.colors.orange, "Параметры модели"}, {"EmptyLine"}, {"Input", 0xFFFFFF, ecs.colors.orange, model.label}, {"Input", 0xFFFFFF, ecs.colors.orange, model.tooltip}, {"Selector", 0xFFFFFF, ecs.colors.orange, "Неактивная", "Активная"}, {"EmptyLine"}, {"Switch", ecs.colors.orange, 0xffffff, 0xFFFFFF, "Как кнопка", model.buttonMode}, {"EmptyLine"}, {"Switch", ecs.colors.orange, 0xffffff, 0xFFFFFF, "Редстоун-сигнал", model.emitRedstone}, {"EmptyLine"}, {"Switch", ecs.colors.orange, 0xffffff, 0xFFFFFF, "Коллизия", model.collidable[currentMode]}, {"EmptyLine"}, {"Slider", 0xFFFFFF, ecs.colors.orange, 0, 15, model.lightLevel, "Уровень света: ", ""}, {"EmptyLine"}, {"Button", {ecs.colors.orange, 0xffffff, "OK"}, {0x999999, 0xffffff, "Отмена"}} ) if data[8] == "OK" then model.label = data[1] or "Sample label" model.tooltip = data[2] or "Sample tooltip" if data[3] == "Активная" then currentMode = 2 else currentMode = 1 end model.buttonMode = data[4] model.emitRedstone = data[5] model.collidable[currentMode] = data[6] model.lightLevel = data[7] end elseif key == "Изменить параметры " then local data = ecs.universalWindow("auto", "auto", 36, 0x262626, true, {"EmptyLine"}, {"CenterText", ecs.colors.orange, "Параметры элемента"}, {"EmptyLine"}, {"Input", 0xFFFFFF, ecs.colors.orange, currentTexture}, {"Color", "Оттенок", currentTint}, {"EmptyLine"}, {"Switch", ecs.colors.orange, 0xffffff, 0xFFFFFF, "Использовать оттенок", useTint}, {"EmptyLine"}, {"Button", {ecs.colors.orange, 0xffffff, "OK"}, {0x999999, 0xffffff, "Отмена"}} ) if data[4] == "OK" then currentTexture = data[1] currentTint = data[2] useTint = data[3] if model.shapes[currentShape] then model.shapes[currentShape].texture = currentTexture if useTint then model.shapes[currentShape].tint = currentTint else model.shapes[currentShape].tint = nil end end end end drawAll() drawModelOnHologram() break end end for key in pairs(obj.TopMenu) do if ecs.clickedAtArea(e[3], e[4], obj.TopMenu[key][1], obj.TopMenu[key][2], obj.TopMenu[key][3], obj.TopMenu[key][4]) then drawTopMenu(obj.TopMenu[key][5]) -- buffer.button(obj.TopMenu[key][1] - 1, obj.TopMenu[key][2], unicode.len(key) + 2, 1, ecs.colors.blue, 0xFFFFFF, key) -- buffer.drawChanges() local action if key == "Файл" then action = context.menu(obj.TopMenu[key][1] - 1, obj.TopMenu[key][2] + 1, {"Новый"}, "-", {"Открыть"}, {"Сохранить"}, "-", {"Выход"}) elseif key == "Проектор" then action = context.menu(obj.TopMenu[key][1] - 1, obj.TopMenu[key][2] + 1, {"Масштаб", not hologramAvailable}, {"Отступ проекции", not hologramAvailable}, {"Изменить палитру", not hologramAvailable}, "-", {"Включить показ слоя", not hologramAvailable}, {"Отключить показ слоя", not hologramAvailable}, "-", {"Включить вращение", not hologramAvailable}, {"Отключить вращение", not hologramAvailable}) elseif key == "О программе" then ecs.universalWindow("auto", "auto", 36, 0x262626, true, {"EmptyLine"}, {"CenterText", ecs.colors.orange, "3DPrint v3.0"}, {"EmptyLine"}, {"CenterText", 0xFFFFFF, "Автор:"}, {"CenterText", 0xBBBBBB, "Тимофеев Игорь"}, {"CenterText", 0xBBBBBB, "vk.com/id7799889"}, {"EmptyLine"}, {"CenterText", 0xFFFFFF, "Тестеры:"}, {"CenterText", 0xBBBBBB, "Семёнов Сeмён"}, {"CenterText", 0xBBBBBB, "vk.com/day_z_utes"}, {"CenterText", 0xBBBBBB, "Бесфамильный Яков"}, {"CenterText", 0xBBBBBB, "vk.com/mathem"}, {"CenterText", 0xBBBBBB, "Егор Палиев"}, {"CenterText", 0xBBBBBB, "vk.com/mrherobrine"}, {"EmptyLine"}, {"Button", {ecs.colors.orange, 0xffffff, "OK"}} ) end if action == "Сохранить" then local data = ecs.universalWindow("auto", "auto", 30, 0x262626, true, {"EmptyLine"}, {"CenterText", ecs.colors.orange, "Сохранить как"}, {"EmptyLine"}, {"Input", 0xFFFFFF, ecs.colors.orange, "Путь"}, {"Selector", 0xFFFFFF, ecs.colors.orange, ".3dm"}, {"EmptyLine"}, {"Button", {ecs.colors.orange, 0xffffff, "OK"}, {0x999999, 0xffffff, "Отмена"}} ) if data[3] == "OK" then data[1] = data[1] or "Untitled" local filename = data[1] .. data[2] save(filename) end elseif action == "Открыть" then local data = ecs.universalWindow("auto", "auto", 30, 0x262626, true, {"EmptyLine"}, {"CenterText", ecs.colors.orange, "Открыть"}, {"EmptyLine"}, {"Input", 0xFFFFFF, ecs.colors.orange, "Путь"}, {"EmptyLine"}, {"Button", {ecs.colors.orange, 0xffffff, "OK"}, {0x999999, 0xffffff, "Отмена"}} ) if data[2] == "OK" then open(data[1]) end elseif action == "Новый" then model = {} fixModelArray() drawAll() drawModelOnHologram() elseif action == "Выход" then gpu.setResolution(xOld, yOld) buffer.flush() buffer.drawChanges(true) if hologramAvailable then component.hologram.clear() end return elseif action == "Масштаб" then local data = ecs.universalWindow("auto", "auto", 36, 0x262626, true, {"EmptyLine"}, {"CenterText", ecs.colors.orange, "Изменить масштаб"}, {"EmptyLine"}, {"Slider", ecs.colors.white, ecs.colors.orange, 1, 100, math.ceil(component.hologram.getScale() * 100 / 4), "", "%"}, {"EmptyLine"}, {"Button", {ecs.colors.orange, 0xffffff, "OK"}, {0x999999, 0xffffff, "Отмена"}} ) if data[2] == "OK" then component.hologram.setScale(data[1] * 4 / 100) end elseif action == "Отступ проекции" then local translation = { component.hologram.getTranslation() } local data = ecs.universalWindow("auto", "auto", 36, 0x262626, true, {"EmptyLine"}, {"CenterText", ecs.colors.orange, "Отступ проекции"}, {"EmptyLine"}, {"CenterText", 0xFFFFFF, "Эти параметры позволяют проецировать"}, {"CenterText", 0xFFFFFF, "голограмму на некотором расстоянии от"}, {"CenterText", 0xFFFFFF, "проектора. Удобно, если вы хотите спрятать"}, {"CenterText", 0xFFFFFF, "проектор от чужих глаз."}, {"EmptyLine"}, {"Slider", 0xFFFFFF, ecs.colors.orange, 1, 100, translation[1] * 100, "Ось X: ", "%"}, {"Slider", 0xFFFFFF, ecs.colors.orange, 1, 100, translation[2] * 100, "Ось Y: ", "%"}, {"Slider", 0xFFFFFF, ecs.colors.orange, 1, 100, translation[3] * 100, "Ось Z: ", "%"}, {"EmptyLine"}, {"Button", {ecs.colors.orange, 0xffffff, "OK"}, {0x999999, 0xffffff, "Отмена"}} ) if data[4] == "OK" then component.hologram.setTranslation(data[1] / 100, data[2] / 100, data[3] / 100) end elseif action == "Изменить палитру" then local data = ecs.universalWindow("auto", "auto", 36, 0x262626, true, {"EmptyLine"}, {"CenterText", ecs.colors.orange, "Палитра проектора"}, {"EmptyLine"}, {"Color", "Цвет активного элемента", component.hologram.getPaletteColor(2)}, {"Color", "Цвет других элементов", component.hologram.getPaletteColor(1)}, {"Color", "Цвет рамки высоты", component.hologram.getPaletteColor(3)}, {"EmptyLine"}, {"Button", {ecs.colors.orange, 0xffffff, "OK"}, {0x999999, 0xffffff, "Отмена"}} ) if data[4] == "OK" then component.hologram.setPaletteColor(2, data[1]) component.hologram.setPaletteColor(1, data[2]) component.hologram.setPaletteColor(3, data[3]) end elseif action == "Включить показ слоя" then showLayerOnHologram = true drawModelOnHologram() elseif action == "Отключить показ слоя" then showLayerOnHologram = false drawModelOnHologram() elseif action == "Включить вращение" then component.hologram.setRotationSpeed(15, 0, 23, 0) elseif action == "Отключить вращение" then component.hologram.setRotationSpeed(0, 0, 0, 0) end drawTopMenu(0) end end end elseif e[1] == "scroll" then if e[5] == 1 then if currentLayer < 16 then currentLayer = currentLayer + 1 drawAll() drawModelOnHologram() end else if currentLayer > 1 then currentLayer = currentLayer - 1 drawAll() drawModelOnHologram() end end end end