From 702006d9efabd6469aecf86414e2246534dad391 Mon Sep 17 00:00:00 2001 From: Florian Festi Date: Sun, 12 Feb 2023 13:25:41 +0100 Subject: [PATCH] New generator: Tetris Tetris shapes --- boxes/generators/tetris.py | 91 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 boxes/generators/tetris.py diff --git a/boxes/generators/tetris.py b/boxes/generators/tetris.py new file mode 100644 index 0000000..5767c9d --- /dev/null +++ b/boxes/generators/tetris.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python3 +# Copyright (C) 2013-2016 Florian Festi +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from boxes import * + + +class Tetris(Boxes): + """3D Tetris shapes""" + + ui_group = "Misc" + + def __init__(self): + Boxes.__init__(self) + + self.addSettingsArgs(edges.FingerJointSettings) + + self.argparser.add_argument( + "--blocksize", action="store", type=float, default=40., + help="size of a square") + self.argparser.add_argument( + "--shape", action="store", type=str, default="L", + choices=['I', 'L', 'O', 'S', 'T'], + help="shape of the piece") + + def cb(self, nr): + t = self.thickness + s = self.blocksize + self.ctx.stroke() + self.set_source_color(Color.ETCHING) + + if nr == 0: + if self.shape in "LT": + for i in range(1, 3): + with self.saved_context(): + self.moveTo(s*i - t, 0, 90) + self.edge(s - 2*t) + if self.shape == "L": + self.moveTo(s*2, s - t, 0) + else: # "T" + self.moveTo(s, s - t, 0) + self.edge(s - 2*t) + if self.shape == "I": + for i in range(1, 4): + with self.saved_context(): + self.moveTo(s*i - t, 0, 90) + self.edge(s - 2*t) + if self.shape == "S" and nr in (0, 1, 4, 5): + self.moveTo(s - t, 0, 90) + self.edge(s - 2*t) + if self.shape == "O": + self.moveTo(s - t, 0, 90) + self.edge(s - t) + + + self.ctx.stroke() + + def render(self): + # adjust to the variables you want in the local scope + t = self.thickness + s = self.blocksize + + if self.shape == "L": + borders = [3*s - 2*t, 90, 2*s - 2*t, 90, s - 2*t, 90, + s, -90, 2*s, 90, s - 2*t, 90] + elif self.shape == "I": + borders = [4*s - 2*t, 90, s - 2*t, 90 ] * 2 + elif self.shape == "S": + borders = [2 * s - 2 * t, 90, s, -90, s, 90, s - 2 * t, 90] *2 + elif self.shape == "O": + borders = [2*s - 2*t, 90] * 4 + elif self.shape == "T": + borders = [90, s - 2*t, 90, s, -90, s, 90] + borders = [3*s - 2*t] + borders + [s - 2*t] + list(reversed(borders)) + self.polygonWall(borders=borders, callback=self.cb, move="right") + self.polygonWall(borders=borders, callback=self.cb, + move="mirror right") + + self.polygonWalls(borders=borders, h=s - 2 * t)