mirror of
https://github.com/enzet/map-machine.git
synced 2025-05-22 21:46:24 +02:00
Add icon collection class.
This commit is contained in:
parent
9fd2d869ff
commit
3bb6439d7b
4 changed files with 138 additions and 121 deletions
15
roentgen.py
15
roentgen.py
|
@ -14,7 +14,7 @@ import svgwrite
|
||||||
|
|
||||||
from roentgen.constructor import Constructor
|
from roentgen.constructor import Constructor
|
||||||
from roentgen.flinger import Flinger
|
from roentgen.flinger import Flinger
|
||||||
from roentgen.grid import draw_all_icons
|
from roentgen.grid import IconCollection
|
||||||
from roentgen.icon import ShapeExtractor
|
from roentgen.icon import ShapeExtractor
|
||||||
from roentgen.mapper import (
|
from roentgen.mapper import (
|
||||||
AUTHOR_MODE, CREATION_TIME_MODE, ICONS_FILE_NAME, Painter, TAGS_FILE_NAME,
|
AUTHOR_MODE, CREATION_TIME_MODE, ICONS_FILE_NAME, Painter, TAGS_FILE_NAME,
|
||||||
|
@ -158,22 +158,25 @@ def draw_element(target: str, tags_description: str):
|
||||||
svg.write(open("test_icon.svg", "w+"))
|
svg.write(open("test_icon.svg", "w+"))
|
||||||
|
|
||||||
|
|
||||||
def draw_grid() -> None:
|
def draw_icons() -> None:
|
||||||
"""
|
"""
|
||||||
Draw all possible icon shapes combinations as grid.
|
Draw all possible icon shapes combinations as grid in one SVG file and as
|
||||||
|
individual SVG files.
|
||||||
"""
|
"""
|
||||||
os.makedirs("icon_set", exist_ok=True)
|
os.makedirs("icon_set", exist_ok=True)
|
||||||
scheme: Scheme = Scheme(Path("scheme/default.yml"))
|
scheme: Scheme = Scheme(Path("scheme/default.yml"))
|
||||||
extractor: ShapeExtractor = ShapeExtractor(
|
extractor: ShapeExtractor = ShapeExtractor(
|
||||||
Path("icons/icons.svg"), Path("icons/config.json")
|
Path("icons/icons.svg"), Path("icons/config.json")
|
||||||
)
|
)
|
||||||
draw_all_icons(scheme, extractor, "icon_grid.svg", "icon_set")
|
collection: IconCollection = IconCollection.from_scheme(scheme, extractor)
|
||||||
|
collection.draw_grid(Path("icon_grid.svg"))
|
||||||
|
collection.draw_icons(Path("icon_set"))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
if len(sys.argv) == 3 and sys.argv[1] in ["node", "way", "area"]:
|
if len(sys.argv) == 3 and sys.argv[1] in ["node", "way", "area"]:
|
||||||
draw_element(sys.argv[1], sys.argv[2])
|
draw_element(sys.argv[1], sys.argv[2])
|
||||||
elif len(sys.argv) == 2 and sys.argv[1] == "grid":
|
elif len(sys.argv) == 2 and sys.argv[1] == "icons":
|
||||||
draw_grid()
|
draw_icons()
|
||||||
else:
|
else:
|
||||||
main(sys.argv)
|
main(sys.argv)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
"""
|
"""
|
||||||
Icon grid drawing.
|
Icon grid drawing.
|
||||||
"""
|
"""
|
||||||
from os.path import join
|
from pathlib import Path
|
||||||
from typing import List, Set
|
from typing import List, Set
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
@ -15,22 +15,23 @@ __author__ = "Sergey Vartanov"
|
||||||
__email__ = "me@enzet.ru"
|
__email__ = "me@enzet.ru"
|
||||||
|
|
||||||
|
|
||||||
def draw_all_icons(
|
class IconCollection:
|
||||||
scheme: Scheme, extractor: ShapeExtractor,
|
def __init__(self, icons):
|
||||||
output_file_name: str, output_directory: str, columns: int = 16,
|
self.icons: List[Icon] = icons
|
||||||
step: float = 24, background_color: Color = Color("white"),
|
|
||||||
|
@classmethod
|
||||||
|
def from_scheme(
|
||||||
|
cls,
|
||||||
|
scheme: Scheme,
|
||||||
|
extractor: ShapeExtractor,
|
||||||
|
background_color: Color = Color("white"),
|
||||||
color: Color = Color("black")
|
color: Color = Color("black")
|
||||||
) -> None:
|
) -> "IconCollection":
|
||||||
"""
|
"""
|
||||||
Draw all possible icon combinations in grid.
|
Draw all possible icon combinations in grid.
|
||||||
|
|
||||||
:param scheme: tag specification
|
:param scheme: tag specification
|
||||||
:param extractor: shape extractor for icon creation
|
:param extractor: shape extractor for icon creation
|
||||||
:param output_file_name: output SVG file name for icon grid
|
|
||||||
:param output_directory: path to the directory to store individual SVG files
|
|
||||||
for icons
|
|
||||||
:param columns: the number of columns in grid
|
|
||||||
:param step: horizontal and vertical distance between icons
|
|
||||||
:param background_color: background color
|
:param background_color: background color
|
||||||
:param color: icon color
|
:param color: icon color
|
||||||
"""
|
"""
|
||||||
|
@ -88,27 +89,29 @@ def draw_all_icons(
|
||||||
"Icons with no tag specification: \n " +
|
"Icons with no tag specification: \n " +
|
||||||
", ".join(sorted(extractor.shapes.keys() - specified_ids)) + "."
|
", ".join(sorted(extractor.shapes.keys() - specified_ids)) + "."
|
||||||
)
|
)
|
||||||
|
return cls(icons)
|
||||||
|
|
||||||
for icon in icons:
|
def draw_icons(self, output_directory: Path):
|
||||||
icon.draw_to_file(join(
|
"""
|
||||||
output_directory, f"{' + '.join(icon.get_names())}.svg"
|
:param output_directory: path to the directory to store individual SVG files
|
||||||
))
|
for icons
|
||||||
|
"""
|
||||||
draw_grid(
|
for icon in self.icons:
|
||||||
output_file_name, sorted(icons), columns, step,
|
icon.draw_to_file(
|
||||||
background_color=background_color
|
output_directory / f"{'___'.join(icon.get_shape_ids())}.svg"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def draw_grid(
|
def draw_grid(
|
||||||
file_name: str, icons: List[Icon], columns: int = 16, step: float = 24,
|
self,
|
||||||
background_color: Color = Color("white")
|
file_name: Path,
|
||||||
|
columns: int = 16,
|
||||||
|
step: float = 24,
|
||||||
|
background_color: Color = Color("white"),
|
||||||
):
|
):
|
||||||
"""
|
"""
|
||||||
Draw icons in the form of table
|
Draw icons in the form of table.
|
||||||
|
|
||||||
:param file_name: output SVG file name
|
:param file_name: output SVG file name
|
||||||
:param icons: list of icons
|
|
||||||
:param columns: number of columns in grid
|
:param columns: number of columns in grid
|
||||||
:param step: horizontal and vertical distance between icons in grid
|
:param step: horizontal and vertical distance between icons in grid
|
||||||
:param background_color: background color
|
:param background_color: background color
|
||||||
|
@ -116,16 +119,17 @@ def draw_grid(
|
||||||
point: np.array = np.array((step / 2, step / 2))
|
point: np.array = np.array((step / 2, step / 2))
|
||||||
width: float = step * columns
|
width: float = step * columns
|
||||||
|
|
||||||
height: int = int(int(len(icons) / (width / step) + 1) * step)
|
height: int = int(int(len(self.icons) / (width / step) + 1) * step)
|
||||||
svg: Drawing = Drawing(file_name, (width, height))
|
svg: Drawing = Drawing(str(file_name), (width, height))
|
||||||
svg.add(svg.rect((0, 0), (width, height), fill=background_color.hex))
|
svg.add(svg.rect((0, 0), (width, height), fill=background_color.hex))
|
||||||
|
|
||||||
for icon in icons:
|
for icon in self.icons:
|
||||||
icon: Icon
|
icon: Icon
|
||||||
svg.add(svg.rect(
|
rectangle = svg.rect(
|
||||||
point - np.array((10, 10)), (20, 20),
|
point - np.array((10, 10)), (20, 20),
|
||||||
fill=background_color.hex
|
fill=background_color.hex
|
||||||
))
|
)
|
||||||
|
svg.add(rectangle)
|
||||||
icon.draw(svg, point)
|
icon.draw(svg, point)
|
||||||
point += np.array((step, 0))
|
point += np.array((step, 0))
|
||||||
if point[0] > width - 8:
|
if point[0] > width - 8:
|
||||||
|
@ -133,7 +137,8 @@ def draw_grid(
|
||||||
point += np.array((0, step))
|
point += np.array((0, step))
|
||||||
height += step
|
height += step
|
||||||
|
|
||||||
print(f"Icons: {len(icons)}.")
|
|
||||||
|
|
||||||
with open(file_name, "w") as output_file:
|
with open(file_name, "w") as output_file:
|
||||||
svg.write(output_file)
|
svg.write(output_file)
|
||||||
|
|
||||||
|
def __len__(self) -> int:
|
||||||
|
return len(self.icons)
|
||||||
|
|
|
@ -323,13 +323,13 @@ class Icon:
|
||||||
for shape_specification in self.shape_specifications:
|
for shape_specification in self.shape_specifications:
|
||||||
shape_specification.draw(svg, point, tags, outline)
|
shape_specification.draw(svg, point, tags, outline)
|
||||||
|
|
||||||
def draw_to_file(self, file_name: str):
|
def draw_to_file(self, file_name: Path):
|
||||||
"""
|
"""
|
||||||
Draw icon to the SVG file.
|
Draw icon to the SVG file.
|
||||||
|
|
||||||
:param file_name: output SVG file name
|
:param file_name: output SVG file name
|
||||||
"""
|
"""
|
||||||
svg: Drawing = Drawing(file_name, (16, 16))
|
svg: Drawing = Drawing(str(file_name), (16, 16))
|
||||||
|
|
||||||
for shape_specification in self.shape_specifications:
|
for shape_specification in self.shape_specifications:
|
||||||
shape_specification.draw(svg, (8, 8))
|
shape_specification.draw(svg, (8, 8))
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
"""
|
"""
|
||||||
Test icon generation for nodes.
|
Test icon generation for nodes.
|
||||||
"""
|
"""
|
||||||
from os import makedirs
|
from pathlib import Path
|
||||||
from typing import Dict
|
from typing import Dict
|
||||||
|
|
||||||
from roentgen.icon import IconSet
|
from roentgen.icon import IconSet
|
||||||
from roentgen.grid import draw_all_icons
|
from roentgen.grid import IconCollection
|
||||||
from test import SCHEME, SHAPE_EXTRACTOR
|
from test import SCHEME, SHAPE_EXTRACTOR
|
||||||
|
|
||||||
__author__ = "Sergey Vartanov"
|
__author__ = "Sergey Vartanov"
|
||||||
|
@ -16,8 +16,17 @@ def test_icons() -> None:
|
||||||
"""
|
"""
|
||||||
Test grid drawing.
|
Test grid drawing.
|
||||||
"""
|
"""
|
||||||
makedirs("icon_set", exist_ok=True)
|
temp_directory: Path = Path("temp")
|
||||||
draw_all_icons(SCHEME, SHAPE_EXTRACTOR, "temp.svg", "icon_set")
|
temp_directory.mkdir(exist_ok=True)
|
||||||
|
|
||||||
|
set_directory: Path = temp_directory / "icon_set"
|
||||||
|
set_directory.mkdir(exist_ok=True)
|
||||||
|
|
||||||
|
collection: IconCollection = IconCollection.from_scheme(
|
||||||
|
SCHEME, SHAPE_EXTRACTOR
|
||||||
|
)
|
||||||
|
collection.draw_grid(temp_directory / "grid.svg")
|
||||||
|
collection.draw_icons(set_directory)
|
||||||
|
|
||||||
|
|
||||||
def get_icon(tags: Dict[str, str]) -> IconSet:
|
def get_icon(tags: Dict[str, str]) -> IconSet:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue