
import os
import subprocess
import time

import FreeCAD
import Mesh


import gcoder 


def export_to_stl(doc, output_dir):
    objects = doc.Objects

    for obj in objects:
        if isinstance(obj, Part.Feature):
            stl_path = os.path.join(output_dir, obj.Label + ".stl")
            mesh = obj.Shape.tessellate(0.1)

            # Создаем меш из геометрии объекта
            mesh_obj = Mesh.Mesh(mesh)
            
            # Проверяем, что меш содержит данные
            if len(mesh_obj.Points) > 0:
                # Экспортируем меш в формат STL
                mesh_obj.write(stl_path)

            
def create_gcode(stl_dir, output_dir):
    stl_files = [f for f in os.listdir(stl_dir) if f.endswith(".stl")]

    for stl_file in stl_files:
        stl_path = os.path.join(stl_dir, stl_file)

        gcode_file = stl_file.replace(".stl", ".gcode")
        gcode_path = os.path.join(output_dir, gcode_file)

        # Команда для запуска Slic3r (в Ubuntu используется slic3r-пакет)
        cmd = ["slic3r", "--load", "/home/mark-voltov/my_config.ini", "-o", gcode_path, stl_path]

        # Запускаем Slic3r
        subprocess.run(cmd)

def get_print_duration(gcode_dir):
    
    gcoder.G    
    gcode_files = [f for f in os.listdir(gcode_dir) if f.endswith(".gcode")]

    total_duration = 0

    for gcode_file in gcode_files:
        gcode_path = os.path.join(gcode_dir, gcode_file)

        with open(gcode_path, "r") as file:
            lines = file.readlines()

            for line in lines:
                if line.startswith("; estimated printing time"):
                    duration = float(line.split(":")[1].strip()) * 60
                    total_duration += duration
                    break

    return total_duration


file_location = App.ActiveDocument.FileName
file_name = os.path.basename(file_location )  #eds_report.csv
location = os.path.dirname(file_location )


# Путь к документу FreeCAD
doc_path = file_location

# Каталог для сохранения STL-файлов
stl_dir = location + '/stl'

# Каталог для сохранения G-code файлов
gcode_dir = location + '/gcode'

# Открываем документ FreeCAD
doc = FreeCAD.open(doc_path)

# Экспортируем модель в файлы STL
export_to_stl(doc, stl_dir)
print("STL файлы успешно созданы.")

# Создаем G-code файлы с помощью Slic3r
create_gcode(stl_dir, gcode_dir)
print("G-code файлы успешно созданы.")

# Получаем оценочную длительность печати
print_duration = get_print_duration(gcode_dir)
print("Оценочная длительность печати: {} секунд.".format(print_duration))

# Закрываем документ FreeCAD
FreeCAD.closeDocument(doc)

