kopia lustrzana https://github.com/inkstitch/inkstitch
				
				
				
			expose end_row_spacing and (re)order fill params (#2265)
							rodzic
							
								
									9f7083f25c
								
							
						
					
					
						commit
						8a32d0787d
					
				| 
						 | 
				
			
			@ -130,7 +130,7 @@ class FillStitch(EmbroideryElement):
 | 
			
		|||
 | 
			
		||||
    @property
 | 
			
		||||
    @param('guided_fill_strategy', _('Guided Fill Strategy'), type='dropdown', default=0,
 | 
			
		||||
           options=[_("Copy"), _("Parallel Offset")], select_items=[('fill_method', 'guided_fill')], sort_index=3,
 | 
			
		||||
           options=[_("Copy"), _("Parallel Offset")], select_items=[('fill_method', 'guided_fill')], sort_index=10,
 | 
			
		||||
           tooltip=_('Copy (the default) will fill the shape with shifted copies of the line. '
 | 
			
		||||
                     'Parallel offset will ensure that each line is always a consistent distance from its neighbor. '
 | 
			
		||||
                     'Sharp corners may be introduced.'))
 | 
			
		||||
| 
						 | 
				
			
			@ -139,13 +139,13 @@ class FillStitch(EmbroideryElement):
 | 
			
		|||
 | 
			
		||||
    @property
 | 
			
		||||
    @param('contour_strategy', _('Contour Fill Strategy'), type='dropdown', default=0,
 | 
			
		||||
           options=[_("Inner to Outer"), _("Single spiral"), _("Double spiral")], select_items=[('fill_method', 'contour_fill')], sort_index=3)
 | 
			
		||||
           options=[_("Inner to Outer"), _("Single spiral"), _("Double spiral")], select_items=[('fill_method', 'contour_fill')], sort_index=10)
 | 
			
		||||
    def contour_strategy(self):
 | 
			
		||||
        return self.get_int_param('contour_strategy', 0)
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    @param('join_style', _('Join Style'), type='dropdown', default=0,
 | 
			
		||||
           options=[_("Round"), _("Mitered"), _("Beveled")], select_items=[('fill_method', 'contour_fill')], sort_index=4)
 | 
			
		||||
           options=[_("Round"), _("Mitered"), _("Beveled")], select_items=[('fill_method', 'contour_fill')], sort_index=11)
 | 
			
		||||
    def join_style(self):
 | 
			
		||||
        return self.get_int_param('join_style', 0)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -155,10 +155,53 @@ class FillStitch(EmbroideryElement):
 | 
			
		|||
           type='boolean',
 | 
			
		||||
           default=False,
 | 
			
		||||
           select_items=[('fill_method', 'contour_fill')],
 | 
			
		||||
           sort_index=5)
 | 
			
		||||
           sort_index=12)
 | 
			
		||||
    def avoid_self_crossing(self):
 | 
			
		||||
        return self.get_boolean_param('avoid_self_crossing', False)
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    @param('clockwise', _('Clockwise'), type='boolean', default=True, select_items=[('fill_method', 'contour_fill')], sort_index=13)
 | 
			
		||||
    def clockwise(self):
 | 
			
		||||
        return self.get_boolean_param('clockwise', True)
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    @param('meander_pattern', _('Meander Pattern'), type='combo', default=0,
 | 
			
		||||
           options=sorted(tiles.all_tiles()), select_items=[('fill_method', 'meander_fill')], sort_index=10)
 | 
			
		||||
    def meander_pattern(self):
 | 
			
		||||
        return self.get_param('meander_pattern', min(tiles.all_tiles()).id)
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    @param('meander_angle',
 | 
			
		||||
           _('Meander pattern angle'),
 | 
			
		||||
           type='float', unit="degrees",
 | 
			
		||||
           default=0,
 | 
			
		||||
           select_items=[('fill_method', 'meander_fill')],
 | 
			
		||||
           sort_index=11)
 | 
			
		||||
    def meander_angle(self):
 | 
			
		||||
        return math.radians(self.get_float_param('meander_angle', 0))
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    @param('meander_scale_percent',
 | 
			
		||||
           _('Meander pattern scale'),
 | 
			
		||||
           tooltip=_("Percentage to stretch or compress the meander pattern.  You can scale horizontally " +
 | 
			
		||||
                     "and vertically individually by giving two percentages separated by a space. "),
 | 
			
		||||
           type='float', unit="%",
 | 
			
		||||
           default=100,
 | 
			
		||||
           select_items=[('fill_method', 'meander_fill')],
 | 
			
		||||
           sort_index=12)
 | 
			
		||||
    def meander_scale(self):
 | 
			
		||||
        return np.maximum(self.get_split_float_param('meander_scale_percent', (100, 100)), (1, 1)) / 100
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    @param('clip', _('Clip path'),
 | 
			
		||||
           tooltip=_('Constrain stitching to the shape.  Useful when smoothing and expand are used.'),
 | 
			
		||||
           type='boolean',
 | 
			
		||||
           default=False,
 | 
			
		||||
           select_items=[('fill_method', 'meander_fill')],
 | 
			
		||||
           sort_index=13)
 | 
			
		||||
    def clip(self):
 | 
			
		||||
        return self.get_boolean_param('clip', False)
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    @param('smoothness_mm', _('Smoothness'),
 | 
			
		||||
           tooltip=_(
 | 
			
		||||
| 
						 | 
				
			
			@ -170,42 +213,24 @@ class FillStitch(EmbroideryElement):
 | 
			
		|||
           unit='mm',
 | 
			
		||||
           default=0,
 | 
			
		||||
           select_items=[('fill_method', 'contour_fill'), ('fill_method', 'meander_fill')],
 | 
			
		||||
           sort_index=5)
 | 
			
		||||
           sort_index=14)
 | 
			
		||||
    def smoothness(self):
 | 
			
		||||
        return self.get_float_param('smoothness_mm', 0)
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    @param('clockwise', _('Clockwise'), type='boolean', default=True, select_items=[('fill_method', 'contour_fill')], sort_index=5)
 | 
			
		||||
    def clockwise(self):
 | 
			
		||||
        return self.get_boolean_param('clockwise', True)
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    @param('meander_pattern', _('Meander Pattern'), type='combo', default=0,
 | 
			
		||||
           options=sorted(tiles.all_tiles()), select_items=[('fill_method', 'meander_fill')], sort_index=3)
 | 
			
		||||
    def meander_pattern(self):
 | 
			
		||||
        return self.get_param('meander_pattern', min(tiles.all_tiles()).id)
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    @param('meander_angle',
 | 
			
		||||
           _('Meander pattern angle'),
 | 
			
		||||
           type='float', unit="degrees",
 | 
			
		||||
    @param('expand_mm',
 | 
			
		||||
           _('Expand'),
 | 
			
		||||
           tooltip=_('Expand the shape before fill stitching, to compensate for gaps between shapes.  Negative values contract instead.'),
 | 
			
		||||
           unit='mm',
 | 
			
		||||
           type='float',
 | 
			
		||||
           default=0,
 | 
			
		||||
           select_items=[('fill_method', 'meander_fill')],
 | 
			
		||||
           sort_index=4)
 | 
			
		||||
    def meander_angle(self):
 | 
			
		||||
        return math.radians(self.get_float_param('meander_angle', 0))
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    @param('meander_scale_percent',
 | 
			
		||||
           _('Meander pattern scale'),
 | 
			
		||||
           tooltip=_("Percentage to stretch or compress the meander pattern.  You can scale horizontally " +
 | 
			
		||||
                     "and vertically individually by giving two percentages separated by a space. "),
 | 
			
		||||
           type='float', unit="%",
 | 
			
		||||
           default=100,
 | 
			
		||||
           select_items=[('fill_method', 'meander_fill')],
 | 
			
		||||
           sort_index=4)
 | 
			
		||||
    def meander_scale(self):
 | 
			
		||||
        return np.maximum(self.get_split_float_param('meander_scale_percent', (100, 100)), (1, 1)) / 100
 | 
			
		||||
           sort_index=20,
 | 
			
		||||
           select_items=[('fill_method', 'auto_fill'),
 | 
			
		||||
                         ('fill_method', 'guided_fill'),
 | 
			
		||||
                         ('fill_method', 'meander_fill'),
 | 
			
		||||
                         ('fill_method', 'circular_fill')])
 | 
			
		||||
    def expand(self):
 | 
			
		||||
        return self.get_float_param('expand_mm', 0)
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    @param('angle',
 | 
			
		||||
| 
						 | 
				
			
			@ -213,7 +238,7 @@ class FillStitch(EmbroideryElement):
 | 
			
		|||
           tooltip=_('The angle increases in a counter-clockwise direction.  0 is horizontal.  Negative angles are allowed.'),
 | 
			
		||||
           unit='deg',
 | 
			
		||||
           type='float',
 | 
			
		||||
           sort_index=6,
 | 
			
		||||
           sort_index=21,
 | 
			
		||||
           select_items=[('fill_method', 'auto_fill'), ('fill_method', 'legacy_fill')],
 | 
			
		||||
           default=0)
 | 
			
		||||
    @cache
 | 
			
		||||
