Exemple #1
0
def mc_details(event):
    """
    append MC details to array. Now only:
        - MC impact point on ground
    :param event:
    :return:
    """
    # add MC core x and y
    cross = text(text="+", size=5000)
    cross = cross + translate([1000, 1000, 0])(text(text="MC", size=1000))
    cross = color([1, 0, 0])(linear_extrude(200)(cross))
    cross = translate(
        [event.mc.core_x.to('cm').value,
         event.mc.core_y.to('cm').value, 0])(cross)
    return cross
Exemple #2
0
def rot_arrow(radius, angle_init, angle_end, label, text_flip=False):
    """
    Create curved arrow as 1 degree-step cylinders with a cone at the end ==> arrow
    Add also a label in the middle of the arrox as a text.
    :param radius: radius is in cm
    :param angle_init: in degrees
    :param angle_end: in degrees
    :param label: label to be given to the arrow
    :param text_flip: rotate text by 180 degrees
    :return: arrow

    example:

    arr_curved = color([1, 0, 0])(rot_arrow(8000, az.to('deg').value,0, label='AZ'))
    array.add(arr_curved)

    """
    curved_arrow = union()
    point = cylinder(r1=radius / 15, r2=0, h=radius / 8)
    point = rotate([0, -90, -90])(point)

    if angle_end > angle_init:
        angles = np.deg2rad(np.arange(angle_init, angle_end, 1))[1:-5]
        x = radius * np.cos(angles)
        y = radius * np.sin(angles)
        point = rotate([0, 0, np.rad2deg(angles[-2])])(point)
    elif angle_end < angle_init:
        angles = np.deg2rad(np.arange(angle_init, angle_end, -1))[:-5]
        x = radius * np.cos(angles)
        y = radius * np.sin(angles)
        point = rotate([0, 0, np.rad2deg(angles[-2]) + 180])(point)

    curved_body = arco(x, y, radius / 30)
    point = translate([x[-2], y[-2], 0])(point)
    curved_arrow.add(point)
    curved_arrow.add(curved_body)
    testo = linear_extrude(radius / 30)(text(label, size=radius / 5))
    index = x.size // 3 * 2
    testo = rotate([0, 0, np.rad2deg(angles[index])])(testo)
    if text_flip:
        testo = rotate([0, 0, 180])(testo)
        testo = translate(
            [0.15 * len(label) * x[index], 0.15 * len(label) * y[index],
             0])(testo)
    testo = translate([1.1 * x[index], 1.1 * y[index], 0])(testo)
    curved_arrow.add(testo)
    return curved_arrow
Exemple #3
0
def arrow(heigth, tail, label, rotation=(0, 0, 0)):
    """
    Create arrow with rotation. Default is VERTICAL, along Z-axis
    :param heigth: (float) height
    :param tail:    (tuple) position of tail.
    :param rotation: (tuple) rotation along x, y and z axis
    :param label: something converted to string to put as label on axis
    :return: arrow with label
    TODO: add rotation from rotation function and not with the *rotate* in *solid*
    """
    arrow_inst = union()
    arrow_inst.add(cylinder(r=heigth / 20, h=heigth))
    arrow_inst.add(
        translate([0, 0, heigth])(cylinder(r1=heigth / 10, r2=0,
                                           h=heigth / 8)))
    arrow_inst.add(
        translate([0, 0, heigth * 1.2])(rotate([90, -90, 0])(linear_extrude(
            heigth / 40)(text(text=label,
                              size=heigth / 5,
                              font="Cantarell:style=Bold")))))
    arrow_inst = rotate(list(rotation))(arrow_inst)
    arrow_inst = translate(list(tail))(arrow_inst)
    return arrow_inst
