FEM: python code formatting
This commit is contained in:
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -30,7 +30,6 @@ __url__ = "https://www.freecadweb.org"
|
||||
# \ingroup FEM
|
||||
# \brief constraint electrostatic potential object
|
||||
|
||||
from FreeCAD import Units
|
||||
from . import base_fempythonobject
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 = {}
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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 == []:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user