valetudo-map-parser 0.1.10rc5__py3-none-any.whl → 0.1.10rc7__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.
- valetudo_map_parser/config/rand256_parser.py +129 -47
- valetudo_map_parser/config/shared.py +83 -93
- valetudo_map_parser/config/types.py +26 -1
- valetudo_map_parser/config/utils.py +60 -10
- valetudo_map_parser/hypfer_handler.py +2 -5
- valetudo_map_parser/map_data.py +4 -3
- valetudo_map_parser/rand256_handler.py +13 -17
- valetudo_map_parser/reimg_draw.py +13 -18
- {valetudo_map_parser-0.1.10rc5.dist-info → valetudo_map_parser-0.1.10rc7.dist-info}/METADATA +2 -2
- {valetudo_map_parser-0.1.10rc5.dist-info → valetudo_map_parser-0.1.10rc7.dist-info}/RECORD +13 -14
- valetudo_map_parser/hypfer_rooms_handler.py +0 -599
- {valetudo_map_parser-0.1.10rc5.dist-info → valetudo_map_parser-0.1.10rc7.dist-info}/WHEEL +0 -0
- {valetudo_map_parser-0.1.10rc5.dist-info → valetudo_map_parser-0.1.10rc7.dist-info}/licenses/LICENSE +0 -0
- {valetudo_map_parser-0.1.10rc5.dist-info → valetudo_map_parser-0.1.10rc7.dist-info}/licenses/NOTICE.txt +0 -0
@@ -5,7 +5,7 @@ from time import time
|
|
5
5
|
import hashlib
|
6
6
|
import json
|
7
7
|
from dataclasses import dataclass
|
8
|
-
from typing import Callable, List, Optional
|
8
|
+
from typing import Callable, List, Optional, Tuple
|
9
9
|
import io
|
10
10
|
|
11
11
|
import numpy as np
|
@@ -23,6 +23,7 @@ from .types import (
|
|
23
23
|
NumpyArray,
|
24
24
|
PilPNG,
|
25
25
|
RobotPosition,
|
26
|
+
Destinations,
|
26
27
|
)
|
27
28
|
from ..map_data import HyperMapData
|
28
29
|
from .async_utils import AsyncNumPy
|
@@ -91,9 +92,9 @@ class BaseHandler:
|
|
91
92
|
async def async_get_image(
|
92
93
|
self,
|
93
94
|
m_json: dict | None,
|
94
|
-
destinations:
|
95
|
+
destinations: Destinations | None = None,
|
95
96
|
bytes_format: bool = False,
|
96
|
-
) -> PilPNG | bytes:
|
97
|
+
) -> Tuple[PilPNG | bytes, dict]:
|
97
98
|
"""
|
98
99
|
Unified async function to get PIL image from JSON data for both Hypfer and Rand256 handlers.
|
99
100
|
|
@@ -108,7 +109,7 @@ class BaseHandler:
|
|
108
109
|
@param bytes_format: If True, also convert to PNG bytes and store in shared.binary_image
|
109
110
|
@param text_enabled: If True, draw text on the image
|
110
111
|
@param vacuum_status: Vacuum status to display on the image
|
111
|
-
@return: PIL Image or None
|
112
|
+
@return: PIL Image or None and data dictionary
|
112
113
|
"""
|
113
114
|
try:
|
114
115
|
# Backup current image to last_image before processing new one
|
@@ -122,6 +123,7 @@ class BaseHandler:
|
|
122
123
|
m_json=m_json,
|
123
124
|
destinations=destinations,
|
124
125
|
)
|
126
|
+
|
125
127
|
elif hasattr(self, "async_get_image_from_json"):
|
126
128
|
# This is a Hypfer handler
|
127
129
|
self.json_data = await HyperMapData.async_from_valetudo_json(m_json)
|
@@ -141,7 +143,10 @@ class BaseHandler:
|
|
141
143
|
|
142
144
|
# Store the new image in shared data
|
143
145
|
if new_image is not None:
|
146
|
+
# Update shared data
|
147
|
+
await self._async_update_shared_data(destinations)
|
144
148
|
self.shared.new_image = new_image
|
149
|
+
# Add text to the image
|
145
150
|
if self.shared.show_vacuum_state:
|
146
151
|
text_editor = StatusText(self.shared)
|
147
152
|
img_text = await text_editor.get_status_text(new_image)
|
@@ -160,18 +165,22 @@ class BaseHandler:
|
|
160
165
|
self.shared.binary_image = pil_to_png_bytes(self.shared.last_image)
|
161
166
|
# Update the timestamp with current datetime
|
162
167
|
self.shared.image_last_updated = datetime.datetime.fromtimestamp(time())
|
163
|
-
|
168
|
+
LOGGER.debug("%s: Frame Completed.", self.file_name)
|
169
|
+
data = {}
|
170
|
+
if bytes_format:
|
171
|
+
data = self.shared.to_dict()
|
172
|
+
return new_image, data
|
164
173
|
else:
|
165
174
|
LOGGER.warning(
|
166
175
|
"%s: Failed to generate image from JSON data", self.file_name
|
167
176
|
)
|
168
177
|
if bytes_format and hasattr(self.shared, "last_image"):
|
169
|
-
return pil_to_png_bytes(self.shared.last_image)
|
178
|
+
return pil_to_png_bytes(self.shared.last_image), {}
|
170
179
|
return (
|
171
180
|
self.shared.last_image
|
172
181
|
if hasattr(self.shared, "last_image")
|
173
182
|
else None
|
174
|
-
)
|
183
|
+
), {}
|
175
184
|
|
176
185
|
except Exception as e:
|
177
186
|
LOGGER.warning(
|
@@ -184,14 +193,55 @@ class BaseHandler:
|
|
184
193
|
self.shared.last_image if hasattr(self.shared, "last_image") else None
|
185
194
|
)
|
186
195
|
|
187
|
-
def
|
196
|
+
async def _async_update_shared_data(self, destinations: Destinations | None = None):
|
197
|
+
"""Update the shared data with the latest information."""
|
198
|
+
|
199
|
+
if hasattr(self, "get_rooms_attributes") and (
|
200
|
+
self.shared.map_rooms is None and destinations is not None
|
201
|
+
):
|
202
|
+
(self.shared.map_rooms,) = await self.get_rooms_attributes(destinations)
|
203
|
+
if self.shared.map_rooms:
|
204
|
+
LOGGER.debug("%s: Rand256 attributes rooms updated", self.file_name)
|
205
|
+
|
206
|
+
if hasattr(self, "async_get_rooms_attributes") and (
|
207
|
+
self.shared.map_rooms is None
|
208
|
+
):
|
209
|
+
if self.shared.map_rooms is None:
|
210
|
+
self.shared.map_rooms = await self.async_get_rooms_attributes()
|
211
|
+
if self.shared.map_rooms:
|
212
|
+
LOGGER.debug("%s: Hyper attributes rooms updated", self.file_name)
|
213
|
+
|
214
|
+
if (
|
215
|
+
hasattr(self, "get_calibration_data")
|
216
|
+
and self.shared.attr_calibration_points is None
|
217
|
+
):
|
218
|
+
self.shared.attr_calibration_points = self.get_calibration_data(
|
219
|
+
self.shared.image_rotate
|
220
|
+
)
|
221
|
+
|
222
|
+
if not self.shared.image_size:
|
223
|
+
self.shared.image_size = self.get_img_size()
|
224
|
+
|
225
|
+
self.shared.vac_json_id = self.get_json_id()
|
226
|
+
|
227
|
+
if not self.shared.charger_position:
|
228
|
+
self.shared.charger_position = self.get_charger_position()
|
229
|
+
|
230
|
+
self.shared.current_room = self.get_robot_position()
|
231
|
+
|
232
|
+
def prepare_resize_params(
|
233
|
+
self, pil_img: PilPNG, rand: bool = False
|
234
|
+
) -> ResizeParams:
|
188
235
|
"""Prepare resize parameters for image resizing."""
|
189
236
|
if self.shared.image_rotate in [0, 180]:
|
190
237
|
width, height = pil_img.size
|
191
238
|
else:
|
192
239
|
height, width = pil_img.size
|
193
|
-
LOGGER.debug(
|
194
|
-
|
240
|
+
LOGGER.debug(
|
241
|
+
"Shared PIL image size: %s x %s",
|
242
|
+
self.shared.image_ref_width,
|
243
|
+
self.shared.image_ref_height,
|
244
|
+
)
|
195
245
|
return ResizeParams(
|
196
246
|
pil_img=pil_img,
|
197
247
|
width=width,
|
@@ -14,7 +14,6 @@ from PIL import Image
|
|
14
14
|
|
15
15
|
from .config.async_utils import AsyncPIL
|
16
16
|
|
17
|
-
# from .config.auto_crop import AutoCrop
|
18
17
|
from mvcrender.autocrop import AutoCrop
|
19
18
|
from .config.drawable_elements import DrawableElement
|
20
19
|
from .config.shared import CameraShared
|
@@ -60,7 +59,6 @@ class HypferMapImageHandler(BaseHandler, AutoCrop):
|
|
60
59
|
None # persistent working buffer to avoid per-frame allocations
|
61
60
|
)
|
62
61
|
self.active_zones = [] # vacuum active zones.
|
63
|
-
self.svg_wait = False # SVG image creation wait.
|
64
62
|
self.imd = ImDraw(self) # Image Draw class.
|
65
63
|
self.color_grey = (128, 128, 128, 255)
|
66
64
|
self.file_name = self.shared.file_name # file name of the vacuum.
|
@@ -362,7 +360,7 @@ class HypferMapImageHandler(BaseHandler, AutoCrop):
|
|
362
360
|
self.zooming = self.imd.img_h.zooming
|
363
361
|
|
364
362
|
# Resize the image
|
365
|
-
img_np_array = self.
|
363
|
+
img_np_array = self.auto_trim_and_zoom_image(
|
366
364
|
img_np_array,
|
367
365
|
colors["background"],
|
368
366
|
int(self.shared.margins),
|
@@ -409,11 +407,10 @@ class HypferMapImageHandler(BaseHandler, AutoCrop):
|
|
409
407
|
)
|
410
408
|
return self.room_propriety
|
411
409
|
|
412
|
-
def get_calibration_data(self) -> CalibrationPoints:
|
410
|
+
def get_calibration_data(self, rotation_angle: int = 0) -> CalibrationPoints:
|
413
411
|
"""Get the calibration data from the JSON data.
|
414
412
|
this will create the attribute calibration points."""
|
415
413
|
calibration_data = []
|
416
|
-
rotation_angle = self.shared.image_rotate
|
417
414
|
LOGGER.info("Getting %s Calibrations points.", self.file_name)
|
418
415
|
|
419
416
|
# Define the map points (fixed)
|
valetudo_map_parser/map_data.py
CHANGED
@@ -539,16 +539,17 @@ class RandImageData:
|
|
539
539
|
return None
|
540
540
|
|
541
541
|
@staticmethod
|
542
|
-
def get_rrm_currently_cleaned_zones(json_data: JsonType) -> dict:
|
542
|
+
def get_rrm_currently_cleaned_zones(json_data: JsonType) -> list[dict[str, Any]]:
|
543
543
|
"""Get the currently cleaned zones from the json."""
|
544
544
|
re_zones = json_data.get("currently_cleaned_zones", [])
|
545
545
|
formatted_zones = RandImageData._rrm_valetudo_format_zone(re_zones)
|
546
546
|
return formatted_zones
|
547
547
|
|
548
548
|
@staticmethod
|
549
|
-
def get_rrm_forbidden_zones(json_data: JsonType) -> dict:
|
549
|
+
def get_rrm_forbidden_zones(json_data: JsonType) -> list[dict[str, Any]]:
|
550
550
|
"""Get the forbidden zones from the json."""
|
551
551
|
re_zones = json_data.get("forbidden_zones", [])
|
552
|
+
re_zones.extend(json_data.get("forbidden_mop_zones", []))
|
552
553
|
formatted_zones = RandImageData._rrm_valetudo_format_zone(re_zones)
|
553
554
|
return formatted_zones
|
554
555
|
|
@@ -709,7 +710,7 @@ class HyperMapData:
|
|
709
710
|
"""Class to handle the map data snapshots."""
|
710
711
|
|
711
712
|
json_data: Any = None
|
712
|
-
json_id: str =
|
713
|
+
json_id: Optional[str] = None
|
713
714
|
obstacles: dict[str, list[Any]] = field(default_factory=dict)
|
714
715
|
paths: dict[str, list[Any]] = field(default_factory=dict)
|
715
716
|
image_size: dict[str, int | list[int]] = field(default_factory=dict)
|
@@ -7,7 +7,6 @@ Version: 0.1.9.a6
|
|
7
7
|
|
8
8
|
from __future__ import annotations
|
9
9
|
|
10
|
-
import logging
|
11
10
|
import uuid
|
12
11
|
from typing import Any
|
13
12
|
|
@@ -15,7 +14,6 @@ import numpy as np
|
|
15
14
|
|
16
15
|
from .config.async_utils import AsyncPIL
|
17
16
|
|
18
|
-
# from .config.auto_crop import AutoCrop
|
19
17
|
from mvcrender.autocrop import AutoCrop
|
20
18
|
from .config.drawable_elements import DrawableElement
|
21
19
|
from .config.types import (
|
@@ -28,6 +26,7 @@ from .config.types import (
|
|
28
26
|
RobotPosition,
|
29
27
|
RoomsProperties,
|
30
28
|
RoomStore,
|
29
|
+
LOGGER,
|
31
30
|
)
|
32
31
|
from .config.utils import (
|
33
32
|
BaseHandler,
|
@@ -39,9 +38,6 @@ from .reimg_draw import ImageDraw
|
|
39
38
|
from .rooms_handler import RandRoomsHandler
|
40
39
|
|
41
40
|
|
42
|
-
_LOGGER = logging.getLogger(__name__)
|
43
|
-
|
44
|
-
|
45
41
|
# noinspection PyTypeChecker
|
46
42
|
class ReImageHandler(BaseHandler, AutoCrop):
|
47
43
|
"""
|
@@ -112,17 +108,17 @@ class ReImageHandler(BaseHandler, AutoCrop):
|
|
112
108
|
self.shared.map_rooms = room_ids
|
113
109
|
|
114
110
|
# get the zones and points data
|
115
|
-
|
111
|
+
self.shared.map_pred_zones = await self.async_zone_propriety(zones_data)
|
116
112
|
# get the points data
|
117
|
-
|
113
|
+
self.shared.map_pred_points = await self.async_points_propriety(points_data)
|
118
114
|
|
119
|
-
if not (room_properties or
|
115
|
+
if not (room_properties or self.shared.map_pred_zones):
|
120
116
|
self.rooms_pos = None
|
121
117
|
|
122
118
|
rooms = RoomStore(self.file_name, room_properties)
|
123
|
-
return room_properties
|
119
|
+
return room_properties
|
124
120
|
except (RuntimeError, ValueError) as e:
|
125
|
-
|
121
|
+
LOGGER.warning(
|
126
122
|
"No rooms Data or Error in extract_room_properties: %s",
|
127
123
|
e,
|
128
124
|
exc_info=True,
|
@@ -146,12 +142,12 @@ class ReImageHandler(BaseHandler, AutoCrop):
|
|
146
142
|
|
147
143
|
try:
|
148
144
|
if (m_json is not None) and (not isinstance(m_json, tuple)):
|
149
|
-
|
145
|
+
LOGGER.info("%s: Composing the image for the camera.", self.file_name)
|
150
146
|
self.json_data = m_json
|
151
147
|
size_x, size_y = self.data.get_rrm_image_size(m_json)
|
152
148
|
self.img_size = DEFAULT_IMAGE_SIZE
|
153
149
|
self.json_id = str(uuid.uuid4()) # image id
|
154
|
-
|
150
|
+
LOGGER.info("Vacuum Data ID: %s", self.json_id)
|
155
151
|
|
156
152
|
(
|
157
153
|
img_np_array,
|
@@ -178,7 +174,7 @@ class ReImageHandler(BaseHandler, AutoCrop):
|
|
178
174
|
return await self._finalize_image(pil_img)
|
179
175
|
|
180
176
|
except (RuntimeError, RuntimeWarning) as e:
|
181
|
-
|
177
|
+
LOGGER.warning(
|
182
178
|
"%s: Runtime Error %s during image creation.",
|
183
179
|
self.file_name,
|
184
180
|
str(e),
|
@@ -214,7 +210,7 @@ class ReImageHandler(BaseHandler, AutoCrop):
|
|
214
210
|
colors["background"],
|
215
211
|
DEFAULT_PIXEL_SIZE,
|
216
212
|
)
|
217
|
-
|
213
|
+
LOGGER.info("%s: Completed base Layers", self.file_name)
|
218
214
|
|
219
215
|
# Update element map for rooms
|
220
216
|
if 0 < room_id <= 15:
|
@@ -350,7 +346,7 @@ class ReImageHandler(BaseHandler, AutoCrop):
|
|
350
346
|
else:
|
351
347
|
self.zooming = False
|
352
348
|
|
353
|
-
img_np_array = self.
|
349
|
+
img_np_array = self.auto_trim_and_zoom_image(
|
354
350
|
img_np_array,
|
355
351
|
detect_colour=colors["background"],
|
356
352
|
margin_size=int(self.shared.margins),
|
@@ -362,7 +358,7 @@ class ReImageHandler(BaseHandler, AutoCrop):
|
|
362
358
|
|
363
359
|
async def _finalize_image(self, pil_img):
|
364
360
|
if not self.shared.image_ref_width or not self.shared.image_ref_height:
|
365
|
-
|
361
|
+
LOGGER.warning(
|
366
362
|
"Image finalization failed: Invalid image dimensions. Returning original image."
|
367
363
|
)
|
368
364
|
return pil_img
|
@@ -515,7 +511,7 @@ class ReImageHandler(BaseHandler, AutoCrop):
|
|
515
511
|
"""Return the map calibration data."""
|
516
512
|
if not self.calibration_data and self.crop_img_size:
|
517
513
|
self.calibration_data = []
|
518
|
-
|
514
|
+
LOGGER.info(
|
519
515
|
"%s: Getting Calibrations points %s",
|
520
516
|
self.file_name,
|
521
517
|
str(self.crop_area),
|
@@ -6,17 +6,12 @@ Version: 0.1.9.b42
|
|
6
6
|
|
7
7
|
from __future__ import annotations
|
8
8
|
|
9
|
-
import logging
|
10
|
-
|
11
9
|
from .config.drawable import Drawable
|
12
10
|
from .config.drawable_elements import DrawableElement
|
13
|
-
from .config.types import Color, JsonType, NumpyArray
|
11
|
+
from .config.types import Color, JsonType, NumpyArray, LOGGER
|
14
12
|
from .map_data import ImageData, RandImageData
|
15
13
|
|
16
14
|
|
17
|
-
_LOGGER = logging.getLogger(__name__)
|
18
|
-
|
19
|
-
|
20
15
|
class ImageDraw:
|
21
16
|
"""Class to handle the image creation."""
|
22
17
|
|
@@ -48,7 +43,7 @@ class ImageDraw:
|
|
48
43
|
)
|
49
44
|
return np_array
|
50
45
|
except KeyError as e:
|
51
|
-
|
46
|
+
LOGGER.warning(
|
52
47
|
"%s: Error in extraction of go-to target: %s",
|
53
48
|
self.file_name,
|
54
49
|
e,
|
@@ -70,7 +65,7 @@ class ImageDraw:
|
|
70
65
|
)
|
71
66
|
except ValueError as e:
|
72
67
|
self.img_h.segment_data = None
|
73
|
-
|
68
|
+
LOGGER.info("%s: No segments data found: %s", self.file_name, e)
|
74
69
|
|
75
70
|
async def async_draw_base_layer(
|
76
71
|
self,
|
@@ -87,13 +82,13 @@ class ImageDraw:
|
|
87
82
|
walls_data = self.data.get_rrm_walls(m_json)
|
88
83
|
floor_data = self.data.get_rrm_floor(m_json)
|
89
84
|
|
90
|
-
|
85
|
+
LOGGER.info("%s: Empty image with background color", self.file_name)
|
91
86
|
img_np_array = await self.draw.create_empty_image(
|
92
87
|
self.img_h.img_size["x"], self.img_h.img_size["y"], color_background
|
93
88
|
)
|
94
89
|
room_id = 0
|
95
90
|
if self.img_h.frame_number == 0:
|
96
|
-
|
91
|
+
LOGGER.info("%s: Overlapping Layers", self.file_name)
|
97
92
|
|
98
93
|
# checking if there are segments too (sorted pixels in the raw data).
|
99
94
|
await self.async_segment_data(m_json, size_x, size_y, pos_top, pos_left)
|
@@ -148,10 +143,10 @@ class ImageDraw:
|
|
148
143
|
room_id = 0
|
149
144
|
rooms_list = [color_wall]
|
150
145
|
if not segment_data:
|
151
|
-
|
146
|
+
LOGGER.info("%s: No segments data found.", self.file_name)
|
152
147
|
return room_id, img_np_array
|
153
148
|
|
154
|
-
|
149
|
+
LOGGER.info("%s: Drawing segments.", self.file_name)
|
155
150
|
for pixels in segment_data:
|
156
151
|
room_color = self.img_h.shared.rooms_colors[room_id]
|
157
152
|
rooms_list.append(room_color)
|
@@ -211,7 +206,7 @@ class ImageDraw:
|
|
211
206
|
self.data.get_rrm_charger_position(m_json)
|
212
207
|
)
|
213
208
|
except KeyError as e:
|
214
|
-
|
209
|
+
LOGGER.warning("%s: No charger position found: %s", self.file_name, e)
|
215
210
|
else:
|
216
211
|
if charger_pos:
|
217
212
|
charger_pos_dictionary = {
|
@@ -238,7 +233,7 @@ class ImageDraw:
|
|
238
233
|
zone_clean = None
|
239
234
|
|
240
235
|
if zone_clean:
|
241
|
-
|
236
|
+
LOGGER.info("%s: Got zones.", self.file_name)
|
242
237
|
return await self.draw.zones(np_array, zone_clean, color_zone_clean)
|
243
238
|
return np_array
|
244
239
|
|
@@ -252,7 +247,7 @@ class ImageDraw:
|
|
252
247
|
virtual_walls = None
|
253
248
|
|
254
249
|
if virtual_walls:
|
255
|
-
|
250
|
+
LOGGER.info("%s: Got virtual walls.", self.file_name)
|
256
251
|
np_array = await self.draw.draw_virtual_walls(
|
257
252
|
np_array, virtual_walls, color_no_go
|
258
253
|
)
|
@@ -280,7 +275,7 @@ class ImageDraw:
|
|
280
275
|
self.data.rrm_valetudo_path_array(path_pixel["points"]), 2
|
281
276
|
)
|
282
277
|
except KeyError as e:
|
283
|
-
|
278
|
+
LOGGER.warning(
|
284
279
|
"%s: Error extracting paths data: %s", self.file_name, str(e)
|
285
280
|
)
|
286
281
|
finally:
|
@@ -297,7 +292,7 @@ class ImageDraw:
|
|
297
292
|
except (ValueError, KeyError):
|
298
293
|
entity_dict = None
|
299
294
|
else:
|
300
|
-
|
295
|
+
LOGGER.info("%s: Got the points in the json.", self.file_name)
|
301
296
|
return entity_dict
|
302
297
|
|
303
298
|
async def async_get_robot_position(self, m_json: JsonType) -> tuple | None:
|
@@ -310,7 +305,7 @@ class ImageDraw:
|
|
310
305
|
robot_pos = self.data.rrm_coordinates_to_valetudo(robot_pos_data)
|
311
306
|
angle = self.data.get_rrm_robot_angle(m_json)
|
312
307
|
except (ValueError, KeyError):
|
313
|
-
|
308
|
+
LOGGER.warning("%s No robot position found.", self.file_name)
|
314
309
|
return None, None, None
|
315
310
|
finally:
|
316
311
|
robot_position_angle = round(angle[0], 0)
|
{valetudo_map_parser-0.1.10rc5.dist-info → valetudo_map_parser-0.1.10rc7.dist-info}/METADATA
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: valetudo-map-parser
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.10rc7
|
4
4
|
Summary: A Python library to parse Valetudo map data returning a PIL Image object.
|
5
5
|
License: Apache-2.0
|
6
6
|
License-File: LICENSE
|
@@ -13,7 +13,7 @@ Classifier: Programming Language :: Python :: 3
|
|
13
13
|
Classifier: Programming Language :: Python :: 3.13
|
14
14
|
Classifier: Programming Language :: Python :: 3.14
|
15
15
|
Requires-Dist: Pillow (>=10.3.0)
|
16
|
-
Requires-Dist: mvcrender (>=0.0.
|
16
|
+
Requires-Dist: mvcrender (>=0.0.4)
|
17
17
|
Requires-Dist: numpy (>=1.26.4)
|
18
18
|
Requires-Dist: scipy (>=1.12.0)
|
19
19
|
Project-URL: Bug Tracker, https://github.com/sca075/Python-package-valetudo-map-parser/issues
|
@@ -15,22 +15,21 @@ valetudo_map_parser/config/fonts/NotoKufiArabic-VF.ttf,sha256=NaIy40eLx7d3ts0kue
|
|
15
15
|
valetudo_map_parser/config/fonts/NotoSansCJKhk-VF.ttf,sha256=xIXXLKCJzmWoPEg8HdvxeRgotMjjxF6l6ugGP-IWRJU,36135040
|
16
16
|
valetudo_map_parser/config/fonts/NotoSansKhojki.ttf,sha256=XJWzSmpN-Ql6jTfTvFojP_JkCHOztQvixQc1_7hPWrc,107388
|
17
17
|
valetudo_map_parser/config/optimized_element_map.py,sha256=52BCnkvVv9bre52LeVIfT8nhnEIpc0TuWTv1xcNu0Rk,15744
|
18
|
-
valetudo_map_parser/config/rand256_parser.py,sha256=
|
19
|
-
valetudo_map_parser/config/shared.py,sha256=
|
18
|
+
valetudo_map_parser/config/rand256_parser.py,sha256=jsUiuShrNY3UpgfdEMgmTJjH6fj-lC-0y2TdIt43aG0,20161
|
19
|
+
valetudo_map_parser/config/shared.py,sha256=58R6kaYl7RF0ESTIKarVy8pB1jo4LUlPHTb27_ubZFo,11789
|
20
20
|
valetudo_map_parser/config/status_text/status_text.py,sha256=PaynYW11vXH_vhDxhZrR9j-xeDrCxbB6YQQtN-kcaxQ,4052
|
21
21
|
valetudo_map_parser/config/status_text/translations.py,sha256=mmPbJkl_2A59w49wnesQf3ocXqwZxBsrqNX-yt5FSCQ,9132
|
22
|
-
valetudo_map_parser/config/types.py,sha256=
|
23
|
-
valetudo_map_parser/config/utils.py,sha256=
|
22
|
+
valetudo_map_parser/config/types.py,sha256=vSJjEsosbx9ZaM_JEuqhdzFIHnf97bfzDBMvx_V3U0s,18067
|
23
|
+
valetudo_map_parser/config/utils.py,sha256=sk6Vy3_QpJhX9Hvb6S36Womyu0n8bfxWejfuNEaEM-I,38658
|
24
24
|
valetudo_map_parser/hypfer_draw.py,sha256=4zajujSOvtpRI_GMlmlioM3mDo19MvuOP861LhZmVlw,22495
|
25
|
-
valetudo_map_parser/hypfer_handler.py,sha256=
|
26
|
-
valetudo_map_parser/
|
27
|
-
valetudo_map_parser/map_data.py,sha256=gVW_QhUcz-fZOM1ltSynTxZRHgu7yGjvZp8zUfd0ClA,27253
|
25
|
+
valetudo_map_parser/hypfer_handler.py,sha256=8g2zitibQkgVh-crqDO41kp1DQzZaMMixUdFqgPjfis,20477
|
26
|
+
valetudo_map_parser/map_data.py,sha256=OSscuvlYpAZ9q7pfjzIjh98UvT0PV8zjPk5eUEwmLb8,27355
|
28
27
|
valetudo_map_parser/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
29
|
-
valetudo_map_parser/rand256_handler.py,sha256=
|
30
|
-
valetudo_map_parser/reimg_draw.py,sha256=
|
28
|
+
valetudo_map_parser/rand256_handler.py,sha256=jpbvhNr2tm6Gp1Xs7yMMLwjCN1dOnNUtED7MrjnH4Os,21504
|
29
|
+
valetudo_map_parser/reimg_draw.py,sha256=tDQGMDTYprgPZjETxws3rzgVfpPxm_K-armzYFyGzGw,12474
|
31
30
|
valetudo_map_parser/rooms_handler.py,sha256=tE8BrXcdL0SeFAYsdFvjR3NVDfDi2RPKnXw9jD1e5k8,17494
|
32
|
-
valetudo_map_parser-0.1.
|
33
|
-
valetudo_map_parser-0.1.
|
34
|
-
valetudo_map_parser-0.1.
|
35
|
-
valetudo_map_parser-0.1.
|
36
|
-
valetudo_map_parser-0.1.
|
31
|
+
valetudo_map_parser-0.1.10rc7.dist-info/METADATA,sha256=NPYlwO902_zvejWWjfzzjOkTVyn_CoquAG9zs1cRG0E,3404
|
32
|
+
valetudo_map_parser-0.1.10rc7.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
|
33
|
+
valetudo_map_parser-0.1.10rc7.dist-info/licenses/LICENSE,sha256=Lh-qBbuRV0-jiCIBhfV7NgdwFxQFOXH3BKOzK865hRs,10480
|
34
|
+
valetudo_map_parser-0.1.10rc7.dist-info/licenses/NOTICE.txt,sha256=5lTOuWiU9aiEnJ2go8sc7lTJ7ntMBx0g0GFnNrswCY4,2533
|
35
|
+
valetudo_map_parser-0.1.10rc7.dist-info/RECORD,,
|