Source code for pm4py.objects.bpmn.layout.variants.graphviz_new

'''
    PM4Py – A Process Mining Library for Python
Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt)

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License
along with this program.  If not, see this software project's root or
visit <https://www.gnu.org/licenses/>.

Website: https://processintelligence.solutions
Contact: info@processintelligence.solutions
'''
from pm4py.objects.bpmn.obj import BPMN
from typing import Optional, Dict, Any

from copy import copy
import tempfile


[docs] def apply( bpmn_graph: BPMN, parameters: Optional[Dict[Any, Any]] = None ) -> BPMN: """ Layouts the BPMN graphviz using directly the information about node positioning and edges waypoints provided in the SVG obtained from Graphviz. Parameters ----------------- bpmn_graph BPMN graph parameters Optional parameters of the method Returns ---------------- layouted_bpmn Layouted BPMN """ if parameters is None: parameters = {} from pm4py.visualization.bpmn.variants import classic as bpmn_visualizer from pm4py.visualization.common import svg_pos_parser layout = bpmn_graph.get_layout() filename_svg = tempfile.NamedTemporaryFile(suffix=".svg") filename_svg.close() vis_parameters = copy(parameters) vis_parameters["format"] = "svg" vis_parameters["include_name_in_events"] = False vis_parameters["endpoints_shape"] = "box" gviz = bpmn_visualizer.apply(bpmn_graph, parameters=vis_parameters) bpmn_visualizer.save(gviz, filename_svg.name) # print(filename_svg.name) nodes_p, edges_p = svg_pos_parser.apply(filename_svg.name) for node in list(bpmn_graph.get_nodes()): node_id = str(id(node)) if node_id in nodes_p: node_info = nodes_p[node_id] if node_info["polygon"] is not None: min_x = min(x[0] for x in node_info["polygon"]) max_x = max(x[0] for x in node_info["polygon"]) min_y = min(x[1] for x in node_info["polygon"]) max_y = max(x[1] for x in node_info["polygon"]) width = max_x - min_x height = max_y - min_y layout.get(node).set_width(width) layout.get(node).set_height(height) layout.get(node).set_x(min_x) layout.get(node).set_y(min_y) for flow in list(bpmn_graph.get_flows()): flow_id = (str(id(flow.source)), str(id(flow.target))) if flow_id in edges_p: flow_info = edges_p[flow_id] if flow_info["waypoints"] is not None: flow.del_waypoints() for wayp in flow_info["waypoints"]: flow.add_waypoint(wayp) return bpmn_graph