valetudo-map-parser 0.1.9b25__py3-none-any.whl → 0.1.9b27__py3-none-any.whl

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.
@@ -29,6 +29,14 @@ class AutoCrop:
29
29
  self.imh = image_handler
30
30
  self.file_name = self.imh.file_name
31
31
 
32
+ def validate_crop_dimensions(self, shared):
33
+ """Ensure width and height are valid before processing cropping."""
34
+ if shared.image_ref_width <= 0 or shared.image_ref_height <= 0:
35
+ _LOGGER.warning("Auto-crop failed: Invalid dimensions (width=%s, height=%s). Using original image.",
36
+ shared.image_ref_width, shared.image_ref_height)
37
+ return False
38
+ return True
39
+
32
40
  def check_trim(
33
41
  self, trimmed_height, trimmed_width, margin_size, image_array, file_name, rotate
34
42
  ):
@@ -201,7 +209,10 @@ class AutoCrop:
201
209
  Automatically crops and trims a numpy array and returns the processed image.
202
210
  """
203
211
  try:
204
- await self._init_auto_crop()
212
+ if self.validate_crop_dimensions(self.imh.shared):
213
+ await self._init_auto_crop()
214
+ else:
215
+ return image_array
205
216
  if self.imh.auto_crop is None:
206
217
  _LOGGER.debug("%s: Calculating auto trim box", self.file_name)
207
218
  # Find the coordinates of the first occurrence of a non-background color
@@ -6,7 +6,7 @@ Version: v2024.12.0
6
6
 
7
7
  import asyncio
8
8
  import logging
9
- from typing import Dict, List
9
+ from typing import List
10
10
 
11
11
  from .types import (
12
12
  ATTR_CALIBRATION_POINTS,
@@ -104,7 +104,7 @@ class CameraShared:
104
104
  self.map_old_path = None # Old path data
105
105
  self.user_language = None # User language
106
106
  self.trim_crop_data = None
107
- self.trims = TrimsData # Trims data
107
+ self.trims = TrimsData.from_dict(DEFAULT_VALUES["trims_data"]) # Trims data
108
108
  self.skip_room_ids: List[str] = []
109
109
 
110
110
  def update_user_colors(self, user_colors):
@@ -7,7 +7,6 @@ import asyncio
7
7
  import json
8
8
  import logging
9
9
  from dataclasses import dataclass, asdict
10
- from enum import Enum
11
10
  from typing import Any, Dict, Tuple, Union
12
11
 
13
12
  import numpy as np
@@ -617,6 +616,11 @@ class TrimsData:
617
616
  """Convert TrimsConfig instance to a JSON string."""
618
617
  return json.dumps(asdict(self))
619
618
 
619
+ @classmethod
620
+ def from_dict(cls, data: dict):
621
+ """Initialize TrimData from a dictionary."""
622
+ return cls(**data)
623
+
620
624
  def to_dict(self) -> dict:
621
- """Convert TrimsConfig instance to a dictionary."""
625
+ """Convert TrimData to a dictionary."""
622
626
  return asdict(self)
@@ -485,8 +485,13 @@ async def async_resize_image(params: ResizeParams):
485
485
  """Resize the image to the given dimensions and aspect ratio."""
486
486
  if params.aspect_ratio:
487
487
  wsf, hsf = [int(x) for x in params.aspect_ratio.split(",")]
488
- if wsf == 0 or hsf == 0:
489
- return params.pil_img
488
+
489
+ if wsf == 0 or hsf == 0 or params.width <= 0 or params.height <= 0:
490
+ _LOGGER.warning(
491
+ "Invalid aspect ratio parameters: width=%s, height=%s, wsf=%s, hsf=%s. Returning original image.",
492
+ params.width, params.height, wsf, hsf)
493
+ return params.pil_img # Return original image if invalid
494
+
490
495
  new_aspect_ratio = wsf / hsf
491
496
  if params.width / params.height > new_aspect_ratio:
492
497
  new_width = int(params.pil_img.height * new_aspect_ratio)
@@ -495,11 +500,7 @@ async def async_resize_image(params: ResizeParams):
495
500
  new_width = params.pil_img.width
496
501
  new_height = int(params.pil_img.width / new_aspect_ratio)
497
502
 
498
- _LOGGER.debug(
499
- "Image Aspect Ratio: %s, %s",
500
- str(wsf),
501
- str(hsf),
502
- )
503
+ _LOGGER.debug("Resizing image to aspect ratio: %s, %s", wsf, hsf)
503
504
 
504
505
  if (params.crop_size is not None) and (params.offset_func is not None):
505
506
  offset = OffsetParams(wsf, hsf, new_width, new_height, params.is_rand)
@@ -15,7 +15,7 @@ from PIL import Image
15
15
  from .config.auto_crop import AutoCrop
16
16
  from .config.drawable import Drawable
17
17
  from .config.shared import CameraShared
18
- from .config.types import COLORS, CalibrationPoints, Colors, RoomsProperties, TrimsData
18
+ from .config.types import COLORS, CalibrationPoints, Colors, RoomsProperties
19
19
  from .config.utils import BaseHandler, prepare_resize_params
20
20
  from .hypfer_draw import ImageDraw as ImDraw
21
21
  from .map_data import ImageData
@@ -42,18 +42,12 @@ class HypferMapImageHandler(BaseHandler):
42
42
  self.img_base_layer = None # numpy array store the map base layer.
43
43
  self.active_zones = None # vacuum active zones.
44
44
  self.svg_wait = False # SVG image creation wait.
45
- self.trim_up = self.shared.trims.get(
46
- TrimsData.TRIM_UP, 0
47
- ) # memory stored trims calculated once.
48
- self.trim_down = self.shared.trims.get(
49
- TrimsData.TRIM_DOWN, 0
50
- ) # memory stored trims calculated once.
51
- self.trim_left = self.shared.trims.get(
52
- TrimsData.TRIM_LEFT, 0
53
- ) # memory stored trims calculated once.
54
- self.trim_right = self.shared.trims.get(
55
- TrimsData.TRIM_RIGHT, 0
56
- ) # memory stored trims calculated once.
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
57
51
  self.offset_top = self.shared.offset_top # offset top
58
52
  self.offset_bottom = self.shared.offset_down # offset bottom
59
53
  self.offset_left = self.shared.offset_left # offset left
@@ -23,7 +23,6 @@ from .config.types import (
23
23
  PilPNG,
24
24
  RobotPosition,
25
25
  RoomsProperties,
26
- TrimsData,
27
26
  )
28
27
  from .config.utils import BaseHandler, prepare_resize_params
29
28
  from .map_data import RandImageData
@@ -53,18 +52,12 @@ class ReImageHandler(BaseHandler):
53
52
  self.room_propriety = None # Room propriety data
54
53
  self.shared = camera_shared # Shared data
55
54
  self.active_zones = None # Active zones
56
- self.trim_up = self.shared.trims.get(
57
- TrimsData.TRIM_UP, 0
58
- ) # memory stored trims calculated once.
59
- self.trim_down = self.shared.trims.get(
60
- TrimsData.TRIM_DOWN, 0
61
- ) # memory stored trims calculated once.
62
- self.trim_left = self.shared.trims.get(
63
- TrimsData.TRIM_LEFT, 0
64
- ) # memory stored trims calculated once.
65
- self.trim_right = self.shared.trims.get(
66
- TrimsData.TRIM_RIGHT, 0
67
- ) # memory stored trims calculated once.
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
68
61
  self.file_name = self.shared.file_name # File name
69
62
  self.offset_top = self.shared.offset_top # offset top
70
63
  self.offset_bottom = self.shared.offset_down # offset bottom
@@ -266,6 +259,9 @@ class ReImageHandler(BaseHandler):
266
259
  return img_np_array
267
260
 
268
261
  async def _finalize_image(self, pil_img):
262
+ if not self.shared.image_ref_width or not self.shared.image_ref_height:
263
+ _LOGGER.warning("Image finalization failed: Invalid image dimensions. Returning original image.")
264
+ return pil_img
269
265
  if self.check_zoom_and_aspect_ratio():
270
266
  resize_params = prepare_resize_params(self, pil_img, True)
271
267
  pil_img = await self.async_resize_images(resize_params)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: valetudo-map-parser
3
- Version: 0.1.9b25
3
+ Version: 0.1.9b27
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
@@ -1,20 +1,20 @@
1
1
  valetudo_map_parser/__init__.py,sha256=Wmd20bdI1btzMq-0x8NxGYWskTjdUmD-Fem9MTfziwU,810
2
2
  valetudo_map_parser/config/__init__.py,sha256=DQ9plV3ZF_K25Dp5ZQHPDoG-40dQoJNdNi-dfNeR3Zc,48
3
- valetudo_map_parser/config/auto_crop.py,sha256=6YjxxTKwO-O3DKOBriNHo_HfmRIBkRJnVhGEUs7TakQ,10342
3
+ valetudo_map_parser/config/auto_crop.py,sha256=J_1f4W_V1_kbALkWNd2VJosnjjSk5YR3IvHtDGmVGx0,10894
4
4
  valetudo_map_parser/config/colors.py,sha256=IzTT9JvF12YGGJxaTiEJRuwUdCCsFCLzsR9seCDfYWs,6515
5
5
  valetudo_map_parser/config/drawable.py,sha256=hsrEJCMVOrjs5sJfr26SeqJD0VNlYWwxcVkkHeaxx7U,20356
6
6
  valetudo_map_parser/config/rand25_parser.py,sha256=kIayyqVZBfQfAMkiArzqrrj9vqZB3pkgT0Y5ufrQmGA,16448
7
- valetudo_map_parser/config/shared.py,sha256=Wfqisi13y4Xy8IY2yivAW8efEJ06w_nCvlSmfcoSUl0,9709
8
- valetudo_map_parser/config/types.py,sha256=LVHrdDIUq-829RjITyccobcua1vKMnVCS_2KwKtzTxk,17044
9
- valetudo_map_parser/config/utils.py,sha256=8TBqH5jKr7wMM5dtWqnk5pPwZa_D0ApOpmdZUaqiRl8,18679
7
+ valetudo_map_parser/config/shared.py,sha256=jk7x8xCiE0UnE1oXcZ4iIBGz1Mv0CTHQOeZN2K94eXA,9743
8
+ valetudo_map_parser/config/types.py,sha256=wcWtYAc5sc9CWYzRJ4aOJRmuvM2rMuCfcDgAhpV8yEM,17144
9
+ valetudo_map_parser/config/utils.py,sha256=5P33Ren99EUwF7vfQ-GhSeCiR6jI1ZtiKQaofbgIKp8,18914
10
10
  valetudo_map_parser/hypfer_draw.py,sha256=1trtil-CQcDSiAMBWPBmuP5L9MWHGTp5OlY7MX8FgDg,14932
11
- valetudo_map_parser/hypfer_handler.py,sha256=yxjDq4dIjJQVuK3Gv93QW9LQrRuKBG4TXIKSqiwZaCI,13790
11
+ valetudo_map_parser/hypfer_handler.py,sha256=ibW2DQSWxCV2PHA6FwfIOIBDu6hryCs7ae6HD-Nhm6A,13635
12
12
  valetudo_map_parser/map_data.py,sha256=6FbQfgxFB6E4kcOWokReJOVSekVaE1kStyhTQhAhiOg,19469
13
13
  valetudo_map_parser/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- valetudo_map_parser/rand25_handler.py,sha256=wn0CbjXwznqKpnR400HbImQtfLWRXTRRtfRqaQqFzU4,15693
14
+ valetudo_map_parser/rand25_handler.py,sha256=nFOX1yVvZrAYxfY-aij7oIz0nKcUUL28y9_gsNJWWLw,15746
15
15
  valetudo_map_parser/reimg_draw.py,sha256=V0JUASavKVnEtAhv7nOV4pjsRxZrNsjIUtctbKO8wvk,12507
16
- valetudo_map_parser-0.1.9b25.dist-info/LICENSE,sha256=Lh-qBbuRV0-jiCIBhfV7NgdwFxQFOXH3BKOzK865hRs,10480
17
- valetudo_map_parser-0.1.9b25.dist-info/METADATA,sha256=OzQEDbQoIxtup4ufDxHOrjtqHpOuRqbjuxT5nJTI_cw,1029
18
- valetudo_map_parser-0.1.9b25.dist-info/NOTICE.txt,sha256=5lTOuWiU9aiEnJ2go8sc7lTJ7ntMBx0g0GFnNrswCY4,2533
19
- valetudo_map_parser-0.1.9b25.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
20
- valetudo_map_parser-0.1.9b25.dist-info/RECORD,,
16
+ valetudo_map_parser-0.1.9b27.dist-info/LICENSE,sha256=Lh-qBbuRV0-jiCIBhfV7NgdwFxQFOXH3BKOzK865hRs,10480
17
+ valetudo_map_parser-0.1.9b27.dist-info/METADATA,sha256=SzlOLmV3VGgFRnaCjyyqrt2Cn7CIMin6rGGuwt9huyA,1029
18
+ valetudo_map_parser-0.1.9b27.dist-info/NOTICE.txt,sha256=5lTOuWiU9aiEnJ2go8sc7lTJ7ntMBx0g0GFnNrswCY4,2533
19
+ valetudo_map_parser-0.1.9b27.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
20
+ valetudo_map_parser-0.1.9b27.dist-info/RECORD,,