Skip to content

Latest commit

 

History

36 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

BPMN PY

Overview

This library allows you to work with BPMN Diagrams in Python for Automated Planning applications. My code is an expansion of this project by Jasper Nie.

Setup

pip install git+https://github.com/QuMuLab/bpmn-py.git

Usage

The following is a basic overview of the library, a more in-depth documentation can be found here: https://bpmn-py.readthedocs.io/ or by running bpmn-py-docs in your terminal.

Demo

1. Automatically create bpmn in python from xml file then export to pddl or xml

from bpmn_py import Diagram, BPMNExporter, BPMNParser, XMLCreator

diagram_name = "order_pizza"
file_path = f"examples/{diagram_name}.bpmn"

parser = BPMNParser(file_path)
diagram = parser.parse()

exporter = BPMNExporter(diagram)
exporter.create_pddl()

exporter = XMLCreator(diagram)
exporter.create_xml()

2. "Manually" create bpmn in python then export to xml or pddl

from bpmn_py import Diagram, BPMNExporter, BPMNParser, XMLCreator
from bpmn_py import userTask, startEvent, endEvent, parallelGateway, exclusiveGateway, inclusiveGateway

diagram = Diagram("Dispatch of Goods")
pool = diagram.add_pool("Computer Hardware Shop")

logistics = pool.add_swimlane("Logistics")
secretary = pool.add_swimlane("Secretary")
warehouse = pool.add_swimlane("Warehouse")

insure_parcel = logistics.add_task("Insure Parcel", userTask)

ship_goods = secretary.add_event("Ship Goods", startEvent)
parallel_split = secretary.add_gateway(None, parallelGateway)
clarify = secretary.add_task("Clarify shipment method", userTask)
special_sandling_split = secretary.add_gateway("Special sandling?", exclusiveGateway)
if_insurance_split = secretary.add_gateway("If insurance necessary", inclusiveGateway)
write_label = secretary.add_task("Write package label", userTask)
if_insurance_join = secretary.add_gateway(None, inclusiveGateway)
get_offers = secretary.add_task("Get 3 offers from logistic companies", userTask)
select_company = secretary.add_task("Select logistic company and place order", userTask)
special_sandling_join = secretary.add_gateway(None, exclusiveGateway)

package_goods = warehouse.add_task("Package Goods", userTask)
parallel_join = warehouse.add_gateway(None, parallelGateway)
prepare = warehouse.add_task("Prepare for picking up goods", userTask)
shipment_prepared = warehouse.add_event("Shipment prepared", endEvent)

diagram.add_sequence_flow(if_insurance_split, insure_parcel)
diagram.add_sequence_flow(insure_parcel, if_insurance_join)

diagram.add_sequence_flow(ship_goods, parallel_split)
diagram.add_sequence_flow(parallel_split, clarify)
diagram.add_sequence_flow(clarify, special_sandling_split)
diagram.add_sequence_flow(special_sandling_split, if_insurance_split)
diagram.add_sequence_flow(if_insurance_split, write_label)
diagram.add_sequence_flow(write_label, if_insurance_join)
diagram.add_sequence_flow(if_insurance_join, special_sandling_join)
diagram.add_sequence_flow(special_sandling_split, get_offers)
diagram.add_sequence_flow(get_offers, select_company)
diagram.add_sequence_flow(select_company, special_sandling_join)
diagram.add_sequence_flow(special_sandling_join, parallel_join)

diagram.add_sequence_flow(parallel_split, package_goods)
diagram.add_sequence_flow(package_goods, parallel_join)
diagram.add_sequence_flow(parallel_join, prepare)
diagram.add_sequence_flow(prepare, shipment_prepared)

exporter = BPMNExporter(diagram)
exporter.create_pddl()

exporter = XMLCreator(diagram)
exporter.create_xml()

3. Automatically create bpmn in python from xml file then manually edit it before exporting to pddl or xml

from bpmn_py import Diagram, BPMNExporter, BPMNParser, XMLCreator
from bpmn_py import userTask, startEvent, endEvent, parallelGateway, exclusiveGateway, inclusiveGateway

diagram_name = "order_pizza"
file_path = f"examples/{diagram_name}.bpmn"

parser = BPMNParser(file_path)
diagram = parser.parse()

complain = diagram.add_task("Complain again to Delivery Service", userTask)
for flow in diagram.seq_flows:
    if flow.startRef.label == "Cancel Order" and flow.endRef.label == "Order Cancelled":
        order_cancelled = flow.endRef
        flow.endRef = complain
        diagram.add_sequence_flow(complain, order_cancelled)

        break

exporter = BPMNExporter(diagram)
exporter.create_pddl()


exporter = XMLCreator(diagram)
exporter.create_xml()

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages