maps4fs 1.2.4__py3-none-any.whl → 1.4.1__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.

Potentially problematic release.


This version of maps4fs might be problematic. Click here for more details.

@@ -177,16 +177,10 @@ class Texture(Component):
177
177
  ]
178
178
 
179
179
  def preprocess(self) -> None:
180
- self.light_version = self.kwargs.get("light_version", False)
181
- self.fields_padding = self.kwargs.get("fields_padding", 0)
182
- self.logger.debug("Light version: %s.", self.light_version)
183
-
184
- self.custom_schema: list[dict[str, str | dict[str, str] | int]] | None = self.kwargs.get(
185
- "custom_schema"
186
- )
187
-
188
- if self.custom_schema:
189
- layers_schema = self.custom_schema
180
+ """Preprocesses the data before the generation."""
181
+ custom_schema = self.kwargs.get("texture_custom_schema")
182
+ if custom_schema:
183
+ layers_schema = custom_schema # type: ignore
190
184
  self.logger.info("Custom schema loaded with %s layers.", len(layers_schema))
191
185
  else:
192
186
  if not os.path.isfile(self.game.texture_schema):
@@ -201,14 +195,14 @@ class Texture(Component):
201
195
  raise ValueError(f"Error loading texture layers schema: {e}") from e
202
196
 
203
197
  try:
204
- self.layers = [self.Layer.from_json(layer) for layer in layers_schema]
198
+ self.layers = [self.Layer.from_json(layer) for layer in layers_schema] # type: ignore
205
199
  self.logger.info("Loaded %s layers.", len(self.layers))
206
200
  except Exception as e: # pylint: disable=W0703
207
201
  raise ValueError(f"Error loading texture layers: {e}") from e
208
202
 
209
203
  base_layer = self.get_base_layer()
210
204
  if base_layer:
211
- self.logger.info("Base layer found: %s.", base_layer.name)
205
+ self.logger.debug("Base layer found: %s.", base_layer.name)
212
206
  else:
213
207
  self.logger.warning("No base layer found.")
214
208
 
@@ -319,7 +313,7 @@ class Texture(Component):
319
313
 
320
314
  for layer in self.layers:
321
315
  self._generate_weights(layer)
322
- self.logger.info("Prepared weights for %s layers.", len(self.layers))
316
+ self.logger.debug("Prepared weights for %s layers.", len(self.layers))
323
317
 
324
318
  def _generate_weights(self, layer: Layer) -> None:
325
319
  """Generates weight files for textures. Each file is a numpy array of zeros and
@@ -378,7 +372,7 @@ class Texture(Component):
378
372
  ),
379
373
  )
380
374
 
381
- # pylint: disable=no-member
375
+ # pylint: disable=no-member, R0912
382
376
  def draw(self) -> None:
383
377
  """Iterates over layers and fills them with polygons from OSM data."""
384
378
  layers = self.layers_by_priority()
@@ -394,6 +388,9 @@ class Texture(Component):
394
388
  info_layer_data = defaultdict(list)
395
389
 
396
390
  for layer in layers:
391
+ if self.map.texture_settings.skip_drains and layer.usage == "drain":
392
+ self.logger.debug("Skipping layer %s because of the usage.", layer.name)
393
+ continue
397
394
  if not layer.tags:
398
395
  self.logger.debug("Layer %s has no tags, there's nothing to draw.", layer.name)
399
396
  continue
@@ -412,26 +409,48 @@ class Texture(Component):
412
409
 
413
410
  mask = cv2.bitwise_not(cumulative_image)
414
411
 
415
- for polygon in self.polygons(layer.tags, layer.width): # type: ignore
412
+ for polygon in self.objects_generator( # type: ignore
413
+ layer.tags, layer.width, layer.info_layer
414
+ ):
416
415
  if layer.info_layer:
417
- info_layer_data[layer.info_layer].append(self.np_to_polygon_points(polygon))
416
+ info_layer_data[layer.info_layer].append(
417
+ self.np_to_polygon_points(polygon) # type: ignore
418
+ )
418
419
  cv2.fillPoly(layer_image, [polygon], color=255) # type: ignore
419
420
 
421
+ if layer.info_layer == "roads":
422
+ for linestring in self.objects_generator(
423
+ layer.tags, layer.width, layer.info_layer, yield_linestrings=True
424
+ ):
425
+ info_layer_data[f"{layer.info_layer}_polylines"].append(
426
+ linestring # type: ignore
427
+ )
428
+
420
429
  output_image = cv2.bitwise_and(layer_image, mask)
421
430
 
422
431
  cumulative_image = cv2.bitwise_or(cumulative_image, output_image)
423
432
 
424
433
  cv2.imwrite(layer_path, output_image)
425
- self.logger.info("Texture %s saved.", layer_path)
434
+ self.logger.debug("Texture %s saved.", layer_path)
426
435
 
427
436
  # Save info layer data.
437
+ if os.path.isfile(self.info_layer_path):
438
+ self.logger.debug(
439
+ "File %s already exists, will update to avoid overwriting.", self.info_layer_path
440
+ )
441
+ with open(self.info_layer_path, "r", encoding="utf-8") as f:
442
+ info_layer_data.update(json.load(f))
443
+
428
444
  with open(self.info_layer_path, "w", encoding="utf-8") as f:
429
445
  json.dump(info_layer_data, f, ensure_ascii=False, indent=4)
446
+ self.logger.debug("Info layer data saved to %s.", self.info_layer_path)
430
447
 
431
448
  if cumulative_image is not None:
432
449
  self.draw_base_layer(cumulative_image)
433
450
 
434
- if not self.light_version:
451
+ if self.map.texture_settings.dissolve and self.game.code != "FS22":
452
+ # FS22 has textures splitted into 4 sublayers, which leads to a very
453
+ # long processing time when dissolving them.
435
454
  self.dissolve()
436
455
  else:
437
456
  self.logger.debug("Skipping dissolve in light version of the map.")
@@ -485,8 +504,6 @@ class Texture(Component):
485
504
 
486
505
  self.logger.info("Dissolved layer %s.", layer.name)
487
506
 
488
- self.logger.info("Dissolving finished.")
489
-
490
507
  def draw_base_layer(self, cumulative_image: np.ndarray) -> None:
491
508
  """Draws base layer and saves it into the png file.
492
509
  Base layer is the last layer to be drawn, it fills the remaining area of the map.
@@ -500,7 +517,7 @@ class Texture(Component):
500
517
  self.logger.debug("Drawing base layer %s.", layer_path)
501
518
  img = cv2.bitwise_not(cumulative_image)
502
519
  cv2.imwrite(layer_path, img)
503
- self.logger.info("Base texture %s saved.", layer_path)
520
+ self.logger.debug("Base texture %s saved.", layer_path)
504
521
 
505
522
  def get_relative_x(self, x: float) -> int:
506
523
  """Converts UTM X coordinate to relative X coordinate in map image.
@@ -620,35 +637,80 @@ class Texture(Component):
620
637
  converters = {"Polygon": self._skip, "LineString": self._sequence, "Point": self._sequence}
621
638
  return converters.get(geom_type) # type: ignore
622
639
 
623
- def polygons(
624
- self, tags: dict[str, str | list[str] | bool], width: int | None
625
- ) -> Generator[np.ndarray, None, None]:
640
+ def objects_generator(
641
+ self,
642
+ tags: dict[str, str | list[str] | bool],
643
+ width: int | None,
644
+ info_layer: str | None = None,
645
+ yield_linestrings: bool = False,
646
+ ) -> Generator[np.ndarray, None, None] | Generator[list[tuple[int, int]], None, None]:
626
647
  """Generator which yields numpy arrays of polygons from OSM data.
627
648
 
628
649
  Arguments:
629
650
  tags (dict[str, str | list[str]]): Dictionary of tags to search for.
630
651
  width (int | None): Width of the polygon in meters (only for LineString).
652
+ info_layer (str | None): Name of the corresponding info layer.
653
+ yield_linestrings (bool): Flag to determine if the LineStrings should be yielded.
631
654
 
632
655
  Yields:
