valetudo-map-parser 0.1.9b29__tar.gz → 0.1.9b31__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (21) hide show
  1. {valetudo_map_parser-0.1.9b29 → valetudo_map_parser-0.1.9b31}/PKG-INFO +1 -1
  2. {valetudo_map_parser-0.1.9b29 → valetudo_map_parser-0.1.9b31}/SCR/valetudo_map_parser/config/auto_crop.py +113 -84
  3. {valetudo_map_parser-0.1.9b29 → valetudo_map_parser-0.1.9b31}/SCR/valetudo_map_parser/config/colors_man.py +1 -0
  4. {valetudo_map_parser-0.1.9b29 → valetudo_map_parser-0.1.9b31}/SCR/valetudo_map_parser/config/types.py +1 -1
  5. {valetudo_map_parser-0.1.9b29 → valetudo_map_parser-0.1.9b31}/SCR/valetudo_map_parser/hypfer_handler.py +4 -16
  6. {valetudo_map_parser-0.1.9b29 → valetudo_map_parser-0.1.9b31}/SCR/valetudo_map_parser/rand25_handler.py +6 -17
  7. {valetudo_map_parser-0.1.9b29 → valetudo_map_parser-0.1.9b31}/pyproject.toml +1 -1
  8. {valetudo_map_parser-0.1.9b29 → valetudo_map_parser-0.1.9b31}/LICENSE +0 -0
  9. {valetudo_map_parser-0.1.9b29 → valetudo_map_parser-0.1.9b31}/NOTICE.txt +0 -0
  10. {valetudo_map_parser-0.1.9b29 → valetudo_map_parser-0.1.9b31}/README.md +0 -0
  11. {valetudo_map_parser-0.1.9b29 → valetudo_map_parser-0.1.9b31}/SCR/valetudo_map_parser/__init__.py +0 -0
  12. {valetudo_map_parser-0.1.9b29 → valetudo_map_parser-0.1.9b31}/SCR/valetudo_map_parser/config/__init__.py +0 -0
  13. {valetudo_map_parser-0.1.9b29 → valetudo_map_parser-0.1.9b31}/SCR/valetudo_map_parser/config/colors.py +0 -0
  14. {valetudo_map_parser-0.1.9b29 → valetudo_map_parser-0.1.9b31}/SCR/valetudo_map_parser/config/drawable.py +0 -0
  15. {valetudo_map_parser-0.1.9b29 → valetudo_map_parser-0.1.9b31}/SCR/valetudo_map_parser/config/rand25_parser.py +0 -0
  16. {valetudo_map_parser-0.1.9b29 → valetudo_map_parser-0.1.9b31}/SCR/valetudo_map_parser/config/shared.py +0 -0
  17. {valetudo_map_parser-0.1.9b29 → valetudo_map_parser-0.1.9b31}/SCR/valetudo_map_parser/config/utils.py +0 -0
  18. {valetudo_map_parser-0.1.9b29 → valetudo_map_parser-0.1.9b31}/SCR/valetudo_map_parser/hypfer_draw.py +0 -0
  19. {valetudo_map_parser-0.1.9b29 → valetudo_map_parser-0.1.9b31}/SCR/valetudo_map_parser/map_data.py +0 -0
  20. {valetudo_map_parser-0.1.9b29 → valetudo_map_parser-0.1.9b31}/SCR/valetudo_map_parser/py.typed +0 -0
  21. {valetudo_map_parser-0.1.9b29 → valetudo_map_parser-0.1.9b31}/SCR/valetudo_map_parser/reimg_draw.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: valetudo-map-parser
3
- Version: 0.1.9b29
3
+ Version: 0.1.9b31
4
4
  Summary: A Python library to parse Valetudo map data returning a PIL Image object.
5
5
  License: Apache-2.0
6
6
  Author: Sandro Cantarella
@@ -9,6 +9,7 @@ import numpy as np
9
9
  from numpy import rot90
10
10
 
11
11
  from .types import Color, NumpyArray, TrimCropData, TrimsData
12
+ from .utils import BaseHandler
12
13
 
13
14
 
14
15
  _LOGGER = logging.getLogger(__name__)
@@ -25,10 +26,20 @@ class TrimError(Exception):
25
26
  class AutoCrop:
26
27
  """Auto Crop Class for trimming and zooming images."""
27
28
 
28
- def __init__(self, image_handler, shared):
29
- self.imh = image_handler
30
- self.file_name = shared.file_name
31
- self.shared = shared
29
+ def __init__(self, handler: BaseHandler):
30
+ self.auto_crop = None # auto crop data to be calculate once.
31
+ self.crop_area = None
32
+ self.handler = handler
33
+ trim_data = self.handler.shared.trims.to_dict() # trims data
34
+ _LOGGER.debug("Trim Data: %s", str(trim_data))
35
+ self.trim_up = trim_data.get("trim_up", 0) # trim up
36
+ self.trim_down = trim_data.get("trim_down", 0) # trim down
37
+ self.trim_left = trim_data.get("trim_left", 0) # trim left
38
+ self.trim_right = trim_data.get("trim_right", 0) # trim right
39
+ self.offset_top = self.handler.shared.offset_top # offset top
40
+ self.offset_bottom = self.handler.shared.offset_down # offset bottom
41
+ self.offset_left = self.handler.shared.offset_left # offset left
42
+ self.offset_right = self.handler.shared.offset_right # offset right
32
43
 
33
44
  @staticmethod
34
45
  def validate_crop_dimensions(shared):
@@ -47,8 +58,8 @@ class AutoCrop:
47
58
  ):
48
59
  """Check if the trim is okay."""
49
60
  if trimmed_height <= margin_size or trimmed_width <= margin_size:
50
- self.imh.crop_area = [0, 0, image_array.shape[1], image_array.shape[0]]
51
- self.imh.img_size = (image_array.shape[1], image_array.shape[0])
61
+ self.crop_area = [0, 0, image_array.shape[1], image_array.shape[0]]
62
+ self.handler.img_size = (image_array.shape[1], image_array.shape[0])
52
63
  raise TrimError(
53
64
  f"{file_name}: Trimming failed at rotation {rotate}.", image_array
54
65
  )
@@ -56,62 +67,65 @@ class AutoCrop:
56
67
  def _calculate_trimmed_dimensions(self):
57
68
  """Calculate and update the dimensions after trimming."""
58
69
  trimmed_width = max(
59
- 0,
60
- (
61
- (self.imh.trim_right - self.imh.offset_right)
62
- - (self.imh.trim_left + self.imh.offset_left)
63
- ),
70
+ 1, # Ensure at least 1px
71
+ (self.trim_right - self.offset_right) - (self.trim_left + self.offset_left),
64
72
  )
65
73
  trimmed_height = max(
66
- 0,
67
- (
68
- (self.imh.trim_down - self.imh.offset_bottom)
69
- - (self.imh.trim_up + self.imh.offset_top)
70
- ),
74
+ 1, # Ensure at least 1px
75
+ (self.trim_down - self.offset_bottom) - (self.trim_up + self.offset_top),
71
76
  )
77
+
72
78
  # Ensure shared reference dimensions are updated
