Skip to content

kumiki.drawings.layout

Flat import path

kumiki/__init__.py re-exports everything on this page via from kumiki import *, so every name below is also available directly as kumiki.PlacedViewport -- you do not need to import from the submodule path shown in the heading above.

kumiki.drawings.layout

Lays out a drawing's viewports on a page: a rect per leaf viewport, as fractions of the page.

PlacedViewport dataclass

PlacedViewport(id: ViewportId, viewport: Viewport, rect: Rect, z: int)

A leaf viewport with its id and its rect on the page.

id instance-attribute

viewport instance-attribute

viewport: Viewport

rect instance-attribute

rect: Rect

z instance-attribute

z: int

label property

label: Optional[str]

resolve_drawing

resolve_drawing(drawing) -> Tuple[PlacedViewport, ...]

Return a drawing's leaf viewports laid out on its own page.

Source code in kumiki/drawings/layout.py
def resolve_drawing(drawing) -> Tuple[PlacedViewport, ...]:
    """Return a drawing's leaf viewports laid out on its own page."""
    if drawing.page is None:
        raise ValueError(
            f"Drawing {drawing.drawing_id} has no page, so there is nothing for its "
            f"viewports to be fractions of."
        )
    return resolve_viewports(drawing.viewports, drawing.page)

resolve_viewports

resolve_viewports(viewports: Sequence[Viewport], page: Page) -> Tuple[PlacedViewport, ...]

Return every leaf viewport with its rect, ordered by z then position (draw order).

Source code in kumiki/drawings/layout.py
def resolve_viewports(viewports: Sequence[Viewport], page: Page) -> Tuple[PlacedViewport, ...]:
    """Return every leaf viewport with its rect, ordered by z then position (draw order)."""
    placed: List[PlacedViewport] = []
    for index, root in enumerate(viewports):
        if root.rect is None:
            raise ValueError(
                f"Viewport {index} floats on the page and needs a rect. "
                f"Drawing checks this; resolving a bare list does not."
            )
        _place(root, root.rect, (index,), root.z, page, placed)
    # Sorted on z alone, with Python's stable sort keeping written order within
    # a z. Sorting on the id as well would order "0.10" before "0.2".
    return tuple(sorted(placed, key=lambda view: view.z))