Day18 将电脑接上印表机,将程序码或文章包装成书吧

今天来玩玩新的 CC: Tweaked 方块:Printer
跟 Disk Drive 一样,放置在电脑旁边即可自动接上电脑。
这是印表机的使用画面,左边放置墨水,也就是麦块里面的各色「染料」,不过一次只能选择一种颜色的染料。
右上方放置 CC: Tweaked Printed Page 也就是印表纸
列印的输出则会自动放到第二排
但是印表纸无法自动堆叠,所以连续列印的话,一次最多六页
CC: Tweaked Printer

那麽,要怎麽开始列印呢?
当我们把印表机接上电脑後,在使用 edit.lua 编辑档案时,按下 Ctrl,除了原本的「Save」、「Exit」之外,还可以看到多一个「Print」选项,点了之後就会开始将档案内容印到纸张上。档案内容如果太多,则会自动印成多张纸。
这时候如果缺墨水或是缺纸,都会有提示讯息。
把列印成功後的纸张拿下来一看,会长这个样子,至於内容当然就是看你档案了
这真是太神奇了,在麦块里面开机、写 Code、看大萤幕、还可以把 Code 印出来保存!
CC: Tweaked Printed Pages Preview

但是如果你要印的页面很多,这样就会很占物品栏空间,所以 CC: Tweaked 还提供将多张纸綑在一起的方式,如下图,将列印後的纸再加上一条线,就变成了「Printed Pages」
把 Printed Pages 使用拿起来看时,可以按左右方向键来阅读上下页
CC: Tweaked Printed Pages

CC: Tweaked 甚至还提供将一綑纸张再次包装成书的方式,如下图。使用书的方式一样透过左右键,跟 Printed Pages 没什麽不同,差别似乎只是更有仪式感 XD ?
CC: Tweaked Printed Books

这是阅读一本书的画面
CC: Tweaked Printed Books Preview

CC: Tweaked Printer 可以多色列印吗?

碍於这款印表机的设计,如果要连续列印,只能选择单一颜色染料
如果想要印出多个颜色,就需要手动操作,步骤如下:

  1. 先印一部分
  2. 换印表机墨水
  3. 把刚印完的纸拿回去再印
  4. 透过 Printer API setCursorPos(x, y),getCursorPos() 更改列印的位置
  5. 再次列印

这样就可以变相的印出多色纸张,这部分有兴趣可自行尝试,我就不 demo 了
其实印表机如果可以提供填充墨水的 API,会方便很多啊!

自行撰写 Printer API 来操作 CC: Tweaked 印表机

以下是透过 Printer API 自己撰写的片段,可以看到要列印纸张其实还满容易的!

printer = peripheral.wrap('back')
if (printer.getInkLevel() > 0 and printer.getPaperLevel() > 0) then -- 检查墨水和纸张
    if (printer.newPage()) then         -- 准备列印新的一页,这时候还是会再次检查纸张
        print(printer.getPageSize())    -- 示范如何取得纸张大小
        printer.setPageTitle("ironman") -- 设定页面标题
        printer.write(2021)             -- 要列印的内容
        printer.endPage()               -- 结束这张纸的列印
    end
end

体验过印表机的操作後,我也还是尝试了解 Printer 背後原理。

edit.lua #84
这个是在档案编辑後按下 Ctrl 按钮,会判断电脑是否有接印表机,有的话就出现「Print」选项
此时不会检查印表机墨水和纸张

if peripheral.find("printer") then
    table.insert(tMenuItems, "Print")
end

edit.lua #337
这一大段是使用者按下「Print」後的操作

Print = function()
    local printer = peripheral.find("printer")  -- 再次检查印表机是否 ready
    if not printer then
        sStatus = "No printer attached"
        return
    end

    local nPage = 0                             -- 总共列印的页面数
    local sName = fs.getName(sPath)
    if printer.getInkLevel() < 1 then           -- 检查印表机墨水
        sStatus = "Printer out of ink"
        return
    elseif printer.getPaperLevel() < 1 then     -- 检查印表机纸张
        sStatus = "Printer out of paper"
        return
    end

    local screenTerminal = term.current()
    local printerTerminal = {
        getCursorPos = printer.getCursorPos,
        setCursorPos = printer.setCursorPos,
        getSize = printer.getPageSize,
        write = printer.write,
    }
    printerTerminal.scroll = function()
        if nPage == 1 then
            printer.setPageTitle(sName .. " (page " .. nPage .. ")")
        end

        while not printer.newPage() do
            if printer.getInkLevel() < 1 then
                sStatus = "Printer out of ink, please refill"
            elseif printer.getPaperLevel() < 1 then
                sStatus = "Printer out of paper, please refill"
            else
                sStatus = "Printer output tray full, please empty"
            end

            term.redirect(screenTerminal)
            redrawMenu()        -- 每次要改变萤幕讯息时,都要重新绘制 Menu button,但原理我没看懂 @@
            term.redirect(printerTerminal)

            sleep(0.5)
        end

        nPage = nPage + 1
        if nPage == 1 then
            printer.setPageTitle(sName)
        else
            printer.setPageTitle(sName .. " (page " .. nPage .. ")")
        end
    end

    bMenu = false
    term.redirect(printerTerminal)          -- terminal 导向印表机,开始列印
    local ok, error = pcall(function()
        term.scroll()
        for _, sLine in ipairs(tLines) do
            print(sLine)
        end
    end)
    term.redirect(screenTerminal)           -- terminal 导回电脑萤幕
    if not ok then
        print(error)
    end

    while not printer.endPage() do          -- 印表机的输出空位满了,这时候将输出的纸张拿起来後,会继续自动列印
        sStatus = "Printer output tray full, please empty"
        redrawMenu()
        sleep(0.5)
    end
    bMenu = true

    if nPage > 1 then
        sStatus = "Printed " .. nPage .. " Pages"
    else
        sStatus = "Printed 1 Page"
    end
    redrawMenu()
end,

CC: Tweaked 印表机的分享就到这里
目前为止,我们已经有 Disk Drive、Speaker、Printer、Monitor 等电脑周边
而且和电脑介接的方式都完全一致,只有六个方位可以放置
那如果我们真的需要多个磁碟机、印表机
甚至我就是想要双萤幕、三萤幕来写 Code 呢 ...
下一回我来试着让这个愿望成真吧!


<<:  剪裁与遮罩-30天学会HTML+CSS,制作精美网站

>>:  最短路径问题 (7)

Day 12:想要快速产出元件及范本,就用 Angular CLI 吧!(二)

让 Angular 元件显示在画面上 上一篇,我们建立了一个元件 page1。 接下来,我们就要把 ...

利用大数据分析预测MLB胜负(中)

在上一篇文章中,我们介绍作者如何分析MLB赛事,并找出影响比赛胜负较为重要的因子,而今天我们就来看看...

【左京淳的JAVA WEB学习笔记】第十章 重复代码的提取

Dao物件的提取 Dao类的物件用来访问DB,我们可以把其中常用的、重复性的代码抽取出来。 新建抽象...

大共享时代系列_016_共享餐桌

最近...有放下手边的事物,好好跟眼前的人吃顿饭吗? 你都跟谁一起吃饭? 跟家人? 跟朋友? 跟同学...

Day7 用HTML和CSS制作一个表格

在制作表格之前,要先来了解表格的HTML标签 表格必备HTML标签 要制作一个基本的表格,一定会使用...