mirror of
https://github.com/enzet/map-machine.git
synced 2025-04-29 18:27:19 +02:00
76 lines
2.3 KiB
Python
76 lines
2.3 KiB
Python
"""
|
|
Drawing separate map elements.
|
|
"""
|
|
import argparse
|
|
import logging
|
|
from pathlib import Path
|
|
|
|
import numpy as np
|
|
import svgwrite
|
|
from svgwrite.path import Path as SVGPath
|
|
|
|
from map_machine.map_configuration import LabelMode
|
|
from map_machine.pictogram.icon import ShapeExtractor
|
|
from map_machine.pictogram.point import Point
|
|
from map_machine.scheme import LineStyle, Scheme
|
|
from map_machine.text import Label
|
|
from map_machine.workspace import workspace
|
|
|
|
__author__ = "Sergey Vartanov"
|
|
__email__ = "me@enzet.ru"
|
|
|
|
|
|
def draw_element(options: argparse.Namespace) -> None:
|
|
"""Draw single node, line, or area."""
|
|
target: str
|
|
tags_description: str
|
|
if options.node:
|
|
target = "node"
|
|
tags_description = options.node
|
|
elif options.way:
|
|
target = "way"
|
|
tags_description = options.way
|
|
else:
|
|
target = "area"
|
|
tags_description = options.area
|
|
|
|
tags: dict[str, str] = {
|
|
tag.split("=")[0]: tag.split("=")[1]
|
|
for tag in tags_description.split(",")
|
|
}
|
|
scheme: Scheme = Scheme.from_file(workspace.DEFAULT_SCHEME_PATH)
|
|
extractor: ShapeExtractor = ShapeExtractor(
|
|
workspace.ICONS_PATH, workspace.ICONS_CONFIG_PATH
|
|
)
|
|
processed: set[str] = set()
|
|
icon, _ = scheme.get_icon(extractor, tags, processed)
|
|
is_for_node: bool = target == "node"
|
|
labels: list[Label] = scheme.construct_text(tags, processed, LabelMode.ALL)
|
|
point: Point = Point(
|
|
icon,
|
|
labels,
|
|
tags,
|
|
processed,
|
|
np.array((32.0, 32.0)),
|
|
is_for_node=is_for_node,
|
|
draw_outline=is_for_node,
|
|
)
|
|
border: np.ndarray = np.array((16.0, 16.0))
|
|
size: np.ndarray = point.get_size() + border
|
|
point.point = np.array((size[0] / 2.0, 16.0 / 2.0 + border[1] / 2.0))
|
|
|
|
output_file_path: Path = workspace.output_path / "element.svg"
|
|
svg: svgwrite.Drawing = svgwrite.Drawing(
|
|
str(output_file_path), size.astype(float)
|
|
)
|
|
for style in scheme.get_style(tags):
|
|
style: LineStyle
|
|
path: SVGPath = svg.path(d="M 0,0 L 64,0 L 64,64 L 0,64 L 0,0 Z")
|
|
path.update(style.style)
|
|
svg.add(path)
|
|
point.draw_main_shapes(svg)
|
|
point.draw_extra_shapes(svg)
|
|
point.draw_texts(svg)
|
|
with output_file_path.open("w+", encoding="utf-8") as output_file:
|
|
svg.write(output_file)
|
|
logging.info(f"Element is written to {output_file_path}.")
|