From b9f4576dba033afcd6fe26b88cbf6d3c48d3bd78 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 16 Mar 2021 11:22:27 +0100 Subject: [PATCH 1/3] FEM: material task panel, small code improvements --- .../Fem/femtaskpanels/task_material_common.py | 52 +++++++------------ 1 file changed, 19 insertions(+), 33 deletions(-) diff --git a/src/Mod/Fem/femtaskpanels/task_material_common.py b/src/Mod/Fem/femtaskpanels/task_material_common.py index 81dbf355ea..ba33cf76b9 100644 --- a/src/Mod/Fem/femtaskpanels/task_material_common.py +++ b/src/Mod/Fem/femtaskpanels/task_material_common.py @@ -516,14 +516,15 @@ class _TaskPanel: self.material["SpecificHeat"] = "0 J/kg/K" FreeCAD.Console.PrintMessage("\n") - def update_material_property(self, input_field, matProperty, qUnit, variation=0.001): + def update_material_property(self, inputfield_text, matProperty, qUnit, variation=0.001): + # print(inputfield_text) # this update property works for all Gui::InputField widgets if qUnit != "": - value = Units.Quantity(input_field.text()).getValueAs(qUnit) + value = Units.Quantity(inputfield_text).getValueAs(qUnit) old_value = Units.Quantity(self.material[matProperty]).getValueAs(qUnit) else: # for example PoissonRatio - value = float(input_field.text()) + value = float(inputfield_text) old_value = float(self.material[matProperty]) if value: if not (1 - variation < float(old_value) / value < 1 + variation): @@ -540,40 +541,36 @@ class _TaskPanel: self.set_transient_material() else: pass # some check or default value set can be done here + # print(inputfield_text) # mechanical input fields def ym_changed(self): # FreeCADs standard unit for stress is kPa for UnitsSchemeInternal, but MPa can be used - input_field = self.parameterWidget.input_fd_young_modulus - variation = 0.001 self.update_material_property( - input_field, + self.parameterWidget.input_fd_young_modulus.text(), "YoungsModulus", "kPa", - variation ) def density_changed(self): + print( + "String read from density input field: {}" + .format(self.parameterWidget.input_fd_density.text()) + ) # FreeCADs standard unit for density is kg/mm^3 for UnitsSchemeInternal - input_field = self.parameterWidget.input_fd_density - variation = 0.001 self.update_material_property( - input_field, + self.parameterWidget.input_fd_density.text(), "Density", "kg/m^3", - variation ) def pr_changed(self): value = self.parameterWidget.spinBox_poisson_ratio.value() - input_field = self.parameterWidget.spinBox_poisson_ratio if value: - variation = 0.001 self.update_material_property( - input_field, + self.parameterWidget.spinBox_poisson_ratio.text(), "PoissonRatio", "", - variation ) elif value == 0: # PoissonRatio was set to 0.0 what is possible @@ -587,50 +584,39 @@ class _TaskPanel: # thermal input fields def tc_changed(self): - input_field = self.parameterWidget.input_fd_thermal_conductivity - variation = 0.001 self.update_material_property( - input_field, + self.parameterWidget.input_fd_thermal_conductivity.text(), "ThermalConductivity", "W/m/K", - variation ) def tec_changed(self): - input_field = self.parameterWidget.input_fd_expansion_coefficient - variation = 0.001 self.update_material_property( - input_field, + self.parameterWidget.input_fd_expansion_coefficient.text(), "ThermalExpansionCoefficient", "um/m/K", - variation ) def sh_changed(self): - input_field = self.parameterWidget.input_fd_specific_heat - variation = 0.001 self.update_material_property( - input_field, + self.parameterWidget.input_fd_specific_heat.text(), "SpecificHeat", "J/kg/K", - variation ) # fluidic input fields def vtec_changed(self): - input_field = self.parameterWidget.input_fd_vol_expansion_coefficient self.update_material_property( - input_field, + self.parameterWidget.input_fd_vol_expansion_coefficient.text(), "VolumetricThermalExpansionCoefficient", - "m^3/m^3/K" + "m^3/m^3/K", ) def kinematic_viscosity_changed(self): - input_field = self.parameterWidget.input_fd_kinematic_viscosity self.update_material_property( - input_field, + self.parameterWidget.input_fd_kinematic_viscosity.text(), "KinematicViscosity", - "m^2/s" + "m^2/s", ) def set_mat_params_in_input_fields(self, matmap): From bfdeaf6af39e7402f17b81212071fe549f2878de Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 16 Mar 2021 11:55:19 +0100 Subject: [PATCH 2/3] Update task_material_common.py --- .../Fem/femtaskpanels/task_material_common.py | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Mod/Fem/femtaskpanels/task_material_common.py b/src/Mod/Fem/femtaskpanels/task_material_common.py index ba33cf76b9..2855d73408 100644 --- a/src/Mod/Fem/femtaskpanels/task_material_common.py +++ b/src/Mod/Fem/femtaskpanels/task_material_common.py @@ -273,7 +273,7 @@ class _TaskPanel: return self.card_path = self.parameterWidget.cb_materials.itemData(index) # returns whole path FreeCAD.Console.PrintMessage( - "choose_material in FEM material task panel:\n" + "Material card choosen:\n" " {}\n".format(self.card_path) ) self.material = self.materials[self.card_path] @@ -389,7 +389,7 @@ class _TaskPanel: # FreeCAD units definition is at file end of src/Base/Unit.cpp if not self.material: FreeCAD.Console.PrintMessage("For some reason all material data is empty!\n") - self.material["Name"] = "Empty" + self.material["Name"] = "NoName" if "Density" in self.material: if "Density" not in str(Units.Unit(self.material["Density"])): FreeCAD.Console.PrintMessage( @@ -400,7 +400,7 @@ class _TaskPanel: self.material["Density"] = "0 kg/m^3" else: FreeCAD.Console.PrintMessage( - "Density not found in material data of: {}\n" + "Density not found in {}\n" .format(self.material["Name"]) ) self.material["Density"] = "0 kg/m^3" @@ -417,7 +417,7 @@ class _TaskPanel: self.material["YoungsModulus"] = "0 MPa" else: FreeCAD.Console.PrintMessage( - "YoungsModulus not found in material data of: {}\n" + "YoungsModulus not found in {}\n" .format(self.material["Name"]) ) self.material["YoungsModulus"] = "0 MPa" @@ -433,7 +433,7 @@ class _TaskPanel: self.material["PoissonRatio"] = "0" else: FreeCAD.Console.PrintMessage( - "PoissonRatio not found in material data of: {}\n" + "PoissonRatio not found in {}\n" .format(self.material["Name"]) ) self.material["PoissonRatio"] = "0" @@ -450,7 +450,7 @@ class _TaskPanel: self.material["KinematicViscosity"] = "0 m^2/s" else: FreeCAD.Console.PrintMessage( - "KinematicViscosity not found in material data of: {}\n" + "KinematicViscosity not found in {}\n" .format(self.material["Name"]) ) self.material["KinematicViscosity"] = "0 m^2/s" @@ -466,7 +466,7 @@ class _TaskPanel: self.material["VolumetricThermalExpansionCoefficient"] = "0 m^3/m^3/K" else: FreeCAD.Console.PrintMessage( - "VolumetricThermalExpansionCoefficient not found in material data of: {}\n" + "VolumetricThermalExpansionCoefficient not found in {}\n" .format(self.material["Name"]) ) self.material["VolumetricThermalExpansionCoefficient"] = "0 m^3/m^3/K" @@ -481,7 +481,7 @@ class _TaskPanel: self.material["ThermalConductivity"] = "0 W/m/K" else: FreeCAD.Console.PrintMessage( - "ThermalConductivity not found in material data of: {}\n" + "ThermalConductivity not found in {}\n" .format(self.material["Name"]) ) self.material["ThermalConductivity"] = "0 W/m/K" @@ -496,7 +496,7 @@ class _TaskPanel: self.material["ThermalExpansionCoefficient"] = "0 um/m/K" else: FreeCAD.Console.PrintMessage( - "ThermalExpansionCoefficient not found in material data of: {}\n" + "ThermalExpansionCoefficient not found in {}\n" .format(self.material["Name"]) ) self.material["ThermalExpansionCoefficient"] = "0 um/m/K" @@ -510,7 +510,7 @@ class _TaskPanel: self.material["SpecificHeat"] = "0 J/kg/K" else: FreeCAD.Console.PrintMessage( - "SpecificHeat not found in material data of: {}\n" + "SpecificHeat not found in {}\n" .format(self.material["Name"]) ) self.material["SpecificHeat"] = "0 J/kg/K" From 4561deb4faca8df963d9c78110d7cc123ba834e1 Mon Sep 17 00:00:00 2001 From: wmayer Date: Tue, 16 Mar 2021 16:01:43 +0100 Subject: [PATCH 3/3] Part: [skip ci] implement makeShellFromWires --- src/Mod/Part/App/AppPartPy.cpp | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/Mod/Part/App/AppPartPy.cpp b/src/Mod/Part/App/AppPartPy.cpp index 6387e8882a..afffec947d 100644 --- a/src/Mod/Part/App/AppPartPy.cpp +++ b/src/Mod/Part/App/AppPartPy.cpp @@ -89,6 +89,7 @@ # include # include #endif +# include #include #include @@ -455,6 +456,10 @@ public: "Create a ruled surface out of two edges or wires. If wires are used then" "these must have the same number of edges." ); + add_varargs_method("makeShellFromWires",&Module::makeShellFromWires, + "makeShellFromWires(Wires) -- Make a shell from wires.\n" + "The wires must have the same number of edges." + ); add_varargs_method("makeTube",&Module::makeTube, "makeTube(edge,radius,[continuity,max degree,max segments]) -- Create a tube.\n" "continuity is a string which must be 'C0','C1','C2','C3','CN','G1' or 'G1'," @@ -1630,6 +1635,30 @@ private: throw Py::Exception(PartExceptionOCCError, "creation of ruled surface failed"); } } + Py::Object makeShellFromWires(const Py::Tuple& args) + { + PyObject *pylist; + if (!PyArg_ParseTuple(args.ptr(), "O", &pylist)) + throw Py::Exception(); + + try { + BRepFill_Generator fill; + Py::Sequence list(pylist); + for (Py::Sequence::iterator it = list.begin(); it != list.end(); ++it) { + Py::TopoShape shape(*it); + const TopoDS_Shape& s = shape.extensionObject()->getTopoShapePtr()->getShape(); + if (!s.IsNull() && s.ShapeType() == TopAbs_WIRE) { + fill.AddWire(TopoDS::Wire(s)); + } + } + + fill.Perform(); + return Py::asObject(new TopoShapeShellPy(new TopoShape(fill.Shell()))); + } + catch (Standard_Failure&) { + throw Py::Exception(PartExceptionOCCError, "creation of shell failed"); + } + } Py::Object makeTube(const Py::Tuple& args) { PyObject *pshape;