kopia lustrzana https://github.com/inkstitch/inkstitch
				
				
				
			Add bean stitch repeat pattern (#1938)
! backward compatibility warning: Users need to fix their documents if they used comma separated values for multiple fill underlays (without a space)pull/2020/head
							rodzic
							
								
									4156c4adb4
								
							
						
					
					
						commit
						1cdb3538a8
					
				|  | @ -162,6 +162,16 @@ class EmbroideryElement(object): | |||
|     def get_split_mm_param_as_px(self, param, default): | ||||
|         return self.get_split_float_param(param, default) * PIXELS_PER_MM | ||||
| 
 | ||||
|     # returns an array of multiple space separated int values | ||||
|     @cache | ||||
|     def get_multiple_int_param(self, param, default="0"): | ||||
|         params = self.get_param(param, default).split(" ") | ||||
|         try: | ||||
|             params = [int(param) for param in params] | ||||
|         except (TypeError, ValueError): | ||||
|             return [default] | ||||
|         return params | ||||
| 
 | ||||
|     def set_param(self, name, value): | ||||
|         # Sets a param on the node backing this element. Used by params dialog. | ||||
|         # After calling, this element is invalid due to caching and must be re-created to use the new value. | ||||
|  |  | |||
|  | @ -405,7 +405,7 @@ class FillStitch(EmbroideryElement): | |||
|     @property | ||||
|     @param('fill_underlay_angle', | ||||
|            _('Fill angle'), | ||||
|            tooltip=_('Default: fill angle + 90 deg. Insert comma-seperated list for multiple layers.'), | ||||
|            tooltip=_('Default: fill angle + 90 deg. Insert a list for multiple layers separated by a space.'), | ||||
|            unit='deg', | ||||
|            group=_('Fill Underlay'), | ||||
|            type='float') | ||||
|  | @ -414,7 +414,9 @@ class FillStitch(EmbroideryElement): | |||
|         underlay_angles = self.get_param('fill_underlay_angle', None) | ||||
|         default_value = [self.angle + math.pi / 2.0] | ||||
|         if underlay_angles is not None: | ||||
|             underlay_angles = underlay_angles.strip().split(',') | ||||
|             underlay_angles = underlay_angles.strip().split(' ') | ||||
|             # remove comma separator for backward compatibility | ||||
|             underlay_angles = [angle[:-1] if angle.endswith(',') else angle for angle in underlay_angles] | ||||
|             try: | ||||
|                 underlay_angles = [math.radians( | ||||
|                     float(angle)) for angle in underlay_angles] | ||||
|  |  | |||
|  | @ -112,12 +112,13 @@ class Stroke(EmbroideryElement): | |||
|         _('Bean stitch number of repeats'), | ||||
|         tooltip=_('Backtrack each stitch this many times.  ' | ||||
|                   'A value of 1 would triple each stitch (forward, back, forward).  ' | ||||
|                   'A value of 2 would quintuple each stitch, etc.'), | ||||
|         type='int', | ||||
|                   'A value of 2 would quintuple each stitch, etc.\n\n' | ||||
|                   'A pattern with various repeats can be created with a list of values separated by a space.'), | ||||
|         type='str', | ||||
|         default=0, | ||||
|         sort_index=3) | ||||
|     def bean_stitch_repeats(self): | ||||
|         return self.get_int_param("bean_stitch_repeats", 0) | ||||
|         return self.get_multiple_int_param("bean_stitch_repeats", "0") | ||||
| 
 | ||||
|     @property | ||||
|     @param('running_stitch_length_mm', | ||||
|  | @ -463,7 +464,7 @@ class Stroke(EmbroideryElement): | |||
|         if self.stroke_method == 1: | ||||
|             patch = self.ripple_stitch() | ||||
|             if patch: | ||||
|                 if self.bean_stitch_repeats > 0: | ||||
|                 if any(self.bean_stitch_repeats): | ||||
|                     patch.stitches = self.do_bean_repeats(patch.stitches) | ||||
|                 patches.append(patch) | ||||
|         else: | ||||
|  | @ -475,7 +476,8 @@ class Stroke(EmbroideryElement): | |||
|                 # running stitch | ||||
|                 elif self.is_running_stitch(): | ||||
|                     patch = self.running_stitch(path, self.running_stitch_length, self.running_stitch_tolerance) | ||||
|                     if self.bean_stitch_repeats > 0: | ||||
|                     # bean stitch | ||||
|                     if any(self.bean_stitch_repeats): | ||||
|                         patch.stitches = self.do_bean_repeats(patch.stitches) | ||||
|                 # simple satin | ||||
|                 else: | ||||
|  |  | |||
|  | @ -117,24 +117,35 @@ def running_stitch(points, stitch_length, tolerance): | |||
| def bean_stitch(stitches, repeats): | ||||
|     """Generate bean stitch from a set of stitches. | ||||
| 
 | ||||
|     "Bean" stitch is made by backtracking each stitch to make it heaver.  A | ||||
|     "Bean" stitch is made by backtracking each stitch to make it heavier.  A | ||||
|     simple bean stitch would be two stitches forward, one stitch back, two | ||||
|     stitches forward, etc.  This would result in each stitch being tripled. | ||||
| 
 | ||||
|     We'll say that the above counts as 1 repeat.  Backtracking each stitch | ||||
|     repeatedly will result in a heavier bean stitch.  There will always be | ||||
|     an odd number of threads piled up for each stitch. | ||||
| 
 | ||||
|     Repeats is a list of a repeated pattern e.g. [0, 1, 3] doesn't repeat the first stitch, | ||||
|     goes back and forth on the second stitch, goes goes 3 times back and forth on the third stitch, | ||||
|     and starts the pattern again by not repeating the fourth stitch, etc. | ||||
|     """ | ||||
| 
 | ||||
|     if len(stitches) < 2: | ||||
|         return stitches | ||||
| 
 | ||||
|     repeat_list_length = len(repeats) | ||||
|     repeat_list_pos = 0 | ||||
| 
 | ||||
|     new_stitches = [stitches[0]] | ||||
| 
 | ||||
|     for stitch in stitches: | ||||
|         new_stitches.append(stitch) | ||||
| 
 | ||||
|         for i in range(repeats): | ||||
|         for i in range(repeats[repeat_list_pos]): | ||||
|             new_stitches.extend(copy(new_stitches[-2:])) | ||||
| 
 | ||||
|         repeat_list_pos += 1 | ||||
|         if repeat_list_pos == repeat_list_length: | ||||
|             repeat_list_pos = 0 | ||||
| 
 | ||||
|     return new_stitches | ||||
|  |  | |||
		Ładowanie…
	
		Reference in New Issue
	
	 Kaalleen
						Kaalleen