- Extrude and cut
This commit is contained in:
195
main.py
195
main.py
@@ -1,3 +1,5 @@
|
||||
import uuid
|
||||
from PySide6.QtCore import Qt
|
||||
from PySide6.QtWidgets import QApplication, QMainWindow, QSizePolicy
|
||||
from Gui import Ui_fluencyCAD # Import the generated GUI module
|
||||
from drawing_modules.gl_widget import OpenGLWidget
|
||||
@@ -5,11 +7,17 @@ from drawing_modules.draw_widget2d import SnapLineWidget
|
||||
from sdf import *
|
||||
import python_solvespace
|
||||
|
||||
|
||||
|
||||
# main, draw_widget, gl_widget
|
||||
|
||||
class MainWindow(QMainWindow):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
# Set up the UI from the generated GUI module
|
||||
|
||||
|
||||
self.ui = Ui_fluencyCAD()
|
||||
self.ui.setupUi(self)
|
||||
|
||||
@@ -24,21 +32,133 @@ class MainWindow(QMainWindow):
|
||||
layout2.addWidget(self.sketchWidget)
|
||||
size_policy = QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.MinimumExpanding)
|
||||
self.sketchWidget.setSizePolicy(size_policy)
|
||||
self.sketchWidget.setStyleSheet("background-color: white; border: 1px solid red;")
|
||||
|
||||
self.ui.pb_apply_code.pressed.connect(self.check_current_tab)
|
||||
### Main Model
|
||||
self.model = {
|
||||
'sketch': {},
|
||||
'operations': {},
|
||||
}
|
||||
self.list_selected = []
|
||||
|
||||
def check_current_tab(self):
|
||||
if self.ui.InputTab.currentIndex() == 0:
|
||||
self.generate_mesh_from_draw()
|
||||
elif self.ui.InputTab.currentIndex() == 1:
|
||||
self.generate_mesh_from_code()
|
||||
#self.ui.pb_apply_code.pressed.connect(self.check_current_tab)
|
||||
self.ui.element_list.currentItemChanged.connect(self.on_item_changed)
|
||||
self.ui.element_list.itemChanged.connect(self.view_update)
|
||||
|
||||
def load_and_render(self, file, centroid):
|
||||
self.openGLWidget.draw_stl(file)
|
||||
### Sketches
|
||||
self.ui.pb_nw_sktch.pressed.connect(self.add_sketch)
|
||||
self.ui.pb_del_sketch.pressed.connect(self.reset_pos_list)
|
||||
|
||||
### Operations
|
||||
self.ui.pb_extrdop.pressed.connect(self.send_extrude)
|
||||
self.ui.pb_cutop.pressed.connect(self.send_cut)
|
||||
|
||||
def view_update(self):
|
||||
print("Update")
|
||||
name = self.ui.element_list.currentItem().text()
|
||||
print("selcted_for disp", name)
|
||||
model = self.model['operations'][name]['sdf_object']
|
||||
mesh = model.generate(samples=2**12)
|
||||
self.openGLWidget.load_mesh_direct(mesh)
|
||||
|
||||
def on_item_changed(self, current_item, previous_item):
|
||||
if current_item:
|
||||
name = current_item.text()
|
||||
#self.view_update()
|
||||
print(f"Selected item: {name}")
|
||||
|
||||
def add_sketch(self):
|
||||
p_list = []
|
||||
name = f"sketch-{str(uuid.uuid4())}"
|
||||
points = self.sketchWidget.points
|
||||
|
||||
for ps in points:
|
||||
p_list.append((ps.x(), ps.y()))
|
||||
|
||||
element = {
|
||||
'id': name,
|
||||
'type': 'polygon',
|
||||
'sketch_points': p_list,
|
||||
}
|
||||
|
||||
self.model['sketch'][element['id']] = element
|
||||
print(self.model)
|
||||
|
||||
self.ui.element_list.addItem(name)
|
||||
|
||||
def send_extrude(self):
|
||||
selected = self.ui.element_list.currentItem()
|
||||
name = selected.text()
|
||||
points = self.model['sketch'][name]['sketch_points']
|
||||
|
||||
geo = Geometry()
|
||||
f = geo.extrude_shape(points)
|
||||
|
||||
element = {
|
||||
'id': name,
|
||||
'type': 'extrude',
|
||||
'sdf_object': f,
|
||||
}
|
||||
|
||||
name_op = f"extrd-{name}"
|
||||
self.model['operations'][name_op] = element
|
||||
self.ui.element_list.addItem(name_op)
|
||||
items = self.ui.element_list.findItems(name_op, Qt.MatchExactly)
|
||||
self.ui.element_list.setCurrentItem(items[0])
|
||||
self.view_update()
|
||||
|
||||
def send_cut(self):
|
||||
name = self.ui.element_list.currentItem().text()
|
||||
points = self.model['operations'][name]['sdf_object']
|
||||
self.list_selected.append(points)
|
||||
print(self.list_selected)
|
||||
|
||||
if len(self.list_selected) > 1:
|
||||
geo = Geometry()
|
||||
f = geo.cut_shapes(self.list_selected[0], self.list_selected[1] )
|
||||
|
||||
element = {
|
||||
'id': name,
|
||||
'type': 'cut',
|
||||
'sdf_object': f,
|
||||
}
|
||||
|
||||
name_op = f"cut-{name}"
|
||||
self.model['operations'][name_op] = element
|
||||
self.ui.element_list.addItem(name_op)
|
||||
items = self.ui.element_list.findItems(name_op, Qt.MatchExactly)
|
||||
self.ui.element_list.setCurrentItem(items[0])
|
||||
self.view_update()
|
||||
|
||||
else:
|
||||
print("mindestens 2!")
|
||||
|
||||
def load_and_render(self, file):
|
||||
self.openGLWidget.load_stl(file)
|
||||
self.openGLWidget.update()
|
||||
|
||||
|
||||
def reset_pos_list(self):
|
||||
print("Deleting")
|
||||
self.sketchWidget.clear_sketch()
|
||||
|
||||
|
||||
""" def check_current_tab(self):
|
||||
if self.ui.InputTab.currentIndex() == 0:
|
||||
geo = Geometry()
|
||||
geo.generate_mesh_from_draw(self.sketchWidget.points)
|
||||
self.load_and_render("out.stl")
|
||||
|
||||
elif self.ui.InputTab.currentIndex() == 1:
|
||||
code_bytes = self.ui.textEdit.toPlainText().encode('utf-8')
|
||||
code_text = code_bytes.decode('utf-8')
|
||||
save_string = "\nf.save('out.stl', samples=2**12)"
|
||||
code_text += save_string
|
||||
|
||||
geo = Geometry()
|
||||
geo.generate_mesh_from_code(code_text)
|
||||
self.load_and_render("out.stl")"""
|
||||
|
||||
|
||||
|
||||
class Geometry:
|
||||
def distance(self, p1, p2):
|
||||
@@ -47,13 +167,25 @@ class Geometry:
|
||||
print("p2", p2)
|
||||
return math.sqrt((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2)
|
||||
|
||||
def generate_mesh_from_code(self):
|
||||
code_bytes = self.ui.textEdit.toPlainText().encode('utf-8')
|
||||
code_text = code_bytes.decode('utf-8')
|
||||
save_string = "\nf.save('out.stl', samples=2**12)"
|
||||
code_text += save_string
|
||||
def extrude_shape(self, points):
|
||||
"""2D to 3D sdf always first"""
|
||||
f = polygon(points).extrude(100)
|
||||
|
||||
return f
|
||||
|
||||
def cut_shapes(self, sdf_object1, sdf_object2):
|
||||
f = difference(sdf_object1, sdf_object2) # equivalent
|
||||
|
||||
return f
|
||||
|
||||
def export_mesh(self, sdf_object):
|
||||
"""FINAL EXPORT"""
|
||||
result_points = sdf_object.generate()
|
||||
write_binary_stl('out.stl', result_points)
|
||||
|
||||
def generate_mesh_from_code(self, code_text: str):
|
||||
local_vars = {}
|
||||
|
||||
try:
|
||||
print(code_text)
|
||||
exec(code_text, globals(), local_vars)
|
||||
@@ -61,43 +193,10 @@ class Geometry:
|
||||
# Retrieve the result from the captured local variables
|
||||
result = local_vars.get('result')
|
||||
print("Result:", result)
|
||||
mesh = self.openGLWidget.load_stl("out.stl")
|
||||
self.openGLWidget.draw_stl(mesh)
|
||||
|
||||
except Exception as e:
|
||||
print("Error executing code:", e)
|
||||
|
||||
def generate_mesh_from_draw(self, points, ):
|
||||
f = None
|
||||
points = MainWindow().sketchWidget.points
|
||||
print(points)
|
||||
p_list = []
|
||||
dimension = 0.001
|
||||
for ps in points:
|
||||
p_list.append((ps.x() , ps.y()))
|
||||
|
||||
#p_list.append(p_list[0])
|
||||
print(p_list)
|
||||
f = polygon(p_list).extrude(100)
|
||||
|
||||
"""if len(points) > 3:
|
||||
p1 = [points[0].x(), points[0].y()]
|
||||
p2 = [points[1].x(), points[1].y()]
|
||||
dimension = self.distance(p1, p2)
|
||||
scale = 0.001
|
||||
f = box(dimension * scale)
|
||||
elif len(points) < 3:
|
||||
p1 = [points[0].x(), points[0].y()]
|
||||
p2 = [points[1].x(), points[1].y()]
|
||||
dimension = self.distance(p1, p2)
|
||||
scale = 0.001
|
||||
print(dimension * scale)
|
||||
f = sphere(dimension * scale)"""
|
||||
|
||||
if f:
|
||||
f.save('out.stl', samples=2**12, sparse=False)
|
||||
|
||||
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app = QApplication([])
|
||||
|
||||
Reference in New Issue
Block a user