From 92a870e834d94509b367e99775b5d84832ad6eae Mon Sep 17 00:00:00 2001 From: bklronin Date: Sat, 15 Jun 2024 23:03:27 +0200 Subject: [PATCH] - UI workflow improvements - Remove specific item - --- Gui.py | 303 ++++++++++++++-------------- drawing_modules/draw_widget2d.py | 6 +- drawing_modules/gl_widget.py | 45 +++-- gui.ui | 331 ++++++++++++++++--------------- main.py | 130 +++++++++--- 5 files changed, 472 insertions(+), 343 deletions(-) diff --git a/Gui.py b/Gui.py index 446226e..bb9fe69 100644 --- a/Gui.py +++ b/Gui.py @@ -29,8 +29,64 @@ class Ui_fluencyCAD(object): self.centralwidget.setObjectName(u"centralwidget") self.gridLayout = QGridLayout(self.centralwidget) self.gridLayout.setObjectName(u"gridLayout") + self.gl_box = QGroupBox(self.centralwidget) + self.gl_box.setObjectName(u"gl_box") + sizePolicy = QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.MinimumExpanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(4) + sizePolicy.setHeightForWidth(self.gl_box.sizePolicy().hasHeightForWidth()) + self.gl_box.setSizePolicy(sizePolicy) + font = QFont() + font.setPointSize(12) + self.gl_box.setFont(font) + self.horizontalLayout_4 = QHBoxLayout(self.gl_box) +#ifndef Q_OS_MAC + self.horizontalLayout_4.setSpacing(-1) +#endif + self.horizontalLayout_4.setObjectName(u"horizontalLayout_4") + self.horizontalLayout_4.setContentsMargins(12, -1, -1, -1) + + self.gridLayout.addWidget(self.gl_box, 0, 4, 7, 1) + + self.groupBox_7 = QGroupBox(self.centralwidget) + self.groupBox_7.setObjectName(u"groupBox_7") + self.gridLayout_5 = QGridLayout(self.groupBox_7) + self.gridLayout_5.setObjectName(u"gridLayout_5") + self.pb_apply_code = QPushButton(self.groupBox_7) + self.pb_apply_code.setObjectName(u"pb_apply_code") + + self.gridLayout_5.addWidget(self.pb_apply_code, 0, 0, 1, 1) + + self.pushButton_5 = QPushButton(self.groupBox_7) + self.pushButton_5.setObjectName(u"pushButton_5") + + self.gridLayout_5.addWidget(self.pushButton_5, 2, 0, 1, 1) + + self.pushButton_2 = QPushButton(self.groupBox_7) + self.pushButton_2.setObjectName(u"pushButton_2") + + self.gridLayout_5.addWidget(self.pushButton_2, 4, 0, 1, 1) + + self.pushButton = QPushButton(self.groupBox_7) + self.pushButton.setObjectName(u"pushButton") + + self.gridLayout_5.addWidget(self.pushButton, 0, 1, 1, 1) + + self.pushButton_4 = QPushButton(self.groupBox_7) + self.pushButton_4.setObjectName(u"pushButton_4") + + self.gridLayout_5.addWidget(self.pushButton_4, 2, 1, 1, 1) + + + self.gridLayout.addWidget(self.groupBox_7, 6, 5, 1, 1, Qt.AlignBottom) + self.groupBox_2 = QGroupBox(self.centralwidget) self.groupBox_2.setObjectName(u"groupBox_2") + sizePolicy1 = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Minimum) + sizePolicy1.setHorizontalStretch(0) + sizePolicy1.setVerticalStretch(0) + sizePolicy1.setHeightForWidth(self.groupBox_2.sizePolicy().hasHeightForWidth()) + self.groupBox_2.setSizePolicy(sizePolicy1) self.gridLayout_2 = QGridLayout(self.groupBox_2) self.gridLayout_2.setObjectName(u"gridLayout_2") self.pb_rectool = QPushButton(self.groupBox_2) @@ -40,6 +96,8 @@ class Ui_fluencyCAD(object): self.pb_linetool = QPushButton(self.groupBox_2) self.pb_linetool.setObjectName(u"pb_linetool") + self.pb_linetool.setCheckable(True) + self.pb_linetool.setAutoExclusive(True) self.gridLayout_2.addWidget(self.pb_linetool, 0, 0, 1, 1, Qt.AlignTop) @@ -54,7 +112,36 @@ class Ui_fluencyCAD(object): self.gridLayout_2.addWidget(self.pb_slotool, 1, 1, 1, 1, Qt.AlignTop) - self.gridLayout.addWidget(self.groupBox_2, 1, 0, 1, 1) + self.gridLayout.addWidget(self.groupBox_2, 0, 0, 1, 1) + + self.groupBox_3 = QGroupBox(self.centralwidget) + self.groupBox_3.setObjectName(u"groupBox_3") + sizePolicy1.setHeightForWidth(self.groupBox_3.sizePolicy().hasHeightForWidth()) + self.groupBox_3.setSizePolicy(sizePolicy1) + 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, 1, 0, 1, 1) self.groupBox = QGroupBox(self.centralwidget) self.groupBox.setObjectName(u"groupBox") @@ -81,119 +168,15 @@ class Ui_fluencyCAD(object): self.gridLayout_3.addWidget(self.pb_revop, 1, 1, 1, 1) - self.gridLayout.addWidget(self.groupBox, 0, 5, 3, 1, Qt.AlignTop) - - self.groupBox_6 = QGroupBox(self.centralwidget) - self.groupBox_6.setObjectName(u"groupBox_6") - self.verticalLayout_2 = QVBoxLayout(self.groupBox_6) - self.verticalLayout_2.setObjectName(u"verticalLayout_2") - self.pb_nw_sktch = QPushButton(self.groupBox_6) - self.pb_nw_sktch.setObjectName(u"pb_nw_sktch") - - self.verticalLayout_2.addWidget(self.pb_nw_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") - - self.verticalLayout_2.addWidget(self.pushButton_13) - - - self.gridLayout.addWidget(self.groupBox_6, 0, 0, 1, 1) - - self.groupBox_7 = QGroupBox(self.centralwidget) - self.groupBox_7.setObjectName(u"groupBox_7") - self.verticalLayout_5 = QVBoxLayout(self.groupBox_7) - self.verticalLayout_5.setObjectName(u"verticalLayout_5") - self.pb_apply_code = QPushButton(self.groupBox_7) - self.pb_apply_code.setObjectName(u"pb_apply_code") - - self.verticalLayout_5.addWidget(self.pb_apply_code) - - self.pushButton = QPushButton(self.groupBox_7) - self.pushButton.setObjectName(u"pushButton") - - self.verticalLayout_5.addWidget(self.pushButton) - - self.pushButton_5 = QPushButton(self.groupBox_7) - self.pushButton_5.setObjectName(u"pushButton_5") - - self.verticalLayout_5.addWidget(self.pushButton_5) - - self.pushButton_4 = QPushButton(self.groupBox_7) - self.pushButton_4.setObjectName(u"pushButton_4") - - self.verticalLayout_5.addWidget(self.pushButton_4) - - self.pushButton_2 = QPushButton(self.groupBox_7) - self.pushButton_2.setObjectName(u"pushButton_2") - - self.verticalLayout_5.addWidget(self.pushButton_2) - - - self.gridLayout.addWidget(self.groupBox_7, 3, 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_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.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.gridLayout.addWidget(self.groupBox, 0, 5, 6, 1, Qt.AlignTop) 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) + sizePolicy2 = QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred) + sizePolicy2.setHorizontalStretch(0) + sizePolicy2.setVerticalStretch(0) + sizePolicy2.setHeightForWidth(self.InputTab.sizePolicy().hasHeightForWidth()) + self.InputTab.setSizePolicy(sizePolicy2) self.sketch_tab = QWidget() self.sketch_tab.setObjectName(u"sketch_tab") self.verticalLayout_4 = QVBoxLayout(self.sketch_tab) @@ -210,26 +193,53 @@ class Ui_fluencyCAD(object): self.InputTab.addTab(self.code_tab, "") - self.gridLayout.addWidget(self.InputTab, 0, 2, 4, 1) + self.gridLayout.addWidget(self.InputTab, 0, 2, 7, 1) - self.gl_box = QGroupBox(self.centralwidget) - self.gl_box.setObjectName(u"gl_box") - sizePolicy2 = QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.MinimumExpanding) - sizePolicy2.setHorizontalStretch(0) - sizePolicy2.setVerticalStretch(4) - sizePolicy2.setHeightForWidth(self.gl_box.sizePolicy().hasHeightForWidth()) - self.gl_box.setSizePolicy(sizePolicy2) - font = QFont() - font.setPointSize(12) - self.gl_box.setFont(font) - self.horizontalLayout_4 = QHBoxLayout(self.gl_box) -#ifndef Q_OS_MAC - self.horizontalLayout_4.setSpacing(-1) -#endif - self.horizontalLayout_4.setObjectName(u"horizontalLayout_4") - self.horizontalLayout_4.setContentsMargins(12, -1, -1, -1) + self.groupBox_5 = QGroupBox(self.centralwidget) + self.groupBox_5.setObjectName(u"groupBox_5") + sizePolicy3 = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) + sizePolicy3.setHorizontalStretch(0) + sizePolicy3.setVerticalStretch(0) + sizePolicy3.setHeightForWidth(self.groupBox_5.sizePolicy().hasHeightForWidth()) + self.groupBox_5.setSizePolicy(sizePolicy3) + 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.element_list.setSelectionRectVisible(True) - self.gridLayout.addWidget(self.gl_box, 0, 4, 4, 1) + self.verticalLayout_3.addWidget(self.element_list) + + self.groupBox_6 = QGroupBox(self.groupBox_5) + self.groupBox_6.setObjectName(u"groupBox_6") + sizePolicy4 = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred) + sizePolicy4.setHorizontalStretch(0) + sizePolicy4.setVerticalStretch(0) + sizePolicy4.setHeightForWidth(self.groupBox_6.sizePolicy().hasHeightForWidth()) + self.groupBox_6.setSizePolicy(sizePolicy4) + self.gridLayout_6 = QGridLayout(self.groupBox_6) + self.gridLayout_6.setObjectName(u"gridLayout_6") + self.pb_del_sketch = QPushButton(self.groupBox_6) + self.pb_del_sketch.setObjectName(u"pb_del_sketch") + + self.gridLayout_6.addWidget(self.pb_del_sketch, 0, 2, 1, 1) + + self.pb_nw_sktch = QPushButton(self.groupBox_6) + self.pb_nw_sktch.setObjectName(u"pb_nw_sktch") + + self.gridLayout_6.addWidget(self.pb_nw_sktch, 0, 0, 1, 1) + + self.pb_edt_sktch = QPushButton(self.groupBox_6) + self.pb_edt_sktch.setObjectName(u"pb_edt_sktch") + + self.gridLayout_6.addWidget(self.pb_edt_sktch, 0, 1, 1, 1) + + + self.verticalLayout_3.addWidget(self.groupBox_6) + + + self.gridLayout.addWidget(self.groupBox_5, 0, 3, 7, 1) fluencyCAD.setCentralWidget(self.centralwidget) self.menubar = QMenuBar(fluencyCAD) @@ -250,35 +260,34 @@ class Ui_fluencyCAD(object): def retranslateUi(self, fluencyCAD): fluencyCAD.setWindowTitle(QCoreApplication.translate("fluencyCAD", u"fluencyCAD", None)) + self.gl_box.setTitle(QCoreApplication.translate("fluencyCAD", u"Model Viewer", 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_5.setText(QCoreApplication.translate("fluencyCAD", u"Load Code", None)) + self.pushButton_2.setText(QCoreApplication.translate("fluencyCAD", u"Export STL", None)) + self.pushButton.setText(QCoreApplication.translate("fluencyCAD", u"Delete Code", None)) + self.pushButton_4.setText(QCoreApplication.translate("fluencyCAD", u"Save code", None)) self.groupBox_2.setTitle(QCoreApplication.translate("fluencyCAD", u"Drawing", None)) self.pb_rectool.setText(QCoreApplication.translate("fluencyCAD", u"Rctgl", None)) self.pb_linetool.setText(QCoreApplication.translate("fluencyCAD", u"Line", None)) 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.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"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_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.groupBox.setTitle(QCoreApplication.translate("fluencyCAD", u"Modify", 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.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.gl_box.setTitle(QCoreApplication.translate("fluencyCAD", u"Model Viewer", None)) + self.groupBox_5.setTitle(QCoreApplication.translate("fluencyCAD", u"Components", None)) + self.groupBox_6.setTitle(QCoreApplication.translate("fluencyCAD", u"Tools", None)) + self.pb_del_sketch.setText(QCoreApplication.translate("fluencyCAD", u"Del Elmt", None)) + self.pb_nw_sktch.setText(QCoreApplication.translate("fluencyCAD", u"Add Sktch", None)) + self.pb_edt_sktch.setText(QCoreApplication.translate("fluencyCAD", u"Edt Sktch", None)) # retranslateUi diff --git a/drawing_modules/draw_widget2d.py b/drawing_modules/draw_widget2d.py index 9d5ae87..5ad2408 100644 --- a/drawing_modules/draw_widget2d.py +++ b/drawing_modules/draw_widget2d.py @@ -9,10 +9,14 @@ class SnapLineWidget(QWidget): self.points = [] self.selected_line = None self.snapping_range = 20 # Range in pixels for snapping + self.line_mode = False + def set_points(self, points: list): + self.points = points + #self.update() def mousePressEvent(self, event): - if event.button() == Qt.LeftButton : + if event.button() == Qt.LeftButton and self.line_mode: self.points.append(event.pos()) self.update() diff --git a/drawing_modules/gl_widget.py b/drawing_modules/gl_widget.py index 81be90d..e9c0c33 100644 --- a/drawing_modules/gl_widget.py +++ b/drawing_modules/gl_widget.py @@ -15,12 +15,12 @@ class OpenGLWidget(QOpenGLWidget): self.lastPos = QPoint() self.startPos = None self.endPos = None - self.xRot = 0 + self.xRot = 180 self.yRot = 0 self.zoom = -2 self.sketch = [] - self.gl_width = self.width() / 1000 - self.gl_height = self.height() / 1000 + self.gl_width = self.width() / 100 + self.gl_height = self.height() / 100 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)) @@ -55,7 +55,8 @@ class OpenGLWidget(QOpenGLWidget): return None, (0, 0, 0) - def load_mesh_direct(self, mesh) -> object: + + def load_mesh_direct(self, mesh): try: stl_mesh = mesh @@ -68,9 +69,11 @@ class OpenGLWidget(QOpenGLWidget): self.mesh_loaded = vertices self.centroid = tuple(centroid) print(f"Centroid: {self.centroid}") + self.update() except Exception as e: print(e) + def initializeGL(self): glClearColor(0, 0, 0, 1) glEnable(GL_DEPTH_TEST) @@ -85,7 +88,7 @@ class OpenGLWidget(QOpenGLWidget): self.gl_width = self.width() / 1000 self.gl_height = self.height() / 1000 - gluPerspective(45.0, aspect, 1.0, 10000.0) + gluPerspective(45.0, aspect, 0.01, 10.0) glMatrixMode(GL_MODELVIEW) @@ -94,10 +97,10 @@ class OpenGLWidget(QOpenGLWidget): glLoadIdentity() glTranslatef(0, 0, self.zoom) - glRotatef(self.xRot, 0.0, 0.0, 0.0) - glRotatef(self.yRot, 0.0, 0.0, 0.0) + glRotatef(self.xRot, 1.0, 0.0, 0.0) + glRotatef(self.yRot, 0.0, 1.0, 0.0) - glColor3f(1.0, 1.0, 1.0) + glColor3f(0.9, 0.8, 0.8) self.draw_area() @@ -136,14 +139,32 @@ class OpenGLWidget(QOpenGLWidget): 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)) + glLightfv(GL_LIGHT0, GL_POSITION, (0, 0.6, 0.6, 0)) + glLightfv(GL_LIGHT0, GL_DIFFUSE, (0.4, 0.4, 0.4, 0.6)) + glDisable(GL_LIGHTING) glBegin(GL_TRIANGLES) for vertex in points: glVertex3fv(vertex) glEnd() - self.update() + + # Draw the lines (edges of the triangles) + #glDisable(GL_LIGHTING) # Disable lighting to avoid affecting the line color + glColor3f(0.0, 0.0, 0.0) # Set line color to black (or any color you prefer) + + glBegin(GL_LINES) + for i in range(0, len(points), 3): + glVertex3fv(points[i]) + glVertex3fv(points[i + 1]) + + glVertex3fv(points[i + 1]) + glVertex3fv(points[i + 2]) + + glVertex3fv(points[i + 2]) + glVertex3fv(points[i]) + glEnd() + + glEnable(GL_LIGHTING) # Re-enable lighting if further drawing requires it def draw_area(self): @@ -174,7 +195,7 @@ class OpenGLWidget(QOpenGLWidget): def wheelEvent(self, event): delta = event.angleDelta().y() - self.zoom += delta / 120 + self.zoom += delta / 200 self.update() def aspect_ratio(self): diff --git a/gui.ui b/gui.ui index 41b71eb..3954a97 100644 --- a/gui.ui +++ b/gui.ui @@ -15,8 +15,84 @@ - + + + + + 0 + 4 + + + + + 12 + + + + Model Viewer + + + + -1 + + + 12 + + + + + + + + Executive + + + + + + Apply Code + + + + + + + Load Code + + + + + + + Export STL + + + + + + + Delete Code + + + + + + + Save code + + + + + + + + + + 0 + 0 + + Drawing @@ -33,6 +109,12 @@ Line + + true + + + true + @@ -52,126 +134,14 @@ - - - - Modify - - - - - - Extrd - - - - - - - Cut - - - - - - - Arry - - - - - - - Rev - - - - - - - - - - Sketchtools - - - - - - Add Sketch - - - - - - - Sktch del - - - - - - - Edt Sketch - - - - - - - PushButton - - - - - - - - - - Executive - - - - - - Apply Code - - - - - - - Delete Code - - - - - - - Load Code - - - - - - - Save code - - - - - - - Export STL - - - - - - - + + + + 0 + 0 + + Constrain @@ -207,31 +177,44 @@ - - - - - 0 - 0 - - - - - 300 - 16777215 - - + + - Components + Modify - - - + + + + + Extrd + + + + + + + Cut + + + + + + + Arry + + + + + + + Rev + + - + @@ -260,29 +243,67 @@ - - + + - + 0 - 4 + 0 - - - 12 - + + + 300 + 16777215 + - Model Viewer + Components - - - -1 - - - 12 - + + + + + true + + + + + + + + 0 + 0 + + + + Tools + + + + + + Del Elmt + + + + + + + Add Sktch + + + + + + + Edt Sktch + + + + + + diff --git a/main.py b/main.py index 506ac1e..a913d65 100644 --- a/main.py +++ b/main.py @@ -1,23 +1,22 @@ import uuid + +import names from PySide6.QtCore import Qt -from PySide6.QtWidgets import QApplication, QMainWindow, QSizePolicy +from PySide6.QtWidgets import QApplication, QMainWindow, QSizePolicy, QInputDialog from Gui import Ui_fluencyCAD # Import the generated GUI module from drawing_modules.gl_widget import OpenGLWidget 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) @@ -36,7 +35,7 @@ class MainWindow(QMainWindow): ### Main Model self.model = { 'sketch': {}, - 'operations': {}, + 'operation': {}, } self.list_selected = [] @@ -46,17 +45,30 @@ class MainWindow(QMainWindow): ### Sketches self.ui.pb_nw_sktch.pressed.connect(self.add_sketch) - self.ui.pb_del_sketch.pressed.connect(self.reset_pos_list) + self.ui.pb_del_sketch.pressed.connect(self.del_sketch) + self.ui.pb_edt_sktch.pressed.connect(self.edit_sketch) + + self.ui.pb_linetool.pressed.connect(self.act_line_mode) + ### Operations self.ui.pb_extrdop.pressed.connect(self.send_extrude) self.ui.pb_cutop.pressed.connect(self.send_cut) + def act_line_mode(self): + if not self.ui.pb_linetool.isChecked(): + self.sketchWidget.line_mode = True + self.sketchWidget.points = [] + else: + self.sketchWidget.line_mode = False + + + 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'] + print("selected_for disp", name) + model = self.model['operation'][name]['sdf_object'] mesh = model.generate(samples=2**12) self.openGLWidget.load_mesh_direct(mesh) @@ -67,48 +79,111 @@ class MainWindow(QMainWindow): print(f"Selected item: {name}") def add_sketch(self): - p_list = [] - name = f"sketch-{str(uuid.uuid4())}" + name = f"sketch-{str(names.get_first_name())}" points = self.sketchWidget.points - for ps in points: - p_list.append((ps.x(), ps.y())) - element = { 'id': name, 'type': 'polygon', - 'sketch_points': p_list, + 'sketch_points': points, } self.model['sketch'][element['id']] = element print(self.model) self.ui.element_list.addItem(name) + self.ui.pb_linetool.setChecked(False) + self.sketchWidget.line_mode = False + + items = self.ui.element_list.findItems(name, Qt.MatchExactly)[0] + self.ui.element_list.setCurrentItem(items) + + def edit_sketch(self): + name = self.ui.element_list.currentItem().text() + self.sketchWidget.clear_sketch() + points = self.model['sketch'][name]['sketch_points'] + print("points", points) + self.sketchWidget.set_points(points) + + def del_sketch(self): + print("Deleting") + name = self.ui.element_list.currentItem() # Get the current item + + print(self.model) + + if name is not None: + item_name = name.text() + print("obj_name", item_name) + + # Check if the 'sketch' key exists in the model dictionary + if 'sketch' in self.model and item_name in self.model['sketch']: + if self.model['sketch'][item_name]['id'] == item_name: + row = self.ui.element_list.row(name) # Get the row of the current item + self.ui.element_list.takeItem(row) # Remove the item from the list widget + self.sketchWidget.clear_sketch() + self.model['sketch'].pop(item_name) # Remove the item from the sketch dictionary + print(f"Removed sketch: {item_name}") + + # Check if the 'operation' key exists in the model dictionary + elif 'operation' in self.model and item_name in self.model['operation']: + if self.model['operation'][item_name]['id'] == item_name: + row = self.ui.element_list.row(name) # Get the row of the current item + self.ui.element_list.takeItem(row) # Remove the item from the list widget + self.sketchWidget.clear_sketch() + self.model['operation'].pop(item_name) # Remove the item from the operation dictionary + print(f"Removed operation: {item_name}") + + else: + print(f"Item '{item_name}' not found in either 'sketch' or 'operation' dictionary.") + else: + print("No item selected.") + + def translate_points_tup(self, points): + """QPoints from Display to mesh data + input: Qpoints + output: Tuple X,Y + """ + p_list = [] + + for ps in points: + p_list.append((ps.x(), ps.y())) + + return p_list + def send_extrude(self): selected = self.ui.element_list.currentItem() name = selected.text() points = self.model['sketch'][name]['sketch_points'] + # UI to mesh + points = self.translate_points_tup(points) + + length , ok = QInputDialog.getDouble(self, 'Extrude Length', 'Enter a mm value:', decimals=2) + #TODO : Implement cancel geo = Geometry() - f = geo.extrude_shape(points) + f = geo.extrude_shape(points, length) + + name_op = f"extrd-{name}" element = { - 'id': name, + 'id': name_op, 'type': 'extrude', 'sdf_object': f, } - name_op = f"extrd-{name}" - self.model['operations'][name_op] = element + + self.model['operation'][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]) + items = self.ui.element_list.findItems(name_op, Qt.MatchExactly)[0] + self.ui.element_list.setCurrentItem(items) self.view_update() + def send_cut(self): name = self.ui.element_list.currentItem().text() - points = self.model['operations'][name]['sdf_object'] + points = self.model['operation'][name]['sdf_object'] self.list_selected.append(points) print(self.list_selected) @@ -123,7 +198,7 @@ class MainWindow(QMainWindow): } name_op = f"cut-{name}" - self.model['operations'][name_op] = element + self.model['operation'][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]) @@ -137,9 +212,7 @@ class MainWindow(QMainWindow): self.openGLWidget.update() - def reset_pos_list(self): - print("Deleting") - self.sketchWidget.clear_sketch() + """ def check_current_tab(self): @@ -167,9 +240,10 @@ class Geometry: print("p2", p2) return math.sqrt((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2) - def extrude_shape(self, points): + def extrude_shape(self, points, length: float): """2D to 3D sdf always first""" - f = polygon(points).extrude(100) + + f = polygon(points).extrude(length) return f