99 lines
3.9 KiB
Python
99 lines
3.9 KiB
Python
|
#! /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()
|