FEM: code formating, max line length < 100, fem gui objects

This commit is contained in:
Bernd Hahnebach
2019-05-20 12:31:22 +02:00
parent 8ef3f13fbb
commit 5ca75ca7ea
14 changed files with 821 additions and 216 deletions

View File

@@ -233,14 +233,21 @@ class GeometryElementsSelection(QtGui.QWidget):
def initElemTypes(self, eltypes):
self.sel_elem_types = eltypes
# FreeCAD.Console.PrintMessage('Selection of: {} is allowed.\n'.format(self.sel_elem_types))
# FreeCAD.Console.PrintMessage(
# 'Selection of: {} is allowed.\n'.format(self.sel_elem_types)
# )
self.sel_elem_text = ''
for e in self.sel_elem_types:
self.sel_elem_text += (e + ', ')
self.sel_elem_text = self.sel_elem_text.rstrip(', ')
# FreeCAD.Console.PrintMessage('Selection of: ' + self.sel_elem_text + ' is allowed.\n')
self.selection_mode_std_print_message = "Single click on a " + self.sel_elem_text + " will add it to the list"
self.selection_mode_solid_print_message = "Single click on a Face or Edge which belongs to one Solid will add the Solid to the list"
self.selection_mode_std_print_message = (
"Single click on a " + self.sel_elem_text + " will add it to the list"
)
self.selection_mode_solid_print_message = (
"Single click on a Face or Edge which belongs "
"to one Solid will add the Solid to the list"
)
def initUI(self):
# auch ArchPanel ist coded ohne ui-file
@@ -280,10 +287,26 @@ class GeometryElementsSelection(QtGui.QWidget):
# signals and slots
self.list_References.itemSelectionChanged.connect(self.select_clicked_reference_shape)
self.list_References.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.list_References.connect(self.list_References, QtCore.SIGNAL("customContextMenuRequested(QPoint)"), self.references_list_right_clicked)
QtCore.QObject.connect(self.pushButton_Add, QtCore.SIGNAL("clicked()"), self.add_references)
QtCore.QObject.connect(self.rb_standard, QtCore.SIGNAL("toggled(bool)"), self.choose_selection_mode_standard)
QtCore.QObject.connect(self.rb_solid, QtCore.SIGNAL("toggled(bool)"), self.choose_selection_mode_solid)
self.list_References.connect(
self.list_References,
QtCore.SIGNAL("customContextMenuRequested(QPoint)"),
self.references_list_right_clicked
)
QtCore.QObject.connect(
self.pushButton_Add,
QtCore.SIGNAL("clicked()"),
self.add_references
)
QtCore.QObject.connect(
self.rb_standard,
QtCore.SIGNAL("toggled(bool)"),
self.choose_selection_mode_standard
)
QtCore.QObject.connect(
self.rb_solid,
QtCore.SIGNAL("toggled(bool)"),
self.choose_selection_mode_solid
)
def get_references(self):
for ref in self.tuplereferences:
@@ -324,10 +347,15 @@ class GeometryElementsSelection(QtGui.QWidget):
self.obj_notvisible.append(ref[0])
ref[0].ViewObject.Visibility = True
FreeCADGui.Selection.clearSelection()
if ref[1].startswith('Solid') and (ref[0].Shape.ShapeType == 'Compound' or ref[0].Shape.ShapeType == 'CompSolid'):
# selection of Solids of Compounds or CompSolids is not possible, because a Solid is no Subelement
# since only Subelements can be selected, we're going to select all Faces of said Solids
solid = FemMeshTools.get_element(ref[0], ref[1]) # the method getElement(element) doesn't return Solid elements
ref_sh_type = ref[0].Shape.ShapeType
if ref[1].startswith('Solid') \
and (ref_sh_type == 'Compound' or ref_sh_type == 'CompSolid'):
# selection of Solids of Compounds or CompSolids is not possible
# because a Solid is no Subelement
# since only Subelements can be selected
# we're going to select all Faces of said Solids
# the method getElement(element)doesn't return Solid elements
solid = FemMeshTools.get_element(ref[0], ref[1])
if not solid:
return
faces = []
@@ -359,8 +387,16 @@ class GeometryElementsSelection(QtGui.QWidget):
if not self.references:
menu_item_remove_selected.setDisabled(True)
menu_item_remove_all.setDisabled(True)
self.connect(menu_item_remove_selected, QtCore.SIGNAL("triggered()"), self.remove_selected_reference)
self.connect(menu_item_remove_all, QtCore.SIGNAL("triggered()"), self.remove_all_references)
self.connect(
menu_item_remove_selected,
QtCore.SIGNAL("triggered()"),
self.remove_selected_reference
)
self.connect(
menu_item_remove_all,
QtCore.SIGNAL("triggered()"),
self.remove_all_references
)
parentPosition = self.list_References.mapToGlobal(QtCore.QPoint(0, 0))
self.contextMenu.move(parentPosition + QPos)
self.contextMenu.show()
@@ -401,12 +437,17 @@ class GeometryElementsSelection(QtGui.QWidget):
else:
print_message = self.selection_mode_std_print_message
if not self.sel_server:
# if we do not check, we would start a new SelectionObserver on every click on addReference button
# if we do not check, we would start a new SelectionObserver
# on every click on addReference button
# but close only one SelectionObserver on leaving the task panel
self.sel_server = FemSelectionObserver(self.selectionParser, print_message)
def selectionParser(self, selection):
print('selection: ', selection[0].Shape.ShapeType, ' ', selection[0].Name, ' ', selection[1])
print('selection: {} {} {}'.format(
selection[0].Shape.ShapeType,
selection[0].Name,
selection[1]
))
if hasattr(selection[0], "Shape") and selection[1]:
elt = selection[0].Shape.getElement(selection[1])
ele_ShapeType = elt.ShapeType
@@ -422,7 +463,9 @@ class GeometryElementsSelection(QtGui.QWidget):
if not found_edge:
solid_to_add = str(i + 1)
else:
FreeCAD.Console.PrintMessage('Edge belongs to more than one solid\n')
FreeCAD.Console.PrintMessage(
'Edge belongs to more than one solid\n'
)
solid_to_add = None
found_edge = True
elif ele_ShapeType == 'Face':
@@ -433,45 +476,68 @@ class GeometryElementsSelection(QtGui.QWidget):
if not found_face:
solid_to_add = str(i + 1)
else:
FreeCAD.Console.PrintMessage('Face belongs to more than one solid\n')
FreeCAD.Console.PrintMessage(
'Face belongs to more than one solid\n'
)
solid_to_add = None
found_face = True
if solid_to_add:
selection = (selection[0], 'Solid' + solid_to_add)
ele_ShapeType = 'Solid'
FreeCAD.Console.PrintMessage('selection variable adapted to hold the Solid: ' + selection[0].Shape.ShapeType + ' ' + selection[0].Name + ' ' + selection[1] + ' \n')
FreeCAD.Console.PrintMessage(
'selection variable adapted to hold the Solid: {} {} {}\n'
.format(selection[0].Shape.ShapeType, selection[0].Name, selection[1])
)
else:
return
if ele_ShapeType in self.sel_elem_types:
if (self.selection_mode_solid and ele_ShapeType == 'Solid') or self.selection_mode_solid is False:
if (self.selection_mode_solid and ele_ShapeType == 'Solid') \
or self.selection_mode_solid is False:
if selection not in self.references:
if self.allow_multiple_geom_types is False: # only equal shape types are allowed to add
# only equal shape types are allowed to add
if self.allow_multiple_geom_types is False:
if self.has_equal_references_shape_types(ele_ShapeType):
self.references.append(selection)
self.rebuild_list_References(self.get_allitems_text().index(self.get_item_text(selection)))
self.rebuild_list_References(
self.get_allitems_text().index(self.get_item_text(selection))
)
else:
FreeCADGui.Selection.clearSelection() # selected shape will not added to the list
# selected shape will not added to the list
FreeCADGui.Selection.clearSelection()
else: # multiple shape types are allowed to add
self.references.append(selection)
self.rebuild_list_References(self.get_allitems_text().index(self.get_item_text(selection)))
self.rebuild_list_References(
self.get_allitems_text().index(self.get_item_text(selection))
)
else:
FreeCADGui.Selection.clearSelection() # selected shape will not added to the list
message = self.get_item_text(selection) + ' is in reference list already!\n'
# selected shape will not added to the list
FreeCADGui.Selection.clearSelection()
message = (
'{} is in reference list already!\n'
.format(self.get_item_text(selection))
)
FreeCAD.Console.PrintMessage(message)
QtGui.QMessageBox.critical(None, "Geometry already in list", message)
else:
FreeCADGui.Selection.clearSelection() # selected shape will not added to the list
# selected shape will not added to the list
FreeCADGui.Selection.clearSelection()
message = ele_ShapeType + ' is not allowed to add to the list!\n'
FreeCAD.Console.PrintMessage(message)
QtGui.QMessageBox.critical(None, "Wrong shape type", message)
def has_equal_references_shape_types(self, ref_shty=''):
for ref in self.references:
r = FemMeshTools.get_element(ref[0], ref[1]) # the method getElement(element) does not return Solid elements
# the method getElement(element) does not return Solid elements
r = FemMeshTools.get_element(ref[0], ref[1])
if not r:
FreeCAD.Console.PrintError('Problem in retrieving element: {} \n'.format(ref[1]))
FreeCAD.Console.PrintError(
'Problem in retrieving element: {} \n'.format(ref[1])
)
continue
# print(' ReferenceShape : ', r.ShapeType, ', ', ref[0].Name, ', ', ref[0].Label, ' --> ', ref[1])
FreeCAD.Console.PrintLog(
' ReferenceShape : {}, {}, {} --> {}'
.format(r.ShapeType, ref[0].Name, ref[0].Label, ref[1])
)
if not ref_shty:
ref_shty = r.ShapeType
if r.ShapeType != ref_shty:

View File

