Esempio n. 1
0
class Handler:
    display_file = DisplayFile()
    pontos = []

    def __init__(self, builder, drawing_area):
        self.builder = builder
        self.drawing_area = drawing_area
        self.normaliza = Normaliza()
        self.descritorOBj = DescritorOBj()
        self.window_object = builder.get_object("janelaNovoObjeto")
        self.window_transform_object = builder.get_object(
            "janelaTransformarObjeto")
        self.window_choose_file = builder.get_object("janelaEscolherObj")

        da_largura = self.drawing_area.get_allocation().width
        da_altura = self.drawing_area.get_allocation().height

        self.tree_view = self.builder.get_object("treeObjetos")
        self.window = Window(-cbz, -cbz, da_largura - cbz, da_altura - cbz)
        self.viewport = Viewport(-cbz, -cbz, da_largura - cbz, da_altura - cbz)

        self.normaliza.setWindow(self.window)
        self.viewport.setWindow(self.window)
        self.display_file.setBuilder(builder)

        self.radio_rotacionar_mundo = self.builder.get_object(
            "radioRotacionarMundo")
        self.radio_rotacionar_objeto = self.builder.get_object(
            "radioRotacionarObjeto")
        self.radio_rotacionar_ponto = self.builder.get_object(
            "radioRotacionarPonto")

    def onDestroy(self, *args):
        Gtk.main_quit()

    def on_buttonNovoObjeto_clicked(self, *args):
        self.pontos = []
        window_object = self.builder.get_object("janelaNovoObjeto")
        window_object.show_all()

    def on_buttonCriarDesenharPonto_clicked(self, *args):
        name_entry = self.builder.get_object("entryNomeObjeto")
        x_entry = self.builder.get_object("spinXPonto")
        y_entry = self.builder.get_object("spinYPonto")
        p = Poligono(name_entry.get_text())
        p.addPonto(int(x_entry.get_text()), int(y_entry.get_text()))
        p.setTipo("ponto")

        self.display_file.addObjeto(p)
        self.window_object.hide()

    def on_buttonCriarDesenharReta_clicked(self, *args):
        name_entry = self.builder.get_object("entryNomeObjeto")
        x_entry = self.builder.get_object("spinXInicialReta")
        y_entry = self.builder.get_object("spinYInicialReta")
        x_final_entry = self.builder.get_object("spinXFinalReta")
        y_final_entry = self.builder.get_object("spinYFinalReta")
        p = Poligono(name_entry.get_text())
        p.addPonto(int(x_entry.get_text()), int(y_entry.get_text()))
        p.addPonto(int(x_final_entry.get_text()),
                   int(y_final_entry.get_text()))
        p.setTipo("reta")

        self.display_file.addObjeto(p)
        self.window_object.hide()

    def on_buttonAdicionarPontoPoligono_clicked(self, *args):
        x_entry = self.builder.get_object("spinXPoligono")
        y_entry = self.builder.get_object("spinYPoligono")
        self.pontos.append([x_entry.get_text(), y_entry.get_text(), 1])
        print('Ponto - x: {}, y: {} adicionado'.format(int(
            x_entry.get_text()), int(y_entry.get_text())))

    def on_buttonCriarDesenharPoligono_clicked(self, *args):
        name_entry = self.builder.get_object("entryNomeObjeto")
        p = Poligono(name_entry.get_text())

        for ponto in self.pontos:
            p.addPonto(int(ponto[0]), int(ponto[1]))

        if int(len(self.pontos)) > 2:
            p.setTipo("poligono")
        elif int(len(self.pontos)) == 2:
            p.setTipo("reta")
        else:
            p.setTipo("ponto")

        self.display_file.addObjeto(p)
        self.window_object.hide()

    def on_buttonDeletarObjeto_clicked(self, *args):
        obj_lista, i = self.tree_view.get_selection().get_selected()
        if i != None:
            self.display_file.removeObjeto(obj_lista[i][0])
            obj_lista.remove(i)
            self.redraw(self.drawing_area)

    def on_buttonTransformarObjeto_clicked(self, *args):
        _, i = self.tree_view.get_selection().get_selected()
        if i != None:
            window_transform_object = self.builder.get_object(
                "janelaTransformarObjeto")
            window_transform_object.show_all()

    def on_buttonUp_clicked(self, *args):
        passo = self.builder.get_object("spinPasso")
        self.window.move(0, int(passo.get_text()))
        self.redraw(self.drawing_area)

    def on_buttonLeft_clicked(self, *args):
        passo = self.builder.get_object("spinPasso")
        self.window.move(-int(passo.get_text()), 0)
        self.redraw(self.drawing_area)

    def on_buttonDown_clicked(self, *args):
        passo = self.builder.get_object("spinPasso")
        self.window.move(0, -int(passo.get_text()))
        self.redraw(self.drawing_area)

    def on_buttonRight_clicked(self, *args):
        passo = self.builder.get_object("spinPasso")
        self.window.move(int(passo.get_text()), 0)
        self.redraw(self.drawing_area)

    def on_ButtonIn_clicked(self, *args):
        passo = self.builder.get_object("spinPasso")
        porcentagem = 1 + (int(passo.get_text()) / 100)
        self.window.zoom(porcentagem)
        self.redraw(self.drawing_area)

    def on_buttonOut_clicked(self, *args):
        passo = self.builder.get_object("spinPasso")
        porcentagem = 1 - (int(passo.get_text()) / 100)
        self.window.zoom(porcentagem)
        self.redraw(self.drawing_area)

    def on_buttonRotacionaEsquerda_clicked(self, *args):
        angulo = int(self.builder.get_object("spinAnguloWindow").get_text())
        self.window.rotate(angulo)
        self.redraw(self.drawing_area)

    def on_buttonRotacionaDireita_clicked(self, *args):
        angulo = int(self.builder.get_object("spinAnguloWindow").get_text())
        self.window.rotate(-angulo)
        self.redraw(self.drawing_area)

    def on_buttonTransladar_clicked(self, *args):
        obj_lista, i = self.tree_view.get_selection().get_selected()
        obj = self.display_file.getObjeto(obj_lista[i][0])
        dx = self.builder.get_object("spinXVetorTrans")
        dy = self.builder.get_object("spinYVetorTrans")
        obj.translacao(int(dx.get_text()), int(dy.get_text()))
        self.window_transform_object.hide()
        self.redraw(self.drawing_area)

    def on_buttonEscalonar_clicked(self, *args):
        obj_lista, i = self.tree_view.get_selection().get_selected()
        obj = self.display_file.getObjeto(obj_lista[i][0])
        dx = self.builder.get_object("spinXFatorEscala")
        dy = self.builder.get_object("spinYFatorEscala")
        centro = obj.centroGeo()
        obj.escalona(int(dx.get_text()), int(dy.get_text()), centro)
        self.window_transform_object.hide()
        self.redraw(self.drawing_area)

    def on_buttonRotacionar_clicked(self, *args):
        obj_lista, i = self.tree_view.get_selection().get_selected()
        obj = self.display_file.getObjeto(obj_lista[i][0])
        angulo = self.builder.get_object("spinAngulo")
        if self.radio_rotacionar_mundo.get_active():
            obj.rotacionaMundo(int(angulo.get_text()))
        elif self.radio_rotacionar_objeto.get_active():
            centro = obj.centroGeo()
            obj.rotacionaObj(int(angulo.get_text()), centro)
        elif self.radio_rotacionar_ponto.get_active():
            dx = self.builder.get_object("spinXRotacionarPonto")
            dy = self.builder.get_object("spinYRotacionarPonto")
            obj.rotacionaPonto(int(dx.get_text()), int(dy.get_text()),
                               int(angulo.get_text()))
        self.window_transform_object.hide()
        self.redraw(self.drawing_area)

    def on_buttonImportarObj_clicked(self, *args):
        self.window_choose_file.show_all()

    def on_buttonExportarObj_clicked(self, *args):
        self.descritorOBj.exportFile("./file.obj")

    def on_buttonAbrirArquivo_clicked(self, *args):
        file_path = self.window_choose_file.get_filename()
        self.descritorOBj.importFile(file_path)
        self.window_choose_file.hide()

    def on_buttonCancelarImportacao_clicked(self, *args):
        self.window_choose_file.hide()

    def drawBackground(self, drawing_area, ctx, *args):
        ctx.set_source_rgb(255, 255, 255)  # color white
        ctx.paint()

    def drawClippingBorder(self, drawing_area, ctx, *args):
        ctx.set_line_width(2)
        ctx.set_source_rgb(255, 0, 0)  # color red

        ctx.move_to(cbz, cbz)
        ctx.line_to(self.window.getLargura() - cbz, cbz)
        ctx.line_to(self.window.getLargura() - cbz,
                    self.window.getAltura() - cbz)
        ctx.line_to(cbz, self.window.getAltura() - cbz)

        ctx.close_path()
        ctx.stroke()

    def on_myDrawingArea_draw(self, drawing_area, ctx, *args):
        self.drawBackground(drawing_area, ctx)
        ctx.set_line_width(2)
        ctx.set_source_rgb(0, 0, 0)  # color black

        for objeto in self.display_file.getObjetos():
            print('Desenhando objeto "{}"'.format(objeto.getNome()))
            objeto.drawToViewport(ctx, self.viewport)

        ctx.stroke()
        self.drawClippingBorder(drawing_area, ctx)

    def redraw(self, drawing_area, *args):
        drawing_area.queue_draw()