# 3d_printer_slicer
# 3d_printer_slicer
py
import sys
import numpy as np
from stl import mesh # Install with `pip install numpy-stl`
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QFileDialog, QSlider,
QLabel, QVBoxLayout, QWidget, QComboBox, QCheckBox
from PyQt5.QtCore import Qt
# Global variables
LAYER_HEIGHT = 0.2 # Default layer height
INFILL_DENSITY = 48 # Default infill density (%)
INFILL_PATTERN = "Rectilinear" # Default infill pattern
class SlicerGUI(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('Advanced 3D Printing Slicer')
self.setGeometry(100, 100, 800, 600)
# Create widgets
self.btn_load_model = QPushButton('Load STL', self)
self.btn_load_model.clicked.connect(self.load_stl_file)
self.combo_infill_pattern = QComboBox(self)
self.combo_infill_pattern.addItems(["Rectilinear", "Honeycomb", "Grid"])
self.combo_infill_pattern.setCurrentText(INFILL_PATTERN)
self.combo_infill_pattern.currentTextChanged.connect(self.update_infill_pattern)
self.label_infill_pattern = QLabel(f'Infill Pattern: {INFILL_PATTERN}', self)
# Layout
layout = QVBoxLayout()
layout.addWidget(self.btn_load_model)
layout.addWidget(self.slider_layer_height)
layout.addWidget(self.label_layer_height)
layout.addWidget(self.slider_infill_density)
layout.addWidget(self.label_infill_density)
layout.addWidget(self.combo_infill_pattern)
layout.addWidget(self.label_infill_pattern)
layout.addWidget(self.chk_generate_supports)
layout.addWidget(self.btn_slice)
widget = QWidget()
widget.setLayout(layout)
self.setCentralWidget(widget)
def load_stl_file(self):
file_dialog = QFileDialog(self)
file_dialog.setNameFilter("STL files (*.stl)")
if file_dialog.exec_():
file_path = file_dialog.selectedFiles()[0]
self.process_stl(file_path)
def slice_model(self):
if hasattr(self, 'mesh_data'):
slices = self.slice_model_process(self.mesh_data)
# TODO: Generate G-code and further process slices
slices = []
for z in layer_heights:
slice_polygons = []
for triangle in mesh_data.vectors:
# Check if triangle intersects current layer
if (triangle[:,2].min() < z < triangle[:,2].max()):
# Interpolate to find intersection points on triangle
intersection_points = []
for i in range(3):
j = (i + 1) % 3
if (triangle[i, 2] > z) != (triangle[j, 2] > z):
t = (z - triangle[i, 2]) / (triangle[j, 2] - triangle[i, 2])
intersection_points.append(triangle[i] + t * (triangle[j] - triangle[i]))
slice_polygons.append(intersection_points)
slices.append(slice_polygons)
return slices
def main():
app = QApplication(sys.argv)
window = SlicerGUI()
window.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()