@@ -60,12 +60,14 @@ class ViewProxy(object):
def setEdit(self, vobj, mode=0):
# needs to be overwritten if task panel exists
# avoid edit mode by return False, https://forum.freecadweb.org/viewtopic.php?t=12139&start=10#p161062
# avoid edit mode by return False
# https://forum.freecadweb.org/viewtopic.php?t=12139&start=10#p161062
return False
def doubleClicked(self, vobj):
guidoc = FreeCADGui.getDocument(vobj.Object.Document)
# check if another VP is in edit mode, https://forum.freecadweb.org/viewtopic.php?t=13077#p104702
# check if another VP is in edit mode
# https://forum.freecadweb.org/viewtopic.php?t=13077#p104702
if not guidoc.getInEdit():
guidoc.setEdit(vobj.Object.Name)
else:

View File

@@ -53,12 +53,14 @@ class _ViewProviderFemConstraintSelfWeight:
return
def setEdit(self, vobj, mode=0):
# avoid edit mode by return False, https://forum.freecadweb.org/viewtopic.php?t=12139&start=10#p161062
# avoid edit mode by return False
# https://forum.freecadweb.org/viewtopic.php?t=12139&start=10#p161062
return False
def doubleClicked(self, vobj):
guidoc = FreeCADGui.getDocument(vobj.Object.Document)
# check if another VP is in edit mode, https://forum.freecadweb.org/viewtopic.php?t=13077#p104702
# check if another VP is in edit mode
# https://forum.freecadweb.org/viewtopic.php?t=13077#p104702
if not guidoc.getInEdit():
guidoc.setEdit(vobj.Object.Name)
else:

View File

@@ -87,7 +87,8 @@ class _ViewProviderFemElementFluid1D:
def doubleClicked(self, vobj):
guidoc = FreeCADGui.getDocument(vobj.Object.Document)
# check if another VP is in edit mode, https://forum.freecadweb.org/viewtopic.php?t=13077#p104702
# check if another VP is in edit mode
# https://forum.freecadweb.org/viewtopic.php?t=13077#p104702
if not guidoc.getInEdit():
guidoc.setEdit(vobj.Object.Name)
else:
@@ -112,48 +113,188 @@ class _TaskPanelFemElementFluid1D:
self.obj = obj
# parameter widget
self.parameterWidget = FreeCADGui.PySideUic.loadUi(FreeCAD.getHomePath() + "Mod/Fem/Resources/ui/ElementFluid1D.ui")
QtCore.QObject.connect(self.parameterWidget.cb_section_type, QtCore.SIGNAL("activated(int)"), self.sectiontype_changed)
QtCore.QObject.connect(self.parameterWidget.cb_liquid_section_type, QtCore.SIGNAL("activated(int)"), self.liquidsectiontype_changed)
QtCore.QObject.connect(self.parameterWidget.if_manning_area, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.manning_area_changed)
QtCore.QObject.connect(self.parameterWidget.if_manning_radius, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.manning_radius_changed)
QtCore.QObject.connect(self.parameterWidget.sb_manning_coefficient, QtCore.SIGNAL("valueChanged(double)"), self.manning_coefficient_changed)
QtCore.QObject.connect(self.parameterWidget.if_enlarge_area1, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.enlarge_area1_changed)
QtCore.QObject.connect(self.parameterWidget.if_enlarge_area2, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.enlarge_area2_changed)
QtCore.QObject.connect(self.parameterWidget.if_contract_area1, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.contract_area1_changed)
QtCore.QObject.connect(self.parameterWidget.if_contract_area2, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.contract_area2_changed)
QtCore.QObject.connect(self.parameterWidget.if_inletpressure, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.inlet_pressure_changed)
QtCore.QObject.connect(self.parameterWidget.if_outletpressure, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.outlet_pressure_changed)
QtCore.QObject.connect(self.parameterWidget.if_inletflowrate, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.inlet_flowrate_changed)
QtCore.QObject.connect(self.parameterWidget.if_outletflowrate, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.outlet_flowrate_changed)
QtCore.QObject.connect(self.parameterWidget.gb_inletpressure, QtCore.SIGNAL("clicked(bool)"), self.inlet_pressure_active)
QtCore.QObject.connect(self.parameterWidget.gb_outletpressure, QtCore.SIGNAL("clicked(bool)"), self.outlet_pressure_active)
QtCore.QObject.connect(self.parameterWidget.gb_inletflowrate, QtCore.SIGNAL("clicked(bool)"), self.inlet_flowrate_active)
QtCore.QObject.connect(self.parameterWidget.gb_outletflowrate, QtCore.SIGNAL("clicked(bool)"), self.outlet_flowrate_active)
QtCore.QObject.connect(self.parameterWidget.if_entrance_pipe_area, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.entrance_pipe_area_changed)
QtCore.QObject.connect(self.parameterWidget.if_entrance_area, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.entrance_area_changed)
QtCore.QObject.connect(self.parameterWidget.if_diaphragm_pipe_area, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.diaphragm_pipe_area_changed)
QtCore.QObject.connect(self.parameterWidget.if_diaphragm_area, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.diaphragm_area_changed)
QtCore.QObject.connect(self.parameterWidget.if_bend_pipe_area, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.bend_pipe_area_changed)
QtCore.QObject.connect(self.parameterWidget.sb_bradius_pdiameter, QtCore.SIGNAL("valueChanged(double)"), self.bradius_pdiameter_changed)
QtCore.QObject.connect(self.parameterWidget.sb_bend_angle, QtCore.SIGNAL("valueChanged(double)"), self.bend_angle_changed)
QtCore.QObject.connect(self.parameterWidget.sb_bend_loss_coefficient, QtCore.SIGNAL("valueChanged(double)"), self.bend_loss_coefficient_changed)
QtCore.QObject.connect(self.parameterWidget.if_gatevalve_pipe_area, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.gatevalve_pipe_area_changed)
QtCore.QObject.connect(self.parameterWidget.sb_gatevalve_closing_coeff, QtCore.SIGNAL("valueChanged(double)"), self.gatevalve_closing_coeff_changed)
QtCore.QObject.connect(self.parameterWidget.if_colebrooke_pipe_area, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.colebrooke_pipe_area_changed)
QtCore.QObject.connect(self.parameterWidget.if_colebrooke_radius, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.colebrooke_radius_changed)
QtCore.QObject.connect(self.parameterWidget.if_colebrooke_grain_diameter, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.colebrooke_grain_diameter_changed)
QtCore.QObject.connect(self.parameterWidget.sb_colebrooke_form_factor, QtCore.SIGNAL("valueChanged(double)"), self.colebrooke_form_factor_changed)
QtCore.QObject.connect(self.parameterWidget.tw_pump_characteristics, QtCore.SIGNAL("cellChanged(int, int)"), self.pump_characteristics_changed)
self.parameterWidget.cb_section_type.addItems(_FemElementFluid1D._FemElementFluid1D.known_fluid_types)
self.parameterWidget.cb_liquid_section_type.addItems(_FemElementFluid1D._FemElementFluid1D.known_liquid_types)
self.parameterWidget.cb_gas_section_type.addItems(_FemElementFluid1D._FemElementFluid1D.known_gas_types)
self.parameterWidget.cb_channel_section_type.addItems(_FemElementFluid1D._FemElementFluid1D.known_channel_types)
self.parameterWidget = FreeCADGui.PySideUic.loadUi(
FreeCAD.getHomePath() + "Mod/Fem/Resources/ui/ElementFluid1D.ui"
)
QtCore.QObject.connect(
self.parameterWidget.cb_section_type,
QtCore.SIGNAL("activated(int)"),
self.sectiontype_changed
)
QtCore.QObject.connect(
self.parameterWidget.cb_liquid_section_type,
QtCore.SIGNAL("activated(int)"),
self.liquidsectiontype_changed
)
QtCore.QObject.connect(
self.parameterWidget.if_manning_area,
QtCore.SIGNAL("valueChanged(Base::Quantity)"),
self.manning_area_changed
)
QtCore.QObject.connect(
self.parameterWidget.if_manning_radius,
QtCore.SIGNAL("valueChanged(Base::Quantity)"),
self.manning_radius_changed
)
QtCore.QObject.connect(
self.parameterWidget.sb_manning_coefficient,
QtCore.SIGNAL("valueChanged(double)"),
self.manning_coefficient_changed
)
QtCore.QObject.connect(
self.parameterWidget.if_enlarge_area1,
QtCore.SIGNAL("valueChanged(Base::Quantity)"),
self.enlarge_area1_changed
)
QtCore.QObject.connect(
self.parameterWidget.if_enlarge_area2,
QtCore.SIGNAL("valueChanged(Base::Quantity)"),
self.enlarge_area2_changed
)
QtCore.QObject.connect(
self.parameterWidget.if_contract_area1,
QtCore.SIGNAL("valueChanged(Base::Quantity)"),
self.contract_area1_changed
)
QtCore.QObject.connect(
self.parameterWidget.if_contract_area2,
QtCore.SIGNAL("valueChanged(Base::Quantity)"),
self.contract_area2_changed
)
QtCore.QObject.connect(
self.parameterWidget.if_inletpressure,
QtCore.SIGNAL("valueChanged(Base::Quantity)"),
self.inlet_pressure_changed
)
QtCore.QObject.connect(
self.parameterWidget.if_outletpressure,
QtCore.SIGNAL("valueChanged(Base::Quantity)"),
self.outlet_pressure_changed
)
QtCore.QObject.connect(
self.parameterWidget.if_inletflowrate,
QtCore.SIGNAL("valueChanged(Base::Quantity)"),
self.inlet_flowrate_changed
)
QtCore.QObject.connect(
self.parameterWidget.if_outletflowrate,
QtCore.SIGNAL("valueChanged(Base::Quantity)"),
self.outlet_flowrate_changed
)
QtCore.QObject.connect(
self.parameterWidget.gb_inletpressure,
QtCore.SIGNAL("clicked(bool)"),
self.inlet_pressure_active
)
QtCore.QObject.connect(
self.parameterWidget.gb_outletpressure,
QtCore.SIGNAL("clicked(bool)"),
self.outlet_pressure_active
)
QtCore.QObject.connect(
self.parameterWidget.gb_inletflowrate,
QtCore.SIGNAL("clicked(bool)"),
self.inlet_flowrate_active
)
QtCore.QObject.connect(
self.parameterWidget.gb_outletflowrate,
QtCore.SIGNAL("clicked(bool)"),
self.outlet_flowrate_active
)
QtCore.QObject.connect(
self.parameterWidget.if_entrance_pipe_area,
QtCore.SIGNAL("valueChanged(Base::Quantity)"),
self.entrance_pipe_area_changed
)
QtCore.QObject.connect(
self.parameterWidget.if_entrance_area,
QtCore.SIGNAL("valueChanged(Base::Quantity)"),
self.entrance_area_changed
)
QtCore.QObject.connect(
self.parameterWidget.if_diaphragm_pipe_area,
QtCore.SIGNAL("valueChanged(Base::Quantity)"),
self.diaphragm_pipe_area_changed
)
QtCore.QObject.connect(
self.parameterWidget.if_diaphragm_area,
QtCore.SIGNAL("valueChanged(Base::Quantity)"),
self.diaphragm_area_changed
)
QtCore.QObject.connect(
self.parameterWidget.if_bend_pipe_area,
QtCore.SIGNAL("valueChanged(Base::Quantity)"),
self.bend_pipe_area_changed
)
QtCore.QObject.connect(
self.parameterWidget.sb_bradius_pdiameter,
QtCore.SIGNAL("valueChanged(double)"),
self.bradius_pdiameter_changed
)
QtCore.QObject.connect(
self.parameterWidget.sb_bend_angle,
QtCore.SIGNAL("valueChanged(double)"),
self.bend_angle_changed
)
QtCore.QObject.connect(
self.parameterWidget.sb_bend_loss_coefficient,
QtCore.SIGNAL("valueChanged(double)"),
self.bend_loss_coefficient_changed
)
QtCore.QObject.connect(
self.parameterWidget.if_gatevalve_pipe_area,
QtCore.SIGNAL("valueChanged(Base::Quantity)"),
self.gatevalve_pipe_area_changed
)
QtCore.QObject.connect(
self.parameterWidget.sb_gatevalve_closing_coeff,
QtCore.SIGNAL("valueChanged(double)"),
self.gatevalve_closing_coeff_changed
)
QtCore.QObject.connect(
self.parameterWidget.if_colebrooke_pipe_area,
QtCore.SIGNAL("valueChanged(Base::Quantity)"),
self.colebrooke_pipe_area_changed
)
QtCore.QObject.connect(
self.parameterWidget.if_colebrooke_radius,
QtCore.SIGNAL("valueChanged(Base::Quantity)"),
self.colebrooke_radius_changed
)
QtCore.QObject.connect(
self.parameterWidget.if_colebrooke_grain_diameter,
QtCore.SIGNAL("valueChanged(Base::Quantity)"),
self.colebrooke_grain_diameter_changed
)
QtCore.QObject.connect(
self.parameterWidget.sb_colebrooke_form_factor,
QtCore.SIGNAL("valueChanged(double)"),
self.colebrooke_form_factor_changed
)
QtCore.QObject.connect(
self.parameterWidget.tw_pump_characteristics,
QtCore.SIGNAL("cellChanged(int, int)"),
self.pump_characteristics_changed
)
self.parameterWidget.cb_section_type.addItems(
_FemElementFluid1D._FemElementFluid1D.known_fluid_types
)
self.parameterWidget.cb_liquid_section_type.addItems(
_FemElementFluid1D._FemElementFluid1D.known_liquid_types
)
self.parameterWidget.cb_gas_section_type.addItems(
_FemElementFluid1D._FemElementFluid1D.known_gas_types
)
self.parameterWidget.cb_channel_section_type.addItems(
_FemElementFluid1D._FemElementFluid1D.known_channel_types
)
self.get_fluidsection_props()
self.updateParameterWidget()
# geometry selection widget
self.selectionWidget = FemSelectionWidgets.GeometryElementsSelection(obj.References, ['Edge'])
self.selectionWidget = FemSelectionWidgets.GeometryElementsSelection(
obj.References, ['Edge']
)
# form made from param and selection widget
self.form = [self.parameterWidget, self.selectionWidget]
@@ -251,7 +392,9 @@ class _TaskPanelFemElementFluid1D:
index_sectiontype = self.parameterWidget.cb_section_type.findText(self.SectionType)
self.parameterWidget.cb_section_type.setCurrentIndex(index_sectiontype)
self.parameterWidget.sw_section_type.setCurrentIndex(index_sectiontype)
index_liquidsectiontype = self.parameterWidget.cb_liquid_section_type.findText(self.LiquidSectionType)
index_liquidsectiontype = self.parameterWidget.cb_liquid_section_type.findText(
self.LiquidSectionType
)
self.parameterWidget.cb_liquid_section_type.setCurrentIndex(index_liquidsectiontype)
self.parameterWidget.sw_liquid_section_type.setCurrentIndex(index_liquidsectiontype)
self.parameterWidget.if_manning_area.setText(self.ManningArea.UserString)
@@ -261,8 +404,12 @@ class _TaskPanelFemElementFluid1D:
self.parameterWidget.if_enlarge_area2.setText(self.EnlargeArea2.UserString)
self.parameterWidget.if_contract_area1.setText(self.ContractArea1.UserString)
self.parameterWidget.if_contract_area2.setText(self.ContractArea2.UserString)
self.parameterWidget.if_inletpressure.setText(FreeCAD.Units.Quantity(1000 * self.InletPressure, FreeCAD.Units.Pressure).UserString)
self.parameterWidget.if_outletpressure.setText(FreeCAD.Units.Quantity(1000 * self.OutletPressure, FreeCAD.Units.Pressure).UserString)
self.parameterWidget.if_inletpressure.setText(FreeCAD.Units.Quantity(
1000 * self.InletPressure, FreeCAD.Units.Pressure).UserString
)
self.parameterWidget.if_outletpressure.setText(FreeCAD.Units.Quantity(
1000 * self.OutletPressure, FreeCAD.Units.Pressure).UserString
)
self.parameterWidget.if_inletflowrate.setText(str(self.InletFlowRate))
self.parameterWidget.if_outletflowrate.setText(str(self.OutletFlowRate))
self.parameterWidget.gb_inletpressure.setChecked(self.InletPressureActive)
@@ -281,25 +428,35 @@ class _TaskPanelFemElementFluid1D:
self.parameterWidget.sb_gatevalve_closing_coeff.setValue(self.GateValveClosingCoeff)
self.parameterWidget.if_colebrooke_pipe_area.setText(self.ColebrookeArea.UserString)
self.parameterWidget.if_colebrooke_radius.setText(self.ColebrookeRadius.UserString)
self.parameterWidget.if_colebrooke_grain_diameter.setText(self.ColebrookeGrainDiameter.UserString)
self.parameterWidget.if_colebrooke_grain_diameter.setText(
self.ColebrookeGrainDiameter.UserString
)
self.parameterWidget.sb_colebrooke_form_factor.setValue(self.ColebrookeFormFactor)
for i in range(len(self.PumpFlowRate)):
self.parameterWidget.tw_pump_characteristics.setItem(i, 0, QtGui.QTableWidgetItem(str(self.PumpFlowRate[i])))
self.parameterWidget.tw_pump_characteristics.setItem(i, 1, QtGui.QTableWidgetItem(str(self.PumpHeadLoss[i])))
self.parameterWidget.tw_pump_characteristics.setItem(
i, 0, QtGui.QTableWidgetItem(str(self.PumpFlowRate[i]))
)
self.parameterWidget.tw_pump_characteristics.setItem(
i, 1, QtGui.QTableWidgetItem(str(self.PumpHeadLoss[i]))
)
def sectiontype_changed(self, index):
if index < 0:
return
self.parameterWidget.cb_section_type.setCurrentIndex(index)
self.parameterWidget.sw_section_type.setCurrentIndex(index)
self.SectionType = str(self.parameterWidget.cb_section_type.itemText(index)) # parameterWidget returns unicode
# parameterWidget returns unicode
self.SectionType = str(self.parameterWidget.cb_section_type.itemText(index))
def liquidsectiontype_changed(self, index):
if index < 0:
return
self.parameterWidget.cb_liquid_section_type.setCurrentIndex(index)
self.parameterWidget.sw_liquid_section_type.setCurrentIndex(index)
self.LiquidSectionType = str(self.parameterWidget.cb_liquid_section_type.itemText(index)) # parameterWidget returns unicode
# parameterWidget returns unicode
self.LiquidSectionType = str(
self.parameterWidget.cb_liquid_section_type.itemText(index)
)
def manning_area_changed(self, base_quantity_value):
self.ManningArea = base_quantity_value
@@ -323,16 +480,24 @@ class _TaskPanelFemElementFluid1D:
self.ContractArea2 = base_quantity_value
def inlet_pressure_changed(self, base_quantity_value):
self.InletPressure = float(FreeCAD.Units.Quantity(base_quantity_value).getValueAs("MPa"))
self.InletPressure = float(
FreeCAD.Units.Quantity(base_quantity_value).getValueAs("MPa")
)
def outlet_pressure_changed(self, base_quantity_value):
self.OutletPressure = float(FreeCAD.Units.Quantity(base_quantity_value).getValueAs("MPa"))
self.OutletPressure = float(
FreeCAD.Units.Quantity(base_quantity_value).getValueAs("MPa")
)
def inlet_flowrate_changed(self, base_quantity_value):
self.InletFlowRate = float(FreeCAD.Units.Quantity(base_quantity_value).getValueAs("kg/s"))
self.InletFlowRate = float(
FreeCAD.Units.Quantity(base_quantity_value).getValueAs("kg/s")
)
def outlet_flowrate_changed(self, base_quantity_value):
self.OutletFlowRate = float(FreeCAD.Units.Quantity(base_quantity_value).getValueAs("kg/s"))
self.OutletFlowRate = float(
FreeCAD.Units.Quantity(base_quantity_value).getValueAs("kg/s")
)
def inlet_pressure_active(self, active):
self.InletPressureActive = active
@@ -390,6 +555,10 @@ class _TaskPanelFemElementFluid1D:
def pump_characteristics_changed(self, row, column):
if column == 0:
self.PumpFlowRate[row] = float(self.parameterWidget.tw_pump_characteristics.item(row, column).text())
self.PumpFlowRate[row] = float(
self.parameterWidget.tw_pump_characteristics.item(row, column).text()
)
else:
self.PumpHeadLoss[row] = float(self.parameterWidget.tw_pump_characteristics.item(row, column).text())
self.PumpHeadLoss[row] = float(
self.parameterWidget.tw_pump_characteristics.item(row, column).text()
)

View File

@@ -84,7 +84,8 @@ class _ViewProviderFemElementGeometry1D:
def doubleClicked(self, vobj):
guidoc = FreeCADGui.getDocument(vobj.Object.Document)
# check if another VP is in edit mode, https://forum.freecadweb.org/viewtopic.php?t=13077#p104702
# check if another VP is in edit mode
# https://forum.freecadweb.org/viewtopic.php?t=13077#p104702
if not guidoc.getInEdit():
guidoc.setEdit(vobj.Object.Name)
else:
@@ -109,19 +110,52 @@ class _TaskPanelFemElementGeometry1D:
self.obj = obj
# parameter widget
self.parameterWidget = FreeCADGui.PySideUic.loadUi(FreeCAD.getHomePath() + "Mod/Fem/Resources/ui/ElementGeometry1D.ui")
QtCore.QObject.connect(self.parameterWidget.cb_crosssectiontype, QtCore.SIGNAL("activated(int)"), self.sectiontype_changed)
QtCore.QObject.connect(self.parameterWidget.if_rec_height, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.rec_height_changed)
QtCore.QObject.connect(self.parameterWidget.if_rec_width, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.rec_width_changed)
QtCore.QObject.connect(self.parameterWidget.if_circ_diameter, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.circ_diameter_changed)
QtCore.QObject.connect(self.parameterWidget.if_pipe_diameter, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.pipe_diameter_changed)
QtCore.QObject.connect(self.parameterWidget.if_pipe_thickness, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.pipe_thickness_changed)
self.parameterWidget.cb_crosssectiontype.addItems(_FemElementGeometry1D._FemElementGeometry1D.known_beam_types) # it is inside the class thus double _FemElementGeometry1D
self.parameterWidget = FreeCADGui.PySideUic.loadUi(
FreeCAD.getHomePath() + "Mod/Fem/Resources/ui/ElementGeometry1D.ui"
)
QtCore.QObject.connect(
self.parameterWidget.cb_crosssectiontype,
QtCore.SIGNAL("activated(int)"),
self.sectiontype_changed
)
QtCore.QObject.connect(
self.parameterWidget.if_rec_height,
QtCore.SIGNAL("valueChanged(Base::Quantity)"),
self.rec_height_changed
)
QtCore.QObject.connect(
self.parameterWidget.if_rec_width,
QtCore.SIGNAL("valueChanged(Base::Quantity)"),
self.rec_width_changed
)
QtCore.QObject.connect(
self.parameterWidget.if_circ_diameter,
QtCore.SIGNAL("valueChanged(Base::Quantity)"),
self.circ_diameter_changed
)
QtCore.QObject.connect(
self.parameterWidget.if_pipe_diameter,
QtCore.SIGNAL("valueChanged(Base::Quantity)"),
self.pipe_diameter_changed
)
QtCore.QObject.connect(
self.parameterWidget.if_pipe_thickness,
QtCore.SIGNAL("valueChanged(Base::Quantity)"),
self.pipe_thickness_changed
)
# it is inside the class thus double _FemElementGeometry1D
self.parameterWidget.cb_crosssectiontype.addItems(
_FemElementGeometry1D._FemElementGeometry1D.known_beam_types
)
self.get_beamsection_props()
self.updateParameterWidget()
# geometry selection widget
self.selectionWidget = FemSelectionWidgets.GeometryElementsSelection(obj.References, ['Edge'])
self.selectionWidget = FemSelectionWidgets.GeometryElementsSelection(
obj.References,
['Edge']
)
# form made from param and selection widget
self.form = [self.parameterWidget, self.selectionWidget]
@@ -162,7 +196,9 @@ class _TaskPanelFemElementGeometry1D:
def updateParameterWidget(self):
'fills the widgets'
index_crosssectiontype = self.parameterWidget.cb_crosssectiontype.findText(self.SectionType)
index_crosssectiontype = self.parameterWidget.cb_crosssectiontype.findText(
self.SectionType
)
self.parameterWidget.cb_crosssectiontype.setCurrentIndex(index_crosssectiontype)
self.parameterWidget.if_rec_height.setText(self.RectHeight.UserString)
self.parameterWidget.if_rec_width.setText(self.RectWidth.UserString)
@@ -174,7 +210,8 @@ class _TaskPanelFemElementGeometry1D:
if index < 0:
return
self.parameterWidget.cb_crosssectiontype.setCurrentIndex(index)
self.SectionType = str(self.parameterWidget.cb_crosssectiontype.itemText(index)) # parameterWidget returns unicode
# parameterWidget returns unicode
self.SectionType = str(self.parameterWidget.cb_crosssectiontype.itemText(index))
def rec_height_changed(self, base_quantity_value):
self.RectHeight = base_quantity_value

View File

@@ -83,7 +83,8 @@ class _ViewProviderFemElementGeometry2D:
def doubleClicked(self, vobj):
guidoc = FreeCADGui.getDocument(vobj.Object.Document)
# check if another VP is in edit mode, https://forum.freecadweb.org/viewtopic.php?t=13077#p104702
# check if another VP is in edit mode
# https://forum.freecadweb.org/viewtopic.php?t=13077#p104702
if not guidoc.getInEdit():
guidoc.setEdit(vobj.Object.Name)
else:
@@ -108,12 +109,21 @@ class _TaskPanelFemElementGeometry2D:
self.obj = obj
# parameter widget
self.parameterWidget = FreeCADGui.PySideUic.loadUi(FreeCAD.getHomePath() + "Mod/Fem/Resources/ui/ElementGeometry2D.ui")
QtCore.QObject.connect(self.parameterWidget.if_thickness, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.thickness_changed)
self.parameterWidget = FreeCADGui.PySideUic.loadUi(
FreeCAD.getHomePath() + "Mod/Fem/Resources/ui/ElementGeometry2D.ui"
)
QtCore.QObject.connect(
self.parameterWidget.if_thickness,
QtCore.SIGNAL("valueChanged(Base::Quantity)"),
self.thickness_changed
)
self.init_parameter_widget()
# geometry selection widget
self.selectionWidget = FemSelectionWidgets.GeometryElementsSelection(obj.References, ['Face'])
self.selectionWidget = FemSelectionWidgets.GeometryElementsSelection(
obj.References,
['Face']
)
# form made from param and selection widget
self.form = [self.parameterWidget, self.selectionWidget]

View File

@@ -84,12 +84,14 @@ class _ViewProviderFemElementRotation1D:
'''
def setEdit(self, vobj, mode=0):
# avoid edit mode by return False, https://forum.freecadweb.org/viewtopic.php?t=12139&start=10#p161062
# avoid edit mode by return False
# https://forum.freecadweb.org/viewtopic.php?t=12139&start=10#p161062
return False
def doubleClicked(self, vobj):
guidoc = FreeCADGui.getDocument(vobj.Object.Document)
# check if another VP is in edit mode, https://forum.freecadweb.org/viewtopic.php?t=13077#p104702
# check if another VP is in edit mode
# https://forum.freecadweb.org/viewtopic.php?t=13077#p104702
if not guidoc.getInEdit():
guidoc.setEdit(vobj.Object.Name)
else:
@@ -113,13 +115,22 @@ class _TaskPanelFemElementRotation1D:
self.obj = obj
# parameter widget
self.parameterWidget = FreeCADGui.PySideUic.loadUi(FreeCAD.getHomePath() + "Mod/Fem/Resources/ui/ElementRotation1D.ui")
QtCore.QObject.connect(self.parameterWidget.if_rotation, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.rotation_changed)
self.parameterWidget = FreeCADGui.PySideUic.loadUi(
FreeCAD.getHomePath() + "Mod/Fem/Resources/ui/ElementRotation1D.ui"
)
QtCore.QObject.connect(
self.parameterWidget.if_rotation,
QtCore.SIGNAL("valueChanged(Base::Quantity)"),
self.rotation_changed
)
self.rotation = self.obj.Rotation
self.parameterWidget.if_rotation.setText(self.rotation.UserString)
# geometry selection widget
self.selectionWidget = FemSelectionWidgets.GeometryElementsSelection(obj.References, ['Edge'])
self.selectionWidget = FemSelectionWidgets.GeometryElementsSelection(
obj.References,
['Edge']
)
# form made from param and selection widget
self.form = [self.parameterWidget, self.selectionWidget]

View File

@@ -63,12 +63,14 @@ class _ViewProviderFemMaterialMechanicalNonlinear:
return
def setEdit(self, vobj, mode=0):
# avoid edit mode by return False, https://forum.freecadweb.org/viewtopic.php?t=12139&start=10#p161062
# avoid edit mode by return False
# https://forum.freecadweb.org/viewtopic.php?t=12139&start=10#p161062
return False
def doubleClicked(self, vobj):
guidoc = FreeCADGui.getDocument(vobj.Object.Document)
# check if another VP is in edit mode, https://forum.freecadweb.org/viewtopic.php?t=13077#p104702
# check if another VP is in edit mode
# https://forum.freecadweb.org/viewtopic.php?t=13077#p104702
if not guidoc.getInEdit():
guidoc.setEdit(vobj.Object.Name)
else:

View File

@@ -83,7 +83,8 @@ class _ViewProviderFemMeshBoundaryLayer:
def doubleClicked(self, vobj):
guidoc = FreeCADGui.getDocument(vobj.Object.Document)
# check if another VP is in edit mode, https://forum.freecadweb.org/viewtopic.php?t=13077#p104702
# check if another VP is in edit mode
# https://forum.freecadweb.org/viewtopic.php?t=13077#p104702
if not guidoc.getInEdit():
guidoc.setEdit(vobj.Object.Name)
else:
@@ -108,14 +109,33 @@ class _TaskPanelFemMeshBoundaryLayer:
self.obj = obj
# parameter widget
self.parameterWidget = FreeCADGui.PySideUic.loadUi(FreeCAD.getHomePath() + "Mod/Fem/Resources/ui/MeshBoundaryLayer.ui")
QtCore.QObject.connect(self.parameterWidget.bl_number_of_layers, QtCore.SIGNAL("valueChanged(int)"), self.bl_number_of_layers_changed)
QtCore.QObject.connect(self.parameterWidget.bl_min_thickness, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.bl_min_thickness_changed)
QtCore.QObject.connect(self.parameterWidget.bl_growth_rate, QtCore.SIGNAL("valueChanged(double)"), self.bl_growth_rate_changed) # becareful of signal signature for QDoubleSpinbox
self.parameterWidget = FreeCADGui.PySideUic.loadUi(
FreeCAD.getHomePath() + "Mod/Fem/Resources/ui/MeshBoundaryLayer.ui"
)
QtCore.QObject.connect(
self.parameterWidget.bl_number_of_layers,
QtCore.SIGNAL("valueChanged(int)"),
self.bl_number_of_layers_changed
)
QtCore.QObject.connect(
self.parameterWidget.bl_min_thickness,
QtCore.SIGNAL("valueChanged(Base::Quantity)"),
self.bl_min_thickness_changed
)
# be careful of signal signature for QDoubleSpinbox
QtCore.QObject.connect(
self.parameterWidget.bl_growth_rate,
QtCore.SIGNAL("valueChanged(double)"),
self.bl_growth_rate_changed
)
self.init_parameter_widget()
# geometry selection widget
self.selectionWidget = FemSelectionWidgets.GeometryElementsSelection(obj.References, ['Solid', 'Face', 'Edge', 'Vertex']) # start with Solid in list!
# start with Solid in list!
self.selectionWidget = FemSelectionWidgets.GeometryElementsSelection(
obj.References,
['Solid', 'Face', 'Edge', 'Vertex']
)
# form made from param and selection widget
self.form = [self.parameterWidget, self.selectionWidget]

View File

@@ -80,11 +80,14 @@ class _ViewProviderFemMeshGmsh:
return True
def doubleClicked(self, vobj):
# Group meshing is only active on active analysis, we should make sure the analysis the mesh belongs too is active
# Group meshing is only active on active analysis
# we should make sure the analysis the mesh belongs too is active
gui_doc = FreeCADGui.getDocument(vobj.Object.Document)
if not gui_doc.getInEdit():
# may be go the other way around and just activate the analysis the user has doubleClicked on ?!
# not a fast one, we need to iterate over all member of all analysis to know to which analysis the object belongs too!!!
# may be go the other way around and just activate the
# analysis the user has doubleClicked on ?!
# not a fast one, we need to iterate over all member of all
# analysis to know to which analysis the object belongs too!!!
# first check if there is an analysis in the active document
found_an_analysis = False
for o in gui_doc.Document.Objects:
@@ -98,7 +101,10 @@ class _ViewProviderFemMeshGmsh:
if not gui_doc.getInEdit():
gui_doc.setEdit(vobj.Object.Name)
else:
FreeCAD.Console.PrintError('Activate the analysis this Gmsh FEM mesh object belongs too!\n')
FreeCAD.Console.PrintError(
'Activate the analysis this Gmsh FEM '
'mesh object belongs too!\n'
)
else:
print('Gmsh FEM mesh object does not belong to the active analysis.')
found_mesh_analysis = False
@@ -108,16 +114,27 @@ class _ViewProviderFemMeshGmsh:
if m == self.Object:
found_mesh_analysis = True
FemGui.setActiveAnalysis(o)
print('The analysis the Gmsh FEM mesh object belongs too was found and activated: ' + o.Name)
print(
'The analysis the Gmsh FEM mesh object '
'belongs to was found and activated: {}'
.format(o.Name)
)
gui_doc.setEdit(vobj.Object.Name)
break
if not found_mesh_analysis:
print('Gmsh FEM mesh object does not belong to an analysis. Analysis group meshing will be deactivated.')
print(
'Gmsh FEM mesh object does not belong to an analysis. '
'Analysis group meshing will be deactivated.'
)
gui_doc.setEdit(vobj.Object.Name)
else:
FreeCAD.Console.PrintError('Active analysis is not in active document.')
else:
print('No active analysis in active document, we are going to have a look if the Gmsh FEM mesh object belongs to a non active analysis.')
print(
'No active analysis in active document, '
'we are going to have a look if the Gmsh FEM mesh object '
'belongs to a non active analysis.'
)
found_mesh_analysis = False
for o in gui_doc.Document.Objects:
if o.isDerivedFrom('Fem::FemAnalysisPython'):
@@ -125,11 +142,17 @@ class _ViewProviderFemMeshGmsh:
if m == self.Object:
found_mesh_analysis = True
FemGui.setActiveAnalysis(o)
print('The analysis the Gmsh FEM mesh object belongs to was found and activated: ' + o.Name)
print(
'The analysis the Gmsh FEM mesh object '
'belongs to was found and activated: {}'.format(o.Name)
)
gui_doc.setEdit(vobj.Object.Name)
break
if not found_mesh_analysis:
print('Gmsh FEM mesh object does not belong to an analysis. Analysis group meshing will be deactivated.')
print(
'Gmsh FEM mesh object does not belong to an analysis. '
'Analysis group meshing will be deactivated.'
)
gui_doc.setEdit(vobj.Object.Name)
else:
print('No analysis in the active document.')
@@ -148,7 +171,10 @@ class _ViewProviderFemMeshGmsh:
return None
def claimChildren(self):
return (self.Object.MeshRegionList + self.Object.MeshGroupList + self.Object.MeshBoundaryLayerList)
reg_childs = self.Object.MeshRegionList
gro_childs = self.Object.MeshGroupList
bou_childs = self.Object.MeshBoundaryLayerList
return (reg_childs + gro_childs + bou_childs)
def onDelete(self, feature, subelements):
try:
@@ -165,11 +191,14 @@ class _ViewProviderFemMeshGmsh:
return True
def canDragObject(self, dragged_object):
if hasattr(dragged_object, "Proxy") and dragged_object.Proxy.Type == "Fem::FemMeshBoundaryLayer":
if hasattr(dragged_object, "Proxy") \
and dragged_object.Proxy.Type == "Fem::FemMeshBoundaryLayer":
return True
elif hasattr(dragged_object, "Proxy") and dragged_object.Proxy.Type == "Fem::FemMeshGroup":
elif hasattr(dragged_object, "Proxy") \
and dragged_object.Proxy.Type == "Fem::FemMeshGroup":
return True
elif hasattr(dragged_object, "Proxy") and dragged_object.Proxy.Type == "Fem::FemMeshRegion":
elif hasattr(dragged_object, "Proxy") \
and dragged_object.Proxy.Type == "Fem::FemMeshRegion":
return True
else:
return False
@@ -192,15 +221,18 @@ class _ViewProviderFemMeshGmsh:
self.Object.MeshRegionList = objs
def dropObject(self, selfvp, incoming_object):
if hasattr(incoming_object, "Proxy") and incoming_object.Proxy.Type == "Fem::FemMeshBoundaryLayer":
if hasattr(incoming_object, "Proxy") \
and incoming_object.Proxy.Type == "Fem::FemMeshBoundaryLayer":
objs = self.Object.MeshBoundaryLayerList
objs.append(incoming_object)
self.Object.MeshBoundaryLayerList = objs
elif hasattr(incoming_object, "Proxy") and incoming_object.Proxy.Type == "Fem::FemMeshGroup":
elif hasattr(incoming_object, "Proxy") \
and incoming_object.Proxy.Type == "Fem::FemMeshGroup":
objs = self.Object.MeshGroupList
objs.append(incoming_object)
self.Object.MeshGroupList = objs
elif hasattr(incoming_object, "Proxy") and incoming_object.Proxy.Type == "Fem::FemMeshRegion":
elif hasattr(incoming_object, "Proxy") \
and incoming_object.Proxy.Type == "Fem::FemMeshRegion":
objs = self.Object.MeshRegionList
objs.append(incoming_object)
self.Object.MeshRegionList = objs
@@ -208,30 +240,54 @@ class _ViewProviderFemMeshGmsh:
class _TaskPanelFemMeshGmsh:
'''The TaskPanel for editing References property of FemMeshGmsh objects and creation of new FEM mesh'''
'''The TaskPanel for editing References property of
FemMeshGmsh objects and creation of new FEM mesh'''
def __init__(self, obj):
self.mesh_obj = obj
self.form = FreeCADGui.PySideUic.loadUi(FreeCAD.getHomePath() + "Mod/Fem/Resources/ui/MeshGmsh.ui")
self.form = FreeCADGui.PySideUic.loadUi(
FreeCAD.getHomePath() + "Mod/Fem/Resources/ui/MeshGmsh.ui"
)
self.Timer = QtCore.QTimer()
self.Timer.start(100) # 100 milli seconds
self.gmsh_runs = False
self.console_message_gmsh = ''
QtCore.QObject.connect(self.form.if_max, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.max_changed)
QtCore.QObject.connect(self.form.if_min, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.min_changed)
QtCore.QObject.connect(self.form.cb_dimension, QtCore.SIGNAL("activated(int)"), self.choose_dimension)
QtCore.QObject.connect(self.Timer, QtCore.SIGNAL("timeout()"), self.update_timer_text)
QtCore.QObject.connect(
self.form.if_max,
QtCore.SIGNAL("valueChanged(Base::Quantity)"),
self.max_changed
)
QtCore.QObject.connect(
self.form.if_min,
QtCore.SIGNAL("valueChanged(Base::Quantity)"),
self.min_changed
)
QtCore.QObject.connect(
self.form.cb_dimension,
QtCore.SIGNAL("activated(int)"),
self.choose_dimension
)
QtCore.QObject.connect(
self.Timer,
QtCore.SIGNAL("timeout()"),
self.update_timer_text
)
self.form.cb_dimension.addItems(_FemMeshGmsh._FemMeshGmsh.known_element_dimensions)
self.form.cb_dimension.addItems(
_FemMeshGmsh._FemMeshGmsh.known_element_dimensions
)
self.get_mesh_params()
self.get_active_analysis()
self.update()
def getStandardButtons(self):
return int(QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Apply | QtGui.QDialogButtonBox.Cancel)
button_value = int(
QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Apply | QtGui.QDialogButtonBox.Cancel
)
return button_value
# show a OK, a apply and a Cancel button
# def reject() is called on Cancel button
# def clicked(self, button) is needed, to access the apply button
@@ -272,8 +328,10 @@ class _TaskPanelFemMeshGmsh:
def console_log(self, message="", color="#000000"):
if (not isinstance(message, bytes)) and (sys.version_info.major < 3):
message = message.encode('utf-8', 'replace')
self.console_message_gmsh = self.console_message_gmsh + '<font color="#0000FF">{0:4.1f}:</font> <font color="{1}">{2}</font><br>'.\
format(time.time() - self.Start, color, message)
self.console_message_gmsh = self.console_message_gmsh + (
'<font color="#0000FF">{0:4.1f}:</font> <font color="{1}">{2}</font><br>'
.format(time.time() - self.Start, color, message)
)
self.form.te_output.setText(self.console_message_gmsh)
self.form.te_output.moveCursor(QtGui.QTextCursor.End)
@@ -300,14 +358,27 @@ class _TaskPanelFemMeshGmsh:
QApplication.setOverrideCursor(Qt.WaitCursor)
part = self.obj.Part
if self.mesh_obj.MeshRegionList:
if part.Shape.ShapeType == "Compound" and hasattr(part, "Proxy"): # other part obj might not have a Proxy, thus an exception would be raised
if (part.Proxy.Type == "FeatureBooleanFragments" or part.Proxy.Type == "FeatureSlice" or part.Proxy.Type == "FeatureXOR"):
# other part obj might not have a Proxy, thus an exception would be raised
if part.Shape.ShapeType == "Compound" and hasattr(part, "Proxy"):
if part.Proxy.Type == "FeatureBooleanFragments" \
or part.Proxy.Type == "FeatureSlice" \
or part.Proxy.Type == "FeatureXOR":
error_message = (
'The mesh to shape is a boolean split tools Compound and the mesh has mesh region list. '
'The shape to mesh is a boolean split tools Compound '
'and the mesh has mesh region list. '
'Gmsh could return unexpected meshes in such circumstances. '
'It is strongly recommended to extract the shape to mesh from the Compound and use this one.'
'It is strongly recommended to extract the shape '
'to mesh from the Compound and use this one.'
)
qtbox_title = (
"Shape to mesh is a BooleanFragmentsCompound "
"and mesh regions are defined"
)
QtGui.QMessageBox.critical(
None,
qtbox_title,
error_message
)
QtGui.QMessageBox.critical(None, "Shape to mesh is a BooleanFragmentsCompound and mesh regions are defined", error_message)
self.Start = time.time()
self.form.l_time.setText('Time: {0:4.1f}: '.format(time.time() - self.Start))
self.console_message_gmsh = ''

View File

@@ -82,7 +82,8 @@ class _ViewProviderFemMeshGroup:
def doubleClicked(self, vobj):
guidoc = FreeCADGui.getDocument(vobj.Object.Document)
# check if another VP is in edit mode, https://forum.freecadweb.org/viewtopic.php?t=13077#p104702
# check if another VP is in edit mode
# https://forum.freecadweb.org/viewtopic.php?t=13077#p104702
if not guidoc.getInEdit():
guidoc.setEdit(vobj.Object.Name)
else:
@@ -107,13 +108,27 @@ class _TaskPanelFemMeshGroup:
self.obj = obj
# parameter widget
self.parameterWidget = FreeCADGui.PySideUic.loadUi(FreeCAD.getHomePath() + "Mod/Fem/Resources/ui/MeshGroup.ui")
QtCore.QObject.connect(self.parameterWidget.rb_name, QtCore.SIGNAL("toggled(bool)"), self.choose_exportidentifier_name)
QtCore.QObject.connect(self.parameterWidget.rb_label, QtCore.SIGNAL("toggled(bool)"), self.choose_exportidentifier_label)
self.parameterWidget = FreeCADGui.PySideUic.loadUi(
FreeCAD.getHomePath() + "Mod/Fem/Resources/ui/MeshGroup.ui"
)
QtCore.QObject.connect(
self.parameterWidget.rb_name,
QtCore.SIGNAL("toggled(bool)"),
self.choose_exportidentifier_name
)
QtCore.QObject.connect(
self.parameterWidget.rb_label,
QtCore.SIGNAL("toggled(bool)"),
self.choose_exportidentifier_label
)
self.init_parameter_widget()
# geometry selection widget
self.selectionWidget = FemSelectionWidgets.GeometryElementsSelection(obj.References, ['Solid', 'Face', 'Edge', 'Vertex']) # start with Solid in list!
# start with Solid in list!
self.selectionWidget = FemSelectionWidgets.GeometryElementsSelection(
obj.References,
['Solid', 'Face', 'Edge', 'Vertex']
)
# form made from param and selection widget
self.form = [self.parameterWidget, self.selectionWidget]

View File

@@ -83,7 +83,8 @@ class _ViewProviderFemMeshRegion:
def doubleClicked(self, vobj):
guidoc = FreeCADGui.getDocument(vobj.Object.Document)
# check if another VP is in edit mode, https://forum.freecadweb.org/viewtopic.php?t=13077#p104702
# check if another VP is in edit mode
# https://forum.freecadweb.org/viewtopic.php?t=13077#p104702
if not guidoc.getInEdit():
guidoc.setEdit(vobj.Object.Name)
else:
@@ -108,12 +109,22 @@ class _TaskPanelFemMeshRegion:
self.obj = obj
# parameter widget
self.parameterWidget = FreeCADGui.PySideUic.loadUi(FreeCAD.getHomePath() + "Mod/Fem/Resources/ui/MeshRegion.ui")
QtCore.QObject.connect(self.parameterWidget.if_elelen, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.elelen_changed)
self.parameterWidget = FreeCADGui.PySideUic.loadUi(
FreeCAD.getHomePath() + "Mod/Fem/Resources/ui/MeshRegion.ui"
)
QtCore.QObject.connect(
self.parameterWidget.if_elelen,
QtCore.SIGNAL("valueChanged(Base::Quantity)"),
self.elelen_changed
)
self.init_parameter_widget()
# geometry selection widget
self.selectionWidget = FemSelectionWidgets.GeometryElementsSelection(obj.References, ['Solid', 'Face', 'Edge', 'Vertex']) # start with Solid in list!
# start with Solid in list!
self.selectionWidget = FemSelectionWidgets.GeometryElementsSelection(
obj.References,
['Solid', 'Face', 'Edge', 'Vertex']
)
# form made from param and selection widget
self.form = [self.parameterWidget, self.selectionWidget]

View File

@@ -65,7 +65,8 @@ class _ViewProviderFemResultMechanical:
def doubleClicked(self, vobj):
guidoc = FreeCADGui.getDocument(vobj.Object.Document)
# check if another VP is in edit mode, https://forum.freecadweb.org/viewtopic.php?t=13077#p104702
# check if another VP is in edit mode
# https://forum.freecadweb.org/viewtopic.php?t=13077#p104702
if not guidoc.getInEdit():
guidoc.setEdit(vobj.Object.Name)
else:
@@ -93,7 +94,8 @@ class _ViewProviderFemResultMechanical:
def unsetEdit(self, vobj, mode=0):
FreeCADGui.Control.closeDialog()
self.Object.Mesh.ViewObject.hide() # hide the mesh after result viewing is finished, but do not reset the coloring
# hide the mesh after result viewing is finished, but do not reset the coloring
self.Object.Mesh.ViewObject.hide()
return True
def __getstate__(self):
@@ -121,37 +123,118 @@ class _TaskPanelFemResultShow:
self.result_obj = obj
self.mesh_obj = self.result_obj.Mesh
# task panel should be started by use of setEdit of view provider
# in view provider checks: Mesh, active analysis and if Mesh and result are in active analysis
# in view provider checks: Mesh, active analysis and
# if Mesh and result are in active analysis
self.form = FreeCADGui.PySideUic.loadUi(FreeCAD.getHomePath() + "Mod/Fem/Resources/ui/ResultShow.ui")
self.fem_prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Fem/General")
self.restore_result_settings_in_dialog = self.fem_prefs.GetBool("RestoreResultDialog", True)
self.form = FreeCADGui.PySideUic.loadUi(
FreeCAD.getHomePath() + "Mod/Fem/Resources/ui/ResultShow.ui"
)
self.fem_prefs = FreeCAD.ParamGet(
"User parameter:BaseApp/Preferences/Mod/Fem/General"
)
self.restore_result_settings_in_dialog = self.fem_prefs.GetBool(
"RestoreResultDialog", True
)
# Connect Signals and Slots
# result type radio buttons
QtCore.QObject.connect(self.form.rb_none, QtCore.SIGNAL("toggled(bool)"), self.none_selected)
QtCore.QObject.connect(self.form.rb_abs_displacement, QtCore.SIGNAL("toggled(bool)"), self.abs_displacement_selected)
QtCore.QObject.connect(self.form.rb_x_displacement, QtCore.SIGNAL("toggled(bool)"), self.x_displacement_selected)
QtCore.QObject.connect(self.form.rb_y_displacement, QtCore.SIGNAL("toggled(bool)"), self.y_displacement_selected)
QtCore.QObject.connect(self.form.rb_z_displacement, QtCore.SIGNAL("toggled(bool)"), self.z_displacement_selected)
QtCore.QObject.connect(self.form.rb_temperature, QtCore.SIGNAL("toggled(bool)"), self.temperature_selected)
QtCore.QObject.connect(self.form.rb_vm_stress, QtCore.SIGNAL("toggled(bool)"), self.vm_stress_selected)
QtCore.QObject.connect(self.form.rb_maxprin, QtCore.SIGNAL("toggled(bool)"), self.max_prin_selected)
QtCore.QObject.connect(self.form.rb_minprin, QtCore.SIGNAL("toggled(bool)"), self.min_prin_selected)
QtCore.QObject.connect(self.form.rb_max_shear_stress, QtCore.SIGNAL("toggled(bool)"), self.max_shear_selected)
QtCore.QObject.connect(self.form.rb_massflowrate, QtCore.SIGNAL("toggled(bool)"), self.massflowrate_selected)
QtCore.QObject.connect(self.form.rb_networkpressure, QtCore.SIGNAL("toggled(bool)"), self.networkpressure_selected)
QtCore.QObject.connect(self.form.rb_peeq, QtCore.SIGNAL("toggled(bool)"), self.peeq_selected)
QtCore.QObject.connect(
self.form.rb_none, QtCore.SIGNAL("toggled(bool)"),
self.none_selected
)
QtCore.QObject.connect(
self.form.rb_abs_displacement,
QtCore.SIGNAL("toggled(bool)"),
self.abs_displacement_selected
)
QtCore.QObject.connect(
self.form.rb_x_displacement,
QtCore.SIGNAL("toggled(bool)"),
self.x_displacement_selected
)
QtCore.QObject.connect(
self.form.rb_y_displacement,
QtCore.SIGNAL("toggled(bool)"),
self.y_displacement_selected
)
QtCore.QObject.connect(
self.form.rb_z_displacement,
QtCore.SIGNAL("toggled(bool)"),
self.z_displacement_selected
)
QtCore.QObject.connect(
self.form.rb_temperature,
QtCore.SIGNAL("toggled(bool)"),
self.temperature_selected
)
QtCore.QObject.connect(
self.form.rb_vm_stress,
QtCore.SIGNAL("toggled(bool)"),
self.vm_stress_selected
)
QtCore.QObject.connect(
self.form.rb_maxprin,
QtCore.SIGNAL("toggled(bool)"),
self.max_prin_selected
)
QtCore.QObject.connect(
self.form.rb_minprin,
QtCore.SIGNAL("toggled(bool)"),
self.min_prin_selected
)
QtCore.QObject.connect(
self.form.rb_max_shear_stress,
QtCore.SIGNAL("toggled(bool)"),
self.max_shear_selected
)
QtCore.QObject.connect(
self.form.rb_massflowrate,
QtCore.SIGNAL("toggled(bool)"),
self.massflowrate_selected
)
QtCore.QObject.connect(
self.form.rb_networkpressure,
QtCore.SIGNAL("toggled(bool)"),
self.networkpressure_selected
)
QtCore.QObject.connect(
self.form.rb_peeq, QtCore.SIGNAL("toggled(bool)"),
self.peeq_selected
)
# displacement
QtCore.QObject.connect(self.form.cb_show_displacement, QtCore.SIGNAL("clicked(bool)"), self.show_displacement)
QtCore.QObject.connect(self.form.hsb_displacement_factor, QtCore.SIGNAL("valueChanged(int)"), self.hsb_disp_factor_changed)
QtCore.QObject.connect(self.form.sb_displacement_factor, QtCore.SIGNAL("valueChanged(int)"), self.sb_disp_factor_changed)
QtCore.QObject.connect(self.form.sb_displacement_factor_max, QtCore.SIGNAL("valueChanged(int)"), self.sb_disp_factor_max_changed)
QtCore.QObject.connect(
self.form.cb_show_displacement,
QtCore.SIGNAL("clicked(bool)"),
self.show_displacement
)
QtCore.QObject.connect(
self.form.hsb_displacement_factor,
QtCore.SIGNAL("valueChanged(int)"),
self.hsb_disp_factor_changed
)
QtCore.QObject.connect(
self.form.sb_displacement_factor,
QtCore.SIGNAL("valueChanged(int)"),
self.sb_disp_factor_changed
)
QtCore.QObject.connect(
self.form.sb_displacement_factor_max,
QtCore.SIGNAL("valueChanged(int)"),
self.sb_disp_factor_max_changed
)
# user defined equation
QtCore.QObject.connect(self.form.user_def_eq, QtCore.SIGNAL("textchanged()"), self.user_defined_text)
QtCore.QObject.connect(self.form.calculate, QtCore.SIGNAL("clicked()"), self.calculate)
QtCore.QObject.connect(
self.form.user_def_eq,
QtCore.SIGNAL("textchanged()"),
self.user_defined_text
)
QtCore.QObject.connect(
self.form.calculate,
QtCore.SIGNAL("clicked()"),
self.calculate
)
self.update()
if self.restore_result_settings_in_dialog:
@@ -259,7 +342,10 @@ class _TaskPanelFemResultShow:
FreeCAD.FEM_dialog["results_type"] = "Sabs"
QApplication.setOverrideCursor(Qt.WaitCursor)
if self.suitable_results:
self.mesh_obj.ViewObject.setNodeColorByScalars(self.result_obj.NodeNumbers, self.result_obj.StressValues)
self.mesh_obj.ViewObject.setNodeColorByScalars(
self.result_obj.NodeNumbers,
self.result_obj.StressValues
)
(minm, avg, maxm) = self.get_result_stats("Sabs")
self.set_result_stats("MPa", minm, avg, maxm)
QtGui.QApplication.restoreOverrideCursor()
@@ -268,7 +354,10 @@ class _TaskPanelFemResultShow:
FreeCAD.FEM_dialog["results_type"] = "MaxShear"
QApplication.setOverrideCursor(Qt.WaitCursor)
if self.suitable_results:
self.mesh_obj.ViewObject.setNodeColorByScalars(self.result_obj.NodeNumbers, self.result_obj.MaxShear)
self.mesh_obj.ViewObject.setNodeColorByScalars(
self.result_obj.NodeNumbers,
self.result_obj.MaxShear
)
(minm, avg, maxm) = self.get_result_stats("MaxShear")
self.set_result_stats("MPa", minm, avg, maxm)
QtGui.QApplication.restoreOverrideCursor()
@@ -277,7 +366,10 @@ class _TaskPanelFemResultShow:
FreeCAD.FEM_dialog["results_type"] = "MaxPrin"
QApplication.setOverrideCursor(Qt.WaitCursor)
if self.suitable_results:
self.mesh_obj.ViewObject.setNodeColorByScalars(self.result_obj.NodeNumbers, self.result_obj.PrincipalMax)
self.mesh_obj.ViewObject.setNodeColorByScalars(
self.result_obj.NodeNumbers,
self.result_obj.PrincipalMax
)
(minm, avg, maxm) = self.get_result_stats("MaxPrin")
self.set_result_stats("MPa", minm, avg, maxm)
QtGui.QApplication.restoreOverrideCursor()
@@ -286,7 +378,10 @@ class _TaskPanelFemResultShow:
FreeCAD.FEM_dialog["results_type"] = "Temp"
QApplication.setOverrideCursor(Qt.WaitCursor)
if self.suitable_results:
self.mesh_obj.ViewObject.setNodeColorByScalars(self.result_obj.NodeNumbers, self.result_obj.Temperature)
self.mesh_obj.ViewObject.setNodeColorByScalars(
self.result_obj.NodeNumbers,
self.result_obj.Temperature
)
(minm, avg, maxm) = self.get_result_stats("Temp")
self.set_result_stats("K", minm, avg, maxm)
QtGui.QApplication.restoreOverrideCursor()
@@ -295,7 +390,10 @@ class _TaskPanelFemResultShow:
FreeCAD.FEM_dialog["results_type"] = "MFlow"
QApplication.setOverrideCursor(Qt.WaitCursor)
if self.suitable_results:
self.mesh_obj.ViewObject.setNodeColorByScalars(self.result_obj.NodeNumbers, self.result_obj.MassFlowRate)
self.mesh_obj.ViewObject.setNodeColorByScalars(
self.result_obj.NodeNumbers,
self.result_obj.MassFlowRate
)
(minm, avg, maxm) = self.get_result_stats("MFlow")
self.set_result_stats("kg/s", minm, avg, maxm)
QtGui.QApplication.restoreOverrideCursor()
@@ -304,7 +402,10 @@ class _TaskPanelFemResultShow:
FreeCAD.FEM_dialog["results_type"] = "NPress"
QApplication.setOverrideCursor(Qt.WaitCursor)
if self.suitable_results:
self.mesh_obj.ViewObject.setNodeColorByScalars(self.result_obj.NodeNumbers, self.result_obj.NetworkPressure)
self.mesh_obj.ViewObject.setNodeColorByScalars(
self.result_obj.NodeNumbers,
self.result_obj.NetworkPressure
)
(minm, avg, maxm) = self.get_result_stats("NPress")
self.set_result_stats("MPa", minm, avg, maxm)
QtGui.QApplication.restoreOverrideCursor()
@@ -313,7 +414,10 @@ class _TaskPanelFemResultShow:
FreeCAD.FEM_dialog["results_type"] = "MinPrin"
QApplication.setOverrideCursor(Qt.WaitCursor)
if self.suitable_results:
self.mesh_obj.ViewObject.setNodeColorByScalars(self.result_obj.NodeNumbers, self.result_obj.PrincipalMin)
self.mesh_obj.ViewObject.setNodeColorByScalars(
self.result_obj.NodeNumbers,
self.result_obj.PrincipalMin
)
(minm, avg, maxm) = self.get_result_stats("MinPrin")
self.set_result_stats("MPa", minm, avg, maxm)
QtGui.QApplication.restoreOverrideCursor()
@@ -322,7 +426,10 @@ class _TaskPanelFemResultShow:
FreeCAD.FEM_dialog["results_type"] = "Peeq"
QApplication.setOverrideCursor(Qt.WaitCursor)
if self.suitable_results:
self.mesh_obj.ViewObject.setNodeColorByScalars(self.result_obj.NodeNumbers, self.result_obj.Peeq)
self.mesh_obj.ViewObject.setNodeColorByScalars(
self.result_obj.NodeNumbers,
self.result_obj.Peeq
)
(minm, avg, maxm) = self.get_result_stats("Peeq")
self.set_result_stats("", minm, avg, maxm)
QtGui.QApplication.restoreOverrideCursor()
@@ -369,22 +476,36 @@ class _TaskPanelFemResultShow:
QApplication.setOverrideCursor(Qt.WaitCursor)
if self.suitable_results:
self.mesh_obj.ViewObject.setNodeColorByScalars(self.result_obj.NodeNumbers, UserDefinedFormula)
self.mesh_obj.ViewObject.setNodeColorByScalars(
self.result_obj.NodeNumbers,
UserDefinedFormula
)
self.set_result_stats("", minm, avg, maxm)
QtGui.QApplication.restoreOverrideCursor()
del x, y, z, T, Von, Peeq, P1, P2, P3, sxx, syy, szz, sxy, sxz, syz, exx, eyy, ezz, exy, exz, eyz, MF, NP # Dummy use of the variables to get around flake8 error
# Dummy use of the variables to get around flake8 error
del x, y, z, T, Von, Peeq, P1, P2, P3
del sxx, syy, szz, sxy, sxz, syz
del exx, eyy, ezz, exy, exz, eyz
del MF, NP
def select_displacement_type(self, disp_type):
QApplication.setOverrideCursor(Qt.WaitCursor)
if disp_type == "Uabs":
if self.suitable_results:
self.mesh_obj.ViewObject.setNodeColorByScalars(self.result_obj.NodeNumbers, self.result_obj.DisplacementLengths)
self.mesh_obj.ViewObject.setNodeColorByScalars(
self.result_obj.NodeNumbers,
self.result_obj.DisplacementLengths
)
else:
match = {"U1": 0, "U2": 1, "U3": 2}
d = list(zip(*self.result_obj.DisplacementVectors)) # list is needed, as zib-object is not subscriptable in py3
# list is needed, as zib-object is not subscriptable in py3
d = list(zip(*self.result_obj.DisplacementVectors))
displacements = list(d[match[disp_type]])
if self.suitable_results:
self.mesh_obj.ViewObject.setNodeColorByScalars(self.result_obj.NodeNumbers, displacements)
self.mesh_obj.ViewObject.setNodeColorByScalars(
self.result_obj.NodeNumbers,
displacements
)
(minm, avg, maxm) = self.get_result_stats(disp_type)
self.set_result_stats("mm", minm, avg, maxm)
QtGui.QApplication.restoreOverrideCursor()
@@ -413,7 +534,10 @@ class _TaskPanelFemResultShow:
self.update_displacement()
FreeCAD.FEM_dialog["result_obj"] = self.result_obj
if self.suitable_results:
self.mesh_obj.ViewObject.setNodeDisplacementByVectors(self.result_obj.NodeNumbers, self.result_obj.DisplacementVectors)
self.mesh_obj.ViewObject.setNodeDisplacementByVectors(
self.result_obj.NodeNumbers,
self.result_obj.DisplacementVectors
)
self.update_displacement()
QtGui.QApplication.restoreOverrideCursor()
@@ -473,7 +597,10 @@ class _TaskPanelFemResultShow:
hide_parts_constraints()
else:
if not self.mesh_obj.FemMesh.VolumeCount:
error_message = 'FEM: Graphical bending stress output for beam or shell FEM Meshes not yet supported.\n'
error_message = (
'FEM: Graphical bending stress output '
'for beam or shell FEM Meshes not yet supported.\n'
)
FreeCAD.Console.PrintError(error_message)
QtGui.QMessageBox.critical(None, 'No result object', error_message)
else:
@@ -492,7 +619,9 @@ class _TaskPanelFemResultShow:
self.mesh_obj.ViewObject.setNodeColorByScalars(node_numbers, zero_values)
def reject(self):
FreeCADGui.Control.closeDialog() # if the tasks panel is called from Command obj is not in edit mode thus reset edit does not close the dialog, maybe don't call but set in edit instead
# if the tasks panel is called from Command obj is not in edit mode
# thus reset edit does not close the dialog, maybe don't call but set in edit instead
FreeCADGui.Control.closeDialog()
FreeCADGui.ActiveDocument.resetEdit()

View File

@@ -95,7 +95,9 @@ class _TaskPanelFemSolverCalculix:
'''The TaskPanel for CalculiX ccx tools solver object'''
def __init__(self, solver_object):
self.form = FreeCADGui.PySideUic.loadUi(FreeCAD.getHomePath() + "Mod/Fem/Resources/ui/SolverCalculix.ui")
self.form = FreeCADGui.PySideUic.loadUi(
FreeCAD.getHomePath() + "Mod/Fem/Resources/ui/SolverCalculix.ui"
)
from femtools.ccxtools import CcxTools as ccx
# we do not need to pass the analysis, it will be found on fea init
@@ -110,21 +112,71 @@ class _TaskPanelFemSolverCalculix:
self.fem_console_message = ''
# Connect Signals and Slots
QtCore.QObject.connect(self.form.tb_choose_working_dir, QtCore.SIGNAL("clicked()"), self.choose_working_dir)
QtCore.QObject.connect(self.form.pb_write_inp, QtCore.SIGNAL("clicked()"), self.write_input_file_handler)
QtCore.QObject.connect(self.form.pb_edit_inp, QtCore.SIGNAL("clicked()"), self.editCalculixInputFile)
QtCore.QObject.connect(self.form.pb_run_ccx, QtCore.SIGNAL("clicked()"), self.runCalculix)
QtCore.QObject.connect(self.form.rb_static_analysis, QtCore.SIGNAL("clicked()"), self.select_static_analysis)
QtCore.QObject.connect(self.form.rb_frequency_analysis, QtCore.SIGNAL("clicked()"), self.select_frequency_analysis)
QtCore.QObject.connect(self.form.rb_thermomech_analysis, QtCore.SIGNAL("clicked()"), self.select_thermomech_analysis)
QtCore.QObject.connect(self.form.rb_check_mesh, QtCore.SIGNAL("clicked()"), self.select_check_mesh)
QtCore.QObject.connect(self.Calculix, QtCore.SIGNAL("started()"), self.calculixStarted)
QtCore.QObject.connect(self.Calculix, QtCore.SIGNAL("stateChanged(QProcess::ProcessState)"), self.calculixStateChanged)
QtCore.QObject.connect(self.Calculix, QtCore.SIGNAL("error(QProcess::ProcessError)"), self.calculixError)
QtCore.QObject.connect(self.Calculix, QtCore.SIGNAL("finished(int)"), self.calculixFinished)
QtCore.QObject.connect(self.Timer, QtCore.SIGNAL("timeout()"), self.UpdateText)
QtCore.QObject.connect(
self.form.tb_choose_working_dir,
QtCore.SIGNAL("clicked()"),
self.choose_working_dir
)
QtCore.QObject.connect(
self.form.pb_write_inp,
QtCore.SIGNAL("clicked()"),
self.write_input_file_handle
)
QtCore.QObject.connect(
self.form.pb_edit_inp,
QtCore.SIGNAL("clicked()"),
self.editCalculixInputFile
)
QtCore.QObject.connect(
self.form.pb_run_ccx,
QtCore.SIGNAL("clicked()"),
self.runCalculix
)
QtCore.QObject.connect(
self.form.rb_static_analysis,
QtCore.SIGNAL("clicked()"),
self.select_static_analysis
)
QtCore.QObject.connect(
self.form.rb_frequency_analysis,
QtCore.SIGNAL("clicked()"),
self.select_frequency_analysis
)
QtCore.QObject.connect(
self.form.rb_thermomech_analysis,
QtCore.SIGNAL("clicked()"),
self.select_thermomech_analysis
)
QtCore.QObject.connect(
self.form.rb_check_mesh,
QtCore.SIGNAL("clicked()"),
self.select_check_mesh
)
QtCore.QObject.connect(
self.Calculix,
QtCore.SIGNAL("started()"),
self.calculixStarted
)
QtCore.QObject.connect(
self.Calculix,
QtCore.SIGNAL("stateChanged(QProcess::ProcessState)"),
self.calculixStateChanged
)
QtCore.QObject.connect(
self.Calculix,
QtCore.SIGNAL("error(QProcess::ProcessError)"),
self.calculixError
)
QtCore.QObject.connect(
self.Calculix,
QtCore.SIGNAL("finished(int)"),
self.calculixFinished
)
QtCore.QObject.connect(
self.Timer,
QtCore.SIGNAL("timeout()"),
self.UpdateText
)
self.update()
@@ -152,8 +204,10 @@ class _TaskPanelFemSolverCalculix:
def femConsoleMessage(self, message="", color="#000000"):
if sys.version_info.major < 3:
message = message.encode("utf-8", "replace")
self.fem_console_message = self.fem_console_message + '<font color="#0000FF">{0:4.1f}:</font> <font color="{1}">{2}</font><br>'.\
format(time.time() - self.Start, color, message)
self.fem_console_message = self.fem_console_message + (
'<font color="#0000FF">{0:4.1f}:</font> <font color="{1}">{2}</font><br>'
.format(time.time() - self.Start, color, message)
)
self.form.textEdit_Output.setText(self.fem_console_message)
self.form.textEdit_Output.moveCursor(QtGui.QTextCursor.End)
@@ -298,7 +352,10 @@ class _TaskPanelFemSolverCalculix:
if ext_editor_path:
self.start_ext_editor(ext_editor_path, self.fea.inp_file_name)
else:
print("External editor is not defined in FEM preferences. Falling back to internal editor")
print(
"External editor is not defined in FEM preferences. "
"Falling back to internal editor"
)
FemGui.open(self.fea.inp_file_name)
def runCalculix(self):
@@ -309,7 +366,10 @@ class _TaskPanelFemSolverCalculix:
self.femConsoleMessage("Run CalculiX...")
# run Calculix
print('run CalculiX at: {} with: {}'.format(self.fea.ccx_binary, os.path.splitext(self.fea.inp_file_name)[0]))
print(
'run CalculiX at: {} with: {}'
.format(self.fea.ccx_binary, os.path.splitext(self.fea.inp_file_name)[0])
)
# change cwd because ccx may crash if directory has no write permission
# there is also a limit of the length of file names so jump to the document directory
self.cwd = QtCore.QDir.currentPath()