Exemplo n.º 1
0
def rotate_window(rotate_angle: float,
                  x_axis: bool = False,
                  y_axis: bool = False) -> None:
    def check_angle_interval(final_angle: float) -> float:
        if final_angle <= -360:
            return final_angle + 360
        elif final_angle >= 360:
            return final_angle - 360
        else:
            return final_angle

    window = objectManager.window
    new_angle = window["zAngle"]
    if x_axis:
        new_angle = window["xAngle"]
    elif y_axis:
        new_angle = window["yAngle"]

    new_angle = check_angle_interval(new_angle - rotate_angle)
    if x_axis:
        window["xAngle"] = new_angle
    elif y_axis:
        window["yAngle"] = new_angle
    else:
        window["zAngle"] = new_angle

    display_file = objectManager.display_file
    for obj in display_file:
        normalized_coordinates = world_to_window_coordinates_transform(
            display_file[obj])
        clipper.clipObject(obj, normalized_coordinates)
Exemplo n.º 2
0
def move_window_z_axis(step_z: float) -> None:
    window = objectManager.window
    window["zCoord"] += step_z

    display_file = objectManager.display_file
    for obj in display_file:
        normalized_coordinates = world_to_window_coordinates_transform(
            display_file[obj])
        clipper.clipObject(obj, normalized_coordinates)
Exemplo n.º 3
0
def zoom_window(scale: float) -> None:
    window = objectManager.window
    display_file = objectManager.display_file

    zoom_matrix = scale_matrix_2d(scale, scale)
    window["transformations"] = window["transformations"].dot(zoom_matrix)

    for obj in display_file:
        normalized_coordinates = np.array(
            display_file[obj].normalizedCoordinates).dot(zoom_matrix)
        clipper.clipObject(obj, normalized_coordinates)
Exemplo n.º 4
0
def move_window(step_x: float, step_y: float) -> None:
    window = objectManager.window
    display_file = objectManager.display_file

    move_matrix = translate_matrix_2d(step_x, step_y)
    window["transformations"] = window["transformations"].dot(move_matrix)

    for obj in display_file:
        normalized_coordinates = np.array(
            display_file[obj].normalizedCoordinates).dot(move_matrix)
        clipper.clipObject(obj, normalized_coordinates)
Exemplo n.º 5
0
def set_window_original_size():
    window = objectManager.window
    display_file = objectManager.display_file

    window["xAngle"] = 0.0
    window["yAngle"] = 0.0
    window["zAngle"] = 0.0
    window["transformations"] = identity_matrix_2d

    for obj in display_file:
        normalized_coordinates = world_to_window_coordinates_transform(
            display_file[obj])
        clipper.clipObject(obj, normalized_coordinates)
def change_object(name: str, move_vector: list, scale_factors: list,
                  rotate_rate: float, rotate_x: bool, rotate_y: bool) -> None:
    global display_file, window
    transformation_matrix = identity_matrix
    coordinates = display_file[name].coordinates

    cx = reduce(lambda x, y: x + y, [x[0]
                                     for x in coordinates]) / len(coordinates)
    cy = reduce(lambda x, y: x + y, [x[1]
                                     for x in coordinates]) / len(coordinates)
    cz = reduce(lambda x, y: x + y, [x[2]
                                     for x in coordinates]) / len(coordinates)

    # Obs: Matrix multiplication will be on the order Rotate Matrix * Move Matrix * Scale Matrix always.
    if rotate_rate:
        dx, dy, dz = cx, cy, cz

        rotate_matrix = rotate_z_matrix(rotate_rate)
        if rotate_x:
            rotate_matrix = rotate_x_matrix(rotate_rate)
        elif rotate_y:
            rotate_matrix = rotate_y_matrix(rotate_rate)

        transformation_matrix = translate_matrix(
            -dx, -dy, -dz).dot(rotate_matrix).dot(translate_matrix(dx, dy, dz))

    if move_vector:
        move_matrix = translate_matrix(move_vector[0], move_vector[1], 0)
        transformation_matrix = transformation_matrix.dot(move_matrix)

    if scale_factors:
        origin_translate_matrix = translate_matrix(-cx, -cy, -cz)
        zoom_matrix = scale_matrix(scale_factors[0], scale_factors[1], 1)
        back_translate_matrix = translate_matrix(cx, cy, cz)

        transformation_matrix = transformation_matrix.dot(
            origin_translate_matrix).dot(zoom_matrix).dot(
                back_translate_matrix)

    coordinates_aux = [triple + [1] for triple in coordinates]
    new_coordinates = np.array(coordinates_aux).dot(
        transformation_matrix).tolist()
    new_coordinates = [
        quadruple[:len(quadruple) - 1] for quadruple in new_coordinates
    ]

    display_file[name].set_coordinates(new_coordinates)

    normalized_coordinates = normalizer.world_to_window_coordinates_transform(
        display_file[name])
    clipper.clipObject(name, normalized_coordinates)
def create_new_object(name: str,
                      coordinates: str,
                      line_color: list,
                      is_bezier: bool,
                      is_bspline: bool,
                      is_3d: bool = False) -> Object:
    global display_file, window
    coordinates_matrix = []
    index_row = 0
    for triple in coordinates.split(';'):
        coordinates = triple.split(',')
        try:
            coordinates = [float(x) for x in coordinates]
        except ValueError:
            raise ValueError(
                "Insira coordenadas validas. \n Coordenadas devem todas ser triplas de números inteiros ou decimais."
            )

        coordinates_matrix.append([])
        if len(coordinates) == 3:
            for coordinate in coordinates:
                coordinates_matrix[index_row].append(coordinate)
            index_row += 1
        else:
            raise ValueError("Coordenadas devem ser triplas")

    new_object = Object(name, coordinates_matrix, line_color, is_bezier,
                        is_bspline, is_3d)
    display_file[name] = new_object

    normalized_coordinates = normalizer.world_to_window_coordinates_transform(
        display_file[name])
    clipper.clipObject(name, normalized_coordinates)

    # For debug purpose
    print("Objeto " + "\"" + new_object.name + "\" (" + new_object.type +
          ") criado nas seguintes coordenadas = " +
          str(new_object.coordinates) + ".\nDisplay File com " +
          str(len(display_file)) + " objeto(s)")

    return new_object