Esempio n. 1
0
class System(object):
  subsystems = []

  def __init__(self, name, systems = []):
    self.name = name
    self.graph = Graph(name = name)
    self.subsystems = systems

    self.unique_edges = []
    self.junctions = []
    self.connections = []
    self.connections_kwargs = []
    self.components = []


  def add_component(self, component):
    # supress component graph drawing
    for node in component.graph.nodes.values():
      node.draw_bool = False
      node.draw_label_bool = False
    for edge in component.graph.edges.values():
      edge.draw_bool = False
      edge.draw_label_bool = False
    self.graph.add_graph(component.graph)
    self.components.append(component)


  def add_node(self, x, y, **kwargs):
    name = self.graph.add_node(x, y, **kwargs)
    self.graph.nodes[name].draw_bool = False
    self.graph.nodes[name].draw_label_bool = False


  def _already_existing_edge(self, nodeA, nodeB):
    tmp_edge = Edge(nodeA, nodeB)
    for edge in self.unique_edges:
      if tmp_edge == self.graph.edges[edge]:
        return edge
    return None


  def connect(self, *nodes, **kwargs):
    self.connections.append(nodes)
    self.connections_kwargs.append(kwargs)

    number_of_nodes = len(nodes)
    iterations = number_of_nodes - 1
    last_iteration = iterations - 1

    junction_edges = []
    for i in range(iterations):
      name = self._already_existing_edge(nodes[i], nodes[i+1])
      if name is None:
        if i == last_iteration:
          name = self.graph.connect(nodes[i], nodes[i+1], directional = True, draw_label = False)
        else:
          name = self.graph.connect(nodes[i], nodes[i+1], directional = False, draw_label = False)
        self.unique_edges.append(name)
      junction_edges.append(name)

    self.junctions.append( Junction(junction_edges, **kwargs) )


  def move(self, x, y):
    displacement = Node(x, y) - self.graph.nodes[self.graph.anchor]
    for node in self.graph.unique_nodes:
      self.graph.nodes[node].x += displacement.x
      self.graph.nodes[node].y += displacement.y
    for component in self.components:
      new_coords = component.center_of_rotation + displacement
      component.move(new_coords.x, new_coords.y)


  def copy(self, x=0.0, y=0.0, **kwargs):
    name = process_name(self.name + '(copy)', kwargs)

    duplicate = System(name, systems = self.subsystems)

    for component in self.components:
      duplicate.add_component(deepcopy(component))

    for name in self.graph.unique_nodes:
      duplicate.add_node(self.graph.nodes[name].x, self.graph.nodes[name].y, name = name)

    for connection, kwargs in zip(self.connections, self.connections_kwargs):
      duplicate.connect(*connection, **kwargs)

    duplicate.move(x, y)
    return duplicate