633
- Generator[np.ndarray, None, None]: Numpy array of polygon points.
656
+ Generator[np.ndarray, None, None] | Generator[list[tuple[int, int]], None, None]:
657
+ Numpy array of polygon points or list of point coordinates.
634
658
  """
635
- is_fieds = "farmland" in tags.values()
659
+ is_fieds = info_layer == "fields"
636
660
  try:
637
- objects = ox.features_from_bbox(bbox=self.new_bbox, tags=tags)
661
+ if self.map.custom_osm is not None:
662
+ objects = ox.features_from_xml(self.map.custom_osm, tags=tags)
663
+ else:
664
+ objects = ox.features_from_bbox(bbox=self.new_bbox, tags=tags)
638
665
  except Exception as e: # pylint: disable=W0718
639
- self.logger.warning("Error fetching objects for tags: %s.", tags)
640
- self.logger.warning(e)
666
+ self.logger.debug("Error fetching objects for tags: %s. Error: %s.", tags, e)
641
667
  return
642
668
  objects_utm = ox.projection.project_gdf(objects, to_latlong=False)
643
669
  self.logger.debug("Fetched %s elements for tags: %s.", len(objects_utm), tags)
644
670
 
671
+ method = self.linestrings_generator if yield_linestrings else self.polygons_generator
672
+
673
+ yield from method(objects_utm, width, is_fieds)
674
+
675
+ def linestrings_generator(
676
+ self, objects_utm: pd.core.frame.DataFrame, *args, **kwargs
677
+ ) -> Generator[list[tuple[int, int]], None, None]:
678
+ """Generator which yields lists of point coordinates which represent LineStrings from OSM.
679
+
680
+ Arguments:
681
+ objects_utm (pd.core.frame.DataFrame): Dataframe with OSM objects in UTM format.
682
+
683
+ Yields:
684
+ Generator[list[tuple[int, int]], None, None]: List of point coordinates.
685
+ """
686
+ for _, obj in objects_utm.iterrows():
687
+ geometry = obj["geometry"]
688
+ if isinstance(geometry, shapely.geometry.linestring.LineString):
689
+ points = [
690
+ (self.get_relative_x(x), self.get_relative_y(y)) for x, y in geometry.coords
691
+ ]
692
+ yield points
693
+
694
+ def polygons_generator(
695
+ self, objects_utm: pd.core.frame.DataFrame, width: int | None, is_fieds: bool
696
+ ) -> Generator[np.ndarray, None, None]:
697
+ """Generator which yields numpy arrays of polygons from OSM data.
698
+
699
+ Arguments:
700
+ objects_utm (pd.core.frame.DataFrame): Dataframe with OSM objects in UTM format.
701
+ width (int | None): Width of the polygon in meters (only for LineString).
702
+ is_fieds (bool): Flag to determine if the fields should be padded.
703
+
704
+ Yields:
705
+ Generator[np.ndarray, None, None]: Numpy array of polygon points.
706
+ """
645
707
  for _, obj in objects_utm.iterrows():
646
708
  polygon = self._to_polygon(obj, width)
647
709
  if polygon is None:
648
710
  continue
649
711
 
650
- if is_fieds and self.fields_padding > 0:
651
- padded_polygon = polygon.buffer(-self.fields_padding)
712
+ if is_fieds and self.map.texture_settings.fields_padding > 0:
713
+ padded_polygon = polygon.buffer(-self.map.texture_settings.fields_padding)
652
714
 
653
715
  if not isinstance(padded_polygon, shapely.geometry.polygon.Polygon):
654
716
  self.logger.warning("The padding value is too high, field will not padded.")
@@ -712,5 +774,5 @@ class Texture(Component):
712
774
  preview_path = os.path.join(self.previews_directory, "textures_osm.png")
713
775
 
714
776
  cv2.imwrite(preview_path, merged) # type: ignore
715
- self.logger.info("Preview saved to %s.", preview_path)
777
+ self.logger.debug("Preview saved to %s.", preview_path)
716
778
  return preview_path
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: maps4fs
3
- Version: 1.2.4
3
+ Version: 1.4.1
4
4
  Summary: Generate map templates for Farming Simulator from real places.
5
5
  Author-email: iwatkot <iwatkot@gmail.com>
6
6
  License: MIT License
@@ -22,6 +22,7 @@ Requires-Dist: trimesh
22
22
  Requires-Dist: imageio
23
23
  Requires-Dist: tifffile
24
24
  Requires-Dist: pympler
25
+ Requires-Dist: pydantic
25
26
 
26
27
  <div align="center" markdown>
27
28
  <a href="https://discord.gg/Sj5QKKyE42">
@@ -60,7 +61,8 @@ Requires-Dist: pympler
60
61
  [![Checked with mypy](https://www.mypy-lang.org/static/mypy_badge.svg)](https://mypy-lang.org/)
61
62
  [![Build Status](https://github.com/iwatkot/maps4fs/actions/workflows/checks.yml/badge.svg)](https://github.com/iwatkot/maps4fs/actions)
62
63
  [![Test Coverage](https://api.codeclimate.com/v1/badges/b922fd0a7188d37e61de/test_coverage)](https://codeclimate.com/github/iwatkot/maps4fs/test_coverage)
63
- [![GitHub Repo stars](https://img.shields.io/github/stars/iwatkot/maps4fs)](https://github.com/iwatkot/maps4fs/stargazers)
64
+ [![GitHub Repo stars](https://img.shields.io/github/stars/iwatkot/maps4fs)](https://github.com/iwatkot/maps4fs/stargazers)<br>
65
+ [![Lines of code](https://tokei.rs/b1/github/iwatkot/maps4fs)](https://github.com/iwatkot/maps4fs)
64
66
 
65
67
  </div>
66
68
 
@@ -71,7 +73,9 @@ Requires-Dist: pympler
71
73
  🌿 Automatically generates decorative foliage 🆕<br>
72
74
  🌲 Automatically generates forests 🆕<br>
73
75
  🌊 Automatically generates water planes 🆕<br>
76
+ 📈 Automatically generates splines 🆕<br>
74
77
  🌍 Based on real-world data from OpenStreetMap<br>
78
+ 🗺️ Supports [custom OSM maps](/docs/custom_osm.md)<br>
75
79
  🏞️ Generates height map using SRTM dataset<br>
76
80
  📦 Provides a ready-to-use map template for the Giants Editor<br>
77
81
  🚜 Supports Farming Simulator 22 and 25<br>
@@ -79,7 +83,6 @@ Requires-Dist: pympler
79
83
  📄 Generates scripts to download high-resolution satellite images from [QGIS](https://qgis.org/download/) in one click<br>
80
84
  📕 Detailed [documentation](/docs) and tutorials <br>
81
85
  🧰 Modder Toolbox to help you with various tasks <br>
82
-
83
86
  <p align="center">
84
87
  <img src="https://github.com/user-attachments/assets/cf8f5752-9c69-4018-bead-290f59ba6976"><br>
85
88
  🌎 Detailed terrain based on real-world data.<br><br>
@@ -93,6 +96,8 @@ Requires-Dist: pympler
93
96
  🌲 Automatically generates forests.<br><br>
94
97
  <img src="https://github.com/user-attachments/assets/cce7d4e0-cba2-4dd2-b22d-03137fb2e860"><br>
95
98
  🌊 Automatically generates water planes.<br><br>
99
+ <img src="https://github.com/user-attachments/assets/0b05b511-a595-48e7-a353-8298081314a4"><br>
100
+ 📈 Automatically generates splines.<br><br>
96
101
  <img src="https://github.com/user-attachments/assets/80e5923c-22c7-4dc0-8906-680902511f3a"><br>
97
102
  🗒️ True-to-life blueprints for fast and precise modding.<br><br>
98
103
  <img width="480" src="https://github.com/user-attachments/assets/1a8802d2-6a3b-4bfa-af2b-7c09478e199b"><br>
@@ -110,14 +115,7 @@ Requires-Dist: pympler
110
115
  ## Quick Start
111
116
  There are several ways to use the tool. You obviously need the **first one**, but you can choose any of the others depending on your needs.<br>
112
117
  ### 🚜 For most users
113
- **Option 1:** Open the [maps4fs](https://maps4fs.streamlit.app) on StreamLit and generate a map template in a few clicks.<br>
114
- <i>Note, that StreamLit community hosting has some limitations, such as: <br>
115
- 1. Maximum map size is 4096x4096 meters. <br>
116
- 2. Advanced settings are disabled. <br>
117
- 3. Texture dissolving is disabled (they will look worse). </i><br>
118
-
119
- If you run the application locally, you won't have any of these limitations and will be able to generate maps of any size with any settings you want and nice looking textures.<br>
120
- So, jump to [Docker version](#option-2-docker-version) to launch the tool with one command and get the full experience.<br>
118
+ **Option 1:** Open the [maps4fs](https://maps4fs.xyz) and generate a map template in a few clicks.<br>
121
119
 
122
120
  ![Basic WebUI](https://github.com/user-attachments/assets/52f499cc-f28a-4da3-abef-0e818abe8dbe)
123
121
 
@@ -165,13 +163,13 @@ Don't know where to start? Don't worry, just follow this [step-by-step guide](do
165
163
 
166
164
  ## How-To-Run
167
165
 
168
- ### Option 1: StreamLit
169
- 🟢 Recommended for all users.
166
+ ### Option 1: Public version
167
+ 🟢 Recommended for all users.
170
168
  🛠️ Don't need to install anything.
171
- 🗺️ Supported map sizes: 2x2, 4x4 km.
172
- ⚙️ Advanced settings: disabled.
173
- 🖼️ Texture dissolving: disabled.
174
- Using the [StreamLit](https://maps4fs.streamlit.app) version of the tool is the easiest way to generate a map template. Just open the link and follow the instructions.
169
+ 🗺️ Supported map sizes: 2x2, 4x4, 8x8 km.
170
+ ⚙️ Advanced settings: enabled.
171
+ 🖼️ Texture dissolving: enabled.
172
+ Using the public version on [maps4fs.xyz](https://maps4fs.xyz) is the easiest way to generate a map template. Just open the link and follow the instructions.
175
173
  Note: due to CPU and RAM limitations of the hosting, the generation may take some time. If you need faster processing, use the [Docker version](#option-2-docker-version).<br>
176
174
 
177
175
  Using it is easy and doesn't require any guides. Enjoy!
@@ -488,6 +486,10 @@ You can also apply some advanced settings to the map generation process. Note th
488
486
 
489
487
  - Fields padding - this value (in meters) will be applied to each field, making it smaller. It's useful when the fields are too close to each other and you want to make them smaller. By default, it's set to 0.
490
488
 
489
+ - Texture dissolving - if enabled, the values from one layer will be splitted between different layers of texture, making it look more natural. By default, it's set to True. Can be turned of for faster processing.
490
+
491
+ - Skip drains - if enabled, the tool will not generate the drains and ditches on the map. By default, it's set to False. Use this if you don't need the drains on the map.
492
+
491
493
  ### Farmlands Advanced settings
492
494
 
493
495
  - Farmlands margin - this value (in meters) will be applied to each farmland, making it bigger. You can use the value to adjust how much the farmland should be bigger than the actual field. By default, it's set to 3.
@@ -498,6 +500,18 @@ You can also apply some advanced settings to the map generation process. Note th
498
500
 
499
501
  - Random plants - when adding decorative foliage, enabling this option will add different species of plants to the map. If unchecked only basic grass (smallDenseMix) will be added. Defaults to True.
500
502
 
503
+ ### Background terrain Advanced settings
504
+
505
+ - Generate background - if enabled, the obj files for the background terrain will be generated. You can turn it off if you already have those files or don't need them. By default, it's set to True.
506
+
507
+ - Generate water - if enabled, the water planes obj files will be generated. You can turn it off if you already have those files or don't need them. By default, it's set to True.
508
+
509
+ - Resize factor - the factor by which the background terrain will be resized. It will be used as 1 / resize_factor while generating the models. Which means that the larger the value the more the terrain will be resized. The lowest value is 1, in this case background terrain will not be resized. Note, than low values will lead to long processing and enormous size of the obj files.
510
+
511
+ ## Splines Advanced settings
512
+
513
+ - Splines density - number of points, which will be added (interpolate) between each pair of existing points. The higher the value, the denser the spline will be. It can smooth the splines, but high values can in opposite make the splines look unnatural.
514
+
501
515
  ## Resources
502
516
  In this section, you'll find a list of the resources that you need to create a map for the Farming Simulator.<br>
503
517
  To create a basic map, you only need the Giants Editor. But if you want to create a background terrain - the world around the map, so it won't look like it's floating in the void - you also need Blender and the Blender Exporter Plugins. To create realistic textures for the background terrain, the QGIS is required to obtain high-resolution satellite images.<br>
@@ -522,3 +536,8 @@ But also, I want to thank the people who helped me with the project in some way,
522
536
  - [Ka5tis](https://github.com/Ka5tis) - for investigating the issue with a "spiky terrain" and finding a solution - changing the `DisplacementLayer` size to a higher value.
523
537
  - [Kalderone](https://www.youtube.com/@Kalderone_FS22) - for useful feedback, suggestions, expert advice on the map-making process and highlihting some important settings in the Giants Editor.
524
538
  - [OneSunnySunday](https://www.artstation.com/onesunnysunday) - for expert advice on Blender, help in processing background terrain, and compiling detailed tutorials on how to prepare the OBJ files for use in Giants Editor.
539
+ - [BFernaesds](https://github.com/BFernaesds) - for the manual tests of the app.
540
+ - [gamerdesigns](https://github.com/gamerdesigns) - for the manual tests of the app.
541
+ - [Tox3](https://github.com/Tox3) - for the manual tests of the app.
542
+ - [Lucandia](https://github.com/Lucandia) - for the awesome StreamLit [widget to preview STL files](https://github.com/Lucandia/streamlit_stl).
543
+ - [H4rdB4se](https://github.com/H4rdB4se) - for investigating the issue with custom OSM files and finding a proper way to work with the files in JOSM.
@@ -0,0 +1,21 @@
1
+ maps4fs/__init__.py,sha256=LMzzORK3Q3OjXmmRJ03CpS2SMP6zTwKNnUUei3P7s40,300
2
+ maps4fs/logger.py,sha256=B-NEYpMjPAAqlV4VpfTi6nbBFnEABVtQOaYe6nMpidg,1489
3
+ maps4fs/generator/__init__.py,sha256=zZMLEkGzb4z0xql650gOtGSvcgX58DnJ2yN3vC2daRk,43
4
+ maps4fs/generator/background.py,sha256=ySABP9HLji8R0aXi1BwjUQtP2uDqZPkrlmugowa9Gkk,22836
5
+ maps4fs/generator/component.py,sha256=58UQgdR-7KlWHTfwLesNNK76BTRsiVngRa6B64OKjhc,20065
6
+ maps4fs/generator/config.py,sha256=0QmK052B8bxyHVhg3jzCORLfOBMMmqVfhhbqXKf6OMk,4383
7
+ maps4fs/generator/dem.py,sha256=MZf3ZjawJ977TxqB1q9nNpvPZUNwfmm2EaJDtVU-eCU,15939
8
+ maps4fs/generator/game.py,sha256=jjo7CTwHHSkRpeD_QgRXkhR_NxI09C4kMxz-nYOTM4A,7931
9
+ maps4fs/generator/grle.py,sha256=onhZovvRtireDfw7wEOL0CZmOmoVzRPY-R4TlvbOUMI,17561
10
+ maps4fs/generator/i3d.py,sha256=vbH7G0kDOGC6gbNDE-QYxMnKOMJ-vCGYdaKhWwci4ZU,23748
11
+ maps4fs/generator/map.py,sha256=JwrlUdjyvSYB82HfseJ6w2-ZDFwplyfPCn84Z5awdCY,11721
12
+ maps4fs/generator/qgis.py,sha256=Es8hLuqN_KH8lDfnJE6He2rWYbAKJ3RGPn-o87S6CPI,6116
13
+ maps4fs/generator/texture.py,sha256=fZN0soGWk8-f3GuQWiwJ2yQTsmL9fLWVlgqeLI6ePi4,30648
14
+ maps4fs/toolbox/__init__.py,sha256=zZMLEkGzb4z0xql650gOtGSvcgX58DnJ2yN3vC2daRk,43
15
+ maps4fs/toolbox/background.py,sha256=9BXWNqs_n3HgqDiPztWylgYk_QM4YgBpe6_ZNQAWtSc,2154
16
+ maps4fs/toolbox/dem.py,sha256=z9IPFNmYbjiigb3t02ZenI3Mo8odd19c5MZbjDEovTo,3525
17
+ maps4fs-1.4.1.dist-info/LICENSE.md,sha256=pTKD_oUexcn-yccFCTrMeLkZy0ifLRa-VNcDLqLZaIw,10749
18
+ maps4fs-1.4.1.dist-info/METADATA,sha256=GYS-0gCIT-DmBEL29mDjwQIcn-7t_XYYH05ObyMOQSc,32421
19
+ maps4fs-1.4.1.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
20
+ maps4fs-1.4.1.dist-info/top_level.txt,sha256=Ue9DSRlejRQRCaJueB0uLcKrWwsEq9zezfv5dI5mV1M,8
21
+ maps4fs-1.4.1.dist-info/RECORD,,
@@ -1,21 +0,0 @@
1
- maps4fs/__init__.py,sha256=da4jmND2Ths9AffnkAKgzLHNkvKFOc_l21gJisPXqWY,155
2
- maps4fs/logger.py,sha256=B-NEYpMjPAAqlV4VpfTi6nbBFnEABVtQOaYe6nMpidg,1489
3
- maps4fs/generator/__init__.py,sha256=zZMLEkGzb4z0xql650gOtGSvcgX58DnJ2yN3vC2daRk,43
4
- maps4fs/generator/background.py,sha256=21xB-xn2A6QGdX9UVWqvzoW-L6JWPAZOqCcIhR8nxKU,22689
5
- maps4fs/generator/component.py,sha256=SeI1xfwo9I4lrkcOcHyjxMffHsG8OXc80-mNsR2zpPw,17748
6
- maps4fs/generator/config.py,sha256=b7qY0luC-_WM_c72Ohtlf4FrB37X5cALInbestSdUsw,4382
7
- maps4fs/generator/dem.py,sha256=rc7ADzjvlZzStOqagsWW0Vrm9-X86aPpoR1RhBF_-OE,16025
8
- maps4fs/generator/game.py,sha256=ZQeYzPzPB3CG41avdhNCyTZpHEeedqNBuAbNevTZuXg,7931
9
- maps4fs/generator/grle.py,sha256=3hcr5e2YLXemFi-_x2cLHWbMVb06591k0PZxaBVovH8,17600
10
- maps4fs/generator/i3d.py,sha256=oK5pKjzvT-gydma5Q6CcDYTVODGxK7MIGajLrAV9JkU,18370
11
- maps4fs/generator/map.py,sha256=lA1MNAcMwsDtsYxbwwm7DjwP3zraHKnri_xnLUu30j0,5326
12
- maps4fs/generator/qgis.py,sha256=Es8hLuqN_KH8lDfnJE6He2rWYbAKJ3RGPn-o87S6CPI,6116
13
- maps4fs/generator/texture.py,sha256=vgiwJNIl14JABhNOBGh_W8SBkAUNQN3TjNJayR76va0,27468
14
- maps4fs/toolbox/__init__.py,sha256=zZMLEkGzb4z0xql650gOtGSvcgX58DnJ2yN3vC2daRk,43
15
- maps4fs/toolbox/background.py,sha256=9BXWNqs_n3HgqDiPztWylgYk_QM4YgBpe6_ZNQAWtSc,2154
16
- maps4fs/toolbox/dem.py,sha256=z9IPFNmYbjiigb3t02ZenI3Mo8odd19c5MZbjDEovTo,3525
17
- maps4fs-1.2.4.dist-info/LICENSE.md,sha256=pTKD_oUexcn-yccFCTrMeLkZy0ifLRa-VNcDLqLZaIw,10749
18
- maps4fs-1.2.4.dist-info/METADATA,sha256=cR3704tYCx9AaL8NW5cLrkMijvDNyWdxT7CpCaTv9NE,30600
19
- maps4fs-1.2.4.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
20
- maps4fs-1.2.4.dist-info/top_level.txt,sha256=Ue9DSRlejRQRCaJueB0uLcKrWwsEq9zezfv5dI5mV1M,8
21
- maps4fs-1.2.4.dist-info/RECORD,,