MineOS/Beta/Printer.lua
2015-10-20 04:43:55 +03:00

345 lines
9.0 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

------------------------------------------ Библиотеки -----------------------------------------------------------------
local component = require("component")
local colorlib = require("colorlib")
local event = require("event")
local gpu = component.gpu
local printer = component.printer3d
local hologram = component.hologram
------------------------------------------ Переменные -----------------------------------------------------------------
local pixels = {}
local model = {
label = "Sosi hui",
tooltip = "mamu ebal",
buttonMode = true,
redstoneEmitter = true,
active = {
{x = 1, y = 1, z = 1, x2 = 1, y2 = 1, z2 = 12},
{x = 1, y = 8, z = 1, x2 = 8, y2 = 8, z2 = 16},
{x = 16, y = 16, z = 16, x2 = 16, y2 = 16, z2 = 16},
},
passive = {}
}
local colors = {
objects = 0x3349FF,
points = 0xFFFFFF,
border = 0xFFFF00,
background = 0x262626,
rightBar = 0x383838,
lines = 0x222222,
}
local countOfShapes = printer.getMaxShapeCount()
local adder = 360 / countOfShapes
local hue = 0
colors.shapes = {}
for i = 1, countOfShapes do
table.insert(colors.shapes, colorlib.HSBtoHEX(hue, 100, 100))
hue = hue + adder
end
local sizes = {}
sizes.oldResolutionWidth, sizes.oldResolutionHeight = gpu.getResolution()
sizes.xSize, sizes.ySize = gpu.maxResolution()
--
sizes.widthOfRightBar, sizes.heightOfRightBar = 36, sizes.ySize
sizes.xStartOfRightBar, sizes.yStartOfRightBar = sizes.xSize - sizes.widthOfRightBar + 1, 1
--
sizes.widthOfHorizontal = sizes.xSize - sizes.widthOfRightBar
sizes.xStartOfVertical, sizes.yStartOfVertical = math.floor(sizes.widthOfHorizontal / 2), 1
sizes.xStartOfHorizontal, sizes.yStartOfHorizontal = 1, math.floor(sizes.ySize / 2)
--
sizes.widthOfPixel, sizes.heightOfPixel = 2, 1
sizes.image = {}
sizes.image[1] = {x = math.floor(sizes.xStartOfVertical / 2 - (sizes.widthOfPixel * 16) / 2), y = math.floor(sizes.yStartOfHorizontal / 2 - (sizes.heightOfPixel * 16) / 2)}
sizes.image[2] = {x = sizes.xStartOfVertical + sizes.image[1].x + 1, y = sizes.image[1].y}
sizes.image[3] = {x = sizes.image[1].x, y = sizes.yStartOfHorizontal + sizes.image[1].y + 1}
sizes.image[4] = {x = sizes.image[2].x, y = sizes.image[3].y}
local holoOutlineX, holoOutlineY, holoOutlineZ = 16, 24, 16
local currentShape = 1
local currentLayer = 1
------------------------------------------ Функции -----------------------------------------------------------------
local function drawTransparentBackground(x, y, color1, color2)
local xPos, yPos = x, y
local color
for j = 1, 16 do
for i = 1, 16 do
if i % 2 == 0 then
if j % 2 == 0 then
color = color1
else
color = color2
end
else
if j % 2 == 0 then
color = color2
else
color = color1
end
end
ecs.square(xPos, yPos, sizes.widthOfPixel, sizes.heightOfPixel, color)
xPos = xPos + sizes.widthOfPixel
end
xPos = x
yPos = yPos + sizes.heightOfPixel
end
end
local function changePalette()
hologram.setPaletteColor(1, colors.objects)
hologram.setPaletteColor(2, colors.points)
hologram.setPaletteColor(3, colors.border)
end
local function drawShapesList(x, y)
local xPos, yPos = x, y
local color
for i = 1, countOfShapes do
color = 0x000000
if i == currentShape then color = colors.shapes[i] end
ecs.drawButton(xPos, yPos, 4, 1, tostring(i), color, 0xFFFFFF )
xPos = xPos + 5
if i % 6 == 0 then xPos = x; yPos = yPos + 2 end
end
end
local function drawInfo(y, info)
ecs.square(sizes.xStartOfRightBar, y, sizes.widthOfRightBar, 1, 0x000000)
ecs.colorText(sizes.xStartOfRightBar + 2, y, 0xFFFFFF, info)
end
local function drawRightBar()
local xPos, yPos = sizes.xStartOfRightBar, sizes.yStartOfRightBar
ecs.square(xPos, yPos, sizes.widthOfRightBar, sizes.heightOfRightBar, colors.rightBar)
drawInfo(yPos, "Работа с моделью"); yPos = yPos + 2
yPos = yPos + 5
drawInfo(yPos, "Работа с объектом"); yPos = yPos + 2
yPos = yPos + 5
drawInfo(yPos, "Выбор объекта"); yPos = yPos + 3
drawShapesList(xPos + 2, yPos); yPos = yPos + (countOfShapes / 6 * 2) + 1
drawInfo(yPos, "Управление голограммой"); yPos = yPos + 2
yPos = yPos + 5
drawInfo(yPos, "Управление принтером"); yPos = yPos + 2
yPos = yPos + 5
end
local function drawLines()
ecs.square(sizes.xStartOfVertical, sizes.yStartOfVertical, 2, sizes.ySize,colors.lines)
ecs.square(sizes.xStartOfHorizontal, sizes.yStartOfHorizontal, sizes.widthOfHorizontal , 1, colors.lines)
end
local function drawViewArray(x, y, massiv)
local xPos, yPos = x, y
for i = 1, #massiv do
for j = 1, #massiv[i] do
if massiv[i][j] ~= "#" then
ecs.square(xPos, yPos, sizes.widthOfPixel, sizes.heightOfPixel, massiv[i][j])
end
xPos = xPos + sizes.widthOfPixel
end
xPos = x
yPos = yPos + sizes.heightOfPixel
end
end
--Нарисовать вид спереди
local function drawFrontView()
local massiv = {}
for i = 1, 16 do
massiv[i] = {}
for j = 1, 16 do
massiv[i][j] = "#"
end
end
for x = 1, #pixels do
for y = 1, #pixels[x] do
for z = 1, #pixels[x][y] do
if pixels[x][y][z] ~= "#" then
massiv[y][x] = pixels[x][y][z]
end
end
end
end
drawViewArray(sizes.image[1].x, sizes.image[1].y, massiv)
end
--Нарисовать вид сверху
local function drawTopView()
local massiv = {}
for i = 1, 16 do
massiv[i] = {}
for j = 1, 16 do
massiv[i][j] = "#"
end
end
for x = 1, #pixels do
for y = 1, #pixels[x] do
for z = 1, #pixels[x][y] do
if pixels[x][y][z] ~= "#" then
massiv[z][x] = pixels[x][y][z]
end
end
end
end
drawViewArray(sizes.image[3].x, sizes.image[3].y, massiv)
end
--Нарисовать вид сбоку
local function drawSideView()
local massiv = {}
for i = 1, 16 do
massiv[i] = {}
for j = 1, 16 do
massiv[i][j] = "#"
end
end
for x = 1, #pixels do
for y = 1, #pixels[x] do
for z = 1, #pixels[x][y] do
if pixels[x][y][z] ~= "#" then
massiv[y][z] = pixels[x][y][z]
end
end
end
end
drawViewArray(sizes.image[2].x, sizes.image[2].y, massiv)
end
--Сконвертировать массив объектов в трехмерный массив 3D-изображения
local function render()
pixels = {}
for x = 1, 16 do
pixels[x] = {}
for y = 1, 16 do
pixels[x][y] = {}
for z = 1, 16 do
pixels[x][y][z] = "#"
end
end
end
for x = 1, 16 do
for y = 1, 16 do
for z = 1, 16 do
for i = 1, #model.active do
if (x >= model.active[i].x and x <= model.active[i].x2) and (y >= model.active[i].y and y <= model.active[i].y2) and (z >= model.active[i].z and z <= model.active[i].z2) then
pixels[x][y][z] = colors.shapes[i]
--hologram.set(x, y, z, 1)
end
end
end
end
end
end
local function drawBorder()
for i = 0, 17 do
hologram.set(i + holoOutlineX, holoOutlineY - currentLayer, holoOutlineZ, 3)
hologram.set(i + holoOutlineX, holoOutlineY - currentLayer, 17 + holoOutlineZ, 3)
hologram.set(holoOutlineX, holoOutlineY - currentLayer, i + holoOutlineZ, 3)
hologram.set(17 + holoOutlineX, holoOutlineY - currentLayer, i + holoOutlineZ, 3)
end
end
local function drawFrame()
--Верхний левый
for i = 1, 2 do hologram.set(i + holoOutlineX - 1, holoOutlineY - 1, holoOutlineZ, 2) end
hologram.set(holoOutlineX, holoOutlineY - 1, holoOutlineZ + 1, 2)
hologram.set(holoOutlineX, holoOutlineY - 2, holoOutlineZ, 2)
--Верхний левый
for i = 1, 2 do hologram.set(i + holoOutlineX - 1, holoOutlineY - 16, holoOutlineZ, 2) end
hologram.set(holoOutlineX, holoOutlineY - 16, holoOutlineZ + 1, 2)
hologram.set(holoOutlineX, holoOutlineY - 15, holoOutlineZ, 2)
end
local function drawModelOnHolo()
hologram.clear()
for x = 1, #pixels do
for y = 1, #pixels[x] do
for z = 1, #pixels[x][y] do
if pixels[x][y][z] ~= "#" then
hologram.set(x + holoOutlineX, holoOutlineY - y, z + holoOutlineZ, 1)
end
end
end
end
drawBorder()
--drawFrame()
end
local function drawAllViews()
render()
drawModelOnHolo()
drawFrontView()
drawTopView()
drawSideView()
drawTransparentBackground(sizes.image[4].x, sizes.image[4].y, 0xFFFFFF, 0xDDDDDD)
end
local function drawAll()
drawLines()
drawAllViews()
drawRightBar()
end
------------------------------------------ Программа -----------------------------------------------------------------
if sizes.xSize < 150 then ecs.error("Этой программе требуется монитор и видеокарта 3 уровня."); return end
gpu.setResolution(sizes.xSize, sizes.ySize)
ecs.prepareToExit()
changePalette()
drawAll()
while true do
local e = {event.pull()}
if e[1] == "scroll" then
if e[5] == 1 then
if currentLayer > 1 then currentLayer = currentLayer - 1;drawModelOnHolo() end
else
if currentLayer < 16 then currentLayer = currentLayer + 1;drawModelOnHolo() end
end
end
end
------------------------------------------ Выход из программы -----------------------------------------------------------------
gpu.setResolution(sizes.oldResolutionWidth, sizes.oldResolutionHeight)