valetudo-map-parser 0.1.9b29__py3-none-any.whl → 0.1.9b31__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/auto_crop.py +113 -84
- valetudo_map_parser/config/colors_man.py +1 -0
- valetudo_map_parser/config/types.py +1 -1
- valetudo_map_parser/hypfer_handler.py +4 -16
- valetudo_map_parser/rand25_handler.py +6 -17
- {valetudo_map_parser-0.1.9b29.dist-info → valetudo_map_parser-0.1.9b31.dist-info}/METADATA +1 -1
- {valetudo_map_parser-0.1.9b29.dist-info → valetudo_map_parser-0.1.9b31.dist-info}/RECORD +10 -10
- {valetudo_map_parser-0.1.9b29.dist-info → valetudo_map_parser-0.1.9b31.dist-info}/LICENSE +0 -0
- {valetudo_map_parser-0.1.9b29.dist-info → valetudo_map_parser-0.1.9b31.dist-info}/NOTICE.txt +0 -0
- {valetudo_map_parser-0.1.9b29.dist-info → valetudo_map_parser-0.1.9b31.dist-info}/WHEEL +0 -0
@@ -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,
|
29
|
-
self.
|
30
|
-
self.
|
31
|
-
self.
|
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.
|
51
|
-
self.
|
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
|
-
|
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
|
-
|
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.
|
93
|
+
if not self.auto_crop:
|
87
94
|
trims_data = TrimCropData.from_dict(dict(tdata.to_dict())).to_list()
|
88
95
|
(
|
89
|
-
self.
|
90
|
-
self.
|
91
|
-
self.
|
92
|
-
self.
|
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.
|
101
|
-
self.
|
102
|
-
self.
|
103
|
-
self.
|
104
|
-
self.
|
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.
|
109
|
-
self.
|
110
|
-
if self.
|
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.
|
114
|
-
|
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
|
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.
|
165
|
+
self.handler.file_name,
|
166
|
+
self.handler.robot_in_room["room"],
|
154
167
|
)
|
168
|
+
|
155
169
|
if rand256:
|
156
|
-
trim_left =
|
157
|
-
|
158
|
-
|
159
|
-
|
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.
|
162
|
-
trim_right = self.
|
163
|
-
trim_up = self.
|
164
|
-
trim_down = self.
|
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.
|
172
|
-
self.
|
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.
|
183
|
-
self.
|
184
|
-
self.
|
185
|
-
self.
|
186
|
-
self.
|
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.
|
219
|
+
self.crop_area = self.auto_crop
|
191
220
|
elif rotate == 270:
|
192
221
|
rotated = rot90(trimmed, 3)
|
193
|
-
self.
|
194
|
-
self.
|
195
|
-
self.
|
196
|
-
self.
|
197
|
-
self.
|
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.
|
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.
|
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.
|
226
|
-
self.
|
227
|
-
self.
|
228
|
-
self.
|
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.
|
249
|
-
self.
|
250
|
-
self.
|
251
|
-
self.
|
252
|
-
self.
|
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.
|
297
|
+
"%s: Auto Trim Box data: %s", self.handler.file_name, self.crop_area
|
269
298
|
)
|
270
|
-
self.
|
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.
|
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
|
)
|
@@ -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
|
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
|
-
|
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.
|
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,
|
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 =
|
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.
|
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,21 +1,21 @@
|
|
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=
|
3
|
+
valetudo_map_parser/config/auto_crop.py,sha256=pL1kv52KfAc7tmt0K8KcIqFBxHj6AqkQtJ7dQCYOEB4,12088
|
4
4
|
valetudo_map_parser/config/colors.py,sha256=IzTT9JvF12YGGJxaTiEJRuwUdCCsFCLzsR9seCDfYWs,6515
|
5
|
-
valetudo_map_parser/config/colors_man.py,sha256
|
5
|
+
valetudo_map_parser/config/colors_man.py,sha256=9b5c6XmpMzhEiunwfIjVkOk1lDyV-UFoasACdkGXfbo,7833
|
6
6
|
valetudo_map_parser/config/drawable.py,sha256=hsrEJCMVOrjs5sJfr26SeqJD0VNlYWwxcVkkHeaxx7U,20356
|
7
7
|
valetudo_map_parser/config/rand25_parser.py,sha256=kIayyqVZBfQfAMkiArzqrrj9vqZB3pkgT0Y5ufrQmGA,16448
|
8
8
|
valetudo_map_parser/config/shared.py,sha256=jk7x8xCiE0UnE1oXcZ4iIBGz1Mv0CTHQOeZN2K94eXA,9743
|
9
|
-
valetudo_map_parser/config/types.py,sha256=
|
9
|
+
valetudo_map_parser/config/types.py,sha256=tjdCnh3TjrKY77ss8U-phjLufOF0N1EeMfKOZmbhdWM,17144
|
10
10
|
valetudo_map_parser/config/utils.py,sha256=LExxpOesfaAeskusEfWU4nrUR068_1yM_U_1JVHYQW0,18976
|
11
11
|
valetudo_map_parser/hypfer_draw.py,sha256=1trtil-CQcDSiAMBWPBmuP5L9MWHGTp5OlY7MX8FgDg,14932
|
12
|
-
valetudo_map_parser/hypfer_handler.py,sha256=
|
12
|
+
valetudo_map_parser/hypfer_handler.py,sha256=CZ-feGUn6nJqKPE6mcHjMUrCVFZd_GG7P33kYgP3yNs,12875
|
13
13
|
valetudo_map_parser/map_data.py,sha256=6FbQfgxFB6E4kcOWokReJOVSekVaE1kStyhTQhAhiOg,19469
|
14
14
|
valetudo_map_parser/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
15
|
-
valetudo_map_parser/rand25_handler.py,sha256=
|
15
|
+
valetudo_map_parser/rand25_handler.py,sha256=3Hr3OYjZwMxDYk9xdfbaM-JzbNQa_1FNWTs9Bb3JGBg,15086
|
16
16
|
valetudo_map_parser/reimg_draw.py,sha256=V0JUASavKVnEtAhv7nOV4pjsRxZrNsjIUtctbKO8wvk,12507
|
17
|
-
valetudo_map_parser-0.1.
|
18
|
-
valetudo_map_parser-0.1.
|
19
|
-
valetudo_map_parser-0.1.
|
20
|
-
valetudo_map_parser-0.1.
|
21
|
-
valetudo_map_parser-0.1.
|
17
|
+
valetudo_map_parser-0.1.9b31.dist-info/LICENSE,sha256=Lh-qBbuRV0-jiCIBhfV7NgdwFxQFOXH3BKOzK865hRs,10480
|
18
|
+
valetudo_map_parser-0.1.9b31.dist-info/METADATA,sha256=mfQtNbB4YrVge9uaM7_A38FmLnBCR6d8nVsMWvkILB4,1029
|
19
|
+
valetudo_map_parser-0.1.9b31.dist-info/NOTICE.txt,sha256=5lTOuWiU9aiEnJ2go8sc7lTJ7ntMBx0g0GFnNrswCY4,2533
|
20
|
+
valetudo_map_parser-0.1.9b31.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
|
21
|
+
valetudo_map_parser-0.1.9b31.dist-info/RECORD,,
|
File without changes
|
{valetudo_map_parser-0.1.9b29.dist-info → valetudo_map_parser-0.1.9b31.dist-info}/NOTICE.txt
RENAMED
File without changes
|
File without changes
|