Skip to content

Parsed Diagram

src.drawpyo.drawio_import.drawio_parser.ParsedDiagram dataclass

High-level diagram representation with convenient access methods.

Source code in src/drawpyo/drawio_import/drawio_parser.py
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
@dataclass
class ParsedDiagram:
    """High-level diagram representation with convenient access methods."""

    shapes: List[DiagramBase] = field(default_factory=list)
    edges: List[Edge] = field(default_factory=list)
    _id_map: Dict[str, DiagramBase] = field(default_factory=dict, repr=False)
    page_id: Optional[str] = None
    name: Optional[str] = None

    def get_by_id(self, cell_id: str) -> Optional[DiagramBase]:
        """Get an element by its Draw.io cell ID.

        Args:
            cell_id: The Draw.io cell ID

        Returns:
            The diagram element or None if not found
        """
        return self._id_map.get(cell_id)

    @property
    def element_count(self) -> int:
        """Total number of elements (shapes + edges)."""
        return len(self.shapes) + len(self.edges)

    def add_to(
        self,
        page: Page,
        offset: tuple = (0, 0),
        include_shapes: bool = True,
        include_edges: bool = True,
    ) -> None:
        """Attach diagram elements to a page, optionally applying an offset.

        Args:
            page: Target Page instance to attach elements to
            offset: (dx, dy) applied to top-level objects and edge points
            include_shapes: Whether to add shapes to the page
            include_edges: Whether to add edges to the page
        """
        dx, dy = offset

        if include_shapes:
            for shape in self.shapes:
                _update_page_links(shape, page)
                shape.page = page
            if dx or dy:
                for shape in self.shapes:
                    if isinstance(shape, Object) and shape.parent is None:
                        shape.position = (
                            shape.position[0] + dx,
                            shape.position[1] + dy,
                        )

        if include_edges:
            for edge in self.edges:
                _update_page_links(edge, page)
                edge.page = page
            if dx or dy:
                for edge in self.edges:
                    for point in edge.geometry.points:
                        point.x = point.x + dx
                        point.y = point.y + dy

element_count property

Total number of elements (shapes + edges).

add_to(page, offset=(0, 0), include_shapes=True, include_edges=True)

Attach diagram elements to a page, optionally applying an offset.

Parameters:

Name Type Description Default
page Page

Target Page instance to attach elements to

required
offset tuple

(dx, dy) applied to top-level objects and edge points

(0, 0)
include_shapes bool

Whether to add shapes to the page

True
include_edges bool

Whether to add edges to the page

True
Source code in src/drawpyo/drawio_import/drawio_parser.py
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
def add_to(
    self,
    page: Page,
    offset: tuple = (0, 0),
    include_shapes: bool = True,
    include_edges: bool = True,
) -> None:
    """Attach diagram elements to a page, optionally applying an offset.

    Args:
        page: Target Page instance to attach elements to
        offset: (dx, dy) applied to top-level objects and edge points
        include_shapes: Whether to add shapes to the page
        include_edges: Whether to add edges to the page
    """
    dx, dy = offset

    if include_shapes:
        for shape in self.shapes:
            _update_page_links(shape, page)
            shape.page = page
        if dx or dy:
            for shape in self.shapes:
                if isinstance(shape, Object) and shape.parent is None:
                    shape.position = (
                        shape.position[0] + dx,
                        shape.position[1] + dy,
                    )

    if include_edges:
        for edge in self.edges:
            _update_page_links(edge, page)
            edge.page = page
        if dx or dy:
            for edge in self.edges:
                for point in edge.geometry.points:
                    point.x = point.x + dx
                    point.y = point.y + dy

get_by_id(cell_id)

Get an element by its Draw.io cell ID.

Parameters:

Name Type Description Default
cell_id str

The Draw.io cell ID

required

Returns:

Type Description
Optional[DiagramBase]

The diagram element or None if not found

Source code in src/drawpyo/drawio_import/drawio_parser.py
29
30
31
32
33
34
35
36
37
38
def get_by_id(self, cell_id: str) -> Optional[DiagramBase]:
    """Get an element by its Draw.io cell ID.

    Args:
        cell_id: The Draw.io cell ID

    Returns:
        The diagram element or None if not found
    """
    return self._id_map.get(cell_id)