def telescope(tel_description,
              camera_display_bool,
              pointing,
              origin,
              tel_num='0',
              ref_camera=True,
              ref_tel=False,
              sim_to_real=False):
    """
    Create telescope. Implemented only 'LST' by now. Everything is somehow in centimeters.
    :param tel_description: string for telescope type. 'LST', 'MST', ecc.
    :param camera_display_bool: input from camera_event.py loaded another event.
    :param pointing: dictionary for pointing directions in degrees above horizon, {'alt': val, 'az': val}
    :param origin: (x, y, z) position of the telescope
    :param tel_num: (int) Telescope ID to be plotted with the telescope
    :param ref_camera: (bool) create ref frame on camera
    :param ref_tel: (bool) create ref frame at the center of the telescope...TODO: needed?
    :param sim_to_real: (bool) WITHOUT THIS THE CAMERA IS IN CTAPIPE VISUALIZATION != REAL WORLD
    :return: geometry for the telescope.

    TODO: create real substructure for telescope?
    """

    DC_list = ['LSTCam', 'FlashCam', 'NectarCam', 'DigiCam']
    SC_list = ['SCTCam', 'ASTRICam', 'CHEC']

    # unpack camera_display values
    camera_display = camera_display_bool[0]
    bool_trig = camera_display_bool[1]

    if bool_trig:
        color_trig = [1, 0, 0]
    else:
        color_trig = [0, 1, 0]

    telescope_struct = union()

    tel_type = tel_description.split(':')[0]
    camera_name = tel_description.split(':')[1]

    if camera_name in DC_list:
        if tel_type == 'LST':
            # create mirror plane
            mirror_plane = mirror_plane_creator(tel_type=tel_type, radius=1150)

            # define arch
            arch = union()
            x_arco = np.linspace(-2200 / 2, 2200 / 2, 50)
            y_arco = 4 / 2300 * x_arco**2
            arch_struct = color([1, 0, 0])(arco(x_arco, y_arco, 30))
            arch_struct = multmatrix(m=rotation(-90, 'y'))(arch_struct)
            arch_struct = multmatrix(m=rotation(-90, 'x'))(arch_struct)
            arch.add(arch_struct)

            arch = translate([0, 0, np.max(y_arco) - 200])(arch)

            # append camera to arch
            camera_frame = cube([400, 400, 190], center=True)

            if sim_to_real:
                camera_display = multmatrix(
                    m=rotation(90, 'z'))(camera_display)
                camera_display = multmatrix(
                    m=rotation(180, 'x'))(camera_display)

            # check for arrows in reference frame
            camera_frame = camera_frame + camera_display

            if ref_camera:
                arrow_camera = ref_arrow_2d(500,
                                            label={
                                                'x': "x_cam",
                                                'y': "y_cam"
                                            },
                                            origin=(0, 0))
                arrow_camera = multmatrix(m=rotation(180, 'x'))(arrow_camera)
                camera_frame = camera_frame + arrow_camera

            # ADD camera_frame and camera display to arch structure
            arch.add(camera_frame)

            # put together arch and mirror plane
            telescope_struct.add(arch)
            telescope_struct.add(mirror_plane)
            # telescope_struct = translate([0, 0, 450])(telescope_struct)

        elif tel_type == 'MST':
            radius = 600
            height = 1800
            ratio_cam = 2
            mirror_plane = mirror_plane_creator(tel_type=tel_type,
                                                radius=radius)
            telescope_struct.add(mirror_plane)

            # add the long spiders to the structure
            structure = struct_spider(height, radius, radius / ratio_cam)

            # create camera structure with ref arrow and overplot the event
            side_cam = 2 * (radius / ratio_cam) / np.sqrt(2)
            camera_frame = cube([side_cam, side_cam, 100], center=True)
            if sim_to_real:
                camera_display = multmatrix(
                    m=rotation(90, 'z'))(camera_display)
                camera_display = multmatrix(
                    m=rotation(180, 'x'))(camera_display)
            camera_frame = camera_frame + camera_display

            # check for arrows in reference frame
            if ref_camera:
                arrow_camera = ref_arrow_2d(500,
                                            label={
                                                'x': "x_cam",
                                                'y': "y_cam"
                                            },
                                            origin=(0, 0))
                arrow_camera = multmatrix(m=rotation(180, 'x'))(arrow_camera)
                camera_frame = camera_frame + arrow_camera

            camera_frame = translate([0, 0, 110])(camera_frame)

            # raise to top of telescope, minus 30 cm in order to look nicer
            camera_frame = translate([0, 0, height - 30])(camera_frame)
            structure = structure + camera_frame

            # add structure, camera frame and camera on the telescope structure
            telescope_struct.add(structure)
            # telescope_struct = translate([0, 0, -150])(telescope_struct)

        elif tel_type == 'SST-1M':
            # TODO: CREATE MODEL FOR SST 1-M: re-use the MST
            print("sst")
            pass

    elif camera_name in SC_list:
        pass
        if tel_type == 'MST-SCT':
            print("MST-SCT")
        elif tel_type == 'SST:ASTRI':
            print("SST:ASTRI")
        elif tel_type == 'SST-GCT':
            print("SST-GCT")
    else:
        print("NO tel_name FOUND")
        sys.exit()

    telescope_struct = multmatrix(m=rotation(-90, 'z'))(telescope_struct)

    # rotate to pointing. First move in ALTITUDE and then in AZIMUTH
    zen = 90 - pointing['alt'].value
    az = pointing['az'].value
    telescope_struct = multmatrix(m=rotation(zen, 'y'))(telescope_struct)
    telescope_struct = multmatrix(m=rotation(-az, 'z'))(telescope_struct)

    # ADD TELESCOPE ID
    print(tel_num, tel_type)
    tel_number = color(color_trig)(linear_extrude(100)(text(text=str(tel_num),
                                                            size=10000,
                                                            spacing=0.1)))
    tel_number = rotate((0, 0, az + 90))(tel_number)
    tel_number = translate((origin[0] - 700, origin[1] - 700, 0))(tel_number)
    telescope_struct = translate(list(origin))(telescope_struct)
    telescope_struct = telescope_struct + tel_number

    return telescope_struct