| 
						 | 
				
			
			@ -221,9 +246,62 @@ class FillStitch(EmbroideryElement):
 | 
			
		|||
        return math.radians(self.get_float_param('angle', 0))
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def color(self):
 | 
			
		||||
        # SVG spec says the default fill is black
 | 
			
		||||
        return self.get_style("fill", "#000000")
 | 
			
		||||
    @param('max_stitch_length_mm',
 | 
			
		||||
           _('Maximum fill stitch length'),
 | 
			
		||||
           tooltip=_(
 | 
			
		||||
               'The length of each stitch in a row.  Shorter stitch may be used at the start or end of a row.'),
 | 
			
		||||
           unit='mm',
 | 
			
		||||
           sort_index=22,
 | 
			
		||||
           type='float',
 | 
			
		||||
           select_items=[('fill_method', 'auto_fill'),
 | 
			
		||||
                         ('fill_method', 'contour_fill'),
 | 
			
		||||
                         ('fill_method', 'guided_fill'),
 | 
			
		||||
                         ('fill_method', 'legacy_fill')],
 | 
			
		||||
           default=3.0)
 | 
			
		||||
    def max_stitch_length(self):
 | 
			
		||||
        return max(self.get_float_param("max_stitch_length_mm", 3.0), 0.1 * PIXELS_PER_MM)
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    @param('row_spacing_mm',
 | 
			
		||||
           _('Spacing between rows'),
 | 
			
		||||
           tooltip=_('Distance between rows of stitches.'),
 | 
			
		||||
           unit='mm',
 | 
			
		||||
           sort_index=23,
 | 
			
		||||
           type='float',
 | 
			
		||||
           select_items=[('fill_method', 'auto_fill'),
 | 
			
		||||
                         ('fill_method', 'contour_fill'),
 | 
			
		||||
                         ('fill_method', 'guided_fill'),
 | 
			
		||||
                         ('fill_method', 'circular_fill'),
 | 
			
		||||
                         ('fill_method', 'legacy_fill')],
 | 
			
		||||
           default=0.25)
 | 
			
		||||
    def row_spacing(self):
 | 
			
		||||
        return max(self.get_float_param("row_spacing_mm", 0.25), 0.1 * PIXELS_PER_MM)
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    @param('end_row_spacing_mm',
 | 
			
		||||
           _('End row spacing'),
 | 
			
		||||
           tooltip=_('Increases or decreases the row spacing towards the end.'),
 | 
			
		||||
           unit='mm',
 | 
			
		||||
           sort_index=24,
 | 
			
		||||
           type='float',
 | 
			
		||||
           select_items=[('fill_method', 'auto_fill'),
 | 
			
		||||
                         ('fill_method', 'legacy_fill')],
 | 
			
		||||
           default=None)
 | 
			
		||||
    def end_row_spacing(self):
 | 
			
		||||
        end_row_spacing = self.get_float_param("end_row_spacing_mm")
 | 
			
		||||
        return max(end_row_spacing, 0) if end_row_spacing else None
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    @param('staggers',
 | 
			
		||||
           _('Stagger rows this many times before repeating'),
 | 
			
		||||
           tooltip=_('Length of the cycle by which successive stitch rows are staggered. '
 | 
			
		||||
                     'Fractional values are allowed and can have less visible diagonals than integer values.'),
 | 
			
		||||
           type='int',
 | 
			
		||||
           sort_index=25,
 | 
			
		||||
           select_items=[('fill_method', 'auto_fill'), ('fill_method', 'guided_fill'), ('fill_method', 'legacy_fill')],
 | 
			
		||||
           default=4)
 | 
			
		||||
    def staggers(self):
 | 
			
		||||
        return self.get_float_param("staggers", 4)
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    @param(
 | 
			
		||||
| 
						 | 
				
			
			@ -232,7 +310,7 @@ class FillStitch(EmbroideryElement):
 | 
			
		|||
        tooltip=_('The last stitch in each row is quite close to the first stitch in the next row.  '
 | 
			
		||||
                  'Skipping it decreases stitch count and density.'),
 | 
			
		||||
        type='boolean',
 | 
			
		||||
        sort_index=6,
 | 
			
		||||
        sort_index=26,
 | 
			
		||||
        select_items=[('fill_method', 'auto_fill'), ('fill_method', 'guided_fill'),
 | 
			
		||||
                      ('fill_method', 'legacy_fill')],
 | 
			
		||||
        default=False)
 | 
			
		||||
