Untitled

mail@pastecode.io avatar
unknown
plain_text
a month ago
4.4 kB
7
Indexable
Never
def parse_gcode(file_path, status_var):
    global newGcode
    tcp_coords = []
    z_position = 0
    x_position = 0
    y_position = 0

    with open(file_path, 'r') as file:
        lines = file.readlines()
        total_lines = len(lines)
        for idx, line in enumerate(lines):
            line = line.strip()
            status_var.set(f"Analyzing G-code: {idx + 1}/{total_lines}")
            print(f"Analyzing G-code: {idx + 1}/{total_lines}")

            if 'G0' in line or 'G1' in line:
                x = y = None
                match = re.search(r'X([-+]?[0-9]*\.?[0-9]+)', line)
                if match:
                    x = float(match.group(1))
                    x_position = x
                match = re.search(r'Y([-+]?[0-9]*\.?[0-9]+)', line)
                if match:
                    y = float(match.group(1))
                    y_position = y
                match = re.search(r'Z([-+]?[0-9]*\.?[0-9]+)', line)
                if match:
                    z_position = float(match.group(1))

                coord = [1, x or x_position, y or y_position, z_position, 180, 0, -90, 0, 0, 0]
                tcp_coords.append(coord)
            elif 'G2' in line or 'G3' in line:
                arc_command = 2 if 'G2' in line else 3
                x = y = i = j = None
                match = re.search(r'X([-+]?[0-9]*\.?[0-9]+)', line)
                if match:
                    x = float(match.group(1))
                match = re.search(r'Y([-+]?[0-9]*\.?[0-9]+)', line)
                if match:
                    y = float(match.group(1))
                match = re.search(r'I([-+]?[0-9]*\.?[0-9]+)', line)
                if match:
                    i = float(match.group(1))
                match = re.search(r'J([-+]?[0-9]*\.?[0-9]+)', line)
                if match:
                    j = float(match.group(1))

                center_x = x_position + i
                center_y = y_position + j
                start_x = x_position
                start_y = y_position

                # Calculate the radius
                radius = sqrt((start_x - center_x) ** 2 + (start_y - center_y) ** 2)

                if x is None and y is None:
                    # Full circle case
                    arc_command = 3
                    end_x = start_x
                    end_y = start_y

                    # Calculate a point 90 degrees from the start point as the midpoint
                    mid_angle = atan2(start_y - center_y, start_x - center_x) + pi / 2
                    mid_x = center_x + radius * cos(mid_angle)
                    mid_y = center_y + radius * sin(mid_angle)

                    coord = [arc_command, mid_x, mid_y, z_position, 180, 0, -90, end_x, end_y, z_position, 180, 0, -90]
                else:
                    # Calculate start and end angles
                    start_angle = atan2(start_y - center_y, start_x - center_x)
                    end_angle = atan2(y - center_y, x - center_x)

                    # Ensure the angles are in the correct range
                    if arc_command == 2:  # Clockwise
                        if start_angle < end_angle:
                            start_angle += 2 * pi
                    else:  # Counterclockwise
                        if end_angle < start_angle:
                            end_angle += 2 * pi

                    # Calculate the midpoint angle
                    mid_angle = (start_angle + end_angle) / 2

                    # Calculate the midpoint coordinates
                    mid_x = center_x + radius * cos(mid_angle)
                    mid_y = center_y + radius * sin(mid_angle)

                    coord = [arc_command, mid_x, mid_y, z_position, 180, 0, -90, x or 0, y or 0, z_position, 180, 0, -90]

                tcp_coords.append(coord)

                # Update the current position
                if x is not None:
                    x_position = x
                if y is not None:
                    y_position = y

    status_var.set("G-code analysis complete.")
    print("G-code analysis complete. Result:")
    for coord in tcp_coords:
        print(coord)

    newGcode = 1

    # Create a simple G-code file and export it to the root directory
    with open('simplified_gcode.txt', 'w') as outfile:
        for coord in tcp_coords:
            outfile.write(f'{coord}\n')

    return tcp_coords
Leave a Comment