Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
# Treat edge case when delta_x = 0
if delta_x == 0:
if delta_y == 0:
return center_x, center_y
else:
return center_x, center_y + copysign(height / 2, delta_y)
width = copysign(width, delta_x)
height = copysign(height, delta_y)
f = height / (height + width * delta_y / delta_x)
return center_x + f * width / 2, center_y + (1-f) * height / 2
#####################################################################
class PolygonDrawer(AbstractCairoDrawer):
"""Class that is used to draw polygons.
The corner points of the polygon can be set by the C{points}
property of the drawer, or passed at construction time. Most
drawing methods in this class also have an extra C{points}
argument that can be used to override the set of points in the
C{points} property."""
def __init__(self, context, bbox=(1, 1), points = []):
"""Constructs a new polygon drawer that draws on the given
Cairo context.
@param context: the Cairo context to draw on
@param bbox: ignored, leave it at its default value
@param points: the list of corner points
"""
self.layout = layout
self.palette = palette
def draw(self, visual_vertex, vertex, coords):
"""Draws the given vertex.
@param visual_vertex: object specifying the visual properties of the
vertex. Its structure is defined by the VisualVertexBuilder of the
L{DefaultGraphDrawer}; see its source code.
@param vertex: the raw igraph vertex being drawn
@param coords: the X and Y coordinates of the vertex as specified by the
layout algorithm, scaled into the bounding box.
"""
raise NotImplementedError("abstract class")
class AbstractCairoVertexDrawer(AbstractVertexDrawer, AbstractCairoDrawer):
"""Abstract base class for vertex drawers that draw on a Cairo canvas."""
def __init__(self, context, bbox, palette, layout):
"""Constructs the vertex drawer and associates it to the given
Cairo context and the given L{BoundingBox}.
@param context: the context on which we will draw
@param bbox: the bounding box within which we will draw.
Can be anything accepted by the constructor
of L{BoundingBox} (i.e., a 2-tuple, a 4-tuple
or a L{BoundingBox} object).
@param palette: the palette that can be used to map integer
color indices to colors when drawing vertices
@param layout: the layout of the vertices in the graph being drawn
"""
AbstractCairoDrawer.__init__(self, context, bbox)
self.layout = layout
self.palette = palette
def draw(self, visual_vertex, vertex, coords):
"""Draws the given vertex.
@param visual_vertex: object specifying the visual properties of the
vertex. Its structure is defined by the VisualVertexBuilder of the
L{DefaultGraphDrawer}; see its source code.
@param vertex: the raw igraph vertex being drawn
@param coords: the X and Y coordinates of the vertex as specified by the
layout algorithm, scaled into the bounding box.
"""
raise NotImplementedError("abstract class")
class AbstractCairoVertexDrawer(AbstractVertexDrawer, AbstractCairoDrawer):
"""Abstract base class for vertex drawers that draw on a Cairo canvas."""
def __init__(self, context, bbox, palette, layout):
"""Constructs the vertex drawer and associates it to the given
Cairo context and the given L{BoundingBox}.
@param context: the context on which we will draw
@param bbox: the bounding box within which we will draw.
Can be anything accepted by the constructor
of L{BoundingBox} (i.e., a 2-tuple, a 4-tuple
or a L{BoundingBox} object).
@param palette: the palette that can be used to map integer
color indices to colors when drawing vertices
@param layout: the layout of the vertices in the graph being drawn
"""
AbstractCairoDrawer.__init__(self, context, bbox)
__all__ = ["TextAlignment", "TextDrawer"]
__license__ = "GPL"
__docformat__ = "restructuredtext en"
#####################################################################
class TextAlignment(object):
"""Text alignment constants."""
LEFT, CENTER, RIGHT = "left", "center", "right"
TOP, BOTTOM = "top", "bottom"
#####################################################################
class TextDrawer(AbstractCairoDrawer):
"""Class that draws text on a Cairo context.
This class supports multi-line text unlike the original Cairo text
drawing methods."""
LEFT, CENTER, RIGHT = "left", "center", "right"
TOP, BOTTOM = "top", "bottom"
def __init__(self, context, text="", halign="center", valign="center"):
"""Constructs a new instance that will draw the given `text` on
the given Cairo `context`."""
super(TextDrawer, self).__init__(context, (0, 0))
self.text = text
self.halign = halign
self.valign = valign
def __init__(self, context, bbox):
"""Initializes the coordinate system.
@param context: the context on which the coordinate system will
be drawn.
@param bbox: the bounding box that will contain the coordinate
system.
"""
AbstractCairoDrawer.__init__(self, context, bbox)
"""Text alignment constants."""
LEFT, CENTER, RIGHT = "left", "center", "right"
TOP, BOTTOM = "top", "bottom"
#####################################################################
class TextAlignment(object):
"""Text alignment constants."""
LEFT, CENTER, RIGHT = "left", "center", "right"
TOP, BOTTOM = "top", "bottom"
#####################################################################
class TextDrawer(AbstractCairoDrawer):
"""Class that draws text on a Cairo context.
This class supports multi-line text unlike the original Cairo text
drawing methods."""
LEFT, CENTER, RIGHT = "left", "center", "right"
TOP, BOTTOM = "top", "bottom"
def __init__(self, context, text="", halign="center", valign="center"):
"""Constructs a new instance that will draw the given `text` on
the given Cairo `context`."""
super(TextDrawer, self).__init__(context, (0, 0))
self.text = text
self.halign = halign
self.valign = valign
def __init__(self, context, bbox, palette, layout):
"""Constructs the vertex drawer and associates it to the given
Cairo context and the given L{BoundingBox}.
@param context: the context on which we will draw
@param bbox: the bounding box within which we will draw.
Can be anything accepted by the constructor
of L{BoundingBox} (i.e., a 2-tuple, a 4-tuple
or a L{BoundingBox} object).
@param palette: the palette that can be used to map integer
color indices to colors when drawing vertices
@param layout: the layout of the vertices in the graph being drawn
"""
AbstractCairoDrawer.__init__(self, context, bbox)
AbstractVertexDrawer.__init__(self, palette, layout)
def __init__(self, context, bbox):
"""Initializes the coordinate system.
@param context: the context on which the coordinate system will
be drawn.
@param bbox: the bounding box that will contain the coordinate
system.
"""
AbstractCairoDrawer.__init__(self, context, bbox)
def __init__(self, context, bbox, palette, layout):
"""Constructs the vertex drawer and associates it to the given
Cairo context and the given L{BoundingBox}.
@param context: the context on which we will draw
@param bbox: the bounding box within which we will draw.
Can be anything accepted by the constructor
of L{BoundingBox} (i.e., a 2-tuple, a 4-tuple
or a L{BoundingBox} object).
@param palette: the palette that can be used to map integer
color indices to colors when drawing vertices
@param layout: the layout of the vertices in the graph being drawn
"""
AbstractCairoDrawer.__init__(self, context, bbox)
AbstractVertexDrawer.__init__(self, palette, layout)
"""
Coordinate systems and related plotting routines
"""
from igraph.compat import property
from igraph.drawing.baseclasses import AbstractCairoDrawer
from igraph.drawing.utils import BoundingBox
__license__ = "GPL"
#####################################################################
# pylint: disable-msg=R0922
# R0922: Abstract class is only referenced 1 times
class CoordinateSystem(AbstractCairoDrawer):
"""Class implementing a coordinate system object.
Coordinate system objects are used when drawing plots which
2D or 3D coordinate system axes. This is an abstract class
which must be extended in order to use it. In general, you'll
only need the documentation of this class if you intend to
implement an own coordinate system not present in igraph yet.
"""
def __init__(self, context, bbox):
"""Initializes the coordinate system.
@param context: the context on which the coordinate system will
be drawn.
@param bbox: the bounding box that will contain the coordinate
system.