| 
						 | 
				
			
			@ -246,59 +324,24 @@ class FillStitch(EmbroideryElement):
 | 
			
		|||
        tooltip=_('The flip option can help you with routing your stitch path.  '
 | 
			
		||||
                  'When you enable flip, stitching goes from right-to-left instead of left-to-right.'),
 | 
			
		||||
        type='boolean',
 | 
			
		||||
        sort_index=7,
 | 
			
		||||
        sort_index=27,
 | 
			
		||||
        select_items=[('fill_method', 'legacy_fill')],
 | 
			
		||||
        default=False)
 | 
			
		||||
    def flip(self):
 | 
			
		||||
        return self.get_boolean_param("flip", False)
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    @param('row_spacing_mm',
 | 
			
		||||
           _('Spacing between rows'),
 | 
			
		||||
           tooltip=_('Distance between rows of stitches.'),
 | 
			
		||||
           unit='mm',
 | 
			
		||||
           sort_index=6,
 | 
			
		||||
           type='float',
 | 
			
		||||
           select_items=[('fill_method', 'auto_fill'),
 | 
			
		||||
                         ('fill_method', 'contour_fill'),
 | 
			
		||||
                         ('fill_method', 'guided_fill'),
 | 
			
		||||
                         ('fill_method', 'circular_fill'),
 | 
			
		||||
                         ('fill_method', 'legacy_fill')],
 | 
			
		||||
           default=0.25)
 | 
			
		||||
    def row_spacing(self):
 | 
			
		||||
        return max(self.get_float_param("row_spacing_mm", 0.25), 0.1 * PIXELS_PER_MM)
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def end_row_spacing(self):
 | 
			
		||||
        return self.get_float_param("end_row_spacing_mm")
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    @param('max_stitch_length_mm',
 | 
			
		||||
           _('Maximum fill stitch length'),
 | 
			
		||||
           tooltip=_(
 | 
			
		||||
               'The length of each stitch in a row.  Shorter stitch may be used at the start or end of a row.'),
 | 
			
		||||
           unit='mm',
 | 
			
		||||
           sort_index=6,
 | 
			
		||||
           type='float',
 | 
			
		||||
           select_items=[('fill_method', 'auto_fill'),
 | 
			
		||||
                         ('fill_method', 'contour_fill'),
 | 
			
		||||
                         ('fill_method', 'guided_fill'),
 | 
			
		||||
                         ('fill_method', 'legacy_fill')],
 | 
			
		||||
           default=3.0)
 | 
			
		||||
    def max_stitch_length(self):
 | 
			
		||||
        return max(self.get_float_param("max_stitch_length_mm", 3.0), 0.1 * PIXELS_PER_MM)
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    @param('staggers',
 | 
			
		||||
           _('Stagger rows this many times before repeating'),
 | 
			
		||||
           tooltip=_('Length of the cycle by which successive stitch rows are staggered. '
 | 
			
		||||
                     'Fractional values are allowed and can have less visible diagonals than integer values.'),
 | 
			
		||||
           type='int',
 | 
			
		||||
           sort_index=6,
 | 
			
		||||
           select_items=[('fill_method', 'auto_fill'), ('fill_method', 'guided_fill'), ('fill_method', 'legacy_fill')],
 | 
			
		||||
           default=4)
 | 
			
		||||
    def staggers(self):
 | 
			
		||||
        return self.get_float_param("staggers", 4)
 | 
			
		||||
    @param('underpath',
 | 
			
		||||
           _('Underpath'),
 | 
			
		||||
           tooltip=_('Travel inside the shape when moving from section to section.  Underpath '
 | 
			
		||||
                     'stitches avoid traveling in the direction of the row angle so that they '
 | 
			
		||||
                     'are not visible.  This gives them a jagged appearance.'),
 | 
			
		||||
           type='boolean',
 | 
			
		||||
           default=True,
 | 
			
		||||
           select_items=[('fill_method', 'auto_fill'), ('fill_method', 'guided_fill'), ('fill_method', 'circular_fill')],
 | 
			
		||||
           sort_index=30)
 | 
			
		||||
    def underpath(self):
 | 
			
		||||
        return self.get_boolean_param('underpath', True)
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    @param('running_stitch_length_mm',
 | 
			
		||||
| 
						 | 
				
			
			@ -312,7 +355,7 @@ class FillStitch(EmbroideryElement):
 | 
			
		|||
                         ('fill_method', 'guided_fill'),
 | 
			
		||||
                         ('fill_method', 'meander_fill'),
 | 
			
		||||
                         ('fill_method', 'circular_fill')],
 | 
			
		||||
           sort_index=6)
 | 
			
		||||
           sort_index=31)
 | 
			
		||||
    def running_stitch_length(self):
 | 
			
		||||
        return max(self.get_float_param("running_stitch_length_mm", 1.5), 0.01)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -325,7 +368,7 @@ class FillStitch(EmbroideryElement):
 | 
			
		|||
           unit='mm',
 | 
			
		||||
           type='float',
 | 
			
		||||
           default=0.2,
 | 
			
		||||
           sort_index=6)
 | 
			
		||||
           sort_index=32)
 | 
			
		||||
    def running_stitch_tolerance(self):
 | 
			
		||||
        return max(self.get_float_param("running_stitch_tolerance_mm", 0.2), 0.01)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -336,7 +379,7 @@ class FillStitch(EmbroideryElement):
 | 
			
		|||
           type='int',
 | 
			
		||||
           default="1",
 | 
			
		||||
           select_items=[('fill_method', 'meander_fill')],
 | 
			
		||||
           sort_index=7)
 | 
			
		||||
           sort_index=33)
 | 
			
		||||
    def repeats(self):
 | 
			
		||||
        return max(1, self.get_int_param("repeats", 1))
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -350,10 +393,15 @@ class FillStitch(EmbroideryElement):
 | 
			
		|||
           type='str',
 | 
			
		||||
           select_items=[('fill_method', 'meander_fill')],
 | 
			
		||||
           default=0,
 | 
			
		||||
           sort_index=8)
 | 
			
		||||
           sort_index=34)
 | 
			
		||||
    def bean_stitch_repeats(self):
 | 
			
		||||
        return self.get_multiple_int_param("bean_stitch_repeats", "0")
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def color(self):
 | 
			
		||||
        # SVG spec says the default fill is black
 | 
			
		||||
        return self.get_style("fill", "#000000")
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    @param('fill_underlay', _('Underlay'), type='toggle', group=_('Fill Underlay'), default=True)
 | 
			
		||||
    def fill_underlay(self):
 | 
			
		||||
