#!/usr/bin/env python3 import math import hazwaz import svgwrite # 1 cm in px cm = 37.795276 LINE_STYLE = { 'stroke': svgwrite.utils.rgb(0, 0, 0), 'stroke_width': 0.5, 'fill': 'none' } FOLD_LINE_STYLE = { 'stroke': svgwrite.utils.rgb(0, 0, 0), 'stroke_width': 0.5, 'fill': 'none', 'stroke-dasharray': "5,5", } class Fan(hazwaz.MainCommand): """ Draw a fan cover """ def add_arguments(self, parser): parser.add_argument( "-o", "--outer_radius", type=float, default=25.0, help="Outer radius of the fan sticks (cm)", ) parser.add_argument( "-i", "--inner_radius", type=float, default=10.0, help="Outer radius of the fan sticks (cm)", ) parser.add_argument( "-w", "--folded_width", type=float, default=2.0, help="Width of the outer sticks (and folded fan) at the top", ) parser.add_argument( "-s", "--sticks", type=int, default=12, help="Number of sticks (excluding the outer ones)." ) def main(self): self.sections = self.args.sticks * 2 + 3 self.alpha = self.args.folded_width / self.args.outer_radius self.angle = self.alpha * self.sections size = str(self.args.outer_radius * 2 + 2) + "cm" dest = dest = svgwrite.Drawing( filename="fan.svg", size=(size, size), profile="full", ) fan = self.draw_fan(dest) dest.save() def draw_fan(self, dest): c = (self.args.outer_radius + 1 )* cm a = self.alpha r_o = self.args.outer_radius r_i = self.args.inner_radius grp = dest.g() grp.add(dest.circle( center=(c, c), r=r_o * cm, ** LINE_STYLE )) grp.add(dest.circle( center=(c, c), r=r_i * cm, ** LINE_STYLE )) grp.add(dest.line( start=(c + r_i * cm, c), end=(c + r_o * cm, c), ** LINE_STYLE )) for i in range(1, self.sections): grp.add(dest.line( start=( c + (math.cos(a * - i) * r_i) * cm, c + (math.sin(a * - i) * r_i) * cm ), end=( c + (math.cos(a * - i) * r_o) * cm, c + (math.sin(a * - i) * r_o) * cm ), ** FOLD_LINE_STYLE )) grp.add(dest.line( start=( c + (math.cos(a * - self.sections) * r_i) * cm, c + (math.sin(a * - self.sections) * r_i) * cm ), end=( c + (math.cos(a * - self.sections) * r_o) * cm, c + (math.sin(a * - self.sections) * r_o) * cm ), ** LINE_STYLE )) dest.add(grp) if __name__ == "__main__": Fan().run()