73
- if hasattr(self.shared, "image_ref_height") and hasattr(
74
- self.shared, "image_ref_width"
79
+ if hasattr(self.handler.shared, "image_ref_height") and hasattr(
80
+ self.handler.shared, "image_ref_width"
75
81
  ):
76
- self.shared.image_ref_height = trimmed_height
77
- self.shared.image_ref_width = trimmed_width
82
+ self.handler.shared.image_ref_height = trimmed_height
83
+ self.handler.shared.image_ref_width = trimmed_width
78
84
  else:
79
85
  _LOGGER.warning(
80
86
  "Shared attributes for image dimensions are not initialized."
81
87
  )
88
+
82
89
  return trimmed_width, trimmed_height
83
90
 
84
91
  async def _async_auto_crop_data(self, tdata: TrimsData): # , tdata=None
85
92
  """Load the auto crop data from the Camera config."""
86
- if not self.imh.auto_crop:
93
+ if not self.auto_crop:
87
94
  trims_data = TrimCropData.from_dict(dict(tdata.to_dict())).to_list()
88
95
  (
89
- self.imh.trim_left,
90
- self.imh.trim_up,
91
- self.imh.trim_right,
92
- self.imh.trim_down,
96
+ self.trim_left,
97
+ self.trim_up,
98
+ self.trim_right,
99
+ self.trim_down,
93
100
  ) = trims_data
94
101
  self._calculate_trimmed_dimensions()
95
102
  return trims_data
103
+ _LOGGER.debug("No Crop data found in the Camera config.")
96
104
  return None
97
105
 
98
106
  def auto_crop_offset(self):
99
107
  """Calculate the offset for the auto crop."""
100
- if self.imh.auto_crop:
101
- self.imh.auto_crop[0] += self.imh.offset_left
102
- self.imh.auto_crop[1] += self.imh.offset_top
103
- self.imh.auto_crop[2] -= self.imh.offset_right
104
- self.imh.auto_crop[3] -= self.imh.offset_bottom
108
+ if self.auto_crop:
109
+ self.auto_crop[0] += self.offset_left
110
+ self.auto_crop[1] += self.offset_top
111
+ self.auto_crop[2] -= self.offset_right
112
+ self.auto_crop[3] -= self.offset_bottom
105
113
 
106
114
  async def _init_auto_crop(self):
107
115
  """Initialize the auto crop data."""
108
- if not self.imh.auto_crop and self.shared.vacuum_state == "docked":
109
- self.imh.auto_crop = await self._async_auto_crop_data(self.shared.trims)
110
- if self.imh.auto_crop:
116
+ if not self.auto_crop and self.handler.shared.vacuum_state == "docked":
117
+ self.auto_crop = await self._async_auto_crop_data(self.handler.shared.trims)
118
+ if self.auto_crop:
111
119
  self.auto_crop_offset()
112
120
  else:
113
- self.imh.max_frames = 5
114
- return self.imh.auto_crop
121
+ self.handler.max_frames = 5
122
+
123
+ # Fallback: Ensure auto_crop is valid
124
+ if not self.auto_crop or any(v < 0 for v in self.auto_crop):
125
+ _LOGGER.debug("Auto-crop data unavailable. Scanning full image.")
126
+ self.auto_crop = None
127
+
128
+ return self.auto_crop
115
129
 
116
130
  async def async_image_margins(
117
131
  self, image_array: NumpyArray, detect_colour: Color
@@ -124,7 +138,7 @@ class AutoCrop:
124
138
  del nonzero_coords
125
139
  _LOGGER.debug(
126
140
  "%s: Found trims max and min values (y,x) (%s, %s) (%s, %s)...",
127
- self.file_name,
141
+ self.handler.file_name,
128
142
  int(max_y),
129
143
  int(max_x),
130
144
  int(min_y),
@@ -139,38 +153,53 @@ class AutoCrop:
139
153
  zoom: bool = False,
140
154
  rand256: bool = False,
141
155
  ) -> NumpyArray:
142
- """Check if the image need to be zoom."""
156
+ """Check if the image needs to be zoomed."""
143
157
 
144
158
  if (
145
159
  zoom
146
- and self.shared.vacuum_state == "cleaning"
147
- and self.shared.image_auto_zoom
160
+ and self.handler.shared.vacuum_state == "cleaning"
161
+ and self.handler.shared.image_auto_zoom
148
162
  ):
149
- # Zoom the image based on the robot's position.
150
163
  _LOGGER.debug(
151
164
  "%s: Zooming the image on room %s.",
152
- self.file_name,
153
- self.imh.robot_in_room["room"],
165
+ self.handler.file_name,
166
+ self.handler.robot_in_room["room"],
154
167
  )
168
+
155
169
  if rand256:
156
- trim_left = round(self.imh.robot_in_room["right"] / 10) - margin_size
157
- trim_right = round(self.imh.robot_in_room["left"] / 10) + margin_size
158
- trim_up = round(self.imh.robot_in_room["down"] / 10) - margin_size
159
- trim_down = round(self.imh.robot_in_room["up"] / 10) + margin_size
170
+ trim_left = (
171
+ round(self.handler.robot_in_room["right"] / 10) - margin_size
172
+ )
173
+ trim_right = (
174
+ round(self.handler.robot_in_room["left"] / 10) + margin_size
175
+ )
176
+ trim_up = round(self.handler.robot_in_room["down"] / 10) - margin_size
177
+ trim_down = round(self.handler.robot_in_room["up"] / 10) + margin_size
160
178
  else:
161
- trim_left = self.imh.robot_in_room["left"] - margin_size
162
- trim_right = self.imh.robot_in_room["right"] + margin_size
163
- trim_up = self.imh.robot_in_room["up"] - margin_size
164
- trim_down = self.imh.robot_in_room["down"] + margin_size
179
+ trim_left = self.handler.robot_in_room["left"] - margin_size
180
+ trim_right = self.handler.robot_in_room["right"] + margin_size
181
+ trim_up = self.handler.robot_in_room["up"] - margin_size
182
+ trim_down = self.handler.robot_in_room["down"] + margin_size
183
+
184
+ # Ensure valid trim values
165
185
  trim_left, trim_right = sorted([trim_left, trim_right])
166
186
  trim_up, trim_down = sorted([trim_up, trim_down])
187
+
188
+ # Prevent zero-sized images
189
+ if trim_right - trim_left < 1 or trim_down - trim_up < 1:
190
+ _LOGGER.warning(
191
+ "Zooming resulted in an invalid crop area. Using full image."
192
+ )
193
+ return image_array # Return original image
194
+
167
195
  trimmed = image_array[trim_up:trim_down, trim_left:trim_right]
196
+
168
197
  else:
169
- # Apply the auto-calculated trims to the rotated image
170
198
  trimmed = image_array[
171
- self.imh.auto_crop[1] : self.imh.auto_crop[3],
172
- self.imh.auto_crop[0] : self.imh.auto_crop[2],
199
+ self.auto_crop[1] : self.auto_crop[3],
200
+ self.auto_crop[0] : self.auto_crop[2],
173
201
  ]
202
+
174
203
  return trimmed
175
204
 
176
205
  async def async_rotate_the_image(
@@ -179,26 +208,26 @@ class AutoCrop:
179
208
  """Rotate the image and return the new array."""
180
209
  if rotate == 90:
181
210
  rotated = rot90(trimmed)
182
- self.imh.crop_area = [
183
- self.imh.trim_left,
184
- self.imh.trim_up,
185
- self.imh.trim_right,
186
- self.imh.trim_down,
211
+ self.crop_area = [
212
+ self.trim_left,
213
+ self.trim_up,
214
+ self.trim_right,
215
+ self.trim_down,
187
216
  ]
188
217
  elif rotate == 180:
189
218
  rotated = rot90(trimmed, 2)
190
- self.imh.crop_area = self.imh.auto_crop
219
+ self.crop_area = self.auto_crop
191
220
  elif rotate == 270:
192
221
  rotated = rot90(trimmed, 3)
193
- self.imh.crop_area = [
194
- self.imh.trim_left,
195
- self.imh.trim_up,
196
- self.imh.trim_right,
197
- self.imh.trim_down,
222
+ self.crop_area = [
223
+ self.trim_left,
224
+ self.trim_up,
225
+ self.trim_right,
226
+ self.trim_down,
198
227
  ]
199
228
  else:
200
229
  rotated = trimmed
201
- self.imh.crop_area = self.imh.auto_crop
230
+ self.crop_area = self.auto_crop
202
231
  return rotated
203
232
 
204
233
  async def async_auto_trim_and_zoom_image(
@@ -214,18 +243,18 @@ class AutoCrop:
214
243
  Automatically crops and trims a numpy array and returns the processed image.
215
244
  """
216
245
  try:
217
- await self._init_auto_crop()
218
- if self.imh.auto_crop is None:
219
- _LOGGER.debug("%s: Calculating auto trim box", self.file_name)
246
+ self.auto_crop = await self._init_auto_crop()
247
+ if self.auto_crop is None:
248
+ _LOGGER.debug("%s: Calculating auto trim box", self.handler.file_name)
220
249
  # Find the coordinates of the first occurrence of a non-background color
221
250
  min_y, min_x, max_x, max_y = await self.async_image_margins(
222
251
  image_array, detect_colour
223
252
  )
224
253
  # Calculate and store the trims coordinates with margins
225
- self.imh.trim_left = int(min_x) - margin_size
226
- self.imh.trim_up = int(min_y) - margin_size
227
- self.imh.trim_right = int(max_x) + margin_size
228
- self.imh.trim_down = int(max_y) + margin_size
254
+ self.trim_left = int(min_x) - margin_size
255
+ self.trim_up = int(min_y) - margin_size
256
+ self.trim_right = int(max_x) + margin_size
257
+ self.trim_down = int(max_y) + margin_size
229
258
  del min_y, min_x, max_x, max_y
230
259
 
231
260
  # Calculate the dimensions after trimming using min/max values
@@ -238,20 +267,20 @@ class AutoCrop:
238
267
  trimmed_width,
239
268
  margin_size,
240
269
  image_array,
241
- self.file_name,
270
+ self.handler.file_name,
242
271
  rotate,
243
272
  )
244
273
  except TrimError as e:
245
274
  return e.image
246
275
 
247
276
  # Store Crop area of the original image_array we will use from the next frame.
248
- self.imh.auto_crop = TrimCropData(
249
- self.imh.trim_left,
250
- self.imh.trim_up,
251
- self.imh.trim_right,
252
- self.imh.trim_down,
277
+ self.auto_crop = TrimCropData(
278
+ self.trim_left,
279
+ self.trim_up,
280
+ self.trim_right,
281
+ self.trim_down,
253
282
  ).to_list()
254
- # if self.shared.vacuum_state == "docked":
283
+ # if self.handler.shared.vacuum_state == "docked":
255
284
  # await (
256
285
  # self._async_save_auto_crop_data()
257
286
  # ) # Save the crop data to the disk
@@ -265,19 +294,19 @@ class AutoCrop:
265
294
  rotated = await self.async_rotate_the_image(trimmed, rotate)
266
295
  del trimmed # Free memory.
267
296
  _LOGGER.debug(
268
- "%s: Auto Trim Box data: %s", self.file_name, self.imh.crop_area
297
+ "%s: Auto Trim Box data: %s", self.handler.file_name, self.crop_area
269
298
  )
270
- self.imh.crop_img_size = [rotated.shape[1], rotated.shape[0]]
299
+ self.handler.crop_img_size = [rotated.shape[1], rotated.shape[0]]
271
300
  _LOGGER.debug(
272
301
  "%s: Auto Trimmed image size: %s",
273
- self.file_name,
274
- self.imh.crop_img_size,
302
+ self.handler.file_name,
303
+ self.handler.crop_img_size,
275
304
  )
276
305
 
277
306
  except RuntimeError as e:
278
307
  _LOGGER.warning(
279
308
  "%s: Error %s during auto trim and zoom.",
280
- self.file_name,
309
+ self.handler.file_name,
281
310
  e,
282
311
  exc_info=True,
283
312
  )
@@ -58,6 +58,7 @@ from .types import (
58
58
  COLOR_ZONE_CLEAN,
59
59
  )
60
60
 
61
+
61
62
  color_transparent = (0, 0, 0, 0)
62
63
  color_charger = (0, 128, 0, 255)
63
64
  color_move = (238, 247, 255, 255)
@@ -6,7 +6,7 @@ Version 0.0.1
6
6
  import asyncio
7
7
  import json
8
8
  import logging
9
- from dataclasses import dataclass, asdict
9
+ from dataclasses import asdict, dataclass
10
10
  from typing import Any, Dict, Tuple, Union
11
11
 
12
12
  import numpy as np
@@ -24,7 +24,7 @@ from .map_data import ImageData
24
24
  _LOGGER = logging.getLogger(__name__)
25
25
 
26
26
 
27
- class HypferMapImageHandler(BaseHandler):
27
+ class HypferMapImageHandler(BaseHandler, AutoCrop):
28
28
  """Map Image Handler Class.
29
29
  This class is used to handle the image data and the drawing of the map."""
30
30
 
@@ -32,9 +32,8 @@ class HypferMapImageHandler(BaseHandler):
32
32
  """Initialize the Map Image Handler."""
33
33
  BaseHandler.__init__(self)
34
34
  self.shared = shared_data # camera shared data
35
- self.auto_crop = None # auto crop data to be calculate once.
35
+ AutoCrop.__init__(self, self)
36
36
  self.calibration_data = None # camera shared data.
37
- self.crop_area = None # module shared for calibration data.
38
37
  self.data = ImageData # imported Image Data Module.
39
38
  self.draw = Drawable # imported Drawing utilities
40
39
  self.go_to = None # vacuum go to data
@@ -42,18 +41,7 @@ class HypferMapImageHandler(BaseHandler):
42
41
  self.img_base_layer = None # numpy array store the map base layer.
43
42
  self.active_zones = None # vacuum active zones.
44
43
  self.svg_wait = False # SVG image creation wait.
45
- trim_data = self.shared.trims.to_dict() # trims data
46
- _LOGGER.debug("Trim Data: %s", str(trim_data))
47
- self.trim_up = trim_data.get("trim_up", 0) # trim up
48
- self.trim_down = trim_data.get("trim_down", 0) # trim down
49
- self.trim_left = trim_data.get("trim_left", 0) # trim left
50
- self.trim_right = trim_data.get("trim_right", 0) # trim right
51
- self.offset_top = self.shared.offset_top # offset top
52
- self.offset_bottom = self.shared.offset_down # offset bottom
53
- self.offset_left = self.shared.offset_left # offset left
54
- self.offset_right = self.shared.offset_right # offset right
55
- self.imd = ImDraw(self)
56
- self.ac = AutoCrop(self, self.shared)
44
+ self.imd = ImDraw(self) # Image Draw class.
57
45
  self.color_grey = (128, 128, 128, 255)
58
46
  self.file_name = self.shared.file_name # file name of the vacuum.
59
47
 
@@ -233,7 +221,7 @@ class HypferMapImageHandler(BaseHandler):
233
221
  robot_state=self.shared.vacuum_state,
234
222
  )
235
223
  # Resize the image
236
- img_np_array = await self.ac.async_auto_trim_and_zoom_image(
224
+ img_np_array = await self.async_auto_trim_and_zoom_image(
237
225
  img_np_array,
238
226
  colors["background"],
239
227
  int(self.shared.margins),
@@ -33,38 +33,27 @@ _LOGGER = logging.getLogger(__name__)
33
33
 
34
34
 
35
35
  # noinspection PyTypeChecker
36
- class ReImageHandler(BaseHandler):
36
+ class ReImageHandler(BaseHandler, AutoCrop):
37
37
  """
38
38
  Image Handler for Valetudo Re Vacuums.
39
39
  """
40
40
 
41
- def __init__(self, camera_shared):
41
+ def __init__(self, shared_data):
42
42
  BaseHandler.__init__(self)
43
+ self.shared = shared_data # Shared data
44
+ AutoCrop.__init__(self, self)
43
45
  self.auto_crop = None # Auto crop flag
44
46
  self.segment_data = None # Segment data
45
47
  self.outlines = None # Outlines data
46
48
  self.calibration_data = None # Calibration data
47
- self.crop_area = None # Crop area
48
49
  self.data = RandImageData # Image Data
49
50
  self.go_to = None # Go to position data
50
51
  self.img_base_layer = None # Base image layer
51
- self.img_rotate = camera_shared.image_rotate # Image rotation
52
+ self.img_rotate = shared_data.image_rotate # Image rotation
52
53
  self.room_propriety = None # Room propriety data
53
- self.shared = camera_shared # Shared data
54
54
  self.active_zones = None # Active zones
55
- trim_data = self.shared.trims.to_dict() # trims data
56
- _LOGGER.debug("Trim Data: %s", trim_data)
57
- self.trim_up = trim_data.get("trim_up", 0) # trim up
58
- self.trim_down = trim_data.get("trim_down", 0) # trim down
59
- self.trim_left = trim_data.get("trim_left", 0) # trim left
60
- self.trim_right = trim_data.get("trim_right", 0) # trim right
61
55
  self.file_name = self.shared.file_name # File name
62
- self.offset_top = self.shared.offset_top # offset top
63
- self.offset_bottom = self.shared.offset_down # offset bottom
64
- self.offset_left = self.shared.offset_left # offset left
65
- self.offset_right = self.shared.offset_right # offset right
66
56
  self.imd = ImageDraw(self) # Image Draw
67
- self.crop = AutoCrop(self, self.shared)
68
57
 
69
58
  async def extract_room_properties(
70
59
  self, json_data: JsonType, destinations: JsonType
@@ -248,7 +237,7 @@ class ReImageHandler(BaseHandler):
248
237
  img_np_array = await self.imd.async_draw_robot_on_map(
249
238
  img_np_array, robot_position, robot_position_angle, colors["robot"]
250
239
  )
251
- img_np_array = await self.crop.async_auto_trim_and_zoom_image(
240
+ img_np_array = await self.async_auto_trim_and_zoom_image(
252
241
  img_np_array,
253
242
  detect_colour=colors["background"],
254
243
  margin_size=int(self.shared.margins),
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "valetudo-map-parser"
3
- version = "0.1.9.b29"
3
+ version = "0.1.9.b31"
4
4
  description = "A Python library to parse Valetudo map data returning a PIL Image object."
5
5
  authors = ["Sandro Cantarella <gsca075@gmail.com>"]
6
6
  license = "Apache-2.0"