Example #1
0
class Handler:
    def __init__(self, builder, drawing_manager):
        self.builder = builder
        self.dm = drawing_manager
        self.transform = Transform()
        self.obj_handler = ObjHandler()
        self.clipping = Clipping()

        # References to GTK objects
        self.add_object_window = self.builder.get_object("AddObjectWindow")
        self.text_view = self.builder.get_object("Log")
        self.tree_view = self.builder.get_object("TreeView")

        self.obj_file_chooser = self.builder.get_object("ObjFileChooser")
        self.object_radio_button = self.builder.get_object("ObjectRadioButton")
        self.world_radio_button = self.builder.get_object("WorldRadioButton")
        self.point_radio_button = self.builder.get_object("PointRadioButton")
        self.rotate_x = self.builder.get_object("RotateX")
        self.rotate_y = self.builder.get_object("RotateY")
        self.object_rotation_angle = self.builder.get_object(
            "objectRotationAngle")
        self.object_units_for_moving = self.builder.get_object(
            "objectUnitsForMoving")
        self.line_clipping_cs = self.builder.get_object("LineClippingCS")
        self.line_clipping_lb = self.builder.get_object("LineClippingLB")
        self.window_selected = self.builder.get_object("WindowSelected")
        self.object_selected = self.builder.get_object("ObjectSelected")

        self.parallel_projection = self.builder.get_object(
            "ParallelProjectionRadioButton")
        self.perspective_projection = self.builder.get_object(
            "PerspectiveProjectionRadioButton")

        self.text_buffer = self.text_view.get_buffer()
        self.display_file = DisplayFile()
        self.display_file.setBuilder(builder)

        # Used to keep state of polygons and curves when points are added
        self.temp_polygon = []
        self.temp_curve = []

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

    def onImportObj(self, button):
        self.printToLog("onImportObj")
        self.obj_file_chooser.show_all()

    def onCancelFileImport(self, button):
        self.printToLog("onCancelFileImport")
        self.obj_file_chooser.hide()

    def onFileClicked(self, button):
        file_path = self.obj_file_chooser.get_filename()
        self.printToLog("onFileClicked ({})".format(file_path))
        self.obj_handler.importFile(file_path)
        self.obj_file_chooser.hide()

    def onExportObj(self, button):
        self.printToLog("onExportObj")
        self.obj_handler.exportFile("./file.obj")

    def onRotateWindowLeft(self, button):
        self.printToLog("onRotateWindowLeft")
        angle = int(self.object_rotation_angle.get_text())
        self.dm.getWindow().rotate(angle)
        self.dm.redraw()

    def onRotateWindowRight(self, button):
        self.printToLog("onRotateWindowRight")
        angle = float(self.object_rotation_angle.get_text())
        self.dm.getWindow().rotate(-angle)
        self.dm.redraw()

    def onAddObjectClicked(self, button):
        self.printToLog("onAddObjectClicked")
        add_object_window = self.builder.get_object("AddObjectWindow")
        add_object_window.show_all()

    def onAddCurvePoint(self, button):
        x_entry = self.builder.get_object("EntryXCurve").get_text()
        y_entry = self.builder.get_object("EntryYCurve").get_text()
        self.temp_curve.append({"x": x_entry, "y": y_entry})
        self.printToLog("onAddCurvePoint ({},{})".format(x_entry, y_entry))

    def onAddPolygonPoint(self, button):
        x_entry = self.builder.get_object("EntryXPolygon").get_text()
        y_entry = self.builder.get_object("EntryYPolygon").get_text()
        self.temp_polygon.append({"x": x_entry, "y": y_entry})
        self.printToLog("onAddPolygonPoint ({},{})".format(x_entry, y_entry))

    def onRemoveCurvePoint(self, button):
        if (len(self.temp_curve) > 0):
            self.temp_curve.pop()
        else:
            self.printToLog("No point to remove")

        self.printToLog("onRemoveCurvePoint")

    def onRemovePolygonPoint(self, button):
        if (len(self.temp_polygon) > 0):
            self.temp_polygon.pop()
        else:
            self.printToLog("No point to remove")

        self.printToLog("onRemovePolygonPoint")

    def onAddCurve(self, button):
        self.printToLog("onAddCurve")

        name = self.builder.get_object("CurveName").get_text()
        curve = Curve(name)

        for point in self.temp_curve:
            curve.addCoords(float(point["x"]), float(point["y"]))

        self.display_file.addObject(curve)
        self.temp_curve = []
        self.add_object_window.hide()

    def onAddPolygon(self, button):
        self.printToLog("onAddPolygon")

        name = self.builder.get_object("PolygonName").get_text()
        polygon = Polygon(name)

        for point in self.temp_polygon:
            polygon.addCoords(float(point["x"]), float(point["y"]))

        self.display_file.addObject(polygon)
        self.temp_polygon = []
        self.add_object_window.hide()

    def onAddCube(self, button):
        name = self.builder.get_object("3DName").get_text()

        segments = [[Point3D(50, 50, 0),
                     Point3D(50, 100, 0)],
                    [Point3D(50, 100, 0),
                     Point3D(150, 100, 0)],
                    [Point3D(150, 100, 0),
                     Point3D(150, 50, 0)],
                    [Point3D(150, 50, 0),
                     Point3D(50, 50, 0)],
                    [Point3D(50, 50, 50),
                     Point3D(50, 100, 50)],
                    [Point3D(50, 100, 50),
                     Point3D(150, 100, 50)],
                    [Point3D(150, 100, 50),
                     Point3D(150, 50, 50)],
                    [Point3D(150, 50, 50),
                     Point3D(50, 50, 50)],
                    [Point3D(50, 50, 0),
                     Point3D(50, 50, 50)],
                    [Point3D(50, 100, 0),
                     Point3D(50, 100, 50)],
                    [Point3D(150, 100, 0),
                     Point3D(150, 100, 50)],
                    [Point3D(150, 50, 0),
                     Point3D(150, 50, 50)]]

        obj3d = Object3D(segments, name)
        self.display_file.addObject3d(obj3d)
        self.add_object_window.hide()

    def onAddPoint(self, button):
        self.printToLog("onAddPoint")
        name_entry = self.builder.get_object("PointNameEntry")
        x_entry = self.builder.get_object("PointXEntry")
        y_entry = self.builder.get_object("PointYEntry")
        p1 = Point(name_entry.get_text())

        p1.addCoords(float(x_entry.get_text()), float(y_entry.get_text()))
        self.display_file.addObject(p1)
        self.add_object_window.hide()

    def onAddLine(self, button):
        self.printToLog("onAddLine")
        name_entry = self.builder.get_object("EntryNameNewLine")
        x1_entry = self.builder.get_object("EntryX1Line")
        y1_entry = self.builder.get_object("EntryY1Line")
        x2_entry = self.builder.get_object("EntryX2Line")
        y2_entry = self.builder.get_object("EntryY2Line")

        l1 = Line(name_entry.get_text())
        l1.addCoords(float(x1_entry.get_text()), float(y1_entry.get_text()))
        l1.addCoords(float(x2_entry.get_text()), float(y2_entry.get_text()))

        self.display_file.addObject(l1)
        self.add_object_window.hide()

    def onRemoveObjectClicked(self, button):
        self.printToLog("onRemoveObjectClicked")
        obj_list, index = self.tree_view.get_selection().get_selected()
        if index != None:
            self.display_file.removeObject(obj_list[index][2])
            obj_list.remove(index)
            self.dm.redraw()
        else:
            self.printToLog("No object selected")

    def onZoomOut(self, button):
        self.printToLog("onZoomOut")
        self.dm.getWindow().zoom(0.9)
        self.dm.redraw()

    def onZoomIn(self, button):
        self.printToLog("onZoomIn")
        self.dm.getWindow().zoom(1.1)
        self.dm.redraw()

    def onMoveObjectUp(self, button):
        if self.window_selected.get_active():
            return self.onMoveWindowUp(button)

        units = float(self.object_units_for_moving.get_text())
        self.printToLog("onMoveObjectUp")
        self.transform.move(self.tree_view, 0, units)

        self.dm.redraw()

    def onMoveObjectDown(self, button):
        if self.window_selected.get_active():
            return self.onMoveWindowDown(button)

        units = float(self.object_units_for_moving.get_text())
        self.printToLog("onMoveObjectDown")
        self.transform.move(self.tree_view, 0, -units)
        self.dm.redraw()

    def onMoveObjectLeft(self, button):
        if self.window_selected.get_active():
            return self.onMoveWindowLeft(button)

        units = float(self.object_units_for_moving.get_text())
        self.printToLog("onMoveObjectLeft")
        self.transform.move(self.tree_view, -units, 0)
        self.dm.redraw()

    def onMoveObjectRight(self, button):
        if self.window_selected.get_active():
            return self.onMoveWindowRight(button)

        units = float(self.object_units_for_moving.get_text())
        self.printToLog("onMoveObjectRight")
        self.transform.move(self.tree_view, units, 0)
        self.dm.redraw()

    def onLineClippingChanged(self, button):
        if self.line_clipping_cs.get_active():
            self.printToLog("Line clipping algorithm set to Cohen-Sutherland.")
            self.clipping.setlineClippingAlgorithm("cs")
        elif self.line_clipping_lb.get_active():
            self.printToLog("Line clipping algorithm set to Liang-Barsky.")
            self.clipping.setlineClippingAlgorithm("lb")

    def onProjectionChanged(self, button):
        if self.parallel_projection.get_active():
            self.printToLog("Parallel.")
            self.dm.setProjection('parallel')
        elif self.perspective_projection.get_active():
            self.printToLog("Perspective.")
            self.dm.setProjection('perspective')

    def onRotateObjectLeft(self, button):
        if self.window_selected.get_active():
            return self.onRotateWindowLeft(button)

        self.printToLog("onRotateObjectLeft")
        angle = int(self.object_rotation_angle.get_text())

        if self.object_radio_button.get_active():
            self.transform.rotate(self.tree_view, -angle, 'center', 0, 0)
        elif self.world_radio_button.get_active():
            self.transform.rotate(self.tree_view, -angle, 'world', 0, 0)
        elif self.point_radio_button.get_active():
            x = float(self.rotate_x.get_text())
            y = float(self.rotate_y.get_text())
            self.transform.rotate(self.tree_view, -angle, 'point', x, y)
        self.dm.redraw()

    def onRotateObjectRight(self, button):
        if self.window_selected.get_active():
            return self.onRotateWindowRight(button)

        self.printToLog("onRotateObjectRight")
        angle = int(self.object_rotation_angle.get_text())

        if self.object_radio_button.get_active():
            self.transform.rotate(self.tree_view, angle, 'center', 0, 0)
        elif self.world_radio_button.get_active():
            self.transform.rotate(self.tree_view, angle, 'world', 0, 0)
        elif self.point_radio_button.get_active():
            x = float(self.rotate_x.get_text())
            y = float(self.rotate_y.get_text())
            self.transform.rotate(self.tree_view, angle, 'point', x, y)

        self.dm.redraw()

    def OnRotateObjectUp(self, button):
        self.printToLog("OnRotateObjectUp")

        angle = int(self.object_rotation_angle.get_text())

        if self.object_radio_button.get_active():
            self.transform.rotate3d(self.tree_view, angle, 'center', 0, 0)
        elif self.world_radio_button.get_active():
            self.transform.rotate3d(self.tree_view, angle, 'world', 0, 0)
        elif self.point_radio_button.get_active():
            x = float(self.rotate_x.get_text())
            y = float(self.rotate_y.get_text())
            self.transform.rotate3d(self.tree_view, angle, 'point', x, y)

        self.dm.redraw()

    def OnRotateObjectDown(self, button):
        self.printToLog("OnRotateObjectDown")

        angle = int(self.object_rotation_angle.get_text())

        if self.object_radio_button.get_active():
            self.transform.rotate3d(self.tree_view, -angle, 'center', 0, 0)
        elif self.world_radio_button.get_active():
            self.transform.rotate3d(self.tree_view, -angle, 'world', 0, 0)
        elif self.point_radio_button.get_active():
            x = float(self.rotate_x.get_text())
            y = float(self.rotate_y.get_text())
            self.transform.rotate3d(self.tree_view, -angle, 'point', x, y)

        self.dm.redraw()

    def onScaleObjectUp(self, button):
        if self.window_selected.get_active():
            return self.onZoomIn(button)

        self.printToLog("onScaleObjectUp")

        self.transform.zoom(self.tree_view, 2, 2)
        self.dm.redraw()

    def onScaleObjectDown(self, button):
        if self.window_selected.get_active():
            return self.onZoomOut(button)

        self.printToLog("onScaleObjectDown")
        self.transform.zoom(self.tree_view, 0.5, 0.5)
        self.dm.redraw()

    def onMoveWindowUp(self, button):
        self.printToLog("onMoveWindowUp")
        units = float(self.object_units_for_moving.get_text())
        self.dm.getWindow().move(0, units)
        self.dm.redraw()

    def onMoveWindowDown(self, button):
        self.printToLog("onMoveWindowDown")
        units = float(self.object_units_for_moving.get_text())
        self.dm.getWindow().move(0, -units)
        self.dm.redraw()

    def onMoveWindowLeft(self, button):
        self.printToLog("onMoveWindowLeft")
        units = float(self.object_units_for_moving.get_text())
        self.dm.getWindow().move(-units, 0)
        self.dm.redraw()

    def onMoveWindowRight(self, button):
        self.printToLog("onMoveWindowRight")
        units = float(self.object_units_for_moving.get_text())
        self.dm.getWindow().move(units, 0)
        self.dm.redraw()

    def printToLog(self, text, end="\n"):
        buffer, view = self.text_buffer, self.text_view
        buffer.insert_at_cursor(text + end)
        view.scroll_to_mark(buffer.get_insert(), 0, 0, 0, 0)