| 
						 | 
				
			
			@ -428,44 +476,6 @@ class FillStitch(EmbroideryElement):
 | 
			
		|||
    def fill_underlay_skip_last(self):
 | 
			
		||||
        return self.get_boolean_param("fill_underlay_skip_last", False)
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    @param('expand_mm',
 | 
			
		||||
           _('Expand'),
 | 
			
		||||
           tooltip=_('Expand the shape before fill stitching, to compensate for gaps between shapes.  Negative values contract instead.'),
 | 
			
		||||
           unit='mm',
 | 
			
		||||
           type='float',
 | 
			
		||||
           default=0,
 | 
			
		||||
           sort_index=5,
 | 
			
		||||
           select_items=[('fill_method', 'auto_fill'),
 | 
			
		||||
                         ('fill_method', 'guided_fill'),
 | 
			
		||||
                         ('fill_method', 'meander_fill'),
 | 
			
		||||
                         ('fill_method', 'circular_fill')])
 | 
			
		||||
    def expand(self):
 | 
			
		||||
        return self.get_float_param('expand_mm', 0)
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    @param('clip', _('Clip path'),
 | 
			
		||||
           tooltip=_('Constrain stitching to the shape.  Useful when smoothing and expand are used.'),
 | 
			
		||||
           type='boolean',
 | 
			
		||||
           default=False,
 | 
			
		||||
           select_items=[('fill_method', 'meander_fill')],
 | 
			
		||||
           sort_index=6)
 | 
			
		||||
    def clip(self):
 | 
			
		||||
        return self.get_boolean_param('clip', False)
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    @param('underpath',
 | 
			
		||||
           _('Underpath'),
 | 
			
		||||
           tooltip=_('Travel inside the shape when moving from section to section.  Underpath '
 | 
			
		||||
                     'stitches avoid traveling in the direction of the row angle so that they '
 | 
			
		||||
                     'are not visible.  This gives them a jagged appearance.'),
 | 
			
		||||
           type='boolean',
 | 
			
		||||
           default=True,
 | 
			
		||||
           select_items=[('fill_method', 'auto_fill'), ('fill_method', 'guided_fill'), ('fill_method', 'circular_fill')],
 | 
			
		||||
           sort_index=6)
 | 
			
		||||
    def underpath(self):
 | 
			
		||||
        return self.get_boolean_param('underpath', True)
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    @param(
 | 
			
		||||
        'underlay_underpath',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Ładowanie…
	
		Reference in New Issue