mightyscape-1.2/extensions/fablabchemnitz/origami_patterns/OrigamiPatterns/Boxes_Masu.py

99 lines
3.9 KiB
Python
Raw Normal View History

2022-11-14 23:27:13 +01:00
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import math
import numpy as np
from math import pi
import inkex
from Path import Path
from Pattern import Pattern
# Select name of class, inherits from Pattern
# TODO:
# 1) Implement __init__ method to get all custom options and then call Pattern's __init__
# 2) Implement generate_path_tree to define all of the desired strokes
def reflections_diag(path):
new_paths = [path]
new_paths = new_paths + Path.list_reflect(new_paths, (0, 0), (1, 1))
return new_paths + Path.list_reflect(new_paths, (0, 0), (1, -1))
def reflections_rect(path):
new_paths = [path]
new_paths = new_paths + Path.list_reflect(new_paths, (0, 0), (0, 1))
return new_paths + Path.list_reflect(new_paths, (0, 0), (1, 0))
def recenter(paths, dist):
# paths_new = Path.list_simplify(paths)
paths_new = Path.list_rotate(paths, pi/4)
return Path.list_add(paths_new, (dist, dist))
class MasuBox(Pattern):
def __init__(self):
""" Constructor
"""
Pattern.__init__(self) # Must be called in order to parse common options
# save all custom parameters defined on .inx file
self.add_argument('--pattern', type=self.str, default='boxes_masu')
self.add_argument('--width', type=self.float, default=10.0)
self.add_argument('--height', type=self.float, default=10.0)
self.add_argument('--width_delta', type=self.float, default=0.0)
self.add_argument('--width_delta_bool', type=self.bool, default=False)
def generate_path_tree(self):
""" Specialized path generation for your origami pattern
"""
# retrieve conversion factor for selected unit
unit_factor = self.calc_unit_factor()
# retrieve saved parameters, and apply unit factor where needed
width = self.options.width * unit_factor
height = self.options.height * unit_factor
if self.options.width_delta_bool:
width_delta = self.options.width_delta * unit_factor
width += width_delta
height -= width_delta/2
length = math.sqrt(2)*(width + 2*height)
half_fold = 90 if self.options.simulation_mode else 180
# bottom of box
ring_inner = Path.generate_square(width, width, center = [0,0], style = 'm', fold_angle=half_fold)
# ring making the corners
lengths = [height, width, height]
points = Path.get_square_points(sum(lengths), sum(lengths), [0,0])
styles = ['vmv','mmm']
ring_middle = [Path([points[i], points[(i + 1)%4]], 'm').
break_path(lengths, styles[i % 2]) for i in range(4)]
# arms along width and length
points = [(-width / 2, -(width / 2 + 0 * height)),
(-width / 2, -(width / 2 + 1 * height)),
(-width / 2, -(width / 2 + 2 * height)),
(+width / 2, -(width / 2 + 2 * height)),
(+width / 2, -(width / 2 + 1 * height)),
(+width / 2, -(width / 2 + 0 * height))]
arms_ = [Path.list_create_from_points(points, 'mmvmm', fold_angles = [180, 180, half_fold, 180, 180]),
Path.list_create_from_points(points, 'mvvvm', half_fold)]
arms = [Path.list_rotate(arms_[i % 2], i * pi / 2) for i in range(4)]
# tiny corner diagonals
diag = Path([(width/2, width/2), (width/2 + height, width/2 + height)], 'v')
corner_diagonals = [diag * (1, i*pi/2) for i in range(4)]
self.edge_points = Path.get_square_points(length, length)
self.path_tree = [ring_inner, ring_middle, arms, corner_diagonals]
self.path_tree = recenter(self.path_tree, length/2)
# Main function, creates an instance of the Class and calls self.draw() to draw the origami on inkscape
# self.draw() is either a call to inkex.affect() or to svg.run(), depending on python version
if __name__ == '__main__':
e = MasuBox() # remember to put the name of your Class here!
e.draw()