Skip to content
Snippets Groups Projects
Commit e55891db authored by Tomáš Orviský's avatar Tomáš Orviský
Browse files

DotLayout is now default, removed unused layouts

parent d66ae428
No related merge requests found
......@@ -5,9 +5,7 @@ from pyplaml import *
import argparse
from pyplaml.layout.spring_layout import SpringLayout
from pyplaml.layout.kamada_kawai import KamadaKawai
from pyplaml.layout.dot_layout import DotLayout
from pyplaml.layout.hierarchical_layout import HierarchicalLayout
class MainScene(MovingCameraScene):
......@@ -20,7 +18,7 @@ class MainScene(MovingCameraScene):
parser = PUMLParser()
d: Diagram = parser.parse_file(self.file)
layout = HierarchicalLayout(d)
layout = DotLayout(d)
layout.apply()
layout.scale(self.scale_x, self.scale_y)
......
......@@ -8,6 +8,31 @@ class DotLayout(DiagramLayout):
def apply(self) -> None:
layout = graphviz_layout(self.get_graph(), prog='dot')
scale_x, scale_y = self.calculate_scaling_factors(layout)
for key, pos in layout.items():
self.diagram[key].x = pos[0]
self.diagram[key].y = pos[1]
self.diagram[key].x = pos[0] * scale_x * 25
self.diagram[key].y = pos[1] * scale_y * 3
@staticmethod
def calculate_scaling_factors(layout):
x_distances = []
y_distances = []
for key1, pos1 in layout.items():
for key2, pos2 in layout.items():
if key1 != key2:
x_distance = abs(pos1[0] - pos2[0])
y_distance = abs(pos1[1] - pos2[1])
x_distances.append(x_distance)
y_distances.append(y_distance)
if x_distances and y_distances:
average_x_distance = sum(x_distances) / len(x_distances)
average_y_distance = sum(y_distances) / len(y_distances)
x_scaling_factor = 1.0 / average_x_distance if average_x_distance != 0 else 1.0
y_scaling_factor = 1.0 / average_y_distance if average_y_distance != 0 else 1.0
return x_scaling_factor, y_scaling_factor
else:
return 1.0, 1.0
from .diagram_layout import DiagramLayout
from ..diagram_class import DiagramClass
class HierarchicalLayout(DiagramLayout):
def apply(self) -> None:
first_level_nodes = list(self.diagram.objects)
for _, obj in self.diagram.objects.items():
if not isinstance(obj, DiagramClass) or len(obj.edges) != 0:
first_level_nodes.remove(obj.get_key())
self.assign_object_coordinates(first_level_nodes, 0)
def assign_object_coordinates(self, nodes: list, y: int):
if len(nodes) == 0:
return
next_nodes = []
x_range = self.range_around_zero(len(nodes))
for i, name in enumerate(nodes):
self.diagram[name].x = x_range[i]
self.diagram[name].y = y
for _, obj in self.diagram.objects.items():
if hasattr(obj, 'edges'):
for edge in obj.edges:
if (edge.target.alias or edge.target.name) == name:
next_nodes.append(obj.alias or obj.name)
self.assign_object_coordinates(next_nodes, y + 1)
@staticmethod
def range_around_zero(n):
half_n = n // 2
return list(range(-half_n, half_n + 1))
import networkx as nx
from .diagram_layout import DiagramLayout
class KamadaKawai(DiagramLayout):
def apply(self) -> None:
layout = nx.kamada_kawai_layout(self.get_graph())
for key, pos in layout.items():
self.diagram[key].x = pos[0]
self.diagram[key].y = pos[1]
import unittest
import os, sys
import os
from glob import glob
......@@ -9,4 +9,4 @@ class DrawTest(unittest.TestCase):
examples = sorted(glob("../examples/*.puml"))
for e in examples:
self.assertEqual(os.system("python ../main.py " + e + " -sx 3 -sy 3"), 0, 'Drawing "' + e + '" failed')
self.assertEqual(os.system("python ../main.py " + e), 0, 'Drawing "' + e + '" failed')
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment