Source code for mathmaker.lib.tools.generators.shapes

# -*- coding: utf-8 -*-

# Mathmaker creates automatically maths exercises sheets
# with their answers
# Copyright 2006-2017 Nicolas Hainaux <nh.techn@gmail.com>

# This file is part of Mathmaker.

# Mathmaker 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
# any later version.

# Mathmaker 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 Mathmaker; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

import random

from mathmakerlib.calculus import Number
from mathmakerlib.geometry import Point, AngleDecoration, Polygon, Triangle
from mathmakerlib.geometry import IsoscelesTriangle, EquilateralTriangle
from mathmakerlib.geometry import RightTriangle
from mathmakerlib.geometry import Quadrilateral, Rectangle, Rhombus, Square

from mathmaker.lib import shared
from mathmaker.lib.tools.generators import Generator


[docs]class ShapeGenerator(Generator):
[docs] def generate(self, codename=None, variant=None, labels=None, name=None, **kwargs): """ :param codename: a str describing the type of polygon and the sides lengths, grouped by equal sides batches, like triangle_1_1_1, pentagon_3_2 etc. :type codename: str :param variant: the variant number :type variant: int :param labels: the labels to set, in the form of a list of couples (nb_of_sides, length). This list will be checked at start. :type labels: list (of couples) :param name: the name of the Polygon :type name: str (or None, then it will be set automatically) :param label_vertices: whether or not label the Polygon's vertices :type label_vertices: bool :param thickness: the thickness of the Polygon's sides :type thickness: any correct thickness value (None, or see tikz possible values) :param length_unit: the length unit of the sides labels :type length_unit: None or correct str unit name, or a mathmakerlib.calculus.Unit instance """ label_vertices = kwargs.get('label_vertices', None) if not isinstance(label_vertices, bool): raise TypeError('keyword argument label_vertices must be set to ' 'True or False') thickness = kwargs.get('thickness', None) length_unit = kwargs.get('length_unit', None) wlines_nb = kwargs.get('wlines_nb', 0) self.check_args(codename_prefix=codename.split('_')[0] + '_', distcode='_'.join(codename.split('_')[1:]), variant=variant, labels=labels, name=name) return getattr(self, '_' + codename)(variant=variant, labels=labels, name=name, label_vertices=label_vertices, thickness=thickness, length_unit=length_unit, wlines_nb=wlines_nb)
def _polygon(self, shapes_source, shape_variants, shape_builder, labels, masks=None, marks=None, length_unit=None, name=None, shape_variant_nb=None, label_vertices=None, thickness=None, rt_extra_info=None, wlines_nb=0): if shape_variant_nb is None: shape_variant_nb = next(shapes_source)[0] if rt_extra_info is not None and shape_variant_nb in rt_extra_info: labels[0], labels[1] = labels[1], labels[0] build_data = shape_variants[shape_variant_nb] build_data.update({'name': name, 'label_vertices': label_vertices, 'thickness': thickness, 'sloped_sides_labels': False}) baseline = build_data.pop('baseline', None) if isinstance(baseline, dict): baseline = baseline[wlines_nb] boundingbox = build_data.pop('boundingbox', None) if masks is None: masks = build_data.pop('masks', None) elif 'masks' in build_data: del build_data['masks'] args = build_data.pop('args', []) right_angle_radius = build_data.pop('right_angle_radius', None) polygon = shape_builder(*args, **build_data) polygon.setup_labels([Number(lbl, unit=length_unit) for lbl in labels], masks=masks) polygon.baseline = baseline polygon.boundingbox = boundingbox polygon.setup_marks(marks) if right_angle_radius is not None: for a in polygon.angles: if isinstance(a.decoration, AngleDecoration) and a.mark_right: u = None if a.decoration.radius is not None: u = a.decoration.radius.unit a.decoration.radius = Number(right_angle_radius, unit=u) return polygon def _triangle_1_1_1(self, variant=None, labels=None, name=None, label_vertices=None, thickness=None, length_unit=None, shape_variant_nb=None, wlines_nb=0): if variant not in [0, 1]: raise ValueError('variant must be 0 or 1 (not \'{}\')' .format(variant)) if variant == 0: # scalene triangle shapes shape_variants = {1: {'args': [Point(0, 0), Point(2, 0), Point(Number('0.582'), Number('0.924'))], 'baseline': '6pt'}, 2: {'args': [Point(0, 0), Point(2, 0), Point(Number('1.418'), Number('0.924'))], 'baseline': '6pt'}, 3: {'args': [Point(2, Number('0.924')), Point(0, Number('0.924')), Point(Number('1.418'), 0)], 'baseline': '13pt'}, 4: {'args': [Point(2, Number('0.924')), Point(0, Number('0.924')), Point(Number('0.582'), 0)], 'baseline': '13pt'} } shapes_source = shared.scalene_triangle_shapes_source shape_builder = Triangle elif variant == 1: # right triangle shapes shape_variants = {1: {'start_vertex': Point(0, 0), 'leg1_length': 2, 'leg2_length': 1, 'baseline': {0: '8pt', 1: '8pt', 2: '6pt'}}, 2: {'start_vertex': Point(2, 0), 'leg1_length': 1, 'leg2_length': 2, 'rotation_angle': 90, 'baseline': {0: '17pt', 1: '17pt', 2: '23pt'}}, 3: {'start_vertex': Point(2, 1), 'leg1_length': 2, 'leg2_length': 1, 'rotation_angle': 180, 'baseline': {0: '17pt', 1: '36pt', 2: '40pt'}}, 4: {'start_vertex': Point(0, 1), 'leg1_length': 1, 'leg2_length': 2, 'rotation_angle': -90, 'baseline': {0: '8pt', 1: '42pt', 2: '48pt'}}, 5: {'start_vertex': Point('2.236', 0), 'leg1_length': 2, 'leg2_length': 1, 'rotation_angle': Number('153.4'), 'baseline': {0: '8pt', 1: '6pt', 2: '10pt'}}, 6: {'start_vertex': Point('2.236', 0), 'leg1_length': 1, 'leg2_length': 2, 'rotation_angle': Number('116.6'), 'baseline': {0: '8pt', 1: '14pt', 2: '17pt'}}, 7: {'start_vertex': Point(0, '0.981'), 'leg1_length': 1, 'leg2_length': 2, 'rotation_angle': Number('-63.4'), 'baseline': {0: '17pt', 1: '44pt', 2: '52pt'}}, 8: {'start_vertex': Point(0, '0.981'), 'leg1_length': 2, 'leg2_length': 1, 'rotation_angle': Number('-26.6'), 'baseline': {0: '17pt', 1: '36pt', 2: '44pt'}} } shapes_source = shared.right_triangle_shapes_source shape_builder = RightTriangle lbls = [labels[i][1] for i in range(len(labels))] rt_extra_info = None if variant == 1: lbls = sorted(lbls) rt_extra_info = [1, 3, 5, 8] return self._polygon( shapes_source, shape_variants, shape_builder, labels=lbls, name=name, label_vertices=label_vertices, thickness=thickness, length_unit=length_unit, shape_variant_nb=shape_variant_nb, rt_extra_info=rt_extra_info, wlines_nb=wlines_nb ) def _triangle_2_1(self, variant=None, labels=None, name=None, label_vertices=None, thickness=None, length_unit=None, shape_variant_nb=None, wlines_nb=0): mark = next(shared.ls_marks_source)[0] shape_variants = {1: {'base_length': Number('2.8'), 'equal_legs_length': Number('1.52'), 'rotation_angle': 0, 'use_mark': mark, 'baseline': '4pt'}, 2: {'base_length': Number('2.8'), 'equal_legs_length': Number('1.52'), 'rotation_angle': 180, 'use_mark': mark, 'baseline': '2pt'}, 3: {'base_length': Number('0.8'), 'equal_legs_length': Number('2.4'), 'rotation_angle': 90, 'use_mark': mark, 'baseline': '15pt'}, 4: {'base_length': Number('0.8'), 'equal_legs_length': Number('2.4'), 'rotation_angle': -90, 'use_mark': mark, 'baseline': '23pt'}, 5: {'base_length': Number('0.8'), 'equal_legs_length': Number('2.4'), 'rotation_angle': Number('-99.6'), 'use_mark': mark, 'baseline': '25pt'}, 6: {'base_length': Number('0.8'), 'equal_legs_length': Number('2.4'), 'rotation_angle': Number('-80.4'), 'use_mark': mark, 'baseline': '18pt'}, 7: {'base_length': Number('0.8'), 'equal_legs_length': Number('2.4'), 'rotation_angle': Number('99.6'), 'use_mark': mark, 'baseline': '18pt'}, 8: {'base_length': Number('0.8'), 'equal_legs_length': Number('2.4'), 'rotation_angle': Number('80.4'), 'use_mark': mark, 'baseline': '15pt'} } baselbl, eqlbl = labels[0][1], labels[1][1] if labels[0][0] == 2: baselbl, eqlbl = eqlbl, baselbl return self._polygon( shared.triangle_2_1_shapes_source, shape_variants, IsoscelesTriangle, labels=[baselbl, eqlbl], name=name, label_vertices=label_vertices, thickness=thickness, length_unit=length_unit, shape_variant_nb=shape_variant_nb, wlines_nb=wlines_nb ) def _triangle_3(self, variant=None, labels=None, name=None, label_vertices=None, thickness=None, length_unit=None, shape_variant_nb=None, wlines_nb=0): mark = next(shared.ls_marks_source)[0] shape_variants = {1: {'side_length': Number('1.1'), 'rotation_angle': 0, 'use_mark': mark, 'baseline': '12pt'}, 2: {'side_length': Number('1.1'), 'rotation_angle': 60, 'use_mark': mark, 'baseline': '0pt'}, 3: {'side_length': Number('1.1'), 'rotation_angle': Number('29.9'), 'use_mark': mark, 'baseline': '6pt'}, 4: {'side_length': Number('1.1'), 'rotation_angle': 90, 'use_mark': mark, 'baseline': '0pt', 'boundingbox': ('-0.2', '-0.24', '0.97', '0.97')} } return self._polygon( shared.triangle_3_shapes_source, shape_variants, EquilateralTriangle, labels=[labels[0][1]], name=name, label_vertices=label_vertices, thickness=thickness, length_unit=length_unit, shape_variant_nb=shape_variant_nb, wlines_nb=wlines_nb ) def _quadrilateral_1_1_1_1(self, variant=None, labels=None, name=None, label_vertices=None, thickness=None, length_unit=None, shape_variant_nb=None, wlines_nb=0): quadrilateral_shape1 = [Point(0, 0), Point('0.6', '-0.3'), Point('1.6', '0.2'), Point('0.4', 1)] quadrilateral_shape2 = [Point(0, 0), Point(1, '-0.2'), Point('1.2', '0.9'), Point('-0.2', '0.8')] shape_variants = { 1: {'args': quadrilateral_shape1, 'rotation_angle': 0, 'baseline': '4pt', # 'boundingbox': None, # 'use_mark': next(shared.ls_marks_source)[0] }, 2: {'args': quadrilateral_shape1, 'rotation_angle': 90, 'baseline': '4pt' }, 3: {'args': quadrilateral_shape1, 'rotation_angle': -90, 'baseline': '4pt' }, 4: {'args': quadrilateral_shape1, 'rotation_angle': 180, 'baseline': '4pt' }, 5: {'args': quadrilateral_shape2, 'rotation_angle': 0, 'baseline': '9pt' }, 6: {'args': quadrilateral_shape2, 'rotation_angle': 180, 'baseline': '9pt' } } return self._polygon( shared.quadrilateral_1_1_1_1_shapes_source, shape_variants, Quadrilateral, labels=[lbl[1] for lbl in labels], name=name, label_vertices=label_vertices, thickness=thickness, length_unit=length_unit, shape_variant_nb=shape_variant_nb, wlines_nb=wlines_nb ) def _quadrilateral_2_1_1(self, variant=None, labels=None, name=None, label_vertices=None, thickness=None, length_unit=None, shape_variant_nb=None, wlines_nb=0): if variant not in [0, 1]: raise ValueError('variant must be 0 or 1 (not \'{}\')' .format(variant)) quadrilateralv0_shape1 = [Point(0, 0), Point('1.2', '0.7'), Point('2.4', 0), Point('0.8', '-0.4')] quadrilateralv0_shape2 = [Point('1.2', '-0.6'), Point(0, 0), Point('1.2', '0.5'), Point('2.4', '0.2')] quadrilateralv1_shape1 = [Point(0, 0), Point('0.8', '0.6'), Point('1.8', '0.6'), Point('1.2', '-0.2')] quadrilateralv1_shape2 = [Point('0.2', '-0.4'), Point(0, '0.6'), Point('1.2', '0.6'), Point('2.2', '0.4')] mark = next(shared.ls_marks_source)[0] if variant == 0: shape_variants = { 1: {'args': quadrilateralv0_shape1, 'rotation_angle': 0, 'baseline': '-1pt'}, 2: {'args': quadrilateralv0_shape1, 'rotation_angle': 180, 'baseline': '-1pt'}, 3: {'args': quadrilateralv0_shape2, 'rotation_angle': 0, 'baseline': '-3pt'}, 4: {'args': quadrilateralv0_shape2, 'rotation_angle': 180, 'baseline': '-3pt'} } elif variant == 1: shape_variants = { 1: {'args': quadrilateralv1_shape1, 'rotation_angle': 0, 'baseline': '4pt'}, 2: {'args': quadrilateralv1_shape1, 'rotation_angle': 180, 'baseline': '5pt'}, 3: {'args': quadrilateralv1_shape2, 'rotation_angle': 0, 'baseline': '3pt'}, 4: {'args': quadrilateralv1_shape2, 'rotation_angle': 180, 'baseline': '8pt'}, } singles = [] doubled = [] for lbl in labels: if lbl[0] == 1: singles.append(lbl[1]) else: doubled.append(lbl[1]) doubled.append(lbl[1]) random.shuffle(singles) if variant == 0: lbls = [doubled.pop(), doubled.pop(), singles.pop(), singles.pop()] masks = [None, ' ', None, None] marks = [mark, mark, None, None] elif variant == 1: lbls = [doubled.pop(), singles.pop(), doubled.pop(), singles.pop()] masks = [None, None, ' ', None] marks = [mark, None, mark, None] return self._polygon( shared.quadrilateral_2_1_1_shapes_source, shape_variants, Quadrilateral, labels=lbls, name=name, label_vertices=label_vertices, thickness=thickness, length_unit=length_unit, masks=masks, marks=marks, shape_variant_nb=shape_variant_nb, wlines_nb=wlines_nb ) def _quadrilateral_2_2(self, variant=None, labels=None, name=None, label_vertices=None, thickness=None, length_unit=None, shape_variant_nb=None, wlines_nb=0): if variant not in [0, 1, 2]: raise ValueError('variant must be 0, 1 or 2 (not \'{}\')' .format(variant)) shape_builder = Quadrilateral kite_shape1 = [Point(0, 0), Point('1.2', '0.2'), Point('2.4', 0), Point('1.2', '-0.8')] kite_shape2 = [Point('0.7', '-0.5'), Point(0, 0), Point('0.7', '0.5'), Point('2.4', 0)] parallelogram_shape1 = [Point(0, 0), Point('0.6', '0.8'), Point('2.6', '0.8'), Point(2, 0)] parallelogram_shape2 = [Point(0, 0), Point('-0.6', '0.8'), Point('1.4', '0.8'), Point(2, 0)] parallelogram_shape3 = [Point(0, 0), Point('0.2', '0.65'), Point('2.1', '0.8'), Point('1.9', '0.15')] parallelogram_shape4 = [Point(0, '0.8'), Point('1.9', '0.65'), Point('2.1', 0), Point('0.2', '0.15')] mark1 = next(shared.ls_marks_source)[0] mark2 = next(shared.ls_marks_source)[0] lbls = masks = marks = None masks_disposition = next(shared.alternate_2masks_source)[0] if variant == 0: # kites shape_variants = { 1: {'args': kite_shape1, 'rotation_angle': 0, 'baseline': '-9pt'}, 2: {'args': kite_shape1, 'rotation_angle': 180, 'baseline': '-5pt'}, 3: {'args': kite_shape2, 'rotation_angle': 0, 'baseline': '-4pt', 'boundingbox': (0, '-0.5', '2.4', '0.7')}, 4: {'args': kite_shape2, 'rotation_angle': 180, 'baseline': '0pt', 'boundingbox': (0, '-0.7', '2.4', '0.5')} } lbls = [labels[0][1], labels[0][1], labels[1][1], labels[1][1]] masks = {'left': [None, ' ', None, ' '], 'right': [None, ' ', ' ', None]}[masks_disposition] marks = [mark1, mark1, mark2, mark2] elif variant == 1: # parallelograms shape_variants = { 1: {'args': parallelogram_shape1, 'rotation_angle': 0, 'baseline': {'left': '12pt', 'right': '3pt'}[masks_disposition]}, 2: {'args': parallelogram_shape2, 'rotation_angle': 0, 'baseline': {'left': '10pt', 'right': '5pt'}[masks_disposition]}, 3: {'args': parallelogram_shape3, 'rotation_angle': 0, 'baseline': {'left': '12pt', 'right': '4pt'}[masks_disposition]}, 4: {'args': parallelogram_shape4, 'rotation_angle': 0, 'baseline': {'left': '12pt', 'right': '4pt'}[masks_disposition]}, } shortest = min(labels[0][1], labels[1][1]) longest = max(labels[0][1], labels[1][1]) lbls = [shortest, longest, shortest, longest] marks = [mark1, mark2, mark1, mark2] elif variant == 2: # rectangles shape_builder = Rectangle shape_variants = { 1: {'width': Number('0.5'), 'length': Number('2.6'), 'rotation_angle': 0, 'right_angle_radius': Number('0.15'), 'baseline': {'left': '8pt', 'right': '1pt'}[masks_disposition]}, 2: {'width': Number('0.7'), 'length': 2, 'rotation_angle': 0, 'right_angle_radius': Number('0.15'), 'baseline': {'left': '8pt', 'right': '1pt'}[masks_disposition]}, 3: {'width': Number('0.6'), 'length': Number('2.4'), 'rotation_angle': 0, 'right_angle_radius': Number('0.15'), 'baseline': {'left': '9pt', 'right': '2pt'}[masks_disposition]}, 4: {'width': Number('0.8'), 'length': Number('1.6'), 'rotation_angle': 0, 'right_angle_radius': Number('0.15'), 'baseline': {'left': '8pt', 'right': '1pt'}[masks_disposition], 'boundingbox': (0, '-0.2', '1.6', 1)}, } shortest = min(labels[0][1], labels[1][1]) longest = max(labels[0][1], labels[1][1]) lbls = [longest, shortest, longest, shortest] if variant in [1, 2]: # common masking for rectangles and parallelogram masks = {'left': [None, None, ' ', ' '], 'right': [' ', ' ', None, None]}[masks_disposition] return self._polygon( shared.quadrilateral_2_2_shapes_source, shape_variants, shape_builder, labels=lbls, name=name, label_vertices=label_vertices, thickness=thickness, length_unit=length_unit, masks=masks, marks=marks, shape_variant_nb=shape_variant_nb, wlines_nb=wlines_nb ) def _quadrilateral_3_1(self, variant=None, labels=None, name=None, label_vertices=None, thickness=None, length_unit=None, shape_variant_nb=None, wlines_nb=0): shape1 = [Point(0, 0), Point('0.46', '0.8'), Point('1.38', '0.8'), Point('1.84', 0)] shape2 = [Point('0.02', '0.5'), Point('0.9', '0.7'), Point('0.9', '-0.2'), Point('0.02', 0)] mark = next(shared.ls_marks_source)[0] masks_disposition = next(shared.alternate_3masks_source)[0] shape_variants = { 1: {'args': shape1, 'rotation_angle': 0, 'baseline': {1: '5pt', 2: '8pt', 3: '6pt'}[masks_disposition]}, 2: {'args': shape1, 'rotation_angle': 180, 'baseline': {1: '10pt', 2: '8pt', 3: '11pt'}[masks_disposition]}, 3: {'args': shape2, 'rotation_angle': 0, 'baseline': {1: '10pt', 2: '5pt', 3: '-1pt'}[masks_disposition], 'boundingbox': (0, '-0.3', '0.9', '0.9')}, 4: {'args': shape2, 'rotation_angle': 180, 'baseline': {1: '-1pt', 2: '5pt', 3: '10pt'}[masks_disposition], 'boundingbox': (0, '-0.3', '0.9', '0.9')}, } lbls = [labels[1][1], labels[1][1], labels[1][1], labels[0][1]] masks = {1: [None, ' ', ' ', None], 2: [' ', None, ' ', None], 3: [' ', ' ', None, None]}[masks_disposition] marks = [mark, mark, mark, None] return self._polygon( shared.quadrilateral_3_1_shapes_source, shape_variants, Quadrilateral, labels=lbls, name=name, label_vertices=label_vertices, thickness=thickness, length_unit=length_unit, masks=masks, marks=marks, shape_variant_nb=shape_variant_nb, wlines_nb=wlines_nb ) def _quadrilateral_4(self, variant=None, labels=None, name=None, label_vertices=None, thickness=None, length_unit=None, shape_variant_nb=None, wlines_nb=0): if variant not in [0, 1]: raise ValueError('variant must be 0 or 1 (not \'{}\')' .format(variant)) mark = next(shared.ls_marks_source)[0] masks_disposition = next(shared.alternate_4masks_source)[0] if variant == 0: # rhombuses shape_builder = Rhombus shape_variants = { 1: {'side_length': Number('1.2'), 'build_angle': 45, 'rotation_angle': 0, 'use_mark': mark, # 1: above right, 2: bottom right, # 3: bottom left, 4: above left 'baseline': {1: '0pt', 2: '-6pt', 3: '-6pt', 4: '0pt'} [masks_disposition], 'boundingbox': (0, '-0.65', '2.3', '0.65')}, } elif variant == 1: # squares shape_builder = Square shape_variants = { 1: {'side_length': 1, 'rotation_angle': 0, 'use_mark': mark, 'right_angle_radius': Number('0.15'), # 1: above, 2: right, 3: below, 4: left 'baseline': {1: '16pt', 2: '12pt', 3: '7pt', 4: '12pt'} [masks_disposition]}, } lbls = [labels[0][1]] masks = {1: [None, ' ', ' ', ' '], 2: [' ', None, ' ', ' '], 3: [' ', ' ', None, ' '], 4: [' ', ' ', ' ', None]}[masks_disposition] return self._polygon( shared.quadrilateral_4_shapes_source, shape_variants, shape_builder, labels=lbls, name=name, label_vertices=label_vertices, thickness=thickness, length_unit=length_unit, masks=masks, shape_variant_nb=shape_variant_nb, wlines_nb=wlines_nb ) def _pentagon_1_1_1_1_1(self, variant=None, labels=None, name=None, label_vertices=None, thickness=None, length_unit=None, shape_variant_nb=None, wlines_nb=0): pentagon_shape1 = [Point('0.6', 0), Point(0, '0.4'), Point('1.2', '0.8'), Point('2.4', '0.4'), Point('1.8', 0)] shape_variants = { 1: {'args': pentagon_shape1, 'rotation_angle': 0, 'baseline': '8pt', # 'boundingbox': None, # 'use_mark': next(shared.ls_marks_source)[0] }, 2: {'args': pentagon_shape1, 'rotation_angle': 180, 'baseline': '6pt', # 'boundingbox': None, # 'use_mark': next(shared.ls_marks_source)[0] }, } return self._polygon( shared.pentagon_1_1_1_1_1_shapes_source, shape_variants, Polygon, labels=[lbl[1] for lbl in labels], name=name, label_vertices=label_vertices, thickness=thickness, length_unit=length_unit, shape_variant_nb=shape_variant_nb, wlines_nb=wlines_nb ) def _pentagon_2_1_1_1(self, variant=None, labels=None, name=None, label_vertices=None, thickness=None, length_unit=None, shape_variant_nb=None, wlines_nb=0): if variant not in [0, 1]: raise ValueError('variant must be 0 or 1 (not \'{}\')' .format(variant)) pentagonv0_shape1 = [Point('1.05', '-0.2'), Point('0.3', '-0.1'), Point(0, '0.6'), Point('1.4', '0.6'), Point('2.4', '0.1')] pentagonv1_shape1 = [Point('0.2', 0), Point(0, '0.57'), Point('1.2', '0.8'), Point('1.95', '0.4'), Point('1.5', 0)] mark = next(shared.ls_marks_source)[0] if variant == 0: shape_variants = { 1: {'args': pentagonv0_shape1, 'rotation_angle': 0, 'baseline': '3pt'}, 2: {'args': pentagonv0_shape1, 'rotation_angle': 180, 'baseline': '3pt'}, } elif variant == 1: shape_variants = { 1: {'args': pentagonv1_shape1, 'rotation_angle': 0, 'baseline': '9pt'}, 2: {'args': pentagonv1_shape1, 'rotation_angle': 180, 'baseline': '6pt'}, } singles = [] doubled = [] for lbl in labels: if lbl[0] == 1: singles.append(lbl[1]) else: doubled.append(lbl[1]) doubled.append(lbl[1]) random.shuffle(singles) if variant == 0: lbls = [doubled.pop(), doubled.pop(), singles.pop(), singles.pop(), singles.pop()] masks = [None, ' ', None, None, None] marks = [mark, mark, None, None, None] elif variant == 1: lbls = [doubled.pop(), singles.pop(), singles.pop(), doubled.pop(), singles.pop()] masks = [None, None, None, ' ', None] marks = [mark, None, None, mark, None] return self._polygon( shared.pentagon_2_1_1_1_shapes_source, shape_variants, Polygon, labels=lbls, name=name, label_vertices=label_vertices, thickness=thickness, length_unit=length_unit, masks=masks, marks=marks, shape_variant_nb=shape_variant_nb, wlines_nb=wlines_nb ) def _pentagon_2_2_1(self, variant=None, labels=None, name=None, label_vertices=None, thickness=None, length_unit=None, shape_variant_nb=None, wlines_nb=0): if variant not in [0, 1, 2]: raise ValueError('variant must be 0, 1 or 2 (not \'{}\')' .format(variant)) pentagonv0_shape1 = [Point(1, 0), Point('0.08', '0.4'), Point('0.77', '0.8'), Point('1.57', '0.7'), Point(2, '0.1')] pentagonv1_shape1 = [Point('0.5', 0), Point(0, '0.33'), Point('0.88', '0.8'), Point('1.86', '0.59'), Point('1.73', 0)] pentagonv2_shape1 = [Point('0.71', '-0.1'), Point(0, '0.46'), Point('0.76', '0.7'), Point('1.64', '0.5'), Point('1.5', 0)] mark1 = next(shared.ls_marks_source)[0] mark2 = next(shared.ls_marks_source)[0] if variant == 0: shape_variants = { 1: {'args': pentagonv0_shape1, 'rotation_angle': 0, 'baseline': '8pt'}, 2: {'args': pentagonv0_shape1, 'rotation_angle': 180, 'baseline': '8pt'}, } elif variant == 1: shape_variants = { 1: {'args': pentagonv1_shape1, 'rotation_angle': 0, 'baseline': '7pt'}, 2: {'args': pentagonv1_shape1, 'rotation_angle': 180, 'baseline': '7pt'}, } elif variant == 2: shape_variants = { 1: {'args': pentagonv2_shape1, 'rotation_angle': 0, 'baseline': '6pt'}, 2: {'args': pentagonv2_shape1, 'rotation_angle': 180, 'baseline': '6pt'}, } singles = [] doubled1 = [] doubled2 = [] for lbl in labels: if lbl[0] == 1: singles.append(lbl[1]) else: if not doubled1: doubled1.append(lbl[1]) doubled1.append(lbl[1]) else: doubled2.append(lbl[1]) doubled2.append(lbl[1]) random.shuffle(singles) if variant == 0: lbls = [doubled1.pop(), doubled1.pop(), doubled2.pop(), doubled2.pop(), singles.pop()] masks = [None, ' ', None, ' ', None] marks = [mark1, mark1, mark2, mark2, None] elif variant == 1: lbls = [doubled1.pop(), doubled2.pop(), doubled2.pop(), doubled1.pop(), singles.pop()] masks = [None, None, ' ', ' ', None] marks = [mark1, mark2, mark2, mark1, None] elif variant == 2: lbls = [doubled1.pop(), doubled2.pop(), doubled1.pop(), doubled2.pop(), singles.pop()] masks = [None, None, ' ', ' ', None] marks = [mark1, mark2, mark1, mark2, None] return self._polygon( shared.pentagon_2_2_1_shapes_source, shape_variants, Polygon, labels=lbls, name=name, label_vertices=label_vertices, thickness=thickness, length_unit=length_unit, masks=masks, marks=marks, shape_variant_nb=shape_variant_nb, wlines_nb=wlines_nb ) def _pentagon_3_1_1(self, variant=None, labels=None, name=None, label_vertices=None, thickness=None, length_unit=None, shape_variant_nb=None, wlines_nb=0): if variant not in [0, 1]: raise ValueError('variant must be 0 or 1 (not \'{}\')' .format(variant)) pentagonv0_shape1 = [Point(0, '0.3'), Point('0.62', '0.8'), Point('1.42', '0.8'), Point('1.81', '0.1'), Point('0.7', 0)] pentagonv1_shape1 = [Point('0.3', '0.6'), Point('1.28', '0.8'), Point('2.26', '0.6'), Point('1.4', 0), Point('0.4', 0)] mark = next(shared.ls_marks_source)[0] if variant == 0: shape_variants = { 1: {'args': pentagonv0_shape1, 'rotation_angle': 0, 'baseline': '8pt'}, 2: {'args': pentagonv0_shape1, 'rotation_angle': 180, 'baseline': '9pt'}, } elif variant == 1: shape_variants = { 1: {'args': pentagonv1_shape1, 'rotation_angle': 0, 'baseline': '9pt'}, 2: {'args': pentagonv1_shape1, 'rotation_angle': 180, 'baseline': '7pt'}, } singles = [] tripled = [] for lbl in labels: if lbl[0] == 1: singles.append(lbl[1]) else: tripled.append(lbl[1]) tripled.append(lbl[1]) tripled.append(lbl[1]) random.shuffle(singles) if variant == 0: lbls = [tripled.pop(), tripled.pop(), tripled.pop(), singles.pop(), singles.pop()] masks = [None, ' ', ' ', None, None] marks = [mark, mark, mark, None, None] elif variant == 1: lbls = [tripled.pop(), tripled.pop(), singles.pop(), tripled.pop(), singles.pop()] masks = [None, ' ', None, ' ', None] marks = [mark, mark, None, mark, None] return self._polygon( shared.pentagon_3_1_1_shapes_source, shape_variants, Polygon, labels=lbls, name=name, label_vertices=label_vertices, thickness=thickness, length_unit=length_unit, masks=masks, marks=marks, shape_variant_nb=shape_variant_nb, wlines_nb=wlines_nb ) def _pentagon_3_2(self, variant=None, labels=None, name=None, label_vertices=None, thickness=None, length_unit=None, shape_variant_nb=None, wlines_nb=0): if variant not in [0, 1]: raise ValueError('variant must be 0 or 1 (not \'{}\')' .format(variant)) pentagonv0_shape1 = [Point(0, 0), Point('0.33', '0.73'), Point('1.12', '0.8'), Point('1.86', '0.5'), Point(1, 0)] pentagonv1_shape1 = [Point(0, 0), Point('0.33', '0.73'), Point('1.12', '0.8'), Point('1.86', '0.5'), Point(1, 0)] mark1 = next(shared.ls_marks_source)[0] mark2 = next(shared.ls_marks_source)[0] if variant == 0: shape_variants = { 1: {'args': pentagonv0_shape1, 'rotation_angle': 0, 'baseline': '6pt'}, 2: {'args': pentagonv0_shape1, 'rotation_angle': 180, 'baseline': '12pt'}, } elif variant == 1: shape_variants = { 1: {'args': pentagonv1_shape1, 'rotation_angle': 0, 'baseline': '13pt'}, 2: {'args': pentagonv1_shape1, 'rotation_angle': 180, 'baseline': '4pt'}, } doubled = [] tripled = [] for lbl in labels: if lbl[0] == 2: doubled.append(lbl[1]) doubled.append(lbl[1]) else: tripled.append(lbl[1]) tripled.append(lbl[1]) tripled.append(lbl[1]) if variant == 0: lbls = [tripled.pop(), tripled.pop(), tripled.pop(), doubled.pop(), doubled.pop()] masks = [None, ' ', ' ', None, ' '] marks = [mark1, mark1, mark1, mark2, mark2] elif variant == 1: lbls = [tripled.pop(), tripled.pop(), doubled.pop(), tripled.pop(), doubled.pop()] masks = [None, ' ', None, ' ', ' '] marks = [mark1, mark1, mark2, mark1, mark2] return self._polygon( shared.pentagon_3_2_shapes_source, shape_variants, Polygon, labels=lbls, name=name, label_vertices=label_vertices, thickness=thickness, length_unit=length_unit, masks=masks, marks=marks, shape_variant_nb=shape_variant_nb, wlines_nb=wlines_nb ) def _pentagon_4_1(self, variant=None, labels=None, name=None, label_vertices=None, thickness=None, length_unit=None, shape_variant_nb=None, wlines_nb=0): pentagonv0_shape1 = [Point('0.21', '0.73'), Point('1.11', '0.8'), Point('1.78', '0.2'), Point('0.9', 0), Point(0, 0)] mark = next(shared.ls_marks_source)[0] shape_variants = { 1: {'args': pentagonv0_shape1, 'rotation_angle': 0, 'baseline': '13pt'}, 2: {'args': pentagonv0_shape1, 'rotation_angle': 180, 'baseline': '1pt'}, } singles = [] quadrupled = [] for lbl in labels: if lbl[0] == 4: quadrupled.append(lbl[1]) quadrupled.append(lbl[1]) quadrupled.append(lbl[1]) quadrupled.append(lbl[1]) else: singles.append(lbl[1]) lbls = [quadrupled.pop(), quadrupled.pop(), quadrupled.pop(), quadrupled.pop(), singles.pop()] masks = [None, ' ', ' ', ' ', None] marks = [mark, mark, mark, mark, None] return self._polygon( shared.pentagon_4_1_shapes_source, shape_variants, Polygon, labels=lbls, name=name, label_vertices=label_vertices, thickness=thickness, length_unit=length_unit, masks=masks, marks=marks, shape_variant_nb=shape_variant_nb, wlines_nb=wlines_nb ) def _pentagon_5(self, variant=None, labels=None, name=None, label_vertices=None, thickness=None, length_unit=None, shape_variant_nb=None, wlines_nb=0): pentagonv0_shape1 = [Point('-0.22', '0.67'), Point('0.35', '1.08'), Point('0.92', '0.67'), Point('0.7', 0), Point(0, 0)] mark = next(shared.ls_marks_source)[0] shape_variants = { 1: {'args': pentagonv0_shape1, 'rotation_angle': 0, 'baseline': '16pt'}, 2: {'args': pentagonv0_shape1, 'rotation_angle': 180, 'baseline': '4pt'}, } masks = [None, ' ', ' ', ' ', ' '] marks = [mark, mark, mark, mark, mark] return self._polygon( shared.pentagon_5_shapes_source, shape_variants, Polygon, labels=[labels[0][1] for _ in range(5)], name=name, label_vertices=label_vertices, thickness=thickness, length_unit=length_unit, masks=masks, marks=marks, shape_variant_nb=shape_variant_nb, wlines_nb=wlines_nb ) def _hexagon_1_1_1_1_1_1(self, variant=None, labels=None, name=None, label_vertices=None, thickness=None, length_unit=None, shape_variant_nb=None, wlines_nb=0): hexagon_shape1 = [Point(0, '0.4'), Point('0.7', '0.8'), Point('1.7', '0.8'), Point('2.8', '0.5'), Point(2, 0), Point('0.8', 0)] shape_variants = { 1: {'args': hexagon_shape1, 'rotation_angle': 0, 'baseline': '9pt', # 'boundingbox': None, # 'use_mark': next(shared.ls_marks_source)[0] }, 2: {'args': hexagon_shape1, 'rotation_angle': 180, 'baseline': '9pt', # 'boundingbox': None, # 'use_mark': next(shared.ls_marks_source)[0] }, } return self._polygon( shared.hexagon_1_1_1_1_1_1_shapes_source, shape_variants, Polygon, labels=[lbl[1] for lbl in labels], name=name, label_vertices=label_vertices, thickness=thickness, length_unit=length_unit, shape_variant_nb=shape_variant_nb, wlines_nb=wlines_nb ) def _hexagon_2_1_1_1_1(self, variant=None, labels=None, name=None, label_vertices=None, thickness=None, length_unit=None, shape_variant_nb=None, wlines_nb=0): if variant not in [0, 1, 2]: raise ValueError('variant must be 0, 1 or 2 (not \'{}\')' .format(variant)) hexagonv0_shape1 = [Point('0.17', '0.47'), Point('0.9', '0.8'), Point('1.7', '0.8'), Point('2.8', '0.4'), Point(2, 0), Point('0.7', 0)] hexagonv1_shape1 = [Point(0, '0.3'), Point('0.87', '0.8'), Point('1.7', '0.8'), Point('2.68', '0.6'), Point('2.2', '0.1'), Point(1, 0)] hexagonv2_shape1 = [Point(0, '0.7'), Point('0.83', '0.9'), Point('2.2', '0.8'), Point('2.44', '0.15'), Point('1.6', 0), Point('0.2', 0)] hexagonv2_shape2 = [Point('0.93', 0), Point('0.1', '0.2'), Point('0.3', '0.9'), Point('1.3', '1'), Point('2.14', '0.9'), Point('1.9', '0.1')] mark = next(shared.ls_marks_source)[0] if variant == 0: shape_variants = { 1: {'args': hexagonv0_shape1, 'rotation_angle': 0, 'baseline': '9pt'}, 2: {'args': hexagonv0_shape1, 'rotation_angle': 180, 'baseline': '9.5pt'}, } elif variant == 1: shape_variants = { 1: {'args': hexagonv1_shape1, 'rotation_angle': 0, 'baseline': '9pt'}, 2: {'args': hexagonv1_shape1, 'rotation_angle': 180, 'baseline': '10pt'}, } elif variant == 2: shape_variants = { 1: {'args': hexagonv2_shape1, 'rotation_angle': 0, 'baseline': '10pt'}, 2: {'args': hexagonv2_shape2, 'rotation_angle': 0, 'baseline': '10pt'}, } singles = [] doubled = [] for lbl in labels: if lbl[0] == 1: singles.append(lbl[1]) else: doubled.append(lbl[1]) doubled.append(lbl[1]) random.shuffle(singles) if variant == 0: lbls = [doubled.pop(), doubled.pop(), singles.pop(), singles.pop(), singles.pop(), singles.pop()] masks = [None, ' ', None, None, None, None] marks = [mark, mark, None, None, None, None] elif variant == 1: lbls = [doubled.pop(), singles.pop(), doubled.pop(), singles.pop(), singles.pop(), singles.pop()] masks = [None, None, ' ', None, None, None] marks = [mark, None, mark, None, None, None] elif variant == 2: lbls = [doubled.pop(), singles.pop(), singles.pop(), doubled.pop(), singles.pop(), singles.pop()] masks = [None, None, None, ' ', None, None] marks = [mark, None, None, mark, None, None] return self._polygon( shared.hexagon_2_1_1_1_1_shapes_source, shape_variants, Polygon, labels=lbls, name=name, label_vertices=label_vertices, thickness=thickness, length_unit=length_unit, masks=masks, marks=marks, shape_variant_nb=shape_variant_nb, wlines_nb=wlines_nb ) def _hexagon_2_2_1_1(self, variant=None, labels=None, name=None, label_vertices=None, thickness=None, length_unit=None, shape_variant_nb=None, wlines_nb=0): if variant not in [0, 1, 2, 3, 4, 5, 6, 7]: raise ValueError('variant must be 0, 1, 2, 3, 4, 5, 6, or 7 ' '(not \'{}\')'.format(variant)) hexagonv0_shape1 = [Point('1.6', 0), Point('0.7', 0), Point(0, '0.56'), Point('0.9', 1), Point('1.9', 1), Point('2.8', '0.5')] hexagonv1_shape1 = [Point(0, '0.4'), Point('0.53', 1), Point('1.63', '1.1'), Point('2.4', '0.9'), Point('1.76', 0), Point('0.8', 0)] hexagonv2_shape1 = [Point('0.4', 0), Point(0, '0.81'), Point('1.03', '1.1'), Point('2.14', '0.9'), Point('2.7', '0.2'), Point('1.5', '0.2')] hexagonv3_shape1 = [Point(0, '0.6'), Point('0.69', '1.1'), Point('1.69', '1.1'), Point('2.32', '0.54'), Point('1.64', 0), Point('0.64', 0)] hexagonv4_shape1 = [Point('2.7', '0.8'), Point('2.41', 0), Point('1.41', 0), Point('0.45', '0.27'), Point('0.9', '1.1'), Point('1.75', '1.1')] hexagonv5_shape1 = [Point('0.39', '0.22'), Point(0, '0.8'), Point('0.63', '1.1'), Point('1.88', '0.86'), Point('2.44', '0.15'), Point('1.55', 0), ] hexagonv6_shape1 = [Point('0.22', '0.8'), Point('1.2', 1), Point('1.99', '0.9'), Point('2.2', '0.1'), Point('1.2', 0), Point('0.41', '0.1'), ] hexagonv7_shape1 = [Point('0.34', '0.9'), Point('1.11', '1.1'), Point('2.09', '0.9'), Point('1.6', '0.09'), Point('0.6', 0), Point('-0.18', '0.19'), ] mark1 = next(shared.ls_marks_source)[0] mark2 = next(shared.ls_marks_source)[0] if variant == 0: shape_variants = { 1: {'args': hexagonv0_shape1, 'rotation_angle': 0, 'baseline': '11pt'}, } elif variant == 1: shape_variants = { 1: {'args': hexagonv1_shape1, 'rotation_angle': 0, 'baseline': '13pt'}, } elif variant == 2: shape_variants = { 1: {'args': hexagonv2_shape1, 'rotation_angle': 0, 'baseline': '13pt'}, } elif variant == 3: shape_variants = { 1: {'args': hexagonv3_shape1, 'rotation_angle': 0, 'baseline': '13pt'}, } elif variant == 4: shape_variants = { 1: {'args': hexagonv4_shape1, 'rotation_angle': 0, 'baseline': '13pt'}, } elif variant == 5: shape_variants = { 1: {'args': hexagonv5_shape1, 'rotation_angle': 0, 'baseline': '13pt'}, } elif variant == 6: shape_variants = { 1: {'args': hexagonv6_shape1, 'rotation_angle': 0, 'baseline': '15pt'}, } elif variant == 7: shape_variants = { 1: {'args': hexagonv7_shape1, 'rotation_angle': 0, 'baseline': '17pt'}, } singles = [] doubled1 = [] doubled2 = [] for lbl in labels: if lbl[0] == 1: singles.append(lbl[1]) else: if not doubled1: doubled1.append(lbl[1]) doubled1.append(lbl[1]) else: doubled2.append(lbl[1]) doubled2.append(lbl[1]) random.shuffle(singles) if variant == 0: lbls = [doubled1.pop(), doubled1.pop(), doubled2.pop(), doubled2.pop(), singles.pop(), singles.pop()] masks = [None, ' ', None, ' ', None, None] marks = [mark1, mark1, mark2, mark2, None, None] elif variant == 1: lbls = [doubled1.pop(), doubled2.pop(), doubled1.pop(), doubled2.pop(), singles.pop(), singles.pop()] masks = [None, None, ' ', ' ', None, None] marks = [mark1, mark2, mark1, mark2, None, None] elif variant == 2: lbls = [doubled1.pop(), doubled2.pop(), doubled2.pop(), doubled1.pop(), singles.pop(), singles.pop()] masks = [None, None, ' ', ' ', None, None] marks = [mark1, mark2, mark2, mark1, None, None] elif variant == 3: lbls = [doubled1.pop(), doubled2.pop(), doubled1.pop(), singles.pop(), doubled2.pop(), singles.pop()] masks = [None, None, ' ', None, ' ', None] marks = [mark1, mark2, mark1, None, mark2, None] elif variant == 4: lbls = [doubled1.pop(), doubled2.pop(), doubled2.pop(), singles.pop(), doubled1.pop(), singles.pop()] masks = [None, None, ' ', None, ' ', None] marks = [mark1, mark2, mark2, None, mark1, None] elif variant == 5: lbls = [doubled1.pop(), doubled1.pop(), singles.pop(), doubled2.pop(), doubled2.pop(), singles.pop()] masks = [None, ' ', None, None, ' ', None] marks = [mark1, mark1, None, mark2, mark2, None] elif variant == 6: lbls = [doubled1.pop(), doubled2.pop(), singles.pop(), doubled1.pop(), doubled2.pop(), singles.pop()] masks = [None, None, None, ' ', ' ', None] marks = [mark1, mark2, None, mark1, mark2, None] elif variant == 7: lbls = [doubled1.pop(), doubled2.pop(), singles.pop(), doubled2.pop(), doubled1.pop(), singles.pop()] masks = [None, None, None, ' ', ' ', None] marks = [mark1, mark2, None, mark2, mark1, None] return self._polygon( shared.hexagon_2_2_1_1_shapes_source, shape_variants, Polygon, labels=lbls, name=name, label_vertices=label_vertices, thickness=thickness, length_unit=length_unit, masks=masks, marks=marks, shape_variant_nb=shape_variant_nb, wlines_nb=wlines_nb ) def _hexagon_2_2_2(self, variant=None, labels=None, name=None, label_vertices=None, thickness=None, length_unit=None, shape_variant_nb=None, wlines_nb=0): if variant not in [0, 1, 2, 3]: raise ValueError('variant must be 0, 1, 2 or 3 ' '(not \'{}\')'.format(variant)) hexagonv0_shape1 = [Point(0, '0.9'), Point('0.77', '1.1'), Point('1.57', 1), Point('2.26', '0.42'), Point('1.46', 0), Point('0.46', '0.01')] hexagonv1_shape1 = [Point(0, '0.5'), Point('0.92', '1.1'), Point('1.72', '1.1'), Point('2.55', '0.63'), Point('1.61', '0.05'), Point('0.66', '0.05')] hexagonv2_shape1 = [Point(0, '0.56'), Point('0.66', '1.02'), Point('1.61', '1.07'), Point('2.4', '0.96'), Point('1.87', 0), Point('0.77', 0)] hexagonv3_shape1 = [Point(0, '0.15'), Point(0, '.95'), Point('0.94', '1.05'), Point('2.04', '0.95'), Point('2.03', '0.15'), Point('1.09', 0)] mark1 = next(shared.ls_marks_source)[0] mark2 = next(shared.ls_marks_source)[0] mark3 = next(shared.ls_marks_source)[0] if variant == 0: shape_variants = { 1: {'args': hexagonv0_shape1, 'rotation_angle': 0, 'baseline': '13pt'}, } elif variant == 1: shape_variants = { 1: {'args': hexagonv1_shape1, 'rotation_angle': 0, 'baseline': '18pt'}, } elif variant == 2: shape_variants = { 1: {'args': hexagonv2_shape1, 'rotation_angle': 0, 'baseline': '13pt'}, } elif variant == 3: shape_variants = { 1: {'args': hexagonv3_shape1, 'rotation_angle': 0, 'baseline': '18pt'}, } doubled1 = [] doubled2 = [] doubled3 = [] for lbl in labels: if not doubled1: doubled1.append(lbl[1]) doubled1.append(lbl[1]) elif not doubled2: doubled2.append(lbl[1]) doubled2.append(lbl[1]) elif not doubled3: doubled3.append(lbl[1]) doubled3.append(lbl[1]) if variant == 0: lbls = [doubled1.pop(), doubled1.pop(), doubled2.pop(), doubled2.pop(), doubled3.pop(), doubled3.pop()] masks = [None, ' ', None, ' ', None, ' '] marks = [mark1, mark1, mark2, mark2, mark3, mark3] elif variant == 1: lbls = [doubled1.pop(), doubled2.pop(), doubled3.pop(), doubled1.pop(), doubled3.pop(), doubled2.pop()] masks = [None, None, None, ' ', ' ', ' '] marks = [mark1, mark2, mark3, mark1, mark3, mark2] elif variant == 2: lbls = [doubled1.pop(), doubled2.pop(), doubled1.pop(), doubled3.pop(), doubled3.pop(), doubled2.pop()] masks = [None, ' ', ' ', None, ' ', None] marks = [mark1, mark2, mark1, mark3, mark3, mark2] elif variant == 3: lbls = [doubled1.pop(), doubled2.pop(), doubled3.pop(), doubled1.pop(), doubled2.pop(), doubled3.pop()] masks = [None, None, None, ' ', ' ', ' '] marks = [mark1, mark2, mark3, mark1, mark2, mark3] return self._polygon( shared.hexagon_2_2_2_shapes_source, shape_variants, Polygon, labels=lbls, name=name, label_vertices=label_vertices, thickness=thickness, length_unit=length_unit, masks=masks, marks=marks, shape_variant_nb=shape_variant_nb, wlines_nb=wlines_nb ) def _hexagon_3_1_1_1(self, variant=None, labels=None, name=None, label_vertices=None, thickness=None, length_unit=None, shape_variant_nb=None, wlines_nb=0): if variant not in [0, 1, 2]: raise ValueError('variant must be 0, 1 or 2 (not \'{}\')' .format(variant)) hexagonv0_shape1 = [Point('0.9', '1.1'), Point('1.9', '1.1'), Point('2.7', '0.5'), Point('1.84', 0), Point('0.39', '0.2'), Point(0, '0.9')] hexagonv1_shape1 = [Point(0, '0.9'), Point('0.98', '1.1'), Point('1.97', 1), Point('2.38', '0.2'), Point('1.4', 0), Point('0.4', '0.1')] hexagonv2_shape1 = [Point('0.7', '1.1'), Point('1.8', '1.1'), Point('2.62', '0.6'), Point('1.7', 0), Point('0.85', 0), Point(0, '0.7')] mark = next(shared.ls_marks_source)[0] if variant == 0: shape_variants = { 1: {'args': hexagonv0_shape1, 'rotation_angle': 0, 'baseline': '13pt'}, } elif variant == 1: shape_variants = { 1: {'args': hexagonv1_shape1, 'rotation_angle': 0, 'baseline': '13pt'}, } elif variant == 2: shape_variants = { 1: {'args': hexagonv2_shape1, 'rotation_angle': 0, 'baseline': '13pt'}, } singles = [] tripled = [] for lbl in labels: if lbl[0] == 1: singles.append(lbl[1]) else: tripled.append(lbl[1]) tripled.append(lbl[1]) tripled.append(lbl[1]) random.shuffle(singles) if variant == 0: lbls = [tripled.pop(), tripled.pop(), tripled.pop(), singles.pop(), singles.pop(), singles.pop()] masks = [' ', None, ' ', None, None, None] marks = [mark, mark, mark, None, None, None] elif variant == 1: lbls = [tripled.pop(), tripled.pop(), singles.pop(), tripled.pop(), singles.pop(), singles.pop()] masks = [None, ' ', None, ' ', None, None] marks = [mark, mark, None, mark, None, None] elif variant == 2: lbls = [tripled.pop(), singles.pop(), tripled.pop(), singles.pop(), tripled.pop(), singles.pop()] masks = [None, None, ' ', None, ' ', None] marks = [mark, None, mark, None, mark, None] return self._polygon( shared.hexagon_3_1_1_1_shapes_source, shape_variants, Polygon, labels=lbls, name=name, label_vertices=label_vertices, thickness=thickness, length_unit=length_unit, masks=masks, marks=marks, shape_variant_nb=shape_variant_nb, wlines_nb=wlines_nb ) def _hexagon_3_2_1(self, variant=None, labels=None, name=None, label_vertices=None, thickness=None, length_unit=None, shape_variant_nb=None, wlines_nb=0): if variant not in [0, 1, 2]: raise ValueError('variant must be 0, 1 or 2 (not \'{}\')' .format(variant)) hexagonv0_shape1 = [Point('0.9', '1.1'), Point('1.75', '1.1'), Point('2.4', '0.56'), Point('1.76', 0), Point('0.76', 0), Point('0.04', '0.7')] hexagonv1_shape1 = [Point('0.8', 0), Point('0.01', '0.3'), Point('0.61', '1.1'), Point('1.61', '1.1'), Point('2.36', '0.72'), Point('1.91', 0)] hexagonv2_shape1 = [Point('2.6', '0.6'), Point(2, 0), Point('1.15', 0), Point('0.27', '0.49'), Point('0.86', '1.1'), Point('1.86', '1.1')] mark1 = next(shared.ls_marks_source)[0] mark2 = next(shared.ls_marks_source)[0] if variant == 0: shape_variants = { 1: {'args': hexagonv0_shape1, 'rotation_angle': 0, 'baseline': '13pt'}, } elif variant == 1: shape_variants = { 1: {'args': hexagonv1_shape1, 'rotation_angle': 0, 'baseline': '10pt'}, } elif variant == 2: shape_variants = { 1: {'args': hexagonv2_shape1, 'rotation_angle': 0, 'baseline': '13pt'}, } singles = [] doubled = [] tripled = [] for lbl in labels: if lbl[0] == 1: singles.append(lbl[1]) elif lbl[0] == 2: doubled.append(lbl[1]) doubled.append(lbl[1]) else: tripled.append(lbl[1]) tripled.append(lbl[1]) tripled.append(lbl[1]) if variant == 0: lbls = [tripled.pop(), tripled.pop(), tripled.pop(), doubled.pop(), doubled.pop(), singles.pop()] masks = [' ', None, ' ', ' ', None, None] marks = [mark1, mark1, mark1, mark2, mark2, None] elif variant == 1: lbls = [tripled.pop(), doubled.pop(), doubled.pop(), tripled.pop(), tripled.pop(), singles.pop()] masks = [' ', None, ' ', ' ', None, None] marks = [mark1, mark2, mark2, mark1, mark1, None] elif variant == 2: lbls = [tripled.pop(), tripled.pop(), doubled.pop(), tripled.pop(), doubled.pop(), singles.pop()] masks = [None, ' ', None, ' ', ' ', None] marks = [mark1, mark1, mark2, mark1, mark2, None] return self._polygon( shared.hexagon_3_2_1_shapes_source, shape_variants, Polygon, labels=lbls, name=name, label_vertices=label_vertices, thickness=thickness, length_unit=length_unit, masks=masks, marks=marks, shape_variant_nb=shape_variant_nb, wlines_nb=wlines_nb ) def _hexagon_3_3(self, variant=None, labels=None, name=None, label_vertices=None, thickness=None, length_unit=None, shape_variant_nb=None, wlines_nb=0): if variant not in [0, 1, 2]: raise ValueError('variant must be 0, 1 or 2 (not \'{}\')' .format(variant)) hexagonv0_shape1 = [Point(0, '0.57'), Point('0.72', '1.02'), Point('1.57', '1.02'), Point('2.29', '0.57'), Point('1.59', 0), Point('0.69', 0)] hexagonv1_shape1 = [Point(0, '0.49'), Point('0.66', '1.02'), Point('1.51', '1.02'), Point('2.29', '0.57'), Point('1.65', 0), Point('0.75', 0)] hexagonv2_shape1 = [Point(0, '0.4'), Point('0.55', '1.04'), Point('1.45', '1.04'), Point('2.23', '0.7'), Point('1.66', 0), Point('0.81', 0)] mark1 = next(shared.ls_marks_source)[0] mark2 = next(shared.ls_marks_source)[0] if variant == 0: shape_variants = { 1: {'args': hexagonv0_shape1, 'rotation_angle': 0, 'baseline': '12pt'}, } elif variant == 1: shape_variants = { 1: {'args': hexagonv1_shape1, 'rotation_angle': 0, 'baseline': '15pt'}, } elif variant == 2: shape_variants = { 1: {'args': hexagonv2_shape1, 'rotation_angle': 0, 'baseline': '17pt'}, } tripled1 = [] tripled2 = [] for lbl in labels: if not tripled1: tripled1.append(lbl[1]) tripled1.append(lbl[1]) tripled1.append(lbl[1]) elif not tripled2: tripled2.append(lbl[1]) tripled2.append(lbl[1]) tripled2.append(lbl[1]) if variant == 0: lbls = [tripled1.pop(), tripled1.pop(), tripled1.pop(), tripled2.pop(), tripled2.pop(), tripled2.pop()] masks = [None, ' ', ' ', None, ' ', ' '] marks = [mark1, mark1, mark1, mark2, mark2, mark2] elif variant == 1: lbls = [tripled1.pop(), tripled1.pop(), tripled2.pop(), tripled1.pop(), tripled2.pop(), tripled2.pop()] masks = [None, ' ', None, ' ', ' ', ' '] marks = [mark1, mark1, mark2, mark1, mark2, mark2] elif variant == 2: lbls = [tripled1.pop(), tripled2.pop(), tripled1.pop(), tripled2.pop(), tripled1.pop(), tripled2.pop()] masks = [None, None, ' ', ' ', ' ', ' '] marks = [mark1, mark2, mark1, mark2, mark1, mark2] return self._polygon( shared.hexagon_3_3_shapes_source, shape_variants, Polygon, labels=lbls, name=name, label_vertices=label_vertices, thickness=thickness, length_unit=length_unit, masks=masks, marks=marks, shape_variant_nb=shape_variant_nb, wlines_nb=wlines_nb ) def _hexagon_4_1_1(self, variant=None, labels=None, name=None, label_vertices=None, thickness=None, length_unit=None, shape_variant_nb=None, wlines_nb=0): if variant not in [0, 1, 2]: raise ValueError('variant must be 0, 1 or 2 (not \'{}\')' .format(variant)) hexagonv0_shape1 = [Point(1, '1.1'), Point('1.84', '0.99'), Point('1.84', '0.14'), Point(1, 0), Point('0.15', '0.07'), Point('-0.2', '0.9')] hexagonv1_shape1 = [Point(1, 0), Point('0.16', '0.15'), Point('-0.2', '0.92'), Point('0.63', '1.1'), Point('2.3', 1), Point('2.01', '0.2')] hexagonv2_shape1 = [Point(1, 0), Point('0.16', '0.1'), Point('0.11', '0.95'), Point('1.1', '1.1'), Point('1.94', '0.96'), Point('2.24', '0.17')] mark = next(shared.ls_marks_source)[0] if variant == 0: shape_variants = { 1: {'args': hexagonv0_shape1, 'rotation_angle': 0, 'baseline': '17pt'}, } elif variant == 1: shape_variants = { 1: {'args': hexagonv1_shape1, 'rotation_angle': 0, 'baseline': '13pt'}, } elif variant == 2: shape_variants = { 1: {'args': hexagonv2_shape1, 'rotation_angle': 0, 'baseline': '13pt'}, } singles = [] quadrupled = [] for lbl in labels: if lbl[0] == 1: singles.append(lbl[1]) else: quadrupled.append(lbl[1]) quadrupled.append(lbl[1]) quadrupled.append(lbl[1]) quadrupled.append(lbl[1]) random.shuffle(singles) if variant == 0: lbls = [quadrupled.pop(), quadrupled.pop(), quadrupled.pop(), quadrupled.pop(), singles.pop(), singles.pop()] masks = [None, ' ', ' ', ' ', None, None] marks = [mark, mark, mark, mark, None, None] elif variant == 1: lbls = [quadrupled.pop(), quadrupled.pop(), quadrupled.pop(), singles.pop(), quadrupled.pop(), singles.pop()] masks = [' ', None, ' ', None, ' ', None] marks = [mark, mark, mark, None, mark, None] elif variant == 2: lbls = [quadrupled.pop(), quadrupled.pop(), singles.pop(), quadrupled.pop(), quadrupled.pop(), singles.pop()] masks = [' ', ' ', None, ' ', None, None] marks = [mark, mark, None, mark, mark, None] return self._polygon( shared.hexagon_4_1_1_shapes_source, shape_variants, Polygon, labels=lbls, name=name, label_vertices=label_vertices, thickness=thickness, length_unit=length_unit, masks=masks, marks=marks, shape_variant_nb=shape_variant_nb, wlines_nb=wlines_nb ) def _hexagon_4_2(self, variant=None, labels=None, name=None, label_vertices=None, thickness=None, length_unit=None, shape_variant_nb=None, wlines_nb=0): if variant not in [0, 1, 2]: raise ValueError('variant must be 0, 1 or 2 (not \'{}\')' .format(variant)) hexagonv0_shape1 = [Point('1.2', 0), Point('0.36', '0.09'), Point('0.01', '0.87'), Point('0.83', '1.1'), Point('1.67', '0.97'), Point('2.19', '0.12')] hexagonv1_shape1 = [Point(0, '0.85'), Point('0.81', '1.1'), Point('1.66', '1.02'), Point('2.32', '0.48'), Point('1.44', 0), Point('0.59', '0.04')] hexagonv2_shape1 = [Point(0, '0.46'), Point('0.61', '1.06'), Point('1.46', '1.06'), Point('2.35', '0.6'), Point('1.74', 0), Point('0.89', 0)] mark1 = next(shared.ls_marks_source)[0] mark2 = next(shared.ls_marks_source)[0] if variant == 0: shape_variants = { 1: {'args': hexagonv0_shape1, 'rotation_angle': 0, 'baseline': '11.5pt'}, } elif variant == 1: shape_variants = { 1: {'args': hexagonv1_shape1, 'rotation_angle': 0, 'baseline': '13pt'}, } elif variant == 2: shape_variants = { 1: {'args': hexagonv2_shape1, 'rotation_angle': 0, 'baseline': '17pt'}, } doubled = [] quadrupled = [] for lbl in labels: if lbl[0] == 2: doubled.append(lbl[1]) doubled.append(lbl[1]) else: quadrupled.append(lbl[1]) quadrupled.append(lbl[1]) quadrupled.append(lbl[1]) quadrupled.append(lbl[1]) if variant == 0: lbls = [quadrupled.pop(), quadrupled.pop(), quadrupled.pop(), quadrupled.pop(), doubled.pop(), doubled.pop()] masks = [' ', None, ' ', ' ', None, ' '] marks = [mark1, mark1, mark1, mark1, mark2, mark2] elif variant == 1: lbls = [quadrupled.pop(), quadrupled.pop(), quadrupled.pop(), doubled.pop(), quadrupled.pop(), doubled.pop()] masks = [None, ' ', ' ', None, ' ', ' '] marks = [mark1, mark1, mark1, mark2, mark1, mark2] elif variant == 2: lbls = [quadrupled.pop(), quadrupled.pop(), doubled.pop(), quadrupled.pop(), quadrupled.pop(), doubled.pop()] masks = [None, ' ', None, ' ', ' ', ' '] marks = [mark1, mark1, mark2, mark1, mark1, mark2] return self._polygon( shared.hexagon_4_2_shapes_source, shape_variants, Polygon, labels=lbls, name=name, label_vertices=label_vertices, thickness=thickness, length_unit=length_unit, masks=masks, marks=marks, shape_variant_nb=shape_variant_nb, wlines_nb=wlines_nb ) def _hexagon_5_1(self, variant=None, labels=None, name=None, label_vertices=None, thickness=None, length_unit=None, shape_variant_nb=None, wlines_nb=0): hexagon_shape1 = [Point(0, '0.8'), Point('0.8', '1.1'), Point('1.65', '1.1'), Point('2.38', '0.68'), Point('1.88', 0), Point('1.03', 0)] mark = next(shared.ls_marks_source)[0] shape_variants = { 1: {'args': hexagon_shape1, 'rotation_angle': 0, 'baseline': '10pt'}, 2: {'args': hexagon_shape1, 'rotation_angle': 180, 'baseline': '19.5pt'}, } singles = [] quintupled = [] for lbl in labels: if lbl[0] == 1: singles.append(lbl[1]) else: quintupled.append(lbl[1]) quintupled.append(lbl[1]) quintupled.append(lbl[1]) quintupled.append(lbl[1]) quintupled.append(lbl[1]) lbls = [quintupled.pop(), quintupled.pop(), quintupled.pop(), quintupled.pop(), quintupled.pop(), singles.pop()] masks = [' ', ' ', ' ', None, ' ', None] marks = [mark, mark, mark, mark, mark, None] return self._polygon( shared.hexagon_5_1_shapes_source, shape_variants, Polygon, labels=lbls, name=name, label_vertices=label_vertices, thickness=thickness, length_unit=length_unit, masks=masks, marks=marks, shape_variant_nb=shape_variant_nb, wlines_nb=wlines_nb ) def _hexagon_6(self, variant=None, labels=None, name=None, label_vertices=None, thickness=None, length_unit=None, shape_variant_nb=None, wlines_nb=0): shape_variant_nb = 2 hexagon_shape1 = [Point('0.48', '0.55'), Point('0.8', '1.1'), Point('1.43', '1.1'), Point('1.75', '0.55'), Point('1.43', 0), Point('0.8', 0)] mark = next(shared.ls_marks_source)[0] shape_variants = { 1: {'args': hexagon_shape1, 'rotation_angle': 0, 'baseline': '16pt'}, 2: {'args': hexagon_shape1, 'rotation_angle': 15, 'baseline': '13pt'}, } masks = [None, ' ', ' ', ' ', ' ', ' '] marks = [mark, mark, mark, mark, mark, mark] return self._polygon( shared.hexagon_6_shapes_source, shape_variants, Polygon, labels=[labels[0][1] for _ in range(6)], name=name, label_vertices=label_vertices, thickness=thickness, length_unit=length_unit, masks=masks, marks=marks, shape_variant_nb=shape_variant_nb, wlines_nb=wlines_nb )