def main(): path = 'entrada.txt' input_file = open_input(path) transitions_raw = get_transitions(input_file) intial_or_final = initial_and_final(input_file) states_dict = get_states(transitions_raw, intial_or_final) word = get_word(input_file) states = load_states(states_dict) transitions = load_transitions(states, transitions_raw) a = Automaton('Automato Finito', word, transitions) inicial = a.get_initials_list() for i in inicial: a.start_reach(word, i) word = get_word(input_file) #print(a.get_steps()) gif = 1 for s in a.get_steps(): save_dot_and_png(a, s) save_gif(gif) gif += 1
def save_dot_and_png(automaton: Automaton, state_walk): for file in os.listdir('assets/dot/'): try: os.remove(f'assets/dot/{file}') except FileNotFoundError: pass ini = 0 steps = 0 graph = pydot.Dot(label=automaton.get_name(), graph_type='digraph', bgcolor='gray') for i in automaton.get_states(): if i in automaton.get_initials_list(): graph.add_node(pydot.Node(ini, shape='point')) my_edge = pydot.Edge(ini, i.get_name()) graph.add_edge(my_edge) ini += 1 for s in automaton.get_states(): if s in automaton.get_finals_list(): my_node = pydot.Node(s.get_name(), shape='doublecircle') graph.add_node(my_node) else: my_node = pydot.Node(s.get_name(), shape='circle') graph.add_node(my_node) for t in automaton.get_transitions(): my_edge = pydot.Edge(t.get_origin().get_name(), t.get_goal().get_name(), label=t.get_name()) graph.add_edge(my_edge) graph.set_graph_defaults(rankdir='LR') steps = save(graph, steps) for s in state_walk: try: if s.get_origin() in automaton.get_finals_list(): my_node = pydot.Node(s.get_origin().get_name(), shape='doublecircle', color='blue') graph.add_node(my_node) steps = save(graph, steps) else: my_node = pydot.Node(s.get_origin().get_name(), shape='circle', color='blue') graph.add_node(my_node) steps = save(graph, steps) teste = graph.get_edge_list() edge = '' for t in teste: label = t.get_label() ori = t.get_source() dst = t.get_destination() if ori == s.get_origin().get_name() and dst == s.get_goal( ).get_name() and label == s.get_name(): edge = t edge.set_color('blue') steps = save(graph, steps) my_node.set_color('black') steps = save(graph, steps) edge.set_color('black') steps = save(graph, steps) if s.get_goal() in automaton.get_finals_list(): my_node = pydot.Node(s.get_goal().get_name(), shape='doublecircle', color='blue') graph.add_node(my_node) steps = save(graph, steps) else: my_node = pydot.Node(s.get_goal().get_name(), shape='circle', color='blue') graph.add_node(my_node) steps = save(graph, steps) except AttributeError: graph.set_graph_defaults(label='Palavra inválida!') my_edge.set_color('black') steps = save(graph, steps) pass