FEM: python code formatting

This commit is contained in:
Bernd Hahnebach
2022-07-11 09:51:16 +02:00
parent 90b0d3253e
commit 41a8ed83af
16 changed files with 208 additions and 93 deletions

View File

@@ -47,7 +47,7 @@ def exportMeshToTetGenPoly(meshToExport, filePath, beVerbose=1):
"""Export mesh to TetGen *.poly file format"""
# ********** Part 1 - write node list to output file
if beVerbose == 1:
Console.PrintMessage("\nExport of mesh to TetGen file ...")
Console.PrintMessage("\nExport of mesh to TetGen file ...")
(allVertices, allFacets) = meshToExport.Topology
f = open(filePath, "w")
f.write("# This file was generated from FreeCAD geometry\n")

View File

@@ -215,9 +215,9 @@ def importFrd(
# see error message above for more information
if not res_obj:
if result_name_prefix:
results_name = ("{}_Results".format(result_name_prefix))
results_name = "{}_Results".format(result_name_prefix)
else:
results_name = ("Results".format(result_name_prefix))
results_name = "Results"
res_obj = ObjectsFem.makeResultMechanical(doc, results_name)
res_obj.Mesh = result_mesh_object
# TODO, node numbers in result obj could be set

View File

@@ -68,8 +68,8 @@ def insert(
# ********* module specific methods *********
def import_z88_disp(
filename,
analysis = None,
result_name_prefix = None
analysis=None,
result_name_prefix=None
):
"""insert a FreeCAD FEM mechanical result object in the ActiveDocument
pure usage:

View File

@@ -735,7 +735,7 @@ class GmshTools():
geo.write("\n")
cpu_count = os.cpu_count()
if cpu_count != None and cpu_count > 1:
if cpu_count is not None and cpu_count > 1:
geo.write("// enable multi-core processing\n")
geo.write(f"General.NumThreads = {cpu_count};\n")
geo.write("\n")

View File

@@ -27,10 +27,12 @@ __url__ = "https://www.freecadweb.org"
## \addtogroup FEM
# @{
import numpy as np
import FreeCAD
from femtools import geomtools
import numpy as np
# ************************************************************************************************
def get_femnodes_by_femobj_with_references(
@@ -485,7 +487,10 @@ def get_femelement_sets(
# fem_objects = FreeCAD FEM document objects
# get femelements for reference shapes of each obj.References
count_femelements = 0
referenced_femelements = np.zeros((max(femelement_table.keys())+1,),dtype=np.int)
referenced_femelements = np.zeros(
(max(femelement_table.keys()) + 1,),
dtype=np.int
)
has_remaining_femelements = None
for fem_object_i, fem_object in enumerate(fem_objects):
obj = fem_object["Object"]
@@ -515,7 +520,9 @@ def get_femelement_sets(
femelement_table_array = np.zeros_like(referenced_femelements)
femelement_table_array[list(femelement_table.keys())] = 1
remaining_femelements_array = femelement_table_array > referenced_femelements
remaining_femelements = [ i.item() for i in np.nditer(remaining_femelements_array.nonzero()) ]
remaining_femelements = [
i.item() for i in np.nditer(remaining_femelements_array.nonzero())
]
count_femelements += len(remaining_femelements)
for fem_object in fem_objects:
obj = fem_object["Object"]
@@ -933,7 +940,7 @@ def get_force_obj_edge_nodeload_table(
# try debugging of the last bad refedge
FreeCAD.Console.PrintMessage("DEBUGGING\n")
FreeCAD.Console.PrintMessage("\n".format(bad_refedge))
FreeCAD.Console.PrintMessage("{}\n".format(bad_refedge))
FreeCAD.Console.PrintMessage("bad_refedge_nodes\n")
bad_refedge_nodes = femmesh.getNodesByEdge(bad_refedge)
@@ -949,7 +956,7 @@ def get_force_obj_edge_nodeload_table(
FreeCAD.Console.PrintMessage("{}\n".format(len(bad_edge_table)))
bad_edge_table_nodes = []
for elem in bad_edge_table:
FreeCAD.Console.PrintMessage(elem, " --> \n".format(bad_edge_table[elem]))
FreeCAD.Console.PrintMessage(elem, " --> {}\n".format(bad_edge_table[elem]))
for node in bad_edge_table[elem]:
if node not in bad_edge_table_nodes:
bad_edge_table_nodes.append(node)
@@ -1997,7 +2004,7 @@ def get_reference_group_elements(
FreeCAD.Console.PrintError(
"Error, two refshapes in References with different ShapeTypes.\n"
)
FreeCAD.Console.PrintLog("\n".format(ref_shape))
FreeCAD.Console.PrintLog("{}\n".format(ref_shape))
found_element = geomtools.find_element_in_shape(aShape, ref_shape)
if found_element is not None:
elements.append(found_element)
@@ -2162,8 +2169,8 @@ def sortlistoflistvalues(
listoflists
):
new_list = []
for l in listoflists:
new_list.append(sorted(l))
for li in listoflists:
new_list.append(sorted(li))
return new_list
@@ -2213,7 +2220,7 @@ def is_zplane_2D_mesh(
for n in femmesh.Nodes:
z = femmesh.Nodes[n].z
if ((0 - tol) < z < (0 + tol)) is not True:
return False
return False
return True
else:
return False

View File

@@ -30,7 +30,6 @@ __url__ = "https://www.freecadweb.org"
# \ingroup FEM
# \brief constraint electrostatic potential object
from FreeCAD import Units
from . import base_fempythonobject

View File

@@ -37,7 +37,7 @@ def write_femelement_geometry(f, ccxwriter):
elsetdef = "ELSET={}, ".format(matgeoset["ccx_elset_name"])
material = "MATERIAL={}".format(matgeoset["mat_obj_name"])
if "beamsection_obj"in matgeoset: # beam mesh
if "beamsection_obj" in matgeoset: # beam mesh
beamsec_obj = matgeoset["beamsection_obj"]
beam_axis_m = matgeoset["beam_axis_m"]
# in CalxuliX called the 1direction

View File

@@ -289,11 +289,11 @@ class Writer(object):
self._simulation("Coordinate System", "Cartesian 3D")
self._simulation("Coordinate Mapping", (1, 2, 3))
# not necessary anymore since we use SI units
#if self.unit_schema == Units.Scheme.SI2:
#self._simulation("Coordinate Scaling", 0.001)
# Console.PrintMessage(
# "'Coordinate Scaling = Real 0.001' was inserted into the solver input file.\n"
# )
# if self.unit_schema == Units.Scheme.SI2:
# self._simulation("Coordinate Scaling", 0.001)
# Console.PrintMessage(
# "'Coordinate Scaling = Real 0.001' was inserted into the solver input file.\n"
# )
self._simulation("Simulation Type", "Steady state")
self._simulation("Steady State Max Iterations", 1)
self._simulation("Output Intervals", 1)

View File

@@ -44,6 +44,7 @@ from femtools import membertools
SOLVER_TYPES = ["sorcg", "siccg", "choly"]
class Check(run.Check):
def run(self):
@@ -103,7 +104,7 @@ class Solve(run.Solve):
binary = settings.get_binary("Z88")
if binary is None:
self.fail() # a print has been made in settings module
prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Fem/Z88")
solver = SOLVER_TYPES
solver = prefs.GetInt("Solver", 0)

View File

@@ -33,6 +33,7 @@ __url__ = "https://www.freecadweb.org"
import FreeCAD
import FreeCADGui
from femguiutils import selection_widgets
from femtools import femutils
from femtools import membertools
@@ -111,7 +112,7 @@ class _TaskPanel(object):
not self._paramWidget.capacitanceBodyBox.isChecked())
def _applyWidgetChanges(self):
unit = "V"
# unit = "V"
self._obj.PotentialEnabled = \
not self._paramWidget.potentialBox.isChecked()
if self._obj.PotentialEnabled:

View File

@@ -206,9 +206,9 @@ class _TaskPanel:
def accept(self):
# print(self.material)
if self.material == {}: # happens if material editor was canceled
FreeCAD.Console.PrintError("Empty material dictionary, nothing was changed.\n")
self.recompute_and_set_back_all()
return True
FreeCAD.Console.PrintError("Empty material dictionary, nothing was changed.\n")
self.recompute_and_set_back_all()
return True
if self.selectionWidget.has_equal_references_shape_types():
self.do_not_set_thermal_zeros()
from materialtools.cardutils import check_mat_units as checkunits
@@ -488,7 +488,8 @@ class _TaskPanel:
self.material["VolumetricThermalExpansionCoefficient"] = "0 1/K"
else:
if "ThermalExpansionCoefficient" in self.material:
self.material["VolumetricThermalExpansionCoefficient"] = self.material["ThermalExpansionCoefficient"]
the_index = "VolumetricThermalExpansionCoefficient" # line was to long
self.material[the_index] = self.material["ThermalExpansionCoefficient"]
else:
self.material["VolumetricThermalExpansionCoefficient"] = "0 1/K"
# Thermal properties

View File

@@ -46,7 +46,6 @@ from PySide.QtGui import QApplication
import FreeCAD
import FreeCADGui
import FemGui
import femresult.resulttools as resulttools
@@ -287,7 +286,12 @@ class _TaskPanel:
def abs_displacement_selected(self, state):
if len(self.result_obj.DisplacementLengths) > 0:
self.result_selected("Uabs", self.result_obj.DisplacementLengths, "mm", translate("FEM","Displacement Magnitude"))
self.result_selected(
"Uabs",
self.result_obj.DisplacementLengths,
"mm",
translate("FEM", "Displacement Magnitude")
)
else:
self.result_widget.rb_none.setChecked(True)
self.none_selected(True)
@@ -297,7 +301,12 @@ class _TaskPanel:
res_disp_u1 = self.get_scalar_disp_list(
self.result_obj.DisplacementVectors, 0
)
self.result_selected("U1", res_disp_u1, "mm", translate("FEM","Displacement X"))
self.result_selected(
"U1",
res_disp_u1,
"mm",
translate("FEM", "Displacement X")
)
else:
self.result_widget.rb_none.setChecked(True)
self.none_selected(True)
@@ -307,7 +316,12 @@ class _TaskPanel:
res_disp_u2 = self.get_scalar_disp_list(
self.result_obj.DisplacementVectors, 1
)
self.result_selected("U2", res_disp_u2, "mm", translate("FEM","Displacement Y"))
self.result_selected(
"U2",
res_disp_u2,
"mm",
translate("FEM", "Displacement Y")
)
else:
self.result_widget.rb_none.setChecked(True)
self.none_selected(True)
@@ -317,63 +331,108 @@ class _TaskPanel:
res_disp_u3 = self.get_scalar_disp_list(
self.result_obj.DisplacementVectors, 2
)
self.result_selected("U3", res_disp_u3, "mm", translate("FEM","Displacement Z"))
self.result_selected(
"U3",
res_disp_u3,
"mm",
translate("FEM", "Displacement Z")
)
else:
self.result_widget.rb_none.setChecked(True)
self.none_selected(True)
def vm_stress_selected(self, state):
if len(self.result_obj.vonMises) > 0:
self.result_selected("Sabs", self.result_obj.vonMises, "MPa", translate("FEM","von Mises Stress"))
self.result_selected(
"Sabs",
self.result_obj.vonMises,
"MPa",
translate("FEM", "von Mises Stress")
)
else:
self.result_widget.rb_none.setChecked(True)
self.none_selected(True)
def max_shear_selected(self, state):
if len(self.result_obj.MaxShear) > 0:
self.result_selected("MaxShear", self.result_obj.MaxShear, "MPa", translate("FEM","Max Shear Stress"))
self.result_selected(
"MaxShear",
self.result_obj.MaxShear,
"MPa",
translate("FEM", "Max Shear Stress")
)
else:
self.result_widget.rb_none.setChecked(True)
self.none_selected(True)
def max_prin_selected(self, state):
if len(self.result_obj.PrincipalMax) > 0:
self.result_selected("MaxPrin", self.result_obj.PrincipalMax, "MPa", translate("FEM","Max Principal Stress"))
self.result_selected(
"MaxPrin",
self.result_obj.PrincipalMax,
"MPa",
translate("FEM", "Max Principal Stress")
)
else:
self.result_widget.rb_none.setChecked(True)
self.none_selected(True)
def temperature_selected(self, state):
if len(self.result_obj.Temperature) > 0:
self.result_selected("Temp", self.result_obj.Temperature, "K", translate("FEM","Temperature"))
self.result_selected(
"Temp",
self.result_obj.Temperature,
"K",
translate("FEM", "Temperature")
)
else:
self.result_widget.rb_none.setChecked(True)
self.none_selected(True)
def massflowrate_selected(self, state):
if len(self.result_obj.MassFlowRate) > 0:
self.result_selected("MFlow", self.result_obj.MassFlowRate, "kg/s", translate("FEM","Mass Flow Rate"))
self.result_selected(
"MFlow",
self.result_obj.MassFlowRate,
"kg/s",
translate("FEM", "Mass Flow Rate")
)
else:
self.result_widget.rb_none.setChecked(True)
self.none_selected(True)
def networkpressure_selected(self, state):
if len(self.result_obj.NetworkPressure) > 0:
self.result_selected("NPress", self.result_obj.NetworkPressure, "MPa", translate("FEM","Network Pressure"))
self.result_selected(
"NPress",
self.result_obj.NetworkPressure,
"MPa",
translate("FEM", "Network Pressure")
)
else:
self.result_widget.rb_none.setChecked(True)
self.none_selected(True)
def min_prin_selected(self, state):
if len(self.result_obj.PrincipalMin) > 0:
self.result_selected("MinPrin", self.result_obj.PrincipalMin, "MPa", translate("FEM","Min Principal Stress"))
self.result_selected(
"MinPrin",
self.result_obj.PrincipalMin,
"MPa",
translate("FEM", "Min Principal Stress")
)
else:
self.result_widget.rb_none.setChecked(True)
self.none_selected(True)
def peeq_selected(self, state):
if len(self.result_obj.Peeq) > 0:
self.result_selected("Peeq", self.result_obj.Peeq, "", translate("FEM","Equivalent Plastic Strain"))
self.result_selected(
"Peeq",
self.result_obj.Peeq,
"",
translate("FEM", "Equivalent Plastic Strain")
)
else:
self.result_widget.rb_none.setChecked(True)
self.none_selected(True)
@@ -392,8 +451,8 @@ class _TaskPanel:
else:
QtGui.QMessageBox.information(
None,
self.result_obj.Label + " - " + translate("FEM","Information"),
translate("FEM","No histogram available.\nPlease select a result type first.")
self.result_obj.Label + " - " + translate("FEM", "Information"),
translate("FEM", "No histogram available.\nPlease select a result type first.")
)
def user_defined_text(self, equation):
@@ -503,12 +562,12 @@ class _TaskPanel:
if len(plt.get_fignums()) > 0:
plt.close()
plt.ioff() # disable interactive mode so we have full control when plot is shown
plt.ioff() # disable interactive mode so we have full control when plot is shown
plt.figure(res_title)
plt.hist(res_values, bins=50, alpha=0.5, facecolor="blue")
plt.xlabel(res_unit)
plt.title(translate("FEM","Histogram of {}").format(res_title))
plt.ylabel(translate("FEM","Nodes"))
plt.title(translate("FEM", "Histogram of {}").format(res_title))
plt.ylabel(translate("FEM", "Nodes"))
plt.grid(True)
fig_manager = plt.get_current_fig_manager()
# Lines below tells Qt that plot widget/dialog should be kept on top of its parent,
@@ -628,25 +687,49 @@ class _TaskPanel:
self.suitable_results = False
self.disable_empty_result_buttons()
if self.mesh_obj.FemMesh.NodeCount == 0:
error_message = (
translate("FEM","FEM: there are no nodes in result mesh, there will be nothing to show.") + "\n"
)
FreeCAD.Console.PrintError(error_message)
QtGui.QMessageBox.critical(None, translate("FEM","Empty result mesh"), error_message)
the_error_messagetext = (
"FEM: there are no nodes in result mesh, "
"there will be nothing to show."
)
error_message = (
translate("FEM", the_error_messagetext) + "\n"
)
FreeCAD.Console.PrintError(error_message)
QtGui.QMessageBox.critical(
None,
translate("FEM", "Empty result mesh"),
error_message
)
elif (self.mesh_obj.FemMesh.NodeCount == len(self.result_obj.NodeNumbers)):
self.suitable_results = True
hide_parts_constraints()
else:
if not self.mesh_obj.FemMesh.VolumeCount:
the_error_messagetext = (
"FEM: Graphical bending stress output "
"for beam or shell FEM Meshes not yet supported."
)
error_message = (
translate("FEM","FEM: Graphical bending stress output for beam or shell FEM Meshes not yet supported.") + "\n"
translate("FEM", the_error_messagetext) + "\n"
)
FreeCAD.Console.PrintError(error_message)
QtGui.QMessageBox.critical(None, translate("FEM","No result object"), error_message)
QtGui.QMessageBox.critical(
None,
translate("FEM", "No result object"),
error_message
)
else:
error_message = translate("FEM","FEM: Result node numbers are not equal to FEM Mesh NodeCount.") + "\n"
the_error_messagetext = (
"FEM: Result node numbers are "
"not equal to FEM Mesh NodeCount."
)
error_message = translate("FEM", the_error_messagetext) + "\n"
FreeCAD.Console.PrintError(error_message)
QtGui.QMessageBox.critical(None, translate("FEM","No result object"), error_message)
QtGui.QMessageBox.critical(
None,
translate("FEM", "No result object"),
error_message
)
def reset_mesh_color(self):
self.mesh_obj.ViewObject.NodeColor = {}

View File

@@ -247,12 +247,14 @@ class _TaskPanel:
self.form.pb_run_ccx.setText("Break CalculiX")
def calculixStateChanged(self, newState):
if (newState == QtCore.QProcess.ProcessState.Starting):
self.femConsoleMessage("Starting CalculiX...")
if (newState == QtCore.QProcess.ProcessState.Running):
self.femConsoleMessage("CalculiX is running...")
if (newState == QtCore.QProcess.ProcessState.NotRunning):
self.femConsoleMessage("CalculiX stopped.")
if newState == QtCore.QProcess.ProcessState.Starting:
self.femConsoleMessage("Starting CalculiX...")
elif newState == QtCore.QProcess.ProcessState.Running:
self.femConsoleMessage("CalculiX is running...")
elif newState == QtCore.QProcess.ProcessState.NotRunning:
self.femConsoleMessage("CalculiX stopped.")
else:
self.femConsoleMessage("Problems.")
def calculixFinished(self, exitCode):
# print("calculixFinished(), exit code: {}".format(exitCode))
@@ -387,7 +389,7 @@ class _TaskPanel:
env.insert("OMP_NUM_THREADS", str(num_cpu_pref))
else:
cpu_count = os.cpu_count()
if cpu_count != None and cpu_count > 1:
if cpu_count is not None and cpu_count > 1:
env.insert("OMP_NUM_THREADS", str(cpu_count))
self.Calculix.setProcessEnvironment(env)

View File

@@ -88,14 +88,14 @@ def get_defmake_count(
modfile = open(name_modfile, "r")
lines_modefile = modfile.readlines()
modfile.close()
lines_defmake = [l for l in lines_modefile if l.startswith("def make")]
lines_defmake = [li for li in lines_modefile if li.startswith("def make")]
if not fem_vtk_post:
# FEM VTK post processing is disabled
# we are not able to create VTK post objects
new_lines = []
for l in lines_defmake:
if "PostVtk" not in l:
new_lines.append(l)
for li in lines_defmake:
if "PostVtk" not in li:
new_lines.append(li)
lines_defmake = new_lines
return len(lines_defmake)
@@ -196,23 +196,23 @@ def compare_inp_files(
# for python3 problem with 1DFlow input
# TODO as soon as the 1DFlow result reading is fixed
# this should be triggered in the 1DFlow unit test
lf1 = [l for l in f1 if not (
l.startswith("** written ") or l.startswith("** file ") or l.startswith("17671.0,1")
lf1 = [li for li in f1 if not (
li.startswith("** written ") or li.startswith("** file ") or li.startswith("17671.0,1")
)]
lf1 = force_unix_line_ends(lf1)
file2 = open(file_name2, "r")
f2 = file2.readlines()
file2.close()
# TODO see comment on file1
lf2 = [l for l in f2 if not (
l.startswith("** written ") or l.startswith("** file ") or l.startswith("17671.0,1")
lf2 = [li for li in f2 if not (
li.startswith("** written ") or li.startswith("** file ") or li.startswith("17671.0,1")
)]
lf2 = force_unix_line_ends(lf2)
import difflib
diff = difflib.unified_diff(lf1, lf2, n=0)
result = ""
for l in diff:
result += l
for li in diff:
result += li
if result:
result = (
"Comparing {} to {} failed!\n"
@@ -234,22 +234,28 @@ def compare_files(
# workaround to compare geos of elmer test and temporary file path
# (not only names change, path changes with operating system)
lf1 = [l for l in f1 if not (
l.startswith('Merge "') or l.startswith('Save "') or l.startswith("// ") or l.startswith("General.NumThreads")
lf1 = [li for li in f1 if not (
li.startswith('Merge "')
or li.startswith('Save "')
or li.startswith("// ")
or li.startswith("General.NumThreads")
)]
lf1 = force_unix_line_ends(lf1)
file2 = open(file_name2, "r")
f2 = file2.readlines()
file2.close()
lf2 = [l for l in f2 if not (
l.startswith('Merge "') or l.startswith('Save "') or l.startswith("// ") or l.startswith("General.NumThreads")
lf2 = [li for li in f2 if not (
li.startswith('Merge "')
or li.startswith('Save "')
or li.startswith("// ")
or li.startswith("General.NumThreads")
)]
lf2 = force_unix_line_ends(lf2)
import difflib
diff = difflib.unified_diff(lf1, lf2, n=0)
result = ""
for l in diff:
result += l
for li in diff:
result += li
if result:
result = "Comparing {} to {} failed!\n".format(file_name1, file_name2) + result
return result
@@ -301,10 +307,10 @@ def compare_stats(
# get stats to compare with, the expected ones
sf = open(stat_file, "r")
sf_content = []
for l in sf.readlines():
for li in sf.readlines():
for st in loc_stat_types:
if l.startswith(st):
sf_content.append(l)
if li.startswith(st):
sf_content.append(li)
sf.close()
sf_content = force_unix_line_ends(sf_content)
if sf_content == []:

View File

@@ -115,8 +115,8 @@ class VPMeshGmsh:
found_an_analysis = False
for o in gui_doc.Document.Objects:
if o.isDerivedFrom("Fem::FemAnalysisPython"):
found_an_analysis = True
break
found_an_analysis = True
break
if found_an_analysis:
if FemGui.getActiveAnalysis() is not None:
if FemGui.getActiveAnalysis().Document is FreeCAD.ActiveDocument:
@@ -206,12 +206,20 @@ class VPMeshGmsh:
children = self.claimChildren()
if len(children) > 0:
# issue a warning
bodyMessage = "The mesh contains submesh objects, therefore the\nfollowing referencing objects might be lost:\n"
message_text = (
"The mesh contains submesh objects, therefore the\n"
"following referencing objects might be lost:\n"
)
for obj in children:
bodyMessage += "\n" + obj.Label
bodyMessage += "\n\nAre you sure you want to continue?"
reply = QtGui.QMessageBox.warning(None, "Object dependencies", bodyMessage,
QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.No)
message_text += "\n" + obj.Label
message_text += "\n\nAre you sure you want to continue?"
reply = QtGui.QMessageBox.warning(
None,
"Object dependencies",
message_text,
QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
QtGui.QMessageBox.No
)
if reply == QtGui.QMessageBox.Yes:
return True
else:

View File

@@ -30,7 +30,6 @@ __url__ = "https://www.freecadweb.org"
# \ingroup FEM
# \brief view provider for mechanical ResultObjectPython
import FreeCAD
import FreeCADGui
from PySide import QtGui
@@ -63,16 +62,24 @@ class VPResultMechanical(view_base_femconstraint.VPBaseFemConstraint):
def onDelete(self, feature, subelements):
children = self.claimChildren()
filtered = filter(lambda obj: not obj is None, children)
filtered = filter(lambda obj: obj is not None, children)
children = list(filtered)
if len(children) > 0:
# issue a warning
bodyMessage = "The results object is not empty, therefore the\nfollowing referencing objects might be lost:\n"
bodyMessage = (
"The results object is not empty, therefore the\n"
"following referencing objects might be lost:\n"
)
for obj in children:
bodyMessage += "\n" + obj.Label
bodyMessage += "\n\nAre you sure you want to continue?"
reply = QtGui.QMessageBox.warning(None, "Object dependencies", bodyMessage,
QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.No)
reply = QtGui.QMessageBox.warning(
None,
"Object dependencies",
bodyMessage,
QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
QtGui.QMessageBox.No
)
if reply == QtGui.QMessageBox.Yes:
return True
else: