From f84b0cb53b7084969843cb0d5ab1b69898ac4f97 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Mon, 26 Jun 2017 21:26:25 +0100 Subject: [PATCH] FEM: python task panels, more selection on click of list items in task panel --- .../Fem/PyGui/_TaskPanelFemElementFluid1D.py | 31 +++++++++++++++++++ .../PyGui/_TaskPanelFemElementGeometry1D.py | 31 +++++++++++++++++++ .../PyGui/_TaskPanelFemElementGeometry2D.py | 31 +++++++++++++++++++ src/Mod/Fem/PyGui/_TaskPanelFemMaterial.py | 31 +++++++++++++++++++ src/Mod/Fem/PyGui/_TaskPanelFemMeshGroup.py | 31 +++++++++++++++++++ src/Mod/Fem/PyGui/_TaskPanelFemMeshRegion.py | 15 +++++++++ 6 files changed, 170 insertions(+) diff --git a/src/Mod/Fem/PyGui/_TaskPanelFemElementFluid1D.py b/src/Mod/Fem/PyGui/_TaskPanelFemElementFluid1D.py index a3b1ce6e62..70825cbe79 100644 --- a/src/Mod/Fem/PyGui/_TaskPanelFemElementFluid1D.py +++ b/src/Mod/Fem/PyGui/_TaskPanelFemElementFluid1D.py @@ -41,6 +41,7 @@ class _TaskPanelFemElementFluid1D: FreeCADGui.Selection.clearSelection() self.sel_server = None self.obj = obj + self.obj_notvisible = [] self.form = FreeCADGui.PySideUic.loadUi(FreeCAD.getHomePath() + "Mod/Fem/PyGui/TaskPanelFemElementFluid1D.ui") QtCore.QObject.connect(self.form.btn_add, QtCore.SIGNAL("clicked()"), self.add_references) @@ -77,6 +78,7 @@ class _TaskPanelFemElementFluid1D: QtCore.QObject.connect(self.form.if_colebrooke_grain_diameter, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.colebrooke_grain_diameter_changed) QtCore.QObject.connect(self.form.sb_colebrooke_form_factor, QtCore.SIGNAL("valueChanged(double)"), self.colebrooke_form_factor_changed) QtCore.QObject.connect(self.form.tw_pump_characteristics, QtCore.SIGNAL("cellChanged(int, int)"), self.pump_characteristics_changed) + self.form.list_References.itemSelectionChanged.connect(self.select_clicked_reference_shape) self.form.list_References.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.form.list_References.connect(self.form.list_References, QtCore.SIGNAL("customContextMenuRequested(QPoint)"), self.references_list_right_clicked) self.form.cb_section_type.addItems(PyObjects._FemElementFluid1D._FemElementFluid1D.known_fluid_types) @@ -88,6 +90,7 @@ class _TaskPanelFemElementFluid1D: self.update() def accept(self): + self.setback_listobj_visibility() self.set_fluidsection_props() if self.sel_server: FreeCADGui.Selection.removeObserver(self.sel_server) @@ -96,6 +99,7 @@ class _TaskPanelFemElementFluid1D: return True def reject(self): + self.setback_listobj_visibility() if self.sel_server: FreeCADGui.Selection.removeObserver(self.sel_server) FreeCADGui.ActiveDocument.resetEdit() @@ -354,6 +358,7 @@ class _TaskPanelFemElementFluid1D: '''Called if Button add_reference is triggered''' # in constraints EditTaskPanel the selection is active as soon as the taskpanel is open # here the addReference button EditTaskPanel has to be triggered to start selection mode + self.setback_listobj_visibility() FreeCADGui.Selection.clearSelection() # start SelectionObserver and parse the function to add the References to the widget print_message = "Select Edges by single click on them to add them to the list" @@ -383,3 +388,29 @@ class _TaskPanelFemElementFluid1D: items.append(item_name) for listItemName in sorted(items): self.form.list_References.addItem(listItemName) + + def select_clicked_reference_shape(self): + self.setback_listobj_visibility() + if self.sel_server: + FreeCADGui.Selection.removeObserver(self.sel_server) + self.sel_server = None + if not self.sel_server: + if not self.references: + return + currentItemName = str(self.form.list_References.currentItem().text()) + for ref in self.references: + refname_to_compare_listentry = ref[0].Name + ':' + ref[1] + if refname_to_compare_listentry == currentItemName: + # print( 'found: shape: ' + ref[0].Name + ' element: ' + ref[1]) + if not ref[0].ViewObject.Visibility: + self.obj_notvisible.append(ref[0]) + ref[0].ViewObject.Visibility = True + FreeCADGui.Selection.clearSelection() + FreeCADGui.Selection.addSelection(ref[0], ref[1]) + + def setback_listobj_visibility(self): + '''set back Visibility of the list objects + ''' + for obj in self.obj_notvisible: + obj.ViewObject.Visibility = False + self.obj_notvisible = [] diff --git a/src/Mod/Fem/PyGui/_TaskPanelFemElementGeometry1D.py b/src/Mod/Fem/PyGui/_TaskPanelFemElementGeometry1D.py index 1460021565..a66df91d98 100644 --- a/src/Mod/Fem/PyGui/_TaskPanelFemElementGeometry1D.py +++ b/src/Mod/Fem/PyGui/_TaskPanelFemElementGeometry1D.py @@ -40,6 +40,7 @@ class _TaskPanelFemElementGeometry1D: FreeCADGui.Selection.clearSelection() self.sel_server = None self.obj = obj + self.obj_notvisible = [] self.form = FreeCADGui.PySideUic.loadUi(FreeCAD.getHomePath() + "Mod/Fem/PyGui/TaskPanelFemElementGeometry1D.ui") QtCore.QObject.connect(self.form.cb_crosssectiontype, QtCore.SIGNAL("activated(int)"), self.sectiontype_changed) @@ -49,6 +50,7 @@ class _TaskPanelFemElementGeometry1D: QtCore.QObject.connect(self.form.if_pipe_diameter, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.pipe_diameter_changed) QtCore.QObject.connect(self.form.if_pipe_thickness, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.pipe_thickness_changed) QtCore.QObject.connect(self.form.pushButton_Reference, QtCore.SIGNAL("clicked()"), self.add_references) + self.form.list_References.itemSelectionChanged.connect(self.select_clicked_reference_shape) self.form.list_References.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.form.list_References.connect(self.form.list_References, QtCore.SIGNAL("customContextMenuRequested(QPoint)"), self.references_list_right_clicked) @@ -58,6 +60,7 @@ class _TaskPanelFemElementGeometry1D: self.update() def accept(self): + self.setback_listobj_visibility() self.set_beamsection_props() if self.sel_server: FreeCADGui.Selection.removeObserver(self.sel_server) @@ -66,6 +69,7 @@ class _TaskPanelFemElementGeometry1D: return True def reject(self): + self.setback_listobj_visibility() if self.sel_server: FreeCADGui.Selection.removeObserver(self.sel_server) FreeCADGui.ActiveDocument.resetEdit() @@ -153,6 +157,7 @@ class _TaskPanelFemElementGeometry1D: '''Called if Button add_reference is triggered''' # in constraints EditTaskPanel the selection is active as soon as the taskpanel is open # here the addReference button EditTaskPanel has to be triggered to start selection mode + self.setback_listobj_visibility() FreeCADGui.Selection.clearSelection() # start SelectionObserver and parse the function to add the References to the widget print_message = "Select Edges by single click on them to add them to the list" @@ -182,3 +187,29 @@ class _TaskPanelFemElementGeometry1D: items.append(item_name) for listItemName in sorted(items): self.form.list_References.addItem(listItemName) + + def select_clicked_reference_shape(self): + self.setback_listobj_visibility() + if self.sel_server: + FreeCADGui.Selection.removeObserver(self.sel_server) + self.sel_server = None + if not self.sel_server: + if not self.references: + return + currentItemName = str(self.form.list_References.currentItem().text()) + for ref in self.references: + refname_to_compare_listentry = ref[0].Name + ':' + ref[1] + if refname_to_compare_listentry == currentItemName: + # print( 'found: shape: ' + ref[0].Name + ' element: ' + ref[1]) + if not ref[0].ViewObject.Visibility: + self.obj_notvisible.append(ref[0]) + ref[0].ViewObject.Visibility = True + FreeCADGui.Selection.clearSelection() + FreeCADGui.Selection.addSelection(ref[0], ref[1]) + + def setback_listobj_visibility(self): + '''set back Visibility of the list objects + ''' + for obj in self.obj_notvisible: + obj.ViewObject.Visibility = False + self.obj_notvisible = [] diff --git a/src/Mod/Fem/PyGui/_TaskPanelFemElementGeometry2D.py b/src/Mod/Fem/PyGui/_TaskPanelFemElementGeometry2D.py index 217cc7f161..2cf173cebe 100644 --- a/src/Mod/Fem/PyGui/_TaskPanelFemElementGeometry2D.py +++ b/src/Mod/Fem/PyGui/_TaskPanelFemElementGeometry2D.py @@ -39,10 +39,12 @@ class _TaskPanelFemElementGeometry2D: FreeCADGui.Selection.clearSelection() self.sel_server = None self.obj = obj + self.obj_notvisible = [] self.form = FreeCADGui.PySideUic.loadUi(FreeCAD.getHomePath() + "Mod/Fem/PyGui/TaskPanelFemElementGeometry2D.ui") QtCore.QObject.connect(self.form.if_thickness, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.thickness_changed) QtCore.QObject.connect(self.form.pushButton_Reference, QtCore.SIGNAL("clicked()"), self.add_references) + self.form.list_References.itemSelectionChanged.connect(self.select_clicked_reference_shape) self.form.list_References.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.form.list_References.connect(self.form.list_References, QtCore.SIGNAL("customContextMenuRequested(QPoint)"), self.references_list_right_clicked) @@ -50,6 +52,7 @@ class _TaskPanelFemElementGeometry2D: self.update() def accept(self): + self.setback_listobj_visibility() self.set_shellthickness_props() if self.sel_server: FreeCADGui.Selection.removeObserver(self.sel_server) @@ -58,6 +61,7 @@ class _TaskPanelFemElementGeometry2D: return True def reject(self): + self.setback_listobj_visibility() if self.sel_server: FreeCADGui.Selection.removeObserver(self.sel_server) FreeCADGui.ActiveDocument.resetEdit() @@ -111,6 +115,7 @@ class _TaskPanelFemElementGeometry2D: '''Called if Button add_reference is triggered''' # in constraints EditTaskPanel the selection is active as soon as the taskpanel is open # here the addReference button EditTaskPanel has to be triggered to start selection mode + self.setback_listobj_visibility() FreeCADGui.Selection.clearSelection() # start SelectionObserver and parse the function to add the References to the widget print_message = "Select Faces by single click on them to add them to the list" @@ -140,3 +145,29 @@ class _TaskPanelFemElementGeometry2D: items.append(item_name) for listItemName in sorted(items): self.form.list_References.addItem(listItemName) + + def select_clicked_reference_shape(self): + self.setback_listobj_visibility() + if self.sel_server: + FreeCADGui.Selection.removeObserver(self.sel_server) + self.sel_server = None + if not self.sel_server: + if not self.references: + return + currentItemName = str(self.form.list_References.currentItem().text()) + for ref in self.references: + refname_to_compare_listentry = ref[0].Name + ':' + ref[1] + if refname_to_compare_listentry == currentItemName: + # print( 'found: shape: ' + ref[0].Name + ' element: ' + ref[1]) + if not ref[0].ViewObject.Visibility: + self.obj_notvisible.append(ref[0]) + ref[0].ViewObject.Visibility = True + FreeCADGui.Selection.clearSelection() + FreeCADGui.Selection.addSelection(ref[0], ref[1]) + + def setback_listobj_visibility(self): + '''set back Visibility of the list objects + ''' + for obj in self.obj_notvisible: + obj.ViewObject.Visibility = False + self.obj_notvisible = [] diff --git a/src/Mod/Fem/PyGui/_TaskPanelFemMaterial.py b/src/Mod/Fem/PyGui/_TaskPanelFemMaterial.py index 5451649105..650b2540ee 100644 --- a/src/Mod/Fem/PyGui/_TaskPanelFemMaterial.py +++ b/src/Mod/Fem/PyGui/_TaskPanelFemMaterial.py @@ -43,6 +43,7 @@ class _TaskPanelFemMaterial: self.selection_mode_solid = False self.selection_mode_std_print_message = "Select Faces and Edges by single click on them to add them to the list." self.selection_mode_solid_print_message = "Select Solids by single click on a Face or Edge which belongs to the Solid, to add the Solid to the list." + self.obj_notvisible = [] self.material = self.obj.Material self.references = [] if self.obj.References: @@ -80,6 +81,7 @@ class _TaskPanelFemMaterial: self.form.label_vol_expansion_coefficient.setVisible(0) self.form.input_fd_vol_expansion_coefficient.setVisible(0) + self.form.list_References.itemSelectionChanged.connect(self.select_clicked_reference_shape) self.form.list_References.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.form.list_References.connect(self.form.list_References, QtCore.SIGNAL("customContextMenuRequested(QPoint)"), self.references_list_right_clicked) @@ -106,6 +108,7 @@ class _TaskPanelFemMaterial: self.rebuild_list_References() def accept(self): + self.setback_listobj_visibility() # print(self.material) self.remove_active_sel_server() if self.has_equal_references_shape_types(): @@ -116,6 +119,7 @@ class _TaskPanelFemMaterial: doc.Document.recompute() def reject(self): + self.setback_listobj_visibility() self.remove_active_sel_server() doc = FreeCADGui.getDocument(self.obj.Document) doc.resetEdit() @@ -535,6 +539,7 @@ class _TaskPanelFemMaterial: '''Called if Button add_reference is triggered''' # in constraints EditTaskPanel the selection is active as soon as the taskpanel is open # here the addReference button EditTaskPanel has to be triggered to start selection mode + self.setback_listobj_visibility() FreeCADGui.Selection.clearSelection() # start SelectionObserver and parse the function to add the References to the widget if self.selection_mode_solid: # print message on button click @@ -598,3 +603,29 @@ class _TaskPanelFemMaterial: items.append(item_name) for listItemName in sorted(items): self.form.list_References.addItem(listItemName) + + def select_clicked_reference_shape(self): + self.setback_listobj_visibility() + if self.sel_server: + FreeCADGui.Selection.removeObserver(self.sel_server) + self.sel_server = None + if not self.sel_server: + if not self.references: + return + currentItemName = str(self.form.list_References.currentItem().text()) + for ref in self.references: + refname_to_compare_listentry = ref[0].Name + ':' + ref[1] + if refname_to_compare_listentry == currentItemName: + # print( 'found: shape: ' + ref[0].Name + ' element: ' + ref[1]) + if not ref[0].ViewObject.Visibility: + self.obj_notvisible.append(ref[0]) + ref[0].ViewObject.Visibility = True + FreeCADGui.Selection.clearSelection() + FreeCADGui.Selection.addSelection(ref[0], ref[1]) + + def setback_listobj_visibility(self): + '''set back Visibility of the list objects + ''' + for obj in self.obj_notvisible: + obj.ViewObject.Visibility = False + self.obj_notvisible = [] diff --git a/src/Mod/Fem/PyGui/_TaskPanelFemMeshGroup.py b/src/Mod/Fem/PyGui/_TaskPanelFemMeshGroup.py index 5694c72c69..decbbdf8a6 100644 --- a/src/Mod/Fem/PyGui/_TaskPanelFemMeshGroup.py +++ b/src/Mod/Fem/PyGui/_TaskPanelFemMeshGroup.py @@ -42,6 +42,7 @@ class _TaskPanelFemMeshGroup: self.selection_mode_solid = False self.selection_mode_std_print_message = "Select Faces, Edges and Vertices by single click on them to add them to the list." self.selection_mode_solid_print_message = "Select Solids by single click on a Face or Edge which belongs to the Solid, to add the Solid to the list." + self.obj_notvisible = [] self.form = FreeCADGui.PySideUic.loadUi(FreeCAD.getHomePath() + "Mod/Fem/PyGui/TaskPanelFemMeshGroup.ui") QtCore.QObject.connect(self.form.rb_name, QtCore.SIGNAL("toggled(bool)"), self.choose_exportidentifier_name) @@ -49,6 +50,7 @@ class _TaskPanelFemMeshGroup: QtCore.QObject.connect(self.form.rb_standard, QtCore.SIGNAL("toggled(bool)"), self.choose_selection_mode_standard) QtCore.QObject.connect(self.form.rb_solid, QtCore.SIGNAL("toggled(bool)"), self.choose_selection_mode_solid) QtCore.QObject.connect(self.form.pushButton_Reference, QtCore.SIGNAL("clicked()"), self.add_references) + self.form.list_References.itemSelectionChanged.connect(self.select_clicked_reference_shape) self.form.list_References.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.form.list_References.connect(self.form.list_References, QtCore.SIGNAL("customContextMenuRequested(QPoint)"), self.references_list_right_clicked) @@ -56,6 +58,7 @@ class _TaskPanelFemMeshGroup: self.update() def accept(self): + self.setback_listobj_visibility() self.set_meshgroup_props() if self.sel_server: FreeCADGui.Selection.removeObserver(self.sel_server) @@ -64,6 +67,7 @@ class _TaskPanelFemMeshGroup: return True def reject(self): + self.setback_listobj_visibility() if self.sel_server: FreeCADGui.Selection.removeObserver(self.sel_server) FreeCADGui.ActiveDocument.resetEdit() @@ -131,6 +135,7 @@ class _TaskPanelFemMeshGroup: '''Called if Button add_reference is triggered''' # in constraints EditTaskPanel the selection is active as soon as the taskpanel is open # here the addReference button EditTaskPanel has to be triggered to start selection mode + self.setback_listobj_visibility() FreeCADGui.Selection.clearSelection() # start SelectionObserver and parse the function to add the References to the widget if self.selection_mode_solid: # print message on button click @@ -191,3 +196,29 @@ class _TaskPanelFemMeshGroup: items.append(item_name) for listItemName in sorted(items): self.form.list_References.addItem(listItemName) + + def select_clicked_reference_shape(self): + self.setback_listobj_visibility() + if self.sel_server: + FreeCADGui.Selection.removeObserver(self.sel_server) + self.sel_server = None + if not self.sel_server: + if not self.references: + return + currentItemName = str(self.form.list_References.currentItem().text()) + for ref in self.references: + refname_to_compare_listentry = ref[0].Name + ':' + ref[1] + if refname_to_compare_listentry == currentItemName: + # print( 'found: shape: ' + ref[0].Name + ' element: ' + ref[1]) + if not ref[0].ViewObject.Visibility: + self.obj_notvisible.append(ref[0]) + ref[0].ViewObject.Visibility = True + FreeCADGui.Selection.clearSelection() + FreeCADGui.Selection.addSelection(ref[0], ref[1]) + + def setback_listobj_visibility(self): + '''set back Visibility of the list objects + ''' + for obj in self.obj_notvisible: + obj.ViewObject.Visibility = False + self.obj_notvisible = [] diff --git a/src/Mod/Fem/PyGui/_TaskPanelFemMeshRegion.py b/src/Mod/Fem/PyGui/_TaskPanelFemMeshRegion.py index d74c462c32..4d45cf3e43 100644 --- a/src/Mod/Fem/PyGui/_TaskPanelFemMeshRegion.py +++ b/src/Mod/Fem/PyGui/_TaskPanelFemMeshRegion.py @@ -42,6 +42,7 @@ class _TaskPanelFemMeshRegion: self.selection_mode_solid = False self.selection_mode_std_print_message = "Select Faces, Edges and Vertices by single click on them to add them to the list." self.selection_mode_solid_print_message = "Select Solids by single click on a Face or Edge which belongs to the Solid, to add the Solid to the list." + self.obj_notvisible = [] self.form = FreeCADGui.PySideUic.loadUi(FreeCAD.getHomePath() + "Mod/Fem/PyGui/TaskPanelFemMeshRegion.ui") QtCore.QObject.connect(self.form.if_elelen, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.elelen_changed) @@ -56,6 +57,7 @@ class _TaskPanelFemMeshRegion: self.update() def accept(self): + self.setback_listobj_visibility() self.set_meshregion_props() if self.sel_server: FreeCADGui.Selection.removeObserver(self.sel_server) @@ -64,6 +66,7 @@ class _TaskPanelFemMeshRegion: return True def reject(self): + self.setback_listobj_visibility() if self.sel_server: FreeCADGui.Selection.removeObserver(self.sel_server) FreeCADGui.ActiveDocument.resetEdit() @@ -127,6 +130,7 @@ class _TaskPanelFemMeshRegion: '''Called if Button add_reference is triggered''' # in constraints EditTaskPanel the selection is active as soon as the taskpanel is open # here the addReference button EditTaskPanel has to be triggered to start selection mode + self.setback_listobj_visibility() FreeCADGui.Selection.clearSelection() # start SelectionObserver and parse the function to add the References to the widget if self.selection_mode_solid: # print message on button click @@ -189,6 +193,7 @@ class _TaskPanelFemMeshRegion: self.form.list_References.addItem(listItemName) def select_clicked_reference_shape(self): + self.setback_listobj_visibility() if self.sel_server: FreeCADGui.Selection.removeObserver(self.sel_server) self.sel_server = None @@ -200,5 +205,15 @@ class _TaskPanelFemMeshRegion: refname_to_compare_listentry = ref[0].Name + ':' + ref[1] if refname_to_compare_listentry == currentItemName: # print( 'found: shape: ' + ref[0].Name + ' element: ' + ref[1]) + if not ref[0].ViewObject.Visibility: + self.obj_notvisible.append(ref[0]) + ref[0].ViewObject.Visibility = True FreeCADGui.Selection.clearSelection() FreeCADGui.Selection.addSelection(ref[0], ref[1]) + + def setback_listobj_visibility(self): + '''set back Visibility of the list objects + ''' + for obj in self.obj_notvisible: + obj.ViewObject.Visibility = False + self.obj_notvisible = []