Exemple #5
0
def generate_skyline_stl(username, year, running_matrix):
    """
    Some code of this function is from https://github.com/felixgomez/gitlab-skyline
    """
    max_run_distance = max(running_matrix)
    total_run_distance = sum(running_matrix)
    base_top_width = 23
    base_width = 30
    base_length = 150
    base_height = 10
    max_length_run_distance = 40
    bar_base_dimension = 2.5

    base_top_offset = (base_width - base_top_width) / 2
    face_angle = math.degrees(math.atan(base_height / base_top_offset))

    base_points = [
        [0, 0, 0],
        [base_length, 0, 0],
        [base_length, base_width, 0],
        [0, base_width, 0],
        [base_top_offset, base_top_offset, base_height],
        [base_length - base_top_offset, base_top_offset, base_height],
        [base_length - base_top_offset, base_width - base_top_offset, base_height],
        [base_top_offset, base_width - base_top_offset, base_height],
    ]

    base_faces = [
        [0, 1, 2, 3],  # bottom
        [4, 5, 1, 0],  # front
        [7, 6, 5, 4],  # top
        [5, 6, 2, 1],  # right
        [6, 7, 3, 2],  # back
        [7, 4, 0, 3],  # left
    ]

    base_scad = polyhedron(points=base_points, faces=base_faces)

    year_scad = rotate([face_angle, 0, 0])(
        translate(
            [
                base_length - base_length / 5,
                base_height / 2 - base_top_offset / 2 - 1,
                -1.5,
            ]
        )(linear_extrude(height=2)(text(str(year), 6)))
    )

    user_scad = rotate([face_angle, 0, 0])(
        translate([base_length / 4, base_height / 2 - base_top_offset / 2, -1.5])(
            linear_extrude(height=2)(text("@" + username, 5))
        )
    )

    total_scad = rotate([face_angle, 0, 0])(
        translate(
            [
                base_length - base_length / 3 - 17,
                base_height / 2 - base_top_offset / 2,
                -1.5,
            ]
        )(linear_extrude(height=2)(text(str(round(total_run_distance, 1)) + " km", 5)))
    )

    running_scad = rotate([face_angle, 0, 0])(
        translate([base_length / 12, base_height / 2 - base_top_offset / 2, -1])(
            linear_extrude(height=2)(text("Running", 5))
        )
    )

    bars = None

    week_number = 1
    for i in range(len(running_matrix)):

        day_number = i % 7
        if day_number == 0:
            week_number += 1

        if running_matrix[i] == 0:
            continue

        bar = translate(
            [
                base_top_offset + 2.5 + (week_number - 1) * bar_base_dimension,
                base_top_offset + 2.5 + day_number * bar_base_dimension,
                base_height,
            ]
        )(
            cube(
                [
                    bar_base_dimension,
                    bar_base_dimension,
                    running_matrix[i] * max_length_run_distance / max_run_distance,
                ]
            )
        )

        if bars is None:
            bars = bar
        else:
            bars += bar

    scad_running_filename = "running_" + username + "_" + str(year)
    scad_skyline_object = base_scad - running_scad + user_scad + total_scad + year_scad

    if bars is not None:
        scad_skyline_object += bars

    scad_render_to_file(scad_skyline_object, scad_running_filename + ".scad")

    subprocess.run(
        [
            "openscad",
            "-o",
            scad_running_filename + ".stl",
            scad_running_filename + ".scad",
        ]
    )

    print("Generated STL file " + scad_running_filename + ".stl")