Source code for editor.models.graph.base

from abc import ABCMeta, abstractmethod


_nameSeparator = '.'
def _parent(id):
	idx = id.rfind(_nameSeparator)
	if idx > -1: return id[:idx]


[docs]class Slot: def __init__(self, **data): self.data = data
[docs] def type(self): return self.data['type'] if 'type' in self.data else None
[docs] def name(self): return self.data['name'] if 'name' in self.data else None
[docs] def parent(self, graph): pid = _parent(graph.slotId(self)) if pid: return graph.nodes[pid]
[docs]class Node: def __init__(self, **data): self.data = data
[docs] def type(self): return self.data['type'] if 'type' in self.data else None
[docs] def name(self): return self.data['name'] if 'name' in self.data else None
[docs] def slots(self, graph): slots = [] nid = graph.nodeId(self) for k, v in graph.slots: if k.startswith(nid): slots.append(v) return slots
[docs] def parent(self, graph): pid = _parent(graph.nodeId(self)) if pid: return graph.groups[pid]
[docs]class Group: def __init__(self, **data): self.data = data
[docs] def name(self): return self.data['name'] if 'name' in self.data else None
[docs] def nodes(self, graph): nodes = [] gid = graph.gropuId(self) for k, v in graph.nodes: if k.startswith(gid): nodes.append(v) return nodes
[docs] def groups(self, graph): groups = [] gid = graph.gropuId(self) for k, v in graph.groups: if k == gid: continue if k.startswith(gid): groups.append(v) return groups
[docs] def parent(self, graph): pid = _parent(graph.groupId(self)) if pid: return graph.groups[pid]
[docs]class Edge: def __init__(self, src, dst, **data): self.src = src self.dst = dst self.data = data
####################################################
[docs]class Graph(metaclass = ABCMeta): def __init__(self): self.groups = {} self.nodes = {} self.slots = {} self.edges = {}
[docs] def groupId(self, group): for k, v in self.groups: if v == group: return k
[docs] def nodeId(self, node): for k, v in self.nodes: if v == node: return k
[docs] def slotId(self, slot): for k, v in self.slots: if v == slot: return k
@abstractmethod
[docs] def generateGroupId(self): pass
@abstractmethod
[docs] def generateNodepId(self): pass
@abstractmethod
[docs] def generateSlotId(self): pass
@abstractmethod
[docs] def generateEdgeId(self): pass
[docs] def addGroup(self, **data): gid = self.generateGroupId() self.groups[gid] = Group(**data)
[docs] def addNode(self, **data): nid = self.generateNodeId() self.nodes[nid] = Node(**data)
[docs] def addSlot(self, **data): sid = self.generateSlotId() self.slots[sid] = Slot(**data)
[docs] def addEdge(self, src, dst, **data): eid = self.generateEdgeId() self.edges[eid] = Edge(src, dst, **data)