A pythonic interface for creating diagrams in Excalidraw.
Based on https://github.com/BardOfCodes/procXD by Aditya Ganeshan (MIT License) and updated with modern python support and API improvements.
from Excalidraw_Interface import SketchBuilder
flowchart_items = ['First Step', 'Second Step', 'Third Step']
sb = SketchBuilder() # Create a Sketch
prev_item = sb.TextBox("Start Here", x = 0, y = 0) # Create a Text Box
for index, item in enumerate(flowchart_items):
new_item = sb.TextBox(item, x = 0, y = (index+1) * 150) # Create a Text Box
sb.create_binding_arrows(prev_item, new_item) # Create arrows between boxes
prev_item = new_item
hcb = sb.HeaderContentBox("Header", "Content", x = -200, y = 400) # Create a multiline text box
circle = sb.Ellipse(200, 400, width=50, height=50, backgroundColor = 'red',
roughness=1) # Create a red circle in hand drawn style
sb.create_binding_arrows(prev_item, hcb, sb.DoubleArrow) # Create a double headed arrow
sb.create_binding_arrows(prev_item, circle, strokeColor = 'blue') # Create an blue arrow
sb.export_to_file('out.excalidraw')Every sketch starts by creating a sketch builder object.
from Excalidraw_Interface import SketchBuilder
sb = SketchBuilder() # Create a SketchDefault settings for the sketch can be set using kwargs. For instance:
from Excalidraw_Interface import SketchBuilder
sb = SketchBuilder(roughness=2) # Create a hand drawn sketchThe list of configurable settings can be found in defaults.py
from Excalidraw_Interface import SketchBuilder
sb = SketchBuilder()
...
sb.export_to_file('my_sketch')
# OR
data = sb.export_to_json()Rectangles, Diamonds, Ellipses can be created with a center_x and center_y position. Width and height can also be set (defaults to 100). Other params can be set in kwargs.
from Excalidraw_Interface import SketchBuilder
sb = SketchBuilder()
sb.Rectangle(x = 0, y = 0)
sb.Diamond(x = 0, y = 0, width=50, height=20)
sb.Ellipse(x = 0, y = 0, backgroundColor='red')Text, Lines, and Arrows have similar functions.
from Excalidraw_Interface import SketchBuilder
sb = SketchBuilder()
sb.Text('some text', x = 0, y = 0)
sb.Line((0,0), (100,100))
sb.Arrow((0,0), (100,100))
sb.DoubleArrow((0,0), (100,100))TextBoxes and HeaderContentBoxes have special functions to create multiple objects at once.
Config can be passed to txt_kwargs, rect_kwargs, header_kwargs, or content_kwargs.
from Excalidraw_Interface import SketchBuilder
sb = SketchBuilder()
sb.TextBox('some text', x = 0, y = 0)
sb.HeaderContentBox('TITLE', 'content', x = 0, y = 0)To create arrows between two objects:
from Excalidraw_Interface import SketchBuilder
sb = SketchBuilder()
a = sb.TextBox('some text', x = 0, y = 0)
b = sb.TextBox('some text', x = 200, y = 200)
sb.create_binding_arrows(a, b)
sb.create_binding_arrows(a, b, sb.DoubleArrow, strokeColor='blue') #makes a blue double arrowTo create shape around an object (or Group):
from Excalidraw_Interface import SketchBuilder
sb = SketchBuilder()
a = sb.TextBox('some text', x = 0, y = 0)
outer_rect = sb.create_bounding_element(a)To create groups:
from Excalidraw_Interface import SketchBuilder, Group
sb = SketchBuilder()
a = sb.TextBox('some text', x = 0, y = 0)
b = sb.TextBox('some text', x = 200, y = 200)
g = Group([a, b])For more examples see advanced_groups.py
Groups can be nested.
A special feature exists that allows one element of a group to be treated as the whole group for the purpose of further grouping (useful for bounding boxes).
if first_is_group:
elems[0].apply_recursive_groups.extend(elems[1:])
