diff --git a/Gui.py b/Gui.py
index d4ffb62..446226e 100644
--- a/Gui.py
+++ b/Gui.py
@@ -16,15 +16,15 @@ from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
QImage, QKeySequence, QLinearGradient, QPainter,
QPalette, QPixmap, QRadialGradient, QTransform)
from PySide6.QtWidgets import (QApplication, QGridLayout, QGroupBox, QHBoxLayout,
- QHeaderView, QMainWindow, QMenuBar, QPushButton,
- QSizePolicy, QStatusBar, QTabWidget, QTextEdit,
- QTreeView, QVBoxLayout, QWidget)
+ QListWidget, QListWidgetItem, QMainWindow, QMenuBar,
+ QPushButton, QSizePolicy, QStatusBar, QTabWidget,
+ QTextEdit, QVBoxLayout, QWidget)
class Ui_fluencyCAD(object):
def setupUi(self, fluencyCAD):
if not fluencyCAD.objectName():
fluencyCAD.setObjectName(u"fluencyCAD")
- fluencyCAD.resize(1755, 671)
+ fluencyCAD.resize(1755, 685)
self.centralwidget = QWidget(fluencyCAD)
self.centralwidget.setObjectName(u"centralwidget")
self.gridLayout = QGridLayout(self.centralwidget)
@@ -60,25 +60,25 @@ class Ui_fluencyCAD(object):
self.groupBox.setObjectName(u"groupBox")
self.gridLayout_3 = QGridLayout(self.groupBox)
self.gridLayout_3.setObjectName(u"gridLayout_3")
- self.pushButton_7 = QPushButton(self.groupBox)
- self.pushButton_7.setObjectName(u"pushButton_7")
+ self.pb_extrdop = QPushButton(self.groupBox)
+ self.pb_extrdop.setObjectName(u"pb_extrdop")
- self.gridLayout_3.addWidget(self.pushButton_7, 0, 0, 1, 1)
+ self.gridLayout_3.addWidget(self.pb_extrdop, 0, 0, 1, 1)
- self.pushButton_14 = QPushButton(self.groupBox)
- self.pushButton_14.setObjectName(u"pushButton_14")
+ self.pb_cutop = QPushButton(self.groupBox)
+ self.pb_cutop.setObjectName(u"pb_cutop")
- self.gridLayout_3.addWidget(self.pushButton_14, 0, 1, 1, 1)
+ self.gridLayout_3.addWidget(self.pb_cutop, 0, 1, 1, 1)
- self.pushButton_15 = QPushButton(self.groupBox)
- self.pushButton_15.setObjectName(u"pushButton_15")
+ self.pb_arrayop = QPushButton(self.groupBox)
+ self.pb_arrayop.setObjectName(u"pb_arrayop")
- self.gridLayout_3.addWidget(self.pushButton_15, 1, 1, 1, 1)
+ self.gridLayout_3.addWidget(self.pb_arrayop, 1, 0, 1, 1)
- self.pushButton_16 = QPushButton(self.groupBox)
- self.pushButton_16.setObjectName(u"pushButton_16")
+ self.pb_revop = QPushButton(self.groupBox)
+ self.pb_revop.setObjectName(u"pb_revop")
- self.gridLayout_3.addWidget(self.pushButton_16, 1, 0, 1, 1)
+ self.gridLayout_3.addWidget(self.pb_revop, 1, 1, 1, 1)
self.gridLayout.addWidget(self.groupBox, 0, 5, 3, 1, Qt.AlignTop)
@@ -92,16 +92,16 @@ class Ui_fluencyCAD(object):
self.verticalLayout_2.addWidget(self.pb_nw_sktch)
- self.pb_edt_sktch = QPushButton(self.groupBox_6)
- self.pb_edt_sktch.setObjectName(u"pb_edt_sktch")
-
- self.verticalLayout_2.addWidget(self.pb_edt_sktch)
-
self.pb_del_sketch = QPushButton(self.groupBox_6)
self.pb_del_sketch.setObjectName(u"pb_del_sketch")
self.verticalLayout_2.addWidget(self.pb_del_sketch)
+ self.pb_edt_sktch = QPushButton(self.groupBox_6)
+ self.pb_edt_sktch.setObjectName(u"pb_edt_sktch")
+
+ self.verticalLayout_2.addWidget(self.pb_edt_sktch)
+
self.pushButton_13 = QPushButton(self.groupBox_6)
self.pushButton_13.setObjectName(u"pushButton_13")
@@ -110,33 +110,6 @@ class Ui_fluencyCAD(object):
self.gridLayout.addWidget(self.groupBox_6, 0, 0, 1, 1)
- self.groupBox_3 = QGroupBox(self.centralwidget)
- self.groupBox_3.setObjectName(u"groupBox_3")
- self.gridLayout_4 = QGridLayout(self.groupBox_3)
- self.gridLayout_4.setObjectName(u"gridLayout_4")
- self.pb_con_line = QPushButton(self.groupBox_3)
- self.pb_con_line.setObjectName(u"pb_con_line")
-
- self.gridLayout_4.addWidget(self.pb_con_line, 0, 1, 1, 1)
-
- self.pb_con_ptpt = QPushButton(self.groupBox_3)
- self.pb_con_ptpt.setObjectName(u"pb_con_ptpt")
-
- self.gridLayout_4.addWidget(self.pb_con_ptpt, 0, 0, 1, 1)
-
- self.pb_con_horiz = QPushButton(self.groupBox_3)
- self.pb_con_horiz.setObjectName(u"pb_con_horiz")
-
- self.gridLayout_4.addWidget(self.pb_con_horiz, 1, 0, 1, 1)
-
- self.pb_con_vert = QPushButton(self.groupBox_3)
- self.pb_con_vert.setObjectName(u"pb_con_vert")
-
- self.gridLayout_4.addWidget(self.pb_con_vert, 1, 1, 1, 1)
-
-
- self.gridLayout.addWidget(self.groupBox_3, 2, 0, 1, 1)
-
self.groupBox_7 = QGroupBox(self.centralwidget)
self.groupBox_7.setObjectName(u"groupBox_7")
self.verticalLayout_5 = QVBoxLayout(self.groupBox_7)
@@ -169,13 +142,58 @@ class Ui_fluencyCAD(object):
self.gridLayout.addWidget(self.groupBox_7, 3, 0, 1, 1)
- self.InputTab = QTabWidget(self.centralwidget)
- self.InputTab.setObjectName(u"InputTab")
- sizePolicy = QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred)
+ self.groupBox_3 = QGroupBox(self.centralwidget)
+ self.groupBox_3.setObjectName(u"groupBox_3")
+ self.gridLayout_4 = QGridLayout(self.groupBox_3)
+ self.gridLayout_4.setObjectName(u"gridLayout_4")
+ self.pb_con_line = QPushButton(self.groupBox_3)
+ self.pb_con_line.setObjectName(u"pb_con_line")
+
+ self.gridLayout_4.addWidget(self.pb_con_line, 0, 1, 1, 1)
+
+ self.pb_con_ptpt = QPushButton(self.groupBox_3)
+ self.pb_con_ptpt.setObjectName(u"pb_con_ptpt")
+
+ self.gridLayout_4.addWidget(self.pb_con_ptpt, 0, 0, 1, 1)
+
+ self.pb_con_horiz = QPushButton(self.groupBox_3)
+ self.pb_con_horiz.setObjectName(u"pb_con_horiz")
+
+ self.gridLayout_4.addWidget(self.pb_con_horiz, 1, 0, 1, 1)
+
+ self.pb_con_vert = QPushButton(self.groupBox_3)
+ self.pb_con_vert.setObjectName(u"pb_con_vert")
+
+ self.gridLayout_4.addWidget(self.pb_con_vert, 1, 1, 1, 1)
+
+
+ self.gridLayout.addWidget(self.groupBox_3, 2, 0, 1, 1)
+
+ self.groupBox_5 = QGroupBox(self.centralwidget)
+ self.groupBox_5.setObjectName(u"groupBox_5")
+ sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.InputTab.sizePolicy().hasHeightForWidth())
- self.InputTab.setSizePolicy(sizePolicy)
+ sizePolicy.setHeightForWidth(self.groupBox_5.sizePolicy().hasHeightForWidth())
+ self.groupBox_5.setSizePolicy(sizePolicy)
+ self.groupBox_5.setMaximumSize(QSize(300, 16777215))
+ self.verticalLayout_3 = QVBoxLayout(self.groupBox_5)
+ self.verticalLayout_3.setObjectName(u"verticalLayout_3")
+ self.element_list = QListWidget(self.groupBox_5)
+ self.element_list.setObjectName(u"element_list")
+
+ self.verticalLayout_3.addWidget(self.element_list)
+
+
+ self.gridLayout.addWidget(self.groupBox_5, 0, 3, 4, 1)
+
+ self.InputTab = QTabWidget(self.centralwidget)
+ self.InputTab.setObjectName(u"InputTab")
+ sizePolicy1 = QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred)
+ sizePolicy1.setHorizontalStretch(0)
+ sizePolicy1.setVerticalStretch(0)
+ sizePolicy1.setHeightForWidth(self.InputTab.sizePolicy().hasHeightForWidth())
+ self.InputTab.setSizePolicy(sizePolicy1)
self.sketch_tab = QWidget()
self.sketch_tab.setObjectName(u"sketch_tab")
self.verticalLayout_4 = QVBoxLayout(self.sketch_tab)
@@ -194,24 +212,6 @@ class Ui_fluencyCAD(object):
self.gridLayout.addWidget(self.InputTab, 0, 2, 4, 1)
- self.groupBox_5 = QGroupBox(self.centralwidget)
- self.groupBox_5.setObjectName(u"groupBox_5")
- sizePolicy1 = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
- sizePolicy1.setHorizontalStretch(0)
- sizePolicy1.setVerticalStretch(0)
- sizePolicy1.setHeightForWidth(self.groupBox_5.sizePolicy().hasHeightForWidth())
- self.groupBox_5.setSizePolicy(sizePolicy1)
- self.groupBox_5.setMaximumSize(QSize(300, 16777215))
- self.verticalLayout_3 = QVBoxLayout(self.groupBox_5)
- self.verticalLayout_3.setObjectName(u"verticalLayout_3")
- self.comp_tree = QTreeView(self.groupBox_5)
- self.comp_tree.setObjectName(u"comp_tree")
-
- self.verticalLayout_3.addWidget(self.comp_tree)
-
-
- self.gridLayout.addWidget(self.groupBox_5, 0, 3, 4, 1)
-
self.gl_box = QGroupBox(self.centralwidget)
self.gl_box.setObjectName(u"gl_box")
sizePolicy2 = QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.MinimumExpanding)
@@ -256,29 +256,29 @@ class Ui_fluencyCAD(object):
self.pb_circtool.setText(QCoreApplication.translate("fluencyCAD", u"Circle", None))
self.pb_slotool.setText(QCoreApplication.translate("fluencyCAD", u"Slot", None))
self.groupBox.setTitle(QCoreApplication.translate("fluencyCAD", u"Modify", None))
- self.pushButton_7.setText(QCoreApplication.translate("fluencyCAD", u"Cut", None))
- self.pushButton_14.setText(QCoreApplication.translate("fluencyCAD", u"Arry", None))
- self.pushButton_15.setText(QCoreApplication.translate("fluencyCAD", u"Extrd", None))
- self.pushButton_16.setText(QCoreApplication.translate("fluencyCAD", u"Rev", None))
+ self.pb_extrdop.setText(QCoreApplication.translate("fluencyCAD", u"Extrd", None))
+ self.pb_cutop.setText(QCoreApplication.translate("fluencyCAD", u"Cut", None))
+ self.pb_arrayop.setText(QCoreApplication.translate("fluencyCAD", u"Arry", None))
+ self.pb_revop.setText(QCoreApplication.translate("fluencyCAD", u"Rev", None))
self.groupBox_6.setTitle(QCoreApplication.translate("fluencyCAD", u"Sketchtools", None))
- self.pb_nw_sktch.setText(QCoreApplication.translate("fluencyCAD", u"Nw Sktch Wp", None))
- self.pb_edt_sktch.setText(QCoreApplication.translate("fluencyCAD", u"Edt Sketch", None))
+ self.pb_nw_sktch.setText(QCoreApplication.translate("fluencyCAD", u"Add Sketch", None))
self.pb_del_sketch.setText(QCoreApplication.translate("fluencyCAD", u"Sktch del", None))
+ self.pb_edt_sktch.setText(QCoreApplication.translate("fluencyCAD", u"Edt Sketch", None))
self.pushButton_13.setText(QCoreApplication.translate("fluencyCAD", u"PushButton", None))
- self.groupBox_3.setTitle(QCoreApplication.translate("fluencyCAD", u"Constrain", None))
- self.pb_con_line.setText(QCoreApplication.translate("fluencyCAD", u"Pt_Line", None))
- self.pb_con_ptpt.setText(QCoreApplication.translate("fluencyCAD", u"Pt_Pt", None))
- self.pb_con_horiz.setText(QCoreApplication.translate("fluencyCAD", u"Horiz", None))
- self.pb_con_vert.setText(QCoreApplication.translate("fluencyCAD", u"Vert", None))
self.groupBox_7.setTitle(QCoreApplication.translate("fluencyCAD", u"Executive", None))
self.pb_apply_code.setText(QCoreApplication.translate("fluencyCAD", u"Apply Code", None))
self.pushButton.setText(QCoreApplication.translate("fluencyCAD", u"Delete Code", None))
self.pushButton_5.setText(QCoreApplication.translate("fluencyCAD", u"Load Code", None))
self.pushButton_4.setText(QCoreApplication.translate("fluencyCAD", u"Save code", None))
self.pushButton_2.setText(QCoreApplication.translate("fluencyCAD", u"Export STL", None))
+ self.groupBox_3.setTitle(QCoreApplication.translate("fluencyCAD", u"Constrain", None))
+ self.pb_con_line.setText(QCoreApplication.translate("fluencyCAD", u"Pt_Line", None))
+ self.pb_con_ptpt.setText(QCoreApplication.translate("fluencyCAD", u"Pt_Pt", None))
+ self.pb_con_horiz.setText(QCoreApplication.translate("fluencyCAD", u"Horiz", None))
+ self.pb_con_vert.setText(QCoreApplication.translate("fluencyCAD", u"Vert", None))
+ self.groupBox_5.setTitle(QCoreApplication.translate("fluencyCAD", u"Components", None))
self.InputTab.setTabText(self.InputTab.indexOf(self.sketch_tab), QCoreApplication.translate("fluencyCAD", u"Sketch", None))
self.InputTab.setTabText(self.InputTab.indexOf(self.code_tab), QCoreApplication.translate("fluencyCAD", u"Code", None))
- self.groupBox_5.setTitle(QCoreApplication.translate("fluencyCAD", u"Components", None))
self.gl_box.setTitle(QCoreApplication.translate("fluencyCAD", u"Model Viewer", None))
# retranslateUi
diff --git a/drawing_modules/draw_widget2d.py b/drawing_modules/draw_widget2d.py
index 13e8393..9d5ae87 100644
--- a/drawing_modules/draw_widget2d.py
+++ b/drawing_modules/draw_widget2d.py
@@ -10,12 +10,13 @@ class SnapLineWidget(QWidget):
self.selected_line = None
self.snapping_range = 20 # Range in pixels for snapping
+
def mousePressEvent(self, event):
- if event.button() == Qt.LeftButton:
+ if event.button() == Qt.LeftButton :
self.points.append(event.pos())
self.update()
- if event.button() == Qt.RightButton:
+ elif event.button() == Qt.RightButton:
for i in range(len(self.points) - 1):
if self.is_point_on_line(event.pos(), self.points[i], self.points[i + 1]):
self.selected_line = i
@@ -24,7 +25,7 @@ class SnapLineWidget(QWidget):
self.selected_line = None
def mouseMoveEvent(self, event):
- if event.buttons() & Qt.LeftButton:
+ if event.buttons() & Qt.RightButton:
if self.selected_line is not None:
self.points[self.selected_line] = event.pos()
else:
@@ -41,7 +42,8 @@ class SnapLineWidget(QWidget):
distance1 = self.distance(p, p1)
distance2 = self.distance(p, p2)
total_distance = self.distance(p1, p2)
- return abs(distance1 + distance2 - total_distance) < 0.1
+
+ return abs(distance1 + distance2 - total_distance) < 1
def paintEvent(self, event):
painter = QPainter(self)
@@ -65,6 +67,11 @@ class SnapLineWidget(QWidget):
p2 = self.points[self.selected_line + 1]
painter.setPen(QPen(Qt.red, 2))
painter.drawLine(p1, p2)
+ painter.end()
+
+ def clear_sketch(self):
+ self.points = []
+ self.update()
# Example usage
diff --git a/drawing_modules/gl_widget.py b/drawing_modules/gl_widget.py
index bf7e264..81be90d 100644
--- a/drawing_modules/gl_widget.py
+++ b/drawing_modules/gl_widget.py
@@ -8,13 +8,16 @@ from stl import mesh
class OpenGLWidget(QOpenGLWidget):
def __init__(self, parent=None):
super().__init__(parent)
+ self.scale_factor = 0.001
+ self.mesh_loaded = None
+ self.centroid = None
self.stl_file = "out.stl" # Replace with your STL file path
self.lastPos = QPoint()
self.startPos = None
self.endPos = None
self.xRot = 0
self.yRot = 0
- self.zoom = -10.0
+ self.zoom = -2
self.sketch = []
self.gl_width = self.width() / 1000
self.gl_height = self.height() / 1000
@@ -22,9 +25,11 @@ class OpenGLWidget(QOpenGLWidget):
def map_value_to_range(self, value, value_min=0, value_max=1920, range_min=-1, range_max=1):
value = max(value_min, min(value_max, value))
mapped_value = ((value - value_min) / (value_max - value_min)) * (range_max - range_min) + range_min
+
return mapped_value
- def load_stl(self, filename):
+
+ def load_stl(self, filename: str) -> object:
try:
stl_mesh = mesh.Mesh.from_file(filename)
@@ -40,17 +45,37 @@ class OpenGLWidget(QOpenGLWidget):
centroid_y = (min_y + max_y) / 2.0
centroid_z = (min_z + max_z) / 2.0
- return stl_mesh.vectors, (centroid_x, centroid_y, centroid_z)
+ self.mesh_loaded = stl_mesh.vectors
+ self.centroid = (centroid_x, centroid_y, centroid_z)
+
except FileNotFoundError:
print(f"Error: File {filename} not found.")
except Exception as e:
print(f"Error loading {filename}: {e}")
+
return None, (0, 0, 0)
+ def load_mesh_direct(self, mesh) -> object:
+ try:
+ stl_mesh = mesh
+
+ # Extract vertices
+ vertices = np.array(stl_mesh)
+
+ # Calculate centroid based on the average position of vertices
+ centroid = np.mean(vertices, axis=0)
+
+ self.mesh_loaded = vertices
+ self.centroid = tuple(centroid)
+ print(f"Centroid: {self.centroid}")
+ except Exception as e:
+ print(e)
+
def initializeGL(self):
glClearColor(0, 0, 0, 1)
glEnable(GL_DEPTH_TEST)
+
def resizeGL(self, width, height):
glViewport(0, 0, width, height)
glMatrixMode(GL_PROJECTION)
@@ -60,36 +85,33 @@ class OpenGLWidget(QOpenGLWidget):
self.gl_width = self.width() / 1000
self.gl_height = self.height() / 1000
- gluPerspective(45.0, aspect, 1.0, 1000.0)
+ gluPerspective(45.0, aspect, 1.0, 10000.0)
glMatrixMode(GL_MODELVIEW)
+
def paintGL(self):
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glLoadIdentity()
- mesh_loaded, centroid = self.load_stl(self.stl_file)
- centroid_x, centroid_y, centroid_z = centroid
-
glTranslatef(0, 0, self.zoom)
- glRotatef(self.xRot, 1.0, 0.0, 0.0)
- glRotatef(self.yRot, 0.0, 1.0, 0.0)
+ glRotatef(self.xRot, 0.0, 0.0, 0.0)
+ glRotatef(self.yRot, 0.0, 0.0, 0.0)
glColor3f(1.0, 1.0, 1.0)
self.draw_area()
- if mesh is not None:
- # Scale the object
- scale_factor = 0.001 # Example scale factor (adjust as needed)
- glScalef(scale_factor, scale_factor, scale_factor)
+ if self.mesh_loaded is not None:
+ # Adjust the camera
+ if self.centroid:
+ glScalef(self.scale_factor, self.scale_factor, self.scale_factor) # Apply scaling
- # Translate to move the centroid of the object to the origin
- glTranslatef(-centroid_x, -centroid_y, -centroid_z)
+ cx, cy, cz = self.centroid
+ gluLookAt(cx, cy, cz + 100, cx, cy, cz, 0, 1, 0)
+ self.draw_mesh_direct(self.mesh_loaded)
- self.draw_stl(mesh_loaded)
-
def draw_stl(self, vertices):
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
@@ -105,15 +127,24 @@ class OpenGLWidget(QOpenGLWidget):
for vertex in triangle:
glVertex3fv(vertex)
glEnd()
+ self.update()
- """# Draw outer vertices as points
- glDisable(GL_LIGHTING)
- glColor3f(1.0, 0.0, 0.0) # Set color to red
- glPointSize(5.0) # Set point size
- glBegin(GL_POINTS)
- for vertex in vertices:
+ def draw_mesh_direct(self, points):
+ glEnable(GL_LIGHTING)
+ glEnable(GL_LIGHT0)
+ glEnable(GL_DEPTH_TEST)
+ glEnable(GL_COLOR_MATERIAL)
+ glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE)
+
+ glLightfv(GL_LIGHT0, GL_POSITION, (0, 1, 1, 0))
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, (0.6, 0.6, 0.6, 1.0))
+
+ glBegin(GL_TRIANGLES)
+ for vertex in points:
glVertex3fv(vertex)
- glEnd()"""
+ glEnd()
+ self.update()
+
def draw_area(self):
glColor3f(0.5, 0.5, 0.5) # Gray color
diff --git a/gui.ui b/gui.ui
index a1fadf4..41b71eb 100644
--- a/gui.ui
+++ b/gui.ui
@@ -7,7 +7,7 @@
0
0
1755
- 671
+ 685
@@ -59,28 +59,28 @@
-
-
+
+
+ Extrd
+
+
+
+ -
+
Cut
- -
-
+
-
+
Arry
-
-
-
- Extrd
-
-
-
- -
-
+
Rev
@@ -98,14 +98,7 @@
-
- Nw Sktch Wp
-
-
-
- -
-
-
- Edt Sketch
+ Add Sketch
@@ -116,6 +109,13 @@
+ -
+
+
+ Edt Sketch
+
+
+
-
@@ -126,43 +126,6 @@
- -
-
-
- Constrain
-
-
-
-
-
-
- Pt_Line
-
-
-
- -
-
-
- Pt_Pt
-
-
-
- -
-
-
- Horiz
-
-
-
- -
-
-
- Vert
-
-
-
-
-
-
-
@@ -207,6 +170,67 @@
+ -
+
+
+ Constrain
+
+
+
-
+
+
+ Pt_Line
+
+
+
+ -
+
+
+ Pt_Pt
+
+
+
+ -
+
+
+ Horiz
+
+
+
+ -
+
+
+ Vert
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 300
+ 16777215
+
+
+
+ Components
+
+
+
-
+
+
+
+
+
-
@@ -236,30 +260,6 @@
- -
-
-
-
- 0
- 0
-
-
-
-
- 300
- 16777215
-
-
-
- Components
-
-
-
-
-
-
-
-
-
-
diff --git a/main.py b/main.py
index 19ad85c..506ac1e 100644
--- a/main.py
+++ b/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([])