Skip to content

AF

momapy.sbgn.af

SBGN Activity Flow (AF) subpackage facade.

Layout-model mapping catalogue

This section lists, for each model-element category in SBGN-AF, the shape of the corresponding key in LayoutModelMapping. See LayoutModelMapping for the general concepts (singleton keys, frozenset keys, anchors).

Singleton keys (one layout element represents the model element):

Model element Layout element used as the key
Compartment CompartmentLayout
BiologicalActivity BiologicalActivityLayout
Phenotype PhenotypeLayout
UnitOfInformation and subclasses (e.g. MacromoleculeUnitOfInformation, NucleicAcidFeatureUnitOfInformation, SimpleChemicalUnitOfInformation, ComplexUnitOfInformation, UnspecifiedEntityUnitOfInformation, PerturbationUnitOfInformation) The corresponding *UnitOfInformationLayout (e.g. MacromoleculeUnitOfInformationLayout, PerturbationUnitOfInformationLayout)
Submap SubmapLayout
LogicalOperatorInput LogicArcLayout
TagReference, TerminalReference EquivalenceArcLayout

Frozenset keys (a cluster of layout elements jointly represents the model element; the anchor is the layout that stands for the cluster on its own and must be passed as anchor= when calling add_mapping):

Model element Members of the frozenset key Anchor
LogicalOperator and subclasses (e.g. AndOperator, OrOperator, NotOperator, DelayOperator) The operator *Layout (e.g. AndOperatorLayout, DelayOperatorLayout) + every LogicArcLayout input + every target layout those logic arcs point to The operator *Layout
Influence and subclasses (e.g. UnknownInfluence, PositiveInfluence, NegativeInfluence, NecessaryStimulation) The influence arc layout (e.g. UnknownInfluenceLayout, PositiveInfluenceLayout, NecessaryStimulationLayout) + all layouts in the source cluster (resolved via the source's own frozenset key if it has one, else the source layout itself) + all layouts in the target cluster (resolved the same way) The influence arc layout
Tag or Terminal carrying TagReference or TerminalReference arcs The TagLayout or TerminalLayout + every EquivalenceArcLayout reference arc + every referenced activity layout The TagLayout or TerminalLayout

Standalone Tag and Terminal instances (with no reference arcs) use a singleton key: TagLayout or TerminalLayout.

Modules:

Name Description
layout

Layout classes for SBGN Activity Flow (AF) maps.

map

Map classes for SBGN Activity Flow (AF) maps.

model

Model classes for SBGN Activity Flow (AF) maps.

Classes:

Name Description
Activity

Activity in an SBGN-AF map.

AndOperator

Logical AND operator.

AndOperatorLayout

Layout for AND operators.

BiologicalActivity

Biological activity.

BiologicalActivityLayout

Layout for biological activities.

Compartment

Compartment in an SBGN-AF map.

CompartmentLayout

Layout for compartments.

ComplexUnitOfInformation

Unit of information typing a biological activity as a complex.

ComplexUnitOfInformationLayout

Layout for complex units of information.

DelayOperator

Logical DELAY operator.

DelayOperatorLayout

Layout for DELAY operators.

EquivalenceArcLayout

Layout for equivalence arcs.

Influence

Influence between activities.

LogicArcLayout

Layout for logic arcs.

LogicalOperator

Logical operator.

LogicalOperatorInput

Input to a logical operator.

MacromoleculeUnitOfInformation

Unit of information typing a biological activity as a macromolecule.

MacromoleculeUnitOfInformationLayout

Layout for macromolecule units of information.

NecessaryStimulation

Necessary stimulation.

NecessaryStimulationLayout

Layout for necessary stimulations.

NegativeInfluence

Negative (inhibiting) influence.

NegativeInfluenceLayout

Layout for negative influences.

NotOperator

Logical NOT operator.

NotOperatorLayout

Layout for NOT operators.

NucleicAcidFeatureUnitOfInformation

Unit of information typing a biological activity as a nucleic acid feature.

NucleicAcidFeatureUnitOfInformationLayout

Layout for nucleic acid feature units of information.

OrOperator

Logical OR operator.

OrOperatorLayout

Layout for OR operators.

PerturbationUnitOfInformation

Unit of information typing a biological activity as a perturbation.

PerturbationUnitOfInformationLayout

Layout for perturbation units of information.

Phenotype

Phenotype activity.

PhenotypeLayout

Layout for phenotypes.

PositiveInfluence

Positive (stimulating) influence.

PositiveInfluenceLayout

Layout for positive influences.

SBGNAFLayout

SBGN-AF layout.

SBGNAFMap

SBGN-AF map.

SBGNAFModel

SBGN-AF model.

SimpleChemicalUnitOfInformation

Unit of information typing a biological activity as a simple chemical.

SimpleChemicalUnitOfInformationLayout

Layout for simple chemical units of information.

Submap

Submap element.

SubmapLayout

Layout for submaps.

Tag

Tag element.

TagLayout

Layout for tags.

TagReference

Reference to a tag.

Terminal

Terminal element.

TerminalLayout

Layout for terminals.

TerminalReference

Reference to a terminal.

UnitOfInformation

Unit of information for activities and compartments.

UnitOfInformationLayout

Class for unit of information layouts

UnknownInfluence

Influence of unspecified sign.

UnknownInfluenceLayout

Layout for unknown influences.

UnspecifiedEntityUnitOfInformation

Unit of information typing a biological activity as an unspecified entity.

UnspecifiedEntityUnitOfInformationLayout

Layout for unspecified entity units of information.

Activity dataclass

Activity(*, id_: str = make_uuid4_as_str(), label: str | None = None, compartment: Compartment | None = None)

Bases: SBGNModelElement

Activity in an SBGN-AF map.

Activities represent biological activities or processes.

Attributes:

Name Type Description

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'8d9ca32a-45df-438c-be7a-0aa9a4af2cfa'
label str | None
None
compartment Compartment | None
None

Methods:

Name Description
descendants

Return every ModelElement reachable from self, excluding self.

descendants

descendants() -> list[ModelElement]

Return every ModelElement reachable from self, excluding self.

Walks scalar ModelElement fields and frozenset/tuple containers, deduplicating by object identity.

Returns:

Type Description
list[ModelElement]

The list of reachable ModelElement instances in visit

list[ModelElement]

order, without self.

Source code in src/momapy/core/elements.py
def descendants(self) -> list["ModelElement"]:
    """Return every `ModelElement` reachable from `self`, excluding `self`.

    Walks scalar `ModelElement` fields and `frozenset`/`tuple`
    containers, deduplicating by object identity.

    Returns:
        The list of reachable `ModelElement` instances in visit
        order, without `self`.
    """
    seen: set[int] = {id(self)}
    result: list[ModelElement] = []
    if dataclasses.is_dataclass(self):
        for field in dataclasses.fields(type(self)):
            _walk_model_graph(getattr(self, field.name), seen, result)
    return result

AndOperator dataclass

AndOperator(*, id_: str = make_uuid4_as_str(), inputs: frozenset[LogicalOperatorInput] = frozenset())

Bases: LogicalOperator

Logical AND operator.

The output is active only when every input is active.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'266c5a05-6c29-46de-bc87-228b0c4ca609'
inputs frozenset[LogicalOperatorInput]

Build an immutable unordered collection of unique elements.

<dynamic>

Methods:

Name Description
descendants

Return every ModelElement reachable from self, excluding self.

descendants

descendants() -> list[ModelElement]

Return every ModelElement reachable from self, excluding self.

Walks scalar ModelElement fields and frozenset/tuple containers, deduplicating by object identity.

Returns:

Type Description
list[ModelElement]

The list of reachable ModelElement instances in visit

list[ModelElement]

order, without self.

Source code in src/momapy/core/elements.py
def descendants(self) -> list["ModelElement"]:
    """Return every `ModelElement` reachable from `self`, excluding `self`.

    Walks scalar `ModelElement` fields and `frozenset`/`tuple`
    containers, deduplicating by object identity.

    Returns:
        The list of reachable `ModelElement` instances in visit
        order, without `self`.
    """
    seen: set[int] = {id(self)}
    result: list[ModelElement] = []
    if dataclasses.is_dataclass(self):
        for field in dataclasses.fields(type(self)):
            _walk_model_graph(getattr(self, field.name), seen, result)
    return result

AndOperatorLayout dataclass

AndOperatorLayout(fill: NoneValueType | Color | None = white, stroke: NoneValueType | Color | None = black, stroke_width: float | None = 1.25, *, id_: str = make_uuid4_as_str(), layout_elements: tuple[LayoutElement] = tuple(), group_fill: NoneValueType | Color | None = None, group_fill_rule: FillRule | None = None, group_filter: NoneValueType | Filter | None = None, group_font_family: str | None = None, group_font_size: float | None = None, group_font_style: FontStyle | None = None, group_font_weight: FontWeight | float | None = None, group_stroke: NoneValueType | Color | None = None, group_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, group_stroke_dashoffset: NoneValueType | float | None = None, group_stroke_width: NoneValueType | float | None = None, group_text_anchor: TextAnchor | None = None, group_transform: NoneValueType | tuple[Transformation] | None = None, filter: NoneValueType | Filter | None = None, height: float = 30.0, label: TextLayout | None = None, position: Point, stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, stroke_dashoffset: NoneValueType | float | None = None, transform: NoneValueType | tuple[Transformation] | None = None, width: float = 30.0, text: str = 'AND', font_family: str = DEFAULT_FONT_FAMILY, font_fill: Color | NoneValueType = black, font_stroke: Color | NoneValueType = NoneValue, font_style: FontStyle = NORMAL, font_weight: FontWeight | float = NORMAL, direction: Direction = HORIZONTAL, left_to_right: bool = True, left_connector_length: float = 10.0, right_connector_length: float = 10.0, left_connector_stroke: NoneValueType | Color | None = None, left_connector_stroke_width: float | None = None, left_connector_stroke_dasharray: NoneValueType | tuple[float] | None = None, left_connector_stroke_dashoffset: float | None = None, left_connector_fill: NoneValueType | Color | None = None, left_connector_transform: NoneValueType | tuple[Transformation] | None = None, left_connector_filter: NoneValueType | Filter | None = None, right_connector_stroke: NoneValueType | Color | None = None, right_connector_stroke_width: float | None = None, right_connector_stroke_dasharray: NoneValueType | tuple[float] | None = None, right_connector_stroke_dashoffset: float | None = None, right_connector_fill: NoneValueType | Color | None = None, right_connector_transform: NoneValueType | tuple[Transformation] | None = None, right_connector_filter: NoneValueType | Filter | None = None)

Bases: _ConnectorsMixin, _SimpleMixin, _TextMixin, SBGNNode

Layout for AND operators.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'95bb94dc-4773-4e9b-8c4d-de1a06905620'
layout_elements tuple[LayoutElement]

The sub-layout elements of the group layout. These are part of the children of the group layout

<dynamic>
group_fill NoneValueType | Color | None

The fill color of the group layout

None
group_fill_rule FillRule | None

The fill rule of the group layout

None
group_filter NoneValueType | Filter | None

The filter of the group layout

None
group_font_family str | None

The font family of the group layout

None
group_font_size float | None

The font size of the group layout

None
group_font_style FontStyle | None

The font style of the group layout

None
group_font_weight FontWeight | float | None

The font weight of the group layout

None
group_stroke NoneValueType | Color | None

The stroke color of the group layout

None
group_stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the group layout

None
group_stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the group layout

None
group_stroke_width NoneValueType | float | None

The stroke width of the group layout

None
group_text_anchor TextAnchor | None

The text anchor of the group layout

None
group_transform NoneValueType | tuple[Transformation] | None

The transform of the group layout

None
fill NoneValueType | Color | None

The fill color of the node

Color(red=255, green=255, blue=255, alpha=1.0)
filter NoneValueType | Filter | None

The filter of the node

None
height float

The height of the node

30.0
label TextLayout | None

The label of the node

None
position Point

The position of the node

required
stroke NoneValueType | Color | None

The stroke color of the node

Color(red=0, green=0, blue=0, alpha=1.0)
stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the node

None
stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the node

None
stroke_width float | None

The stroke width of the node

1.25
transform NoneValueType | tuple[Transformation] | None

The transform of the node

None
width float

The width width of the node

30.0
text str
'AND'
font_family str
'DejaVu Sans'
font_fill Color | NoneValueType
Color(red=0, green=0, blue=0, alpha=1.0)
font_stroke Color | NoneValueType
<momapy.drawing.NoneValueType object at 0x7fbe12e88d70>
font_style FontStyle
<FontStyle.NORMAL: 0>
font_weight FontWeight | float
<FontWeight.NORMAL: 0>
direction Direction
<Direction.HORIZONTAL: 1>
left_to_right bool
True
left_connector_length float
10.0
right_connector_length float
10.0
left_connector_stroke NoneValueType | Color | None
None
left_connector_stroke_width float | None
None
left_connector_stroke_dasharray NoneValueType | tuple[float] | None
None
left_connector_stroke_dashoffset float | None
None
left_connector_fill NoneValueType | Color | None
None
left_connector_transform NoneValueType | tuple[Transformation] | None
None
left_connector_filter NoneValueType | Filter | None
None
right_connector_stroke NoneValueType | Color | None
None
right_connector_stroke_width float | None
None
right_connector_stroke_dasharray NoneValueType | tuple[float] | None
None
right_connector_stroke_dashoffset float | None
None
right_connector_fill NoneValueType | Color | None
None
right_connector_transform NoneValueType | tuple[Transformation] | None
None
right_connector_filter NoneValueType | Filter | None
None

Methods:

Name Description
anchor_point

Return an anchor point of the layout element

angle

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

bbox

Compute and return the bounding box of the group layout element

border

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.

center

Return the center anchor of the node

childless

Return a copy of the node with no children

children

Return the children of the group layout.

contains

Return true if another layout element is a descendant of the layout element, false otherwise

descendants

Return the descendants of the layout element

drawing_elements

Return the drawing elements of the group layout.

east

Get the east (right) anchor point.

east_north_east

Return the east north east anchor of the node

east_south_east

Return the east south east west anchor of the node

equals

Return true if the layout element is equal to another layout element, false otherwise

flattened

Return a list containing copy of the layout element with no children and all its descendants with no children

label_center

Return the label center anchor of the node

left_connector_base

Get the base point of the left connector.

left_connector_tip

Get the tip point of the left connector.

north

Get the north (top) anchor point.

north_east

Return the north east anchor of the node

north_north_east

Return the north north east anchor of the node

north_north_west

Return the north north west anchor of the node

north_west

Return the north west anchor of the node

own_angle

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

own_bbox

Compute and return the bounding box of the self drawing element of the group layout

own_border

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.

own_children

Return the self children of the node. A node has unique child that is its label

own_drawing_elements

Return the node's own drawing elements

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

right_connector_base

Get the base point of the right connector.

right_connector_tip

Get the tip point of the right connector.

size

Return the size of the node

south

Get the south (bottom) anchor point.

south_east

Return the south east anchor of the node

south_south_east

Return the south south east anchor of the node

south_south_west

Return the south south west anchor of the node

south_west

Return the south west anchor of the node

to_geometry

Return a list of geometry primitives from the drawing elements.

west

Get the west (left) anchor point.

west_north_west

Return the west north west anchor of the node

west_south_west

Return the west south west anchor of the node

Attributes:

Name Type Description
x float

Return the x coordinate of the node

y float

Return the y coordinate of the node

anchor_point

anchor_point(anchor_name: str) -> Point

Return an anchor point of the layout element

Source code in src/momapy/core/elements.py
def anchor_point(self, anchor_name: str) -> momapy.geometry.Point:
    """Return an anchor point of the layout element"""
    return getattr(self, anchor_name)()

angle

angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

bbox

bbox() -> Bbox

Compute and return the bounding box of the group layout element

Source code in src/momapy/core/layout.py
def bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the group layout element"""
    own_bbox = self.own_bbox()
    bboxes = [child.bbox() for child in self.children()]
    min_x = own_bbox.north_west().x
    min_y = own_bbox.north_west().y
    max_x = own_bbox.south_east().x
    max_y = own_bbox.south_east().y
    for bbox in bboxes:
        if bbox.north_west().x < min_x:
            min_x = bbox.north_west().x
        if bbox.north_west().y < min_y:
            min_y = bbox.north_west().y
        if bbox.south_east().x > max_x:
            max_x = bbox.south_east().x
        if bbox.south_east().y > max_y:
            max_y = bbox.south_east().y
    bbox = momapy.geometry.Bbox(
        momapy.geometry.Point(min_x / 2 + max_x / 2, min_y / 2 + max_y / 2),
        max_x - min_x,
        max_y - min_y,
    )
    return bbox

border

border(point: Point) -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.drawing_elements(),
        point=point,
        center=self.center(),
    )

center

center() -> Point

Return the center anchor of the node

Source code in src/momapy/core/layout.py
def center(self) -> momapy.geometry.Point:
    """Return the center anchor of the node"""
    return self.position

childless

childless() -> Self

Return a copy of the node with no children

Source code in src/momapy/core/layout.py
def childless(self) -> typing_extensions.Self:
    """Return a copy of the node with no children"""
    return dataclasses.replace(self, label=None, layout_elements=tuple([]))

children

children() -> list[LayoutElement]

Return the children of the group layout. These are the self children of the group layout (returned by the own_children method) and the other children of the group layout (given by the layout_elements attribute)

Source code in src/momapy/core/layout.py
def children(self) -> list[LayoutElement]:
    """Return the children of the group layout.
    These are the self children of the group layout (returned by the `own_children` method) and the other children of the group layout (given by the `layout_elements` attribute)
    """
    return self.own_children() + list(self.layout_elements)

contains

contains(other: LayoutElement) -> bool

Return true if another layout element is a descendant of the layout element, false otherwise

Source code in src/momapy/core/elements.py
def contains(self, other: "LayoutElement") -> bool:
    """Return `true` if another layout element is a descendant of the layout element, `false` otherwise"""
    return other in self.descendants()

descendants

descendants() -> list[LayoutElement]

Return the descendants of the layout element

Source code in src/momapy/core/elements.py
def descendants(self) -> list["LayoutElement"]:
    """Return the descendants of the layout element"""
    descendants = []
    for child in self.children():
        descendants.append(child)
        descendants += child.descendants()
    return descendants

drawing_elements

drawing_elements() -> list[DrawingElement]

Return the drawing elements of the group layout. The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children

Source code in src/momapy/core/layout.py
def drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the drawing elements of the group layout.
    The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children
    """
    drawing_elements = self.own_drawing_elements()
    for child in self.children():
        if child is not None:
            drawing_elements += child.drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}",
        elements=tuple(drawing_elements),
        id_=f"{self.id_}",
        fill=self.group_fill,
        fill_rule=self.group_fill_rule,
        filter=self.group_filter,
        font_family=self.group_font_family,
        font_size=self.group_font_size,
        font_style=self.group_font_style,
        font_weight=self.group_font_weight,
        stroke=self.group_stroke,
        stroke_dasharray=self.group_stroke_dasharray,
        stroke_dashoffset=self.group_stroke_dashoffset,
        stroke_width=self.group_stroke_width,
        text_anchor=self.group_text_anchor,
        transform=self.group_transform,
    )
    return [group]

east

east() -> Point

Get the east (right) anchor point.

Returns:

Type Description
Point

Point on the east side of the element.

Source code in src/momapy/sbgn/elements.py
def east(self) -> momapy.geometry.Point:
    """Get the east (right) anchor point.

    Returns:
        Point on the east side of the element.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(self.x + self.width / 2, self.y)
    else:
        return momapy.geometry.Point(
            self.x + self.width / 2 + self.right_connector_length, self.y
        )

east_north_east

east_north_east() -> Point

Return the east north east anchor of the node

Source code in src/momapy/core/layout.py
def east_north_east(self) -> momapy.geometry.Point:
    """Return the east north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

east_south_east

east_south_east() -> Point

Return the east south east west anchor of the node

Source code in src/momapy/core/layout.py
def east_south_east(self) -> momapy.geometry.Point:
    """Return the east south east west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

equals

equals(other: LayoutElement, flattened: bool = False, unordered: bool = False) -> bool

Return true if the layout element is equal to another layout element, false otherwise

Source code in src/momapy/core/elements.py
def equals(
    self, other: "LayoutElement", flattened: bool = False, unordered: bool = False
) -> bool:
    """Return `true` if the layout element is equal to another layout element, `false` otherwise"""
    if type(self) is type(other):
        if not flattened:
            return self == other
        else:
            if not unordered:
                return self.flattened() == other.flattened()
            else:
                return set(self.flattened()) == set(other.flattened())
    return False

flattened

flattened() -> list[LayoutElement]

Return a list containing copy of the layout element with no children and all its descendants with no children

Source code in src/momapy/core/elements.py
def flattened(self) -> list["LayoutElement"]:
    """Return a list containing copy of the layout element with no children and all its descendants with no children"""
    flattened = [self.childless()]
    for child in self.children():
        flattened += child.flattened()
    return flattened

label_center

label_center() -> Point

Return the label center anchor of the node

Source code in src/momapy/core/layout.py
def label_center(self) -> momapy.geometry.Point:
    """Return the label center anchor of the node"""
    return self.position

left_connector_base

left_connector_base() -> Point

Get the base point of the left connector.

Returns:

Type Description
Point

Point where the left connector attaches to the shape.

Source code in src/momapy/sbgn/elements.py
def left_connector_base(self) -> momapy.geometry.Point:
    """Get the base point of the left connector.

    Returns:
        Point where the left connector attaches to the shape.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(self.x, self.y - self.height / 2)
    else:
        return momapy.geometry.Point(self.x - self.width / 2, self.y)

left_connector_tip

left_connector_tip() -> Point

Get the tip point of the left connector.

Returns:

Type Description
Point

Point at the end of the left connector line.

Source code in src/momapy/sbgn/elements.py
def left_connector_tip(self) -> momapy.geometry.Point:
    """Get the tip point of the left connector.

    Returns:
        Point at the end of the left connector line.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(
            self.x, self.y - self.height / 2 - self.left_connector_length
        )
    else:
        return momapy.geometry.Point(
            self.x - self.width / 2 - self.left_connector_length, self.y
        )

north

north() -> Point

Get the north (top) anchor point.

Returns:

Type Description
Point

Point on the north side of the element.

Source code in src/momapy/sbgn/elements.py
def north(self) -> momapy.geometry.Point:
    """Get the north (top) anchor point.

    Returns:
        Point on the north side of the element.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(
            self.x, self.y - self.height / 2 - self.left_connector_length
        )
    else:
        return momapy.geometry.Point(self.x, self.y - self.height / 2)

north_east

north_east() -> Point

Return the north east anchor of the node

Source code in src/momapy/core/layout.py
def north_east(self) -> momapy.geometry.Point:
    """Return the north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_east

north_north_east() -> Point

Return the north north east anchor of the node

Source code in src/momapy/core/layout.py
def north_north_east(self) -> momapy.geometry.Point:
    """Return the north north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_west

north_north_west() -> Point

Return the north north west anchor of the node

Source code in src/momapy/core/layout.py
def north_north_west(self) -> momapy.geometry.Point:
    """Return the north north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_west

north_west() -> Point

Return the north west anchor of the node

Source code in src/momapy/core/layout.py
def north_west(self) -> momapy.geometry.Point:
    """Return the north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

own_angle

own_angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def own_angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.own_drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

own_bbox

own_bbox() -> Bbox

Compute and return the bounding box of the self drawing element of the group layout

Source code in src/momapy/core/layout.py
def own_bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the self drawing element of the group layout"""
    primitives = self.own_to_geometry()
    if not primitives:
        return momapy.geometry.Bbox(momapy.geometry.Point(0, 0), 0, 0)
    bboxes = [p.bbox() for p in primitives]
    return momapy.geometry.Bbox.union(bboxes)

own_border

own_border(point: Point) -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def own_border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.own_drawing_elements(),
        point=point,
        center=self.center(),
    )

own_children

own_children() -> list[LayoutElement]

Return the self children of the node. A node has unique child that is its label

Source code in src/momapy/core/layout.py
def own_children(self) -> list[LayoutElement]:
    """Return the self children of the node. A node has unique child that is its label"""
    if self.label is not None:
        return [self.label]
    return []

own_drawing_elements

own_drawing_elements() -> list[DrawingElement]

Return the node's own drawing elements

Source code in src/momapy/core/layout.py
def own_drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the node's own drawing elements"""
    drawing_elements = self._border_drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}_own",
        elements=tuple(drawing_elements),
        fill=self.fill,
        filter=self.filter,
        id_=f"{self.id_}_own",
        stroke=self.stroke,
        stroke_dasharray=self.stroke_dasharray,
        stroke_dashoffset=self.stroke_dashoffset,
        stroke_width=self.stroke_width,
        transform=self.transform,
    )
    return [group]

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

Source code in src/momapy/core/layout.py
def own_to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the self drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

right_connector_base

right_connector_base() -> Point

Get the base point of the right connector.

Returns:

Type Description
Point

Point where the right connector attaches to the shape.

Source code in src/momapy/sbgn/elements.py
def right_connector_base(self) -> momapy.geometry.Point:
    """Get the base point of the right connector.

    Returns:
        Point where the right connector attaches to the shape.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(self.x, self.y + self.height / 2)
    else:
        return momapy.geometry.Point(self.x + self.width / 2, self.y)

right_connector_tip

right_connector_tip() -> Point

Get the tip point of the right connector.

Returns:

Type Description
Point

Point at the end of the right connector line.

Source code in src/momapy/sbgn/elements.py
def right_connector_tip(self) -> momapy.geometry.Point:
    """Get the tip point of the right connector.

    Returns:
        Point at the end of the right connector line.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(
            self.x, self.y + self.height / 2 + self.right_connector_length
        )
    else:
        return momapy.geometry.Point(
            self.x + self.width / 2 + self.right_connector_length, self.y
        )

size

size() -> tuple[float, float]

Return the size of the node

Source code in src/momapy/core/layout.py
def size(self) -> tuple[float, float]:
    """Return the size of the node"""
    return (self.width, self.height)

south

south() -> Point

Get the south (bottom) anchor point.

Returns:

Type Description
Point

Point on the south side of the element.

Source code in src/momapy/sbgn/elements.py
def south(self) -> momapy.geometry.Point:
    """Get the south (bottom) anchor point.

    Returns:
        Point on the south side of the element.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(
            self.x, self.y + self.height / 2 + self.right_connector_length
        )
    else:
        return momapy.geometry.Point(self.x, self.y + self.height / 2)

south_east

south_east() -> Point

Return the south east anchor of the node

Source code in src/momapy/core/layout.py
def south_east(self) -> momapy.geometry.Point:
    """Return the south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_east

south_south_east() -> Point

Return the south south east anchor of the node

Source code in src/momapy/core/layout.py
def south_south_east(self) -> momapy.geometry.Point:
    """Return the south south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_west

south_south_west() -> Point

Return the south south west anchor of the node

Source code in src/momapy/core/layout.py
def south_south_west(self) -> momapy.geometry.Point:
    """Return the south south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_west

south_west() -> Point

Return the south west anchor of the node

Source code in src/momapy/core/layout.py
def south_west(self) -> momapy.geometry.Point:
    """Return the south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

to_geometry

Return a list of geometry primitives from the drawing elements.

Source code in src/momapy/core/elements.py
def to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

west

west() -> Point

Get the west (left) anchor point.

Returns:

Type Description
Point

Point on the west side of the element.

Source code in src/momapy/sbgn/elements.py
def west(self) -> momapy.geometry.Point:
    """Get the west (left) anchor point.

    Returns:
        Point on the west side of the element.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(self.x - self.width / 2, self.y)
    else:
        return momapy.geometry.Point(
            self.x - self.width / 2 - self.left_connector_length, self.y
        )

west_north_west

west_north_west() -> Point

Return the west north west anchor of the node

Source code in src/momapy/core/layout.py
def west_north_west(self) -> momapy.geometry.Point:
    """Return the west north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

west_south_west

west_south_west() -> Point

Return the west south west anchor of the node

Source code in src/momapy/core/layout.py
def west_south_west(self) -> momapy.geometry.Point:
    """Return the west south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

x property

x: float

Return the x coordinate of the node

y property

y: float

Return the y coordinate of the node

BiologicalActivity dataclass

BiologicalActivity(*, id_: str = make_uuid4_as_str(), label: str | None = None, compartment: Compartment | None = None, units_of_information: frozenset[UnitOfInformation] = frozenset())

Bases: Activity

Biological activity.

Represents a biological activity with associated units of information.

Attributes:

Name Type Description

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'4a921d0d-ca3b-437f-becf-804cce8ff690'
label str | None
None
compartment Compartment | None
None
units_of_information frozenset[UnitOfInformation]

Build an immutable unordered collection of unique elements.

<dynamic>

Methods:

Name Description
descendants

Return every ModelElement reachable from self, excluding self.

descendants

descendants() -> list[ModelElement]

Return every ModelElement reachable from self, excluding self.

Walks scalar ModelElement fields and frozenset/tuple containers, deduplicating by object identity.

Returns:

Type Description
list[ModelElement]

The list of reachable ModelElement instances in visit

list[ModelElement]

order, without self.

Source code in src/momapy/core/elements.py
def descendants(self) -> list["ModelElement"]:
    """Return every `ModelElement` reachable from `self`, excluding `self`.

    Walks scalar `ModelElement` fields and `frozenset`/`tuple`
    containers, deduplicating by object identity.

    Returns:
        The list of reachable `ModelElement` instances in visit
        order, without `self`.
    """
    seen: set[int] = {id(self)}
    result: list[ModelElement] = []
    if dataclasses.is_dataclass(self):
        for field in dataclasses.fields(type(self)):
            _walk_model_graph(getattr(self, field.name), seen, result)
    return result

BiologicalActivityLayout dataclass

BiologicalActivityLayout(fill: NoneValueType | Color | None = white, stroke: NoneValueType | Color | None = black, stroke_width: float | None = 1.25, *, id_: str = make_uuid4_as_str(), layout_elements: tuple[LayoutElement] = tuple(), group_fill: NoneValueType | Color | None = None, group_fill_rule: FillRule | None = None, group_filter: NoneValueType | Filter | None = None, group_font_family: str | None = None, group_font_size: float | None = None, group_font_style: FontStyle | None = None, group_font_weight: FontWeight | float | None = None, group_stroke: NoneValueType | Color | None = None, group_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, group_stroke_dashoffset: NoneValueType | float | None = None, group_stroke_width: NoneValueType | float | None = None, group_text_anchor: TextAnchor | None = None, group_transform: NoneValueType | tuple[Transformation] | None = None, filter: NoneValueType | Filter | None = None, height: float = 30.0, label: TextLayout | None = None, position: Point, stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, stroke_dashoffset: NoneValueType | float | None = None, transform: NoneValueType | tuple[Transformation] | None = None, width: float = 60.0)

Bases: _SimpleMixin, SBGNNode

Layout for biological activities.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'f475d054-edcc-4781-8439-55cc67d087c2'
layout_elements tuple[LayoutElement]

The sub-layout elements of the group layout. These are part of the children of the group layout

<dynamic>
group_fill NoneValueType | Color | None

The fill color of the group layout

None
group_fill_rule FillRule | None

The fill rule of the group layout

None
group_filter NoneValueType | Filter | None

The filter of the group layout

None
group_font_family str | None

The font family of the group layout

None
group_font_size float | None

The font size of the group layout

None
group_font_style FontStyle | None

The font style of the group layout

None
group_font_weight FontWeight | float | None

The font weight of the group layout

None
group_stroke NoneValueType | Color | None

The stroke color of the group layout

None
group_stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the group layout

None
group_stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the group layout

None
group_stroke_width NoneValueType | float | None

The stroke width of the group layout

None
group_text_anchor TextAnchor | None

The text anchor of the group layout

None
group_transform NoneValueType | tuple[Transformation] | None

The transform of the group layout

None
fill NoneValueType | Color | None

The fill color of the node

Color(red=255, green=255, blue=255, alpha=1.0)
filter NoneValueType | Filter | None

The filter of the node

None
height float

The height of the node

30.0
label TextLayout | None

The label of the node

None
position Point

The position of the node

required
stroke NoneValueType | Color | None

The stroke color of the node

Color(red=0, green=0, blue=0, alpha=1.0)
stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the node

None
stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the node

None
stroke_width float | None

The stroke width of the node

1.25
transform NoneValueType | tuple[Transformation] | None

The transform of the node

None
width float

The width width of the node

60.0

Methods:

Name Description
anchor_point

Return an anchor point of the layout element

angle

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

bbox

Compute and return the bounding box of the group layout element

border

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.

center

Return the center anchor of the node

childless

Return a copy of the node with no children

children

Return the children of the group layout.

contains

Return true if another layout element is a descendant of the layout element, false otherwise

descendants

Return the descendants of the layout element

drawing_elements

Return the drawing elements of the group layout.

east

Return the east anchor of the node

east_north_east

Return the east north east anchor of the node

east_south_east

Return the east south east west anchor of the node

equals

Return true if the layout element is equal to another layout element, false otherwise

flattened

Return a list containing copy of the layout element with no children and all its descendants with no children

label_center

Return the label center anchor of the node

north

Return the north anchor of the node

north_east

Return the north east anchor of the node

north_north_east

Return the north north east anchor of the node

north_north_west

Return the north north west anchor of the node

north_west

Return the north west anchor of the node

own_angle

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

own_bbox

Compute and return the bounding box of the self drawing element of the group layout

own_border

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.

own_children

Return the self children of the node. A node has unique child that is its label

own_drawing_elements

Return the node's own drawing elements

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

size

Return the size of the node

south

Return the south anchor of the node

south_east

Return the south east anchor of the node

south_south_east

Return the south south east anchor of the node

south_south_west

Return the south south west anchor of the node

south_west

Return the south west anchor of the node

to_geometry

Return a list of geometry primitives from the drawing elements.

west

Return the west anchor of the node

west_north_west

Return the west north west anchor of the node

west_south_west

Return the west south west anchor of the node

Attributes:

Name Type Description
x float

Return the x coordinate of the node

y float

Return the y coordinate of the node

anchor_point

anchor_point(anchor_name: str) -> Point

Return an anchor point of the layout element

Source code in src/momapy/core/elements.py
def anchor_point(self, anchor_name: str) -> momapy.geometry.Point:
    """Return an anchor point of the layout element"""
    return getattr(self, anchor_name)()

angle

angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

bbox

bbox() -> Bbox

Compute and return the bounding box of the group layout element

Source code in src/momapy/core/layout.py
def bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the group layout element"""
    own_bbox = self.own_bbox()
    bboxes = [child.bbox() for child in self.children()]
    min_x = own_bbox.north_west().x
    min_y = own_bbox.north_west().y
    max_x = own_bbox.south_east().x
    max_y = own_bbox.south_east().y
    for bbox in bboxes:
        if bbox.north_west().x < min_x:
            min_x = bbox.north_west().x
        if bbox.north_west().y < min_y:
            min_y = bbox.north_west().y
        if bbox.south_east().x > max_x:
            max_x = bbox.south_east().x
        if bbox.south_east().y > max_y:
            max_y = bbox.south_east().y
    bbox = momapy.geometry.Bbox(
        momapy.geometry.Point(min_x / 2 + max_x / 2, min_y / 2 + max_y / 2),
        max_x - min_x,
        max_y - min_y,
    )
    return bbox

border

border(point: Point) -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.drawing_elements(),
        point=point,
        center=self.center(),
    )

center

center() -> Point

Return the center anchor of the node

Source code in src/momapy/core/layout.py
def center(self) -> momapy.geometry.Point:
    """Return the center anchor of the node"""
    return self.position

childless

childless() -> Self

Return a copy of the node with no children

Source code in src/momapy/core/layout.py
def childless(self) -> typing_extensions.Self:
    """Return a copy of the node with no children"""
    return dataclasses.replace(self, label=None, layout_elements=tuple([]))

children

children() -> list[LayoutElement]

Return the children of the group layout. These are the self children of the group layout (returned by the own_children method) and the other children of the group layout (given by the layout_elements attribute)

Source code in src/momapy/core/layout.py
def children(self) -> list[LayoutElement]:
    """Return the children of the group layout.
    These are the self children of the group layout (returned by the `own_children` method) and the other children of the group layout (given by the `layout_elements` attribute)
    """
    return self.own_children() + list(self.layout_elements)

contains

contains(other: LayoutElement) -> bool

Return true if another layout element is a descendant of the layout element, false otherwise

Source code in src/momapy/core/elements.py
def contains(self, other: "LayoutElement") -> bool:
    """Return `true` if another layout element is a descendant of the layout element, `false` otherwise"""
    return other in self.descendants()

descendants

descendants() -> list[LayoutElement]

Return the descendants of the layout element

Source code in src/momapy/core/elements.py
def descendants(self) -> list["LayoutElement"]:
    """Return the descendants of the layout element"""
    descendants = []
    for child in self.children():
        descendants.append(child)
        descendants += child.descendants()
    return descendants

drawing_elements

drawing_elements() -> list[DrawingElement]

Return the drawing elements of the group layout. The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children

Source code in src/momapy/core/layout.py
def drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the drawing elements of the group layout.
    The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children
    """
    drawing_elements = self.own_drawing_elements()
    for child in self.children():
        if child is not None:
            drawing_elements += child.drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}",
        elements=tuple(drawing_elements),
        id_=f"{self.id_}",
        fill=self.group_fill,
        fill_rule=self.group_fill_rule,
        filter=self.group_filter,
        font_family=self.group_font_family,
        font_size=self.group_font_size,
        font_style=self.group_font_style,
        font_weight=self.group_font_weight,
        stroke=self.group_stroke,
        stroke_dasharray=self.group_stroke_dasharray,
        stroke_dashoffset=self.group_stroke_dashoffset,
        stroke_width=self.group_stroke_width,
        text_anchor=self.group_text_anchor,
        transform=self.group_transform,
    )
    return [group]

east

east() -> Point

Return the east anchor of the node

Source code in src/momapy/core/layout.py
def east(self) -> momapy.geometry.Point:
    """Return the east anchor of the node"""
    return self.own_angle(0)

east_north_east

east_north_east() -> Point

Return the east north east anchor of the node

Source code in src/momapy/core/layout.py
def east_north_east(self) -> momapy.geometry.Point:
    """Return the east north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

east_south_east

east_south_east() -> Point

Return the east south east west anchor of the node

Source code in src/momapy/core/layout.py
def east_south_east(self) -> momapy.geometry.Point:
    """Return the east south east west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

equals

equals(other: LayoutElement, flattened: bool = False, unordered: bool = False) -> bool

Return true if the layout element is equal to another layout element, false otherwise

Source code in src/momapy/core/elements.py
def equals(
    self, other: "LayoutElement", flattened: bool = False, unordered: bool = False
) -> bool:
    """Return `true` if the layout element is equal to another layout element, `false` otherwise"""
    if type(self) is type(other):
        if not flattened:
            return self == other
        else:
            if not unordered:
                return self.flattened() == other.flattened()
            else:
                return set(self.flattened()) == set(other.flattened())
    return False

flattened

flattened() -> list[LayoutElement]

Return a list containing copy of the layout element with no children and all its descendants with no children

Source code in src/momapy/core/elements.py
def flattened(self) -> list["LayoutElement"]:
    """Return a list containing copy of the layout element with no children and all its descendants with no children"""
    flattened = [self.childless()]
    for child in self.children():
        flattened += child.flattened()
    return flattened

label_center

label_center() -> Point

Return the label center anchor of the node

Source code in src/momapy/core/layout.py
def label_center(self) -> momapy.geometry.Point:
    """Return the label center anchor of the node"""
    return self.position

north

north() -> Point

Return the north anchor of the node

Source code in src/momapy/core/layout.py
def north(self) -> momapy.geometry.Point:
    """Return the north anchor of the node"""
    return self.own_angle(90)

north_east

north_east() -> Point

Return the north east anchor of the node

Source code in src/momapy/core/layout.py
def north_east(self) -> momapy.geometry.Point:
    """Return the north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_east

north_north_east() -> Point

Return the north north east anchor of the node

Source code in src/momapy/core/layout.py
def north_north_east(self) -> momapy.geometry.Point:
    """Return the north north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_west

north_north_west() -> Point

Return the north north west anchor of the node

Source code in src/momapy/core/layout.py
def north_north_west(self) -> momapy.geometry.Point:
    """Return the north north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_west

north_west() -> Point

Return the north west anchor of the node

Source code in src/momapy/core/layout.py
def north_west(self) -> momapy.geometry.Point:
    """Return the north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

own_angle

own_angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def own_angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.own_drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

own_bbox

own_bbox() -> Bbox

Compute and return the bounding box of the self drawing element of the group layout

Source code in src/momapy/core/layout.py
def own_bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the self drawing element of the group layout"""
    primitives = self.own_to_geometry()
    if not primitives:
        return momapy.geometry.Bbox(momapy.geometry.Point(0, 0), 0, 0)
    bboxes = [p.bbox() for p in primitives]
    return momapy.geometry.Bbox.union(bboxes)

own_border

own_border(point: Point) -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def own_border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.own_drawing_elements(),
        point=point,
        center=self.center(),
    )

own_children

own_children() -> list[LayoutElement]

Return the self children of the node. A node has unique child that is its label

Source code in src/momapy/core/layout.py
def own_children(self) -> list[LayoutElement]:
    """Return the self children of the node. A node has unique child that is its label"""
    if self.label is not None:
        return [self.label]
    return []

own_drawing_elements

own_drawing_elements() -> list[DrawingElement]

Return the node's own drawing elements

Source code in src/momapy/core/layout.py
def own_drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the node's own drawing elements"""
    drawing_elements = self._border_drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}_own",
        elements=tuple(drawing_elements),
        fill=self.fill,
        filter=self.filter,
        id_=f"{self.id_}_own",
        stroke=self.stroke,
        stroke_dasharray=self.stroke_dasharray,
        stroke_dashoffset=self.stroke_dashoffset,
        stroke_width=self.stroke_width,
        transform=self.transform,
    )
    return [group]

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

Source code in src/momapy/core/layout.py
def own_to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the self drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

size

size() -> tuple[float, float]

Return the size of the node

Source code in src/momapy/core/layout.py
def size(self) -> tuple[float, float]:
    """Return the size of the node"""
    return (self.width, self.height)

south

south() -> Point

Return the south anchor of the node

Source code in src/momapy/core/layout.py
def south(self) -> momapy.geometry.Point:
    """Return the south anchor of the node"""
    return self.own_angle(270)

south_east

south_east() -> Point

Return the south east anchor of the node

Source code in src/momapy/core/layout.py
def south_east(self) -> momapy.geometry.Point:
    """Return the south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_east

south_south_east() -> Point

Return the south south east anchor of the node

Source code in src/momapy/core/layout.py
def south_south_east(self) -> momapy.geometry.Point:
    """Return the south south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_west

south_south_west() -> Point

Return the south south west anchor of the node

Source code in src/momapy/core/layout.py
def south_south_west(self) -> momapy.geometry.Point:
    """Return the south south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_west

south_west() -> Point

Return the south west anchor of the node

Source code in src/momapy/core/layout.py
def south_west(self) -> momapy.geometry.Point:
    """Return the south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

to_geometry

Return a list of geometry primitives from the drawing elements.

Source code in src/momapy/core/elements.py
def to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

west

west() -> Point

Return the west anchor of the node

Source code in src/momapy/core/layout.py
def west(self) -> momapy.geometry.Point:
    """Return the west anchor of the node"""
    return self.own_angle(180)

west_north_west

west_north_west() -> Point

Return the west north west anchor of the node

Source code in src/momapy/core/layout.py
def west_north_west(self) -> momapy.geometry.Point:
    """Return the west north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

west_south_west

west_south_west() -> Point

Return the west south west anchor of the node

Source code in src/momapy/core/layout.py
def west_south_west(self) -> momapy.geometry.Point:
    """Return the west south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

x property

x: float

Return the x coordinate of the node

y property

y: float

Return the y coordinate of the node

Compartment dataclass

Compartment(*, id_: str = make_uuid4_as_str(), label: str | None = None, units_of_information: frozenset[UnitOfInformation] = frozenset())

Bases: SBGNModelElement

Compartment in an SBGN-AF map.

Compartments represent distinct spatial regions where activities are located.

Attributes:

Name Type Description

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'828435b0-be05-46dd-b826-feeb85c2eda9'
label str | None
None
units_of_information frozenset[UnitOfInformation]

Build an immutable unordered collection of unique elements.

<dynamic>

Methods:

Name Description
descendants

Return every ModelElement reachable from self, excluding self.

descendants

descendants() -> list[ModelElement]

Return every ModelElement reachable from self, excluding self.

Walks scalar ModelElement fields and frozenset/tuple containers, deduplicating by object identity.

Returns:

Type Description
list[ModelElement]

The list of reachable ModelElement instances in visit

list[ModelElement]

order, without self.

Source code in src/momapy/core/elements.py
def descendants(self) -> list["ModelElement"]:
    """Return every `ModelElement` reachable from `self`, excluding `self`.

    Walks scalar `ModelElement` fields and `frozenset`/`tuple`
    containers, deduplicating by object identity.

    Returns:
        The list of reachable `ModelElement` instances in visit
        order, without `self`.
    """
    seen: set[int] = {id(self)}
    result: list[ModelElement] = []
    if dataclasses.is_dataclass(self):
        for field in dataclasses.fields(type(self)):
            _walk_model_graph(getattr(self, field.name), seen, result)
    return result

CompartmentLayout dataclass

CompartmentLayout(fill: NoneValueType | Color | None = white, stroke: NoneValueType | Color | None = black, stroke_width: float | None = 1.25, *, id_: str = make_uuid4_as_str(), layout_elements: tuple[LayoutElement] = tuple(), group_fill: NoneValueType | Color | None = None, group_fill_rule: FillRule | None = None, group_filter: NoneValueType | Filter | None = None, group_font_family: str | None = None, group_font_size: float | None = None, group_font_style: FontStyle | None = None, group_font_weight: FontWeight | float | None = None, group_stroke: NoneValueType | Color | None = None, group_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, group_stroke_dashoffset: NoneValueType | float | None = None, group_stroke_width: NoneValueType | float | None = None, group_text_anchor: TextAnchor | None = None, group_transform: NoneValueType | tuple[Transformation] | None = None, filter: NoneValueType | Filter | None = None, height: float = 80.0, label: TextLayout | None = None, position: Point, stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, stroke_dashoffset: NoneValueType | float | None = None, transform: NoneValueType | tuple[Transformation] | None = None, width: float = 80.0, rounded_corners: float = 5.0, border_stroke_width: float | None = 3.25)

Bases: _SimpleMixin, SBGNNode

Layout for compartments.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'34cf0d83-1348-4b6d-a925-55c396bd8760'
layout_elements tuple[LayoutElement]

The sub-layout elements of the group layout. These are part of the children of the group layout

<dynamic>
group_fill NoneValueType | Color | None

The fill color of the group layout

None
group_fill_rule FillRule | None

The fill rule of the group layout

None
group_filter NoneValueType | Filter | None

The filter of the group layout

None
group_font_family str | None

The font family of the group layout

None
group_font_size float | None

The font size of the group layout

None
group_font_style FontStyle | None

The font style of the group layout

None
group_font_weight FontWeight | float | None

The font weight of the group layout

None
group_stroke NoneValueType | Color | None

The stroke color of the group layout

None
group_stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the group layout

None
group_stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the group layout

None
group_stroke_width NoneValueType | float | None

The stroke width of the group layout

None
group_text_anchor TextAnchor | None

The text anchor of the group layout

None
group_transform NoneValueType | tuple[Transformation] | None

The transform of the group layout

None
fill NoneValueType | Color | None

The fill color of the node

Color(red=255, green=255, blue=255, alpha=1.0)
filter NoneValueType | Filter | None

The filter of the node

None
height float

The height of the node

80.0
label TextLayout | None

The label of the node

None
position Point

The position of the node

required
stroke NoneValueType | Color | None

The stroke color of the node

Color(red=0, green=0, blue=0, alpha=1.0)
stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the node

None
stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the node

None
stroke_width float | None

The stroke width of the node

1.25
transform NoneValueType | tuple[Transformation] | None

The transform of the node

None
width float

The width width of the node

80.0
rounded_corners float
5.0
border_stroke_width float | None
3.25

Methods:

Name Description
anchor_point

Return an anchor point of the layout element

angle

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

bbox

Compute and return the bounding box of the group layout element

border

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.

center

Return the center anchor of the node

childless

Return a copy of the node with no children

children

Return the children of the group layout.

contains

Return true if another layout element is a descendant of the layout element, false otherwise

descendants

Return the descendants of the layout element

drawing_elements

Return the drawing elements of the group layout.

east

Return the east anchor of the node

east_north_east

Return the east north east anchor of the node

east_south_east

Return the east south east west anchor of the node

equals

Return true if the layout element is equal to another layout element, false otherwise

flattened

Return a list containing copy of the layout element with no children and all its descendants with no children

label_center

Return the label center anchor of the node

north

Return the north anchor of the node

north_east

Return the north east anchor of the node

north_north_east

Return the north north east anchor of the node

north_north_west

Return the north north west anchor of the node

north_west

Return the north west anchor of the node

own_angle

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

own_bbox

Compute and return the bounding box of the self drawing element of the group layout

own_border

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.

own_children

Return the self children of the node. A node has unique child that is its label

own_drawing_elements

Return the node's own drawing elements

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

size

Return the size of the node

south

Return the south anchor of the node

south_east

Return the south east anchor of the node

south_south_east

Return the south south east anchor of the node

south_south_west

Return the south south west anchor of the node

south_west

Return the south west anchor of the node

to_geometry

Return a list of geometry primitives from the drawing elements.

west

Return the west anchor of the node

west_north_west

Return the west north west anchor of the node

west_south_west

Return the west south west anchor of the node

Attributes:

Name Type Description
x float

Return the x coordinate of the node

y float

Return the y coordinate of the node

anchor_point

anchor_point(anchor_name: str) -> Point

Return an anchor point of the layout element

Source code in src/momapy/core/elements.py
def anchor_point(self, anchor_name: str) -> momapy.geometry.Point:
    """Return an anchor point of the layout element"""
    return getattr(self, anchor_name)()

angle

angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

bbox

bbox() -> Bbox

Compute and return the bounding box of the group layout element

Source code in src/momapy/core/layout.py
def bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the group layout element"""
    own_bbox = self.own_bbox()
    bboxes = [child.bbox() for child in self.children()]
    min_x = own_bbox.north_west().x
    min_y = own_bbox.north_west().y
    max_x = own_bbox.south_east().x
    max_y = own_bbox.south_east().y
    for bbox in bboxes:
        if bbox.north_west().x < min_x:
            min_x = bbox.north_west().x
        if bbox.north_west().y < min_y:
            min_y = bbox.north_west().y
        if bbox.south_east().x > max_x:
            max_x = bbox.south_east().x
        if bbox.south_east().y > max_y:
            max_y = bbox.south_east().y
    bbox = momapy.geometry.Bbox(
        momapy.geometry.Point(min_x / 2 + max_x / 2, min_y / 2 + max_y / 2),
        max_x - min_x,
        max_y - min_y,
    )
    return bbox

border

border(point: Point) -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.drawing_elements(),
        point=point,
        center=self.center(),
    )

center

center() -> Point

Return the center anchor of the node

Source code in src/momapy/core/layout.py
def center(self) -> momapy.geometry.Point:
    """Return the center anchor of the node"""
    return self.position

childless

childless() -> Self

Return a copy of the node with no children

Source code in src/momapy/core/layout.py
def childless(self) -> typing_extensions.Self:
    """Return a copy of the node with no children"""
    return dataclasses.replace(self, label=None, layout_elements=tuple([]))

children

children() -> list[LayoutElement]

Return the children of the group layout. These are the self children of the group layout (returned by the own_children method) and the other children of the group layout (given by the layout_elements attribute)

Source code in src/momapy/core/layout.py
def children(self) -> list[LayoutElement]:
    """Return the children of the group layout.
    These are the self children of the group layout (returned by the `own_children` method) and the other children of the group layout (given by the `layout_elements` attribute)
    """
    return self.own_children() + list(self.layout_elements)

contains

contains(other: LayoutElement) -> bool

Return true if another layout element is a descendant of the layout element, false otherwise

Source code in src/momapy/core/elements.py
def contains(self, other: "LayoutElement") -> bool:
    """Return `true` if another layout element is a descendant of the layout element, `false` otherwise"""
    return other in self.descendants()

descendants

descendants() -> list[LayoutElement]

Return the descendants of the layout element

Source code in src/momapy/core/elements.py
def descendants(self) -> list["LayoutElement"]:
    """Return the descendants of the layout element"""
    descendants = []
    for child in self.children():
        descendants.append(child)
        descendants += child.descendants()
    return descendants

drawing_elements

drawing_elements() -> list[DrawingElement]

Return the drawing elements of the group layout. The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children

Source code in src/momapy/core/layout.py
def drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the drawing elements of the group layout.
    The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children
    """
    drawing_elements = self.own_drawing_elements()
    for child in self.children():
        if child is not None:
            drawing_elements += child.drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}",
        elements=tuple(drawing_elements),
        id_=f"{self.id_}",
        fill=self.group_fill,
        fill_rule=self.group_fill_rule,
        filter=self.group_filter,
        font_family=self.group_font_family,
        font_size=self.group_font_size,
        font_style=self.group_font_style,
        font_weight=self.group_font_weight,
        stroke=self.group_stroke,
        stroke_dasharray=self.group_stroke_dasharray,
        stroke_dashoffset=self.group_stroke_dashoffset,
        stroke_width=self.group_stroke_width,
        text_anchor=self.group_text_anchor,
        transform=self.group_transform,
    )
    return [group]

east

east() -> Point

Return the east anchor of the node

Source code in src/momapy/core/layout.py
def east(self) -> momapy.geometry.Point:
    """Return the east anchor of the node"""
    return self.own_angle(0)

east_north_east

east_north_east() -> Point

Return the east north east anchor of the node

Source code in src/momapy/core/layout.py
def east_north_east(self) -> momapy.geometry.Point:
    """Return the east north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

east_south_east

east_south_east() -> Point

Return the east south east west anchor of the node

Source code in src/momapy/core/layout.py
def east_south_east(self) -> momapy.geometry.Point:
    """Return the east south east west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

equals

equals(other: LayoutElement, flattened: bool = False, unordered: bool = False) -> bool

Return true if the layout element is equal to another layout element, false otherwise

Source code in src/momapy/core/elements.py
def equals(
    self, other: "LayoutElement", flattened: bool = False, unordered: bool = False
) -> bool:
    """Return `true` if the layout element is equal to another layout element, `false` otherwise"""
    if type(self) is type(other):
        if not flattened:
            return self == other
        else:
            if not unordered:
                return self.flattened() == other.flattened()
            else:
                return set(self.flattened()) == set(other.flattened())
    return False

flattened

flattened() -> list[LayoutElement]

Return a list containing copy of the layout element with no children and all its descendants with no children

Source code in src/momapy/core/elements.py
def flattened(self) -> list["LayoutElement"]:
    """Return a list containing copy of the layout element with no children and all its descendants with no children"""
    flattened = [self.childless()]
    for child in self.children():
        flattened += child.flattened()
    return flattened

label_center

label_center() -> Point

Return the label center anchor of the node

Source code in src/momapy/core/layout.py
def label_center(self) -> momapy.geometry.Point:
    """Return the label center anchor of the node"""
    return self.position

north

north() -> Point

Return the north anchor of the node

Source code in src/momapy/core/layout.py
def north(self) -> momapy.geometry.Point:
    """Return the north anchor of the node"""
    return self.own_angle(90)

north_east

north_east() -> Point

Return the north east anchor of the node

Source code in src/momapy/core/layout.py
def north_east(self) -> momapy.geometry.Point:
    """Return the north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_east

north_north_east() -> Point

Return the north north east anchor of the node

Source code in src/momapy/core/layout.py
def north_north_east(self) -> momapy.geometry.Point:
    """Return the north north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_west

north_north_west() -> Point

Return the north north west anchor of the node

Source code in src/momapy/core/layout.py
def north_north_west(self) -> momapy.geometry.Point:
    """Return the north north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_west

north_west() -> Point

Return the north west anchor of the node

Source code in src/momapy/core/layout.py
def north_west(self) -> momapy.geometry.Point:
    """Return the north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

own_angle

own_angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def own_angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.own_drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

own_bbox

own_bbox() -> Bbox

Compute and return the bounding box of the self drawing element of the group layout

Source code in src/momapy/core/layout.py
def own_bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the self drawing element of the group layout"""
    primitives = self.own_to_geometry()
    if not primitives:
        return momapy.geometry.Bbox(momapy.geometry.Point(0, 0), 0, 0)
    bboxes = [p.bbox() for p in primitives]
    return momapy.geometry.Bbox.union(bboxes)

own_border

own_border(point: Point) -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def own_border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.own_drawing_elements(),
        point=point,
        center=self.center(),
    )

own_children

own_children() -> list[LayoutElement]

Return the self children of the node. A node has unique child that is its label

Source code in src/momapy/core/layout.py
def own_children(self) -> list[LayoutElement]:
    """Return the self children of the node. A node has unique child that is its label"""
    if self.label is not None:
        return [self.label]
    return []

own_drawing_elements

own_drawing_elements() -> list[DrawingElement]

Return the node's own drawing elements

Source code in src/momapy/core/layout.py
def own_drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the node's own drawing elements"""
    drawing_elements = self._border_drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}_own",
        elements=tuple(drawing_elements),
        fill=self.fill,
        filter=self.filter,
        id_=f"{self.id_}_own",
        stroke=self.stroke,
        stroke_dasharray=self.stroke_dasharray,
        stroke_dashoffset=self.stroke_dashoffset,
        stroke_width=self.stroke_width,
        transform=self.transform,
    )
    return [group]

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

Source code in src/momapy/core/layout.py
def own_to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the self drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

size

size() -> tuple[float, float]

Return the size of the node

Source code in src/momapy/core/layout.py
def size(self) -> tuple[float, float]:
    """Return the size of the node"""
    return (self.width, self.height)

south

south() -> Point

Return the south anchor of the node

Source code in src/momapy/core/layout.py
def south(self) -> momapy.geometry.Point:
    """Return the south anchor of the node"""
    return self.own_angle(270)

south_east

south_east() -> Point

Return the south east anchor of the node

Source code in src/momapy/core/layout.py
def south_east(self) -> momapy.geometry.Point:
    """Return the south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_east

south_south_east() -> Point

Return the south south east anchor of the node

Source code in src/momapy/core/layout.py
def south_south_east(self) -> momapy.geometry.Point:
    """Return the south south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_west

south_south_west() -> Point

Return the south south west anchor of the node

Source code in src/momapy/core/layout.py
def south_south_west(self) -> momapy.geometry.Point:
    """Return the south south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_west

south_west() -> Point

Return the south west anchor of the node

Source code in src/momapy/core/layout.py
def south_west(self) -> momapy.geometry.Point:
    """Return the south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

to_geometry

Return a list of geometry primitives from the drawing elements.

Source code in src/momapy/core/elements.py
def to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

west

west() -> Point

Return the west anchor of the node

Source code in src/momapy/core/layout.py
def west(self) -> momapy.geometry.Point:
    """Return the west anchor of the node"""
    return self.own_angle(180)

west_north_west

west_north_west() -> Point

Return the west north west anchor of the node

Source code in src/momapy/core/layout.py
def west_north_west(self) -> momapy.geometry.Point:
    """Return the west north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

west_south_west

west_south_west() -> Point

Return the west south west anchor of the node

Source code in src/momapy/core/layout.py
def west_south_west(self) -> momapy.geometry.Point:
    """Return the west south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

x property

x: float

Return the x coordinate of the node

y property

y: float

Return the y coordinate of the node

ComplexUnitOfInformation dataclass

ComplexUnitOfInformation(*, id_: str = make_uuid4_as_str(), label: str | None = None)

Bases: UnitOfInformation

Unit of information typing a biological activity as a complex.

Rendered as an SBGN complex glyph embedded in the activity node.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'75344ec9-67ec-4947-baa6-c04a5a2de19b'
label str | None
None

Methods:

Name Description
descendants

Return every ModelElement reachable from self, excluding self.

descendants

descendants() -> list[ModelElement]

Return every ModelElement reachable from self, excluding self.

Walks scalar ModelElement fields and frozenset/tuple containers, deduplicating by object identity.

Returns:

Type Description
list[ModelElement]

The list of reachable ModelElement instances in visit

list[ModelElement]

order, without self.

Source code in src/momapy/core/elements.py
def descendants(self) -> list["ModelElement"]:
    """Return every `ModelElement` reachable from `self`, excluding `self`.

    Walks scalar `ModelElement` fields and `frozenset`/`tuple`
    containers, deduplicating by object identity.

    Returns:
        The list of reachable `ModelElement` instances in visit
        order, without `self`.
    """
    seen: set[int] = {id(self)}
    result: list[ModelElement] = []
    if dataclasses.is_dataclass(self):
        for field in dataclasses.fields(type(self)):
            _walk_model_graph(getattr(self, field.name), seen, result)
    return result

ComplexUnitOfInformationLayout dataclass

ComplexUnitOfInformationLayout(fill: NoneValueType | Color | None = white, stroke: NoneValueType | Color | None = black, stroke_width: float | None = 1.25, *, id_: str = make_uuid4_as_str(), layout_elements: tuple[LayoutElement] = tuple(), group_fill: NoneValueType | Color | None = None, group_fill_rule: FillRule | None = None, group_filter: NoneValueType | Filter | None = None, group_font_family: str | None = None, group_font_size: float | None = None, group_font_style: FontStyle | None = None, group_font_weight: FontWeight | float | None = None, group_stroke: NoneValueType | Color | None = None, group_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, group_stroke_dashoffset: NoneValueType | float | None = None, group_stroke_width: NoneValueType | float | None = None, group_text_anchor: TextAnchor | None = None, group_transform: NoneValueType | tuple[Transformation] | None = None, filter: NoneValueType | Filter | None = None, height: float = 12.0, label: TextLayout | None = None, position: Point, stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, stroke_dashoffset: NoneValueType | float | None = None, transform: NoneValueType | tuple[Transformation] | None = None, width: float = 12.0, cut_corners: float = 5.0)

Bases: _SimpleMixin, SBGNNode

Layout for complex units of information.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'a3cd5ec0-be2b-4aa4-8ba6-3c33874301d6'
layout_elements tuple[LayoutElement]

The sub-layout elements of the group layout. These are part of the children of the group layout

<dynamic>
group_fill NoneValueType | Color | None

The fill color of the group layout

None
group_fill_rule FillRule | None

The fill rule of the group layout

None
group_filter NoneValueType | Filter | None

The filter of the group layout

None
group_font_family str | None

The font family of the group layout

None
group_font_size float | None

The font size of the group layout

None
group_font_style FontStyle | None

The font style of the group layout

None
group_font_weight FontWeight | float | None

The font weight of the group layout

None
group_stroke NoneValueType | Color | None

The stroke color of the group layout

None
group_stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the group layout

None
group_stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the group layout

None
group_stroke_width NoneValueType | float | None

The stroke width of the group layout

None
group_text_anchor TextAnchor | None

The text anchor of the group layout

None
group_transform NoneValueType | tuple[Transformation] | None

The transform of the group layout

None
fill NoneValueType | Color | None

The fill color of the node

Color(red=255, green=255, blue=255, alpha=1.0)
filter NoneValueType | Filter | None

The filter of the node

None
height float

The height of the node

12.0
label TextLayout | None

The label of the node

None
position Point

The position of the node

required
stroke NoneValueType | Color | None

The stroke color of the node

Color(red=0, green=0, blue=0, alpha=1.0)
stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the node

None
stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the node

None
stroke_width float | None

The stroke width of the node

1.25
transform NoneValueType | tuple[Transformation] | None

The transform of the node

None
width float

The width width of the node

12.0
cut_corners float
5.0

Methods:

Name Description
anchor_point

Return an anchor point of the layout element

angle

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

bbox

Compute and return the bounding box of the group layout element

border

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.

center

Return the center anchor of the node

childless

Return a copy of the node with no children

children

Return the children of the group layout.

contains

Return true if another layout element is a descendant of the layout element, false otherwise

descendants

Return the descendants of the layout element

drawing_elements

Return the drawing elements of the group layout.

east

Return the east anchor of the node

east_north_east

Return the east north east anchor of the node

east_south_east

Return the east south east west anchor of the node

equals

Return true if the layout element is equal to another layout element, false otherwise

flattened

Return a list containing copy of the layout element with no children and all its descendants with no children

label_center

Return the label center anchor of the node

north

Return the north anchor of the node

north_east

Return the north east anchor of the node

north_north_east

Return the north north east anchor of the node

north_north_west

Return the north north west anchor of the node

north_west

Return the north west anchor of the node

own_angle

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

own_bbox

Compute and return the bounding box of the self drawing element of the group layout

own_border

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.

own_children

Return the self children of the node. A node has unique child that is its label

own_drawing_elements

Return the node's own drawing elements

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

size

Return the size of the node

south

Return the south anchor of the node

south_east

Return the south east anchor of the node

south_south_east

Return the south south east anchor of the node

south_south_west

Return the south south west anchor of the node

south_west

Return the south west anchor of the node

to_geometry

Return a list of geometry primitives from the drawing elements.

west

Return the west anchor of the node

west_north_west

Return the west north west anchor of the node

west_south_west

Return the west south west anchor of the node

Attributes:

Name Type Description
x float

Return the x coordinate of the node

y float

Return the y coordinate of the node

anchor_point

anchor_point(anchor_name: str) -> Point

Return an anchor point of the layout element

Source code in src/momapy/core/elements.py
def anchor_point(self, anchor_name: str) -> momapy.geometry.Point:
    """Return an anchor point of the layout element"""
    return getattr(self, anchor_name)()

angle

angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

bbox

bbox() -> Bbox

Compute and return the bounding box of the group layout element

Source code in src/momapy/core/layout.py
def bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the group layout element"""
    own_bbox = self.own_bbox()
    bboxes = [child.bbox() for child in self.children()]
    min_x = own_bbox.north_west().x
    min_y = own_bbox.north_west().y
    max_x = own_bbox.south_east().x
    max_y = own_bbox.south_east().y
    for bbox in bboxes:
        if bbox.north_west().x < min_x:
            min_x = bbox.north_west().x
        if bbox.north_west().y < min_y:
            min_y = bbox.north_west().y
        if bbox.south_east().x > max_x:
            max_x = bbox.south_east().x
        if bbox.south_east().y > max_y:
            max_y = bbox.south_east().y
    bbox = momapy.geometry.Bbox(
        momapy.geometry.Point(min_x / 2 + max_x / 2, min_y / 2 + max_y / 2),
        max_x - min_x,
        max_y - min_y,
    )
    return bbox

border

border(point: Point) -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.drawing_elements(),
        point=point,
        center=self.center(),
    )

center

center() -> Point

Return the center anchor of the node

Source code in src/momapy/core/layout.py
def center(self) -> momapy.geometry.Point:
    """Return the center anchor of the node"""
    return self.position

childless

childless() -> Self

Return a copy of the node with no children

Source code in src/momapy/core/layout.py
def childless(self) -> typing_extensions.Self:
    """Return a copy of the node with no children"""
    return dataclasses.replace(self, label=None, layout_elements=tuple([]))

children

children() -> list[LayoutElement]

Return the children of the group layout. These are the self children of the group layout (returned by the own_children method) and the other children of the group layout (given by the layout_elements attribute)

Source code in src/momapy/core/layout.py
def children(self) -> list[LayoutElement]:
    """Return the children of the group layout.
    These are the self children of the group layout (returned by the `own_children` method) and the other children of the group layout (given by the `layout_elements` attribute)
    """
    return self.own_children() + list(self.layout_elements)

contains

contains(other: LayoutElement) -> bool

Return true if another layout element is a descendant of the layout element, false otherwise

Source code in src/momapy/core/elements.py
def contains(self, other: "LayoutElement") -> bool:
    """Return `true` if another layout element is a descendant of the layout element, `false` otherwise"""
    return other in self.descendants()

descendants

descendants() -> list[LayoutElement]

Return the descendants of the layout element

Source code in src/momapy/core/elements.py
def descendants(self) -> list["LayoutElement"]:
    """Return the descendants of the layout element"""
    descendants = []
    for child in self.children():
        descendants.append(child)
        descendants += child.descendants()
    return descendants

drawing_elements

drawing_elements() -> list[DrawingElement]

Return the drawing elements of the group layout. The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children

Source code in src/momapy/core/layout.py
def drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the drawing elements of the group layout.
    The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children
    """
    drawing_elements = self.own_drawing_elements()
    for child in self.children():
        if child is not None:
            drawing_elements += child.drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}",
        elements=tuple(drawing_elements),
        id_=f"{self.id_}",
        fill=self.group_fill,
        fill_rule=self.group_fill_rule,
        filter=self.group_filter,
        font_family=self.group_font_family,
        font_size=self.group_font_size,
        font_style=self.group_font_style,
        font_weight=self.group_font_weight,
        stroke=self.group_stroke,
        stroke_dasharray=self.group_stroke_dasharray,
        stroke_dashoffset=self.group_stroke_dashoffset,
        stroke_width=self.group_stroke_width,
        text_anchor=self.group_text_anchor,
        transform=self.group_transform,
    )
    return [group]

east

east() -> Point

Return the east anchor of the node

Source code in src/momapy/core/layout.py
def east(self) -> momapy.geometry.Point:
    """Return the east anchor of the node"""
    return self.own_angle(0)

east_north_east

east_north_east() -> Point

Return the east north east anchor of the node

Source code in src/momapy/core/layout.py
def east_north_east(self) -> momapy.geometry.Point:
    """Return the east north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

east_south_east

east_south_east() -> Point

Return the east south east west anchor of the node

Source code in src/momapy/core/layout.py
def east_south_east(self) -> momapy.geometry.Point:
    """Return the east south east west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

equals

equals(other: LayoutElement, flattened: bool = False, unordered: bool = False) -> bool

Return true if the layout element is equal to another layout element, false otherwise

Source code in src/momapy/core/elements.py
def equals(
    self, other: "LayoutElement", flattened: bool = False, unordered: bool = False
) -> bool:
    """Return `true` if the layout element is equal to another layout element, `false` otherwise"""
    if type(self) is type(other):
        if not flattened:
            return self == other
        else:
            if not unordered:
                return self.flattened() == other.flattened()
            else:
                return set(self.flattened()) == set(other.flattened())
    return False

flattened

flattened() -> list[LayoutElement]

Return a list containing copy of the layout element with no children and all its descendants with no children

Source code in src/momapy/core/elements.py
def flattened(self) -> list["LayoutElement"]:
    """Return a list containing copy of the layout element with no children and all its descendants with no children"""
    flattened = [self.childless()]
    for child in self.children():
        flattened += child.flattened()
    return flattened

label_center

label_center() -> Point

Return the label center anchor of the node

Source code in src/momapy/core/layout.py
def label_center(self) -> momapy.geometry.Point:
    """Return the label center anchor of the node"""
    return self.position

north

north() -> Point

Return the north anchor of the node

Source code in src/momapy/core/layout.py
def north(self) -> momapy.geometry.Point:
    """Return the north anchor of the node"""
    return self.own_angle(90)

north_east

north_east() -> Point

Return the north east anchor of the node

Source code in src/momapy/core/layout.py
def north_east(self) -> momapy.geometry.Point:
    """Return the north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_east

north_north_east() -> Point

Return the north north east anchor of the node

Source code in src/momapy/core/layout.py
def north_north_east(self) -> momapy.geometry.Point:
    """Return the north north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_west

north_north_west() -> Point

Return the north north west anchor of the node

Source code in src/momapy/core/layout.py
def north_north_west(self) -> momapy.geometry.Point:
    """Return the north north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_west

north_west() -> Point

Return the north west anchor of the node

Source code in src/momapy/core/layout.py
def north_west(self) -> momapy.geometry.Point:
    """Return the north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

own_angle

own_angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def own_angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.own_drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

own_bbox

own_bbox() -> Bbox

Compute and return the bounding box of the self drawing element of the group layout

Source code in src/momapy/core/layout.py
def own_bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the self drawing element of the group layout"""
    primitives = self.own_to_geometry()
    if not primitives:
        return momapy.geometry.Bbox(momapy.geometry.Point(0, 0), 0, 0)
    bboxes = [p.bbox() for p in primitives]
    return momapy.geometry.Bbox.union(bboxes)

own_border

own_border(point: Point) -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def own_border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.own_drawing_elements(),
        point=point,
        center=self.center(),
    )

own_children

own_children() -> list[LayoutElement]

Return the self children of the node. A node has unique child that is its label

Source code in src/momapy/core/layout.py
def own_children(self) -> list[LayoutElement]:
    """Return the self children of the node. A node has unique child that is its label"""
    if self.label is not None:
        return [self.label]
    return []

own_drawing_elements

own_drawing_elements() -> list[DrawingElement]

Return the node's own drawing elements

Source code in src/momapy/core/layout.py
def own_drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the node's own drawing elements"""
    drawing_elements = self._border_drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}_own",
        elements=tuple(drawing_elements),
        fill=self.fill,
        filter=self.filter,
        id_=f"{self.id_}_own",
        stroke=self.stroke,
        stroke_dasharray=self.stroke_dasharray,
        stroke_dashoffset=self.stroke_dashoffset,
        stroke_width=self.stroke_width,
        transform=self.transform,
    )
    return [group]

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

Source code in src/momapy/core/layout.py
def own_to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the self drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

size

size() -> tuple[float, float]

Return the size of the node

Source code in src/momapy/core/layout.py
def size(self) -> tuple[float, float]:
    """Return the size of the node"""
    return (self.width, self.height)

south

south() -> Point

Return the south anchor of the node

Source code in src/momapy/core/layout.py
def south(self) -> momapy.geometry.Point:
    """Return the south anchor of the node"""
    return self.own_angle(270)

south_east

south_east() -> Point

Return the south east anchor of the node

Source code in src/momapy/core/layout.py
def south_east(self) -> momapy.geometry.Point:
    """Return the south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_east

south_south_east() -> Point

Return the south south east anchor of the node

Source code in src/momapy/core/layout.py
def south_south_east(self) -> momapy.geometry.Point:
    """Return the south south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_west

south_south_west() -> Point

Return the south south west anchor of the node

Source code in src/momapy/core/layout.py
def south_south_west(self) -> momapy.geometry.Point:
    """Return the south south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_west

south_west() -> Point

Return the south west anchor of the node

Source code in src/momapy/core/layout.py
def south_west(self) -> momapy.geometry.Point:
    """Return the south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

to_geometry

Return a list of geometry primitives from the drawing elements.

Source code in src/momapy/core/elements.py
def to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

west

west() -> Point

Return the west anchor of the node

Source code in src/momapy/core/layout.py
def west(self) -> momapy.geometry.Point:
    """Return the west anchor of the node"""
    return self.own_angle(180)

west_north_west

west_north_west() -> Point

Return the west north west anchor of the node

Source code in src/momapy/core/layout.py
def west_north_west(self) -> momapy.geometry.Point:
    """Return the west north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

west_south_west

west_south_west() -> Point

Return the west south west anchor of the node

Source code in src/momapy/core/layout.py
def west_south_west(self) -> momapy.geometry.Point:
    """Return the west south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

x property

x: float

Return the x coordinate of the node

y property

y: float

Return the y coordinate of the node

DelayOperator dataclass

DelayOperator(*, id_: str = make_uuid4_as_str(), inputs: frozenset[LogicalOperatorInput] = frozenset())

Bases: LogicalOperator

Logical DELAY operator.

The output mirrors the input after a delay; used to model time-shifted influences.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'fdc9cd80-d4f8-43a4-8971-511e52f9a51c'
inputs frozenset[LogicalOperatorInput]

Build an immutable unordered collection of unique elements.

<dynamic>

Methods:

Name Description
descendants

Return every ModelElement reachable from self, excluding self.

descendants

descendants() -> list[ModelElement]

Return every ModelElement reachable from self, excluding self.

Walks scalar ModelElement fields and frozenset/tuple containers, deduplicating by object identity.

Returns:

Type Description
list[ModelElement]

The list of reachable ModelElement instances in visit

list[ModelElement]

order, without self.

Source code in src/momapy/core/elements.py
def descendants(self) -> list["ModelElement"]:
    """Return every `ModelElement` reachable from `self`, excluding `self`.

    Walks scalar `ModelElement` fields and `frozenset`/`tuple`
    containers, deduplicating by object identity.

    Returns:
        The list of reachable `ModelElement` instances in visit
        order, without `self`.
    """
    seen: set[int] = {id(self)}
    result: list[ModelElement] = []
    if dataclasses.is_dataclass(self):
        for field in dataclasses.fields(type(self)):
            _walk_model_graph(getattr(self, field.name), seen, result)
    return result

DelayOperatorLayout dataclass

DelayOperatorLayout(fill: NoneValueType | Color | None = white, stroke: NoneValueType | Color | None = black, stroke_width: float | None = 1.25, *, id_: str = make_uuid4_as_str(), layout_elements: tuple[LayoutElement] = tuple(), group_fill: NoneValueType | Color | None = None, group_fill_rule: FillRule | None = None, group_filter: NoneValueType | Filter | None = None, group_font_family: str | None = None, group_font_size: float | None = None, group_font_style: FontStyle | None = None, group_font_weight: FontWeight | float | None = None, group_stroke: NoneValueType | Color | None = None, group_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, group_stroke_dashoffset: NoneValueType | float | None = None, group_stroke_width: NoneValueType | float | None = None, group_text_anchor: TextAnchor | None = None, group_transform: NoneValueType | tuple[Transformation] | None = None, filter: NoneValueType | Filter | None = None, height: float = 30.0, label: TextLayout | None = None, position: Point, stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, stroke_dashoffset: NoneValueType | float | None = None, transform: NoneValueType | tuple[Transformation] | None = None, width: float = 30.0, text: str = 'τ', font_family: str = DEFAULT_FONT_FAMILY, font_fill: Color | NoneValueType = black, font_stroke: Color | NoneValueType = NoneValue, font_style: FontStyle = NORMAL, font_weight: FontWeight | float = NORMAL, direction: Direction = HORIZONTAL, left_to_right: bool = True, left_connector_length: float = 10.0, right_connector_length: float = 10.0, left_connector_stroke: NoneValueType | Color | None = None, left_connector_stroke_width: float | None = None, left_connector_stroke_dasharray: NoneValueType | tuple[float] | None = None, left_connector_stroke_dashoffset: float | None = None, left_connector_fill: NoneValueType | Color | None = None, left_connector_transform: NoneValueType | tuple[Transformation] | None = None, left_connector_filter: NoneValueType | Filter | None = None, right_connector_stroke: NoneValueType | Color | None = None, right_connector_stroke_width: float | None = None, right_connector_stroke_dasharray: NoneValueType | tuple[float] | None = None, right_connector_stroke_dashoffset: float | None = None, right_connector_fill: NoneValueType | Color | None = None, right_connector_transform: NoneValueType | tuple[Transformation] | None = None, right_connector_filter: NoneValueType | Filter | None = None)

Bases: _ConnectorsMixin, _SimpleMixin, _TextMixin, SBGNNode

Layout for DELAY operators.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'17209f63-4599-4d6c-ad4c-7e8b06623318'
layout_elements tuple[LayoutElement]

The sub-layout elements of the group layout. These are part of the children of the group layout

<dynamic>
group_fill NoneValueType | Color | None

The fill color of the group layout

None
group_fill_rule FillRule | None

The fill rule of the group layout

None
group_filter NoneValueType | Filter | None

The filter of the group layout

None
group_font_family str | None

The font family of the group layout

None
group_font_size float | None

The font size of the group layout

None
group_font_style FontStyle | None

The font style of the group layout

None
group_font_weight FontWeight | float | None

The font weight of the group layout

None
group_stroke NoneValueType | Color | None

The stroke color of the group layout

None
group_stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the group layout

None
group_stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the group layout

None
group_stroke_width NoneValueType | float | None

The stroke width of the group layout

None
group_text_anchor TextAnchor | None

The text anchor of the group layout

None
group_transform NoneValueType | tuple[Transformation] | None

The transform of the group layout

None
fill NoneValueType | Color | None

The fill color of the node

Color(red=255, green=255, blue=255, alpha=1.0)
filter NoneValueType | Filter | None

The filter of the node

None
height float

The height of the node

30.0
label TextLayout | None

The label of the node

None
position Point

The position of the node

required
stroke NoneValueType | Color | None

The stroke color of the node

Color(red=0, green=0, blue=0, alpha=1.0)
stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the node

None
stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the node

None
stroke_width float | None

The stroke width of the node

1.25
transform NoneValueType | tuple[Transformation] | None

The transform of the node

None
width float

The width width of the node

30.0
text str
'τ'
font_family str
'DejaVu Sans'
font_fill Color | NoneValueType
Color(red=0, green=0, blue=0, alpha=1.0)
font_stroke Color | NoneValueType
<momapy.drawing.NoneValueType object at 0x7fbe12e88d70>
font_style FontStyle
<FontStyle.NORMAL: 0>
font_weight FontWeight | float
<FontWeight.NORMAL: 0>
direction Direction
<Direction.HORIZONTAL: 1>
left_to_right bool
True
left_connector_length float
10.0
right_connector_length float
10.0
left_connector_stroke NoneValueType | Color | None
None
left_connector_stroke_width float | None
None
left_connector_stroke_dasharray NoneValueType | tuple[float] | None
None
left_connector_stroke_dashoffset float | None
None
left_connector_fill NoneValueType | Color | None
None
left_connector_transform NoneValueType | tuple[Transformation] | None
None
left_connector_filter NoneValueType | Filter | None
None
right_connector_stroke NoneValueType | Color | None
None
right_connector_stroke_width float | None
None
right_connector_stroke_dasharray NoneValueType | tuple[float] | None
None
right_connector_stroke_dashoffset float | None
None
right_connector_fill NoneValueType | Color | None
None
right_connector_transform NoneValueType | tuple[Transformation] | None
None
right_connector_filter NoneValueType | Filter | None
None

Methods:

Name Description
anchor_point

Return an anchor point of the layout element

angle

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

bbox

Compute and return the bounding box of the group layout element

border

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.

center

Return the center anchor of the node

childless

Return a copy of the node with no children

children

Return the children of the group layout.

contains

Return true if another layout element is a descendant of the layout element, false otherwise

descendants

Return the descendants of the layout element

drawing_elements

Return the drawing elements of the group layout.

east

Get the east (right) anchor point.

east_north_east

Return the east north east anchor of the node

east_south_east

Return the east south east west anchor of the node

equals

Return true if the layout element is equal to another layout element, false otherwise

flattened

Return a list containing copy of the layout element with no children and all its descendants with no children

label_center

Return the label center anchor of the node

left_connector_base

Get the base point of the left connector.

left_connector_tip

Get the tip point of the left connector.

north

Get the north (top) anchor point.

north_east

Return the north east anchor of the node

north_north_east

Return the north north east anchor of the node

north_north_west

Return the north north west anchor of the node

north_west

Return the north west anchor of the node

own_angle

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

own_bbox

Compute and return the bounding box of the self drawing element of the group layout

own_border

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.

own_children

Return the self children of the node. A node has unique child that is its label

own_drawing_elements

Return the node's own drawing elements

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

right_connector_base

Get the base point of the right connector.

right_connector_tip

Get the tip point of the right connector.

size

Return the size of the node

south

Get the south (bottom) anchor point.

south_east

Return the south east anchor of the node

south_south_east

Return the south south east anchor of the node

south_south_west

Return the south south west anchor of the node

south_west

Return the south west anchor of the node

to_geometry

Return a list of geometry primitives from the drawing elements.

west

Get the west (left) anchor point.

west_north_west

Return the west north west anchor of the node

west_south_west

Return the west south west anchor of the node

Attributes:

Name Type Description
x float

Return the x coordinate of the node

y float

Return the y coordinate of the node

anchor_point

anchor_point(anchor_name: str) -> Point

Return an anchor point of the layout element

Source code in src/momapy/core/elements.py
def anchor_point(self, anchor_name: str) -> momapy.geometry.Point:
    """Return an anchor point of the layout element"""
    return getattr(self, anchor_name)()

angle

angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

bbox

bbox() -> Bbox

Compute and return the bounding box of the group layout element

Source code in src/momapy/core/layout.py
def bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the group layout element"""
    own_bbox = self.own_bbox()
    bboxes = [child.bbox() for child in self.children()]
    min_x = own_bbox.north_west().x
    min_y = own_bbox.north_west().y
    max_x = own_bbox.south_east().x
    max_y = own_bbox.south_east().y
    for bbox in bboxes:
        if bbox.north_west().x < min_x:
            min_x = bbox.north_west().x
        if bbox.north_west().y < min_y:
            min_y = bbox.north_west().y
        if bbox.south_east().x > max_x:
            max_x = bbox.south_east().x
        if bbox.south_east().y > max_y:
            max_y = bbox.south_east().y
    bbox = momapy.geometry.Bbox(
        momapy.geometry.Point(min_x / 2 + max_x / 2, min_y / 2 + max_y / 2),
        max_x - min_x,
        max_y - min_y,
    )
    return bbox

border

border(point: Point) -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.drawing_elements(),
        point=point,
        center=self.center(),
    )

center

center() -> Point

Return the center anchor of the node

Source code in src/momapy/core/layout.py
def center(self) -> momapy.geometry.Point:
    """Return the center anchor of the node"""
    return self.position

childless

childless() -> Self

Return a copy of the node with no children

Source code in src/momapy/core/layout.py
def childless(self) -> typing_extensions.Self:
    """Return a copy of the node with no children"""
    return dataclasses.replace(self, label=None, layout_elements=tuple([]))

children

children() -> list[LayoutElement]

Return the children of the group layout. These are the self children of the group layout (returned by the own_children method) and the other children of the group layout (given by the layout_elements attribute)

Source code in src/momapy/core/layout.py
def children(self) -> list[LayoutElement]:
    """Return the children of the group layout.
    These are the self children of the group layout (returned by the `own_children` method) and the other children of the group layout (given by the `layout_elements` attribute)
    """
    return self.own_children() + list(self.layout_elements)

contains

contains(other: LayoutElement) -> bool

Return true if another layout element is a descendant of the layout element, false otherwise

Source code in src/momapy/core/elements.py
def contains(self, other: "LayoutElement") -> bool:
    """Return `true` if another layout element is a descendant of the layout element, `false` otherwise"""
    return other in self.descendants()

descendants

descendants() -> list[LayoutElement]

Return the descendants of the layout element

Source code in src/momapy/core/elements.py
def descendants(self) -> list["LayoutElement"]:
    """Return the descendants of the layout element"""
    descendants = []
    for child in self.children():
        descendants.append(child)
        descendants += child.descendants()
    return descendants

drawing_elements

drawing_elements() -> list[DrawingElement]

Return the drawing elements of the group layout. The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children

Source code in src/momapy/core/layout.py
def drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the drawing elements of the group layout.
    The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children
    """
    drawing_elements = self.own_drawing_elements()
    for child in self.children():
        if child is not None:
            drawing_elements += child.drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}",
        elements=tuple(drawing_elements),
        id_=f"{self.id_}",
        fill=self.group_fill,
        fill_rule=self.group_fill_rule,
        filter=self.group_filter,
        font_family=self.group_font_family,
        font_size=self.group_font_size,
        font_style=self.group_font_style,
        font_weight=self.group_font_weight,
        stroke=self.group_stroke,
        stroke_dasharray=self.group_stroke_dasharray,
        stroke_dashoffset=self.group_stroke_dashoffset,
        stroke_width=self.group_stroke_width,
        text_anchor=self.group_text_anchor,
        transform=self.group_transform,
    )
    return [group]

east

east() -> Point

Get the east (right) anchor point.

Returns:

Type Description
Point

Point on the east side of the element.

Source code in src/momapy/sbgn/elements.py
def east(self) -> momapy.geometry.Point:
    """Get the east (right) anchor point.

    Returns:
        Point on the east side of the element.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(self.x + self.width / 2, self.y)
    else:
        return momapy.geometry.Point(
            self.x + self.width / 2 + self.right_connector_length, self.y
        )

east_north_east

east_north_east() -> Point

Return the east north east anchor of the node

Source code in src/momapy/core/layout.py
def east_north_east(self) -> momapy.geometry.Point:
    """Return the east north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

east_south_east

east_south_east() -> Point

Return the east south east west anchor of the node

Source code in src/momapy/core/layout.py
def east_south_east(self) -> momapy.geometry.Point:
    """Return the east south east west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

equals

equals(other: LayoutElement, flattened: bool = False, unordered: bool = False) -> bool

Return true if the layout element is equal to another layout element, false otherwise

Source code in src/momapy/core/elements.py
def equals(
    self, other: "LayoutElement", flattened: bool = False, unordered: bool = False
) -> bool:
    """Return `true` if the layout element is equal to another layout element, `false` otherwise"""
    if type(self) is type(other):
        if not flattened:
            return self == other
        else:
            if not unordered:
                return self.flattened() == other.flattened()
            else:
                return set(self.flattened()) == set(other.flattened())
    return False

flattened

flattened() -> list[LayoutElement]

Return a list containing copy of the layout element with no children and all its descendants with no children

Source code in src/momapy/core/elements.py
def flattened(self) -> list["LayoutElement"]:
    """Return a list containing copy of the layout element with no children and all its descendants with no children"""
    flattened = [self.childless()]
    for child in self.children():
        flattened += child.flattened()
    return flattened

label_center

label_center() -> Point

Return the label center anchor of the node

Source code in src/momapy/core/layout.py
def label_center(self) -> momapy.geometry.Point:
    """Return the label center anchor of the node"""
    return self.position

left_connector_base

left_connector_base() -> Point

Get the base point of the left connector.

Returns:

Type Description
Point

Point where the left connector attaches to the shape.

Source code in src/momapy/sbgn/elements.py
def left_connector_base(self) -> momapy.geometry.Point:
    """Get the base point of the left connector.

    Returns:
        Point where the left connector attaches to the shape.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(self.x, self.y - self.height / 2)
    else:
        return momapy.geometry.Point(self.x - self.width / 2, self.y)

left_connector_tip

left_connector_tip() -> Point

Get the tip point of the left connector.

Returns:

Type Description
Point

Point at the end of the left connector line.

Source code in src/momapy/sbgn/elements.py
def left_connector_tip(self) -> momapy.geometry.Point:
    """Get the tip point of the left connector.

    Returns:
        Point at the end of the left connector line.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(
            self.x, self.y - self.height / 2 - self.left_connector_length
        )
    else:
        return momapy.geometry.Point(
            self.x - self.width / 2 - self.left_connector_length, self.y
        )

north

north() -> Point

Get the north (top) anchor point.

Returns:

Type Description
Point

Point on the north side of the element.

Source code in src/momapy/sbgn/elements.py
def north(self) -> momapy.geometry.Point:
    """Get the north (top) anchor point.

    Returns:
        Point on the north side of the element.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(
            self.x, self.y - self.height / 2 - self.left_connector_length
        )
    else:
        return momapy.geometry.Point(self.x, self.y - self.height / 2)

north_east

north_east() -> Point

Return the north east anchor of the node

Source code in src/momapy/core/layout.py
def north_east(self) -> momapy.geometry.Point:
    """Return the north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_east

north_north_east() -> Point

Return the north north east anchor of the node

Source code in src/momapy/core/layout.py
def north_north_east(self) -> momapy.geometry.Point:
    """Return the north north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_west

north_north_west() -> Point

Return the north north west anchor of the node

Source code in src/momapy/core/layout.py
def north_north_west(self) -> momapy.geometry.Point:
    """Return the north north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_west

north_west() -> Point

Return the north west anchor of the node

Source code in src/momapy/core/layout.py
def north_west(self) -> momapy.geometry.Point:
    """Return the north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

own_angle

own_angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def own_angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.own_drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

own_bbox

own_bbox() -> Bbox

Compute and return the bounding box of the self drawing element of the group layout

Source code in src/momapy/core/layout.py
def own_bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the self drawing element of the group layout"""
    primitives = self.own_to_geometry()
    if not primitives:
        return momapy.geometry.Bbox(momapy.geometry.Point(0, 0), 0, 0)
    bboxes = [p.bbox() for p in primitives]
    return momapy.geometry.Bbox.union(bboxes)

own_border

own_border(point: Point) -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def own_border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.own_drawing_elements(),
        point=point,
        center=self.center(),
    )

own_children

own_children() -> list[LayoutElement]

Return the self children of the node. A node has unique child that is its label

Source code in src/momapy/core/layout.py
def own_children(self) -> list[LayoutElement]:
    """Return the self children of the node. A node has unique child that is its label"""
    if self.label is not None:
        return [self.label]
    return []

own_drawing_elements

own_drawing_elements() -> list[DrawingElement]

Return the node's own drawing elements

Source code in src/momapy/core/layout.py
def own_drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the node's own drawing elements"""
    drawing_elements = self._border_drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}_own",
        elements=tuple(drawing_elements),
        fill=self.fill,
        filter=self.filter,
        id_=f"{self.id_}_own",
        stroke=self.stroke,
        stroke_dasharray=self.stroke_dasharray,
        stroke_dashoffset=self.stroke_dashoffset,
        stroke_width=self.stroke_width,
        transform=self.transform,
    )
    return [group]

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

Source code in src/momapy/core/layout.py
def own_to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the self drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

right_connector_base

right_connector_base() -> Point

Get the base point of the right connector.

Returns:

Type Description
Point

Point where the right connector attaches to the shape.

Source code in src/momapy/sbgn/elements.py
def right_connector_base(self) -> momapy.geometry.Point:
    """Get the base point of the right connector.

    Returns:
        Point where the right connector attaches to the shape.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(self.x, self.y + self.height / 2)
    else:
        return momapy.geometry.Point(self.x + self.width / 2, self.y)

right_connector_tip

right_connector_tip() -> Point

Get the tip point of the right connector.

Returns:

Type Description
Point

Point at the end of the right connector line.

Source code in src/momapy/sbgn/elements.py
def right_connector_tip(self) -> momapy.geometry.Point:
    """Get the tip point of the right connector.

    Returns:
        Point at the end of the right connector line.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(
            self.x, self.y + self.height / 2 + self.right_connector_length
        )
    else:
        return momapy.geometry.Point(
            self.x + self.width / 2 + self.right_connector_length, self.y
        )

size

size() -> tuple[float, float]

Return the size of the node

Source code in src/momapy/core/layout.py
def size(self) -> tuple[float, float]:
    """Return the size of the node"""
    return (self.width, self.height)

south

south() -> Point

Get the south (bottom) anchor point.

Returns:

Type Description
Point

Point on the south side of the element.

Source code in src/momapy/sbgn/elements.py
def south(self) -> momapy.geometry.Point:
    """Get the south (bottom) anchor point.

    Returns:
        Point on the south side of the element.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(
            self.x, self.y + self.height / 2 + self.right_connector_length
        )
    else:
        return momapy.geometry.Point(self.x, self.y + self.height / 2)

south_east

south_east() -> Point

Return the south east anchor of the node

Source code in src/momapy/core/layout.py
def south_east(self) -> momapy.geometry.Point:
    """Return the south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_east

south_south_east() -> Point

Return the south south east anchor of the node

Source code in src/momapy/core/layout.py
def south_south_east(self) -> momapy.geometry.Point:
    """Return the south south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_west

south_south_west() -> Point

Return the south south west anchor of the node

Source code in src/momapy/core/layout.py
def south_south_west(self) -> momapy.geometry.Point:
    """Return the south south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_west

south_west() -> Point

Return the south west anchor of the node

Source code in src/momapy/core/layout.py
def south_west(self) -> momapy.geometry.Point:
    """Return the south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

to_geometry

Return a list of geometry primitives from the drawing elements.

Source code in src/momapy/core/elements.py
def to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

west

west() -> Point

Get the west (left) anchor point.

Returns:

Type Description
Point

Point on the west side of the element.

Source code in src/momapy/sbgn/elements.py
def west(self) -> momapy.geometry.Point:
    """Get the west (left) anchor point.

    Returns:
        Point on the west side of the element.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(self.x - self.width / 2, self.y)
    else:
        return momapy.geometry.Point(
            self.x - self.width / 2 - self.left_connector_length, self.y
        )

west_north_west

west_north_west() -> Point

Return the west north west anchor of the node

Source code in src/momapy/core/layout.py
def west_north_west(self) -> momapy.geometry.Point:
    """Return the west north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

west_south_west

west_south_west() -> Point

Return the west south west anchor of the node

Source code in src/momapy/core/layout.py
def west_south_west(self) -> momapy.geometry.Point:
    """Return the west south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

x property

x: float

Return the x coordinate of the node

y property

y: float

Return the y coordinate of the node

EquivalenceArcLayout dataclass

EquivalenceArcLayout(path_fill: NoneValueType | Color | None = NoneValue, path_stroke: NoneValueType | Color | None = black, path_stroke_width: float | None = 1.25, arrowhead_fill: NoneValueType | Color | None = white, arrowhead_stroke: NoneValueType | Color | None = black, arrowhead_stroke_width: float | None = 1.25, *, id_: str = make_uuid4_as_str(), layout_elements: tuple[LayoutElement] = tuple(), group_fill: NoneValueType | Color | None = None, group_fill_rule: FillRule | None = None, group_filter: NoneValueType | Filter | None = None, group_font_family: str | None = None, group_font_size: float | None = None, group_font_style: FontStyle | None = None, group_font_weight: FontWeight | float | None = None, group_stroke: NoneValueType | Color | None = None, group_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, group_stroke_dashoffset: NoneValueType | float | None = None, group_stroke_width: NoneValueType | float | None = None, group_text_anchor: TextAnchor | None = None, group_transform: NoneValueType | tuple[Transformation] | None = None, end_shorten: float = 0.0, fill: NoneValueType | Color | None = None, filter: NoneValueType | Filter | None = None, path_filter: NoneValueType | Filter | None = None, path_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, path_stroke_dashoffset: NoneValueType | float | None = None, path_transform: NoneValueType | tuple[Transformation] | None = None, stroke: NoneValueType | Color | None = None, stroke_dasharray: NoneValueType | tuple[float] | None = None, stroke_dashoffset: NoneValueType | float | None = None, stroke_width: NoneValueType | float | None = None, segments: tuple[Segment | QuadraticBezierCurve | CubicBezierCurve | EllipticalArc] = tuple(), source: LayoutElement | None = None, start_shorten: float = 0.0, target: LayoutElement | None = None, transform: NoneValueType | tuple[Transformation] | None = None, arrowhead_filter: NoneValueType | Filter | None = None, arrowhead_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, arrowhead_stroke_dashoffset: NoneValueType | float | None = None, arrowhead_transform: NoneValueType | tuple[Transformation] | None = None)

Bases: SBGNSingleHeadedArc

Layout for equivalence arcs.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'05d2b5b4-3e62-486d-9431-f6dc454c4f2d'
layout_elements tuple[LayoutElement]

The sub-layout elements of the group layout. These are part of the children of the group layout

<dynamic>
group_fill NoneValueType | Color | None

The fill color of the group layout

None
group_fill_rule FillRule | None

The fill rule of the group layout

None
group_filter NoneValueType | Filter | None

The filter of the group layout

None
group_font_family str | None

The font family of the group layout

None
group_font_size float | None

The font size of the group layout

None
group_font_style FontStyle | None

The font style of the group layout

None
group_font_weight FontWeight | float | None

The font weight of the group layout

None
group_stroke NoneValueType | Color | None

The stroke color of the group layout

None
group_stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the group layout

None
group_stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the group layout

None
group_stroke_width NoneValueType | float | None

The stroke width of the group layout

None
group_text_anchor TextAnchor | None

The text anchor of the group layout

None
group_transform NoneValueType | tuple[Transformation] | None

The transform of the group layout

None
end_shorten float

The length the end of the arc will be shorten by

0.0
fill NoneValueType | Color | None

The fill color of the arc

None
filter NoneValueType | Filter | None

The fill filter of the arc

None
path_fill NoneValueType | Color | None

The path fill color of the arc

<momapy.drawing.NoneValueType object at 0x7fbe12e88d70>
path_filter NoneValueType | Filter | None

The path filter of the arc

None
path_stroke NoneValueType | Color | None

The path stroke color of the arc

Color(red=0, green=0, blue=0, alpha=1.0)
path_stroke_dasharray NoneValueType | tuple[float, ...] | None

The path stroke dasharray of the arc

None
path_stroke_dashoffset NoneValueType | float | None

The path stroke dashoffset of the arc

None
path_stroke_width float | None

The path stroke width of the arc

1.25
path_transform NoneValueType | tuple[Transformation] | None

The path transform of the arc

None
stroke NoneValueType | Color | None

The stroke color of the arc

None
stroke_dasharray NoneValueType | tuple[float] | None

The stroke dasharray of the arc

None
stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the arc

None
stroke_width NoneValueType | float | None

The stroke width of the arc

None
segments tuple[Segment | QuadraticBezierCurve | CubicBezierCurve | EllipticalArc]

The path segments of the arc

<dynamic>
source LayoutElement | None

The source of the arc

None
start_shorten float

The length the start of the arc will be shorten by

0.0
target LayoutElement | None

The target of the arc

None
transform NoneValueType | tuple[Transformation] | None

The transform of the arc

None
arrowhead_fill NoneValueType | Color | None

The arrowhead fill color of the arc

Color(red=255, green=255, blue=255, alpha=1.0)
arrowhead_filter NoneValueType | Filter | None

The arrowhead filter of the arc

None
arrowhead_stroke NoneValueType | Color | None

The arrowhead stroke color of the arc

Color(red=0, green=0, blue=0, alpha=1.0)
arrowhead_stroke_dasharray NoneValueType | tuple[float, ...] | None

The arrowhead stroke dasharray of the arc

None
arrowhead_stroke_dashoffset NoneValueType | float | None

The arrowhead stroke dashoffset of the arc

None
arrowhead_stroke_width float | None

The arrowhead stroke width of the arc

1.25
arrowhead_transform NoneValueType | tuple[Transformation] | None

The arrowhead transform of the arc

None

Methods:

Name Description
anchor_point

Return an anchor point of the layout element

arrowhead_base

Return the arrowhead base anchor point of the single-headed arc

arrowhead_bbox

Return the bounding box of the single-headed arc arrowhead

arrowhead_border

Return the point at the intersection of the drawing elements of the single-headed arc arrowhead and the line going through the center of these drawing elements and the given point.

arrowhead_drawing_elements

Return the drawing elements of the single-headed arc arrowhead

arrowhead_length

Return the length of the single-headed arc arrowhead

arrowhead_tip

Return the arrowhead tip anchor point of the single-headed arc

bbox

Compute and return the bounding box of the group layout element

childless

Return a copy of the arc with no children

children

Return the children of the group layout.

contains

Return true if another layout element is a descendant of the layout element, false otherwise

descendants

Return the descendants of the layout element

drawing_elements

Return the drawing elements of the group layout.

end_point

Return the ending point of the arc

equals

Return true if the layout element is equal to another layout element, false otherwise

flattened

Return a list containing copy of the layout element with no children and all its descendants with no children

fraction

Return the position and angle on the arc at a given fraction (of the total arc length)

length

Return the total length of the arc path

own_bbox

Compute and return the bounding box of the self drawing element of the group layout

own_children

Return the self children of the arc

own_drawing_elements

Return the self drawing elements of the single-headed arc

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

path_drawing_elements

Return the drawing elements of the single-headed arc path

points

Return the points of the arc path

start_point

Return the starting point of the arc

to_geometry

Return a list of geometry primitives from the drawing elements.

anchor_point

anchor_point(anchor_name: str) -> Point

Return an anchor point of the layout element

Source code in src/momapy/core/elements.py
def anchor_point(self, anchor_name: str) -> momapy.geometry.Point:
    """Return an anchor point of the layout element"""
    return getattr(self, anchor_name)()

arrowhead_base

arrowhead_base() -> Point

Return the arrowhead base anchor point of the single-headed arc

Source code in src/momapy/core/layout.py
def arrowhead_base(self) -> momapy.geometry.Point:
    """Return the arrowhead base anchor point of the single-headed arc"""
    arrowhead_length = self.arrowhead_length()
    segment = self.segments[-1]
    segment_length = segment.length()
    if segment_length == 0:
        return self.arrowhead_tip() - (arrowhead_length, 0)
    fraction = 1 - (arrowhead_length + self.end_shorten) / segment_length
    return segment.get_position_at_fraction(fraction)

arrowhead_bbox

arrowhead_bbox() -> Bbox

Return the bounding box of the single-headed arc arrowhead

Source code in src/momapy/core/layout.py
def arrowhead_bbox(self) -> momapy.geometry.Bbox:
    """Return the bounding box of the single-headed arc arrowhead"""
    return momapy.drawing.get_drawing_elements_bbox(
        self.arrowhead_drawing_elements()
    )

arrowhead_border

arrowhead_border(point) -> Point

Return the point at the intersection of the drawing elements of the single-headed arc arrowhead and the line going through the center of these drawing elements and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def arrowhead_border(self, point) -> momapy.geometry.Point:
    """Return the point at the intersection of the drawing elements of the single-headed arc arrowhead and the line going through the center of these drawing elements and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """

    point = momapy.drawing.get_drawing_elements_border(
        self.arrowhead_drawing_elements(), point
    )
    if point is None:
        return self.arrowhead_tip()
    return point

arrowhead_drawing_elements

arrowhead_drawing_elements() -> list[DrawingElement]

Return the drawing elements of the single-headed arc arrowhead

Source code in src/momapy/core/layout.py
def arrowhead_drawing_elements(
    self,
) -> list[momapy.drawing.DrawingElement]:
    """Return the drawing elements of the single-headed arc arrowhead"""
    drawing_elements = self._arrowhead_border_drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}_arrowhead",
        elements=tuple(drawing_elements),
        fill=self.arrowhead_fill,
        filter=self.arrowhead_filter,
        id_=f"{self.id_}_arrowhead",
        stroke=self.arrowhead_stroke,
        stroke_dasharray=self.arrowhead_stroke_dasharray,
        stroke_dashoffset=self.arrowhead_stroke_dashoffset,
        stroke_width=self.arrowhead_stroke_width,
        transform=self.arrowhead_transform,
    )
    transformation = self._get_arrowhead_transformation()
    group = group.transformed(transformation)
    return [group]

arrowhead_length

arrowhead_length() -> float

Return the length of the single-headed arc arrowhead

Source code in src/momapy/core/layout.py
def arrowhead_length(self) -> float:
    """Return the length of the single-headed arc arrowhead"""
    bbox = momapy.drawing.get_drawing_elements_bbox(
        self._arrowhead_border_drawing_elements()
    )
    if math.isnan(bbox.width):
        return 0.0
    return bbox.east().x

arrowhead_tip

arrowhead_tip() -> Point

Return the arrowhead tip anchor point of the single-headed arc

Source code in src/momapy/core/layout.py
def arrowhead_tip(self) -> momapy.geometry.Point:
    """Return the arrowhead tip anchor point of the single-headed arc"""
    segment = self.segments[-1]
    segment_length = segment.length()
    if segment_length == 0:
        return segment.p2
    fraction = 1 - self.end_shorten / segment_length
    return segment.get_position_at_fraction(fraction)

bbox

bbox() -> Bbox

Compute and return the bounding box of the group layout element

Source code in src/momapy/core/layout.py
def bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the group layout element"""
    own_bbox = self.own_bbox()
    bboxes = [child.bbox() for child in self.children()]
    min_x = own_bbox.north_west().x
    min_y = own_bbox.north_west().y
    max_x = own_bbox.south_east().x
    max_y = own_bbox.south_east().y
    for bbox in bboxes:
        if bbox.north_west().x < min_x:
            min_x = bbox.north_west().x
        if bbox.north_west().y < min_y:
            min_y = bbox.north_west().y
        if bbox.south_east().x > max_x:
            max_x = bbox.south_east().x
        if bbox.south_east().y > max_y:
            max_y = bbox.south_east().y
    bbox = momapy.geometry.Bbox(
        momapy.geometry.Point(min_x / 2 + max_x / 2, min_y / 2 + max_y / 2),
        max_x - min_x,
        max_y - min_y,
    )
    return bbox

childless

childless() -> Self

Return a copy of the arc with no children

Source code in src/momapy/core/layout.py
def childless(self) -> typing_extensions.Self:
    """Return a copy of the arc with no children"""
    return dataclasses.replace(self, layout_elements=tuple([]))

children

children() -> list[LayoutElement]

Return the children of the group layout. These are the self children of the group layout (returned by the own_children method) and the other children of the group layout (given by the layout_elements attribute)

Source code in src/momapy/core/layout.py
def children(self) -> list[LayoutElement]:
    """Return the children of the group layout.
    These are the self children of the group layout (returned by the `own_children` method) and the other children of the group layout (given by the `layout_elements` attribute)
    """
    return self.own_children() + list(self.layout_elements)

contains

contains(other: LayoutElement) -> bool

Return true if another layout element is a descendant of the layout element, false otherwise

Source code in src/momapy/core/elements.py
def contains(self, other: "LayoutElement") -> bool:
    """Return `true` if another layout element is a descendant of the layout element, `false` otherwise"""
    return other in self.descendants()

descendants

descendants() -> list[LayoutElement]

Return the descendants of the layout element

Source code in src/momapy/core/elements.py
def descendants(self) -> list["LayoutElement"]:
    """Return the descendants of the layout element"""
    descendants = []
    for child in self.children():
        descendants.append(child)
        descendants += child.descendants()
    return descendants

drawing_elements

drawing_elements() -> list[DrawingElement]

Return the drawing elements of the group layout. The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children

Source code in src/momapy/core/layout.py
def drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the drawing elements of the group layout.
    The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children
    """
    drawing_elements = self.own_drawing_elements()
    for child in self.children():
        if child is not None:
            drawing_elements += child.drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}",
        elements=tuple(drawing_elements),
        id_=f"{self.id_}",
        fill=self.group_fill,
        fill_rule=self.group_fill_rule,
        filter=self.group_filter,
        font_family=self.group_font_family,
        font_size=self.group_font_size,
        font_style=self.group_font_style,
        font_weight=self.group_font_weight,
        stroke=self.group_stroke,
        stroke_dasharray=self.group_stroke_dasharray,
        stroke_dashoffset=self.group_stroke_dashoffset,
        stroke_width=self.group_stroke_width,
        text_anchor=self.group_text_anchor,
        transform=self.group_transform,
    )
    return [group]

end_point

end_point() -> Point

Return the ending point of the arc

Source code in src/momapy/core/layout.py
def end_point(self) -> momapy.geometry.Point:
    """Return the ending point of the arc"""
    return self.points()[-1]

equals

equals(other: LayoutElement, flattened: bool = False, unordered: bool = False) -> bool

Return true if the layout element is equal to another layout element, false otherwise

Source code in src/momapy/core/elements.py
def equals(
    self, other: "LayoutElement", flattened: bool = False, unordered: bool = False
) -> bool:
    """Return `true` if the layout element is equal to another layout element, `false` otherwise"""
    if type(self) is type(other):
        if not flattened:
            return self == other
        else:
            if not unordered:
                return self.flattened() == other.flattened()
            else:
                return set(self.flattened()) == set(other.flattened())
    return False

flattened

flattened() -> list[LayoutElement]

Return a list containing copy of the layout element with no children and all its descendants with no children

Source code in src/momapy/core/elements.py
def flattened(self) -> list["LayoutElement"]:
    """Return a list containing copy of the layout element with no children and all its descendants with no children"""
    flattened = [self.childless()]
    for child in self.children():
        flattened += child.flattened()
    return flattened

fraction

fraction(fraction: float) -> tuple[Point, float]

Return the position and angle on the arc at a given fraction (of the total arc length)

Source code in src/momapy/core/layout.py
def fraction(self, fraction: float) -> tuple[momapy.geometry.Point, float]:
    """Return the position and angle on the arc at a given fraction (of the total arc length)"""
    current_length = 0
    length_to_reach = fraction * self.length()
    for segment in self.segments:
        current_length += segment.length()
        if current_length >= length_to_reach:
            break
    segment_start_length = current_length - segment.length()
    segment_fraction = (length_to_reach - segment_start_length) / segment.length()
    position, angle = segment.get_position_and_angle_at_fraction(segment_fraction)
    return position, angle

length

length()

Return the total length of the arc path

Source code in src/momapy/core/layout.py
def length(self):
    """Return the total length of the arc path"""
    return sum([segment.length() for segment in self.segments])

own_bbox

own_bbox() -> Bbox

Compute and return the bounding box of the self drawing element of the group layout

Source code in src/momapy/core/layout.py
def own_bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the self drawing element of the group layout"""
    primitives = self.own_to_geometry()
    if not primitives:
        return momapy.geometry.Bbox(momapy.geometry.Point(0, 0), 0, 0)
    bboxes = [p.bbox() for p in primitives]
    return momapy.geometry.Bbox.union(bboxes)

own_children

own_children() -> list[LayoutElement]

Return the self children of the arc

Source code in src/momapy/core/layout.py
def own_children(self) -> list[LayoutElement]:
    """Return the self children of the arc"""
    return []

own_drawing_elements

own_drawing_elements() -> list[DrawingElement]

Return the self drawing elements of the single-headed arc

Source code in src/momapy/core/layout.py
def own_drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the self drawing elements of the single-headed arc"""
    drawing_elements = (
        self.path_drawing_elements() + self.arrowhead_drawing_elements()
    )
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}_own",
        elements=tuple(drawing_elements),
        fill=self.fill,
        filter=self.filter,
        id_=f"{self.id_}_own",
        stroke=self.stroke,
        stroke_dasharray=self.stroke_dasharray,
        stroke_dashoffset=self.stroke_dashoffset,
        stroke_width=self.stroke_width,
        transform=self.transform,
    )
    return [group]

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

Source code in src/momapy/core/layout.py
def own_to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the self drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

path_drawing_elements

path_drawing_elements() -> list[Path]

Return the drawing elements of the single-headed arc path

Source code in src/momapy/core/layout.py
def path_drawing_elements(self) -> list[momapy.drawing.Path]:
    """Return the drawing elements of the single-headed arc path"""
    arrowhead_length = self.arrowhead_length()
    if len(self.segments) == 1:
        segment = (
            self.segments[0]
            .shortened(self.start_shorten, "start")
            .shortened(self.end_shorten + arrowhead_length, "end")
        )
        actions = [
            momapy.drawing.MoveTo(segment.p1),
            self._make_path_action_from_segment(segment),
        ]
    else:
        first_segment = self.segments[0].shortened(self.start_shorten, "start")
        last_segment = self.segments[-1].shortened(
            self.end_shorten + arrowhead_length, "end"
        )
        actions = [
            momapy.drawing.MoveTo(first_segment.p1),
            self._make_path_action_from_segment(first_segment),
        ]
        for segment in self.segments[1:-1]:
            action = self._make_path_action_from_segment(segment)
            actions.append(action)
        actions.append(self._make_path_action_from_segment(last_segment))
    path = momapy.drawing.Path(
        actions=tuple(actions),
        class_=f"{type(self).__name__}_path",
        fill=self.path_fill,
        filter=self.path_filter,
        id_=f"{self.id_}_path",
        stroke=self.path_stroke,
        stroke_dasharray=self.path_stroke_dasharray,
        stroke_dashoffset=self.path_stroke_dashoffset,
        stroke_width=self.path_stroke_width,
        transform=self.path_transform,
    )
    return [path]

points

points() -> list[Point]

Return the points of the arc path

Source code in src/momapy/core/layout.py
def points(self) -> list[momapy.geometry.Point]:
    """Return the points of the arc path"""
    points = []
    for segment in self.segments:
        points.append(segment.p1)
    points.append(segment.p2)
    return points

start_point

start_point() -> Point

Return the starting point of the arc

Source code in src/momapy/core/layout.py
def start_point(self) -> momapy.geometry.Point:
    """Return the starting point of the arc"""
    return self.points()[0]

to_geometry

Return a list of geometry primitives from the drawing elements.

Source code in src/momapy/core/elements.py
def to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

Influence dataclass

Influence(*, id_: str = make_uuid4_as_str(), source: BiologicalActivity | LogicalOperator, target: Activity)

Bases: SBGNModelElement

Influence between activities.

Represents an influence from a source activity to a target activity.

Attributes:

Name Type Description

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'efe6add0-eb6a-4947-815d-4c22374d02ae'
source BiologicalActivity | LogicalOperator
required
target Activity
required

Methods:

Name Description
descendants

Return every ModelElement reachable from self, excluding self.

descendants

descendants() -> list[ModelElement]

Return every ModelElement reachable from self, excluding self.

Walks scalar ModelElement fields and frozenset/tuple containers, deduplicating by object identity.

Returns:

Type Description
list[ModelElement]

The list of reachable ModelElement instances in visit

list[ModelElement]

order, without self.

Source code in src/momapy/core/elements.py
def descendants(self) -> list["ModelElement"]:
    """Return every `ModelElement` reachable from `self`, excluding `self`.

    Walks scalar `ModelElement` fields and `frozenset`/`tuple`
    containers, deduplicating by object identity.

    Returns:
        The list of reachable `ModelElement` instances in visit
        order, without `self`.
    """
    seen: set[int] = {id(self)}
    result: list[ModelElement] = []
    if dataclasses.is_dataclass(self):
        for field in dataclasses.fields(type(self)):
            _walk_model_graph(getattr(self, field.name), seen, result)
    return result

LogicArcLayout dataclass

LogicArcLayout(path_fill: NoneValueType | Color | None = NoneValue, path_stroke: NoneValueType | Color | None = black, path_stroke_width: float | None = 1.25, arrowhead_fill: NoneValueType | Color | None = white, arrowhead_stroke: NoneValueType | Color | None = black, arrowhead_stroke_width: float | None = 1.25, *, id_: str = make_uuid4_as_str(), layout_elements: tuple[LayoutElement] = tuple(), group_fill: NoneValueType | Color | None = None, group_fill_rule: FillRule | None = None, group_filter: NoneValueType | Filter | None = None, group_font_family: str | None = None, group_font_size: float | None = None, group_font_style: FontStyle | None = None, group_font_weight: FontWeight | float | None = None, group_stroke: NoneValueType | Color | None = None, group_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, group_stroke_dashoffset: NoneValueType | float | None = None, group_stroke_width: NoneValueType | float | None = None, group_text_anchor: TextAnchor | None = None, group_transform: NoneValueType | tuple[Transformation] | None = None, end_shorten: float = 0.0, fill: NoneValueType | Color | None = None, filter: NoneValueType | Filter | None = None, path_filter: NoneValueType | Filter | None = None, path_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, path_stroke_dashoffset: NoneValueType | float | None = None, path_transform: NoneValueType | tuple[Transformation] | None = None, stroke: NoneValueType | Color | None = None, stroke_dasharray: NoneValueType | tuple[float] | None = None, stroke_dashoffset: NoneValueType | float | None = None, stroke_width: NoneValueType | float | None = None, segments: tuple[Segment | QuadraticBezierCurve | CubicBezierCurve | EllipticalArc] = tuple(), source: LayoutElement | None = None, start_shorten: float = 0.0, target: LayoutElement | None = None, transform: NoneValueType | tuple[Transformation] | None = None, arrowhead_filter: NoneValueType | Filter | None = None, arrowhead_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, arrowhead_stroke_dashoffset: NoneValueType | float | None = None, arrowhead_transform: NoneValueType | tuple[Transformation] | None = None)

Bases: SBGNSingleHeadedArc

Layout for logic arcs.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'4a2c6a39-155b-4951-9d71-e9c4ed7ebb92'
layout_elements tuple[LayoutElement]

The sub-layout elements of the group layout. These are part of the children of the group layout

<dynamic>
group_fill NoneValueType | Color | None

The fill color of the group layout

None
group_fill_rule FillRule | None

The fill rule of the group layout

None
group_filter NoneValueType | Filter | None

The filter of the group layout

None
group_font_family str | None

The font family of the group layout

None
group_font_size float | None

The font size of the group layout

None
group_font_style FontStyle | None

The font style of the group layout

None
group_font_weight FontWeight | float | None

The font weight of the group layout

None
group_stroke NoneValueType | Color | None

The stroke color of the group layout

None
group_stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the group layout

None
group_stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the group layout

None
group_stroke_width NoneValueType | float | None

The stroke width of the group layout

None
group_text_anchor TextAnchor | None

The text anchor of the group layout

None
group_transform NoneValueType | tuple[Transformation] | None

The transform of the group layout

None
end_shorten float

The length the end of the arc will be shorten by

0.0
fill NoneValueType | Color | None

The fill color of the arc

None
filter NoneValueType | Filter | None

The fill filter of the arc

None
path_fill NoneValueType | Color | None

The path fill color of the arc

<momapy.drawing.NoneValueType object at 0x7fbe12e88d70>
path_filter NoneValueType | Filter | None

The path filter of the arc

None
path_stroke NoneValueType | Color | None

The path stroke color of the arc

Color(red=0, green=0, blue=0, alpha=1.0)
path_stroke_dasharray NoneValueType | tuple[float, ...] | None

The path stroke dasharray of the arc

None
path_stroke_dashoffset NoneValueType | float | None

The path stroke dashoffset of the arc

None
path_stroke_width float | None

The path stroke width of the arc

1.25
path_transform NoneValueType | tuple[Transformation] | None

The path transform of the arc

None
stroke NoneValueType | Color | None

The stroke color of the arc

None
stroke_dasharray NoneValueType | tuple[float] | None

The stroke dasharray of the arc

None
stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the arc

None
stroke_width NoneValueType | float | None

The stroke width of the arc

None
segments tuple[Segment | QuadraticBezierCurve | CubicBezierCurve | EllipticalArc]

The path segments of the arc

<dynamic>
source LayoutElement | None

The source of the arc

None
start_shorten float

The length the start of the arc will be shorten by

0.0
target LayoutElement | None

The target of the arc

None
transform NoneValueType | tuple[Transformation] | None

The transform of the arc

None
arrowhead_fill NoneValueType | Color | None

The arrowhead fill color of the arc

Color(red=255, green=255, blue=255, alpha=1.0)
arrowhead_filter NoneValueType | Filter | None

The arrowhead filter of the arc

None
arrowhead_stroke NoneValueType | Color | None

The arrowhead stroke color of the arc

Color(red=0, green=0, blue=0, alpha=1.0)
arrowhead_stroke_dasharray NoneValueType | tuple[float, ...] | None

The arrowhead stroke dasharray of the arc

None
arrowhead_stroke_dashoffset NoneValueType | float | None

The arrowhead stroke dashoffset of the arc

None
arrowhead_stroke_width float | None

The arrowhead stroke width of the arc

1.25
arrowhead_transform NoneValueType | tuple[Transformation] | None

The arrowhead transform of the arc

None

Methods:

Name Description
anchor_point

Return an anchor point of the layout element

arrowhead_base

Return the arrowhead base anchor point of the single-headed arc

arrowhead_bbox

Return the bounding box of the single-headed arc arrowhead

arrowhead_border

Return the point at the intersection of the drawing elements of the single-headed arc arrowhead and the line going through the center of these drawing elements and the given point.

arrowhead_drawing_elements

Return the drawing elements of the single-headed arc arrowhead

arrowhead_length

Return the length of the single-headed arc arrowhead

arrowhead_tip

Return the arrowhead tip anchor point of the single-headed arc

bbox

Compute and return the bounding box of the group layout element

childless

Return a copy of the arc with no children

children

Return the children of the group layout.

contains

Return true if another layout element is a descendant of the layout element, false otherwise

descendants

Return the descendants of the layout element

drawing_elements

Return the drawing elements of the group layout.

end_point

Return the ending point of the arc

equals

Return true if the layout element is equal to another layout element, false otherwise

flattened

Return a list containing copy of the layout element with no children and all its descendants with no children

fraction

Return the position and angle on the arc at a given fraction (of the total arc length)

length

Return the total length of the arc path

own_bbox

Compute and return the bounding box of the self drawing element of the group layout

own_children

Return the self children of the arc

own_drawing_elements

Return the self drawing elements of the single-headed arc

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

path_drawing_elements

Return the drawing elements of the single-headed arc path

points

Return the points of the arc path

start_point

Return the starting point of the arc

to_geometry

Return a list of geometry primitives from the drawing elements.

anchor_point

anchor_point(anchor_name: str) -> Point

Return an anchor point of the layout element

Source code in src/momapy/core/elements.py
def anchor_point(self, anchor_name: str) -> momapy.geometry.Point:
    """Return an anchor point of the layout element"""
    return getattr(self, anchor_name)()

arrowhead_base

arrowhead_base() -> Point

Return the arrowhead base anchor point of the single-headed arc

Source code in src/momapy/core/layout.py
def arrowhead_base(self) -> momapy.geometry.Point:
    """Return the arrowhead base anchor point of the single-headed arc"""
    arrowhead_length = self.arrowhead_length()
    segment = self.segments[-1]
    segment_length = segment.length()
    if segment_length == 0:
        return self.arrowhead_tip() - (arrowhead_length, 0)
    fraction = 1 - (arrowhead_length + self.end_shorten) / segment_length
    return segment.get_position_at_fraction(fraction)

arrowhead_bbox

arrowhead_bbox() -> Bbox

Return the bounding box of the single-headed arc arrowhead

Source code in src/momapy/core/layout.py
def arrowhead_bbox(self) -> momapy.geometry.Bbox:
    """Return the bounding box of the single-headed arc arrowhead"""
    return momapy.drawing.get_drawing_elements_bbox(
        self.arrowhead_drawing_elements()
    )

arrowhead_border

arrowhead_border(point) -> Point

Return the point at the intersection of the drawing elements of the single-headed arc arrowhead and the line going through the center of these drawing elements and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def arrowhead_border(self, point) -> momapy.geometry.Point:
    """Return the point at the intersection of the drawing elements of the single-headed arc arrowhead and the line going through the center of these drawing elements and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """

    point = momapy.drawing.get_drawing_elements_border(
        self.arrowhead_drawing_elements(), point
    )
    if point is None:
        return self.arrowhead_tip()
    return point

arrowhead_drawing_elements

arrowhead_drawing_elements() -> list[DrawingElement]

Return the drawing elements of the single-headed arc arrowhead

Source code in src/momapy/core/layout.py
def arrowhead_drawing_elements(
    self,
) -> list[momapy.drawing.DrawingElement]:
    """Return the drawing elements of the single-headed arc arrowhead"""
    drawing_elements = self._arrowhead_border_drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}_arrowhead",
        elements=tuple(drawing_elements),
        fill=self.arrowhead_fill,
        filter=self.arrowhead_filter,
        id_=f"{self.id_}_arrowhead",
        stroke=self.arrowhead_stroke,
        stroke_dasharray=self.arrowhead_stroke_dasharray,
        stroke_dashoffset=self.arrowhead_stroke_dashoffset,
        stroke_width=self.arrowhead_stroke_width,
        transform=self.arrowhead_transform,
    )
    transformation = self._get_arrowhead_transformation()
    group = group.transformed(transformation)
    return [group]

arrowhead_length

arrowhead_length() -> float

Return the length of the single-headed arc arrowhead

Source code in src/momapy/core/layout.py
def arrowhead_length(self) -> float:
    """Return the length of the single-headed arc arrowhead"""
    bbox = momapy.drawing.get_drawing_elements_bbox(
        self._arrowhead_border_drawing_elements()
    )
    if math.isnan(bbox.width):
        return 0.0
    return bbox.east().x

arrowhead_tip

arrowhead_tip() -> Point

Return the arrowhead tip anchor point of the single-headed arc

Source code in src/momapy/core/layout.py
def arrowhead_tip(self) -> momapy.geometry.Point:
    """Return the arrowhead tip anchor point of the single-headed arc"""
    segment = self.segments[-1]
    segment_length = segment.length()
    if segment_length == 0:
        return segment.p2
    fraction = 1 - self.end_shorten / segment_length
    return segment.get_position_at_fraction(fraction)

bbox

bbox() -> Bbox

Compute and return the bounding box of the group layout element

Source code in src/momapy/core/layout.py
def bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the group layout element"""
    own_bbox = self.own_bbox()
    bboxes = [child.bbox() for child in self.children()]
    min_x = own_bbox.north_west().x
    min_y = own_bbox.north_west().y
    max_x = own_bbox.south_east().x
    max_y = own_bbox.south_east().y
    for bbox in bboxes:
        if bbox.north_west().x < min_x:
            min_x = bbox.north_west().x
        if bbox.north_west().y < min_y:
            min_y = bbox.north_west().y
        if bbox.south_east().x > max_x:
            max_x = bbox.south_east().x
        if bbox.south_east().y > max_y:
            max_y = bbox.south_east().y
    bbox = momapy.geometry.Bbox(
        momapy.geometry.Point(min_x / 2 + max_x / 2, min_y / 2 + max_y / 2),
        max_x - min_x,
        max_y - min_y,
    )
    return bbox

childless

childless() -> Self

Return a copy of the arc with no children

Source code in src/momapy/core/layout.py
def childless(self) -> typing_extensions.Self:
    """Return a copy of the arc with no children"""
    return dataclasses.replace(self, layout_elements=tuple([]))

children

children() -> list[LayoutElement]

Return the children of the group layout. These are the self children of the group layout (returned by the own_children method) and the other children of the group layout (given by the layout_elements attribute)

Source code in src/momapy/core/layout.py
def children(self) -> list[LayoutElement]:
    """Return the children of the group layout.
    These are the self children of the group layout (returned by the `own_children` method) and the other children of the group layout (given by the `layout_elements` attribute)
    """
    return self.own_children() + list(self.layout_elements)

contains

contains(other: LayoutElement) -> bool

Return true if another layout element is a descendant of the layout element, false otherwise

Source code in src/momapy/core/elements.py
def contains(self, other: "LayoutElement") -> bool:
    """Return `true` if another layout element is a descendant of the layout element, `false` otherwise"""
    return other in self.descendants()

descendants

descendants() -> list[LayoutElement]

Return the descendants of the layout element

Source code in src/momapy/core/elements.py
def descendants(self) -> list["LayoutElement"]:
    """Return the descendants of the layout element"""
    descendants = []
    for child in self.children():
        descendants.append(child)
        descendants += child.descendants()
    return descendants

drawing_elements

drawing_elements() -> list[DrawingElement]

Return the drawing elements of the group layout. The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children

Source code in src/momapy/core/layout.py
def drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the drawing elements of the group layout.
    The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children
    """
    drawing_elements = self.own_drawing_elements()
    for child in self.children():
        if child is not None:
            drawing_elements += child.drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}",
        elements=tuple(drawing_elements),
        id_=f"{self.id_}",
        fill=self.group_fill,
        fill_rule=self.group_fill_rule,
        filter=self.group_filter,
        font_family=self.group_font_family,
        font_size=self.group_font_size,
        font_style=self.group_font_style,
        font_weight=self.group_font_weight,
        stroke=self.group_stroke,
        stroke_dasharray=self.group_stroke_dasharray,
        stroke_dashoffset=self.group_stroke_dashoffset,
        stroke_width=self.group_stroke_width,
        text_anchor=self.group_text_anchor,
        transform=self.group_transform,
    )
    return [group]

end_point

end_point() -> Point

Return the ending point of the arc

Source code in src/momapy/core/layout.py
def end_point(self) -> momapy.geometry.Point:
    """Return the ending point of the arc"""
    return self.points()[-1]

equals

equals(other: LayoutElement, flattened: bool = False, unordered: bool = False) -> bool

Return true if the layout element is equal to another layout element, false otherwise

Source code in src/momapy/core/elements.py
def equals(
    self, other: "LayoutElement", flattened: bool = False, unordered: bool = False
) -> bool:
    """Return `true` if the layout element is equal to another layout element, `false` otherwise"""
    if type(self) is type(other):
        if not flattened:
            return self == other
        else:
            if not unordered:
                return self.flattened() == other.flattened()
            else:
                return set(self.flattened()) == set(other.flattened())
    return False

flattened

flattened() -> list[LayoutElement]

Return a list containing copy of the layout element with no children and all its descendants with no children

Source code in src/momapy/core/elements.py
def flattened(self) -> list["LayoutElement"]:
    """Return a list containing copy of the layout element with no children and all its descendants with no children"""
    flattened = [self.childless()]
    for child in self.children():
        flattened += child.flattened()
    return flattened

fraction

fraction(fraction: float) -> tuple[Point, float]

Return the position and angle on the arc at a given fraction (of the total arc length)

Source code in src/momapy/core/layout.py
def fraction(self, fraction: float) -> tuple[momapy.geometry.Point, float]:
    """Return the position and angle on the arc at a given fraction (of the total arc length)"""
    current_length = 0
    length_to_reach = fraction * self.length()
    for segment in self.segments:
        current_length += segment.length()
        if current_length >= length_to_reach:
            break
    segment_start_length = current_length - segment.length()
    segment_fraction = (length_to_reach - segment_start_length) / segment.length()
    position, angle = segment.get_position_and_angle_at_fraction(segment_fraction)
    return position, angle

length

length()

Return the total length of the arc path

Source code in src/momapy/core/layout.py
def length(self):
    """Return the total length of the arc path"""
    return sum([segment.length() for segment in self.segments])

own_bbox

own_bbox() -> Bbox

Compute and return the bounding box of the self drawing element of the group layout

Source code in src/momapy/core/layout.py
def own_bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the self drawing element of the group layout"""
    primitives = self.own_to_geometry()
    if not primitives:
        return momapy.geometry.Bbox(momapy.geometry.Point(0, 0), 0, 0)
    bboxes = [p.bbox() for p in primitives]
    return momapy.geometry.Bbox.union(bboxes)

own_children

own_children() -> list[LayoutElement]

Return the self children of the arc

Source code in src/momapy/core/layout.py
def own_children(self) -> list[LayoutElement]:
    """Return the self children of the arc"""
    return []

own_drawing_elements

own_drawing_elements() -> list[DrawingElement]

Return the self drawing elements of the single-headed arc

Source code in src/momapy/core/layout.py
def own_drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the self drawing elements of the single-headed arc"""
    drawing_elements = (
        self.path_drawing_elements() + self.arrowhead_drawing_elements()
    )
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}_own",
        elements=tuple(drawing_elements),
        fill=self.fill,
        filter=self.filter,
        id_=f"{self.id_}_own",
        stroke=self.stroke,
        stroke_dasharray=self.stroke_dasharray,
        stroke_dashoffset=self.stroke_dashoffset,
        stroke_width=self.stroke_width,
        transform=self.transform,
    )
    return [group]

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

Source code in src/momapy/core/layout.py
def own_to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the self drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

path_drawing_elements

path_drawing_elements() -> list[Path]

Return the drawing elements of the single-headed arc path

Source code in src/momapy/core/layout.py
def path_drawing_elements(self) -> list[momapy.drawing.Path]:
    """Return the drawing elements of the single-headed arc path"""
    arrowhead_length = self.arrowhead_length()
    if len(self.segments) == 1:
        segment = (
            self.segments[0]
            .shortened(self.start_shorten, "start")
            .shortened(self.end_shorten + arrowhead_length, "end")
        )
        actions = [
            momapy.drawing.MoveTo(segment.p1),
            self._make_path_action_from_segment(segment),
        ]
    else:
        first_segment = self.segments[0].shortened(self.start_shorten, "start")
        last_segment = self.segments[-1].shortened(
            self.end_shorten + arrowhead_length, "end"
        )
        actions = [
            momapy.drawing.MoveTo(first_segment.p1),
            self._make_path_action_from_segment(first_segment),
        ]
        for segment in self.segments[1:-1]:
            action = self._make_path_action_from_segment(segment)
            actions.append(action)
        actions.append(self._make_path_action_from_segment(last_segment))
    path = momapy.drawing.Path(
        actions=tuple(actions),
        class_=f"{type(self).__name__}_path",
        fill=self.path_fill,
        filter=self.path_filter,
        id_=f"{self.id_}_path",
        stroke=self.path_stroke,
        stroke_dasharray=self.path_stroke_dasharray,
        stroke_dashoffset=self.path_stroke_dashoffset,
        stroke_width=self.path_stroke_width,
        transform=self.path_transform,
    )
    return [path]

points

points() -> list[Point]

Return the points of the arc path

Source code in src/momapy/core/layout.py
def points(self) -> list[momapy.geometry.Point]:
    """Return the points of the arc path"""
    points = []
    for segment in self.segments:
        points.append(segment.p1)
    points.append(segment.p2)
    return points

start_point

start_point() -> Point

Return the starting point of the arc

Source code in src/momapy/core/layout.py
def start_point(self) -> momapy.geometry.Point:
    """Return the starting point of the arc"""
    return self.points()[0]

to_geometry

Return a list of geometry primitives from the drawing elements.

Source code in src/momapy/core/elements.py
def to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

LogicalOperator dataclass

LogicalOperator(*, id_: str = make_uuid4_as_str(), inputs: frozenset[LogicalOperatorInput] = frozenset())

Bases: SBGNModelElement

Logical operator.

Represents logical operations (AND, OR, NOT, DELAY) on activities.

Attributes:

Name Type Description

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'38d10717-932e-4e00-9285-67326bc5f4ed'
inputs frozenset[LogicalOperatorInput]

Build an immutable unordered collection of unique elements.

<dynamic>

Methods:

Name Description
descendants

Return every ModelElement reachable from self, excluding self.

descendants

descendants() -> list[ModelElement]

Return every ModelElement reachable from self, excluding self.

Walks scalar ModelElement fields and frozenset/tuple containers, deduplicating by object identity.

Returns:

Type Description
list[ModelElement]

The list of reachable ModelElement instances in visit

list[ModelElement]

order, without self.

Source code in src/momapy/core/elements.py
def descendants(self) -> list["ModelElement"]:
    """Return every `ModelElement` reachable from `self`, excluding `self`.

    Walks scalar `ModelElement` fields and `frozenset`/`tuple`
    containers, deduplicating by object identity.

    Returns:
        The list of reachable `ModelElement` instances in visit
        order, without `self`.
    """
    seen: set[int] = {id(self)}
    result: list[ModelElement] = []
    if dataclasses.is_dataclass(self):
        for field in dataclasses.fields(type(self)):
            _walk_model_graph(getattr(self, field.name), seen, result)
    return result

LogicalOperatorInput dataclass

LogicalOperatorInput(*, id_: str = make_uuid4_as_str(), element: Union[BiologicalActivity, ForwardRef(LogicalOperator, module=modules[__name__])])

Bases: SBGNRole

Input to a logical operator.

Represents an input connection to a logical operator.

Attributes:

Name Type Description

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'45367176-bcf4-4ed8-86fc-edf93ff841c5'
element BiologicalActivity | ForwardRef
required

Methods:

Name Description
descendants

Return every ModelElement reachable from self, excluding self.

descendants

descendants() -> list[ModelElement]

Return every ModelElement reachable from self, excluding self.

Walks scalar ModelElement fields and frozenset/tuple containers, deduplicating by object identity.

Returns:

Type Description
list[ModelElement]

The list of reachable ModelElement instances in visit

list[ModelElement]

order, without self.

Source code in src/momapy/core/elements.py
def descendants(self) -> list["ModelElement"]:
    """Return every `ModelElement` reachable from `self`, excluding `self`.

    Walks scalar `ModelElement` fields and `frozenset`/`tuple`
    containers, deduplicating by object identity.

    Returns:
        The list of reachable `ModelElement` instances in visit
        order, without `self`.
    """
    seen: set[int] = {id(self)}
    result: list[ModelElement] = []
    if dataclasses.is_dataclass(self):
        for field in dataclasses.fields(type(self)):
            _walk_model_graph(getattr(self, field.name), seen, result)
    return result

MacromoleculeUnitOfInformation dataclass

MacromoleculeUnitOfInformation(*, id_: str = make_uuid4_as_str(), label: str | None = None)

Bases: UnitOfInformation

Unit of information typing a biological activity as a macromolecule.

Rendered as an SBGN macromolecule glyph embedded in the activity node.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'c0a37493-3d5d-468c-bf82-79aa80bd7273'
label str | None
None

Methods:

Name Description
descendants

Return every ModelElement reachable from self, excluding self.

descendants

descendants() -> list[ModelElement]

Return every ModelElement reachable from self, excluding self.

Walks scalar ModelElement fields and frozenset/tuple containers, deduplicating by object identity.

Returns:

Type Description
list[ModelElement]

The list of reachable ModelElement instances in visit

list[ModelElement]

order, without self.

Source code in src/momapy/core/elements.py
def descendants(self) -> list["ModelElement"]:
    """Return every `ModelElement` reachable from `self`, excluding `self`.

    Walks scalar `ModelElement` fields and `frozenset`/`tuple`
    containers, deduplicating by object identity.

    Returns:
        The list of reachable `ModelElement` instances in visit
        order, without `self`.
    """
    seen: set[int] = {id(self)}
    result: list[ModelElement] = []
    if dataclasses.is_dataclass(self):
        for field in dataclasses.fields(type(self)):
            _walk_model_graph(getattr(self, field.name), seen, result)
    return result

MacromoleculeUnitOfInformationLayout dataclass

MacromoleculeUnitOfInformationLayout(fill: NoneValueType | Color | None = white, stroke: NoneValueType | Color | None = black, stroke_width: float | None = 1.25, *, id_: str = make_uuid4_as_str(), layout_elements: tuple[LayoutElement] = tuple(), group_fill: NoneValueType | Color | None = None, group_fill_rule: FillRule | None = None, group_filter: NoneValueType | Filter | None = None, group_font_family: str | None = None, group_font_size: float | None = None, group_font_style: FontStyle | None = None, group_font_weight: FontWeight | float | None = None, group_stroke: NoneValueType | Color | None = None, group_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, group_stroke_dashoffset: NoneValueType | float | None = None, group_stroke_width: NoneValueType | float | None = None, group_text_anchor: TextAnchor | None = None, group_transform: NoneValueType | tuple[Transformation] | None = None, filter: NoneValueType | Filter | None = None, height: float = 12.0, label: TextLayout | None = None, position: Point, stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, stroke_dashoffset: NoneValueType | float | None = None, transform: NoneValueType | tuple[Transformation] | None = None, width: float = 12.0, rounded_corners: float = 5.0)

Bases: _SimpleMixin, SBGNNode

Layout for macromolecule units of information.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'e07134ba-6144-40b1-9509-1e6d0203ff5c'
layout_elements tuple[LayoutElement]

The sub-layout elements of the group layout. These are part of the children of the group layout

<dynamic>
group_fill NoneValueType | Color | None

The fill color of the group layout

None
group_fill_rule FillRule | None

The fill rule of the group layout

None
group_filter NoneValueType | Filter | None

The filter of the group layout

None
group_font_family str | None

The font family of the group layout

None
group_font_size float | None

The font size of the group layout

None
group_font_style FontStyle | None

The font style of the group layout

None
group_font_weight FontWeight | float | None

The font weight of the group layout

None
group_stroke NoneValueType | Color | None

The stroke color of the group layout

None
group_stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the group layout

None
group_stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the group layout

None
group_stroke_width NoneValueType | float | None

The stroke width of the group layout

None
group_text_anchor TextAnchor | None

The text anchor of the group layout

None
group_transform NoneValueType | tuple[Transformation] | None

The transform of the group layout

None
fill NoneValueType | Color | None

The fill color of the node

Color(red=255, green=255, blue=255, alpha=1.0)
filter NoneValueType | Filter | None

The filter of the node

None
height float

The height of the node

12.0
label TextLayout | None

The label of the node

None
position Point

The position of the node

required
stroke NoneValueType | Color | None

The stroke color of the node

Color(red=0, green=0, blue=0, alpha=1.0)
stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the node

None
stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the node

None
stroke_width float | None

The stroke width of the node

1.25
transform NoneValueType | tuple[Transformation] | None

The transform of the node

None
width float

The width width of the node

12.0
rounded_corners float
5.0

Methods:

Name Description
anchor_point

Return an anchor point of the layout element

angle

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

bbox

Compute and return the bounding box of the group layout element

border

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.

center

Return the center anchor of the node

childless

Return a copy of the node with no children

children

Return the children of the group layout.

contains

Return true if another layout element is a descendant of the layout element, false otherwise

descendants

Return the descendants of the layout element

drawing_elements

Return the drawing elements of the group layout.

east

Return the east anchor of the node

east_north_east

Return the east north east anchor of the node

east_south_east

Return the east south east west anchor of the node

equals

Return true if the layout element is equal to another layout element, false otherwise

flattened

Return a list containing copy of the layout element with no children and all its descendants with no children

label_center

Return the label center anchor of the node

north

Return the north anchor of the node

north_east

Return the north east anchor of the node

north_north_east

Return the north north east anchor of the node

north_north_west

Return the north north west anchor of the node

north_west

Return the north west anchor of the node

own_angle

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

own_bbox

Compute and return the bounding box of the self drawing element of the group layout

own_border

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.

own_children

Return the self children of the node. A node has unique child that is its label

own_drawing_elements

Return the node's own drawing elements

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

size

Return the size of the node

south

Return the south anchor of the node

south_east

Return the south east anchor of the node

south_south_east

Return the south south east anchor of the node

south_south_west

Return the south south west anchor of the node

south_west

Return the south west anchor of the node

to_geometry

Return a list of geometry primitives from the drawing elements.

west

Return the west anchor of the node

west_north_west

Return the west north west anchor of the node

west_south_west

Return the west south west anchor of the node

Attributes:

Name Type Description
x float

Return the x coordinate of the node

y float

Return the y coordinate of the node

anchor_point

anchor_point(anchor_name: str) -> Point

Return an anchor point of the layout element

Source code in src/momapy/core/elements.py
def anchor_point(self, anchor_name: str) -> momapy.geometry.Point:
    """Return an anchor point of the layout element"""
    return getattr(self, anchor_name)()

angle

angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

bbox

bbox() -> Bbox

Compute and return the bounding box of the group layout element

Source code in src/momapy/core/layout.py
def bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the group layout element"""
    own_bbox = self.own_bbox()
    bboxes = [child.bbox() for child in self.children()]
    min_x = own_bbox.north_west().x
    min_y = own_bbox.north_west().y
    max_x = own_bbox.south_east().x
    max_y = own_bbox.south_east().y
    for bbox in bboxes:
        if bbox.north_west().x < min_x:
            min_x = bbox.north_west().x
        if bbox.north_west().y < min_y:
            min_y = bbox.north_west().y
        if bbox.south_east().x > max_x:
            max_x = bbox.south_east().x
        if bbox.south_east().y > max_y:
            max_y = bbox.south_east().y
    bbox = momapy.geometry.Bbox(
        momapy.geometry.Point(min_x / 2 + max_x / 2, min_y / 2 + max_y / 2),
        max_x - min_x,
        max_y - min_y,
    )
    return bbox

border

border(point: Point) -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.drawing_elements(),
        point=point,
        center=self.center(),
    )

center

center() -> Point

Return the center anchor of the node

Source code in src/momapy/core/layout.py
def center(self) -> momapy.geometry.Point:
    """Return the center anchor of the node"""
    return self.position

childless

childless() -> Self

Return a copy of the node with no children

Source code in src/momapy/core/layout.py
def childless(self) -> typing_extensions.Self:
    """Return a copy of the node with no children"""
    return dataclasses.replace(self, label=None, layout_elements=tuple([]))

children

children() -> list[LayoutElement]

Return the children of the group layout. These are the self children of the group layout (returned by the own_children method) and the other children of the group layout (given by the layout_elements attribute)

Source code in src/momapy/core/layout.py
def children(self) -> list[LayoutElement]:
    """Return the children of the group layout.
    These are the self children of the group layout (returned by the `own_children` method) and the other children of the group layout (given by the `layout_elements` attribute)
    """
    return self.own_children() + list(self.layout_elements)

contains

contains(other: LayoutElement) -> bool

Return true if another layout element is a descendant of the layout element, false otherwise

Source code in src/momapy/core/elements.py
def contains(self, other: "LayoutElement") -> bool:
    """Return `true` if another layout element is a descendant of the layout element, `false` otherwise"""
    return other in self.descendants()

descendants

descendants() -> list[LayoutElement]

Return the descendants of the layout element

Source code in src/momapy/core/elements.py
def descendants(self) -> list["LayoutElement"]:
    """Return the descendants of the layout element"""
    descendants = []
    for child in self.children():
        descendants.append(child)
        descendants += child.descendants()
    return descendants

drawing_elements

drawing_elements() -> list[DrawingElement]

Return the drawing elements of the group layout. The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children

Source code in src/momapy/core/layout.py
def drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the drawing elements of the group layout.
    The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children
    """
    drawing_elements = self.own_drawing_elements()
    for child in self.children():
        if child is not None:
            drawing_elements += child.drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}",
        elements=tuple(drawing_elements),
        id_=f"{self.id_}",
        fill=self.group_fill,
        fill_rule=self.group_fill_rule,
        filter=self.group_filter,
        font_family=self.group_font_family,
        font_size=self.group_font_size,
        font_style=self.group_font_style,
        font_weight=self.group_font_weight,
        stroke=self.group_stroke,
        stroke_dasharray=self.group_stroke_dasharray,
        stroke_dashoffset=self.group_stroke_dashoffset,
        stroke_width=self.group_stroke_width,
        text_anchor=self.group_text_anchor,
        transform=self.group_transform,
    )
    return [group]

east

east() -> Point

Return the east anchor of the node

Source code in src/momapy/core/layout.py
def east(self) -> momapy.geometry.Point:
    """Return the east anchor of the node"""
    return self.own_angle(0)

east_north_east

east_north_east() -> Point

Return the east north east anchor of the node

Source code in src/momapy/core/layout.py
def east_north_east(self) -> momapy.geometry.Point:
    """Return the east north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

east_south_east

east_south_east() -> Point

Return the east south east west anchor of the node

Source code in src/momapy/core/layout.py
def east_south_east(self) -> momapy.geometry.Point:
    """Return the east south east west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

equals

equals(other: LayoutElement, flattened: bool = False, unordered: bool = False) -> bool

Return true if the layout element is equal to another layout element, false otherwise

Source code in src/momapy/core/elements.py
def equals(
    self, other: "LayoutElement", flattened: bool = False, unordered: bool = False
) -> bool:
    """Return `true` if the layout element is equal to another layout element, `false` otherwise"""
    if type(self) is type(other):
        if not flattened:
            return self == other
        else:
            if not unordered:
                return self.flattened() == other.flattened()
            else:
                return set(self.flattened()) == set(other.flattened())
    return False

flattened

flattened() -> list[LayoutElement]

Return a list containing copy of the layout element with no children and all its descendants with no children

Source code in src/momapy/core/elements.py
def flattened(self) -> list["LayoutElement"]:
    """Return a list containing copy of the layout element with no children and all its descendants with no children"""
    flattened = [self.childless()]
    for child in self.children():
        flattened += child.flattened()
    return flattened

label_center

label_center() -> Point

Return the label center anchor of the node

Source code in src/momapy/core/layout.py
def label_center(self) -> momapy.geometry.Point:
    """Return the label center anchor of the node"""
    return self.position

north

north() -> Point

Return the north anchor of the node

Source code in src/momapy/core/layout.py
def north(self) -> momapy.geometry.Point:
    """Return the north anchor of the node"""
    return self.own_angle(90)

north_east

north_east() -> Point

Return the north east anchor of the node

Source code in src/momapy/core/layout.py
def north_east(self) -> momapy.geometry.Point:
    """Return the north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_east

north_north_east() -> Point

Return the north north east anchor of the node

Source code in src/momapy/core/layout.py
def north_north_east(self) -> momapy.geometry.Point:
    """Return the north north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_west

north_north_west() -> Point

Return the north north west anchor of the node

Source code in src/momapy/core/layout.py
def north_north_west(self) -> momapy.geometry.Point:
    """Return the north north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_west

north_west() -> Point

Return the north west anchor of the node

Source code in src/momapy/core/layout.py
def north_west(self) -> momapy.geometry.Point:
    """Return the north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

own_angle

own_angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def own_angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.own_drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

own_bbox

own_bbox() -> Bbox

Compute and return the bounding box of the self drawing element of the group layout

Source code in src/momapy/core/layout.py
def own_bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the self drawing element of the group layout"""
    primitives = self.own_to_geometry()
    if not primitives:
        return momapy.geometry.Bbox(momapy.geometry.Point(0, 0), 0, 0)
    bboxes = [p.bbox() for p in primitives]
    return momapy.geometry.Bbox.union(bboxes)

own_border

own_border(point: Point) -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def own_border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.own_drawing_elements(),
        point=point,
        center=self.center(),
    )

own_children

own_children() -> list[LayoutElement]

Return the self children of the node. A node has unique child that is its label

Source code in src/momapy/core/layout.py
def own_children(self) -> list[LayoutElement]:
    """Return the self children of the node. A node has unique child that is its label"""
    if self.label is not None:
        return [self.label]
    return []

own_drawing_elements

own_drawing_elements() -> list[DrawingElement]

Return the node's own drawing elements

Source code in src/momapy/core/layout.py
def own_drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the node's own drawing elements"""
    drawing_elements = self._border_drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}_own",
        elements=tuple(drawing_elements),
        fill=self.fill,
        filter=self.filter,
        id_=f"{self.id_}_own",
        stroke=self.stroke,
        stroke_dasharray=self.stroke_dasharray,
        stroke_dashoffset=self.stroke_dashoffset,
        stroke_width=self.stroke_width,
        transform=self.transform,
    )
    return [group]

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

Source code in src/momapy/core/layout.py
def own_to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the self drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

size

size() -> tuple[float, float]

Return the size of the node

Source code in src/momapy/core/layout.py
def size(self) -> tuple[float, float]:
    """Return the size of the node"""
    return (self.width, self.height)

south

south() -> Point

Return the south anchor of the node

Source code in src/momapy/core/layout.py
def south(self) -> momapy.geometry.Point:
    """Return the south anchor of the node"""
    return self.own_angle(270)

south_east

south_east() -> Point

Return the south east anchor of the node

Source code in src/momapy/core/layout.py
def south_east(self) -> momapy.geometry.Point:
    """Return the south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_east

south_south_east() -> Point

Return the south south east anchor of the node

Source code in src/momapy/core/layout.py
def south_south_east(self) -> momapy.geometry.Point:
    """Return the south south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_west

south_south_west() -> Point

Return the south south west anchor of the node

Source code in src/momapy/core/layout.py
def south_south_west(self) -> momapy.geometry.Point:
    """Return the south south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_west

south_west() -> Point

Return the south west anchor of the node

Source code in src/momapy/core/layout.py
def south_west(self) -> momapy.geometry.Point:
    """Return the south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

to_geometry

Return a list of geometry primitives from the drawing elements.

Source code in src/momapy/core/elements.py
def to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

west

west() -> Point

Return the west anchor of the node

Source code in src/momapy/core/layout.py
def west(self) -> momapy.geometry.Point:
    """Return the west anchor of the node"""
    return self.own_angle(180)

west_north_west

west_north_west() -> Point

Return the west north west anchor of the node

Source code in src/momapy/core/layout.py
def west_north_west(self) -> momapy.geometry.Point:
    """Return the west north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

west_south_west

west_south_west() -> Point

Return the west south west anchor of the node

Source code in src/momapy/core/layout.py
def west_south_west(self) -> momapy.geometry.Point:
    """Return the west south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

x property

x: float

Return the x coordinate of the node

y property

y: float

Return the y coordinate of the node

NecessaryStimulation dataclass

NecessaryStimulation(*, id_: str = make_uuid4_as_str(), source: BiologicalActivity | LogicalOperator, target: Activity)

Bases: Influence

Necessary stimulation.

The target requires the source to be active; without it the target cannot be active.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'8daec6d4-486d-457b-82b7-44ac796efb79'
source BiologicalActivity | LogicalOperator
required
target Activity
required

Methods:

Name Description
descendants

Return every ModelElement reachable from self, excluding self.

descendants

descendants() -> list[ModelElement]

Return every ModelElement reachable from self, excluding self.

Walks scalar ModelElement fields and frozenset/tuple containers, deduplicating by object identity.

Returns:

Type Description
list[ModelElement]

The list of reachable ModelElement instances in visit

list[ModelElement]

order, without self.

Source code in src/momapy/core/elements.py
def descendants(self) -> list["ModelElement"]:
    """Return every `ModelElement` reachable from `self`, excluding `self`.

    Walks scalar `ModelElement` fields and `frozenset`/`tuple`
    containers, deduplicating by object identity.

    Returns:
        The list of reachable `ModelElement` instances in visit
        order, without `self`.
    """
    seen: set[int] = {id(self)}
    result: list[ModelElement] = []
    if dataclasses.is_dataclass(self):
        for field in dataclasses.fields(type(self)):
            _walk_model_graph(getattr(self, field.name), seen, result)
    return result

NecessaryStimulationLayout dataclass

NecessaryStimulationLayout(path_fill: NoneValueType | Color | None = NoneValue, path_stroke: NoneValueType | Color | None = black, path_stroke_width: float | None = 1.25, arrowhead_fill: NoneValueType | Color | None = white, arrowhead_stroke: NoneValueType | Color | None = black, arrowhead_stroke_width: float | None = 1.25, *, id_: str = make_uuid4_as_str(), layout_elements: tuple[LayoutElement] = tuple(), group_fill: NoneValueType | Color | None = None, group_fill_rule: FillRule | None = None, group_filter: NoneValueType | Filter | None = None, group_font_family: str | None = None, group_font_size: float | None = None, group_font_style: FontStyle | None = None, group_font_weight: FontWeight | float | None = None, group_stroke: NoneValueType | Color | None = None, group_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, group_stroke_dashoffset: NoneValueType | float | None = None, group_stroke_width: NoneValueType | float | None = None, group_text_anchor: TextAnchor | None = None, group_transform: NoneValueType | tuple[Transformation] | None = None, end_shorten: float = 0.0, fill: NoneValueType | Color | None = None, filter: NoneValueType | Filter | None = None, path_filter: NoneValueType | Filter | None = None, path_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, path_stroke_dashoffset: NoneValueType | float | None = None, path_transform: NoneValueType | tuple[Transformation] | None = None, stroke: NoneValueType | Color | None = None, stroke_dasharray: NoneValueType | tuple[float] | None = None, stroke_dashoffset: NoneValueType | float | None = None, stroke_width: NoneValueType | float | None = None, segments: tuple[Segment | QuadraticBezierCurve | CubicBezierCurve | EllipticalArc] = tuple(), source: LayoutElement | None = None, start_shorten: float = 0.0, target: LayoutElement | None = None, transform: NoneValueType | tuple[Transformation] | None = None, arrowhead_filter: NoneValueType | Filter | None = None, arrowhead_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, arrowhead_stroke_dashoffset: NoneValueType | float | None = None, arrowhead_transform: NoneValueType | tuple[Transformation] | None = None, arrowhead_bar_height: float = 12.0, arrowhead_sep: float = 3.0, arrowhead_triangle_height: float = 10.0, arrowhead_triangle_width: float = 10.0)

Bases: SBGNSingleHeadedArc

Layout for necessary stimulations.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'3cd21fce-fc3c-4b33-973f-f55e3650d70d'
layout_elements tuple[LayoutElement]

The sub-layout elements of the group layout. These are part of the children of the group layout

<dynamic>
group_fill NoneValueType | Color | None

The fill color of the group layout

None
group_fill_rule FillRule | None

The fill rule of the group layout

None
group_filter NoneValueType | Filter | None

The filter of the group layout

None
group_font_family str | None

The font family of the group layout

None
group_font_size float | None

The font size of the group layout

None
group_font_style FontStyle | None

The font style of the group layout

None
group_font_weight FontWeight | float | None

The font weight of the group layout

None
group_stroke NoneValueType | Color | None

The stroke color of the group layout

None
group_stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the group layout

None
group_stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the group layout

None
group_stroke_width NoneValueType | float | None

The stroke width of the group layout

None
group_text_anchor TextAnchor | None

The text anchor of the group layout

None
group_transform NoneValueType | tuple[Transformation] | None

The transform of the group layout

None
end_shorten float

The length the end of the arc will be shorten by

0.0
fill NoneValueType | Color | None

The fill color of the arc

None
filter NoneValueType | Filter | None

The fill filter of the arc

None
path_fill NoneValueType | Color | None

The path fill color of the arc

<momapy.drawing.NoneValueType object at 0x7fbe12e88d70>
path_filter NoneValueType | Filter | None

The path filter of the arc

None
path_stroke NoneValueType | Color | None

The path stroke color of the arc

Color(red=0, green=0, blue=0, alpha=1.0)
path_stroke_dasharray NoneValueType | tuple[float, ...] | None

The path stroke dasharray of the arc

None
path_stroke_dashoffset NoneValueType | float | None

The path stroke dashoffset of the arc

None
path_stroke_width float | None

The path stroke width of the arc

1.25
path_transform NoneValueType | tuple[Transformation] | None

The path transform of the arc

None
stroke NoneValueType | Color | None

The stroke color of the arc

None
stroke_dasharray NoneValueType | tuple[float] | None

The stroke dasharray of the arc

None
stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the arc

None
stroke_width NoneValueType | float | None

The stroke width of the arc

None
segments tuple[Segment | QuadraticBezierCurve | CubicBezierCurve | EllipticalArc]

The path segments of the arc

<dynamic>
source LayoutElement | None

The source of the arc

None
start_shorten float

The length the start of the arc will be shorten by

0.0
target LayoutElement | None

The target of the arc

None
transform NoneValueType | tuple[Transformation] | None

The transform of the arc

None
arrowhead_fill NoneValueType | Color | None

The arrowhead fill color of the arc

Color(red=255, green=255, blue=255, alpha=1.0)
arrowhead_filter NoneValueType | Filter | None

The arrowhead filter of the arc

None
arrowhead_stroke NoneValueType | Color | None

The arrowhead stroke color of the arc

Color(red=0, green=0, blue=0, alpha=1.0)
arrowhead_stroke_dasharray NoneValueType | tuple[float, ...] | None

The arrowhead stroke dasharray of the arc

None
arrowhead_stroke_dashoffset NoneValueType | float | None

The arrowhead stroke dashoffset of the arc

None
arrowhead_stroke_width float | None

The arrowhead stroke width of the arc

1.25
arrowhead_transform NoneValueType | tuple[Transformation] | None

The arrowhead transform of the arc

None
arrowhead_bar_height float
12.0
arrowhead_sep float
3.0
arrowhead_triangle_height float
10.0
arrowhead_triangle_width float
10.0

Methods:

Name Description
anchor_point

Return an anchor point of the layout element

arrowhead_base

Return the arrowhead base anchor point of the single-headed arc

arrowhead_bbox

Return the bounding box of the single-headed arc arrowhead

arrowhead_border

Return the point at the intersection of the drawing elements of the single-headed arc arrowhead and the line going through the center of these drawing elements and the given point.

arrowhead_drawing_elements

Return the drawing elements of the single-headed arc arrowhead

arrowhead_length

Return the length of the single-headed arc arrowhead

arrowhead_tip

Return the arrowhead tip anchor point of the single-headed arc

bbox

Compute and return the bounding box of the group layout element

childless

Return a copy of the arc with no children

children

Return the children of the group layout.

contains

Return true if another layout element is a descendant of the layout element, false otherwise

descendants

Return the descendants of the layout element

drawing_elements

Return the drawing elements of the group layout.

end_point

Return the ending point of the arc

equals

Return true if the layout element is equal to another layout element, false otherwise

flattened

Return a list containing copy of the layout element with no children and all its descendants with no children

fraction

Return the position and angle on the arc at a given fraction (of the total arc length)

length

Return the total length of the arc path

own_bbox

Compute and return the bounding box of the self drawing element of the group layout

own_children

Return the self children of the arc

own_drawing_elements

Return the self drawing elements of the single-headed arc

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

path_drawing_elements

Return the drawing elements of the single-headed arc path

points

Return the points of the arc path

start_point

Return the starting point of the arc

to_geometry

Return a list of geometry primitives from the drawing elements.

anchor_point

anchor_point(anchor_name: str) -> Point

Return an anchor point of the layout element

Source code in src/momapy/core/elements.py
def anchor_point(self, anchor_name: str) -> momapy.geometry.Point:
    """Return an anchor point of the layout element"""
    return getattr(self, anchor_name)()

arrowhead_base

arrowhead_base() -> Point

Return the arrowhead base anchor point of the single-headed arc

Source code in src/momapy/core/layout.py
def arrowhead_base(self) -> momapy.geometry.Point:
    """Return the arrowhead base anchor point of the single-headed arc"""
    arrowhead_length = self.arrowhead_length()
    segment = self.segments[-1]
    segment_length = segment.length()
    if segment_length == 0:
        return self.arrowhead_tip() - (arrowhead_length, 0)
    fraction = 1 - (arrowhead_length + self.end_shorten) / segment_length
    return segment.get_position_at_fraction(fraction)

arrowhead_bbox

arrowhead_bbox() -> Bbox

Return the bounding box of the single-headed arc arrowhead

Source code in src/momapy/core/layout.py
def arrowhead_bbox(self) -> momapy.geometry.Bbox:
    """Return the bounding box of the single-headed arc arrowhead"""
    return momapy.drawing.get_drawing_elements_bbox(
        self.arrowhead_drawing_elements()
    )

arrowhead_border

arrowhead_border(point) -> Point

Return the point at the intersection of the drawing elements of the single-headed arc arrowhead and the line going through the center of these drawing elements and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def arrowhead_border(self, point) -> momapy.geometry.Point:
    """Return the point at the intersection of the drawing elements of the single-headed arc arrowhead and the line going through the center of these drawing elements and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """

    point = momapy.drawing.get_drawing_elements_border(
        self.arrowhead_drawing_elements(), point
    )
    if point is None:
        return self.arrowhead_tip()
    return point

arrowhead_drawing_elements

arrowhead_drawing_elements() -> list[DrawingElement]

Return the drawing elements of the single-headed arc arrowhead

Source code in src/momapy/core/layout.py
def arrowhead_drawing_elements(
    self,
) -> list[momapy.drawing.DrawingElement]:
    """Return the drawing elements of the single-headed arc arrowhead"""
    drawing_elements = self._arrowhead_border_drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}_arrowhead",
        elements=tuple(drawing_elements),
        fill=self.arrowhead_fill,
        filter=self.arrowhead_filter,
        id_=f"{self.id_}_arrowhead",
        stroke=self.arrowhead_stroke,
        stroke_dasharray=self.arrowhead_stroke_dasharray,
        stroke_dashoffset=self.arrowhead_stroke_dashoffset,
        stroke_width=self.arrowhead_stroke_width,
        transform=self.arrowhead_transform,
    )
    transformation = self._get_arrowhead_transformation()
    group = group.transformed(transformation)
    return [group]

arrowhead_length

arrowhead_length() -> float

Return the length of the single-headed arc arrowhead

Source code in src/momapy/core/layout.py
def arrowhead_length(self) -> float:
    """Return the length of the single-headed arc arrowhead"""
    bbox = momapy.drawing.get_drawing_elements_bbox(
        self._arrowhead_border_drawing_elements()
    )
    if math.isnan(bbox.width):
        return 0.0
    return bbox.east().x

arrowhead_tip

arrowhead_tip() -> Point

Return the arrowhead tip anchor point of the single-headed arc

Source code in src/momapy/core/layout.py
def arrowhead_tip(self) -> momapy.geometry.Point:
    """Return the arrowhead tip anchor point of the single-headed arc"""
    segment = self.segments[-1]
    segment_length = segment.length()
    if segment_length == 0:
        return segment.p2
    fraction = 1 - self.end_shorten / segment_length
    return segment.get_position_at_fraction(fraction)

bbox

bbox() -> Bbox

Compute and return the bounding box of the group layout element

Source code in src/momapy/core/layout.py
def bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the group layout element"""
    own_bbox = self.own_bbox()
    bboxes = [child.bbox() for child in self.children()]
    min_x = own_bbox.north_west().x
    min_y = own_bbox.north_west().y
    max_x = own_bbox.south_east().x
    max_y = own_bbox.south_east().y
    for bbox in bboxes:
        if bbox.north_west().x < min_x:
            min_x = bbox.north_west().x
        if bbox.north_west().y < min_y:
            min_y = bbox.north_west().y
        if bbox.south_east().x > max_x:
            max_x = bbox.south_east().x
        if bbox.south_east().y > max_y:
            max_y = bbox.south_east().y
    bbox = momapy.geometry.Bbox(
        momapy.geometry.Point(min_x / 2 + max_x / 2, min_y / 2 + max_y / 2),
        max_x - min_x,
        max_y - min_y,
    )
    return bbox

childless

childless() -> Self

Return a copy of the arc with no children

Source code in src/momapy/core/layout.py
def childless(self) -> typing_extensions.Self:
    """Return a copy of the arc with no children"""
    return dataclasses.replace(self, layout_elements=tuple([]))

children

children() -> list[LayoutElement]

Return the children of the group layout. These are the self children of the group layout (returned by the own_children method) and the other children of the group layout (given by the layout_elements attribute)

Source code in src/momapy/core/layout.py
def children(self) -> list[LayoutElement]:
    """Return the children of the group layout.
    These are the self children of the group layout (returned by the `own_children` method) and the other children of the group layout (given by the `layout_elements` attribute)
    """
    return self.own_children() + list(self.layout_elements)

contains

contains(other: LayoutElement) -> bool

Return true if another layout element is a descendant of the layout element, false otherwise

Source code in src/momapy/core/elements.py
def contains(self, other: "LayoutElement") -> bool:
    """Return `true` if another layout element is a descendant of the layout element, `false` otherwise"""
    return other in self.descendants()

descendants

descendants() -> list[LayoutElement]

Return the descendants of the layout element

Source code in src/momapy/core/elements.py
def descendants(self) -> list["LayoutElement"]:
    """Return the descendants of the layout element"""
    descendants = []
    for child in self.children():
        descendants.append(child)
        descendants += child.descendants()
    return descendants

drawing_elements

drawing_elements() -> list[DrawingElement]

Return the drawing elements of the group layout. The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children

Source code in src/momapy/core/layout.py
def drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the drawing elements of the group layout.
    The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children
    """
    drawing_elements = self.own_drawing_elements()
    for child in self.children():
        if child is not None:
            drawing_elements += child.drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}",
        elements=tuple(drawing_elements),
        id_=f"{self.id_}",
        fill=self.group_fill,
        fill_rule=self.group_fill_rule,
        filter=self.group_filter,
        font_family=self.group_font_family,
        font_size=self.group_font_size,
        font_style=self.group_font_style,
        font_weight=self.group_font_weight,
        stroke=self.group_stroke,
        stroke_dasharray=self.group_stroke_dasharray,
        stroke_dashoffset=self.group_stroke_dashoffset,
        stroke_width=self.group_stroke_width,
        text_anchor=self.group_text_anchor,
        transform=self.group_transform,
    )
    return [group]

end_point

end_point() -> Point

Return the ending point of the arc

Source code in src/momapy/core/layout.py
def end_point(self) -> momapy.geometry.Point:
    """Return the ending point of the arc"""
    return self.points()[-1]

equals

equals(other: LayoutElement, flattened: bool = False, unordered: bool = False) -> bool

Return true if the layout element is equal to another layout element, false otherwise

Source code in src/momapy/core/elements.py
def equals(
    self, other: "LayoutElement", flattened: bool = False, unordered: bool = False
) -> bool:
    """Return `true` if the layout element is equal to another layout element, `false` otherwise"""
    if type(self) is type(other):
        if not flattened:
            return self == other
        else:
            if not unordered:
                return self.flattened() == other.flattened()
            else:
                return set(self.flattened()) == set(other.flattened())
    return False

flattened

flattened() -> list[LayoutElement]

Return a list containing copy of the layout element with no children and all its descendants with no children

Source code in src/momapy/core/elements.py
def flattened(self) -> list["LayoutElement"]:
    """Return a list containing copy of the layout element with no children and all its descendants with no children"""
    flattened = [self.childless()]
    for child in self.children():
        flattened += child.flattened()
    return flattened

fraction

fraction(fraction: float) -> tuple[Point, float]

Return the position and angle on the arc at a given fraction (of the total arc length)

Source code in src/momapy/core/layout.py
def fraction(self, fraction: float) -> tuple[momapy.geometry.Point, float]:
    """Return the position and angle on the arc at a given fraction (of the total arc length)"""
    current_length = 0
    length_to_reach = fraction * self.length()
    for segment in self.segments:
        current_length += segment.length()
        if current_length >= length_to_reach:
            break
    segment_start_length = current_length - segment.length()
    segment_fraction = (length_to_reach - segment_start_length) / segment.length()
    position, angle = segment.get_position_and_angle_at_fraction(segment_fraction)
    return position, angle

length

length()

Return the total length of the arc path

Source code in src/momapy/core/layout.py
def length(self):
    """Return the total length of the arc path"""
    return sum([segment.length() for segment in self.segments])

own_bbox

own_bbox() -> Bbox

Compute and return the bounding box of the self drawing element of the group layout

Source code in src/momapy/core/layout.py
def own_bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the self drawing element of the group layout"""
    primitives = self.own_to_geometry()
    if not primitives:
        return momapy.geometry.Bbox(momapy.geometry.Point(0, 0), 0, 0)
    bboxes = [p.bbox() for p in primitives]
    return momapy.geometry.Bbox.union(bboxes)

own_children

own_children() -> list[LayoutElement]

Return the self children of the arc

Source code in src/momapy/core/layout.py
def own_children(self) -> list[LayoutElement]:
    """Return the self children of the arc"""
    return []

own_drawing_elements

own_drawing_elements() -> list[DrawingElement]

Return the self drawing elements of the single-headed arc

Source code in src/momapy/core/layout.py
def own_drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the self drawing elements of the single-headed arc"""
    drawing_elements = (
        self.path_drawing_elements() + self.arrowhead_drawing_elements()
    )
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}_own",
        elements=tuple(drawing_elements),
        fill=self.fill,
        filter=self.filter,
        id_=f"{self.id_}_own",
        stroke=self.stroke,
        stroke_dasharray=self.stroke_dasharray,
        stroke_dashoffset=self.stroke_dashoffset,
        stroke_width=self.stroke_width,
        transform=self.transform,
    )
    return [group]

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

Source code in src/momapy/core/layout.py
def own_to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the self drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

path_drawing_elements

path_drawing_elements() -> list[Path]

Return the drawing elements of the single-headed arc path

Source code in src/momapy/core/layout.py
def path_drawing_elements(self) -> list[momapy.drawing.Path]:
    """Return the drawing elements of the single-headed arc path"""
    arrowhead_length = self.arrowhead_length()
    if len(self.segments) == 1:
        segment = (
            self.segments[0]
            .shortened(self.start_shorten, "start")
            .shortened(self.end_shorten + arrowhead_length, "end")
        )
        actions = [
            momapy.drawing.MoveTo(segment.p1),
            self._make_path_action_from_segment(segment),
        ]
    else:
        first_segment = self.segments[0].shortened(self.start_shorten, "start")
        last_segment = self.segments[-1].shortened(
            self.end_shorten + arrowhead_length, "end"
        )
        actions = [
            momapy.drawing.MoveTo(first_segment.p1),
            self._make_path_action_from_segment(first_segment),
        ]
        for segment in self.segments[1:-1]:
            action = self._make_path_action_from_segment(segment)
            actions.append(action)
        actions.append(self._make_path_action_from_segment(last_segment))
    path = momapy.drawing.Path(
        actions=tuple(actions),
        class_=f"{type(self).__name__}_path",
        fill=self.path_fill,
        filter=self.path_filter,
        id_=f"{self.id_}_path",
        stroke=self.path_stroke,
        stroke_dasharray=self.path_stroke_dasharray,
        stroke_dashoffset=self.path_stroke_dashoffset,
        stroke_width=self.path_stroke_width,
        transform=self.path_transform,
    )
    return [path]

points

points() -> list[Point]

Return the points of the arc path

Source code in src/momapy/core/layout.py
def points(self) -> list[momapy.geometry.Point]:
    """Return the points of the arc path"""
    points = []
    for segment in self.segments:
        points.append(segment.p1)
    points.append(segment.p2)
    return points

start_point

start_point() -> Point

Return the starting point of the arc

Source code in src/momapy/core/layout.py
def start_point(self) -> momapy.geometry.Point:
    """Return the starting point of the arc"""
    return self.points()[0]

to_geometry

Return a list of geometry primitives from the drawing elements.

Source code in src/momapy/core/elements.py
def to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

NegativeInfluence dataclass

NegativeInfluence(*, id_: str = make_uuid4_as_str(), source: BiologicalActivity | LogicalOperator, target: Activity)

Bases: Influence

Negative (inhibiting) influence.

The source decreases the activity of the target.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'996e3361-fcc1-4561-9b4b-1c45089a6079'
source BiologicalActivity | LogicalOperator
required
target Activity
required

Methods:

Name Description
descendants

Return every ModelElement reachable from self, excluding self.

descendants

descendants() -> list[ModelElement]

Return every ModelElement reachable from self, excluding self.

Walks scalar ModelElement fields and frozenset/tuple containers, deduplicating by object identity.

Returns:

Type Description
list[ModelElement]

The list of reachable ModelElement instances in visit

list[ModelElement]

order, without self.

Source code in src/momapy/core/elements.py
def descendants(self) -> list["ModelElement"]:
    """Return every `ModelElement` reachable from `self`, excluding `self`.

    Walks scalar `ModelElement` fields and `frozenset`/`tuple`
    containers, deduplicating by object identity.

    Returns:
        The list of reachable `ModelElement` instances in visit
        order, without `self`.
    """
    seen: set[int] = {id(self)}
    result: list[ModelElement] = []
    if dataclasses.is_dataclass(self):
        for field in dataclasses.fields(type(self)):
            _walk_model_graph(getattr(self, field.name), seen, result)
    return result

NegativeInfluenceLayout dataclass

NegativeInfluenceLayout(path_fill: NoneValueType | Color | None = NoneValue, path_stroke: NoneValueType | Color | None = black, path_stroke_width: float | None = 1.25, arrowhead_fill: NoneValueType | Color | None = white, arrowhead_stroke: NoneValueType | Color | None = black, arrowhead_stroke_width: float | None = 1.25, *, id_: str = make_uuid4_as_str(), layout_elements: tuple[LayoutElement] = tuple(), group_fill: NoneValueType | Color | None = None, group_fill_rule: FillRule | None = None, group_filter: NoneValueType | Filter | None = None, group_font_family: str | None = None, group_font_size: float | None = None, group_font_style: FontStyle | None = None, group_font_weight: FontWeight | float | None = None, group_stroke: NoneValueType | Color | None = None, group_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, group_stroke_dashoffset: NoneValueType | float | None = None, group_stroke_width: NoneValueType | float | None = None, group_text_anchor: TextAnchor | None = None, group_transform: NoneValueType | tuple[Transformation] | None = None, end_shorten: float = 0.0, fill: NoneValueType | Color | None = None, filter: NoneValueType | Filter | None = None, path_filter: NoneValueType | Filter | None = None, path_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, path_stroke_dashoffset: NoneValueType | float | None = None, path_transform: NoneValueType | tuple[Transformation] | None = None, stroke: NoneValueType | Color | None = None, stroke_dasharray: NoneValueType | tuple[float] | None = None, stroke_dashoffset: NoneValueType | float | None = None, stroke_width: NoneValueType | float | None = None, segments: tuple[Segment | QuadraticBezierCurve | CubicBezierCurve | EllipticalArc] = tuple(), source: LayoutElement | None = None, start_shorten: float = 0.0, target: LayoutElement | None = None, transform: NoneValueType | tuple[Transformation] | None = None, arrowhead_filter: NoneValueType | Filter | None = None, arrowhead_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, arrowhead_stroke_dashoffset: NoneValueType | float | None = None, arrowhead_transform: NoneValueType | tuple[Transformation] | None = None, arrowhead_height: float = 10.0)

Bases: SBGNSingleHeadedArc

Layout for negative influences.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'def0b7cb-0a27-491a-a54f-cf49ecfb797f'
layout_elements tuple[LayoutElement]

The sub-layout elements of the group layout. These are part of the children of the group layout

<dynamic>
group_fill NoneValueType | Color | None

The fill color of the group layout

None
group_fill_rule FillRule | None

The fill rule of the group layout

None
group_filter NoneValueType | Filter | None

The filter of the group layout

None
group_font_family str | None

The font family of the group layout

None
group_font_size float | None

The font size of the group layout

None
group_font_style FontStyle | None

The font style of the group layout

None
group_font_weight FontWeight | float | None

The font weight of the group layout

None
group_stroke NoneValueType | Color | None

The stroke color of the group layout

None
group_stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the group layout

None
group_stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the group layout

None
group_stroke_width NoneValueType | float | None

The stroke width of the group layout

None
group_text_anchor TextAnchor | None

The text anchor of the group layout

None
group_transform NoneValueType | tuple[Transformation] | None

The transform of the group layout

None
end_shorten float

The length the end of the arc will be shorten by

0.0
fill NoneValueType | Color | None

The fill color of the arc

None
filter NoneValueType | Filter | None

The fill filter of the arc

None
path_fill NoneValueType | Color | None

The path fill color of the arc

<momapy.drawing.NoneValueType object at 0x7fbe12e88d70>
path_filter NoneValueType | Filter | None

The path filter of the arc

None
path_stroke NoneValueType | Color | None

The path stroke color of the arc

Color(red=0, green=0, blue=0, alpha=1.0)
path_stroke_dasharray NoneValueType | tuple[float, ...] | None

The path stroke dasharray of the arc

None
path_stroke_dashoffset NoneValueType | float | None

The path stroke dashoffset of the arc

None
path_stroke_width float | None

The path stroke width of the arc

1.25
path_transform NoneValueType | tuple[Transformation] | None

The path transform of the arc

None
stroke NoneValueType | Color | None

The stroke color of the arc

None
stroke_dasharray NoneValueType | tuple[float] | None

The stroke dasharray of the arc

None
stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the arc

None
stroke_width NoneValueType | float | None

The stroke width of the arc

None
segments tuple[Segment | QuadraticBezierCurve | CubicBezierCurve | EllipticalArc]

The path segments of the arc

<dynamic>
source LayoutElement | None

The source of the arc

None
start_shorten float

The length the start of the arc will be shorten by

0.0
target LayoutElement | None

The target of the arc

None
transform NoneValueType | tuple[Transformation] | None

The transform of the arc

None
arrowhead_fill NoneValueType | Color | None

The arrowhead fill color of the arc

Color(red=255, green=255, blue=255, alpha=1.0)
arrowhead_filter NoneValueType | Filter | None

The arrowhead filter of the arc

None
arrowhead_stroke NoneValueType | Color | None

The arrowhead stroke color of the arc

Color(red=0, green=0, blue=0, alpha=1.0)
arrowhead_stroke_dasharray NoneValueType | tuple[float, ...] | None

The arrowhead stroke dasharray of the arc

None
arrowhead_stroke_dashoffset NoneValueType | float | None

The arrowhead stroke dashoffset of the arc

None
arrowhead_stroke_width float | None

The arrowhead stroke width of the arc

1.25
arrowhead_transform NoneValueType | tuple[Transformation] | None

The arrowhead transform of the arc

None
arrowhead_height float
10.0

Methods:

Name Description
anchor_point

Return an anchor point of the layout element

arrowhead_base

Return the arrowhead base anchor point of the single-headed arc

arrowhead_bbox

Return the bounding box of the single-headed arc arrowhead

arrowhead_border

Return the point at the intersection of the drawing elements of the single-headed arc arrowhead and the line going through the center of these drawing elements and the given point.

arrowhead_drawing_elements

Return the drawing elements of the single-headed arc arrowhead

arrowhead_length

Return the length of the single-headed arc arrowhead

arrowhead_tip

Return the arrowhead tip anchor point of the single-headed arc

bbox

Compute and return the bounding box of the group layout element

childless

Return a copy of the arc with no children

children

Return the children of the group layout.

contains

Return true if another layout element is a descendant of the layout element, false otherwise

descendants

Return the descendants of the layout element

drawing_elements

Return the drawing elements of the group layout.

end_point

Return the ending point of the arc

equals

Return true if the layout element is equal to another layout element, false otherwise

flattened

Return a list containing copy of the layout element with no children and all its descendants with no children

fraction

Return the position and angle on the arc at a given fraction (of the total arc length)

length

Return the total length of the arc path

own_bbox

Compute and return the bounding box of the self drawing element of the group layout

own_children

Return the self children of the arc

own_drawing_elements

Return the self drawing elements of the single-headed arc

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

path_drawing_elements

Return the drawing elements of the single-headed arc path

points

Return the points of the arc path

start_point

Return the starting point of the arc

to_geometry

Return a list of geometry primitives from the drawing elements.

anchor_point

anchor_point(anchor_name: str) -> Point

Return an anchor point of the layout element

Source code in src/momapy/core/elements.py
def anchor_point(self, anchor_name: str) -> momapy.geometry.Point:
    """Return an anchor point of the layout element"""
    return getattr(self, anchor_name)()

arrowhead_base

arrowhead_base() -> Point

Return the arrowhead base anchor point of the single-headed arc

Source code in src/momapy/core/layout.py
def arrowhead_base(self) -> momapy.geometry.Point:
    """Return the arrowhead base anchor point of the single-headed arc"""
    arrowhead_length = self.arrowhead_length()
    segment = self.segments[-1]
    segment_length = segment.length()
    if segment_length == 0:
        return self.arrowhead_tip() - (arrowhead_length, 0)
    fraction = 1 - (arrowhead_length + self.end_shorten) / segment_length
    return segment.get_position_at_fraction(fraction)

arrowhead_bbox

arrowhead_bbox() -> Bbox

Return the bounding box of the single-headed arc arrowhead

Source code in src/momapy/core/layout.py
def arrowhead_bbox(self) -> momapy.geometry.Bbox:
    """Return the bounding box of the single-headed arc arrowhead"""
    return momapy.drawing.get_drawing_elements_bbox(
        self.arrowhead_drawing_elements()
    )

arrowhead_border

arrowhead_border(point) -> Point

Return the point at the intersection of the drawing elements of the single-headed arc arrowhead and the line going through the center of these drawing elements and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def arrowhead_border(self, point) -> momapy.geometry.Point:
    """Return the point at the intersection of the drawing elements of the single-headed arc arrowhead and the line going through the center of these drawing elements and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """

    point = momapy.drawing.get_drawing_elements_border(
        self.arrowhead_drawing_elements(), point
    )
    if point is None:
        return self.arrowhead_tip()
    return point

arrowhead_drawing_elements

arrowhead_drawing_elements() -> list[DrawingElement]

Return the drawing elements of the single-headed arc arrowhead

Source code in src/momapy/core/layout.py
def arrowhead_drawing_elements(
    self,
) -> list[momapy.drawing.DrawingElement]:
    """Return the drawing elements of the single-headed arc arrowhead"""
    drawing_elements = self._arrowhead_border_drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}_arrowhead",
        elements=tuple(drawing_elements),
        fill=self.arrowhead_fill,
        filter=self.arrowhead_filter,
        id_=f"{self.id_}_arrowhead",
        stroke=self.arrowhead_stroke,
        stroke_dasharray=self.arrowhead_stroke_dasharray,
        stroke_dashoffset=self.arrowhead_stroke_dashoffset,
        stroke_width=self.arrowhead_stroke_width,
        transform=self.arrowhead_transform,
    )
    transformation = self._get_arrowhead_transformation()
    group = group.transformed(transformation)
    return [group]

arrowhead_length

arrowhead_length() -> float

Return the length of the single-headed arc arrowhead

Source code in src/momapy/core/layout.py
def arrowhead_length(self) -> float:
    """Return the length of the single-headed arc arrowhead"""
    bbox = momapy.drawing.get_drawing_elements_bbox(
        self._arrowhead_border_drawing_elements()
    )
    if math.isnan(bbox.width):
        return 0.0
    return bbox.east().x

arrowhead_tip

arrowhead_tip() -> Point

Return the arrowhead tip anchor point of the single-headed arc

Source code in src/momapy/core/layout.py
def arrowhead_tip(self) -> momapy.geometry.Point:
    """Return the arrowhead tip anchor point of the single-headed arc"""
    segment = self.segments[-1]
    segment_length = segment.length()
    if segment_length == 0:
        return segment.p2
    fraction = 1 - self.end_shorten / segment_length
    return segment.get_position_at_fraction(fraction)

bbox

bbox() -> Bbox

Compute and return the bounding box of the group layout element

Source code in src/momapy/core/layout.py
def bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the group layout element"""
    own_bbox = self.own_bbox()
    bboxes = [child.bbox() for child in self.children()]
    min_x = own_bbox.north_west().x
    min_y = own_bbox.north_west().y
    max_x = own_bbox.south_east().x
    max_y = own_bbox.south_east().y
    for bbox in bboxes:
        if bbox.north_west().x < min_x:
            min_x = bbox.north_west().x
        if bbox.north_west().y < min_y:
            min_y = bbox.north_west().y
        if bbox.south_east().x > max_x:
            max_x = bbox.south_east().x
        if bbox.south_east().y > max_y:
            max_y = bbox.south_east().y
    bbox = momapy.geometry.Bbox(
        momapy.geometry.Point(min_x / 2 + max_x / 2, min_y / 2 + max_y / 2),
        max_x - min_x,
        max_y - min_y,
    )
    return bbox

childless

childless() -> Self

Return a copy of the arc with no children

Source code in src/momapy/core/layout.py
def childless(self) -> typing_extensions.Self:
    """Return a copy of the arc with no children"""
    return dataclasses.replace(self, layout_elements=tuple([]))

children

children() -> list[LayoutElement]

Return the children of the group layout. These are the self children of the group layout (returned by the own_children method) and the other children of the group layout (given by the layout_elements attribute)

Source code in src/momapy/core/layout.py
def children(self) -> list[LayoutElement]:
    """Return the children of the group layout.
    These are the self children of the group layout (returned by the `own_children` method) and the other children of the group layout (given by the `layout_elements` attribute)
    """
    return self.own_children() + list(self.layout_elements)

contains

contains(other: LayoutElement) -> bool

Return true if another layout element is a descendant of the layout element, false otherwise

Source code in src/momapy/core/elements.py
def contains(self, other: "LayoutElement") -> bool:
    """Return `true` if another layout element is a descendant of the layout element, `false` otherwise"""
    return other in self.descendants()

descendants

descendants() -> list[LayoutElement]

Return the descendants of the layout element

Source code in src/momapy/core/elements.py
def descendants(self) -> list["LayoutElement"]:
    """Return the descendants of the layout element"""
    descendants = []
    for child in self.children():
        descendants.append(child)
        descendants += child.descendants()
    return descendants

drawing_elements

drawing_elements() -> list[DrawingElement]

Return the drawing elements of the group layout. The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children

Source code in src/momapy/core/layout.py
def drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the drawing elements of the group layout.
    The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children
    """
    drawing_elements = self.own_drawing_elements()
    for child in self.children():
        if child is not None:
            drawing_elements += child.drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}",
        elements=tuple(drawing_elements),
        id_=f"{self.id_}",
        fill=self.group_fill,
        fill_rule=self.group_fill_rule,
        filter=self.group_filter,
        font_family=self.group_font_family,
        font_size=self.group_font_size,
        font_style=self.group_font_style,
        font_weight=self.group_font_weight,
        stroke=self.group_stroke,
        stroke_dasharray=self.group_stroke_dasharray,
        stroke_dashoffset=self.group_stroke_dashoffset,
        stroke_width=self.group_stroke_width,
        text_anchor=self.group_text_anchor,
        transform=self.group_transform,
    )
    return [group]

end_point

end_point() -> Point

Return the ending point of the arc

Source code in src/momapy/core/layout.py
def end_point(self) -> momapy.geometry.Point:
    """Return the ending point of the arc"""
    return self.points()[-1]

equals

equals(other: LayoutElement, flattened: bool = False, unordered: bool = False) -> bool

Return true if the layout element is equal to another layout element, false otherwise

Source code in src/momapy/core/elements.py
def equals(
    self, other: "LayoutElement", flattened: bool = False, unordered: bool = False
) -> bool:
    """Return `true` if the layout element is equal to another layout element, `false` otherwise"""
    if type(self) is type(other):
        if not flattened:
            return self == other
        else:
            if not unordered:
                return self.flattened() == other.flattened()
            else:
                return set(self.flattened()) == set(other.flattened())
    return False

flattened

flattened() -> list[LayoutElement]

Return a list containing copy of the layout element with no children and all its descendants with no children

Source code in src/momapy/core/elements.py
def flattened(self) -> list["LayoutElement"]:
    """Return a list containing copy of the layout element with no children and all its descendants with no children"""
    flattened = [self.childless()]
    for child in self.children():
        flattened += child.flattened()
    return flattened

fraction

fraction(fraction: float) -> tuple[Point, float]

Return the position and angle on the arc at a given fraction (of the total arc length)

Source code in src/momapy/core/layout.py
def fraction(self, fraction: float) -> tuple[momapy.geometry.Point, float]:
    """Return the position and angle on the arc at a given fraction (of the total arc length)"""
    current_length = 0
    length_to_reach = fraction * self.length()
    for segment in self.segments:
        current_length += segment.length()
        if current_length >= length_to_reach:
            break
    segment_start_length = current_length - segment.length()
    segment_fraction = (length_to_reach - segment_start_length) / segment.length()
    position, angle = segment.get_position_and_angle_at_fraction(segment_fraction)
    return position, angle

length

length()

Return the total length of the arc path

Source code in src/momapy/core/layout.py
def length(self):
    """Return the total length of the arc path"""
    return sum([segment.length() for segment in self.segments])

own_bbox

own_bbox() -> Bbox

Compute and return the bounding box of the self drawing element of the group layout

Source code in src/momapy/core/layout.py
def own_bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the self drawing element of the group layout"""
    primitives = self.own_to_geometry()
    if not primitives:
        return momapy.geometry.Bbox(momapy.geometry.Point(0, 0), 0, 0)
    bboxes = [p.bbox() for p in primitives]
    return momapy.geometry.Bbox.union(bboxes)

own_children

own_children() -> list[LayoutElement]

Return the self children of the arc

Source code in src/momapy/core/layout.py
def own_children(self) -> list[LayoutElement]:
    """Return the self children of the arc"""
    return []

own_drawing_elements

own_drawing_elements() -> list[DrawingElement]

Return the self drawing elements of the single-headed arc

Source code in src/momapy/core/layout.py
def own_drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the self drawing elements of the single-headed arc"""
    drawing_elements = (
        self.path_drawing_elements() + self.arrowhead_drawing_elements()
    )
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}_own",
        elements=tuple(drawing_elements),
        fill=self.fill,
        filter=self.filter,
        id_=f"{self.id_}_own",
        stroke=self.stroke,
        stroke_dasharray=self.stroke_dasharray,
        stroke_dashoffset=self.stroke_dashoffset,
        stroke_width=self.stroke_width,
        transform=self.transform,
    )
    return [group]

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

Source code in src/momapy/core/layout.py
def own_to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the self drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

path_drawing_elements

path_drawing_elements() -> list[Path]

Return the drawing elements of the single-headed arc path

Source code in src/momapy/core/layout.py
def path_drawing_elements(self) -> list[momapy.drawing.Path]:
    """Return the drawing elements of the single-headed arc path"""
    arrowhead_length = self.arrowhead_length()
    if len(self.segments) == 1:
        segment = (
            self.segments[0]
            .shortened(self.start_shorten, "start")
            .shortened(self.end_shorten + arrowhead_length, "end")
        )
        actions = [
            momapy.drawing.MoveTo(segment.p1),
            self._make_path_action_from_segment(segment),
        ]
    else:
        first_segment = self.segments[0].shortened(self.start_shorten, "start")
        last_segment = self.segments[-1].shortened(
            self.end_shorten + arrowhead_length, "end"
        )
        actions = [
            momapy.drawing.MoveTo(first_segment.p1),
            self._make_path_action_from_segment(first_segment),
        ]
        for segment in self.segments[1:-1]:
            action = self._make_path_action_from_segment(segment)
            actions.append(action)
        actions.append(self._make_path_action_from_segment(last_segment))
    path = momapy.drawing.Path(
        actions=tuple(actions),
        class_=f"{type(self).__name__}_path",
        fill=self.path_fill,
        filter=self.path_filter,
        id_=f"{self.id_}_path",
        stroke=self.path_stroke,
        stroke_dasharray=self.path_stroke_dasharray,
        stroke_dashoffset=self.path_stroke_dashoffset,
        stroke_width=self.path_stroke_width,
        transform=self.path_transform,
    )
    return [path]

points

points() -> list[Point]

Return the points of the arc path

Source code in src/momapy/core/layout.py
def points(self) -> list[momapy.geometry.Point]:
    """Return the points of the arc path"""
    points = []
    for segment in self.segments:
        points.append(segment.p1)
    points.append(segment.p2)
    return points

start_point

start_point() -> Point

Return the starting point of the arc

Source code in src/momapy/core/layout.py
def start_point(self) -> momapy.geometry.Point:
    """Return the starting point of the arc"""
    return self.points()[0]

to_geometry

Return a list of geometry primitives from the drawing elements.

Source code in src/momapy/core/elements.py
def to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

NotOperator dataclass

NotOperator(*, id_: str = make_uuid4_as_str(), inputs: frozenset[LogicalOperatorInput] = frozenset())

Bases: LogicalOperator

Logical NOT operator.

The output is active when its (single) input is inactive.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'b50cac62-096e-47b8-a3b3-967e41d37e09'
inputs frozenset[LogicalOperatorInput]

Build an immutable unordered collection of unique elements.

<dynamic>

Methods:

Name Description
descendants

Return every ModelElement reachable from self, excluding self.

descendants

descendants() -> list[ModelElement]

Return every ModelElement reachable from self, excluding self.

Walks scalar ModelElement fields and frozenset/tuple containers, deduplicating by object identity.

Returns:

Type Description
list[ModelElement]

The list of reachable ModelElement instances in visit

list[ModelElement]

order, without self.

Source code in src/momapy/core/elements.py
def descendants(self) -> list["ModelElement"]:
    """Return every `ModelElement` reachable from `self`, excluding `self`.

    Walks scalar `ModelElement` fields and `frozenset`/`tuple`
    containers, deduplicating by object identity.

    Returns:
        The list of reachable `ModelElement` instances in visit
        order, without `self`.
    """
    seen: set[int] = {id(self)}
    result: list[ModelElement] = []
    if dataclasses.is_dataclass(self):
        for field in dataclasses.fields(type(self)):
            _walk_model_graph(getattr(self, field.name), seen, result)
    return result

NotOperatorLayout dataclass

NotOperatorLayout(fill: NoneValueType | Color | None = white, stroke: NoneValueType | Color | None = black, stroke_width: float | None = 1.25, *, id_: str = make_uuid4_as_str(), layout_elements: tuple[LayoutElement] = tuple(), group_fill: NoneValueType | Color | None = None, group_fill_rule: FillRule | None = None, group_filter: NoneValueType | Filter | None = None, group_font_family: str | None = None, group_font_size: float | None = None, group_font_style: FontStyle | None = None, group_font_weight: FontWeight | float | None = None, group_stroke: NoneValueType | Color | None = None, group_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, group_stroke_dashoffset: NoneValueType | float | None = None, group_stroke_width: NoneValueType | float | None = None, group_text_anchor: TextAnchor | None = None, group_transform: NoneValueType | tuple[Transformation] | None = None, filter: NoneValueType | Filter | None = None, height: float = 30.0, label: TextLayout | None = None, position: Point, stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, stroke_dashoffset: NoneValueType | float | None = None, transform: NoneValueType | tuple[Transformation] | None = None, width: float = 30.0, text: str = 'NOT', font_family: str = DEFAULT_FONT_FAMILY, font_fill: Color | NoneValueType = black, font_stroke: Color | NoneValueType = NoneValue, font_style: FontStyle = NORMAL, font_weight: FontWeight | float = NORMAL, direction: Direction = HORIZONTAL, left_to_right: bool = True, left_connector_length: float = 10.0, right_connector_length: float = 10.0, left_connector_stroke: NoneValueType | Color | None = None, left_connector_stroke_width: float | None = None, left_connector_stroke_dasharray: NoneValueType | tuple[float] | None = None, left_connector_stroke_dashoffset: float | None = None, left_connector_fill: NoneValueType | Color | None = None, left_connector_transform: NoneValueType | tuple[Transformation] | None = None, left_connector_filter: NoneValueType | Filter | None = None, right_connector_stroke: NoneValueType | Color | None = None, right_connector_stroke_width: float | None = None, right_connector_stroke_dasharray: NoneValueType | tuple[float] | None = None, right_connector_stroke_dashoffset: float | None = None, right_connector_fill: NoneValueType | Color | None = None, right_connector_transform: NoneValueType | tuple[Transformation] | None = None, right_connector_filter: NoneValueType | Filter | None = None)

Bases: _ConnectorsMixin, _SimpleMixin, _TextMixin, SBGNNode

Layout for NOT operators.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'2f595ac9-b605-4318-b692-8f5b02e65c81'
layout_elements tuple[LayoutElement]

The sub-layout elements of the group layout. These are part of the children of the group layout

<dynamic>
group_fill NoneValueType | Color | None

The fill color of the group layout

None
group_fill_rule FillRule | None

The fill rule of the group layout

None
group_filter NoneValueType | Filter | None

The filter of the group layout

None
group_font_family str | None

The font family of the group layout

None
group_font_size float | None

The font size of the group layout

None
group_font_style FontStyle | None

The font style of the group layout

None
group_font_weight FontWeight | float | None

The font weight of the group layout

None
group_stroke NoneValueType | Color | None

The stroke color of the group layout

None
group_stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the group layout

None
group_stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the group layout

None
group_stroke_width NoneValueType | float | None

The stroke width of the group layout

None
group_text_anchor TextAnchor | None

The text anchor of the group layout

None
group_transform NoneValueType | tuple[Transformation] | None

The transform of the group layout

None
fill NoneValueType | Color | None

The fill color of the node

Color(red=255, green=255, blue=255, alpha=1.0)
filter NoneValueType | Filter | None

The filter of the node

None
height float

The height of the node

30.0
label TextLayout | None

The label of the node

None
position Point

The position of the node

required
stroke NoneValueType | Color | None

The stroke color of the node

Color(red=0, green=0, blue=0, alpha=1.0)
stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the node

None
stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the node

None
stroke_width float | None

The stroke width of the node

1.25
transform NoneValueType | tuple[Transformation] | None

The transform of the node

None
width float

The width width of the node

30.0
text str
'NOT'
font_family str
'DejaVu Sans'
font_fill Color | NoneValueType
Color(red=0, green=0, blue=0, alpha=1.0)
font_stroke Color | NoneValueType
<momapy.drawing.NoneValueType object at 0x7fbe12e88d70>
font_style FontStyle
<FontStyle.NORMAL: 0>
font_weight FontWeight | float
<FontWeight.NORMAL: 0>
direction Direction
<Direction.HORIZONTAL: 1>
left_to_right bool
True
left_connector_length float
10.0
right_connector_length float
10.0
left_connector_stroke NoneValueType | Color | None
None
left_connector_stroke_width float | None
None
left_connector_stroke_dasharray NoneValueType | tuple[float] | None
None
left_connector_stroke_dashoffset float | None
None
left_connector_fill NoneValueType | Color | None
None
left_connector_transform NoneValueType | tuple[Transformation] | None
None
left_connector_filter NoneValueType | Filter | None
None
right_connector_stroke NoneValueType | Color | None
None
right_connector_stroke_width float | None
None
right_connector_stroke_dasharray NoneValueType | tuple[float] | None
None
right_connector_stroke_dashoffset float | None
None
right_connector_fill NoneValueType | Color | None
None
right_connector_transform NoneValueType | tuple[Transformation] | None
None
right_connector_filter NoneValueType | Filter | None
None

Methods:

Name Description
anchor_point

Return an anchor point of the layout element

angle

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

bbox

Compute and return the bounding box of the group layout element

border

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.

center

Return the center anchor of the node

childless

Return a copy of the node with no children

children

Return the children of the group layout.

contains

Return true if another layout element is a descendant of the layout element, false otherwise

descendants

Return the descendants of the layout element

drawing_elements

Return the drawing elements of the group layout.

east

Get the east (right) anchor point.

east_north_east

Return the east north east anchor of the node

east_south_east

Return the east south east west anchor of the node

equals

Return true if the layout element is equal to another layout element, false otherwise

flattened

Return a list containing copy of the layout element with no children and all its descendants with no children

label_center

Return the label center anchor of the node

left_connector_base

Get the base point of the left connector.

left_connector_tip

Get the tip point of the left connector.

north

Get the north (top) anchor point.

north_east

Return the north east anchor of the node

north_north_east

Return the north north east anchor of the node

north_north_west

Return the north north west anchor of the node

north_west

Return the north west anchor of the node

own_angle

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

own_bbox

Compute and return the bounding box of the self drawing element of the group layout

own_border

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.

own_children

Return the self children of the node. A node has unique child that is its label

own_drawing_elements

Return the node's own drawing elements

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

right_connector_base

Get the base point of the right connector.

right_connector_tip

Get the tip point of the right connector.

size

Return the size of the node

south

Get the south (bottom) anchor point.

south_east

Return the south east anchor of the node

south_south_east

Return the south south east anchor of the node

south_south_west

Return the south south west anchor of the node

south_west

Return the south west anchor of the node

to_geometry

Return a list of geometry primitives from the drawing elements.

west

Get the west (left) anchor point.

west_north_west

Return the west north west anchor of the node

west_south_west

Return the west south west anchor of the node

Attributes:

Name Type Description
x float

Return the x coordinate of the node

y float

Return the y coordinate of the node

anchor_point

anchor_point(anchor_name: str) -> Point

Return an anchor point of the layout element

Source code in src/momapy/core/elements.py
def anchor_point(self, anchor_name: str) -> momapy.geometry.Point:
    """Return an anchor point of the layout element"""
    return getattr(self, anchor_name)()

angle

angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

bbox

bbox() -> Bbox

Compute and return the bounding box of the group layout element

Source code in src/momapy/core/layout.py
def bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the group layout element"""
    own_bbox = self.own_bbox()
    bboxes = [child.bbox() for child in self.children()]
    min_x = own_bbox.north_west().x
    min_y = own_bbox.north_west().y
    max_x = own_bbox.south_east().x
    max_y = own_bbox.south_east().y
    for bbox in bboxes:
        if bbox.north_west().x < min_x:
            min_x = bbox.north_west().x
        if bbox.north_west().y < min_y:
            min_y = bbox.north_west().y
        if bbox.south_east().x > max_x:
            max_x = bbox.south_east().x
        if bbox.south_east().y > max_y:
            max_y = bbox.south_east().y
    bbox = momapy.geometry.Bbox(
        momapy.geometry.Point(min_x / 2 + max_x / 2, min_y / 2 + max_y / 2),
        max_x - min_x,
        max_y - min_y,
    )
    return bbox

border

border(point: Point) -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.drawing_elements(),
        point=point,
        center=self.center(),
    )

center

center() -> Point

Return the center anchor of the node

Source code in src/momapy/core/layout.py
def center(self) -> momapy.geometry.Point:
    """Return the center anchor of the node"""
    return self.position

childless

childless() -> Self

Return a copy of the node with no children

Source code in src/momapy/core/layout.py
def childless(self) -> typing_extensions.Self:
    """Return a copy of the node with no children"""
    return dataclasses.replace(self, label=None, layout_elements=tuple([]))

children

children() -> list[LayoutElement]

Return the children of the group layout. These are the self children of the group layout (returned by the own_children method) and the other children of the group layout (given by the layout_elements attribute)

Source code in src/momapy/core/layout.py
def children(self) -> list[LayoutElement]:
    """Return the children of the group layout.
    These are the self children of the group layout (returned by the `own_children` method) and the other children of the group layout (given by the `layout_elements` attribute)
    """
    return self.own_children() + list(self.layout_elements)

contains

contains(other: LayoutElement) -> bool

Return true if another layout element is a descendant of the layout element, false otherwise

Source code in src/momapy/core/elements.py
def contains(self, other: "LayoutElement") -> bool:
    """Return `true` if another layout element is a descendant of the layout element, `false` otherwise"""
    return other in self.descendants()

descendants

descendants() -> list[LayoutElement]

Return the descendants of the layout element

Source code in src/momapy/core/elements.py
def descendants(self) -> list["LayoutElement"]:
    """Return the descendants of the layout element"""
    descendants = []
    for child in self.children():
        descendants.append(child)
        descendants += child.descendants()
    return descendants

drawing_elements

drawing_elements() -> list[DrawingElement]

Return the drawing elements of the group layout. The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children

Source code in src/momapy/core/layout.py
def drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the drawing elements of the group layout.
    The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children
    """
    drawing_elements = self.own_drawing_elements()
    for child in self.children():
        if child is not None:
            drawing_elements += child.drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}",
        elements=tuple(drawing_elements),
        id_=f"{self.id_}",
        fill=self.group_fill,
        fill_rule=self.group_fill_rule,
        filter=self.group_filter,
        font_family=self.group_font_family,
        font_size=self.group_font_size,
        font_style=self.group_font_style,
        font_weight=self.group_font_weight,
        stroke=self.group_stroke,
        stroke_dasharray=self.group_stroke_dasharray,
        stroke_dashoffset=self.group_stroke_dashoffset,
        stroke_width=self.group_stroke_width,
        text_anchor=self.group_text_anchor,
        transform=self.group_transform,
    )
    return [group]

east

east() -> Point

Get the east (right) anchor point.

Returns:

Type Description
Point

Point on the east side of the element.

Source code in src/momapy/sbgn/elements.py
def east(self) -> momapy.geometry.Point:
    """Get the east (right) anchor point.

    Returns:
        Point on the east side of the element.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(self.x + self.width / 2, self.y)
    else:
        return momapy.geometry.Point(
            self.x + self.width / 2 + self.right_connector_length, self.y
        )

east_north_east

east_north_east() -> Point

Return the east north east anchor of the node

Source code in src/momapy/core/layout.py
def east_north_east(self) -> momapy.geometry.Point:
    """Return the east north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

east_south_east

east_south_east() -> Point

Return the east south east west anchor of the node

Source code in src/momapy/core/layout.py
def east_south_east(self) -> momapy.geometry.Point:
    """Return the east south east west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

equals

equals(other: LayoutElement, flattened: bool = False, unordered: bool = False) -> bool

Return true if the layout element is equal to another layout element, false otherwise

Source code in src/momapy/core/elements.py
def equals(
    self, other: "LayoutElement", flattened: bool = False, unordered: bool = False
) -> bool:
    """Return `true` if the layout element is equal to another layout element, `false` otherwise"""
    if type(self) is type(other):
        if not flattened:
            return self == other
        else:
            if not unordered:
                return self.flattened() == other.flattened()
            else:
                return set(self.flattened()) == set(other.flattened())
    return False

flattened

flattened() -> list[LayoutElement]

Return a list containing copy of the layout element with no children and all its descendants with no children

Source code in src/momapy/core/elements.py
def flattened(self) -> list["LayoutElement"]:
    """Return a list containing copy of the layout element with no children and all its descendants with no children"""
    flattened = [self.childless()]
    for child in self.children():
        flattened += child.flattened()
    return flattened

label_center

label_center() -> Point

Return the label center anchor of the node

Source code in src/momapy/core/layout.py
def label_center(self) -> momapy.geometry.Point:
    """Return the label center anchor of the node"""
    return self.position

left_connector_base

left_connector_base() -> Point

Get the base point of the left connector.

Returns:

Type Description
Point

Point where the left connector attaches to the shape.

Source code in src/momapy/sbgn/elements.py
def left_connector_base(self) -> momapy.geometry.Point:
    """Get the base point of the left connector.

    Returns:
        Point where the left connector attaches to the shape.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(self.x, self.y - self.height / 2)
    else:
        return momapy.geometry.Point(self.x - self.width / 2, self.y)

left_connector_tip

left_connector_tip() -> Point

Get the tip point of the left connector.

Returns:

Type Description
Point

Point at the end of the left connector line.

Source code in src/momapy/sbgn/elements.py
def left_connector_tip(self) -> momapy.geometry.Point:
    """Get the tip point of the left connector.

    Returns:
        Point at the end of the left connector line.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(
            self.x, self.y - self.height / 2 - self.left_connector_length
        )
    else:
        return momapy.geometry.Point(
            self.x - self.width / 2 - self.left_connector_length, self.y
        )

north

north() -> Point

Get the north (top) anchor point.

Returns:

Type Description
Point

Point on the north side of the element.

Source code in src/momapy/sbgn/elements.py
def north(self) -> momapy.geometry.Point:
    """Get the north (top) anchor point.

    Returns:
        Point on the north side of the element.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(
            self.x, self.y - self.height / 2 - self.left_connector_length
        )
    else:
        return momapy.geometry.Point(self.x, self.y - self.height / 2)

north_east

north_east() -> Point

Return the north east anchor of the node

Source code in src/momapy/core/layout.py
def north_east(self) -> momapy.geometry.Point:
    """Return the north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_east

north_north_east() -> Point

Return the north north east anchor of the node

Source code in src/momapy/core/layout.py
def north_north_east(self) -> momapy.geometry.Point:
    """Return the north north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_west

north_north_west() -> Point

Return the north north west anchor of the node

Source code in src/momapy/core/layout.py
def north_north_west(self) -> momapy.geometry.Point:
    """Return the north north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_west

north_west() -> Point

Return the north west anchor of the node

Source code in src/momapy/core/layout.py
def north_west(self) -> momapy.geometry.Point:
    """Return the north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

own_angle

own_angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def own_angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.own_drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

own_bbox

own_bbox() -> Bbox

Compute and return the bounding box of the self drawing element of the group layout

Source code in src/momapy/core/layout.py
def own_bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the self drawing element of the group layout"""
    primitives = self.own_to_geometry()
    if not primitives:
        return momapy.geometry.Bbox(momapy.geometry.Point(0, 0), 0, 0)
    bboxes = [p.bbox() for p in primitives]
    return momapy.geometry.Bbox.union(bboxes)

own_border

own_border(point: Point) -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def own_border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.own_drawing_elements(),
        point=point,
        center=self.center(),
    )

own_children

own_children() -> list[LayoutElement]

Return the self children of the node. A node has unique child that is its label

Source code in src/momapy/core/layout.py
def own_children(self) -> list[LayoutElement]:
    """Return the self children of the node. A node has unique child that is its label"""
    if self.label is not None:
        return [self.label]
    return []

own_drawing_elements

own_drawing_elements() -> list[DrawingElement]

Return the node's own drawing elements

Source code in src/momapy/core/layout.py
def own_drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the node's own drawing elements"""
    drawing_elements = self._border_drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}_own",
        elements=tuple(drawing_elements),
        fill=self.fill,
        filter=self.filter,
        id_=f"{self.id_}_own",
        stroke=self.stroke,
        stroke_dasharray=self.stroke_dasharray,
        stroke_dashoffset=self.stroke_dashoffset,
        stroke_width=self.stroke_width,
        transform=self.transform,
    )
    return [group]

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

Source code in src/momapy/core/layout.py
def own_to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the self drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

right_connector_base

right_connector_base() -> Point

Get the base point of the right connector.

Returns:

Type Description
Point

Point where the right connector attaches to the shape.

Source code in src/momapy/sbgn/elements.py
def right_connector_base(self) -> momapy.geometry.Point:
    """Get the base point of the right connector.

    Returns:
        Point where the right connector attaches to the shape.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(self.x, self.y + self.height / 2)
    else:
        return momapy.geometry.Point(self.x + self.width / 2, self.y)

right_connector_tip

right_connector_tip() -> Point

Get the tip point of the right connector.

Returns:

Type Description
Point

Point at the end of the right connector line.

Source code in src/momapy/sbgn/elements.py
def right_connector_tip(self) -> momapy.geometry.Point:
    """Get the tip point of the right connector.

    Returns:
        Point at the end of the right connector line.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(
            self.x, self.y + self.height / 2 + self.right_connector_length
        )
    else:
        return momapy.geometry.Point(
            self.x + self.width / 2 + self.right_connector_length, self.y
        )

size

size() -> tuple[float, float]

Return the size of the node

Source code in src/momapy/core/layout.py
def size(self) -> tuple[float, float]:
    """Return the size of the node"""
    return (self.width, self.height)

south

south() -> Point

Get the south (bottom) anchor point.

Returns:

Type Description
Point

Point on the south side of the element.

Source code in src/momapy/sbgn/elements.py
def south(self) -> momapy.geometry.Point:
    """Get the south (bottom) anchor point.

    Returns:
        Point on the south side of the element.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(
            self.x, self.y + self.height / 2 + self.right_connector_length
        )
    else:
        return momapy.geometry.Point(self.x, self.y + self.height / 2)

south_east

south_east() -> Point

Return the south east anchor of the node

Source code in src/momapy/core/layout.py
def south_east(self) -> momapy.geometry.Point:
    """Return the south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_east

south_south_east() -> Point

Return the south south east anchor of the node

Source code in src/momapy/core/layout.py
def south_south_east(self) -> momapy.geometry.Point:
    """Return the south south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_west

south_south_west() -> Point

Return the south south west anchor of the node

Source code in src/momapy/core/layout.py
def south_south_west(self) -> momapy.geometry.Point:
    """Return the south south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_west

south_west() -> Point

Return the south west anchor of the node

Source code in src/momapy/core/layout.py
def south_west(self) -> momapy.geometry.Point:
    """Return the south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

to_geometry

Return a list of geometry primitives from the drawing elements.

Source code in src/momapy/core/elements.py
def to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

west

west() -> Point

Get the west (left) anchor point.

Returns:

Type Description
Point

Point on the west side of the element.

Source code in src/momapy/sbgn/elements.py
def west(self) -> momapy.geometry.Point:
    """Get the west (left) anchor point.

    Returns:
        Point on the west side of the element.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(self.x - self.width / 2, self.y)
    else:
        return momapy.geometry.Point(
            self.x - self.width / 2 - self.left_connector_length, self.y
        )

west_north_west

west_north_west() -> Point

Return the west north west anchor of the node

Source code in src/momapy/core/layout.py
def west_north_west(self) -> momapy.geometry.Point:
    """Return the west north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

west_south_west

west_south_west() -> Point

Return the west south west anchor of the node

Source code in src/momapy/core/layout.py
def west_south_west(self) -> momapy.geometry.Point:
    """Return the west south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

x property

x: float

Return the x coordinate of the node

y property

y: float

Return the y coordinate of the node

NucleicAcidFeatureUnitOfInformation dataclass

NucleicAcidFeatureUnitOfInformation(*, id_: str = make_uuid4_as_str(), label: str | None = None)

Bases: UnitOfInformation

Unit of information typing a biological activity as a nucleic acid feature.

Rendered as an SBGN nucleic acid feature glyph embedded in the activity node.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'e7e03c2d-87c1-4818-886f-568993bc52ae'
label str | None
None

Methods:

Name Description
descendants

Return every ModelElement reachable from self, excluding self.

descendants

descendants() -> list[ModelElement]

Return every ModelElement reachable from self, excluding self.

Walks scalar ModelElement fields and frozenset/tuple containers, deduplicating by object identity.

Returns:

Type Description
list[ModelElement]

The list of reachable ModelElement instances in visit

list[ModelElement]

order, without self.

Source code in src/momapy/core/elements.py
def descendants(self) -> list["ModelElement"]:
    """Return every `ModelElement` reachable from `self`, excluding `self`.

    Walks scalar `ModelElement` fields and `frozenset`/`tuple`
    containers, deduplicating by object identity.

    Returns:
        The list of reachable `ModelElement` instances in visit
        order, without `self`.
    """
    seen: set[int] = {id(self)}
    result: list[ModelElement] = []
    if dataclasses.is_dataclass(self):
        for field in dataclasses.fields(type(self)):
            _walk_model_graph(getattr(self, field.name), seen, result)
    return result

NucleicAcidFeatureUnitOfInformationLayout dataclass

NucleicAcidFeatureUnitOfInformationLayout(fill: NoneValueType | Color | None = white, stroke: NoneValueType | Color | None = black, stroke_width: float | None = 1.25, *, id_: str = make_uuid4_as_str(), layout_elements: tuple[LayoutElement] = tuple(), group_fill: NoneValueType | Color | None = None, group_fill_rule: FillRule | None = None, group_filter: NoneValueType | Filter | None = None, group_font_family: str | None = None, group_font_size: float | None = None, group_font_style: FontStyle | None = None, group_font_weight: FontWeight | float | None = None, group_stroke: NoneValueType | Color | None = None, group_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, group_stroke_dashoffset: NoneValueType | float | None = None, group_stroke_width: NoneValueType | float | None = None, group_text_anchor: TextAnchor | None = None, group_transform: NoneValueType | tuple[Transformation] | None = None, filter: NoneValueType | Filter | None = None, height: float = 12.0, label: TextLayout | None = None, position: Point, stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, stroke_dashoffset: NoneValueType | float | None = None, transform: NoneValueType | tuple[Transformation] | None = None, width: float = 12.0, rounded_corners: float = 5.0)

Bases: _SimpleMixin, SBGNNode

Layout for nucleic acid feature units of information.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'a7f75974-ee1e-4c70-870f-66116ffacb0c'
layout_elements tuple[LayoutElement]

The sub-layout elements of the group layout. These are part of the children of the group layout

<dynamic>
group_fill NoneValueType | Color | None

The fill color of the group layout

None
group_fill_rule FillRule | None

The fill rule of the group layout

None
group_filter NoneValueType | Filter | None

The filter of the group layout

None
group_font_family str | None

The font family of the group layout

None
group_font_size float | None

The font size of the group layout

None
group_font_style FontStyle | None

The font style of the group layout

None
group_font_weight FontWeight | float | None

The font weight of the group layout

None
group_stroke NoneValueType | Color | None

The stroke color of the group layout

None
group_stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the group layout

None
group_stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the group layout

None
group_stroke_width NoneValueType | float | None

The stroke width of the group layout

None
group_text_anchor TextAnchor | None

The text anchor of the group layout

None
group_transform NoneValueType | tuple[Transformation] | None

The transform of the group layout

None
fill NoneValueType | Color | None

The fill color of the node

Color(red=255, green=255, blue=255, alpha=1.0)
filter NoneValueType | Filter | None

The filter of the node

None
height float

The height of the node

12.0
label TextLayout | None

The label of the node

None
position Point

The position of the node

required
stroke NoneValueType | Color | None

The stroke color of the node

Color(red=0, green=0, blue=0, alpha=1.0)
stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the node

None
stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the node

None
stroke_width float | None

The stroke width of the node

1.25
transform NoneValueType | tuple[Transformation] | None

The transform of the node

None
width float

The width width of the node

12.0
rounded_corners float
5.0

Methods:

Name Description
anchor_point

Return an anchor point of the layout element

angle

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

bbox

Compute and return the bounding box of the group layout element

border

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.

center

Return the center anchor of the node

childless

Return a copy of the node with no children

children

Return the children of the group layout.

contains

Return true if another layout element is a descendant of the layout element, false otherwise

descendants

Return the descendants of the layout element

drawing_elements

Return the drawing elements of the group layout.

east

Return the east anchor of the node

east_north_east

Return the east north east anchor of the node

east_south_east

Return the east south east west anchor of the node

equals

Return true if the layout element is equal to another layout element, false otherwise

flattened

Return a list containing copy of the layout element with no children and all its descendants with no children

label_center

Return the label center anchor of the node

north

Return the north anchor of the node

north_east

Return the north east anchor of the node

north_north_east

Return the north north east anchor of the node

north_north_west

Return the north north west anchor of the node

north_west

Return the north west anchor of the node

own_angle

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

own_bbox

Compute and return the bounding box of the self drawing element of the group layout

own_border

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.

own_children

Return the self children of the node. A node has unique child that is its label

own_drawing_elements

Return the node's own drawing elements

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

size

Return the size of the node

south

Return the south anchor of the node

south_east

Return the south east anchor of the node

south_south_east

Return the south south east anchor of the node

south_south_west

Return the south south west anchor of the node

south_west

Return the south west anchor of the node

to_geometry

Return a list of geometry primitives from the drawing elements.

west

Return the west anchor of the node

west_north_west

Return the west north west anchor of the node

west_south_west

Return the west south west anchor of the node

Attributes:

Name Type Description
x float

Return the x coordinate of the node

y float

Return the y coordinate of the node

anchor_point

anchor_point(anchor_name: str) -> Point

Return an anchor point of the layout element

Source code in src/momapy/core/elements.py
def anchor_point(self, anchor_name: str) -> momapy.geometry.Point:
    """Return an anchor point of the layout element"""
    return getattr(self, anchor_name)()

angle

angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

bbox

bbox() -> Bbox

Compute and return the bounding box of the group layout element

Source code in src/momapy/core/layout.py
def bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the group layout element"""
    own_bbox = self.own_bbox()
    bboxes = [child.bbox() for child in self.children()]
    min_x = own_bbox.north_west().x
    min_y = own_bbox.north_west().y
    max_x = own_bbox.south_east().x
    max_y = own_bbox.south_east().y
    for bbox in bboxes:
        if bbox.north_west().x < min_x:
            min_x = bbox.north_west().x
        if bbox.north_west().y < min_y:
            min_y = bbox.north_west().y
        if bbox.south_east().x > max_x:
            max_x = bbox.south_east().x
        if bbox.south_east().y > max_y:
            max_y = bbox.south_east().y
    bbox = momapy.geometry.Bbox(
        momapy.geometry.Point(min_x / 2 + max_x / 2, min_y / 2 + max_y / 2),
        max_x - min_x,
        max_y - min_y,
    )
    return bbox

border

border(point: Point) -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.drawing_elements(),
        point=point,
        center=self.center(),
    )

center

center() -> Point

Return the center anchor of the node

Source code in src/momapy/core/layout.py
def center(self) -> momapy.geometry.Point:
    """Return the center anchor of the node"""
    return self.position

childless

childless() -> Self

Return a copy of the node with no children

Source code in src/momapy/core/layout.py
def childless(self) -> typing_extensions.Self:
    """Return a copy of the node with no children"""
    return dataclasses.replace(self, label=None, layout_elements=tuple([]))

children

children() -> list[LayoutElement]

Return the children of the group layout. These are the self children of the group layout (returned by the own_children method) and the other children of the group layout (given by the layout_elements attribute)

Source code in src/momapy/core/layout.py
def children(self) -> list[LayoutElement]:
    """Return the children of the group layout.
    These are the self children of the group layout (returned by the `own_children` method) and the other children of the group layout (given by the `layout_elements` attribute)
    """
    return self.own_children() + list(self.layout_elements)

contains

contains(other: LayoutElement) -> bool

Return true if another layout element is a descendant of the layout element, false otherwise

Source code in src/momapy/core/elements.py
def contains(self, other: "LayoutElement") -> bool:
    """Return `true` if another layout element is a descendant of the layout element, `false` otherwise"""
    return other in self.descendants()

descendants

descendants() -> list[LayoutElement]

Return the descendants of the layout element

Source code in src/momapy/core/elements.py
def descendants(self) -> list["LayoutElement"]:
    """Return the descendants of the layout element"""
    descendants = []
    for child in self.children():
        descendants.append(child)
        descendants += child.descendants()
    return descendants

drawing_elements

drawing_elements() -> list[DrawingElement]

Return the drawing elements of the group layout. The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children

Source code in src/momapy/core/layout.py
def drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the drawing elements of the group layout.
    The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children
    """
    drawing_elements = self.own_drawing_elements()
    for child in self.children():
        if child is not None:
            drawing_elements += child.drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}",
        elements=tuple(drawing_elements),
        id_=f"{self.id_}",
        fill=self.group_fill,
        fill_rule=self.group_fill_rule,
        filter=self.group_filter,
        font_family=self.group_font_family,
        font_size=self.group_font_size,
        font_style=self.group_font_style,
        font_weight=self.group_font_weight,
        stroke=self.group_stroke,
        stroke_dasharray=self.group_stroke_dasharray,
        stroke_dashoffset=self.group_stroke_dashoffset,
        stroke_width=self.group_stroke_width,
        text_anchor=self.group_text_anchor,
        transform=self.group_transform,
    )
    return [group]

east

east() -> Point

Return the east anchor of the node

Source code in src/momapy/core/layout.py
def east(self) -> momapy.geometry.Point:
    """Return the east anchor of the node"""
    return self.own_angle(0)

east_north_east

east_north_east() -> Point

Return the east north east anchor of the node

Source code in src/momapy/core/layout.py
def east_north_east(self) -> momapy.geometry.Point:
    """Return the east north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

east_south_east

east_south_east() -> Point

Return the east south east west anchor of the node

Source code in src/momapy/core/layout.py
def east_south_east(self) -> momapy.geometry.Point:
    """Return the east south east west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

equals

equals(other: LayoutElement, flattened: bool = False, unordered: bool = False) -> bool

Return true if the layout element is equal to another layout element, false otherwise

Source code in src/momapy/core/elements.py
def equals(
    self, other: "LayoutElement", flattened: bool = False, unordered: bool = False
) -> bool:
    """Return `true` if the layout element is equal to another layout element, `false` otherwise"""
    if type(self) is type(other):
        if not flattened:
            return self == other
        else:
            if not unordered:
                return self.flattened() == other.flattened()
            else:
                return set(self.flattened()) == set(other.flattened())
    return False

flattened

flattened() -> list[LayoutElement]

Return a list containing copy of the layout element with no children and all its descendants with no children

Source code in src/momapy/core/elements.py
def flattened(self) -> list["LayoutElement"]:
    """Return a list containing copy of the layout element with no children and all its descendants with no children"""
    flattened = [self.childless()]
    for child in self.children():
        flattened += child.flattened()
    return flattened

label_center

label_center() -> Point

Return the label center anchor of the node

Source code in src/momapy/core/layout.py
def label_center(self) -> momapy.geometry.Point:
    """Return the label center anchor of the node"""
    return self.position

north

north() -> Point

Return the north anchor of the node

Source code in src/momapy/core/layout.py
def north(self) -> momapy.geometry.Point:
    """Return the north anchor of the node"""
    return self.own_angle(90)

north_east

north_east() -> Point

Return the north east anchor of the node

Source code in src/momapy/core/layout.py
def north_east(self) -> momapy.geometry.Point:
    """Return the north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_east

north_north_east() -> Point

Return the north north east anchor of the node

Source code in src/momapy/core/layout.py
def north_north_east(self) -> momapy.geometry.Point:
    """Return the north north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_west

north_north_west() -> Point

Return the north north west anchor of the node

Source code in src/momapy/core/layout.py
def north_north_west(self) -> momapy.geometry.Point:
    """Return the north north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_west

north_west() -> Point

Return the north west anchor of the node

Source code in src/momapy/core/layout.py
def north_west(self) -> momapy.geometry.Point:
    """Return the north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

own_angle

own_angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def own_angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.own_drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

own_bbox

own_bbox() -> Bbox

Compute and return the bounding box of the self drawing element of the group layout

Source code in src/momapy/core/layout.py
def own_bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the self drawing element of the group layout"""
    primitives = self.own_to_geometry()
    if not primitives:
        return momapy.geometry.Bbox(momapy.geometry.Point(0, 0), 0, 0)
    bboxes = [p.bbox() for p in primitives]
    return momapy.geometry.Bbox.union(bboxes)

own_border

own_border(point: Point) -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def own_border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.own_drawing_elements(),
        point=point,
        center=self.center(),
    )

own_children

own_children() -> list[LayoutElement]

Return the self children of the node. A node has unique child that is its label

Source code in src/momapy/core/layout.py
def own_children(self) -> list[LayoutElement]:
    """Return the self children of the node. A node has unique child that is its label"""
    if self.label is not None:
        return [self.label]
    return []

own_drawing_elements

own_drawing_elements() -> list[DrawingElement]

Return the node's own drawing elements

Source code in src/momapy/core/layout.py
def own_drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the node's own drawing elements"""
    drawing_elements = self._border_drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}_own",
        elements=tuple(drawing_elements),
        fill=self.fill,
        filter=self.filter,
        id_=f"{self.id_}_own",
        stroke=self.stroke,
        stroke_dasharray=self.stroke_dasharray,
        stroke_dashoffset=self.stroke_dashoffset,
        stroke_width=self.stroke_width,
        transform=self.transform,
    )
    return [group]

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

Source code in src/momapy/core/layout.py
def own_to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the self drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

size

size() -> tuple[float, float]

Return the size of the node

Source code in src/momapy/core/layout.py
def size(self) -> tuple[float, float]:
    """Return the size of the node"""
    return (self.width, self.height)

south

south() -> Point

Return the south anchor of the node

Source code in src/momapy/core/layout.py
def south(self) -> momapy.geometry.Point:
    """Return the south anchor of the node"""
    return self.own_angle(270)

south_east

south_east() -> Point

Return the south east anchor of the node

Source code in src/momapy/core/layout.py
def south_east(self) -> momapy.geometry.Point:
    """Return the south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_east

south_south_east() -> Point

Return the south south east anchor of the node

Source code in src/momapy/core/layout.py
def south_south_east(self) -> momapy.geometry.Point:
    """Return the south south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_west

south_south_west() -> Point

Return the south south west anchor of the node

Source code in src/momapy/core/layout.py
def south_south_west(self) -> momapy.geometry.Point:
    """Return the south south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_west

south_west() -> Point

Return the south west anchor of the node

Source code in src/momapy/core/layout.py
def south_west(self) -> momapy.geometry.Point:
    """Return the south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

to_geometry

Return a list of geometry primitives from the drawing elements.

Source code in src/momapy/core/elements.py
def to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

west

west() -> Point

Return the west anchor of the node

Source code in src/momapy/core/layout.py
def west(self) -> momapy.geometry.Point:
    """Return the west anchor of the node"""
    return self.own_angle(180)

west_north_west

west_north_west() -> Point

Return the west north west anchor of the node

Source code in src/momapy/core/layout.py
def west_north_west(self) -> momapy.geometry.Point:
    """Return the west north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

west_south_west

west_south_west() -> Point

Return the west south west anchor of the node

Source code in src/momapy/core/layout.py
def west_south_west(self) -> momapy.geometry.Point:
    """Return the west south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

x property

x: float

Return the x coordinate of the node

y property

y: float

Return the y coordinate of the node

OrOperator dataclass

OrOperator(*, id_: str = make_uuid4_as_str(), inputs: frozenset[LogicalOperatorInput] = frozenset())

Bases: LogicalOperator

Logical OR operator.

The output is active when at least one input is active.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'3584b3c6-1bd6-45df-87d6-1d802f2b2e68'
inputs frozenset[LogicalOperatorInput]

Build an immutable unordered collection of unique elements.

<dynamic>

Methods:

Name Description
descendants

Return every ModelElement reachable from self, excluding self.

descendants

descendants() -> list[ModelElement]

Return every ModelElement reachable from self, excluding self.

Walks scalar ModelElement fields and frozenset/tuple containers, deduplicating by object identity.

Returns:

Type Description
list[ModelElement]

The list of reachable ModelElement instances in visit

list[ModelElement]

order, without self.

Source code in src/momapy/core/elements.py
def descendants(self) -> list["ModelElement"]:
    """Return every `ModelElement` reachable from `self`, excluding `self`.

    Walks scalar `ModelElement` fields and `frozenset`/`tuple`
    containers, deduplicating by object identity.

    Returns:
        The list of reachable `ModelElement` instances in visit
        order, without `self`.
    """
    seen: set[int] = {id(self)}
    result: list[ModelElement] = []
    if dataclasses.is_dataclass(self):
        for field in dataclasses.fields(type(self)):
            _walk_model_graph(getattr(self, field.name), seen, result)
    return result

OrOperatorLayout dataclass

OrOperatorLayout(fill: NoneValueType | Color | None = white, stroke: NoneValueType | Color | None = black, stroke_width: float | None = 1.25, *, id_: str = make_uuid4_as_str(), layout_elements: tuple[LayoutElement] = tuple(), group_fill: NoneValueType | Color | None = None, group_fill_rule: FillRule | None = None, group_filter: NoneValueType | Filter | None = None, group_font_family: str | None = None, group_font_size: float | None = None, group_font_style: FontStyle | None = None, group_font_weight: FontWeight | float | None = None, group_stroke: NoneValueType | Color | None = None, group_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, group_stroke_dashoffset: NoneValueType | float | None = None, group_stroke_width: NoneValueType | float | None = None, group_text_anchor: TextAnchor | None = None, group_transform: NoneValueType | tuple[Transformation] | None = None, filter: NoneValueType | Filter | None = None, height: float = 30.0, label: TextLayout | None = None, position: Point, stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, stroke_dashoffset: NoneValueType | float | None = None, transform: NoneValueType | tuple[Transformation] | None = None, width: float = 30.0, text: str = 'OR', font_family: str = DEFAULT_FONT_FAMILY, font_fill: Color | NoneValueType = black, font_stroke: Color | NoneValueType = NoneValue, font_style: FontStyle = NORMAL, font_weight: FontWeight | float = NORMAL, direction: Direction = HORIZONTAL, left_to_right: bool = True, left_connector_length: float = 10.0, right_connector_length: float = 10.0, left_connector_stroke: NoneValueType | Color | None = None, left_connector_stroke_width: float | None = None, left_connector_stroke_dasharray: NoneValueType | tuple[float] | None = None, left_connector_stroke_dashoffset: float | None = None, left_connector_fill: NoneValueType | Color | None = None, left_connector_transform: NoneValueType | tuple[Transformation] | None = None, left_connector_filter: NoneValueType | Filter | None = None, right_connector_stroke: NoneValueType | Color | None = None, right_connector_stroke_width: float | None = None, right_connector_stroke_dasharray: NoneValueType | tuple[float] | None = None, right_connector_stroke_dashoffset: float | None = None, right_connector_fill: NoneValueType | Color | None = None, right_connector_transform: NoneValueType | tuple[Transformation] | None = None, right_connector_filter: NoneValueType | Filter | None = None)

Bases: _ConnectorsMixin, _SimpleMixin, _TextMixin, SBGNNode

Layout for OR operators.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'88adf88a-40e8-46b1-b217-209ce2b794af'
layout_elements tuple[LayoutElement]

The sub-layout elements of the group layout. These are part of the children of the group layout

<dynamic>
group_fill NoneValueType | Color | None

The fill color of the group layout

None
group_fill_rule FillRule | None

The fill rule of the group layout

None
group_filter NoneValueType | Filter | None

The filter of the group layout

None
group_font_family str | None

The font family of the group layout

None
group_font_size float | None

The font size of the group layout

None
group_font_style FontStyle | None

The font style of the group layout

None
group_font_weight FontWeight | float | None

The font weight of the group layout

None
group_stroke NoneValueType | Color | None

The stroke color of the group layout

None
group_stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the group layout

None
group_stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the group layout

None
group_stroke_width NoneValueType | float | None

The stroke width of the group layout

None
group_text_anchor TextAnchor | None

The text anchor of the group layout

None
group_transform NoneValueType | tuple[Transformation] | None

The transform of the group layout

None
fill NoneValueType | Color | None

The fill color of the node

Color(red=255, green=255, blue=255, alpha=1.0)
filter NoneValueType | Filter | None

The filter of the node

None
height float

The height of the node

30.0
label TextLayout | None

The label of the node

None
position Point

The position of the node

required
stroke NoneValueType | Color | None

The stroke color of the node

Color(red=0, green=0, blue=0, alpha=1.0)
stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the node

None
stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the node

None
stroke_width float | None

The stroke width of the node

1.25
transform NoneValueType | tuple[Transformation] | None

The transform of the node

None
width float

The width width of the node

30.0
text str
'OR'
font_family str
'DejaVu Sans'
font_fill Color | NoneValueType
Color(red=0, green=0, blue=0, alpha=1.0)
font_stroke Color | NoneValueType
<momapy.drawing.NoneValueType object at 0x7fbe12e88d70>
font_style FontStyle
<FontStyle.NORMAL: 0>
font_weight FontWeight | float
<FontWeight.NORMAL: 0>
direction Direction
<Direction.HORIZONTAL: 1>
left_to_right bool
True
left_connector_length float
10.0
right_connector_length float
10.0
left_connector_stroke NoneValueType | Color | None
None
left_connector_stroke_width float | None
None
left_connector_stroke_dasharray NoneValueType | tuple[float] | None
None
left_connector_stroke_dashoffset float | None
None
left_connector_fill NoneValueType | Color | None
None
left_connector_transform NoneValueType | tuple[Transformation] | None
None
left_connector_filter NoneValueType | Filter | None
None
right_connector_stroke NoneValueType | Color | None
None
right_connector_stroke_width float | None
None
right_connector_stroke_dasharray NoneValueType | tuple[float] | None
None
right_connector_stroke_dashoffset float | None
None
right_connector_fill NoneValueType | Color | None
None
right_connector_transform NoneValueType | tuple[Transformation] | None
None
right_connector_filter NoneValueType | Filter | None
None

Methods:

Name Description
anchor_point

Return an anchor point of the layout element

angle

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

bbox

Compute and return the bounding box of the group layout element

border

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.

center

Return the center anchor of the node

childless

Return a copy of the node with no children

children

Return the children of the group layout.

contains

Return true if another layout element is a descendant of the layout element, false otherwise

descendants

Return the descendants of the layout element

drawing_elements

Return the drawing elements of the group layout.

east

Get the east (right) anchor point.

east_north_east

Return the east north east anchor of the node

east_south_east

Return the east south east west anchor of the node

equals

Return true if the layout element is equal to another layout element, false otherwise

flattened

Return a list containing copy of the layout element with no children and all its descendants with no children

label_center

Return the label center anchor of the node

left_connector_base

Get the base point of the left connector.

left_connector_tip

Get the tip point of the left connector.

north

Get the north (top) anchor point.

north_east

Return the north east anchor of the node

north_north_east

Return the north north east anchor of the node

north_north_west

Return the north north west anchor of the node

north_west

Return the north west anchor of the node

own_angle

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

own_bbox

Compute and return the bounding box of the self drawing element of the group layout

own_border

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.

own_children

Return the self children of the node. A node has unique child that is its label

own_drawing_elements

Return the node's own drawing elements

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

right_connector_base

Get the base point of the right connector.

right_connector_tip

Get the tip point of the right connector.

size

Return the size of the node

south

Get the south (bottom) anchor point.

south_east

Return the south east anchor of the node

south_south_east

Return the south south east anchor of the node

south_south_west

Return the south south west anchor of the node

south_west

Return the south west anchor of the node

to_geometry

Return a list of geometry primitives from the drawing elements.

west

Get the west (left) anchor point.

west_north_west

Return the west north west anchor of the node

west_south_west

Return the west south west anchor of the node

Attributes:

Name Type Description
x float

Return the x coordinate of the node

y float

Return the y coordinate of the node

anchor_point

anchor_point(anchor_name: str) -> Point

Return an anchor point of the layout element

Source code in src/momapy/core/elements.py
def anchor_point(self, anchor_name: str) -> momapy.geometry.Point:
    """Return an anchor point of the layout element"""
    return getattr(self, anchor_name)()

angle

angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

bbox

bbox() -> Bbox

Compute and return the bounding box of the group layout element

Source code in src/momapy/core/layout.py
def bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the group layout element"""
    own_bbox = self.own_bbox()
    bboxes = [child.bbox() for child in self.children()]
    min_x = own_bbox.north_west().x
    min_y = own_bbox.north_west().y
    max_x = own_bbox.south_east().x
    max_y = own_bbox.south_east().y
    for bbox in bboxes:
        if bbox.north_west().x < min_x:
            min_x = bbox.north_west().x
        if bbox.north_west().y < min_y:
            min_y = bbox.north_west().y
        if bbox.south_east().x > max_x:
            max_x = bbox.south_east().x
        if bbox.south_east().y > max_y:
            max_y = bbox.south_east().y
    bbox = momapy.geometry.Bbox(
        momapy.geometry.Point(min_x / 2 + max_x / 2, min_y / 2 + max_y / 2),
        max_x - min_x,
        max_y - min_y,
    )
    return bbox

border

border(point: Point) -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.drawing_elements(),
        point=point,
        center=self.center(),
    )

center

center() -> Point

Return the center anchor of the node

Source code in src/momapy/core/layout.py
def center(self) -> momapy.geometry.Point:
    """Return the center anchor of the node"""
    return self.position

childless

childless() -> Self

Return a copy of the node with no children

Source code in src/momapy/core/layout.py
def childless(self) -> typing_extensions.Self:
    """Return a copy of the node with no children"""
    return dataclasses.replace(self, label=None, layout_elements=tuple([]))

children

children() -> list[LayoutElement]

Return the children of the group layout. These are the self children of the group layout (returned by the own_children method) and the other children of the group layout (given by the layout_elements attribute)

Source code in src/momapy/core/layout.py
def children(self) -> list[LayoutElement]:
    """Return the children of the group layout.
    These are the self children of the group layout (returned by the `own_children` method) and the other children of the group layout (given by the `layout_elements` attribute)
    """
    return self.own_children() + list(self.layout_elements)

contains

contains(other: LayoutElement) -> bool

Return true if another layout element is a descendant of the layout element, false otherwise

Source code in src/momapy/core/elements.py
def contains(self, other: "LayoutElement") -> bool:
    """Return `true` if another layout element is a descendant of the layout element, `false` otherwise"""
    return other in self.descendants()

descendants

descendants() -> list[LayoutElement]

Return the descendants of the layout element

Source code in src/momapy/core/elements.py
def descendants(self) -> list["LayoutElement"]:
    """Return the descendants of the layout element"""
    descendants = []
    for child in self.children():
        descendants.append(child)
        descendants += child.descendants()
    return descendants

drawing_elements

drawing_elements() -> list[DrawingElement]

Return the drawing elements of the group layout. The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children

Source code in src/momapy/core/layout.py
def drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the drawing elements of the group layout.
    The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children
    """
    drawing_elements = self.own_drawing_elements()
    for child in self.children():
        if child is not None:
            drawing_elements += child.drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}",
        elements=tuple(drawing_elements),
        id_=f"{self.id_}",
        fill=self.group_fill,
        fill_rule=self.group_fill_rule,
        filter=self.group_filter,
        font_family=self.group_font_family,
        font_size=self.group_font_size,
        font_style=self.group_font_style,
        font_weight=self.group_font_weight,
        stroke=self.group_stroke,
        stroke_dasharray=self.group_stroke_dasharray,
        stroke_dashoffset=self.group_stroke_dashoffset,
        stroke_width=self.group_stroke_width,
        text_anchor=self.group_text_anchor,
        transform=self.group_transform,
    )
    return [group]

east

east() -> Point

Get the east (right) anchor point.

Returns:

Type Description
Point

Point on the east side of the element.

Source code in src/momapy/sbgn/elements.py
def east(self) -> momapy.geometry.Point:
    """Get the east (right) anchor point.

    Returns:
        Point on the east side of the element.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(self.x + self.width / 2, self.y)
    else:
        return momapy.geometry.Point(
            self.x + self.width / 2 + self.right_connector_length, self.y
        )

east_north_east

east_north_east() -> Point

Return the east north east anchor of the node

Source code in src/momapy/core/layout.py
def east_north_east(self) -> momapy.geometry.Point:
    """Return the east north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

east_south_east

east_south_east() -> Point

Return the east south east west anchor of the node

Source code in src/momapy/core/layout.py
def east_south_east(self) -> momapy.geometry.Point:
    """Return the east south east west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

equals

equals(other: LayoutElement, flattened: bool = False, unordered: bool = False) -> bool

Return true if the layout element is equal to another layout element, false otherwise

Source code in src/momapy/core/elements.py
def equals(
    self, other: "LayoutElement", flattened: bool = False, unordered: bool = False
) -> bool:
    """Return `true` if the layout element is equal to another layout element, `false` otherwise"""
    if type(self) is type(other):
        if not flattened:
            return self == other
        else:
            if not unordered:
                return self.flattened() == other.flattened()
            else:
                return set(self.flattened()) == set(other.flattened())
    return False

flattened

flattened() -> list[LayoutElement]

Return a list containing copy of the layout element with no children and all its descendants with no children

Source code in src/momapy/core/elements.py
def flattened(self) -> list["LayoutElement"]:
    """Return a list containing copy of the layout element with no children and all its descendants with no children"""
    flattened = [self.childless()]
    for child in self.children():
        flattened += child.flattened()
    return flattened

label_center

label_center() -> Point

Return the label center anchor of the node

Source code in src/momapy/core/layout.py
def label_center(self) -> momapy.geometry.Point:
    """Return the label center anchor of the node"""
    return self.position

left_connector_base

left_connector_base() -> Point

Get the base point of the left connector.

Returns:

Type Description
Point

Point where the left connector attaches to the shape.

Source code in src/momapy/sbgn/elements.py
def left_connector_base(self) -> momapy.geometry.Point:
    """Get the base point of the left connector.

    Returns:
        Point where the left connector attaches to the shape.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(self.x, self.y - self.height / 2)
    else:
        return momapy.geometry.Point(self.x - self.width / 2, self.y)

left_connector_tip

left_connector_tip() -> Point

Get the tip point of the left connector.

Returns:

Type Description
Point

Point at the end of the left connector line.

Source code in src/momapy/sbgn/elements.py
def left_connector_tip(self) -> momapy.geometry.Point:
    """Get the tip point of the left connector.

    Returns:
        Point at the end of the left connector line.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(
            self.x, self.y - self.height / 2 - self.left_connector_length
        )
    else:
        return momapy.geometry.Point(
            self.x - self.width / 2 - self.left_connector_length, self.y
        )

north

north() -> Point

Get the north (top) anchor point.

Returns:

Type Description
Point

Point on the north side of the element.

Source code in src/momapy/sbgn/elements.py
def north(self) -> momapy.geometry.Point:
    """Get the north (top) anchor point.

    Returns:
        Point on the north side of the element.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(
            self.x, self.y - self.height / 2 - self.left_connector_length
        )
    else:
        return momapy.geometry.Point(self.x, self.y - self.height / 2)

north_east

north_east() -> Point

Return the north east anchor of the node

Source code in src/momapy/core/layout.py
def north_east(self) -> momapy.geometry.Point:
    """Return the north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_east

north_north_east() -> Point

Return the north north east anchor of the node

Source code in src/momapy/core/layout.py
def north_north_east(self) -> momapy.geometry.Point:
    """Return the north north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_west

north_north_west() -> Point

Return the north north west anchor of the node

Source code in src/momapy/core/layout.py
def north_north_west(self) -> momapy.geometry.Point:
    """Return the north north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_west

north_west() -> Point

Return the north west anchor of the node

Source code in src/momapy/core/layout.py
def north_west(self) -> momapy.geometry.Point:
    """Return the north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

own_angle

own_angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def own_angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.own_drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

own_bbox

own_bbox() -> Bbox

Compute and return the bounding box of the self drawing element of the group layout

Source code in src/momapy/core/layout.py
def own_bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the self drawing element of the group layout"""
    primitives = self.own_to_geometry()
    if not primitives:
        return momapy.geometry.Bbox(momapy.geometry.Point(0, 0), 0, 0)
    bboxes = [p.bbox() for p in primitives]
    return momapy.geometry.Bbox.union(bboxes)

own_border

own_border(point: Point) -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def own_border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.own_drawing_elements(),
        point=point,
        center=self.center(),
    )

own_children

own_children() -> list[LayoutElement]

Return the self children of the node. A node has unique child that is its label

Source code in src/momapy/core/layout.py
def own_children(self) -> list[LayoutElement]:
    """Return the self children of the node. A node has unique child that is its label"""
    if self.label is not None:
        return [self.label]
    return []

own_drawing_elements

own_drawing_elements() -> list[DrawingElement]

Return the node's own drawing elements

Source code in src/momapy/core/layout.py
def own_drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the node's own drawing elements"""
    drawing_elements = self._border_drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}_own",
        elements=tuple(drawing_elements),
        fill=self.fill,
        filter=self.filter,
        id_=f"{self.id_}_own",
        stroke=self.stroke,
        stroke_dasharray=self.stroke_dasharray,
        stroke_dashoffset=self.stroke_dashoffset,
        stroke_width=self.stroke_width,
        transform=self.transform,
    )
    return [group]

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

Source code in src/momapy/core/layout.py
def own_to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the self drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

right_connector_base

right_connector_base() -> Point

Get the base point of the right connector.

Returns:

Type Description
Point

Point where the right connector attaches to the shape.

Source code in src/momapy/sbgn/elements.py
def right_connector_base(self) -> momapy.geometry.Point:
    """Get the base point of the right connector.

    Returns:
        Point where the right connector attaches to the shape.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(self.x, self.y + self.height / 2)
    else:
        return momapy.geometry.Point(self.x + self.width / 2, self.y)

right_connector_tip

right_connector_tip() -> Point

Get the tip point of the right connector.

Returns:

Type Description
Point

Point at the end of the right connector line.

Source code in src/momapy/sbgn/elements.py
def right_connector_tip(self) -> momapy.geometry.Point:
    """Get the tip point of the right connector.

    Returns:
        Point at the end of the right connector line.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(
            self.x, self.y + self.height / 2 + self.right_connector_length
        )
    else:
        return momapy.geometry.Point(
            self.x + self.width / 2 + self.right_connector_length, self.y
        )

size

size() -> tuple[float, float]

Return the size of the node

Source code in src/momapy/core/layout.py
def size(self) -> tuple[float, float]:
    """Return the size of the node"""
    return (self.width, self.height)

south

south() -> Point

Get the south (bottom) anchor point.

Returns:

Type Description
Point

Point on the south side of the element.

Source code in src/momapy/sbgn/elements.py
def south(self) -> momapy.geometry.Point:
    """Get the south (bottom) anchor point.

    Returns:
        Point on the south side of the element.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(
            self.x, self.y + self.height / 2 + self.right_connector_length
        )
    else:
        return momapy.geometry.Point(self.x, self.y + self.height / 2)

south_east

south_east() -> Point

Return the south east anchor of the node

Source code in src/momapy/core/layout.py
def south_east(self) -> momapy.geometry.Point:
    """Return the south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_east

south_south_east() -> Point

Return the south south east anchor of the node

Source code in src/momapy/core/layout.py
def south_south_east(self) -> momapy.geometry.Point:
    """Return the south south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_west

south_south_west() -> Point

Return the south south west anchor of the node

Source code in src/momapy/core/layout.py
def south_south_west(self) -> momapy.geometry.Point:
    """Return the south south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_west

south_west() -> Point

Return the south west anchor of the node

Source code in src/momapy/core/layout.py
def south_west(self) -> momapy.geometry.Point:
    """Return the south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

to_geometry

Return a list of geometry primitives from the drawing elements.

Source code in src/momapy/core/elements.py
def to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

west

west() -> Point

Get the west (left) anchor point.

Returns:

Type Description
Point

Point on the west side of the element.

Source code in src/momapy/sbgn/elements.py
def west(self) -> momapy.geometry.Point:
    """Get the west (left) anchor point.

    Returns:
        Point on the west side of the element.
    """
    if self.direction == momapy.core.elements.Direction.VERTICAL:
        return momapy.geometry.Point(self.x - self.width / 2, self.y)
    else:
        return momapy.geometry.Point(
            self.x - self.width / 2 - self.left_connector_length, self.y
        )

west_north_west

west_north_west() -> Point

Return the west north west anchor of the node

Source code in src/momapy/core/layout.py
def west_north_west(self) -> momapy.geometry.Point:
    """Return the west north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

west_south_west

west_south_west() -> Point

Return the west south west anchor of the node

Source code in src/momapy/core/layout.py
def west_south_west(self) -> momapy.geometry.Point:
    """Return the west south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

x property

x: float

Return the x coordinate of the node

y property

y: float

Return the y coordinate of the node

PerturbationUnitOfInformation dataclass

PerturbationUnitOfInformation(*, id_: str = make_uuid4_as_str(), label: str | None = None)

Bases: UnitOfInformation

Unit of information typing a biological activity as a perturbation.

Denotes an external influence (drug, stimulus, mutation) acting on the system.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'0683539b-23ac-4fb6-aa36-afc2c46f9984'
label str | None
None

Methods:

Name Description
descendants

Return every ModelElement reachable from self, excluding self.

descendants

descendants() -> list[ModelElement]

Return every ModelElement reachable from self, excluding self.

Walks scalar ModelElement fields and frozenset/tuple containers, deduplicating by object identity.

Returns:

Type Description
list[ModelElement]

The list of reachable ModelElement instances in visit

list[ModelElement]

order, without self.

Source code in src/momapy/core/elements.py
def descendants(self) -> list["ModelElement"]:
    """Return every `ModelElement` reachable from `self`, excluding `self`.

    Walks scalar `ModelElement` fields and `frozenset`/`tuple`
    containers, deduplicating by object identity.

    Returns:
        The list of reachable `ModelElement` instances in visit
        order, without `self`.
    """
    seen: set[int] = {id(self)}
    result: list[ModelElement] = []
    if dataclasses.is_dataclass(self):
        for field in dataclasses.fields(type(self)):
            _walk_model_graph(getattr(self, field.name), seen, result)
    return result

PerturbationUnitOfInformationLayout dataclass

PerturbationUnitOfInformationLayout(fill: NoneValueType | Color | None = white, stroke: NoneValueType | Color | None = black, stroke_width: float | None = 1.25, *, id_: str = make_uuid4_as_str(), layout_elements: tuple[LayoutElement] = tuple(), group_fill: NoneValueType | Color | None = None, group_fill_rule: FillRule | None = None, group_filter: NoneValueType | Filter | None = None, group_font_family: str | None = None, group_font_size: float | None = None, group_font_style: FontStyle | None = None, group_font_weight: FontWeight | float | None = None, group_stroke: NoneValueType | Color | None = None, group_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, group_stroke_dashoffset: NoneValueType | float | None = None, group_stroke_width: NoneValueType | float | None = None, group_text_anchor: TextAnchor | None = None, group_transform: NoneValueType | tuple[Transformation] | None = None, filter: NoneValueType | Filter | None = None, height: float = 12.0, label: TextLayout | None = None, position: Point, stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, stroke_dashoffset: NoneValueType | float | None = None, transform: NoneValueType | tuple[Transformation] | None = None, width: float = 12.0, angle: float = 70.0)

Bases: _SimpleMixin, SBGNNode

Layout for perturbation units of information.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'913579b1-2c1b-48da-99f6-215f1be172aa'
layout_elements tuple[LayoutElement]

The sub-layout elements of the group layout. These are part of the children of the group layout

<dynamic>
group_fill NoneValueType | Color | None

The fill color of the group layout

None
group_fill_rule FillRule | None

The fill rule of the group layout

None
group_filter NoneValueType | Filter | None

The filter of the group layout

None
group_font_family str | None

The font family of the group layout

None
group_font_size float | None

The font size of the group layout

None
group_font_style FontStyle | None

The font style of the group layout

None
group_font_weight FontWeight | float | None

The font weight of the group layout

None
group_stroke NoneValueType | Color | None

The stroke color of the group layout

None
group_stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the group layout

None
group_stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the group layout

None
group_stroke_width NoneValueType | float | None

The stroke width of the group layout

None
group_text_anchor TextAnchor | None

The text anchor of the group layout

None
group_transform NoneValueType | tuple[Transformation] | None

The transform of the group layout

None
fill NoneValueType | Color | None

The fill color of the node

Color(red=255, green=255, blue=255, alpha=1.0)
filter NoneValueType | Filter | None

The filter of the node

None
height float

The height of the node

12.0
label TextLayout | None

The label of the node

None
position Point

The position of the node

required
stroke NoneValueType | Color | None

The stroke color of the node

Color(red=0, green=0, blue=0, alpha=1.0)
stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the node

None
stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the node

None
stroke_width float | None

The stroke width of the node

1.25
transform NoneValueType | tuple[Transformation] | None

The transform of the node

None
width float

The width width of the node

12.0
angle float

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

70.0

Methods:

Name Description
anchor_point

Return an anchor point of the layout element

bbox

Compute and return the bounding box of the group layout element

border

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.

center

Return the center anchor of the node

childless

Return a copy of the node with no children

children

Return the children of the group layout.

contains

Return true if another layout element is a descendant of the layout element, false otherwise

descendants

Return the descendants of the layout element

drawing_elements

Return the drawing elements of the group layout.

east

Return the east anchor of the node

east_north_east

Return the east north east anchor of the node

east_south_east

Return the east south east west anchor of the node

equals

Return true if the layout element is equal to another layout element, false otherwise

flattened

Return a list containing copy of the layout element with no children and all its descendants with no children

label_center

Return the label center anchor of the node

north

Return the north anchor of the node

north_east

Return the north east anchor of the node

north_north_east

Return the north north east anchor of the node

north_north_west

Return the north north west anchor of the node

north_west

Return the north west anchor of the node

own_angle

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

own_bbox

Compute and return the bounding box of the self drawing element of the group layout

own_border

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.

own_children

Return the self children of the node. A node has unique child that is its label

own_drawing_elements

Return the node's own drawing elements

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

size

Return the size of the node

south

Return the south anchor of the node

south_east

Return the south east anchor of the node

south_south_east

Return the south south east anchor of the node

south_south_west

Return the south south west anchor of the node

south_west

Return the south west anchor of the node

to_geometry

Return a list of geometry primitives from the drawing elements.

west

Return the west anchor of the node

west_north_west

Return the west north west anchor of the node

west_south_west

Return the west south west anchor of the node

Attributes:

Name Type Description
angle float

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

x float

Return the x coordinate of the node

y float

Return the y coordinate of the node

anchor_point

anchor_point(anchor_name: str) -> Point

Return an anchor point of the layout element

Source code in src/momapy/core/elements.py
def anchor_point(self, anchor_name: str) -> momapy.geometry.Point:
    """Return an anchor point of the layout element"""
    return getattr(self, anchor_name)()

angle class-attribute instance-attribute

angle: float = 70.0

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

bbox

bbox() -> Bbox

Compute and return the bounding box of the group layout element

Source code in src/momapy/core/layout.py
def bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the group layout element"""
    own_bbox = self.own_bbox()
    bboxes = [child.bbox() for child in self.children()]
    min_x = own_bbox.north_west().x
    min_y = own_bbox.north_west().y
    max_x = own_bbox.south_east().x
    max_y = own_bbox.south_east().y
    for bbox in bboxes:
        if bbox.north_west().x < min_x:
            min_x = bbox.north_west().x
        if bbox.north_west().y < min_y:
            min_y = bbox.north_west().y
        if bbox.south_east().x > max_x:
            max_x = bbox.south_east().x
        if bbox.south_east().y > max_y:
            max_y = bbox.south_east().y
    bbox = momapy.geometry.Bbox(
        momapy.geometry.Point(min_x / 2 + max_x / 2, min_y / 2 + max_y / 2),
        max_x - min_x,
        max_y - min_y,
    )
    return bbox

border

border(point: Point) -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.drawing_elements(),
        point=point,
        center=self.center(),
    )

center

center() -> Point

Return the center anchor of the node

Source code in src/momapy/core/layout.py
def center(self) -> momapy.geometry.Point:
    """Return the center anchor of the node"""
    return self.position

childless

childless() -> Self

Return a copy of the node with no children

Source code in src/momapy/core/layout.py
def childless(self) -> typing_extensions.Self:
    """Return a copy of the node with no children"""
    return dataclasses.replace(self, label=None, layout_elements=tuple([]))

children

children() -> list[LayoutElement]

Return the children of the group layout. These are the self children of the group layout (returned by the own_children method) and the other children of the group layout (given by the layout_elements attribute)

Source code in src/momapy/core/layout.py
def children(self) -> list[LayoutElement]:
    """Return the children of the group layout.
    These are the self children of the group layout (returned by the `own_children` method) and the other children of the group layout (given by the `layout_elements` attribute)
    """
    return self.own_children() + list(self.layout_elements)

contains

contains(other: LayoutElement) -> bool

Return true if another layout element is a descendant of the layout element, false otherwise

Source code in src/momapy/core/elements.py
def contains(self, other: "LayoutElement") -> bool:
    """Return `true` if another layout element is a descendant of the layout element, `false` otherwise"""
    return other in self.descendants()

descendants

descendants() -> list[LayoutElement]

Return the descendants of the layout element

Source code in src/momapy/core/elements.py
def descendants(self) -> list["LayoutElement"]:
    """Return the descendants of the layout element"""
    descendants = []
    for child in self.children():
        descendants.append(child)
        descendants += child.descendants()
    return descendants

drawing_elements

drawing_elements() -> list[DrawingElement]

Return the drawing elements of the group layout. The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children

Source code in src/momapy/core/layout.py
def drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the drawing elements of the group layout.
    The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children
    """
    drawing_elements = self.own_drawing_elements()
    for child in self.children():
        if child is not None:
            drawing_elements += child.drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}",
        elements=tuple(drawing_elements),
        id_=f"{self.id_}",
        fill=self.group_fill,
        fill_rule=self.group_fill_rule,
        filter=self.group_filter,
        font_family=self.group_font_family,
        font_size=self.group_font_size,
        font_style=self.group_font_style,
        font_weight=self.group_font_weight,
        stroke=self.group_stroke,
        stroke_dasharray=self.group_stroke_dasharray,
        stroke_dashoffset=self.group_stroke_dashoffset,
        stroke_width=self.group_stroke_width,
        text_anchor=self.group_text_anchor,
        transform=self.group_transform,
    )
    return [group]

east

east() -> Point

Return the east anchor of the node

Source code in src/momapy/core/layout.py
def east(self) -> momapy.geometry.Point:
    """Return the east anchor of the node"""
    return self.own_angle(0)

east_north_east

east_north_east() -> Point

Return the east north east anchor of the node

Source code in src/momapy/core/layout.py
def east_north_east(self) -> momapy.geometry.Point:
    """Return the east north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

east_south_east

east_south_east() -> Point

Return the east south east west anchor of the node

Source code in src/momapy/core/layout.py
def east_south_east(self) -> momapy.geometry.Point:
    """Return the east south east west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

equals

equals(other: LayoutElement, flattened: bool = False, unordered: bool = False) -> bool

Return true if the layout element is equal to another layout element, false otherwise

Source code in src/momapy/core/elements.py
def equals(
    self, other: "LayoutElement", flattened: bool = False, unordered: bool = False
) -> bool:
    """Return `true` if the layout element is equal to another layout element, `false` otherwise"""
    if type(self) is type(other):
        if not flattened:
            return self == other
        else:
            if not unordered:
                return self.flattened() == other.flattened()
            else:
                return set(self.flattened()) == set(other.flattened())
    return False

flattened

flattened() -> list[LayoutElement]

Return a list containing copy of the layout element with no children and all its descendants with no children

Source code in src/momapy/core/elements.py
def flattened(self) -> list["LayoutElement"]:
    """Return a list containing copy of the layout element with no children and all its descendants with no children"""
    flattened = [self.childless()]
    for child in self.children():
        flattened += child.flattened()
    return flattened

label_center

label_center() -> Point

Return the label center anchor of the node

Source code in src/momapy/core/layout.py
def label_center(self) -> momapy.geometry.Point:
    """Return the label center anchor of the node"""
    return self.position

north

north() -> Point

Return the north anchor of the node

Source code in src/momapy/core/layout.py
def north(self) -> momapy.geometry.Point:
    """Return the north anchor of the node"""
    return self.own_angle(90)

north_east

north_east() -> Point

Return the north east anchor of the node

Source code in src/momapy/core/layout.py
def north_east(self) -> momapy.geometry.Point:
    """Return the north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_east

north_north_east() -> Point

Return the north north east anchor of the node

Source code in src/momapy/core/layout.py
def north_north_east(self) -> momapy.geometry.Point:
    """Return the north north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_west

north_north_west() -> Point

Return the north north west anchor of the node

Source code in src/momapy/core/layout.py
def north_north_west(self) -> momapy.geometry.Point:
    """Return the north north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_west

north_west() -> Point

Return the north west anchor of the node

Source code in src/momapy/core/layout.py
def north_west(self) -> momapy.geometry.Point:
    """Return the north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

own_angle

own_angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def own_angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.own_drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

own_bbox

own_bbox() -> Bbox

Compute and return the bounding box of the self drawing element of the group layout

Source code in src/momapy/core/layout.py
def own_bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the self drawing element of the group layout"""
    primitives = self.own_to_geometry()
    if not primitives:
        return momapy.geometry.Bbox(momapy.geometry.Point(0, 0), 0, 0)
    bboxes = [p.bbox() for p in primitives]
    return momapy.geometry.Bbox.union(bboxes)

own_border

own_border(point: Point) -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def own_border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.own_drawing_elements(),
        point=point,
        center=self.center(),
    )

own_children

own_children() -> list[LayoutElement]

Return the self children of the node. A node has unique child that is its label

Source code in src/momapy/core/layout.py
def own_children(self) -> list[LayoutElement]:
    """Return the self children of the node. A node has unique child that is its label"""
    if self.label is not None:
        return [self.label]
    return []

own_drawing_elements

own_drawing_elements() -> list[DrawingElement]

Return the node's own drawing elements

Source code in src/momapy/core/layout.py
def own_drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the node's own drawing elements"""
    drawing_elements = self._border_drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}_own",
        elements=tuple(drawing_elements),
        fill=self.fill,
        filter=self.filter,
        id_=f"{self.id_}_own",
        stroke=self.stroke,
        stroke_dasharray=self.stroke_dasharray,
        stroke_dashoffset=self.stroke_dashoffset,
        stroke_width=self.stroke_width,
        transform=self.transform,
    )
    return [group]

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

Source code in src/momapy/core/layout.py
def own_to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the self drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

size

size() -> tuple[float, float]

Return the size of the node

Source code in src/momapy/core/layout.py
def size(self) -> tuple[float, float]:
    """Return the size of the node"""
    return (self.width, self.height)

south

south() -> Point

Return the south anchor of the node

Source code in src/momapy/core/layout.py
def south(self) -> momapy.geometry.Point:
    """Return the south anchor of the node"""
    return self.own_angle(270)

south_east

south_east() -> Point

Return the south east anchor of the node

Source code in src/momapy/core/layout.py
def south_east(self) -> momapy.geometry.Point:
    """Return the south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_east

south_south_east() -> Point

Return the south south east anchor of the node

Source code in src/momapy/core/layout.py
def south_south_east(self) -> momapy.geometry.Point:
    """Return the south south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_west

south_south_west() -> Point

Return the south south west anchor of the node

Source code in src/momapy/core/layout.py
def south_south_west(self) -> momapy.geometry.Point:
    """Return the south south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_west

south_west() -> Point

Return the south west anchor of the node

Source code in src/momapy/core/layout.py
def south_west(self) -> momapy.geometry.Point:
    """Return the south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

to_geometry

Return a list of geometry primitives from the drawing elements.

Source code in src/momapy/core/elements.py
def to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

west

west() -> Point

Return the west anchor of the node

Source code in src/momapy/core/layout.py
def west(self) -> momapy.geometry.Point:
    """Return the west anchor of the node"""
    return self.own_angle(180)

west_north_west

west_north_west() -> Point

Return the west north west anchor of the node

Source code in src/momapy/core/layout.py
def west_north_west(self) -> momapy.geometry.Point:
    """Return the west north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

west_south_west

west_south_west() -> Point

Return the west south west anchor of the node

Source code in src/momapy/core/layout.py
def west_south_west(self) -> momapy.geometry.Point:
    """Return the west south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

x property

x: float

Return the x coordinate of the node

y property

y: float

Return the y coordinate of the node

Phenotype dataclass

Phenotype(*, id_: str = make_uuid4_as_str(), label: str | None = None, compartment: Compartment | None = None)

Bases: Activity

Phenotype activity.

Represents an observable characteristic of the system — a system-level outcome produced by the combination of biological activities rather than an individual activity itself.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'c38e7f34-a00a-4730-8380-8c797303ba4a'
label str | None
None
compartment Compartment | None
None

Methods:

Name Description
descendants

Return every ModelElement reachable from self, excluding self.

descendants

descendants() -> list[ModelElement]

Return every ModelElement reachable from self, excluding self.

Walks scalar ModelElement fields and frozenset/tuple containers, deduplicating by object identity.

Returns:

Type Description
list[ModelElement]

The list of reachable ModelElement instances in visit

list[ModelElement]

order, without self.

Source code in src/momapy/core/elements.py
def descendants(self) -> list["ModelElement"]:
    """Return every `ModelElement` reachable from `self`, excluding `self`.

    Walks scalar `ModelElement` fields and `frozenset`/`tuple`
    containers, deduplicating by object identity.

    Returns:
        The list of reachable `ModelElement` instances in visit
        order, without `self`.
    """
    seen: set[int] = {id(self)}
    result: list[ModelElement] = []
    if dataclasses.is_dataclass(self):
        for field in dataclasses.fields(type(self)):
            _walk_model_graph(getattr(self, field.name), seen, result)
    return result

PhenotypeLayout dataclass

PhenotypeLayout(fill: NoneValueType | Color | None = white, stroke: NoneValueType | Color | None = black, stroke_width: float | None = 1.25, *, id_: str = make_uuid4_as_str(), layout_elements: tuple[LayoutElement] = tuple(), group_fill: NoneValueType | Color | None = None, group_fill_rule: FillRule | None = None, group_filter: NoneValueType | Filter | None = None, group_font_family: str | None = None, group_font_size: float | None = None, group_font_style: FontStyle | None = None, group_font_weight: FontWeight | float | None = None, group_stroke: NoneValueType | Color | None = None, group_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, group_stroke_dashoffset: NoneValueType | float | None = None, group_stroke_width: NoneValueType | float | None = None, group_text_anchor: TextAnchor | None = None, group_transform: NoneValueType | tuple[Transformation] | None = None, filter: NoneValueType | Filter | None = None, height: float = 30.0, label: TextLayout | None = None, position: Point, stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, stroke_dashoffset: NoneValueType | float | None = None, transform: NoneValueType | tuple[Transformation] | None = None, width: float = 60.0, angle: float = 70.0)

Bases: _SimpleMixin, SBGNNode

Layout for phenotypes.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'e6091809-2682-467d-80c4-9b1c9412d4b5'
layout_elements tuple[LayoutElement]

The sub-layout elements of the group layout. These are part of the children of the group layout

<dynamic>
group_fill NoneValueType | Color | None

The fill color of the group layout

None
group_fill_rule FillRule | None

The fill rule of the group layout

None
group_filter NoneValueType | Filter | None

The filter of the group layout

None
group_font_family str | None

The font family of the group layout

None
group_font_size float | None

The font size of the group layout

None
group_font_style FontStyle | None

The font style of the group layout

None
group_font_weight FontWeight | float | None

The font weight of the group layout

None
group_stroke NoneValueType | Color | None

The stroke color of the group layout

None
group_stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the group layout

None
group_stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the group layout

None
group_stroke_width NoneValueType | float | None

The stroke width of the group layout

None
group_text_anchor TextAnchor | None

The text anchor of the group layout

None
group_transform NoneValueType | tuple[Transformation] | None

The transform of the group layout

None
fill NoneValueType | Color | None

The fill color of the node

Color(red=255, green=255, blue=255, alpha=1.0)
filter NoneValueType | Filter | None

The filter of the node

None
height float

The height of the node

30.0
label TextLayout | None

The label of the node

None
position Point

The position of the node

required
stroke NoneValueType | Color | None

The stroke color of the node

Color(red=0, green=0, blue=0, alpha=1.0)
stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the node

None
stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the node

None
stroke_width float | None

The stroke width of the node

1.25
transform NoneValueType | tuple[Transformation] | None

The transform of the node

None
width float

The width width of the node

60.0
angle float

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

70.0

Methods:

Name Description
anchor_point

Return an anchor point of the layout element

bbox

Compute and return the bounding box of the group layout element

border

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.

center

Return the center anchor of the node

childless

Return a copy of the node with no children

children

Return the children of the group layout.

contains

Return true if another layout element is a descendant of the layout element, false otherwise

descendants

Return the descendants of the layout element

drawing_elements

Return the drawing elements of the group layout.

east

Return the east anchor of the node

east_north_east

Return the east north east anchor of the node

east_south_east

Return the east south east west anchor of the node

equals

Return true if the layout element is equal to another layout element, false otherwise

flattened

Return a list containing copy of the layout element with no children and all its descendants with no children

label_center

Return the label center anchor of the node

north

Return the north anchor of the node

north_east

Return the north east anchor of the node

north_north_east

Return the north north east anchor of the node

north_north_west

Return the north north west anchor of the node

north_west

Return the north west anchor of the node

own_angle

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

own_bbox

Compute and return the bounding box of the self drawing element of the group layout

own_border

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.

own_children

Return the self children of the node. A node has unique child that is its label

own_drawing_elements

Return the node's own drawing elements

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

size

Return the size of the node

south

Return the south anchor of the node

south_east

Return the south east anchor of the node

south_south_east

Return the south south east anchor of the node

south_south_west

Return the south south west anchor of the node

south_west

Return the south west anchor of the node

to_geometry

Return a list of geometry primitives from the drawing elements.

west

Return the west anchor of the node

west_north_west

Return the west north west anchor of the node

west_south_west

Return the west south west anchor of the node

Attributes:

Name Type Description
angle float

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

x float

Return the x coordinate of the node

y float

Return the y coordinate of the node

anchor_point

anchor_point(anchor_name: str) -> Point

Return an anchor point of the layout element

Source code in src/momapy/core/elements.py
def anchor_point(self, anchor_name: str) -> momapy.geometry.Point:
    """Return an anchor point of the layout element"""
    return getattr(self, anchor_name)()

angle class-attribute instance-attribute

angle: float = 70.0

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

bbox

bbox() -> Bbox

Compute and return the bounding box of the group layout element

Source code in src/momapy/core/layout.py
def bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the group layout element"""
    own_bbox = self.own_bbox()
    bboxes = [child.bbox() for child in self.children()]
    min_x = own_bbox.north_west().x
    min_y = own_bbox.north_west().y
    max_x = own_bbox.south_east().x
    max_y = own_bbox.south_east().y
    for bbox in bboxes:
        if bbox.north_west().x < min_x:
            min_x = bbox.north_west().x
        if bbox.north_west().y < min_y:
            min_y = bbox.north_west().y
        if bbox.south_east().x > max_x:
            max_x = bbox.south_east().x
        if bbox.south_east().y > max_y:
            max_y = bbox.south_east().y
    bbox = momapy.geometry.Bbox(
        momapy.geometry.Point(min_x / 2 + max_x / 2, min_y / 2 + max_y / 2),
        max_x - min_x,
        max_y - min_y,
    )
    return bbox

border

border(point: Point) -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.drawing_elements(),
        point=point,
        center=self.center(),
    )

center

center() -> Point

Return the center anchor of the node

Source code in src/momapy/core/layout.py
def center(self) -> momapy.geometry.Point:
    """Return the center anchor of the node"""
    return self.position

childless

childless() -> Self

Return a copy of the node with no children

Source code in src/momapy/core/layout.py
def childless(self) -> typing_extensions.Self:
    """Return a copy of the node with no children"""
    return dataclasses.replace(self, label=None, layout_elements=tuple([]))

children

children() -> list[LayoutElement]

Return the children of the group layout. These are the self children of the group layout (returned by the own_children method) and the other children of the group layout (given by the layout_elements attribute)

Source code in src/momapy/core/layout.py
def children(self) -> list[LayoutElement]:
    """Return the children of the group layout.
    These are the self children of the group layout (returned by the `own_children` method) and the other children of the group layout (given by the `layout_elements` attribute)
    """
    return self.own_children() + list(self.layout_elements)

contains

contains(other: LayoutElement) -> bool

Return true if another layout element is a descendant of the layout element, false otherwise

Source code in src/momapy/core/elements.py
def contains(self, other: "LayoutElement") -> bool:
    """Return `true` if another layout element is a descendant of the layout element, `false` otherwise"""
    return other in self.descendants()

descendants

descendants() -> list[LayoutElement]

Return the descendants of the layout element

Source code in src/momapy/core/elements.py
def descendants(self) -> list["LayoutElement"]:
    """Return the descendants of the layout element"""
    descendants = []
    for child in self.children():
        descendants.append(child)
        descendants += child.descendants()
    return descendants

drawing_elements

drawing_elements() -> list[DrawingElement]

Return the drawing elements of the group layout. The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children

Source code in src/momapy/core/layout.py
def drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the drawing elements of the group layout.
    The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children
    """
    drawing_elements = self.own_drawing_elements()
    for child in self.children():
        if child is not None:
            drawing_elements += child.drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}",
        elements=tuple(drawing_elements),
        id_=f"{self.id_}",
        fill=self.group_fill,
        fill_rule=self.group_fill_rule,
        filter=self.group_filter,
        font_family=self.group_font_family,
        font_size=self.group_font_size,
        font_style=self.group_font_style,
        font_weight=self.group_font_weight,
        stroke=self.group_stroke,
        stroke_dasharray=self.group_stroke_dasharray,
        stroke_dashoffset=self.group_stroke_dashoffset,
        stroke_width=self.group_stroke_width,
        text_anchor=self.group_text_anchor,
        transform=self.group_transform,
    )
    return [group]

east

east() -> Point

Return the east anchor of the node

Source code in src/momapy/core/layout.py
def east(self) -> momapy.geometry.Point:
    """Return the east anchor of the node"""
    return self.own_angle(0)

east_north_east

east_north_east() -> Point

Return the east north east anchor of the node

Source code in src/momapy/core/layout.py
def east_north_east(self) -> momapy.geometry.Point:
    """Return the east north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

east_south_east

east_south_east() -> Point

Return the east south east west anchor of the node

Source code in src/momapy/core/layout.py
def east_south_east(self) -> momapy.geometry.Point:
    """Return the east south east west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

equals

equals(other: LayoutElement, flattened: bool = False, unordered: bool = False) -> bool

Return true if the layout element is equal to another layout element, false otherwise

Source code in src/momapy/core/elements.py
def equals(
    self, other: "LayoutElement", flattened: bool = False, unordered: bool = False
) -> bool:
    """Return `true` if the layout element is equal to another layout element, `false` otherwise"""
    if type(self) is type(other):
        if not flattened:
            return self == other
        else:
            if not unordered:
                return self.flattened() == other.flattened()
            else:
                return set(self.flattened()) == set(other.flattened())
    return False

flattened

flattened() -> list[LayoutElement]

Return a list containing copy of the layout element with no children and all its descendants with no children

Source code in src/momapy/core/elements.py
def flattened(self) -> list["LayoutElement"]:
    """Return a list containing copy of the layout element with no children and all its descendants with no children"""
    flattened = [self.childless()]
    for child in self.children():
        flattened += child.flattened()
    return flattened

label_center

label_center() -> Point

Return the label center anchor of the node

Source code in src/momapy/core/layout.py
def label_center(self) -> momapy.geometry.Point:
    """Return the label center anchor of the node"""
    return self.position

north

north() -> Point

Return the north anchor of the node

Source code in src/momapy/core/layout.py
def north(self) -> momapy.geometry.Point:
    """Return the north anchor of the node"""
    return self.own_angle(90)

north_east

north_east() -> Point

Return the north east anchor of the node

Source code in src/momapy/core/layout.py
def north_east(self) -> momapy.geometry.Point:
    """Return the north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_east

north_north_east() -> Point

Return the north north east anchor of the node

Source code in src/momapy/core/layout.py
def north_north_east(self) -> momapy.geometry.Point:
    """Return the north north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_west

north_north_west() -> Point

Return the north north west anchor of the node

Source code in src/momapy/core/layout.py
def north_north_west(self) -> momapy.geometry.Point:
    """Return the north north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_west

north_west() -> Point

Return the north west anchor of the node

Source code in src/momapy/core/layout.py
def north_west(self) -> momapy.geometry.Point:
    """Return the north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

own_angle

own_angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def own_angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.own_drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

own_bbox

own_bbox() -> Bbox

Compute and return the bounding box of the self drawing element of the group layout

Source code in src/momapy/core/layout.py
def own_bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the self drawing element of the group layout"""
    primitives = self.own_to_geometry()
    if not primitives:
        return momapy.geometry.Bbox(momapy.geometry.Point(0, 0), 0, 0)
    bboxes = [p.bbox() for p in primitives]
    return momapy.geometry.Bbox.union(bboxes)

own_border

own_border(point: Point) -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def own_border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.own_drawing_elements(),
        point=point,
        center=self.center(),
    )

own_children

own_children() -> list[LayoutElement]

Return the self children of the node. A node has unique child that is its label

Source code in src/momapy/core/layout.py
def own_children(self) -> list[LayoutElement]:
    """Return the self children of the node. A node has unique child that is its label"""
    if self.label is not None:
        return [self.label]
    return []

own_drawing_elements

own_drawing_elements() -> list[DrawingElement]

Return the node's own drawing elements

Source code in src/momapy/core/layout.py
def own_drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the node's own drawing elements"""
    drawing_elements = self._border_drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}_own",
        elements=tuple(drawing_elements),
        fill=self.fill,
        filter=self.filter,
        id_=f"{self.id_}_own",
        stroke=self.stroke,
        stroke_dasharray=self.stroke_dasharray,
        stroke_dashoffset=self.stroke_dashoffset,
        stroke_width=self.stroke_width,
        transform=self.transform,
    )
    return [group]

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

Source code in src/momapy/core/layout.py
def own_to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the self drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

size

size() -> tuple[float, float]

Return the size of the node

Source code in src/momapy/core/layout.py
def size(self) -> tuple[float, float]:
    """Return the size of the node"""
    return (self.width, self.height)

south

south() -> Point

Return the south anchor of the node

Source code in src/momapy/core/layout.py
def south(self) -> momapy.geometry.Point:
    """Return the south anchor of the node"""
    return self.own_angle(270)

south_east

south_east() -> Point

Return the south east anchor of the node

Source code in src/momapy/core/layout.py
def south_east(self) -> momapy.geometry.Point:
    """Return the south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_east

south_south_east() -> Point

Return the south south east anchor of the node

Source code in src/momapy/core/layout.py
def south_south_east(self) -> momapy.geometry.Point:
    """Return the south south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_west

south_south_west() -> Point

Return the south south west anchor of the node

Source code in src/momapy/core/layout.py
def south_south_west(self) -> momapy.geometry.Point:
    """Return the south south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_west

south_west() -> Point

Return the south west anchor of the node

Source code in src/momapy/core/layout.py
def south_west(self) -> momapy.geometry.Point:
    """Return the south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

to_geometry

Return a list of geometry primitives from the drawing elements.

Source code in src/momapy/core/elements.py
def to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

west

west() -> Point

Return the west anchor of the node

Source code in src/momapy/core/layout.py
def west(self) -> momapy.geometry.Point:
    """Return the west anchor of the node"""
    return self.own_angle(180)

west_north_west

west_north_west() -> Point

Return the west north west anchor of the node

Source code in src/momapy/core/layout.py
def west_north_west(self) -> momapy.geometry.Point:
    """Return the west north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

west_south_west

west_south_west() -> Point

Return the west south west anchor of the node

Source code in src/momapy/core/layout.py
def west_south_west(self) -> momapy.geometry.Point:
    """Return the west south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

x property

x: float

Return the x coordinate of the node

y property

y: float

Return the y coordinate of the node

PositiveInfluence dataclass

PositiveInfluence(*, id_: str = make_uuid4_as_str(), source: BiologicalActivity | LogicalOperator, target: Activity)

Bases: Influence

Positive (stimulating) influence.

The source increases the activity of the target.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'37f8fe09-f32a-48eb-a476-5005af13c394'
source BiologicalActivity | LogicalOperator
required
target Activity
required

Methods:

Name Description
descendants

Return every ModelElement reachable from self, excluding self.

descendants

descendants() -> list[ModelElement]

Return every ModelElement reachable from self, excluding self.

Walks scalar ModelElement fields and frozenset/tuple containers, deduplicating by object identity.

Returns:

Type Description
list[ModelElement]

The list of reachable ModelElement instances in visit

list[ModelElement]

order, without self.

Source code in src/momapy/core/elements.py
def descendants(self) -> list["ModelElement"]:
    """Return every `ModelElement` reachable from `self`, excluding `self`.

    Walks scalar `ModelElement` fields and `frozenset`/`tuple`
    containers, deduplicating by object identity.

    Returns:
        The list of reachable `ModelElement` instances in visit
        order, without `self`.
    """
    seen: set[int] = {id(self)}
    result: list[ModelElement] = []
    if dataclasses.is_dataclass(self):
        for field in dataclasses.fields(type(self)):
            _walk_model_graph(getattr(self, field.name), seen, result)
    return result

PositiveInfluenceLayout dataclass

PositiveInfluenceLayout(path_fill: NoneValueType | Color | None = NoneValue, path_stroke: NoneValueType | Color | None = black, path_stroke_width: float | None = 1.25, arrowhead_fill: NoneValueType | Color | None = white, arrowhead_stroke: NoneValueType | Color | None = black, arrowhead_stroke_width: float | None = 1.25, *, id_: str = make_uuid4_as_str(), layout_elements: tuple[LayoutElement] = tuple(), group_fill: NoneValueType | Color | None = None, group_fill_rule: FillRule | None = None, group_filter: NoneValueType | Filter | None = None, group_font_family: str | None = None, group_font_size: float | None = None, group_font_style: FontStyle | None = None, group_font_weight: FontWeight | float | None = None, group_stroke: NoneValueType | Color | None = None, group_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, group_stroke_dashoffset: NoneValueType | float | None = None, group_stroke_width: NoneValueType | float | None = None, group_text_anchor: TextAnchor | None = None, group_transform: NoneValueType | tuple[Transformation] | None = None, end_shorten: float = 0.0, fill: NoneValueType | Color | None = None, filter: NoneValueType | Filter | None = None, path_filter: NoneValueType | Filter | None = None, path_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, path_stroke_dashoffset: NoneValueType | float | None = None, path_transform: NoneValueType | tuple[Transformation] | None = None, stroke: NoneValueType | Color | None = None, stroke_dasharray: NoneValueType | tuple[float] | None = None, stroke_dashoffset: NoneValueType | float | None = None, stroke_width: NoneValueType | float | None = None, segments: tuple[Segment | QuadraticBezierCurve | CubicBezierCurve | EllipticalArc] = tuple(), source: LayoutElement | None = None, start_shorten: float = 0.0, target: LayoutElement | None = None, transform: NoneValueType | tuple[Transformation] | None = None, arrowhead_filter: NoneValueType | Filter | None = None, arrowhead_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, arrowhead_stroke_dashoffset: NoneValueType | float | None = None, arrowhead_transform: NoneValueType | tuple[Transformation] | None = None, arrowhead_height: float = 10.0, arrowhead_width: float = 10.0)

Bases: SBGNSingleHeadedArc

Layout for positive influences.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'd4a235f7-64cb-4564-9f7c-f2f6ca61032d'
layout_elements tuple[LayoutElement]

The sub-layout elements of the group layout. These are part of the children of the group layout

<dynamic>
group_fill NoneValueType | Color | None

The fill color of the group layout

None
group_fill_rule FillRule | None

The fill rule of the group layout

None
group_filter NoneValueType | Filter | None

The filter of the group layout

None
group_font_family str | None

The font family of the group layout

None
group_font_size float | None

The font size of the group layout

None
group_font_style FontStyle | None

The font style of the group layout

None
group_font_weight FontWeight | float | None

The font weight of the group layout

None
group_stroke NoneValueType | Color | None

The stroke color of the group layout

None
group_stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the group layout

None
group_stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the group layout

None
group_stroke_width NoneValueType | float | None

The stroke width of the group layout

None
group_text_anchor TextAnchor | None

The text anchor of the group layout

None
group_transform NoneValueType | tuple[Transformation] | None

The transform of the group layout

None
end_shorten float

The length the end of the arc will be shorten by

0.0
fill NoneValueType | Color | None

The fill color of the arc

None
filter NoneValueType | Filter | None

The fill filter of the arc

None
path_fill NoneValueType | Color | None

The path fill color of the arc

<momapy.drawing.NoneValueType object at 0x7fbe12e88d70>
path_filter NoneValueType | Filter | None

The path filter of the arc

None
path_stroke NoneValueType | Color | None

The path stroke color of the arc

Color(red=0, green=0, blue=0, alpha=1.0)
path_stroke_dasharray NoneValueType | tuple[float, ...] | None

The path stroke dasharray of the arc

None
path_stroke_dashoffset NoneValueType | float | None

The path stroke dashoffset of the arc

None
path_stroke_width float | None

The path stroke width of the arc

1.25
path_transform NoneValueType | tuple[Transformation] | None

The path transform of the arc

None
stroke NoneValueType | Color | None

The stroke color of the arc

None
stroke_dasharray NoneValueType | tuple[float] | None

The stroke dasharray of the arc

None
stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the arc

None
stroke_width NoneValueType | float | None

The stroke width of the arc

None
segments tuple[Segment | QuadraticBezierCurve | CubicBezierCurve | EllipticalArc]

The path segments of the arc

<dynamic>
source LayoutElement | None

The source of the arc

None
start_shorten float

The length the start of the arc will be shorten by

0.0
target LayoutElement | None

The target of the arc

None
transform NoneValueType | tuple[Transformation] | None

The transform of the arc

None
arrowhead_fill NoneValueType | Color | None

The arrowhead fill color of the arc

Color(red=255, green=255, blue=255, alpha=1.0)
arrowhead_filter NoneValueType | Filter | None

The arrowhead filter of the arc

None
arrowhead_stroke NoneValueType | Color | None

The arrowhead stroke color of the arc

Color(red=0, green=0, blue=0, alpha=1.0)
arrowhead_stroke_dasharray NoneValueType | tuple[float, ...] | None

The arrowhead stroke dasharray of the arc

None
arrowhead_stroke_dashoffset NoneValueType | float | None

The arrowhead stroke dashoffset of the arc

None
arrowhead_stroke_width float | None

The arrowhead stroke width of the arc

1.25
arrowhead_transform NoneValueType | tuple[Transformation] | None

The arrowhead transform of the arc

None
arrowhead_height float
10.0
arrowhead_width float
10.0

Methods:

Name Description
anchor_point

Return an anchor point of the layout element

arrowhead_base

Return the arrowhead base anchor point of the single-headed arc

arrowhead_bbox

Return the bounding box of the single-headed arc arrowhead

arrowhead_border

Return the point at the intersection of the drawing elements of the single-headed arc arrowhead and the line going through the center of these drawing elements and the given point.

arrowhead_drawing_elements

Return the drawing elements of the single-headed arc arrowhead

arrowhead_length

Return the length of the single-headed arc arrowhead

arrowhead_tip

Return the arrowhead tip anchor point of the single-headed arc

bbox

Compute and return the bounding box of the group layout element

childless

Return a copy of the arc with no children

children

Return the children of the group layout.

contains

Return true if another layout element is a descendant of the layout element, false otherwise

descendants

Return the descendants of the layout element

drawing_elements

Return the drawing elements of the group layout.

end_point

Return the ending point of the arc

equals

Return true if the layout element is equal to another layout element, false otherwise

flattened

Return a list containing copy of the layout element with no children and all its descendants with no children

fraction

Return the position and angle on the arc at a given fraction (of the total arc length)

length

Return the total length of the arc path

own_bbox

Compute and return the bounding box of the self drawing element of the group layout

own_children

Return the self children of the arc

own_drawing_elements

Return the self drawing elements of the single-headed arc

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

path_drawing_elements

Return the drawing elements of the single-headed arc path

points

Return the points of the arc path

start_point

Return the starting point of the arc

to_geometry

Return a list of geometry primitives from the drawing elements.

anchor_point

anchor_point(anchor_name: str) -> Point

Return an anchor point of the layout element

Source code in src/momapy/core/elements.py
def anchor_point(self, anchor_name: str) -> momapy.geometry.Point:
    """Return an anchor point of the layout element"""
    return getattr(self, anchor_name)()

arrowhead_base

arrowhead_base() -> Point

Return the arrowhead base anchor point of the single-headed arc

Source code in src/momapy/core/layout.py
def arrowhead_base(self) -> momapy.geometry.Point:
    """Return the arrowhead base anchor point of the single-headed arc"""
    arrowhead_length = self.arrowhead_length()
    segment = self.segments[-1]
    segment_length = segment.length()
    if segment_length == 0:
        return self.arrowhead_tip() - (arrowhead_length, 0)
    fraction = 1 - (arrowhead_length + self.end_shorten) / segment_length
    return segment.get_position_at_fraction(fraction)

arrowhead_bbox

arrowhead_bbox() -> Bbox

Return the bounding box of the single-headed arc arrowhead

Source code in src/momapy/core/layout.py
def arrowhead_bbox(self) -> momapy.geometry.Bbox:
    """Return the bounding box of the single-headed arc arrowhead"""
    return momapy.drawing.get_drawing_elements_bbox(
        self.arrowhead_drawing_elements()
    )

arrowhead_border

arrowhead_border(point) -> Point

Return the point at the intersection of the drawing elements of the single-headed arc arrowhead and the line going through the center of these drawing elements and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def arrowhead_border(self, point) -> momapy.geometry.Point:
    """Return the point at the intersection of the drawing elements of the single-headed arc arrowhead and the line going through the center of these drawing elements and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """

    point = momapy.drawing.get_drawing_elements_border(
        self.arrowhead_drawing_elements(), point
    )
    if point is None:
        return self.arrowhead_tip()
    return point

arrowhead_drawing_elements

arrowhead_drawing_elements() -> list[DrawingElement]

Return the drawing elements of the single-headed arc arrowhead

Source code in src/momapy/core/layout.py
def arrowhead_drawing_elements(
    self,
) -> list[momapy.drawing.DrawingElement]:
    """Return the drawing elements of the single-headed arc arrowhead"""
    drawing_elements = self._arrowhead_border_drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}_arrowhead",
        elements=tuple(drawing_elements),
        fill=self.arrowhead_fill,
        filter=self.arrowhead_filter,
        id_=f"{self.id_}_arrowhead",
        stroke=self.arrowhead_stroke,
        stroke_dasharray=self.arrowhead_stroke_dasharray,
        stroke_dashoffset=self.arrowhead_stroke_dashoffset,
        stroke_width=self.arrowhead_stroke_width,
        transform=self.arrowhead_transform,
    )
    transformation = self._get_arrowhead_transformation()
    group = group.transformed(transformation)
    return [group]

arrowhead_length

arrowhead_length() -> float

Return the length of the single-headed arc arrowhead

Source code in src/momapy/core/layout.py
def arrowhead_length(self) -> float:
    """Return the length of the single-headed arc arrowhead"""
    bbox = momapy.drawing.get_drawing_elements_bbox(
        self._arrowhead_border_drawing_elements()
    )
    if math.isnan(bbox.width):
        return 0.0
    return bbox.east().x

arrowhead_tip

arrowhead_tip() -> Point

Return the arrowhead tip anchor point of the single-headed arc

Source code in src/momapy/core/layout.py
def arrowhead_tip(self) -> momapy.geometry.Point:
    """Return the arrowhead tip anchor point of the single-headed arc"""
    segment = self.segments[-1]
    segment_length = segment.length()
    if segment_length == 0:
        return segment.p2
    fraction = 1 - self.end_shorten / segment_length
    return segment.get_position_at_fraction(fraction)

bbox

bbox() -> Bbox

Compute and return the bounding box of the group layout element

Source code in src/momapy/core/layout.py
def bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the group layout element"""
    own_bbox = self.own_bbox()
    bboxes = [child.bbox() for child in self.children()]
    min_x = own_bbox.north_west().x
    min_y = own_bbox.north_west().y
    max_x = own_bbox.south_east().x
    max_y = own_bbox.south_east().y
    for bbox in bboxes:
        if bbox.north_west().x < min_x:
            min_x = bbox.north_west().x
        if bbox.north_west().y < min_y:
            min_y = bbox.north_west().y
        if bbox.south_east().x > max_x:
            max_x = bbox.south_east().x
        if bbox.south_east().y > max_y:
            max_y = bbox.south_east().y
    bbox = momapy.geometry.Bbox(
        momapy.geometry.Point(min_x / 2 + max_x / 2, min_y / 2 + max_y / 2),
        max_x - min_x,
        max_y - min_y,
    )
    return bbox

childless

childless() -> Self

Return a copy of the arc with no children

Source code in src/momapy/core/layout.py
def childless(self) -> typing_extensions.Self:
    """Return a copy of the arc with no children"""
    return dataclasses.replace(self, layout_elements=tuple([]))

children

children() -> list[LayoutElement]

Return the children of the group layout. These are the self children of the group layout (returned by the own_children method) and the other children of the group layout (given by the layout_elements attribute)

Source code in src/momapy/core/layout.py
def children(self) -> list[LayoutElement]:
    """Return the children of the group layout.
    These are the self children of the group layout (returned by the `own_children` method) and the other children of the group layout (given by the `layout_elements` attribute)
    """
    return self.own_children() + list(self.layout_elements)

contains

contains(other: LayoutElement) -> bool

Return true if another layout element is a descendant of the layout element, false otherwise

Source code in src/momapy/core/elements.py
def contains(self, other: "LayoutElement") -> bool:
    """Return `true` if another layout element is a descendant of the layout element, `false` otherwise"""
    return other in self.descendants()

descendants

descendants() -> list[LayoutElement]

Return the descendants of the layout element

Source code in src/momapy/core/elements.py
def descendants(self) -> list["LayoutElement"]:
    """Return the descendants of the layout element"""
    descendants = []
    for child in self.children():
        descendants.append(child)
        descendants += child.descendants()
    return descendants

drawing_elements

drawing_elements() -> list[DrawingElement]

Return the drawing elements of the group layout. The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children

Source code in src/momapy/core/layout.py
def drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the drawing elements of the group layout.
    The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children
    """
    drawing_elements = self.own_drawing_elements()
    for child in self.children():
        if child is not None:
            drawing_elements += child.drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}",
        elements=tuple(drawing_elements),
        id_=f"{self.id_}",
        fill=self.group_fill,
        fill_rule=self.group_fill_rule,
        filter=self.group_filter,
        font_family=self.group_font_family,
        font_size=self.group_font_size,
        font_style=self.group_font_style,
        font_weight=self.group_font_weight,
        stroke=self.group_stroke,
        stroke_dasharray=self.group_stroke_dasharray,
        stroke_dashoffset=self.group_stroke_dashoffset,
        stroke_width=self.group_stroke_width,
        text_anchor=self.group_text_anchor,
        transform=self.group_transform,
    )
    return [group]

end_point

end_point() -> Point

Return the ending point of the arc

Source code in src/momapy/core/layout.py
def end_point(self) -> momapy.geometry.Point:
    """Return the ending point of the arc"""
    return self.points()[-1]

equals

equals(other: LayoutElement, flattened: bool = False, unordered: bool = False) -> bool

Return true if the layout element is equal to another layout element, false otherwise

Source code in src/momapy/core/elements.py
def equals(
    self, other: "LayoutElement", flattened: bool = False, unordered: bool = False
) -> bool:
    """Return `true` if the layout element is equal to another layout element, `false` otherwise"""
    if type(self) is type(other):
        if not flattened:
            return self == other
        else:
            if not unordered:
                return self.flattened() == other.flattened()
            else:
                return set(self.flattened()) == set(other.flattened())
    return False

flattened

flattened() -> list[LayoutElement]

Return a list containing copy of the layout element with no children and all its descendants with no children

Source code in src/momapy/core/elements.py
def flattened(self) -> list["LayoutElement"]:
    """Return a list containing copy of the layout element with no children and all its descendants with no children"""
    flattened = [self.childless()]
    for child in self.children():
        flattened += child.flattened()
    return flattened

fraction

fraction(fraction: float) -> tuple[Point, float]

Return the position and angle on the arc at a given fraction (of the total arc length)

Source code in src/momapy/core/layout.py
def fraction(self, fraction: float) -> tuple[momapy.geometry.Point, float]:
    """Return the position and angle on the arc at a given fraction (of the total arc length)"""
    current_length = 0
    length_to_reach = fraction * self.length()
    for segment in self.segments:
        current_length += segment.length()
        if current_length >= length_to_reach:
            break
    segment_start_length = current_length - segment.length()
    segment_fraction = (length_to_reach - segment_start_length) / segment.length()
    position, angle = segment.get_position_and_angle_at_fraction(segment_fraction)
    return position, angle

length

length()

Return the total length of the arc path

Source code in src/momapy/core/layout.py
def length(self):
    """Return the total length of the arc path"""
    return sum([segment.length() for segment in self.segments])

own_bbox

own_bbox() -> Bbox

Compute and return the bounding box of the self drawing element of the group layout

Source code in src/momapy/core/layout.py
def own_bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the self drawing element of the group layout"""
    primitives = self.own_to_geometry()
    if not primitives:
        return momapy.geometry.Bbox(momapy.geometry.Point(0, 0), 0, 0)
    bboxes = [p.bbox() for p in primitives]
    return momapy.geometry.Bbox.union(bboxes)

own_children

own_children() -> list[LayoutElement]

Return the self children of the arc

Source code in src/momapy/core/layout.py
def own_children(self) -> list[LayoutElement]:
    """Return the self children of the arc"""
    return []

own_drawing_elements

own_drawing_elements() -> list[DrawingElement]

Return the self drawing elements of the single-headed arc

Source code in src/momapy/core/layout.py
def own_drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the self drawing elements of the single-headed arc"""
    drawing_elements = (
        self.path_drawing_elements() + self.arrowhead_drawing_elements()
    )
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}_own",
        elements=tuple(drawing_elements),
        fill=self.fill,
        filter=self.filter,
        id_=f"{self.id_}_own",
        stroke=self.stroke,
        stroke_dasharray=self.stroke_dasharray,
        stroke_dashoffset=self.stroke_dashoffset,
        stroke_width=self.stroke_width,
        transform=self.transform,
    )
    return [group]

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

Source code in src/momapy/core/layout.py
def own_to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the self drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

path_drawing_elements

path_drawing_elements() -> list[Path]

Return the drawing elements of the single-headed arc path

Source code in src/momapy/core/layout.py
def path_drawing_elements(self) -> list[momapy.drawing.Path]:
    """Return the drawing elements of the single-headed arc path"""
    arrowhead_length = self.arrowhead_length()
    if len(self.segments) == 1:
        segment = (
            self.segments[0]
            .shortened(self.start_shorten, "start")
            .shortened(self.end_shorten + arrowhead_length, "end")
        )
        actions = [
            momapy.drawing.MoveTo(segment.p1),
            self._make_path_action_from_segment(segment),
        ]
    else:
        first_segment = self.segments[0].shortened(self.start_shorten, "start")
        last_segment = self.segments[-1].shortened(
            self.end_shorten + arrowhead_length, "end"
        )
        actions = [
            momapy.drawing.MoveTo(first_segment.p1),
            self._make_path_action_from_segment(first_segment),
        ]
        for segment in self.segments[1:-1]:
            action = self._make_path_action_from_segment(segment)
            actions.append(action)
        actions.append(self._make_path_action_from_segment(last_segment))
    path = momapy.drawing.Path(
        actions=tuple(actions),
        class_=f"{type(self).__name__}_path",
        fill=self.path_fill,
        filter=self.path_filter,
        id_=f"{self.id_}_path",
        stroke=self.path_stroke,
        stroke_dasharray=self.path_stroke_dasharray,
        stroke_dashoffset=self.path_stroke_dashoffset,
        stroke_width=self.path_stroke_width,
        transform=self.path_transform,
    )
    return [path]

points

points() -> list[Point]

Return the points of the arc path

Source code in src/momapy/core/layout.py
def points(self) -> list[momapy.geometry.Point]:
    """Return the points of the arc path"""
    points = []
    for segment in self.segments:
        points.append(segment.p1)
    points.append(segment.p2)
    return points

start_point

start_point() -> Point

Return the starting point of the arc

Source code in src/momapy/core/layout.py
def start_point(self) -> momapy.geometry.Point:
    """Return the starting point of the arc"""
    return self.points()[0]

to_geometry

Return a list of geometry primitives from the drawing elements.

Source code in src/momapy/core/elements.py
def to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

SBGNAFLayout dataclass

SBGNAFLayout(*, id_: str = make_uuid4_as_str(), layout_elements: tuple[LayoutElement] = tuple(), group_fill: NoneValueType | Color | None = None, group_fill_rule: FillRule | None = None, group_filter: NoneValueType | Filter | None = None, group_font_family: str | None = None, group_font_size: float | None = None, group_font_style: FontStyle | None = None, group_font_weight: FontWeight | float | None = None, group_stroke: NoneValueType | Color | None = None, group_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, group_stroke_dashoffset: NoneValueType | float | None = None, group_stroke_width: NoneValueType | float | None = None, group_text_anchor: TextAnchor | None = None, group_transform: NoneValueType | tuple[Transformation] | None = None, fill: NoneValueType | Color | None = white, filter: NoneValueType | Filter | None = None, height: float, label: TextLayout | None = None, position: Point, stroke: NoneValueType | Color | None = None, stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, stroke_dashoffset: NoneValueType | float | None = None, stroke_width: NoneValueType | float | None = None, transform: NoneValueType | tuple[Transformation] | None = None, width: float)

Bases: SBGNLayout

SBGN-AF layout.

Represents the visual layout of an SBGN-AF model.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'308b6691-2d28-4eb3-8fbc-7454c18a8d7e'
layout_elements tuple[LayoutElement]

The sub-layout elements of the group layout. These are part of the children of the group layout

<dynamic>
group_fill NoneValueType | Color | None

The fill color of the group layout

None
group_fill_rule FillRule | None

The fill rule of the group layout

None
group_filter NoneValueType | Filter | None

The filter of the group layout

None
group_font_family str | None

The font family of the group layout

None
group_font_size float | None

The font size of the group layout

None
group_font_style FontStyle | None

The font style of the group layout

None
group_font_weight FontWeight | float | None

The font weight of the group layout

None
group_stroke NoneValueType | Color | None

The stroke color of the group layout

None
group_stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the group layout

None
group_stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the group layout

None
group_stroke_width NoneValueType | float | None

The stroke width of the group layout

None
group_text_anchor TextAnchor | None

The text anchor of the group layout

None
group_transform NoneValueType | tuple[Transformation] | None

The transform of the group layout

None
fill NoneValueType | Color | None

The fill color of the node

Color(red=255, green=255, blue=255, alpha=1.0)
filter NoneValueType | Filter | None

The filter of the node

None
height float

The height of the node

required
label TextLayout | None

The label of the node

None
position Point

The position of the node

required
stroke NoneValueType | Color | None

The stroke color of the node

None
stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the node

None
stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the node

None
stroke_width NoneValueType | float | None

The stroke width of the node

None
transform NoneValueType | tuple[Transformation] | None

The transform of the node

None
width float

The width width of the node

required

Methods:

Name Description
anchor_point

Return an anchor point of the layout element

angle

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

bbox

Compute and return the bounding box of the group layout element

border

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.

center

Return the center anchor of the node

childless

Return a copy of the node with no children

children

Return the children of the group layout.

contains

Return true if another layout element is a descendant of the layout element, false otherwise

descendants

Return the descendants of the layout element

drawing_elements

Return the drawing elements of the group layout.

east

Return the east anchor of the node

east_north_east

Return the east north east anchor of the node

east_south_east

Return the east south east west anchor of the node

equals

Return true if the layout element is equal to another layout element, false otherwise

flattened

Return a list containing copy of the layout element with no children and all its descendants with no children

is_sublayout

Return true if another given layout is a sublayout of the layout, false otherwise

label_center

Return the label center anchor of the node

north

Return the north anchor of the node

north_east

Return the north east anchor of the node

north_north_east

Return the north north east anchor of the node

north_north_west

Return the north north west anchor of the node

north_west

Return the north west anchor of the node

own_angle

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

own_bbox

Compute and return the bounding box of the self drawing element of the group layout

own_border

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.

own_children

Return the self children of the node. A node has unique child that is its label

own_drawing_elements

Return the node's own drawing elements

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

size

Return the size of the node

south

Return the south anchor of the node

south_east

Return the south east anchor of the node

south_south_east

Return the south south east anchor of the node

south_south_west

Return the south south west anchor of the node

south_west

Return the south west anchor of the node

to_geometry

Return a list of geometry primitives from the drawing elements.

west

Return the west anchor of the node

west_north_west

Return the west north west anchor of the node

west_south_west

Return the west south west anchor of the node

Attributes:

Name Type Description
x float

Return the x coordinate of the node

y float

Return the y coordinate of the node

anchor_point

anchor_point(anchor_name: str) -> Point

Return an anchor point of the layout element

Source code in src/momapy/core/elements.py
def anchor_point(self, anchor_name: str) -> momapy.geometry.Point:
    """Return an anchor point of the layout element"""
    return getattr(self, anchor_name)()

angle

angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

bbox

bbox() -> Bbox

Compute and return the bounding box of the group layout element

Source code in src/momapy/core/layout.py
def bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the group layout element"""
    own_bbox = self.own_bbox()
    bboxes = [child.bbox() for child in self.children()]
    min_x = own_bbox.north_west().x
    min_y = own_bbox.north_west().y
    max_x = own_bbox.south_east().x
    max_y = own_bbox.south_east().y
    for bbox in bboxes:
        if bbox.north_west().x < min_x:
            min_x = bbox.north_west().x
        if bbox.north_west().y < min_y:
            min_y = bbox.north_west().y
        if bbox.south_east().x > max_x:
            max_x = bbox.south_east().x
        if bbox.south_east().y > max_y:
            max_y = bbox.south_east().y
    bbox = momapy.geometry.Bbox(
        momapy.geometry.Point(min_x / 2 + max_x / 2, min_y / 2 + max_y / 2),
        max_x - min_x,
        max_y - min_y,
    )
    return bbox

border

border(point: Point) -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.drawing_elements(),
        point=point,
        center=self.center(),
    )

center

center() -> Point

Return the center anchor of the node

Source code in src/momapy/core/layout.py
def center(self) -> momapy.geometry.Point:
    """Return the center anchor of the node"""
    return self.position

childless

childless() -> Self

Return a copy of the node with no children

Source code in src/momapy/core/layout.py
def childless(self) -> typing_extensions.Self:
    """Return a copy of the node with no children"""
    return dataclasses.replace(self, label=None, layout_elements=tuple([]))

children

children() -> list[LayoutElement]

Return the children of the group layout. These are the self children of the group layout (returned by the own_children method) and the other children of the group layout (given by the layout_elements attribute)

Source code in src/momapy/core/layout.py
def children(self) -> list[LayoutElement]:
    """Return the children of the group layout.
    These are the self children of the group layout (returned by the `own_children` method) and the other children of the group layout (given by the `layout_elements` attribute)
    """
    return self.own_children() + list(self.layout_elements)

contains

contains(other: LayoutElement) -> bool

Return true if another layout element is a descendant of the layout element, false otherwise

Source code in src/momapy/core/elements.py
def contains(self, other: "LayoutElement") -> bool:
    """Return `true` if another layout element is a descendant of the layout element, `false` otherwise"""
    return other in self.descendants()

descendants

descendants() -> list[LayoutElement]

Return the descendants of the layout element

Source code in src/momapy/core/elements.py
def descendants(self) -> list["LayoutElement"]:
    """Return the descendants of the layout element"""
    descendants = []
    for child in self.children():
        descendants.append(child)
        descendants += child.descendants()
    return descendants

drawing_elements

drawing_elements() -> list[DrawingElement]

Return the drawing elements of the group layout. The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children

Source code in src/momapy/core/layout.py
def drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the drawing elements of the group layout.
    The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children
    """
    drawing_elements = self.own_drawing_elements()
    for child in self.children():
        if child is not None:
            drawing_elements += child.drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}",
        elements=tuple(drawing_elements),
        id_=f"{self.id_}",
        fill=self.group_fill,
        fill_rule=self.group_fill_rule,
        filter=self.group_filter,
        font_family=self.group_font_family,
        font_size=self.group_font_size,
        font_style=self.group_font_style,
        font_weight=self.group_font_weight,
        stroke=self.group_stroke,
        stroke_dasharray=self.group_stroke_dasharray,
        stroke_dashoffset=self.group_stroke_dashoffset,
        stroke_width=self.group_stroke_width,
        text_anchor=self.group_text_anchor,
        transform=self.group_transform,
    )
    return [group]

east

east() -> Point

Return the east anchor of the node

Source code in src/momapy/core/layout.py
def east(self) -> momapy.geometry.Point:
    """Return the east anchor of the node"""
    return self.own_angle(0)

east_north_east

east_north_east() -> Point

Return the east north east anchor of the node

Source code in src/momapy/core/layout.py
def east_north_east(self) -> momapy.geometry.Point:
    """Return the east north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

east_south_east

east_south_east() -> Point

Return the east south east west anchor of the node

Source code in src/momapy/core/layout.py
def east_south_east(self) -> momapy.geometry.Point:
    """Return the east south east west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

equals

equals(other: LayoutElement, flattened: bool = False, unordered: bool = False) -> bool

Return true if the layout element is equal to another layout element, false otherwise

Source code in src/momapy/core/elements.py
def equals(
    self, other: "LayoutElement", flattened: bool = False, unordered: bool = False
) -> bool:
    """Return `true` if the layout element is equal to another layout element, `false` otherwise"""
    if type(self) is type(other):
        if not flattened:
            return self == other
        else:
            if not unordered:
                return self.flattened() == other.flattened()
            else:
                return set(self.flattened()) == set(other.flattened())
    return False

flattened

flattened() -> list[LayoutElement]

Return a list containing copy of the layout element with no children and all its descendants with no children

Source code in src/momapy/core/elements.py
def flattened(self) -> list["LayoutElement"]:
    """Return a list containing copy of the layout element with no children and all its descendants with no children"""
    flattened = [self.childless()]
    for child in self.children():
        flattened += child.flattened()
    return flattened

is_sublayout

is_sublayout(other, flattened=False, unordered=False)

Return true if another given layout is a sublayout of the layout, false otherwise

Source code in src/momapy/core/layout.py
def is_sublayout(self, other, flattened=False, unordered=False):
    """Return `true` if another given layout is a sublayout of the layout, `false` otherwise"""

    def _is_sublist(list1, list2, unordered=False) -> bool:
        if not unordered:
            i = 0
            for elem1 in list1:
                elem2 = list2[i]
                while elem2 != elem1 and i < len(list2) - 1:
                    i += 1
                    elem2 = list2[i]
                if not elem2 == elem1:
                    return False
                i += 1
        else:
            dlist1 = collections.defaultdict(int)
            dlist2 = collections.defaultdict(int)
            for elem1 in list1:
                dlist1[elem1] += 1
            for elem2 in list2:
                dlist2[elem2] += 1
            for elem in dlist1:
                if dlist1[elem] > dlist2[elem]:
                    return False
        return True

    if self.childless() != other.childless():
        return False
    if flattened:
        return _is_sublist(
            self.flattened()[1:],
            other.flattened()[1:],
            unordered=unordered,
        )
    return _is_sublist(self.children(), other.children(), unordered=unordered)

label_center

label_center() -> Point

Return the label center anchor of the node

Source code in src/momapy/core/layout.py
def label_center(self) -> momapy.geometry.Point:
    """Return the label center anchor of the node"""
    return self.position

north

north() -> Point

Return the north anchor of the node

Source code in src/momapy/core/layout.py
def north(self) -> momapy.geometry.Point:
    """Return the north anchor of the node"""
    return self.own_angle(90)

north_east

north_east() -> Point

Return the north east anchor of the node

Source code in src/momapy/core/layout.py
def north_east(self) -> momapy.geometry.Point:
    """Return the north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_east

north_north_east() -> Point

Return the north north east anchor of the node

Source code in src/momapy/core/layout.py
def north_north_east(self) -> momapy.geometry.Point:
    """Return the north north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_west

north_north_west() -> Point

Return the north north west anchor of the node

Source code in src/momapy/core/layout.py
def north_north_west(self) -> momapy.geometry.Point:
    """Return the north north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_west

north_west() -> Point

Return the north west anchor of the node

Source code in src/momapy/core/layout.py
def north_west(self) -> momapy.geometry.Point:
    """Return the north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

own_angle

own_angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def own_angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.own_drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

own_bbox

own_bbox() -> Bbox

Compute and return the bounding box of the self drawing element of the group layout

Source code in src/momapy/core/layout.py
def own_bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the self drawing element of the group layout"""
    primitives = self.own_to_geometry()
    if not primitives:
        return momapy.geometry.Bbox(momapy.geometry.Point(0, 0), 0, 0)
    bboxes = [p.bbox() for p in primitives]
    return momapy.geometry.Bbox.union(bboxes)

own_border

own_border(point: Point) -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def own_border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.own_drawing_elements(),
        point=point,
        center=self.center(),
    )

own_children

own_children() -> list[LayoutElement]

Return the self children of the node. A node has unique child that is its label

Source code in src/momapy/core/layout.py
def own_children(self) -> list[LayoutElement]:
    """Return the self children of the node. A node has unique child that is its label"""
    if self.label is not None:
        return [self.label]
    return []

own_drawing_elements

own_drawing_elements() -> list[DrawingElement]

Return the node's own drawing elements

Source code in src/momapy/core/layout.py
def own_drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the node's own drawing elements"""
    drawing_elements = self._border_drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}_own",
        elements=tuple(drawing_elements),
        fill=self.fill,
        filter=self.filter,
        id_=f"{self.id_}_own",
        stroke=self.stroke,
        stroke_dasharray=self.stroke_dasharray,
        stroke_dashoffset=self.stroke_dashoffset,
        stroke_width=self.stroke_width,
        transform=self.transform,
    )
    return [group]

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

Source code in src/momapy/core/layout.py
def own_to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the self drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

size

size() -> tuple[float, float]

Return the size of the node

Source code in src/momapy/core/layout.py
def size(self) -> tuple[float, float]:
    """Return the size of the node"""
    return (self.width, self.height)

south

south() -> Point

Return the south anchor of the node

Source code in src/momapy/core/layout.py
def south(self) -> momapy.geometry.Point:
    """Return the south anchor of the node"""
    return self.own_angle(270)

south_east

south_east() -> Point

Return the south east anchor of the node

Source code in src/momapy/core/layout.py
def south_east(self) -> momapy.geometry.Point:
    """Return the south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_east

south_south_east() -> Point

Return the south south east anchor of the node

Source code in src/momapy/core/layout.py
def south_south_east(self) -> momapy.geometry.Point:
    """Return the south south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_west

south_south_west() -> Point

Return the south south west anchor of the node

Source code in src/momapy/core/layout.py
def south_south_west(self) -> momapy.geometry.Point:
    """Return the south south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_west

south_west() -> Point

Return the south west anchor of the node

Source code in src/momapy/core/layout.py
def south_west(self) -> momapy.geometry.Point:
    """Return the south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

to_geometry

Return a list of geometry primitives from the drawing elements.

Source code in src/momapy/core/elements.py
def to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

west

west() -> Point

Return the west anchor of the node

Source code in src/momapy/core/layout.py
def west(self) -> momapy.geometry.Point:
    """Return the west anchor of the node"""
    return self.own_angle(180)

west_north_west

west_north_west() -> Point

Return the west north west anchor of the node

Source code in src/momapy/core/layout.py
def west_north_west(self) -> momapy.geometry.Point:
    """Return the west north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

west_south_west

west_south_west() -> Point

Return the west south west anchor of the node

Source code in src/momapy/core/layout.py
def west_south_west(self) -> momapy.geometry.Point:
    """Return the west south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

x property

x: float

Return the x coordinate of the node

y property

y: float

Return the y coordinate of the node

SBGNAFMap dataclass

SBGNAFMap(*, id_: str = make_uuid4_as_str(), model: SBGNAFModel | None = None, layout: SBGNAFLayout | None = None, layout_model_mapping: LayoutModelMapping | None = None)

Bases: SBGNMap

SBGN-AF map.

Represents a complete SBGN Activity Flow map with model and layout.

Attributes:

Name Type Description

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'99cb6672-aa75-41a2-9f35-a1092989067b'
model SBGNAFModel | None

The model of the map

None
layout SBGNAFLayout | None

The layout of the map

None
layout_model_mapping LayoutModelMapping | None

The layout model mapping of the map

None

Methods:

Name Description
get_mapping

Return the layout elements mapped to the given model element

is_submap

Return true if another given map is a submap of the Map, false otherwise

get_mapping

get_mapping(map_element: MapElement)

Return the layout elements mapped to the given model element

Source code in src/momapy/core/map.py
def get_mapping(
    self,
    map_element: "MapElement",
):
    """Return the layout elements mapped to the given model element"""
    return self.layout_model_mapping.get_mapping(map_element)

is_submap

is_submap(other)

Return true if another given map is a submap of the Map, false otherwise

Source code in src/momapy/core/map.py
def is_submap(self, other):
    """Return `true` if another given map is a submap of the `Map`, `false` otherwise"""
    if (
        self.model is None
        or self.layout is None
        or self.layout_model_mapping is None
    ):
        return False
    return (
        self.model.is_submodel(other.model)
        and self.layout.is_sublayout(other.layout)
        and self.layout_model_mapping.is_submapping(other.layout_model_mapping)
    )

SBGNAFModel dataclass

SBGNAFModel(*, id_: str = make_uuid4_as_str(), activities: frozenset[Activity] = frozenset(), compartments: frozenset[Compartment] = frozenset(), influences: frozenset[Influence] = frozenset(), logical_operators: frozenset[LogicalOperator] = frozenset(), submaps: frozenset[Submap] = frozenset(), tags: frozenset[Tag] = frozenset())

Bases: SBGNModel

SBGN-AF model.

Represents a complete SBGN Activity Flow model.

Attributes:

Name Type Description

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'1a038c0a-9a3b-48c6-ae18-9f64fb358853'
activities frozenset[Activity]

Build an immutable unordered collection of unique elements.

<dynamic>
compartments frozenset[Compartment]

Build an immutable unordered collection of unique elements.

<dynamic>
influences frozenset[Influence]

Build an immutable unordered collection of unique elements.

<dynamic>
logical_operators frozenset[LogicalOperator]

Build an immutable unordered collection of unique elements.

<dynamic>
submaps frozenset[Submap]

Build an immutable unordered collection of unique elements.

<dynamic>
tags frozenset[Tag]

Build an immutable unordered collection of unique elements.

<dynamic>

Methods:

Name Description
descendants

Return every ModelElement reachable from this Model.

is_submodel

Check if another model is a submodel of this model.

descendants

descendants() -> list[ModelElement]

Return every ModelElement reachable from this Model.

Walks scalar ModelElement fields and frozenset/tuple containers of the Model, deduplicating by object identity. The Model itself is not a ModelElement and is not included.

Returns:

Type Description
list[ModelElement]

The list of reachable ModelElement instances in visit

list[ModelElement]

order.

Source code in src/momapy/core/model.py
def descendants(self) -> list[ModelElement]:
    """Return every `ModelElement` reachable from this `Model`.

    Walks scalar `ModelElement` fields and `frozenset`/`tuple`
    containers of the `Model`, deduplicating by object identity.
    The `Model` itself is not a `ModelElement` and is not included.

    Returns:
        The list of reachable `ModelElement` instances in visit
        order.
    """
    seen: set[int] = set()
    result: list[ModelElement] = []
    for field in dataclasses.fields(type(self)):
        _walk_model_graph(getattr(self, field.name), seen, result)
    return result

is_submodel

is_submodel(other: SBGNAFModel) -> bool

Check if another model is a submodel of this model.

Parameters:

Name Type Description Default
other SBGNAFModel

Another SBGN-AF model to compare against.

required

Returns:

Type Description
bool

True if other is a submodel of this model, False otherwise.

Source code in src/momapy/sbgn/af/model.py
def is_submodel(self, other: "SBGNAFModel") -> bool:
    """Check if another model is a submodel of this model.

    Args:
        other: Another SBGN-AF model to compare against.

    Returns:
        True if other is a submodel of this model, False otherwise.
    """
    return (
        self.activities.issubset(other.activities)
        and self.compartments.issubset(other.compartments)
        and self.influences.issubset(other.influences)
        and self.logical_operators.issubset(other.logical_operators)
        and self.submaps.issubset(other.submaps)
        and self.tags.issubset(other.tags)
    )

SimpleChemicalUnitOfInformation dataclass

SimpleChemicalUnitOfInformation(*, id_: str = make_uuid4_as_str(), label: str | None = None)

Bases: UnitOfInformation

Unit of information typing a biological activity as a simple chemical.

Rendered as an SBGN simple chemical glyph embedded in the activity node.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'481b0540-398b-452d-9590-6e09df6510e9'
label str | None
None

Methods:

Name Description
descendants

Return every ModelElement reachable from self, excluding self.

descendants

descendants() -> list[ModelElement]

Return every ModelElement reachable from self, excluding self.

Walks scalar ModelElement fields and frozenset/tuple containers, deduplicating by object identity.

Returns:

Type Description
list[ModelElement]

The list of reachable ModelElement instances in visit

list[ModelElement]

order, without self.

Source code in src/momapy/core/elements.py
def descendants(self) -> list["ModelElement"]:
    """Return every `ModelElement` reachable from `self`, excluding `self`.

    Walks scalar `ModelElement` fields and `frozenset`/`tuple`
    containers, deduplicating by object identity.

    Returns:
        The list of reachable `ModelElement` instances in visit
        order, without `self`.
    """
    seen: set[int] = {id(self)}
    result: list[ModelElement] = []
    if dataclasses.is_dataclass(self):
        for field in dataclasses.fields(type(self)):
            _walk_model_graph(getattr(self, field.name), seen, result)
    return result

SimpleChemicalUnitOfInformationLayout dataclass

SimpleChemicalUnitOfInformationLayout(fill: NoneValueType | Color | None = white, stroke: NoneValueType | Color | None = black, stroke_width: float | None = 1.25, *, id_: str = make_uuid4_as_str(), layout_elements: tuple[LayoutElement] = tuple(), group_fill: NoneValueType | Color | None = None, group_fill_rule: FillRule | None = None, group_filter: NoneValueType | Filter | None = None, group_font_family: str | None = None, group_font_size: float | None = None, group_font_style: FontStyle | None = None, group_font_weight: FontWeight | float | None = None, group_stroke: NoneValueType | Color | None = None, group_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, group_stroke_dashoffset: NoneValueType | float | None = None, group_stroke_width: NoneValueType | float | None = None, group_text_anchor: TextAnchor | None = None, group_transform: NoneValueType | tuple[Transformation] | None = None, filter: NoneValueType | Filter | None = None, height: float = 12.0, label: TextLayout | None = None, position: Point, stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, stroke_dashoffset: NoneValueType | float | None = None, transform: NoneValueType | tuple[Transformation] | None = None, width: float = 12.0)

Bases: _SimpleMixin, SBGNNode

Layout for simple chemical units of information.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'f5fc51e7-bb7b-4c11-942b-b76dbb5829c0'
layout_elements tuple[LayoutElement]

The sub-layout elements of the group layout. These are part of the children of the group layout

<dynamic>
group_fill NoneValueType | Color | None

The fill color of the group layout

None
group_fill_rule FillRule | None

The fill rule of the group layout

None
group_filter NoneValueType | Filter | None

The filter of the group layout

None
group_font_family str | None

The font family of the group layout

None
group_font_size float | None

The font size of the group layout

None
group_font_style FontStyle | None

The font style of the group layout

None
group_font_weight FontWeight | float | None

The font weight of the group layout

None
group_stroke NoneValueType | Color | None

The stroke color of the group layout

None
group_stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the group layout

None
group_stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the group layout

None
group_stroke_width NoneValueType | float | None

The stroke width of the group layout

None
group_text_anchor TextAnchor | None

The text anchor of the group layout

None
group_transform NoneValueType | tuple[Transformation] | None

The transform of the group layout

None
fill NoneValueType | Color | None

The fill color of the node

Color(red=255, green=255, blue=255, alpha=1.0)
filter NoneValueType | Filter | None

The filter of the node

None
height float

The height of the node

12.0
label TextLayout | None

The label of the node

None
position Point

The position of the node

required
stroke NoneValueType | Color | None

The stroke color of the node

Color(red=0, green=0, blue=0, alpha=1.0)
stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the node

None
stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the node

None
stroke_width float | None

The stroke width of the node

1.25
transform NoneValueType | tuple[Transformation] | None

The transform of the node

None
width float

The width width of the node

12.0

Methods:

Name Description
anchor_point

Return an anchor point of the layout element

angle

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

bbox

Compute and return the bounding box of the group layout element

border

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.

center

Return the center anchor of the node

childless

Return a copy of the node with no children

children

Return the children of the group layout.

contains

Return true if another layout element is a descendant of the layout element, false otherwise

descendants

Return the descendants of the layout element

drawing_elements

Return the drawing elements of the group layout.

east

Return the east anchor of the node

east_north_east

Return the east north east anchor of the node

east_south_east

Return the east south east west anchor of the node

equals

Return true if the layout element is equal to another layout element, false otherwise

flattened

Return a list containing copy of the layout element with no children and all its descendants with no children

label_center

Return the label center anchor of the node

north

Return the north anchor of the node

north_east

Return the north east anchor of the node

north_north_east

Return the north north east anchor of the node

north_north_west

Return the north north west anchor of the node

north_west

Return the north west anchor of the node

own_angle

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

own_bbox

Compute and return the bounding box of the self drawing element of the group layout

own_border

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.

own_children

Return the self children of the node. A node has unique child that is its label

own_drawing_elements

Return the node's own drawing elements

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

size

Return the size of the node

south

Return the south anchor of the node

south_east

Return the south east anchor of the node

south_south_east

Return the south south east anchor of the node

south_south_west

Return the south south west anchor of the node

south_west

Return the south west anchor of the node

to_geometry

Return a list of geometry primitives from the drawing elements.

west

Return the west anchor of the node

west_north_west

Return the west north west anchor of the node

west_south_west

Return the west south west anchor of the node

Attributes:

Name Type Description
x float

Return the x coordinate of the node

y float

Return the y coordinate of the node

anchor_point

anchor_point(anchor_name: str) -> Point

Return an anchor point of the layout element

Source code in src/momapy/core/elements.py
def anchor_point(self, anchor_name: str) -> momapy.geometry.Point:
    """Return an anchor point of the layout element"""
    return getattr(self, anchor_name)()

angle

angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

bbox

bbox() -> Bbox

Compute and return the bounding box of the group layout element

Source code in src/momapy/core/layout.py
def bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the group layout element"""
    own_bbox = self.own_bbox()
    bboxes = [child.bbox() for child in self.children()]
    min_x = own_bbox.north_west().x
    min_y = own_bbox.north_west().y
    max_x = own_bbox.south_east().x
    max_y = own_bbox.south_east().y
    for bbox in bboxes:
        if bbox.north_west().x < min_x:
            min_x = bbox.north_west().x
        if bbox.north_west().y < min_y:
            min_y = bbox.north_west().y
        if bbox.south_east().x > max_x:
            max_x = bbox.south_east().x
        if bbox.south_east().y > max_y:
            max_y = bbox.south_east().y
    bbox = momapy.geometry.Bbox(
        momapy.geometry.Point(min_x / 2 + max_x / 2, min_y / 2 + max_y / 2),
        max_x - min_x,
        max_y - min_y,
    )
    return bbox

border

border(point: Point) -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.drawing_elements(),
        point=point,
        center=self.center(),
    )

center

center() -> Point

Return the center anchor of the node

Source code in src/momapy/core/layout.py
def center(self) -> momapy.geometry.Point:
    """Return the center anchor of the node"""
    return self.position

childless

childless() -> Self

Return a copy of the node with no children

Source code in src/momapy/core/layout.py
def childless(self) -> typing_extensions.Self:
    """Return a copy of the node with no children"""
    return dataclasses.replace(self, label=None, layout_elements=tuple([]))

children

children() -> list[LayoutElement]

Return the children of the group layout. These are the self children of the group layout (returned by the own_children method) and the other children of the group layout (given by the layout_elements attribute)

Source code in src/momapy/core/layout.py
def children(self) -> list[LayoutElement]:
    """Return the children of the group layout.
    These are the self children of the group layout (returned by the `own_children` method) and the other children of the group layout (given by the `layout_elements` attribute)
    """
    return self.own_children() + list(self.layout_elements)

contains

contains(other: LayoutElement) -> bool

Return true if another layout element is a descendant of the layout element, false otherwise

Source code in src/momapy/core/elements.py
def contains(self, other: "LayoutElement") -> bool:
    """Return `true` if another layout element is a descendant of the layout element, `false` otherwise"""
    return other in self.descendants()

descendants

descendants() -> list[LayoutElement]

Return the descendants of the layout element

Source code in src/momapy/core/elements.py
def descendants(self) -> list["LayoutElement"]:
    """Return the descendants of the layout element"""
    descendants = []
    for child in self.children():
        descendants.append(child)
        descendants += child.descendants()
    return descendants

drawing_elements

drawing_elements() -> list[DrawingElement]

Return the drawing elements of the group layout. The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children

Source code in src/momapy/core/layout.py
def drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the drawing elements of the group layout.
    The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children
    """
    drawing_elements = self.own_drawing_elements()
    for child in self.children():
        if child is not None:
            drawing_elements += child.drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}",
        elements=tuple(drawing_elements),
        id_=f"{self.id_}",
        fill=self.group_fill,
        fill_rule=self.group_fill_rule,
        filter=self.group_filter,
        font_family=self.group_font_family,
        font_size=self.group_font_size,
        font_style=self.group_font_style,
        font_weight=self.group_font_weight,
        stroke=self.group_stroke,
        stroke_dasharray=self.group_stroke_dasharray,
        stroke_dashoffset=self.group_stroke_dashoffset,
        stroke_width=self.group_stroke_width,
        text_anchor=self.group_text_anchor,
        transform=self.group_transform,
    )
    return [group]

east

east() -> Point

Return the east anchor of the node

Source code in src/momapy/core/layout.py
def east(self) -> momapy.geometry.Point:
    """Return the east anchor of the node"""
    return self.own_angle(0)

east_north_east

east_north_east() -> Point

Return the east north east anchor of the node

Source code in src/momapy/core/layout.py
def east_north_east(self) -> momapy.geometry.Point:
    """Return the east north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

east_south_east

east_south_east() -> Point

Return the east south east west anchor of the node

Source code in src/momapy/core/layout.py
def east_south_east(self) -> momapy.geometry.Point:
    """Return the east south east west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

equals

equals(other: LayoutElement, flattened: bool = False, unordered: bool = False) -> bool

Return true if the layout element is equal to another layout element, false otherwise

Source code in src/momapy/core/elements.py
def equals(
    self, other: "LayoutElement", flattened: bool = False, unordered: bool = False
) -> bool:
    """Return `true` if the layout element is equal to another layout element, `false` otherwise"""
    if type(self) is type(other):
        if not flattened:
            return self == other
        else:
            if not unordered:
                return self.flattened() == other.flattened()
            else:
                return set(self.flattened()) == set(other.flattened())
    return False

flattened

flattened() -> list[LayoutElement]

Return a list containing copy of the layout element with no children and all its descendants with no children

Source code in src/momapy/core/elements.py
def flattened(self) -> list["LayoutElement"]:
    """Return a list containing copy of the layout element with no children and all its descendants with no children"""
    flattened = [self.childless()]
    for child in self.children():
        flattened += child.flattened()
    return flattened

label_center

label_center() -> Point

Return the label center anchor of the node

Source code in src/momapy/core/layout.py
def label_center(self) -> momapy.geometry.Point:
    """Return the label center anchor of the node"""
    return self.position

north

north() -> Point

Return the north anchor of the node

Source code in src/momapy/core/layout.py
def north(self) -> momapy.geometry.Point:
    """Return the north anchor of the node"""
    return self.own_angle(90)

north_east

north_east() -> Point

Return the north east anchor of the node

Source code in src/momapy/core/layout.py
def north_east(self) -> momapy.geometry.Point:
    """Return the north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_east

north_north_east() -> Point

Return the north north east anchor of the node

Source code in src/momapy/core/layout.py
def north_north_east(self) -> momapy.geometry.Point:
    """Return the north north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_west

north_north_west() -> Point

Return the north north west anchor of the node

Source code in src/momapy/core/layout.py
def north_north_west(self) -> momapy.geometry.Point:
    """Return the north north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_west

north_west() -> Point

Return the north west anchor of the node

Source code in src/momapy/core/layout.py
def north_west(self) -> momapy.geometry.Point:
    """Return the north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

own_angle

own_angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def own_angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.own_drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

own_bbox

own_bbox() -> Bbox

Compute and return the bounding box of the self drawing element of the group layout

Source code in src/momapy/core/layout.py
def own_bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the self drawing element of the group layout"""
    primitives = self.own_to_geometry()
    if not primitives:
        return momapy.geometry.Bbox(momapy.geometry.Point(0, 0), 0, 0)
    bboxes = [p.bbox() for p in primitives]
    return momapy.geometry.Bbox.union(bboxes)

own_border

own_border(point: Point) -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def own_border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.own_drawing_elements(),
        point=point,
        center=self.center(),
    )

own_children

own_children() -> list[LayoutElement]

Return the self children of the node. A node has unique child that is its label

Source code in src/momapy/core/layout.py
def own_children(self) -> list[LayoutElement]:
    """Return the self children of the node. A node has unique child that is its label"""
    if self.label is not None:
        return [self.label]
    return []

own_drawing_elements

own_drawing_elements() -> list[DrawingElement]

Return the node's own drawing elements

Source code in src/momapy/core/layout.py
def own_drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the node's own drawing elements"""
    drawing_elements = self._border_drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}_own",
        elements=tuple(drawing_elements),
        fill=self.fill,
        filter=self.filter,
        id_=f"{self.id_}_own",
        stroke=self.stroke,
        stroke_dasharray=self.stroke_dasharray,
        stroke_dashoffset=self.stroke_dashoffset,
        stroke_width=self.stroke_width,
        transform=self.transform,
    )
    return [group]

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

Source code in src/momapy/core/layout.py
def own_to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the self drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

size

size() -> tuple[float, float]

Return the size of the node

Source code in src/momapy/core/layout.py
def size(self) -> tuple[float, float]:
    """Return the size of the node"""
    return (self.width, self.height)

south

south() -> Point

Return the south anchor of the node

Source code in src/momapy/core/layout.py
def south(self) -> momapy.geometry.Point:
    """Return the south anchor of the node"""
    return self.own_angle(270)

south_east

south_east() -> Point

Return the south east anchor of the node

Source code in src/momapy/core/layout.py
def south_east(self) -> momapy.geometry.Point:
    """Return the south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_east

south_south_east() -> Point

Return the south south east anchor of the node

Source code in src/momapy/core/layout.py
def south_south_east(self) -> momapy.geometry.Point:
    """Return the south south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_west

south_south_west() -> Point

Return the south south west anchor of the node

Source code in src/momapy/core/layout.py
def south_south_west(self) -> momapy.geometry.Point:
    """Return the south south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_west

south_west() -> Point

Return the south west anchor of the node

Source code in src/momapy/core/layout.py
def south_west(self) -> momapy.geometry.Point:
    """Return the south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

to_geometry

Return a list of geometry primitives from the drawing elements.

Source code in src/momapy/core/elements.py
def to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

west

west() -> Point

Return the west anchor of the node

Source code in src/momapy/core/layout.py
def west(self) -> momapy.geometry.Point:
    """Return the west anchor of the node"""
    return self.own_angle(180)

west_north_west

west_north_west() -> Point

Return the west north west anchor of the node

Source code in src/momapy/core/layout.py
def west_north_west(self) -> momapy.geometry.Point:
    """Return the west north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

west_south_west

west_south_west() -> Point

Return the west south west anchor of the node

Source code in src/momapy/core/layout.py
def west_south_west(self) -> momapy.geometry.Point:
    """Return the west south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

x property

x: float

Return the x coordinate of the node

y property

y: float

Return the y coordinate of the node

Submap dataclass

Submap(*, id_: str = make_uuid4_as_str(), label: str | None = None, terminals: frozenset[Terminal] = frozenset())

Bases: SBGNModelElement

Submap element.

Submaps represent embedded or referenced sub-diagrams.

Attributes:

Name Type Description

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'41ef7cfe-317a-4723-9e41-b8df68bb9cb4'
label str | None
None
terminals frozenset[Terminal]

Build an immutable unordered collection of unique elements.

<dynamic>

Methods:

Name Description
descendants

Return every ModelElement reachable from self, excluding self.

descendants

descendants() -> list[ModelElement]

Return every ModelElement reachable from self, excluding self.

Walks scalar ModelElement fields and frozenset/tuple containers, deduplicating by object identity.

Returns:

Type Description
list[ModelElement]

The list of reachable ModelElement instances in visit

list[ModelElement]

order, without self.

Source code in src/momapy/core/elements.py
def descendants(self) -> list["ModelElement"]:
    """Return every `ModelElement` reachable from `self`, excluding `self`.

    Walks scalar `ModelElement` fields and `frozenset`/`tuple`
    containers, deduplicating by object identity.

    Returns:
        The list of reachable `ModelElement` instances in visit
        order, without `self`.
    """
    seen: set[int] = {id(self)}
    result: list[ModelElement] = []
    if dataclasses.is_dataclass(self):
        for field in dataclasses.fields(type(self)):
            _walk_model_graph(getattr(self, field.name), seen, result)
    return result

SubmapLayout dataclass

SubmapLayout(fill: NoneValueType | Color | None = white, stroke: NoneValueType | Color | None = black, stroke_width: float | None = 1.25, *, id_: str = make_uuid4_as_str(), layout_elements: tuple[LayoutElement] = tuple(), group_fill: NoneValueType | Color | None = None, group_fill_rule: FillRule | None = None, group_filter: NoneValueType | Filter | None = None, group_font_family: str | None = None, group_font_size: float | None = None, group_font_style: FontStyle | None = None, group_font_weight: FontWeight | float | None = None, group_stroke: NoneValueType | Color | None = None, group_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, group_stroke_dashoffset: NoneValueType | float | None = None, group_stroke_width: NoneValueType | float | None = None, group_text_anchor: TextAnchor | None = None, group_transform: NoneValueType | tuple[Transformation] | None = None, filter: NoneValueType | Filter | None = None, height: float = 80.0, label: TextLayout | None = None, position: Point, stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, stroke_dashoffset: NoneValueType | float | None = None, transform: NoneValueType | tuple[Transformation] | None = None, width: float = 80.0, border_stroke_width: float | None = 2.25)

Bases: _SimpleMixin, SBGNNode

Layout for submaps.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'f5f60a5a-b27e-4242-8644-f4ee8d95e361'
layout_elements tuple[LayoutElement]

The sub-layout elements of the group layout. These are part of the children of the group layout

<dynamic>
group_fill NoneValueType | Color | None

The fill color of the group layout

None
group_fill_rule FillRule | None

The fill rule of the group layout

None
group_filter NoneValueType | Filter | None

The filter of the group layout

None
group_font_family str | None

The font family of the group layout

None
group_font_size float | None

The font size of the group layout

None
group_font_style FontStyle | None

The font style of the group layout

None
group_font_weight FontWeight | float | None

The font weight of the group layout

None
group_stroke NoneValueType | Color | None

The stroke color of the group layout

None
group_stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the group layout

None
group_stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the group layout

None
group_stroke_width NoneValueType | float | None

The stroke width of the group layout

None
group_text_anchor TextAnchor | None

The text anchor of the group layout

None
group_transform NoneValueType | tuple[Transformation] | None

The transform of the group layout

None
fill NoneValueType | Color | None

The fill color of the node

Color(red=255, green=255, blue=255, alpha=1.0)
filter NoneValueType | Filter | None

The filter of the node

None
height float

The height of the node

80.0
label TextLayout | None

The label of the node

None
position Point

The position of the node

required
stroke NoneValueType | Color | None

The stroke color of the node

Color(red=0, green=0, blue=0, alpha=1.0)
stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the node

None
stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the node

None
stroke_width float | None

The stroke width of the node

1.25
transform NoneValueType | tuple[Transformation] | None

The transform of the node

None
width float

The width width of the node

80.0
border_stroke_width float | None
2.25

Methods:

Name Description
anchor_point

Return an anchor point of the layout element

angle

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

bbox

Compute and return the bounding box of the group layout element

border

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.

center

Return the center anchor of the node

childless

Return a copy of the node with no children

children

Return the children of the group layout.

contains

Return true if another layout element is a descendant of the layout element, false otherwise

descendants

Return the descendants of the layout element

drawing_elements

Return the drawing elements of the group layout.

east

Return the east anchor of the node

east_north_east

Return the east north east anchor of the node

east_south_east

Return the east south east west anchor of the node

equals

Return true if the layout element is equal to another layout element, false otherwise

flattened

Return a list containing copy of the layout element with no children and all its descendants with no children

label_center

Return the label center anchor of the node

north

Return the north anchor of the node

north_east

Return the north east anchor of the node

north_north_east

Return the north north east anchor of the node

north_north_west

Return the north north west anchor of the node

north_west

Return the north west anchor of the node

own_angle

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

own_bbox

Compute and return the bounding box of the self drawing element of the group layout

own_border

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.

own_children

Return the self children of the node. A node has unique child that is its label

own_drawing_elements

Return the node's own drawing elements

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

size

Return the size of the node

south

Return the south anchor of the node

south_east

Return the south east anchor of the node

south_south_east

Return the south south east anchor of the node

south_south_west

Return the south south west anchor of the node

south_west

Return the south west anchor of the node

to_geometry

Return a list of geometry primitives from the drawing elements.

west

Return the west anchor of the node

west_north_west

Return the west north west anchor of the node

west_south_west

Return the west south west anchor of the node

Attributes:

Name Type Description
x float

Return the x coordinate of the node

y float

Return the y coordinate of the node

anchor_point

anchor_point(anchor_name: str) -> Point

Return an anchor point of the layout element

Source code in src/momapy/core/elements.py
def anchor_point(self, anchor_name: str) -> momapy.geometry.Point:
    """Return an anchor point of the layout element"""
    return getattr(self, anchor_name)()

angle

angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

bbox

bbox() -> Bbox

Compute and return the bounding box of the group layout element

Source code in src/momapy/core/layout.py
def bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the group layout element"""
    own_bbox = self.own_bbox()
    bboxes = [child.bbox() for child in self.children()]
    min_x = own_bbox.north_west().x
    min_y = own_bbox.north_west().y
    max_x = own_bbox.south_east().x
    max_y = own_bbox.south_east().y
    for bbox in bboxes:
        if bbox.north_west().x < min_x:
            min_x = bbox.north_west().x
        if bbox.north_west().y < min_y:
            min_y = bbox.north_west().y
        if bbox.south_east().x > max_x:
            max_x = bbox.south_east().x
        if bbox.south_east().y > max_y:
            max_y = bbox.south_east().y
    bbox = momapy.geometry.Bbox(
        momapy.geometry.Point(min_x / 2 + max_x / 2, min_y / 2 + max_y / 2),
        max_x - min_x,
        max_y - min_y,
    )
    return bbox

border

border(point: Point) -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.drawing_elements(),
        point=point,
        center=self.center(),
    )

center

center() -> Point

Return the center anchor of the node

Source code in src/momapy/core/layout.py
def center(self) -> momapy.geometry.Point:
    """Return the center anchor of the node"""
    return self.position

childless

childless() -> Self

Return a copy of the node with no children

Source code in src/momapy/core/layout.py
def childless(self) -> typing_extensions.Self:
    """Return a copy of the node with no children"""
    return dataclasses.replace(self, label=None, layout_elements=tuple([]))

children

children() -> list[LayoutElement]

Return the children of the group layout. These are the self children of the group layout (returned by the own_children method) and the other children of the group layout (given by the layout_elements attribute)

Source code in src/momapy/core/layout.py
def children(self) -> list[LayoutElement]:
    """Return the children of the group layout.
    These are the self children of the group layout (returned by the `own_children` method) and the other children of the group layout (given by the `layout_elements` attribute)
    """
    return self.own_children() + list(self.layout_elements)

contains

contains(other: LayoutElement) -> bool

Return true if another layout element is a descendant of the layout element, false otherwise

Source code in src/momapy/core/elements.py
def contains(self, other: "LayoutElement") -> bool:
    """Return `true` if another layout element is a descendant of the layout element, `false` otherwise"""
    return other in self.descendants()

descendants

descendants() -> list[LayoutElement]

Return the descendants of the layout element

Source code in src/momapy/core/elements.py
def descendants(self) -> list["LayoutElement"]:
    """Return the descendants of the layout element"""
    descendants = []
    for child in self.children():
        descendants.append(child)
        descendants += child.descendants()
    return descendants

drawing_elements

drawing_elements() -> list[DrawingElement]

Return the drawing elements of the group layout. The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children

Source code in src/momapy/core/layout.py
def drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the drawing elements of the group layout.
    The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children
    """
    drawing_elements = self.own_drawing_elements()
    for child in self.children():
        if child is not None:
            drawing_elements += child.drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}",
        elements=tuple(drawing_elements),
        id_=f"{self.id_}",
        fill=self.group_fill,
        fill_rule=self.group_fill_rule,
        filter=self.group_filter,
        font_family=self.group_font_family,
        font_size=self.group_font_size,
        font_style=self.group_font_style,
        font_weight=self.group_font_weight,
        stroke=self.group_stroke,
        stroke_dasharray=self.group_stroke_dasharray,
        stroke_dashoffset=self.group_stroke_dashoffset,
        stroke_width=self.group_stroke_width,
        text_anchor=self.group_text_anchor,
        transform=self.group_transform,
    )
    return [group]

east

east() -> Point

Return the east anchor of the node

Source code in src/momapy/core/layout.py
def east(self) -> momapy.geometry.Point:
    """Return the east anchor of the node"""
    return self.own_angle(0)

east_north_east

east_north_east() -> Point

Return the east north east anchor of the node

Source code in src/momapy/core/layout.py
def east_north_east(self) -> momapy.geometry.Point:
    """Return the east north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

east_south_east

east_south_east() -> Point

Return the east south east west anchor of the node

Source code in src/momapy/core/layout.py
def east_south_east(self) -> momapy.geometry.Point:
    """Return the east south east west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

equals

equals(other: LayoutElement, flattened: bool = False, unordered: bool = False) -> bool

Return true if the layout element is equal to another layout element, false otherwise

Source code in src/momapy/core/elements.py
def equals(
    self, other: "LayoutElement", flattened: bool = False, unordered: bool = False
) -> bool:
    """Return `true` if the layout element is equal to another layout element, `false` otherwise"""
    if type(self) is type(other):
        if not flattened:
            return self == other
        else:
            if not unordered:
                return self.flattened() == other.flattened()
            else:
                return set(self.flattened()) == set(other.flattened())
    return False

flattened

flattened() -> list[LayoutElement]

Return a list containing copy of the layout element with no children and all its descendants with no children

Source code in src/momapy/core/elements.py
def flattened(self) -> list["LayoutElement"]:
    """Return a list containing copy of the layout element with no children and all its descendants with no children"""
    flattened = [self.childless()]
    for child in self.children():
        flattened += child.flattened()
    return flattened

label_center

label_center() -> Point

Return the label center anchor of the node

Source code in src/momapy/core/layout.py
def label_center(self) -> momapy.geometry.Point:
    """Return the label center anchor of the node"""
    return self.position

north

north() -> Point

Return the north anchor of the node

Source code in src/momapy/core/layout.py
def north(self) -> momapy.geometry.Point:
    """Return the north anchor of the node"""
    return self.own_angle(90)

north_east

north_east() -> Point

Return the north east anchor of the node

Source code in src/momapy/core/layout.py
def north_east(self) -> momapy.geometry.Point:
    """Return the north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_east

north_north_east() -> Point

Return the north north east anchor of the node

Source code in src/momapy/core/layout.py
def north_north_east(self) -> momapy.geometry.Point:
    """Return the north north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_west

north_north_west() -> Point

Return the north north west anchor of the node

Source code in src/momapy/core/layout.py
def north_north_west(self) -> momapy.geometry.Point:
    """Return the north north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_west

north_west() -> Point

Return the north west anchor of the node

Source code in src/momapy/core/layout.py
def north_west(self) -> momapy.geometry.Point:
    """Return the north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

own_angle

own_angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def own_angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.own_drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

own_bbox

own_bbox() -> Bbox

Compute and return the bounding box of the self drawing element of the group layout

Source code in src/momapy/core/layout.py
def own_bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the self drawing element of the group layout"""
    primitives = self.own_to_geometry()
    if not primitives:
        return momapy.geometry.Bbox(momapy.geometry.Point(0, 0), 0, 0)
    bboxes = [p.bbox() for p in primitives]
    return momapy.geometry.Bbox.union(bboxes)

own_border

own_border(point: Point) -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def own_border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.own_drawing_elements(),
        point=point,
        center=self.center(),
    )

own_children

own_children() -> list[LayoutElement]

Return the self children of the node. A node has unique child that is its label

Source code in src/momapy/core/layout.py
def own_children(self) -> list[LayoutElement]:
    """Return the self children of the node. A node has unique child that is its label"""
    if self.label is not None:
        return [self.label]
    return []

own_drawing_elements

own_drawing_elements() -> list[DrawingElement]

Return the node's own drawing elements

Source code in src/momapy/core/layout.py
def own_drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the node's own drawing elements"""
    drawing_elements = self._border_drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}_own",
        elements=tuple(drawing_elements),
        fill=self.fill,
        filter=self.filter,
        id_=f"{self.id_}_own",
        stroke=self.stroke,
        stroke_dasharray=self.stroke_dasharray,
        stroke_dashoffset=self.stroke_dashoffset,
        stroke_width=self.stroke_width,
        transform=self.transform,
    )
    return [group]

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

Source code in src/momapy/core/layout.py
def own_to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the self drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

size

size() -> tuple[float, float]

Return the size of the node

Source code in src/momapy/core/layout.py
def size(self) -> tuple[float, float]:
    """Return the size of the node"""
    return (self.width, self.height)

south

south() -> Point

Return the south anchor of the node

Source code in src/momapy/core/layout.py
def south(self) -> momapy.geometry.Point:
    """Return the south anchor of the node"""
    return self.own_angle(270)

south_east

south_east() -> Point

Return the south east anchor of the node

Source code in src/momapy/core/layout.py
def south_east(self) -> momapy.geometry.Point:
    """Return the south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_east

south_south_east() -> Point

Return the south south east anchor of the node

Source code in src/momapy/core/layout.py
def south_south_east(self) -> momapy.geometry.Point:
    """Return the south south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_west

south_south_west() -> Point

Return the south south west anchor of the node

Source code in src/momapy/core/layout.py
def south_south_west(self) -> momapy.geometry.Point:
    """Return the south south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_west

south_west() -> Point

Return the south west anchor of the node

Source code in src/momapy/core/layout.py
def south_west(self) -> momapy.geometry.Point:
    """Return the south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

to_geometry

Return a list of geometry primitives from the drawing elements.

Source code in src/momapy/core/elements.py
def to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

west

west() -> Point

Return the west anchor of the node

Source code in src/momapy/core/layout.py
def west(self) -> momapy.geometry.Point:
    """Return the west anchor of the node"""
    return self.own_angle(180)

west_north_west

west_north_west() -> Point

Return the west north west anchor of the node

Source code in src/momapy/core/layout.py
def west_north_west(self) -> momapy.geometry.Point:
    """Return the west north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

west_south_west

west_south_west() -> Point

Return the west south west anchor of the node

Source code in src/momapy/core/layout.py
def west_south_west(self) -> momapy.geometry.Point:
    """Return the west south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

x property

x: float

Return the x coordinate of the node

y property

y: float

Return the y coordinate of the node

Tag dataclass

Tag(*, id_: str = make_uuid4_as_str(), label: str | None = None, refers_to: TagReference | None = None)

Bases: SBGNModelElement

Tag element.

Tags provide identifiers that can be referenced from other locations.

Attributes:

Name Type Description

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'c595a574-9c7d-47da-b1c1-6f0c5588eaf8'
label str | None
None
refers_to TagReference | None
None

Methods:

Name Description
descendants

Return every ModelElement reachable from self, excluding self.

descendants

descendants() -> list[ModelElement]

Return every ModelElement reachable from self, excluding self.

Walks scalar ModelElement fields and frozenset/tuple containers, deduplicating by object identity.

Returns:

Type Description
list[ModelElement]

The list of reachable ModelElement instances in visit

list[ModelElement]

order, without self.

Source code in src/momapy/core/elements.py
def descendants(self) -> list["ModelElement"]:
    """Return every `ModelElement` reachable from `self`, excluding `self`.

    Walks scalar `ModelElement` fields and `frozenset`/`tuple`
    containers, deduplicating by object identity.

    Returns:
        The list of reachable `ModelElement` instances in visit
        order, without `self`.
    """
    seen: set[int] = {id(self)}
    result: list[ModelElement] = []
    if dataclasses.is_dataclass(self):
        for field in dataclasses.fields(type(self)):
            _walk_model_graph(getattr(self, field.name), seen, result)
    return result

TagLayout dataclass

TagLayout(fill: NoneValueType | Color | None = white, stroke: NoneValueType | Color | None = black, stroke_width: float | None = 1.25, *, id_: str = make_uuid4_as_str(), layout_elements: tuple[LayoutElement] = tuple(), group_fill: NoneValueType | Color | None = None, group_fill_rule: FillRule | None = None, group_filter: NoneValueType | Filter | None = None, group_font_family: str | None = None, group_font_size: float | None = None, group_font_style: FontStyle | None = None, group_font_weight: FontWeight | float | None = None, group_stroke: NoneValueType | Color | None = None, group_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, group_stroke_dashoffset: NoneValueType | float | None = None, group_stroke_width: NoneValueType | float | None = None, group_text_anchor: TextAnchor | None = None, group_transform: NoneValueType | tuple[Transformation] | None = None, filter: NoneValueType | Filter | None = None, height: float = 35.0, label: TextLayout | None = None, position: Point, stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, stroke_dashoffset: NoneValueType | float | None = None, transform: NoneValueType | tuple[Transformation] | None = None, width: float = 35.0, direction: Direction = RIGHT, angle: float = 70.0)

Bases: TagLayout

Layout for tags.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'99c43830-0754-4dc3-9c72-07d4d999370c'
layout_elements tuple[LayoutElement]

The sub-layout elements of the group layout. These are part of the children of the group layout

<dynamic>
group_fill NoneValueType | Color | None

The fill color of the group layout

None
group_fill_rule FillRule | None

The fill rule of the group layout

None
group_filter NoneValueType | Filter | None

The filter of the group layout

None
group_font_family str | None

The font family of the group layout

None
group_font_size float | None

The font size of the group layout

None
group_font_style FontStyle | None

The font style of the group layout

None
group_font_weight FontWeight | float | None

The font weight of the group layout

None
group_stroke NoneValueType | Color | None

The stroke color of the group layout

None
group_stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the group layout

None
group_stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the group layout

None
group_stroke_width NoneValueType | float | None

The stroke width of the group layout

None
group_text_anchor TextAnchor | None

The text anchor of the group layout

None
group_transform NoneValueType | tuple[Transformation] | None

The transform of the group layout

None
fill NoneValueType | Color | None

The fill color of the node

Color(red=255, green=255, blue=255, alpha=1.0)
filter NoneValueType | Filter | None

The filter of the node

None
height float

The height of the node

35.0
label TextLayout | None

The label of the node

None
position Point

The position of the node

required
stroke NoneValueType | Color | None

The stroke color of the node

Color(red=0, green=0, blue=0, alpha=1.0)
stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the node

None
stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the node

None
stroke_width float | None

The stroke width of the node

1.25
transform NoneValueType | tuple[Transformation] | None

The transform of the node

None
width float

The width width of the node

35.0
direction Direction
<Direction.RIGHT: 4>
angle float

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

70.0

Methods:

Name Description
anchor_point

Return an anchor point of the layout element

bbox

Compute and return the bounding box of the group layout element

border

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.

center

Return the center anchor of the node

childless

Return a copy of the node with no children

children

Return the children of the group layout.

contains

Return true if another layout element is a descendant of the layout element, false otherwise

descendants

Return the descendants of the layout element

drawing_elements

Return the drawing elements of the group layout.

east

Return the east anchor of the node

east_north_east

Return the east north east anchor of the node

east_south_east

Return the east south east west anchor of the node

equals

Return true if the layout element is equal to another layout element, false otherwise

flattened

Return a list containing copy of the layout element with no children and all its descendants with no children

label_center

Return the label center anchor of the node

north

Return the north anchor of the node

north_east

Return the north east anchor of the node

north_north_east

Return the north north east anchor of the node

north_north_west

Return the north north west anchor of the node

north_west

Return the north west anchor of the node

own_angle

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

own_bbox

Compute and return the bounding box of the self drawing element of the group layout

own_border

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.

own_children

Return the self children of the node. A node has unique child that is its label

own_drawing_elements

Return the node's own drawing elements

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

size

Return the size of the node

south

Return the south anchor of the node

south_east

Return the south east anchor of the node

south_south_east

Return the south south east anchor of the node

south_south_west

Return the south south west anchor of the node

south_west

Return the south west anchor of the node

to_geometry

Return a list of geometry primitives from the drawing elements.

west

Return the west anchor of the node

west_north_west

Return the west north west anchor of the node

west_south_west

Return the west south west anchor of the node

Attributes:

Name Type Description
angle float

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

x float

Return the x coordinate of the node

y float

Return the y coordinate of the node

anchor_point

anchor_point(anchor_name: str) -> Point

Return an anchor point of the layout element

Source code in src/momapy/core/elements.py
def anchor_point(self, anchor_name: str) -> momapy.geometry.Point:
    """Return an anchor point of the layout element"""
    return getattr(self, anchor_name)()

angle class-attribute instance-attribute

angle: float = 70.0

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

bbox

bbox() -> Bbox

Compute and return the bounding box of the group layout element

Source code in src/momapy/core/layout.py
def bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the group layout element"""
    own_bbox = self.own_bbox()
    bboxes = [child.bbox() for child in self.children()]
    min_x = own_bbox.north_west().x
    min_y = own_bbox.north_west().y
    max_x = own_bbox.south_east().x
    max_y = own_bbox.south_east().y
    for bbox in bboxes:
        if bbox.north_west().x < min_x:
            min_x = bbox.north_west().x
        if bbox.north_west().y < min_y:
            min_y = bbox.north_west().y
        if bbox.south_east().x > max_x:
            max_x = bbox.south_east().x
        if bbox.south_east().y > max_y:
            max_y = bbox.south_east().y
    bbox = momapy.geometry.Bbox(
        momapy.geometry.Point(min_x / 2 + max_x / 2, min_y / 2 + max_y / 2),
        max_x - min_x,
        max_y - min_y,
    )
    return bbox

border

border(point: Point) -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.drawing_elements(),
        point=point,
        center=self.center(),
    )

center

center() -> Point

Return the center anchor of the node

Source code in src/momapy/core/layout.py
def center(self) -> momapy.geometry.Point:
    """Return the center anchor of the node"""
    return self.position

childless

childless() -> Self

Return a copy of the node with no children

Source code in src/momapy/core/layout.py
def childless(self) -> typing_extensions.Self:
    """Return a copy of the node with no children"""
    return dataclasses.replace(self, label=None, layout_elements=tuple([]))

children

children() -> list[LayoutElement]

Return the children of the group layout. These are the self children of the group layout (returned by the own_children method) and the other children of the group layout (given by the layout_elements attribute)

Source code in src/momapy/core/layout.py
def children(self) -> list[LayoutElement]:
    """Return the children of the group layout.
    These are the self children of the group layout (returned by the `own_children` method) and the other children of the group layout (given by the `layout_elements` attribute)
    """
    return self.own_children() + list(self.layout_elements)

contains

contains(other: LayoutElement) -> bool

Return true if another layout element is a descendant of the layout element, false otherwise

Source code in src/momapy/core/elements.py
def contains(self, other: "LayoutElement") -> bool:
    """Return `true` if another layout element is a descendant of the layout element, `false` otherwise"""
    return other in self.descendants()

descendants

descendants() -> list[LayoutElement]

Return the descendants of the layout element

Source code in src/momapy/core/elements.py
def descendants(self) -> list["LayoutElement"]:
    """Return the descendants of the layout element"""
    descendants = []
    for child in self.children():
        descendants.append(child)
        descendants += child.descendants()
    return descendants

drawing_elements

drawing_elements() -> list[DrawingElement]

Return the drawing elements of the group layout. The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children

Source code in src/momapy/core/layout.py
def drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the drawing elements of the group layout.
    The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children
    """
    drawing_elements = self.own_drawing_elements()
    for child in self.children():
        if child is not None:
            drawing_elements += child.drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}",
        elements=tuple(drawing_elements),
        id_=f"{self.id_}",
        fill=self.group_fill,
        fill_rule=self.group_fill_rule,
        filter=self.group_filter,
        font_family=self.group_font_family,
        font_size=self.group_font_size,
        font_style=self.group_font_style,
        font_weight=self.group_font_weight,
        stroke=self.group_stroke,
        stroke_dasharray=self.group_stroke_dasharray,
        stroke_dashoffset=self.group_stroke_dashoffset,
        stroke_width=self.group_stroke_width,
        text_anchor=self.group_text_anchor,
        transform=self.group_transform,
    )
    return [group]

east

east() -> Point

Return the east anchor of the node

Source code in src/momapy/core/layout.py
def east(self) -> momapy.geometry.Point:
    """Return the east anchor of the node"""
    return self.own_angle(0)

east_north_east

east_north_east() -> Point

Return the east north east anchor of the node

Source code in src/momapy/core/layout.py
def east_north_east(self) -> momapy.geometry.Point:
    """Return the east north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

east_south_east

east_south_east() -> Point

Return the east south east west anchor of the node

Source code in src/momapy/core/layout.py
def east_south_east(self) -> momapy.geometry.Point:
    """Return the east south east west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

equals

equals(other: LayoutElement, flattened: bool = False, unordered: bool = False) -> bool

Return true if the layout element is equal to another layout element, false otherwise

Source code in src/momapy/core/elements.py
def equals(
    self, other: "LayoutElement", flattened: bool = False, unordered: bool = False
) -> bool:
    """Return `true` if the layout element is equal to another layout element, `false` otherwise"""
    if type(self) is type(other):
        if not flattened:
            return self == other
        else:
            if not unordered:
                return self.flattened() == other.flattened()
            else:
                return set(self.flattened()) == set(other.flattened())
    return False

flattened

flattened() -> list[LayoutElement]

Return a list containing copy of the layout element with no children and all its descendants with no children

Source code in src/momapy/core/elements.py
def flattened(self) -> list["LayoutElement"]:
    """Return a list containing copy of the layout element with no children and all its descendants with no children"""
    flattened = [self.childless()]
    for child in self.children():
        flattened += child.flattened()
    return flattened

label_center

label_center() -> Point

Return the label center anchor of the node

Source code in src/momapy/core/layout.py
def label_center(self) -> momapy.geometry.Point:
    """Return the label center anchor of the node"""
    return self.position

north

north() -> Point

Return the north anchor of the node

Source code in src/momapy/core/layout.py
def north(self) -> momapy.geometry.Point:
    """Return the north anchor of the node"""
    return self.own_angle(90)

north_east

north_east() -> Point

Return the north east anchor of the node

Source code in src/momapy/core/layout.py
def north_east(self) -> momapy.geometry.Point:
    """Return the north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_east

north_north_east() -> Point

Return the north north east anchor of the node

Source code in src/momapy/core/layout.py
def north_north_east(self) -> momapy.geometry.Point:
    """Return the north north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_west

north_north_west() -> Point

Return the north north west anchor of the node

Source code in src/momapy/core/layout.py
def north_north_west(self) -> momapy.geometry.Point:
    """Return the north north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_west

north_west() -> Point

Return the north west anchor of the node

Source code in src/momapy/core/layout.py
def north_west(self) -> momapy.geometry.Point:
    """Return the north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

own_angle

own_angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def own_angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.own_drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

own_bbox

own_bbox() -> Bbox

Compute and return the bounding box of the self drawing element of the group layout

Source code in src/momapy/core/layout.py
def own_bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the self drawing element of the group layout"""
    primitives = self.own_to_geometry()
    if not primitives:
        return momapy.geometry.Bbox(momapy.geometry.Point(0, 0), 0, 0)
    bboxes = [p.bbox() for p in primitives]
    return momapy.geometry.Bbox.union(bboxes)

own_border

own_border(point: Point) -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def own_border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.own_drawing_elements(),
        point=point,
        center=self.center(),
    )

own_children

own_children() -> list[LayoutElement]

Return the self children of the node. A node has unique child that is its label

Source code in src/momapy/core/layout.py
def own_children(self) -> list[LayoutElement]:
    """Return the self children of the node. A node has unique child that is its label"""
    if self.label is not None:
        return [self.label]
    return []

own_drawing_elements

own_drawing_elements() -> list[DrawingElement]

Return the node's own drawing elements

Source code in src/momapy/core/layout.py
def own_drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the node's own drawing elements"""
    drawing_elements = self._border_drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}_own",
        elements=tuple(drawing_elements),
        fill=self.fill,
        filter=self.filter,
        id_=f"{self.id_}_own",
        stroke=self.stroke,
        stroke_dasharray=self.stroke_dasharray,
        stroke_dashoffset=self.stroke_dashoffset,
        stroke_width=self.stroke_width,
        transform=self.transform,
    )
    return [group]

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

Source code in src/momapy/core/layout.py
def own_to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the self drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

size

size() -> tuple[float, float]

Return the size of the node

Source code in src/momapy/core/layout.py
def size(self) -> tuple[float, float]:
    """Return the size of the node"""
    return (self.width, self.height)

south

south() -> Point

Return the south anchor of the node

Source code in src/momapy/core/layout.py
def south(self) -> momapy.geometry.Point:
    """Return the south anchor of the node"""
    return self.own_angle(270)

south_east

south_east() -> Point

Return the south east anchor of the node

Source code in src/momapy/core/layout.py
def south_east(self) -> momapy.geometry.Point:
    """Return the south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_east

south_south_east() -> Point

Return the south south east anchor of the node

Source code in src/momapy/core/layout.py
def south_south_east(self) -> momapy.geometry.Point:
    """Return the south south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_west

south_south_west() -> Point

Return the south south west anchor of the node

Source code in src/momapy/core/layout.py
def south_south_west(self) -> momapy.geometry.Point:
    """Return the south south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_west

south_west() -> Point

Return the south west anchor of the node

Source code in src/momapy/core/layout.py
def south_west(self) -> momapy.geometry.Point:
    """Return the south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

to_geometry

Return a list of geometry primitives from the drawing elements.

Source code in src/momapy/core/elements.py
def to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

west

west() -> Point

Return the west anchor of the node

Source code in src/momapy/core/layout.py
def west(self) -> momapy.geometry.Point:
    """Return the west anchor of the node"""
    return self.own_angle(180)

west_north_west

west_north_west() -> Point

Return the west north west anchor of the node

Source code in src/momapy/core/layout.py
def west_north_west(self) -> momapy.geometry.Point:
    """Return the west north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

west_south_west

west_south_west() -> Point

Return the west south west anchor of the node

Source code in src/momapy/core/layout.py
def west_south_west(self) -> momapy.geometry.Point:
    """Return the west south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

x property

x: float

Return the x coordinate of the node

y property

y: float

Return the y coordinate of the node

TagReference dataclass

TagReference(*, id_: str = make_uuid4_as_str(), element: Activity | Compartment)

Bases: SBGNRole

Reference to a tag.

Attributes:

Name Type Description

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'ecae9604-c540-40d9-b636-1c67d78d9c51'
element Activity | Compartment
required

Methods:

Name Description
descendants

Return every ModelElement reachable from self, excluding self.

descendants

descendants() -> list[ModelElement]

Return every ModelElement reachable from self, excluding self.

Walks scalar ModelElement fields and frozenset/tuple containers, deduplicating by object identity.

Returns:

Type Description
list[ModelElement]

The list of reachable ModelElement instances in visit

list[ModelElement]

order, without self.

Source code in src/momapy/core/elements.py
def descendants(self) -> list["ModelElement"]:
    """Return every `ModelElement` reachable from `self`, excluding `self`.

    Walks scalar `ModelElement` fields and `frozenset`/`tuple`
    containers, deduplicating by object identity.

    Returns:
        The list of reachable `ModelElement` instances in visit
        order, without `self`.
    """
    seen: set[int] = {id(self)}
    result: list[ModelElement] = []
    if dataclasses.is_dataclass(self):
        for field in dataclasses.fields(type(self)):
            _walk_model_graph(getattr(self, field.name), seen, result)
    return result

Terminal dataclass

Terminal(*, id_: str = make_uuid4_as_str(), label: str | None = None, refers_to: TerminalReference | None = None)

Bases: SBGNModelElement

Terminal element.

Terminals represent connection points to submaps.

Attributes:

Name Type Description

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'c2c6a30b-6ec0-4462-b372-00aab7982274'
label str | None
None
refers_to TerminalReference | None
None

Methods:

Name Description
descendants

Return every ModelElement reachable from self, excluding self.

descendants

descendants() -> list[ModelElement]

Return every ModelElement reachable from self, excluding self.

Walks scalar ModelElement fields and frozenset/tuple containers, deduplicating by object identity.

Returns:

Type Description
list[ModelElement]

The list of reachable ModelElement instances in visit

list[ModelElement]

order, without self.

Source code in src/momapy/core/elements.py
def descendants(self) -> list["ModelElement"]:
    """Return every `ModelElement` reachable from `self`, excluding `self`.

    Walks scalar `ModelElement` fields and `frozenset`/`tuple`
    containers, deduplicating by object identity.

    Returns:
        The list of reachable `ModelElement` instances in visit
        order, without `self`.
    """
    seen: set[int] = {id(self)}
    result: list[ModelElement] = []
    if dataclasses.is_dataclass(self):
        for field in dataclasses.fields(type(self)):
            _walk_model_graph(getattr(self, field.name), seen, result)
    return result

TerminalLayout dataclass

TerminalLayout(fill: NoneValueType | Color | None = white, stroke: NoneValueType | Color | None = black, stroke_width: float | None = 1.25, *, id_: str = make_uuid4_as_str(), layout_elements: tuple[LayoutElement] = tuple(), group_fill: NoneValueType | Color | None = None, group_fill_rule: FillRule | None = None, group_filter: NoneValueType | Filter | None = None, group_font_family: str | None = None, group_font_size: float | None = None, group_font_style: FontStyle | None = None, group_font_weight: FontWeight | float | None = None, group_stroke: NoneValueType | Color | None = None, group_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, group_stroke_dashoffset: NoneValueType | float | None = None, group_stroke_width: NoneValueType | float | None = None, group_text_anchor: TextAnchor | None = None, group_transform: NoneValueType | tuple[Transformation] | None = None, filter: NoneValueType | Filter | None = None, height: float = 35.0, label: TextLayout | None = None, position: Point, stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, stroke_dashoffset: NoneValueType | float | None = None, transform: NoneValueType | tuple[Transformation] | None = None, width: float = 35.0, direction: Direction = RIGHT, angle: float = 70.0)

Bases: _SimpleMixin, SBGNNode

Layout for terminals.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'b2930a7d-8394-4034-80be-b03ec3fb6ba6'
layout_elements tuple[LayoutElement]

The sub-layout elements of the group layout. These are part of the children of the group layout

<dynamic>
group_fill NoneValueType | Color | None

The fill color of the group layout

None
group_fill_rule FillRule | None

The fill rule of the group layout

None
group_filter NoneValueType | Filter | None

The filter of the group layout

None
group_font_family str | None

The font family of the group layout

None
group_font_size float | None

The font size of the group layout

None
group_font_style FontStyle | None

The font style of the group layout

None
group_font_weight FontWeight | float | None

The font weight of the group layout

None
group_stroke NoneValueType | Color | None

The stroke color of the group layout

None
group_stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the group layout

None
group_stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the group layout

None
group_stroke_width NoneValueType | float | None

The stroke width of the group layout

None
group_text_anchor TextAnchor | None

The text anchor of the group layout

None
group_transform NoneValueType | tuple[Transformation] | None

The transform of the group layout

None
fill NoneValueType | Color | None

The fill color of the node

Color(red=255, green=255, blue=255, alpha=1.0)
filter NoneValueType | Filter | None

The filter of the node

None
height float

The height of the node

35.0
label TextLayout | None

The label of the node

None
position Point

The position of the node

required
stroke NoneValueType | Color | None

The stroke color of the node

Color(red=0, green=0, blue=0, alpha=1.0)
stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the node

None
stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the node

None
stroke_width float | None

The stroke width of the node

1.25
transform NoneValueType | tuple[Transformation] | None

The transform of the node

None
width float

The width width of the node

35.0
direction Direction
<Direction.RIGHT: 4>
angle float

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

70.0

Methods:

Name Description
anchor_point

Return an anchor point of the layout element

bbox

Compute and return the bounding box of the group layout element

border

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.

center

Return the center anchor of the node

childless

Return a copy of the node with no children

children

Return the children of the group layout.

contains

Return true if another layout element is a descendant of the layout element, false otherwise

descendants

Return the descendants of the layout element

drawing_elements

Return the drawing elements of the group layout.

east

Return the east anchor of the node

east_north_east

Return the east north east anchor of the node

east_south_east

Return the east south east west anchor of the node

equals

Return true if the layout element is equal to another layout element, false otherwise

flattened

Return a list containing copy of the layout element with no children and all its descendants with no children

label_center

Return the label center anchor of the node

north

Return the north anchor of the node

north_east

Return the north east anchor of the node

north_north_east

Return the north north east anchor of the node

north_north_west

Return the north north west anchor of the node

north_west

Return the north west anchor of the node

own_angle

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

own_bbox

Compute and return the bounding box of the self drawing element of the group layout

own_border

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.

own_children

Return the self children of the node. A node has unique child that is its label

own_drawing_elements

Return the node's own drawing elements

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

size

Return the size of the node

south

Return the south anchor of the node

south_east

Return the south east anchor of the node

south_south_east

Return the south south east anchor of the node

south_south_west

Return the south south west anchor of the node

south_west

Return the south west anchor of the node

to_geometry

Return a list of geometry primitives from the drawing elements.

west

Return the west anchor of the node

west_north_west

Return the west north west anchor of the node

west_south_west

Return the west south west anchor of the node

Attributes:

Name Type Description
angle float

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

x float

Return the x coordinate of the node

y float

Return the y coordinate of the node

anchor_point

anchor_point(anchor_name: str) -> Point

Return an anchor point of the layout element

Source code in src/momapy/core/elements.py
def anchor_point(self, anchor_name: str) -> momapy.geometry.Point:
    """Return an anchor point of the layout element"""
    return getattr(self, anchor_name)()

angle class-attribute instance-attribute

angle: float = 70.0

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

bbox

bbox() -> Bbox

Compute and return the bounding box of the group layout element

Source code in src/momapy/core/layout.py
def bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the group layout element"""
    own_bbox = self.own_bbox()
    bboxes = [child.bbox() for child in self.children()]
    min_x = own_bbox.north_west().x
    min_y = own_bbox.north_west().y
    max_x = own_bbox.south_east().x
    max_y = own_bbox.south_east().y
    for bbox in bboxes:
        if bbox.north_west().x < min_x:
            min_x = bbox.north_west().x
        if bbox.north_west().y < min_y:
            min_y = bbox.north_west().y
        if bbox.south_east().x > max_x:
            max_x = bbox.south_east().x
        if bbox.south_east().y > max_y:
            max_y = bbox.south_east().y
    bbox = momapy.geometry.Bbox(
        momapy.geometry.Point(min_x / 2 + max_x / 2, min_y / 2 + max_y / 2),
        max_x - min_x,
        max_y - min_y,
    )
    return bbox

border

border(point: Point) -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.drawing_elements(),
        point=point,
        center=self.center(),
    )

center

center() -> Point

Return the center anchor of the node

Source code in src/momapy/core/layout.py
def center(self) -> momapy.geometry.Point:
    """Return the center anchor of the node"""
    return self.position

childless

childless() -> Self

Return a copy of the node with no children

Source code in src/momapy/core/layout.py
def childless(self) -> typing_extensions.Self:
    """Return a copy of the node with no children"""
    return dataclasses.replace(self, label=None, layout_elements=tuple([]))

children

children() -> list[LayoutElement]

Return the children of the group layout. These are the self children of the group layout (returned by the own_children method) and the other children of the group layout (given by the layout_elements attribute)

Source code in src/momapy/core/layout.py
def children(self) -> list[LayoutElement]:
    """Return the children of the group layout.
    These are the self children of the group layout (returned by the `own_children` method) and the other children of the group layout (given by the `layout_elements` attribute)
    """
    return self.own_children() + list(self.layout_elements)

contains

contains(other: LayoutElement) -> bool

Return true if another layout element is a descendant of the layout element, false otherwise

Source code in src/momapy/core/elements.py
def contains(self, other: "LayoutElement") -> bool:
    """Return `true` if another layout element is a descendant of the layout element, `false` otherwise"""
    return other in self.descendants()

descendants

descendants() -> list[LayoutElement]

Return the descendants of the layout element

Source code in src/momapy/core/elements.py
def descendants(self) -> list["LayoutElement"]:
    """Return the descendants of the layout element"""
    descendants = []
    for child in self.children():
        descendants.append(child)
        descendants += child.descendants()
    return descendants

drawing_elements

drawing_elements() -> list[DrawingElement]

Return the drawing elements of the group layout. The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children

Source code in src/momapy/core/layout.py
def drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the drawing elements of the group layout.
    The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children
    """
    drawing_elements = self.own_drawing_elements()
    for child in self.children():
        if child is not None:
            drawing_elements += child.drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}",
        elements=tuple(drawing_elements),
        id_=f"{self.id_}",
        fill=self.group_fill,
        fill_rule=self.group_fill_rule,
        filter=self.group_filter,
        font_family=self.group_font_family,
        font_size=self.group_font_size,
        font_style=self.group_font_style,
        font_weight=self.group_font_weight,
        stroke=self.group_stroke,
        stroke_dasharray=self.group_stroke_dasharray,
        stroke_dashoffset=self.group_stroke_dashoffset,
        stroke_width=self.group_stroke_width,
        text_anchor=self.group_text_anchor,
        transform=self.group_transform,
    )
    return [group]

east

east() -> Point

Return the east anchor of the node

Source code in src/momapy/core/layout.py
def east(self) -> momapy.geometry.Point:
    """Return the east anchor of the node"""
    return self.own_angle(0)

east_north_east

east_north_east() -> Point

Return the east north east anchor of the node

Source code in src/momapy/core/layout.py
def east_north_east(self) -> momapy.geometry.Point:
    """Return the east north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

east_south_east

east_south_east() -> Point

Return the east south east west anchor of the node

Source code in src/momapy/core/layout.py
def east_south_east(self) -> momapy.geometry.Point:
    """Return the east south east west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

equals

equals(other: LayoutElement, flattened: bool = False, unordered: bool = False) -> bool

Return true if the layout element is equal to another layout element, false otherwise

Source code in src/momapy/core/elements.py
def equals(
    self, other: "LayoutElement", flattened: bool = False, unordered: bool = False
) -> bool:
    """Return `true` if the layout element is equal to another layout element, `false` otherwise"""
    if type(self) is type(other):
        if not flattened:
            return self == other
        else:
            if not unordered:
                return self.flattened() == other.flattened()
            else:
                return set(self.flattened()) == set(other.flattened())
    return False

flattened

flattened() -> list[LayoutElement]

Return a list containing copy of the layout element with no children and all its descendants with no children

Source code in src/momapy/core/elements.py
def flattened(self) -> list["LayoutElement"]:
    """Return a list containing copy of the layout element with no children and all its descendants with no children"""
    flattened = [self.childless()]
    for child in self.children():
        flattened += child.flattened()
    return flattened

label_center

label_center() -> Point

Return the label center anchor of the node

Source code in src/momapy/core/layout.py
def label_center(self) -> momapy.geometry.Point:
    """Return the label center anchor of the node"""
    return self.position

north

north() -> Point

Return the north anchor of the node

Source code in src/momapy/core/layout.py
def north(self) -> momapy.geometry.Point:
    """Return the north anchor of the node"""
    return self.own_angle(90)

north_east

north_east() -> Point

Return the north east anchor of the node

Source code in src/momapy/core/layout.py
def north_east(self) -> momapy.geometry.Point:
    """Return the north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_east

north_north_east() -> Point

Return the north north east anchor of the node

Source code in src/momapy/core/layout.py
def north_north_east(self) -> momapy.geometry.Point:
    """Return the north north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_west

north_north_west() -> Point

Return the north north west anchor of the node

Source code in src/momapy/core/layout.py
def north_north_west(self) -> momapy.geometry.Point:
    """Return the north north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_west

north_west() -> Point

Return the north west anchor of the node

Source code in src/momapy/core/layout.py
def north_west(self) -> momapy.geometry.Point:
    """Return the north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

own_angle

own_angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def own_angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.own_drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

own_bbox

own_bbox() -> Bbox

Compute and return the bounding box of the self drawing element of the group layout

Source code in src/momapy/core/layout.py
def own_bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the self drawing element of the group layout"""
    primitives = self.own_to_geometry()
    if not primitives:
        return momapy.geometry.Bbox(momapy.geometry.Point(0, 0), 0, 0)
    bboxes = [p.bbox() for p in primitives]
    return momapy.geometry.Bbox.union(bboxes)

own_border

own_border(point: Point) -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def own_border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.own_drawing_elements(),
        point=point,
        center=self.center(),
    )

own_children

own_children() -> list[LayoutElement]

Return the self children of the node. A node has unique child that is its label

Source code in src/momapy/core/layout.py
def own_children(self) -> list[LayoutElement]:
    """Return the self children of the node. A node has unique child that is its label"""
    if self.label is not None:
        return [self.label]
    return []

own_drawing_elements

own_drawing_elements() -> list[DrawingElement]

Return the node's own drawing elements

Source code in src/momapy/core/layout.py
def own_drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the node's own drawing elements"""
    drawing_elements = self._border_drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}_own",
        elements=tuple(drawing_elements),
        fill=self.fill,
        filter=self.filter,
        id_=f"{self.id_}_own",
        stroke=self.stroke,
        stroke_dasharray=self.stroke_dasharray,
        stroke_dashoffset=self.stroke_dashoffset,
        stroke_width=self.stroke_width,
        transform=self.transform,
    )
    return [group]

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

Source code in src/momapy/core/layout.py
def own_to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the self drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

size

size() -> tuple[float, float]

Return the size of the node

Source code in src/momapy/core/layout.py
def size(self) -> tuple[float, float]:
    """Return the size of the node"""
    return (self.width, self.height)

south

south() -> Point

Return the south anchor of the node

Source code in src/momapy/core/layout.py
def south(self) -> momapy.geometry.Point:
    """Return the south anchor of the node"""
    return self.own_angle(270)

south_east

south_east() -> Point

Return the south east anchor of the node

Source code in src/momapy/core/layout.py
def south_east(self) -> momapy.geometry.Point:
    """Return the south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_east

south_south_east() -> Point

Return the south south east anchor of the node

Source code in src/momapy/core/layout.py
def south_south_east(self) -> momapy.geometry.Point:
    """Return the south south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_west

south_south_west() -> Point

Return the south south west anchor of the node

Source code in src/momapy/core/layout.py
def south_south_west(self) -> momapy.geometry.Point:
    """Return the south south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_west

south_west() -> Point

Return the south west anchor of the node

Source code in src/momapy/core/layout.py
def south_west(self) -> momapy.geometry.Point:
    """Return the south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

to_geometry

Return a list of geometry primitives from the drawing elements.

Source code in src/momapy/core/elements.py
def to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

west

west() -> Point

Return the west anchor of the node

Source code in src/momapy/core/layout.py
def west(self) -> momapy.geometry.Point:
    """Return the west anchor of the node"""
    return self.own_angle(180)

west_north_west

west_north_west() -> Point

Return the west north west anchor of the node

Source code in src/momapy/core/layout.py
def west_north_west(self) -> momapy.geometry.Point:
    """Return the west north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

west_south_west

west_south_west() -> Point

Return the west south west anchor of the node

Source code in src/momapy/core/layout.py
def west_south_west(self) -> momapy.geometry.Point:
    """Return the west south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

x property

x: float

Return the x coordinate of the node

y property

y: float

Return the y coordinate of the node

TerminalReference dataclass

TerminalReference(*, id_: str = make_uuid4_as_str(), element: Activity | Compartment)

Bases: SBGNRole

Reference to a terminal.

Attributes:

Name Type Description

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'395384aa-2b36-4ff8-851f-0b4a2718e810'
element Activity | Compartment
required

Methods:

Name Description
descendants

Return every ModelElement reachable from self, excluding self.

descendants

descendants() -> list[ModelElement]

Return every ModelElement reachable from self, excluding self.

Walks scalar ModelElement fields and frozenset/tuple containers, deduplicating by object identity.

Returns:

Type Description
list[ModelElement]

The list of reachable ModelElement instances in visit

list[ModelElement]

order, without self.

Source code in src/momapy/core/elements.py
def descendants(self) -> list["ModelElement"]:
    """Return every `ModelElement` reachable from `self`, excluding `self`.

    Walks scalar `ModelElement` fields and `frozenset`/`tuple`
    containers, deduplicating by object identity.

    Returns:
        The list of reachable `ModelElement` instances in visit
        order, without `self`.
    """
    seen: set[int] = {id(self)}
    result: list[ModelElement] = []
    if dataclasses.is_dataclass(self):
        for field in dataclasses.fields(type(self)):
            _walk_model_graph(getattr(self, field.name), seen, result)
    return result

UnitOfInformation dataclass

UnitOfInformation(*, id_: str = make_uuid4_as_str(), label: str | None = None)

Bases: SBGNModelElement

Unit of information for activities and compartments.

Units of information provide additional information about activities or compartments.

Attributes:

Name Type Description

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'31db5f8b-81ad-45e5-a837-b13967184c36'
label str | None
None

Methods:

Name Description
descendants

Return every ModelElement reachable from self, excluding self.

descendants

descendants() -> list[ModelElement]

Return every ModelElement reachable from self, excluding self.

Walks scalar ModelElement fields and frozenset/tuple containers, deduplicating by object identity.

Returns:

Type Description
list[ModelElement]

The list of reachable ModelElement instances in visit

list[ModelElement]

order, without self.

Source code in src/momapy/core/elements.py
def descendants(self) -> list["ModelElement"]:
    """Return every `ModelElement` reachable from `self`, excluding `self`.

    Walks scalar `ModelElement` fields and `frozenset`/`tuple`
    containers, deduplicating by object identity.

    Returns:
        The list of reachable `ModelElement` instances in visit
        order, without `self`.
    """
    seen: set[int] = {id(self)}
    result: list[ModelElement] = []
    if dataclasses.is_dataclass(self):
        for field in dataclasses.fields(type(self)):
            _walk_model_graph(getattr(self, field.name), seen, result)
    return result

UnitOfInformationLayout dataclass

UnitOfInformationLayout(fill: NoneValueType | Color | None = white, stroke: NoneValueType | Color | None = black, stroke_width: float | None = 1.25, *, id_: str = make_uuid4_as_str(), layout_elements: tuple[LayoutElement] = tuple(), group_fill: NoneValueType | Color | None = None, group_fill_rule: FillRule | None = None, group_filter: NoneValueType | Filter | None = None, group_font_family: str | None = None, group_font_size: float | None = None, group_font_style: FontStyle | None = None, group_font_weight: FontWeight | float | None = None, group_stroke: NoneValueType | Color | None = None, group_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, group_stroke_dashoffset: NoneValueType | float | None = None, group_stroke_width: NoneValueType | float | None = None, group_text_anchor: TextAnchor | None = None, group_transform: NoneValueType | tuple[Transformation] | None = None, filter: NoneValueType | Filter | None = None, height: float = 12.0, label: TextLayout | None = None, position: Point, stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, stroke_dashoffset: NoneValueType | float | None = None, transform: NoneValueType | tuple[Transformation] | None = None, width: float = 12.0)

Bases: _SimpleMixin, SBGNNode

Class for unit of information layouts

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'9f1563df-d65e-426b-ace7-8f6ffabfc87f'
layout_elements tuple[LayoutElement]

The sub-layout elements of the group layout. These are part of the children of the group layout

<dynamic>
group_fill NoneValueType | Color | None

The fill color of the group layout

None
group_fill_rule FillRule | None

The fill rule of the group layout

None
group_filter NoneValueType | Filter | None

The filter of the group layout

None
group_font_family str | None

The font family of the group layout

None
group_font_size float | None

The font size of the group layout

None
group_font_style FontStyle | None

The font style of the group layout

None
group_font_weight FontWeight | float | None

The font weight of the group layout

None
group_stroke NoneValueType | Color | None

The stroke color of the group layout

None
group_stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the group layout

None
group_stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the group layout

None
group_stroke_width NoneValueType | float | None

The stroke width of the group layout

None
group_text_anchor TextAnchor | None

The text anchor of the group layout

None
group_transform NoneValueType | tuple[Transformation] | None

The transform of the group layout

None
fill NoneValueType | Color | None

The fill color of the node

Color(red=255, green=255, blue=255, alpha=1.0)
filter NoneValueType | Filter | None

The filter of the node

None
height float

The height of the node

12.0
label TextLayout | None

The label of the node

None
position Point

The position of the node

required
stroke NoneValueType | Color | None

The stroke color of the node

Color(red=0, green=0, blue=0, alpha=1.0)
stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the node

None
stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the node

None
stroke_width float | None

The stroke width of the node

1.25
transform NoneValueType | tuple[Transformation] | None

The transform of the node

None
width float

The width width of the node

12.0

Methods:

Name Description
anchor_point

Return an anchor point of the layout element

angle

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

bbox

Compute and return the bounding box of the group layout element

border

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.

center

Return the center anchor of the node

childless

Return a copy of the node with no children

children

Return the children of the group layout.

contains

Return true if another layout element is a descendant of the layout element, false otherwise

descendants

Return the descendants of the layout element

drawing_elements

Return the drawing elements of the group layout.

east

Return the east anchor of the node

east_north_east

Return the east north east anchor of the node

east_south_east

Return the east south east west anchor of the node

equals

Return true if the layout element is equal to another layout element, false otherwise

flattened

Return a list containing copy of the layout element with no children and all its descendants with no children

label_center

Return the label center anchor of the node

north

Return the north anchor of the node

north_east

Return the north east anchor of the node

north_north_east

Return the north north east anchor of the node

north_north_west

Return the north north west anchor of the node

north_west

Return the north west anchor of the node

own_angle

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

own_bbox

Compute and return the bounding box of the self drawing element of the group layout

own_border

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.

own_children

Return the self children of the node. A node has unique child that is its label

own_drawing_elements

Return the node's own drawing elements

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

size

Return the size of the node

south

Return the south anchor of the node

south_east

Return the south east anchor of the node

south_south_east

Return the south south east anchor of the node

south_south_west

Return the south south west anchor of the node

south_west

Return the south west anchor of the node

to_geometry

Return a list of geometry primitives from the drawing elements.

west

Return the west anchor of the node

west_north_west

Return the west north west anchor of the node

west_south_west

Return the west south west anchor of the node

Attributes:

Name Type Description
x float

Return the x coordinate of the node

y float

Return the y coordinate of the node

anchor_point

anchor_point(anchor_name: str) -> Point

Return an anchor point of the layout element

Source code in src/momapy/core/elements.py
def anchor_point(self, anchor_name: str) -> momapy.geometry.Point:
    """Return an anchor point of the layout element"""
    return getattr(self, anchor_name)()

angle

angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

bbox

bbox() -> Bbox

Compute and return the bounding box of the group layout element

Source code in src/momapy/core/layout.py
def bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the group layout element"""
    own_bbox = self.own_bbox()
    bboxes = [child.bbox() for child in self.children()]
    min_x = own_bbox.north_west().x
    min_y = own_bbox.north_west().y
    max_x = own_bbox.south_east().x
    max_y = own_bbox.south_east().y
    for bbox in bboxes:
        if bbox.north_west().x < min_x:
            min_x = bbox.north_west().x
        if bbox.north_west().y < min_y:
            min_y = bbox.north_west().y
        if bbox.south_east().x > max_x:
            max_x = bbox.south_east().x
        if bbox.south_east().y > max_y:
            max_y = bbox.south_east().y
    bbox = momapy.geometry.Bbox(
        momapy.geometry.Point(min_x / 2 + max_x / 2, min_y / 2 + max_y / 2),
        max_x - min_x,
        max_y - min_y,
    )
    return bbox

border

border(point: Point) -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.drawing_elements(),
        point=point,
        center=self.center(),
    )

center

center() -> Point

Return the center anchor of the node

Source code in src/momapy/core/layout.py
def center(self) -> momapy.geometry.Point:
    """Return the center anchor of the node"""
    return self.position

childless

childless() -> Self

Return a copy of the node with no children

Source code in src/momapy/core/layout.py
def childless(self) -> typing_extensions.Self:
    """Return a copy of the node with no children"""
    return dataclasses.replace(self, label=None, layout_elements=tuple([]))

children

children() -> list[LayoutElement]

Return the children of the group layout. These are the self children of the group layout (returned by the own_children method) and the other children of the group layout (given by the layout_elements attribute)

Source code in src/momapy/core/layout.py
def children(self) -> list[LayoutElement]:
    """Return the children of the group layout.
    These are the self children of the group layout (returned by the `own_children` method) and the other children of the group layout (given by the `layout_elements` attribute)
    """
    return self.own_children() + list(self.layout_elements)

contains

contains(other: LayoutElement) -> bool

Return true if another layout element is a descendant of the layout element, false otherwise

Source code in src/momapy/core/elements.py
def contains(self, other: "LayoutElement") -> bool:
    """Return `true` if another layout element is a descendant of the layout element, `false` otherwise"""
    return other in self.descendants()

descendants

descendants() -> list[LayoutElement]

Return the descendants of the layout element

Source code in src/momapy/core/elements.py
def descendants(self) -> list["LayoutElement"]:
    """Return the descendants of the layout element"""
    descendants = []
    for child in self.children():
        descendants.append(child)
        descendants += child.descendants()
    return descendants

drawing_elements

drawing_elements() -> list[DrawingElement]

Return the drawing elements of the group layout. The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children

Source code in src/momapy/core/layout.py
def drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the drawing elements of the group layout.
    The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children
    """
    drawing_elements = self.own_drawing_elements()
    for child in self.children():
        if child is not None:
            drawing_elements += child.drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}",
        elements=tuple(drawing_elements),
        id_=f"{self.id_}",
        fill=self.group_fill,
        fill_rule=self.group_fill_rule,
        filter=self.group_filter,
        font_family=self.group_font_family,
        font_size=self.group_font_size,
        font_style=self.group_font_style,
        font_weight=self.group_font_weight,
        stroke=self.group_stroke,
        stroke_dasharray=self.group_stroke_dasharray,
        stroke_dashoffset=self.group_stroke_dashoffset,
        stroke_width=self.group_stroke_width,
        text_anchor=self.group_text_anchor,
        transform=self.group_transform,
    )
    return [group]

east

east() -> Point

Return the east anchor of the node

Source code in src/momapy/core/layout.py
def east(self) -> momapy.geometry.Point:
    """Return the east anchor of the node"""
    return self.own_angle(0)

east_north_east

east_north_east() -> Point

Return the east north east anchor of the node

Source code in src/momapy/core/layout.py
def east_north_east(self) -> momapy.geometry.Point:
    """Return the east north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

east_south_east

east_south_east() -> Point

Return the east south east west anchor of the node

Source code in src/momapy/core/layout.py
def east_south_east(self) -> momapy.geometry.Point:
    """Return the east south east west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

equals

equals(other: LayoutElement, flattened: bool = False, unordered: bool = False) -> bool

Return true if the layout element is equal to another layout element, false otherwise

Source code in src/momapy/core/elements.py
def equals(
    self, other: "LayoutElement", flattened: bool = False, unordered: bool = False
) -> bool:
    """Return `true` if the layout element is equal to another layout element, `false` otherwise"""
    if type(self) is type(other):
        if not flattened:
            return self == other
        else:
            if not unordered:
                return self.flattened() == other.flattened()
            else:
                return set(self.flattened()) == set(other.flattened())
    return False

flattened

flattened() -> list[LayoutElement]

Return a list containing copy of the layout element with no children and all its descendants with no children

Source code in src/momapy/core/elements.py
def flattened(self) -> list["LayoutElement"]:
    """Return a list containing copy of the layout element with no children and all its descendants with no children"""
    flattened = [self.childless()]
    for child in self.children():
        flattened += child.flattened()
    return flattened

label_center

label_center() -> Point

Return the label center anchor of the node

Source code in src/momapy/core/layout.py
def label_center(self) -> momapy.geometry.Point:
    """Return the label center anchor of the node"""
    return self.position

north

north() -> Point

Return the north anchor of the node

Source code in src/momapy/core/layout.py
def north(self) -> momapy.geometry.Point:
    """Return the north anchor of the node"""
    return self.own_angle(90)

north_east

north_east() -> Point

Return the north east anchor of the node

Source code in src/momapy/core/layout.py
def north_east(self) -> momapy.geometry.Point:
    """Return the north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_east

north_north_east() -> Point

Return the north north east anchor of the node

Source code in src/momapy/core/layout.py
def north_north_east(self) -> momapy.geometry.Point:
    """Return the north north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_west

north_north_west() -> Point

Return the north north west anchor of the node

Source code in src/momapy/core/layout.py
def north_north_west(self) -> momapy.geometry.Point:
    """Return the north north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_west

north_west() -> Point

Return the north west anchor of the node

Source code in src/momapy/core/layout.py
def north_west(self) -> momapy.geometry.Point:
    """Return the north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

own_angle

own_angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def own_angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.own_drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

own_bbox

own_bbox() -> Bbox

Compute and return the bounding box of the self drawing element of the group layout

Source code in src/momapy/core/layout.py
def own_bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the self drawing element of the group layout"""
    primitives = self.own_to_geometry()
    if not primitives:
        return momapy.geometry.Bbox(momapy.geometry.Point(0, 0), 0, 0)
    bboxes = [p.bbox() for p in primitives]
    return momapy.geometry.Bbox.union(bboxes)

own_border

own_border(point: Point) -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def own_border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.own_drawing_elements(),
        point=point,
        center=self.center(),
    )

own_children

own_children() -> list[LayoutElement]

Return the self children of the node. A node has unique child that is its label

Source code in src/momapy/core/layout.py
def own_children(self) -> list[LayoutElement]:
    """Return the self children of the node. A node has unique child that is its label"""
    if self.label is not None:
        return [self.label]
    return []

own_drawing_elements

own_drawing_elements() -> list[DrawingElement]

Return the node's own drawing elements

Source code in src/momapy/core/layout.py
def own_drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the node's own drawing elements"""
    drawing_elements = self._border_drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}_own",
        elements=tuple(drawing_elements),
        fill=self.fill,
        filter=self.filter,
        id_=f"{self.id_}_own",
        stroke=self.stroke,
        stroke_dasharray=self.stroke_dasharray,
        stroke_dashoffset=self.stroke_dashoffset,
        stroke_width=self.stroke_width,
        transform=self.transform,
    )
    return [group]

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

Source code in src/momapy/core/layout.py
def own_to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the self drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

size

size() -> tuple[float, float]

Return the size of the node

Source code in src/momapy/core/layout.py
def size(self) -> tuple[float, float]:
    """Return the size of the node"""
    return (self.width, self.height)

south

south() -> Point

Return the south anchor of the node

Source code in src/momapy/core/layout.py
def south(self) -> momapy.geometry.Point:
    """Return the south anchor of the node"""
    return self.own_angle(270)

south_east

south_east() -> Point

Return the south east anchor of the node

Source code in src/momapy/core/layout.py
def south_east(self) -> momapy.geometry.Point:
    """Return the south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_east

south_south_east() -> Point

Return the south south east anchor of the node

Source code in src/momapy/core/layout.py
def south_south_east(self) -> momapy.geometry.Point:
    """Return the south south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_west

south_south_west() -> Point

Return the south south west anchor of the node

Source code in src/momapy/core/layout.py
def south_south_west(self) -> momapy.geometry.Point:
    """Return the south south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_west

south_west() -> Point

Return the south west anchor of the node

Source code in src/momapy/core/layout.py
def south_west(self) -> momapy.geometry.Point:
    """Return the south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

to_geometry

Return a list of geometry primitives from the drawing elements.

Source code in src/momapy/core/elements.py
def to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

west

west() -> Point

Return the west anchor of the node

Source code in src/momapy/core/layout.py
def west(self) -> momapy.geometry.Point:
    """Return the west anchor of the node"""
    return self.own_angle(180)

west_north_west

west_north_west() -> Point

Return the west north west anchor of the node

Source code in src/momapy/core/layout.py
def west_north_west(self) -> momapy.geometry.Point:
    """Return the west north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

west_south_west

west_south_west() -> Point

Return the west south west anchor of the node

Source code in src/momapy/core/layout.py
def west_south_west(self) -> momapy.geometry.Point:
    """Return the west south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

x property

x: float

Return the x coordinate of the node

y property

y: float

Return the y coordinate of the node

UnknownInfluence dataclass

UnknownInfluence(*, id_: str = make_uuid4_as_str(), source: BiologicalActivity | LogicalOperator, target: Activity)

Bases: Influence

Influence of unspecified sign.

Used when the regulatory effect of the source on the target is not known.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'8630041c-eb94-40b0-9805-1770505c22c3'
source BiologicalActivity | LogicalOperator
required
target Activity
required

Methods:

Name Description
descendants

Return every ModelElement reachable from self, excluding self.

descendants

descendants() -> list[ModelElement]

Return every ModelElement reachable from self, excluding self.

Walks scalar ModelElement fields and frozenset/tuple containers, deduplicating by object identity.

Returns:

Type Description
list[ModelElement]

The list of reachable ModelElement instances in visit

list[ModelElement]

order, without self.

Source code in src/momapy/core/elements.py
def descendants(self) -> list["ModelElement"]:
    """Return every `ModelElement` reachable from `self`, excluding `self`.

    Walks scalar `ModelElement` fields and `frozenset`/`tuple`
    containers, deduplicating by object identity.

    Returns:
        The list of reachable `ModelElement` instances in visit
        order, without `self`.
    """
    seen: set[int] = {id(self)}
    result: list[ModelElement] = []
    if dataclasses.is_dataclass(self):
        for field in dataclasses.fields(type(self)):
            _walk_model_graph(getattr(self, field.name), seen, result)
    return result

UnknownInfluenceLayout dataclass

UnknownInfluenceLayout(path_fill: NoneValueType | Color | None = NoneValue, path_stroke: NoneValueType | Color | None = black, path_stroke_width: float | None = 1.25, arrowhead_fill: NoneValueType | Color | None = white, arrowhead_stroke: NoneValueType | Color | None = black, arrowhead_stroke_width: float | None = 1.25, *, id_: str = make_uuid4_as_str(), layout_elements: tuple[LayoutElement] = tuple(), group_fill: NoneValueType | Color | None = None, group_fill_rule: FillRule | None = None, group_filter: NoneValueType | Filter | None = None, group_font_family: str | None = None, group_font_size: float | None = None, group_font_style: FontStyle | None = None, group_font_weight: FontWeight | float | None = None, group_stroke: NoneValueType | Color | None = None, group_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, group_stroke_dashoffset: NoneValueType | float | None = None, group_stroke_width: NoneValueType | float | None = None, group_text_anchor: TextAnchor | None = None, group_transform: NoneValueType | tuple[Transformation] | None = None, end_shorten: float = 0.0, fill: NoneValueType | Color | None = None, filter: NoneValueType | Filter | None = None, path_filter: NoneValueType | Filter | None = None, path_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, path_stroke_dashoffset: NoneValueType | float | None = None, path_transform: NoneValueType | tuple[Transformation] | None = None, stroke: NoneValueType | Color | None = None, stroke_dasharray: NoneValueType | tuple[float] | None = None, stroke_dashoffset: NoneValueType | float | None = None, stroke_width: NoneValueType | float | None = None, segments: tuple[Segment | QuadraticBezierCurve | CubicBezierCurve | EllipticalArc] = tuple(), source: LayoutElement | None = None, start_shorten: float = 0.0, target: LayoutElement | None = None, transform: NoneValueType | tuple[Transformation] | None = None, arrowhead_filter: NoneValueType | Filter | None = None, arrowhead_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, arrowhead_stroke_dashoffset: NoneValueType | float | None = None, arrowhead_transform: NoneValueType | tuple[Transformation] | None = None, arrowhead_height: float = 10.0, arrowhead_width: float = 10.0)

Bases: SBGNSingleHeadedArc

Layout for unknown influences.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'8f367a75-bed2-4275-b3ec-20298deb7962'
layout_elements tuple[LayoutElement]

The sub-layout elements of the group layout. These are part of the children of the group layout

<dynamic>
group_fill NoneValueType | Color | None

The fill color of the group layout

None
group_fill_rule FillRule | None

The fill rule of the group layout

None
group_filter NoneValueType | Filter | None

The filter of the group layout

None
group_font_family str | None

The font family of the group layout

None
group_font_size float | None

The font size of the group layout

None
group_font_style FontStyle | None

The font style of the group layout

None
group_font_weight FontWeight | float | None

The font weight of the group layout

None
group_stroke NoneValueType | Color | None

The stroke color of the group layout

None
group_stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the group layout

None
group_stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the group layout

None
group_stroke_width NoneValueType | float | None

The stroke width of the group layout

None
group_text_anchor TextAnchor | None

The text anchor of the group layout

None
group_transform NoneValueType | tuple[Transformation] | None

The transform of the group layout

None
end_shorten float

The length the end of the arc will be shorten by

0.0
fill NoneValueType | Color | None

The fill color of the arc

None
filter NoneValueType | Filter | None

The fill filter of the arc

None
path_fill NoneValueType | Color | None

The path fill color of the arc

<momapy.drawing.NoneValueType object at 0x7fbe12e88d70>
path_filter NoneValueType | Filter | None

The path filter of the arc

None
path_stroke NoneValueType | Color | None

The path stroke color of the arc

Color(red=0, green=0, blue=0, alpha=1.0)
path_stroke_dasharray NoneValueType | tuple[float, ...] | None

The path stroke dasharray of the arc

None
path_stroke_dashoffset NoneValueType | float | None

The path stroke dashoffset of the arc

None
path_stroke_width float | None

The path stroke width of the arc

1.25
path_transform NoneValueType | tuple[Transformation] | None

The path transform of the arc

None
stroke NoneValueType | Color | None

The stroke color of the arc

None
stroke_dasharray NoneValueType | tuple[float] | None

The stroke dasharray of the arc

None
stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the arc

None
stroke_width NoneValueType | float | None

The stroke width of the arc

None
segments tuple[Segment | QuadraticBezierCurve | CubicBezierCurve | EllipticalArc]

The path segments of the arc

<dynamic>
source LayoutElement | None

The source of the arc

None
start_shorten float

The length the start of the arc will be shorten by

0.0
target LayoutElement | None

The target of the arc

None
transform NoneValueType | tuple[Transformation] | None

The transform of the arc

None
arrowhead_fill NoneValueType | Color | None

The arrowhead fill color of the arc

Color(red=255, green=255, blue=255, alpha=1.0)
arrowhead_filter NoneValueType | Filter | None

The arrowhead filter of the arc

None
arrowhead_stroke NoneValueType | Color | None

The arrowhead stroke color of the arc

Color(red=0, green=0, blue=0, alpha=1.0)
arrowhead_stroke_dasharray NoneValueType | tuple[float, ...] | None

The arrowhead stroke dasharray of the arc

None
arrowhead_stroke_dashoffset NoneValueType | float | None

The arrowhead stroke dashoffset of the arc

None
arrowhead_stroke_width float | None

The arrowhead stroke width of the arc

1.25
arrowhead_transform NoneValueType | tuple[Transformation] | None

The arrowhead transform of the arc

None
arrowhead_height float
10.0
arrowhead_width float
10.0

Methods:

Name Description
anchor_point

Return an anchor point of the layout element

arrowhead_base

Return the arrowhead base anchor point of the single-headed arc

arrowhead_bbox

Return the bounding box of the single-headed arc arrowhead

arrowhead_border

Return the point at the intersection of the drawing elements of the single-headed arc arrowhead and the line going through the center of these drawing elements and the given point.

arrowhead_drawing_elements

Return the drawing elements of the single-headed arc arrowhead

arrowhead_length

Return the length of the single-headed arc arrowhead

arrowhead_tip

Return the arrowhead tip anchor point of the single-headed arc

bbox

Compute and return the bounding box of the group layout element

childless

Return a copy of the arc with no children

children

Return the children of the group layout.

contains

Return true if another layout element is a descendant of the layout element, false otherwise

descendants

Return the descendants of the layout element

drawing_elements

Return the drawing elements of the group layout.

end_point

Return the ending point of the arc

equals

Return true if the layout element is equal to another layout element, false otherwise

flattened

Return a list containing copy of the layout element with no children and all its descendants with no children

fraction

Return the position and angle on the arc at a given fraction (of the total arc length)

length

Return the total length of the arc path

own_bbox

Compute and return the bounding box of the self drawing element of the group layout

own_children

Return the self children of the arc

own_drawing_elements

Return the self drawing elements of the single-headed arc

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

path_drawing_elements

Return the drawing elements of the single-headed arc path

points

Return the points of the arc path

start_point

Return the starting point of the arc

to_geometry

Return a list of geometry primitives from the drawing elements.

anchor_point

anchor_point(anchor_name: str) -> Point

Return an anchor point of the layout element

Source code in src/momapy/core/elements.py
def anchor_point(self, anchor_name: str) -> momapy.geometry.Point:
    """Return an anchor point of the layout element"""
    return getattr(self, anchor_name)()

arrowhead_base

arrowhead_base() -> Point

Return the arrowhead base anchor point of the single-headed arc

Source code in src/momapy/core/layout.py
def arrowhead_base(self) -> momapy.geometry.Point:
    """Return the arrowhead base anchor point of the single-headed arc"""
    arrowhead_length = self.arrowhead_length()
    segment = self.segments[-1]
    segment_length = segment.length()
    if segment_length == 0:
        return self.arrowhead_tip() - (arrowhead_length, 0)
    fraction = 1 - (arrowhead_length + self.end_shorten) / segment_length
    return segment.get_position_at_fraction(fraction)

arrowhead_bbox

arrowhead_bbox() -> Bbox

Return the bounding box of the single-headed arc arrowhead

Source code in src/momapy/core/layout.py
def arrowhead_bbox(self) -> momapy.geometry.Bbox:
    """Return the bounding box of the single-headed arc arrowhead"""
    return momapy.drawing.get_drawing_elements_bbox(
        self.arrowhead_drawing_elements()
    )

arrowhead_border

arrowhead_border(point) -> Point

Return the point at the intersection of the drawing elements of the single-headed arc arrowhead and the line going through the center of these drawing elements and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def arrowhead_border(self, point) -> momapy.geometry.Point:
    """Return the point at the intersection of the drawing elements of the single-headed arc arrowhead and the line going through the center of these drawing elements and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """

    point = momapy.drawing.get_drawing_elements_border(
        self.arrowhead_drawing_elements(), point
    )
    if point is None:
        return self.arrowhead_tip()
    return point

arrowhead_drawing_elements

arrowhead_drawing_elements() -> list[DrawingElement]

Return the drawing elements of the single-headed arc arrowhead

Source code in src/momapy/core/layout.py
def arrowhead_drawing_elements(
    self,
) -> list[momapy.drawing.DrawingElement]:
    """Return the drawing elements of the single-headed arc arrowhead"""
    drawing_elements = self._arrowhead_border_drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}_arrowhead",
        elements=tuple(drawing_elements),
        fill=self.arrowhead_fill,
        filter=self.arrowhead_filter,
        id_=f"{self.id_}_arrowhead",
        stroke=self.arrowhead_stroke,
        stroke_dasharray=self.arrowhead_stroke_dasharray,
        stroke_dashoffset=self.arrowhead_stroke_dashoffset,
        stroke_width=self.arrowhead_stroke_width,
        transform=self.arrowhead_transform,
    )
    transformation = self._get_arrowhead_transformation()
    group = group.transformed(transformation)
    return [group]

arrowhead_length

arrowhead_length() -> float

Return the length of the single-headed arc arrowhead

Source code in src/momapy/core/layout.py
def arrowhead_length(self) -> float:
    """Return the length of the single-headed arc arrowhead"""
    bbox = momapy.drawing.get_drawing_elements_bbox(
        self._arrowhead_border_drawing_elements()
    )
    if math.isnan(bbox.width):
        return 0.0
    return bbox.east().x

arrowhead_tip

arrowhead_tip() -> Point

Return the arrowhead tip anchor point of the single-headed arc

Source code in src/momapy/core/layout.py
def arrowhead_tip(self) -> momapy.geometry.Point:
    """Return the arrowhead tip anchor point of the single-headed arc"""
    segment = self.segments[-1]
    segment_length = segment.length()
    if segment_length == 0:
        return segment.p2
    fraction = 1 - self.end_shorten / segment_length
    return segment.get_position_at_fraction(fraction)

bbox

bbox() -> Bbox

Compute and return the bounding box of the group layout element

Source code in src/momapy/core/layout.py
def bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the group layout element"""
    own_bbox = self.own_bbox()
    bboxes = [child.bbox() for child in self.children()]
    min_x = own_bbox.north_west().x
    min_y = own_bbox.north_west().y
    max_x = own_bbox.south_east().x
    max_y = own_bbox.south_east().y
    for bbox in bboxes:
        if bbox.north_west().x < min_x:
            min_x = bbox.north_west().x
        if bbox.north_west().y < min_y:
            min_y = bbox.north_west().y
        if bbox.south_east().x > max_x:
            max_x = bbox.south_east().x
        if bbox.south_east().y > max_y:
            max_y = bbox.south_east().y
    bbox = momapy.geometry.Bbox(
        momapy.geometry.Point(min_x / 2 + max_x / 2, min_y / 2 + max_y / 2),
        max_x - min_x,
        max_y - min_y,
    )
    return bbox

childless

childless() -> Self

Return a copy of the arc with no children

Source code in src/momapy/core/layout.py
def childless(self) -> typing_extensions.Self:
    """Return a copy of the arc with no children"""
    return dataclasses.replace(self, layout_elements=tuple([]))

children

children() -> list[LayoutElement]

Return the children of the group layout. These are the self children of the group layout (returned by the own_children method) and the other children of the group layout (given by the layout_elements attribute)

Source code in src/momapy/core/layout.py
def children(self) -> list[LayoutElement]:
    """Return the children of the group layout.
    These are the self children of the group layout (returned by the `own_children` method) and the other children of the group layout (given by the `layout_elements` attribute)
    """
    return self.own_children() + list(self.layout_elements)

contains

contains(other: LayoutElement) -> bool

Return true if another layout element is a descendant of the layout element, false otherwise

Source code in src/momapy/core/elements.py
def contains(self, other: "LayoutElement") -> bool:
    """Return `true` if another layout element is a descendant of the layout element, `false` otherwise"""
    return other in self.descendants()

descendants

descendants() -> list[LayoutElement]

Return the descendants of the layout element

Source code in src/momapy/core/elements.py
def descendants(self) -> list["LayoutElement"]:
    """Return the descendants of the layout element"""
    descendants = []
    for child in self.children():
        descendants.append(child)
        descendants += child.descendants()
    return descendants

drawing_elements

drawing_elements() -> list[DrawingElement]

Return the drawing elements of the group layout. The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children

Source code in src/momapy/core/layout.py
def drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the drawing elements of the group layout.
    The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children
    """
    drawing_elements = self.own_drawing_elements()
    for child in self.children():
        if child is not None:
            drawing_elements += child.drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}",
        elements=tuple(drawing_elements),
        id_=f"{self.id_}",
        fill=self.group_fill,
        fill_rule=self.group_fill_rule,
        filter=self.group_filter,
        font_family=self.group_font_family,
        font_size=self.group_font_size,
        font_style=self.group_font_style,
        font_weight=self.group_font_weight,
        stroke=self.group_stroke,
        stroke_dasharray=self.group_stroke_dasharray,
        stroke_dashoffset=self.group_stroke_dashoffset,
        stroke_width=self.group_stroke_width,
        text_anchor=self.group_text_anchor,
        transform=self.group_transform,
    )
    return [group]

end_point

end_point() -> Point

Return the ending point of the arc

Source code in src/momapy/core/layout.py
def end_point(self) -> momapy.geometry.Point:
    """Return the ending point of the arc"""
    return self.points()[-1]

equals

equals(other: LayoutElement, flattened: bool = False, unordered: bool = False) -> bool

Return true if the layout element is equal to another layout element, false otherwise

Source code in src/momapy/core/elements.py
def equals(
    self, other: "LayoutElement", flattened: bool = False, unordered: bool = False
) -> bool:
    """Return `true` if the layout element is equal to another layout element, `false` otherwise"""
    if type(self) is type(other):
        if not flattened:
            return self == other
        else:
            if not unordered:
                return self.flattened() == other.flattened()
            else:
                return set(self.flattened()) == set(other.flattened())
    return False

flattened

flattened() -> list[LayoutElement]

Return a list containing copy of the layout element with no children and all its descendants with no children

Source code in src/momapy/core/elements.py
def flattened(self) -> list["LayoutElement"]:
    """Return a list containing copy of the layout element with no children and all its descendants with no children"""
    flattened = [self.childless()]
    for child in self.children():
        flattened += child.flattened()
    return flattened

fraction

fraction(fraction: float) -> tuple[Point, float]

Return the position and angle on the arc at a given fraction (of the total arc length)

Source code in src/momapy/core/layout.py
def fraction(self, fraction: float) -> tuple[momapy.geometry.Point, float]:
    """Return the position and angle on the arc at a given fraction (of the total arc length)"""
    current_length = 0
    length_to_reach = fraction * self.length()
    for segment in self.segments:
        current_length += segment.length()
        if current_length >= length_to_reach:
            break
    segment_start_length = current_length - segment.length()
    segment_fraction = (length_to_reach - segment_start_length) / segment.length()
    position, angle = segment.get_position_and_angle_at_fraction(segment_fraction)
    return position, angle

length

length()

Return the total length of the arc path

Source code in src/momapy/core/layout.py
def length(self):
    """Return the total length of the arc path"""
    return sum([segment.length() for segment in self.segments])

own_bbox

own_bbox() -> Bbox

Compute and return the bounding box of the self drawing element of the group layout

Source code in src/momapy/core/layout.py
def own_bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the self drawing element of the group layout"""
    primitives = self.own_to_geometry()
    if not primitives:
        return momapy.geometry.Bbox(momapy.geometry.Point(0, 0), 0, 0)
    bboxes = [p.bbox() for p in primitives]
    return momapy.geometry.Bbox.union(bboxes)

own_children

own_children() -> list[LayoutElement]

Return the self children of the arc

Source code in src/momapy/core/layout.py
def own_children(self) -> list[LayoutElement]:
    """Return the self children of the arc"""
    return []

own_drawing_elements

own_drawing_elements() -> list[DrawingElement]

Return the self drawing elements of the single-headed arc

Source code in src/momapy/core/layout.py
def own_drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the self drawing elements of the single-headed arc"""
    drawing_elements = (
        self.path_drawing_elements() + self.arrowhead_drawing_elements()
    )
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}_own",
        elements=tuple(drawing_elements),
        fill=self.fill,
        filter=self.filter,
        id_=f"{self.id_}_own",
        stroke=self.stroke,
        stroke_dasharray=self.stroke_dasharray,
        stroke_dashoffset=self.stroke_dashoffset,
        stroke_width=self.stroke_width,
        transform=self.transform,
    )
    return [group]

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

Source code in src/momapy/core/layout.py
def own_to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the self drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

path_drawing_elements

path_drawing_elements() -> list[Path]

Return the drawing elements of the single-headed arc path

Source code in src/momapy/core/layout.py
def path_drawing_elements(self) -> list[momapy.drawing.Path]:
    """Return the drawing elements of the single-headed arc path"""
    arrowhead_length = self.arrowhead_length()
    if len(self.segments) == 1:
        segment = (
            self.segments[0]
            .shortened(self.start_shorten, "start")
            .shortened(self.end_shorten + arrowhead_length, "end")
        )
        actions = [
            momapy.drawing.MoveTo(segment.p1),
            self._make_path_action_from_segment(segment),
        ]
    else:
        first_segment = self.segments[0].shortened(self.start_shorten, "start")
        last_segment = self.segments[-1].shortened(
            self.end_shorten + arrowhead_length, "end"
        )
        actions = [
            momapy.drawing.MoveTo(first_segment.p1),
            self._make_path_action_from_segment(first_segment),
        ]
        for segment in self.segments[1:-1]:
            action = self._make_path_action_from_segment(segment)
            actions.append(action)
        actions.append(self._make_path_action_from_segment(last_segment))
    path = momapy.drawing.Path(
        actions=tuple(actions),
        class_=f"{type(self).__name__}_path",
        fill=self.path_fill,
        filter=self.path_filter,
        id_=f"{self.id_}_path",
        stroke=self.path_stroke,
        stroke_dasharray=self.path_stroke_dasharray,
        stroke_dashoffset=self.path_stroke_dashoffset,
        stroke_width=self.path_stroke_width,
        transform=self.path_transform,
    )
    return [path]

points

points() -> list[Point]

Return the points of the arc path

Source code in src/momapy/core/layout.py
def points(self) -> list[momapy.geometry.Point]:
    """Return the points of the arc path"""
    points = []
    for segment in self.segments:
        points.append(segment.p1)
    points.append(segment.p2)
    return points

start_point

start_point() -> Point

Return the starting point of the arc

Source code in src/momapy/core/layout.py
def start_point(self) -> momapy.geometry.Point:
    """Return the starting point of the arc"""
    return self.points()[0]

to_geometry

Return a list of geometry primitives from the drawing elements.

Source code in src/momapy/core/elements.py
def to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

UnspecifiedEntityUnitOfInformation dataclass

UnspecifiedEntityUnitOfInformation(*, id_: str = make_uuid4_as_str(), label: str | None = None)

Bases: UnitOfInformation

Unit of information typing a biological activity as an unspecified entity.

Used when the underlying entity class is unknown or deliberately abstract.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'28032779-72ca-4d3b-aa55-724f264fb270'
label str | None
None

Methods:

Name Description
descendants

Return every ModelElement reachable from self, excluding self.

descendants

descendants() -> list[ModelElement]

Return every ModelElement reachable from self, excluding self.

Walks scalar ModelElement fields and frozenset/tuple containers, deduplicating by object identity.

Returns:

Type Description
list[ModelElement]

The list of reachable ModelElement instances in visit

list[ModelElement]

order, without self.

Source code in src/momapy/core/elements.py
def descendants(self) -> list["ModelElement"]:
    """Return every `ModelElement` reachable from `self`, excluding `self`.

    Walks scalar `ModelElement` fields and `frozenset`/`tuple`
    containers, deduplicating by object identity.

    Returns:
        The list of reachable `ModelElement` instances in visit
        order, without `self`.
    """
    seen: set[int] = {id(self)}
    result: list[ModelElement] = []
    if dataclasses.is_dataclass(self):
        for field in dataclasses.fields(type(self)):
            _walk_model_graph(getattr(self, field.name), seen, result)
    return result

UnspecifiedEntityUnitOfInformationLayout dataclass

UnspecifiedEntityUnitOfInformationLayout(fill: NoneValueType | Color | None = white, stroke: NoneValueType | Color | None = black, stroke_width: float | None = 1.25, *, id_: str = make_uuid4_as_str(), layout_elements: tuple[LayoutElement] = tuple(), group_fill: NoneValueType | Color | None = None, group_fill_rule: FillRule | None = None, group_filter: NoneValueType | Filter | None = None, group_font_family: str | None = None, group_font_size: float | None = None, group_font_style: FontStyle | None = None, group_font_weight: FontWeight | float | None = None, group_stroke: NoneValueType | Color | None = None, group_stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, group_stroke_dashoffset: NoneValueType | float | None = None, group_stroke_width: NoneValueType | float | None = None, group_text_anchor: TextAnchor | None = None, group_transform: NoneValueType | tuple[Transformation] | None = None, filter: NoneValueType | Filter | None = None, height: float = 12.0, label: TextLayout | None = None, position: Point, stroke_dasharray: NoneValueType | tuple[float, ...] | None = None, stroke_dashoffset: NoneValueType | float | None = None, transform: NoneValueType | tuple[Transformation] | None = None, width: float = 12.0)

Bases: _SimpleMixin, SBGNNode

Layout for unspecified entity units of information.

Parameters:

Name Type Description Default
id_ str

The id of the map element. This id is purely for the user to keep track of the element, it does not need to be unique and is not part of the identity of the element, i.e., it is not considered when testing for equality between two map elements or when hashing the map element

'a00b50f6-590e-4172-aefc-5f3c96bf1080'
layout_elements tuple[LayoutElement]

The sub-layout elements of the group layout. These are part of the children of the group layout

<dynamic>
group_fill NoneValueType | Color | None

The fill color of the group layout

None
group_fill_rule FillRule | None

The fill rule of the group layout

None
group_filter NoneValueType | Filter | None

The filter of the group layout

None
group_font_family str | None

The font family of the group layout

None
group_font_size float | None

The font size of the group layout

None
group_font_style FontStyle | None

The font style of the group layout

None
group_font_weight FontWeight | float | None

The font weight of the group layout

None
group_stroke NoneValueType | Color | None

The stroke color of the group layout

None
group_stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the group layout

None
group_stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the group layout

None
group_stroke_width NoneValueType | float | None

The stroke width of the group layout

None
group_text_anchor TextAnchor | None

The text anchor of the group layout

None
group_transform NoneValueType | tuple[Transformation] | None

The transform of the group layout

None
fill NoneValueType | Color | None

The fill color of the node

Color(red=255, green=255, blue=255, alpha=1.0)
filter NoneValueType | Filter | None

The filter of the node

None
height float

The height of the node

12.0
label TextLayout | None

The label of the node

None
position Point

The position of the node

required
stroke NoneValueType | Color | None

The stroke color of the node

Color(red=0, green=0, blue=0, alpha=1.0)
stroke_dasharray NoneValueType | tuple[float, ...] | None

The stroke dasharray of the node

None
stroke_dashoffset NoneValueType | float | None

The stroke dashoffset of the node

None
stroke_width float | None

The stroke width of the node

1.25
transform NoneValueType | tuple[Transformation] | None

The transform of the node

None
width float

The width width of the node

12.0

Methods:

Name Description
anchor_point

Return an anchor point of the layout element

angle

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

bbox

Compute and return the bounding box of the group layout element

border

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.

center

Return the center anchor of the node

childless

Return a copy of the node with no children

children

Return the children of the group layout.

contains

Return true if another layout element is a descendant of the layout element, false otherwise

descendants

Return the descendants of the layout element

drawing_elements

Return the drawing elements of the group layout.

east

Return the east anchor of the node

east_north_east

Return the east north east anchor of the node

east_south_east

Return the east south east west anchor of the node

equals

Return true if the layout element is equal to another layout element, false otherwise

flattened

Return a list containing copy of the layout element with no children and all its descendants with no children

label_center

Return the label center anchor of the node

north

Return the north anchor of the node

north_east

Return the north east anchor of the node

north_north_east

Return the north north east anchor of the node

north_north_west

Return the north north west anchor of the node

north_west

Return the north west anchor of the node

own_angle

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

own_bbox

Compute and return the bounding box of the self drawing element of the group layout

own_border

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.

own_children

Return the self children of the node. A node has unique child that is its label

own_drawing_elements

Return the node's own drawing elements

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

size

Return the size of the node

south

Return the south anchor of the node

south_east

Return the south east anchor of the node

south_south_east

Return the south south east anchor of the node

south_south_west

Return the south south west anchor of the node

south_west

Return the south west anchor of the node

to_geometry

Return a list of geometry primitives from the drawing elements.

west

Return the west anchor of the node

west_north_west

Return the west north west anchor of the node

west_south_west

Return the west south west anchor of the node

Attributes:

Name Type Description
x float

Return the x coordinate of the node

y float

Return the y coordinate of the node

anchor_point

anchor_point(anchor_name: str) -> Point

Return an anchor point of the layout element

Source code in src/momapy/core/elements.py
def anchor_point(self, anchor_name: str) -> momapy.geometry.Point:
    """Return an anchor point of the layout element"""
    return getattr(self, anchor_name)()

angle

angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

bbox

bbox() -> Bbox

Compute and return the bounding box of the group layout element

Source code in src/momapy/core/layout.py
def bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the group layout element"""
    own_bbox = self.own_bbox()
    bboxes = [child.bbox() for child in self.children()]
    min_x = own_bbox.north_west().x
    min_y = own_bbox.north_west().y
    max_x = own_bbox.south_east().x
    max_y = own_bbox.south_east().y
    for bbox in bboxes:
        if bbox.north_west().x < min_x:
            min_x = bbox.north_west().x
        if bbox.north_west().y < min_y:
            min_y = bbox.north_west().y
        if bbox.south_east().x > max_x:
            max_x = bbox.south_east().x
        if bbox.south_east().y > max_y:
            max_y = bbox.south_east().y
    bbox = momapy.geometry.Bbox(
        momapy.geometry.Point(min_x / 2 + max_x / 2, min_y / 2 + max_y / 2),
        max_x - min_x,
        max_y - min_y,
    )
    return bbox

border

border(point: Point) -> Point | None

Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.drawing_elements(),
        point=point,
        center=self.center(),
    )

center

center() -> Point

Return the center anchor of the node

Source code in src/momapy/core/layout.py
def center(self) -> momapy.geometry.Point:
    """Return the center anchor of the node"""
    return self.position

childless

childless() -> Self

Return a copy of the node with no children

Source code in src/momapy/core/layout.py
def childless(self) -> typing_extensions.Self:
    """Return a copy of the node with no children"""
    return dataclasses.replace(self, label=None, layout_elements=tuple([]))

children

children() -> list[LayoutElement]

Return the children of the group layout. These are the self children of the group layout (returned by the own_children method) and the other children of the group layout (given by the layout_elements attribute)

Source code in src/momapy/core/layout.py
def children(self) -> list[LayoutElement]:
    """Return the children of the group layout.
    These are the self children of the group layout (returned by the `own_children` method) and the other children of the group layout (given by the `layout_elements` attribute)
    """
    return self.own_children() + list(self.layout_elements)

contains

contains(other: LayoutElement) -> bool

Return true if another layout element is a descendant of the layout element, false otherwise

Source code in src/momapy/core/elements.py
def contains(self, other: "LayoutElement") -> bool:
    """Return `true` if another layout element is a descendant of the layout element, `false` otherwise"""
    return other in self.descendants()

descendants

descendants() -> list[LayoutElement]

Return the descendants of the layout element

Source code in src/momapy/core/elements.py
def descendants(self) -> list["LayoutElement"]:
    """Return the descendants of the layout element"""
    descendants = []
    for child in self.children():
        descendants.append(child)
        descendants += child.descendants()
    return descendants

drawing_elements

drawing_elements() -> list[DrawingElement]

Return the drawing elements of the group layout. The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children

Source code in src/momapy/core/layout.py
def drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the drawing elements of the group layout.
    The returned drawing elements are a group drawing element formed of the self drawing elements of the group layout and the drawing elements of its children
    """
    drawing_elements = self.own_drawing_elements()
    for child in self.children():
        if child is not None:
            drawing_elements += child.drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}",
        elements=tuple(drawing_elements),
        id_=f"{self.id_}",
        fill=self.group_fill,
        fill_rule=self.group_fill_rule,
        filter=self.group_filter,
        font_family=self.group_font_family,
        font_size=self.group_font_size,
        font_style=self.group_font_style,
        font_weight=self.group_font_weight,
        stroke=self.group_stroke,
        stroke_dasharray=self.group_stroke_dasharray,
        stroke_dashoffset=self.group_stroke_dashoffset,
        stroke_width=self.group_stroke_width,
        text_anchor=self.group_text_anchor,
        transform=self.group_transform,
    )
    return [group]

east

east() -> Point

Return the east anchor of the node

Source code in src/momapy/core/layout.py
def east(self) -> momapy.geometry.Point:
    """Return the east anchor of the node"""
    return self.own_angle(0)

east_north_east

east_north_east() -> Point

Return the east north east anchor of the node

Source code in src/momapy/core/layout.py
def east_north_east(self) -> momapy.geometry.Point:
    """Return the east north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

east_south_east

east_south_east() -> Point

Return the east south east west anchor of the node

Source code in src/momapy/core/layout.py
def east_south_east(self) -> momapy.geometry.Point:
    """Return the east south east west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

equals

equals(other: LayoutElement, flattened: bool = False, unordered: bool = False) -> bool

Return true if the layout element is equal to another layout element, false otherwise

Source code in src/momapy/core/elements.py
def equals(
    self, other: "LayoutElement", flattened: bool = False, unordered: bool = False
) -> bool:
    """Return `true` if the layout element is equal to another layout element, `false` otherwise"""
    if type(self) is type(other):
        if not flattened:
            return self == other
        else:
            if not unordered:
                return self.flattened() == other.flattened()
            else:
                return set(self.flattened()) == set(other.flattened())
    return False

flattened

flattened() -> list[LayoutElement]

Return a list containing copy of the layout element with no children and all its descendants with no children

Source code in src/momapy/core/elements.py
def flattened(self) -> list["LayoutElement"]:
    """Return a list containing copy of the layout element with no children and all its descendants with no children"""
    flattened = [self.childless()]
    for child in self.children():
        flattened += child.flattened()
    return flattened

label_center

label_center() -> Point

Return the label center anchor of the node

Source code in src/momapy/core/layout.py
def label_center(self) -> momapy.geometry.Point:
    """Return the label center anchor of the node"""
    return self.position

north

north() -> Point

Return the north anchor of the node

Source code in src/momapy/core/layout.py
def north(self) -> momapy.geometry.Point:
    """Return the north anchor of the node"""
    return self.own_angle(90)

north_east

north_east() -> Point

Return the north east anchor of the node

Source code in src/momapy/core/layout.py
def north_east(self) -> momapy.geometry.Point:
    """Return the north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_east

north_north_east() -> Point

Return the north north east anchor of the node

Source code in src/momapy/core/layout.py
def north_north_east(self) -> momapy.geometry.Point:
    """Return the north north east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, -self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_north_west

north_north_west() -> Point

Return the north north west anchor of the node

Source code in src/momapy/core/layout.py
def north_north_west(self) -> momapy.geometry.Point:
    """Return the north north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

north_west

north_west() -> Point

Return the north west anchor of the node

Source code in src/momapy/core/layout.py
def north_west(self) -> momapy.geometry.Point:
    """Return the north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

own_angle

own_angle(angle: float, unit: Literal['degrees', 'radians'] = 'degrees') -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal.

Source code in src/momapy/core/layout.py
def own_angle(
    self,
    angle: float,
    unit: typing.Literal["degrees", "radians"] = "degrees",
) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line passing through the center anchor point of the node and at a given angle from the horizontal."""
    return momapy.drawing.get_drawing_elements_angle(
        drawing_elements=self.own_drawing_elements(),
        angle=angle,
        unit=unit,
        center=self.center(),
    )

own_bbox

own_bbox() -> Bbox

Compute and return the bounding box of the self drawing element of the group layout

Source code in src/momapy/core/layout.py
def own_bbox(self) -> momapy.geometry.Bbox:
    """Compute and return the bounding box of the self drawing element of the group layout"""
    primitives = self.own_to_geometry()
    if not primitives:
        return momapy.geometry.Bbox(momapy.geometry.Point(0, 0), 0, 0)
    bboxes = [p.bbox() for p in primitives]
    return momapy.geometry.Bbox.union(bboxes)

own_border

own_border(point: Point) -> Point | None

Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point. When there are multiple intersection points, the one closest to the given point is returned

Source code in src/momapy/core/layout.py
def own_border(self, point: momapy.geometry.Point) -> momapy.geometry.Point | None:
    """Return the point on the border of the node that intersects the self drawing elements of the node with the line formed of the center anchor point of the node and the given point.
    When there are multiple intersection points, the one closest to the given point is returned
    """
    return momapy.drawing.get_drawing_elements_border(
        drawing_elements=self.own_drawing_elements(),
        point=point,
        center=self.center(),
    )

own_children

own_children() -> list[LayoutElement]

Return the self children of the node. A node has unique child that is its label

Source code in src/momapy/core/layout.py
def own_children(self) -> list[LayoutElement]:
    """Return the self children of the node. A node has unique child that is its label"""
    if self.label is not None:
        return [self.label]
    return []

own_drawing_elements

own_drawing_elements() -> list[DrawingElement]

Return the node's own drawing elements

Source code in src/momapy/core/layout.py
def own_drawing_elements(self) -> list[momapy.drawing.DrawingElement]:
    """Return the node's own drawing elements"""
    drawing_elements = self._border_drawing_elements()
    group = momapy.drawing.Group(
        class_=f"{type(self).__name__}_own",
        elements=tuple(drawing_elements),
        fill=self.fill,
        filter=self.filter,
        id_=f"{self.id_}_own",
        stroke=self.stroke,
        stroke_dasharray=self.stroke_dasharray,
        stroke_dashoffset=self.stroke_dashoffset,
        stroke_width=self.stroke_width,
        transform=self.transform,
    )
    return [group]

own_to_geometry

Return a list of geometry primitives from the self drawing elements.

Source code in src/momapy/core/layout.py
def own_to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the self drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

size

size() -> tuple[float, float]

Return the size of the node

Source code in src/momapy/core/layout.py
def size(self) -> tuple[float, float]:
    """Return the size of the node"""
    return (self.width, self.height)

south

south() -> Point

Return the south anchor of the node

Source code in src/momapy/core/layout.py
def south(self) -> momapy.geometry.Point:
    """Return the south anchor of the node"""
    return self.own_angle(270)

south_east

south_east() -> Point

Return the south east anchor of the node

Source code in src/momapy/core/layout.py
def south_east(self) -> momapy.geometry.Point:
    """Return the south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_east

south_south_east() -> Point

Return the south south east anchor of the node

Source code in src/momapy/core/layout.py
def south_south_east(self) -> momapy.geometry.Point:
    """Return the south south east anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_south_west

south_south_west() -> Point

Return the south south west anchor of the node

Source code in src/momapy/core/layout.py
def south_south_west(self) -> momapy.geometry.Point:
    """Return the south south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 4, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

south_west

south_west() -> Point

Return the south west anchor of the node

Source code in src/momapy/core/layout.py
def south_west(self) -> momapy.geometry.Point:
    """Return the south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 2)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

to_geometry

Return a list of geometry primitives from the drawing elements.

Source code in src/momapy/core/elements.py
def to_geometry(
    self,
) -> list[
    momapy.geometry.Segment
    | momapy.geometry.QuadraticBezierCurve
    | momapy.geometry.CubicBezierCurve
    | momapy.geometry.EllipticalArc
]:
    """Return a list of geometry primitives from the drawing elements."""
    return momapy.drawing.drawing_elements_to_geometry(self.drawing_elements())

west

west() -> Point

Return the west anchor of the node

Source code in src/momapy/core/layout.py
def west(self) -> momapy.geometry.Point:
    """Return the west anchor of the node"""
    return self.own_angle(180)

west_north_west

west_north_west() -> Point

Return the west north west anchor of the node

Source code in src/momapy/core/layout.py
def west_north_west(self) -> momapy.geometry.Point:
    """Return the west north west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() - (self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

west_south_west

west_south_west() -> Point

Return the west south west anchor of the node

Source code in src/momapy/core/layout.py
def west_south_west(self) -> momapy.geometry.Point:
    """Return the west south west anchor of the node"""
    line = momapy.geometry.Line(
        self.center(), self.center() + (-self.width / 2, self.height / 4)
    )
    angle = -line.get_angle_to_horizontal()
    return self.own_angle(angle, unit="radians")

x property

x: float

Return the x coordinate of the node

y property

y: float

Return the y coordinate of the node