86 lines
3.9 KiB
Python
86 lines
3.9 KiB
Python
|
#! /usr/bin/env python3
|
||
|
|
||
|
import numpy as np
|
||
|
from math import pi, sin, cos
|
||
|
|
||
|
import inkex
|
||
|
|
||
|
from Path import Path
|
||
|
from Pattern import Pattern
|
||
|
|
||
|
class SupportRing(Pattern):
|
||
|
|
||
|
def __init__(self):
|
||
|
Pattern.__init__(self) # Must be called in order to parse common options
|
||
|
|
||
|
# save all custom parameters defined on .inx file
|
||
|
self.add_argument('--sides', type=int, default=3)
|
||
|
self.add_argument('--radius_external', type=float, default=10.0)
|
||
|
self.add_argument('--radius_ratio', type=float, default=0.5)
|
||
|
self.add_argument('--radius_type', default='polygonal')
|
||
|
self.add_argument('--radius_draw', type=inkex.Boolean, default=True)
|
||
|
self.add_argument('--connector_length', type=float, default=3.0)
|
||
|
self.add_argument('--connector_thickness', type=float, default=3.0)
|
||
|
self.add_argument('--head_length', type=float, default=1.0)
|
||
|
self.add_argument('--head_thickness', type=float, default=1.0)
|
||
|
self.add_argument('--pattern', default='support ring')
|
||
|
|
||
|
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
|
||
|
radius_external = self.options.radius_external * unit_factor
|
||
|
radius_type = self.options.radius_type
|
||
|
radius_ratio = self.options.radius_ratio
|
||
|
radius_internal = radius_external * radius_ratio
|
||
|
dradius = radius_external-radius_internal
|
||
|
sides = self.options.sides
|
||
|
connector_length = self.options.connector_length * unit_factor
|
||
|
connector_thickness = self.options.connector_thickness * unit_factor
|
||
|
head_length = self.options.head_length * unit_factor
|
||
|
head_thickness = self.options.head_thickness * unit_factor
|
||
|
|
||
|
angle = pi / sides
|
||
|
length_external = 2 * radius_external * sin(angle)
|
||
|
length_internal = length_external * radius_ratio
|
||
|
|
||
|
external_points = [(-length_external/2, 0),
|
||
|
(-connector_thickness / 2, 0),
|
||
|
(-connector_thickness / 2, -connector_length),
|
||
|
(-connector_thickness / 2 - head_thickness / 2, -connector_length),
|
||
|
(-connector_thickness / 2, -connector_length - head_length),
|
||
|
(0, -connector_length - head_length),
|
||
|
(+connector_thickness / 2, -connector_length - head_length),
|
||
|
(+connector_thickness / 2 + head_thickness / 2, -connector_length),
|
||
|
(+connector_thickness / 2, -connector_length),
|
||
|
(+connector_thickness / 2, 0),
|
||
|
(length_external/2, 0)]
|
||
|
internal_points = [(0, 0), (length_internal, 0)]
|
||
|
|
||
|
external_lines_0 = Path(external_points, 'm') + (length_external / 2, 0)
|
||
|
external_lines = [external_lines_0]
|
||
|
|
||
|
for i in range(sides-1):
|
||
|
x, y = external_lines[-1].points[-1]
|
||
|
external_lines.append(external_lines_0*(1, 2*(i+1)*angle) + (x, y))
|
||
|
|
||
|
self.path_tree = [external_lines]
|
||
|
|
||
|
if self.options.radius_draw == True:
|
||
|
if radius_type == 'polygonal':
|
||
|
internal_lines_0 = Path(internal_points, 'm')
|
||
|
internal_lines = [internal_lines_0]
|
||
|
for i in range(sides - 1):
|
||
|
x, y = internal_lines[-1].points[-1]
|
||
|
internal_lines.append(internal_lines_0*(1, 2*(i+1)*angle) + (x, y))
|
||
|
internal_lines = Path.list_add(internal_lines, ((length_external - length_internal) / 2, dradius * cos(angle)))
|
||
|
elif radius_type == 'circular':
|
||
|
internal_lines = Path((length_external / 2, radius_internal + dradius/2), radius=radius_internal, style = 'm')
|
||
|
|
||
|
self.path_tree.append(internal_lines)
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
SupportRing().run()
|