kopia lustrzana https://github.com/inkstitch/inkstitch
				
				
				
			cache key includes previous stitch
							rodzic
							
								
									d51feec98d
								
							
						
					
					
						commit
						20e419d795
					
				|  | @ -391,13 +391,29 @@ class EmbroideryElement(object): | |||
|         raise NotImplementedError("%s must implement to_stitch_groups()" % self.__class__.__name__) | ||||
| 
 | ||||
|     @debug.time | ||||
|     def _load_cached_stitch_groups(self): | ||||
|         return get_stitch_plan_cache().get(self._get_cache_key()) | ||||
|     def _load_cached_stitch_groups(self, previous_stitch): | ||||
|         if not self.uses_previous_stitch(): | ||||
|             # we don't care about the previous stitch | ||||
|             previous_stitch = None | ||||
| 
 | ||||
|         return get_stitch_plan_cache().get(self._get_cache_key(previous_stitch)) | ||||
| 
 | ||||
|     def uses_previous_stitch(self): | ||||
|         """Returns True if the previous stitch can affect this Element's stitches. | ||||
| 
 | ||||
|         This function may be overridden in a subclass. | ||||
|         """ | ||||
|         return False | ||||
| 
 | ||||
|     @debug.time | ||||
|     def _save_cached_stitch_groups(self, stitch_groups): | ||||
|     def _save_cached_stitch_groups(self, stitch_groups, previous_stitch): | ||||
|         stitch_plan_cache = get_stitch_plan_cache() | ||||
|         stitch_plan_cache[self._get_cache_key()] = stitch_groups | ||||
|         stitch_plan_cache[self._get_cache_key(previous_stitch)] = stitch_groups | ||||
| 
 | ||||
|         if previous_stitch is not None: | ||||
|             # Also store it with None as the previous stitch, so that it can be used next time | ||||
|             # if we don't care about the previous stitch | ||||
|             stitch_plan_cache[self._get_cache_key(None)] = stitch_groups | ||||
| 
 | ||||
|     def get_params_and_values(self): | ||||
|         params = {} | ||||
|  | @ -406,18 +422,24 @@ class EmbroideryElement(object): | |||
| 
 | ||||
|         return params | ||||
| 
 | ||||
|     @cache | ||||
|     def _get_cache_key(self): | ||||
|     def _get_cache_key(self, previous_stitch): | ||||
|         cache_key_generator = CacheKeyGenerator() | ||||
|         cache_key_generator.update(self.__class__.__name__) | ||||
|         cache_key_generator.update(self.get_params_and_values()) | ||||
|         cache_key_generator.update(self.parse_path()) | ||||
|         cache_key_generator.update(list(self._get_specified_style().items())) | ||||
|         cache_key_generator.update(previous_stitch) | ||||
| 
 | ||||
|         # TODO: include commands and patterns that apply to this element | ||||
| 
 | ||||
|         return cache_key_generator.get_cache_key() | ||||
| 
 | ||||
|     def embroider(self, last_stitch_group): | ||||
|         stitch_groups = self._load_cached_stitch_groups() | ||||
|         if last_stitch_group: | ||||
|             previous_stitch = last_stitch_group.stitches[-1] | ||||
|         else: | ||||
|             previous_stitch = None | ||||
|         stitch_groups = self._load_cached_stitch_groups(previous_stitch) | ||||
| 
 | ||||
|         if not stitch_groups: | ||||
|             self.validate() | ||||
|  | @ -433,7 +455,7 @@ class EmbroideryElement(object): | |||
|                 stitch_groups[-1].trim_after = self.has_command("trim") or self.trim_after | ||||
|                 stitch_groups[-1].stop_after = self.has_command("stop") or self.stop_after | ||||
| 
 | ||||
|             self._save_cached_stitch_groups(stitch_groups) | ||||
|             self._save_cached_stitch_groups(stitch_groups, previous_stitch) | ||||
| 
 | ||||
|         return stitch_groups | ||||
| 
 | ||||
|  |  | |||
|  | @ -530,24 +530,30 @@ class FillStitch(EmbroideryElement): | |||
|     def fill_shape(self, shape): | ||||
|         return self.shrink_or_grow_shape(shape, self.expand) | ||||
| 
 | ||||
|     def get_starting_point(self, last_patch): | ||||
|     def get_starting_point(self, previous_stitch_group): | ||||
|         # If there is a "fill_start" Command, then use that; otherwise pick | ||||
|         # the point closest to the end of the last patch. | ||||
| 
 | ||||
|         if self.get_command('fill_start'): | ||||
|             return self.get_command('fill_start').target_point | ||||
|         elif last_patch: | ||||
|             return last_patch.stitches[-1] | ||||
|         elif previous_stitch_group: | ||||
|             return previous_stitch_group.stitches[-1] | ||||
|         else: | ||||
|             return None | ||||
| 
 | ||||
|     def uses_previous_stitch(self): | ||||
|         if self.get_command('fill_start'): | ||||
|             return False | ||||
|         else: | ||||
|             return True | ||||
| 
 | ||||
|     def get_ending_point(self): | ||||
|         if self.get_command('fill_end'): | ||||
|             return self.get_command('fill_end').target_point | ||||
|         else: | ||||
|             return None | ||||
| 
 | ||||
|     def to_stitch_groups(self, last_patch):  # noqa: C901 | ||||
|     def to_stitch_groups(self, previous_stitch_group):  # noqa: C901 | ||||
|         # backwards compatibility: legacy_fill used to be inkstitch:auto_fill == False | ||||
|         if not self.auto_fill or self.fill_method == 3: | ||||
|             return self.do_legacy_fill() | ||||
|  | @ -556,7 +562,7 @@ class FillStitch(EmbroideryElement): | |||
|             end = self.get_ending_point() | ||||
| 
 | ||||
|             for shape in self.shape.geoms: | ||||
|                 start = self.get_starting_point(last_patch) | ||||
|                 start = self.get_starting_point(previous_stitch_group) | ||||
|                 try: | ||||
|                     if self.fill_underlay: | ||||
|                         underlay_shapes = self.underlay_shape(shape) | ||||
|  | @ -567,16 +573,16 @@ class FillStitch(EmbroideryElement): | |||
|                     fill_shapes = self.fill_shape(shape) | ||||
|                     for fill_shape in fill_shapes.geoms: | ||||
|                         if self.fill_method == 0: | ||||
|                             stitch_groups.extend(self.do_auto_fill(fill_shape, last_patch, start, end)) | ||||
|                             stitch_groups.extend(self.do_auto_fill(fill_shape, previous_stitch_group, start, end)) | ||||
|                         if self.fill_method == 1: | ||||
|                             stitch_groups.extend(self.do_contour_fill(fill_shape, last_patch, start)) | ||||
|                             stitch_groups.extend(self.do_contour_fill(fill_shape, previous_stitch_group, start)) | ||||
|                         elif self.fill_method == 2: | ||||
|                             stitch_groups.extend(self.do_guided_fill(fill_shape, last_patch, start, end)) | ||||
|                             stitch_groups.extend(self.do_guided_fill(fill_shape, previous_stitch_group, start, end)) | ||||
|                 except ExitThread: | ||||
|                     raise | ||||
|                 except Exception: | ||||
|                     self.fatal_fill_error() | ||||
|                 last_patch = stitch_groups[-1] | ||||
|                 previous_stitch_group = stitch_groups[-1] | ||||
| 
 | ||||
|             return stitch_groups | ||||
| 
 | ||||
|  |  | |||
		Ładowanie…
	
		Reference in New Issue
	
	 Lex Neva
						Lex Neva