diff --git a/lgtm.yml b/lgtm.yml index f2d2cd4f17..47ec247e19 100644 --- a/lgtm.yml +++ b/lgtm.yml @@ -12,12 +12,16 @@ path_classifiers: - "src/CXX/" template: - "src/Tools/examplePy2wiki.py" + - "src/Mode/TemplatePyMod/" unmaintained: - "src/Mod/Robot/" - "src/Mod/Ship/" legacy: - "src/Mod/Assembly/" - "src/Mod/Drawing/" + - "src/Mod/Raytracing/" + - "src/Mod/Spreadsheet/App/Spreadsheet_legacy.py" + - "src/Mod/OpenSCAD/prototype.py" extraction: javascript: diff --git a/src/Mod/Fem/Gui/Resources/ui/MeshGmsh.ui b/src/Mod/Fem/Gui/Resources/ui/MeshGmsh.ui index 249eee0c5a..5262965ca8 100644 --- a/src/Mod/Fem/Gui/Resources/ui/MeshGmsh.ui +++ b/src/Mod/Fem/Gui/Resources/ui/MeshGmsh.ui @@ -7,7 +7,7 @@ 0 0 400 - 439 + 475 @@ -41,14 +41,14 @@ - + Max element size (0.0 = Auto): - + @@ -85,14 +85,14 @@ - + Min element size (0.0 = Auto): - + @@ -129,6 +129,16 @@ + + + + + + + Mesh order + + + @@ -153,6 +163,13 @@ + + + + QTextEdit::NoWrap + + + @@ -165,26 +182,6 @@ - - - - QTextEdit::NoWrap - - - - - - - - 0 - 0 - - - - Gmsh version - - - @@ -198,7 +195,20 @@ - + + + + + 0 + 0 + + + + Gmsh version + + + + diff --git a/src/Mod/Fem/femguiutils/selection_widgets.py b/src/Mod/Fem/femguiutils/selection_widgets.py index d810b7154c..74cb0db220 100644 --- a/src/Mod/Fem/femguiutils/selection_widgets.py +++ b/src/Mod/Fem/femguiutils/selection_widgets.py @@ -231,7 +231,7 @@ class SmallListView(QtGui.QListView): class GeometryElementsSelection(QtGui.QWidget): - def __init__(self, ref, eltypes=[], multigeom=True): + def __init__(self, ref, eltypes=[], multigeom, showHintEmptyList): super(GeometryElementsSelection, self).__init__() # init ui stuff FreeCADGui.Selection.clearSelection() @@ -240,6 +240,7 @@ class GeometryElementsSelection(QtGui.QWidget): self.obj_notvisible = [] self.initElemTypes(eltypes) self.allow_multiple_geom_types = multigeom + self.showHintEmptyList = showHintEmptyList # print(self.allow_multiple_geom_types) self.initUI() # set references and fill the list widget @@ -276,11 +277,20 @@ class GeometryElementsSelection(QtGui.QWidget): # label self._helpTextLbl = QtGui.QLabel() self._helpTextLbl.setWordWrap(True) - self._helpTextLbl.setText(self.tr( - 'Click on "Add" and select geometric elements to add them to the list. ' - "If no geometry is added to the list, all remaining ones are used. " - "The following geometry elements are allowed to select: " - ) + self.sel_elem_text) + helpTextPart1 = self.tr('Click on "Add" and select geometric elements to add them to the list.') + helpTextPart2 = self.tr("The following geometry elements are allowed to select: ") + self.sel_elem_text + helpTextPart3 = self.tr("If no geometry is added to the list, all remaining ones are used.") + if self.showHintEmptyList is True: + self._helpTextLbl.setText( + helpTextPart1 + "\n" + + helpTextPart2 + "\n" + + helpTextPart3 + ) + else: + self._helpTextLbl.setText( + helpTextPart1 + "\n" + + helpTextPart2 + ) # list self.list_References = QtGui.QListWidget() # radiobutton down the list diff --git a/src/Mod/Fem/femmesh/gmshtools.py b/src/Mod/Fem/femmesh/gmshtools.py index 145fad294d..72b329a72e 100644 --- a/src/Mod/Fem/femmesh/gmshtools.py +++ b/src/Mod/Fem/femmesh/gmshtools.py @@ -101,6 +101,8 @@ class GmshTools(): self.algorithm2D = "7" elif algo2D == "DelQuad": self.algorithm2D = "8" + elif algo2D == "Packing Parallelograms": + self.algorithm2D = "9" else: self.algorithm2D = "2" @@ -114,14 +116,12 @@ class GmshTools(): self.algorithm3D = "2" elif algo3D == "Frontal": self.algorithm3D = "4" - elif algo3D == "Frontal Delaunay": - self.algorithm3D = "5" - elif algo3D == "Frontal Hex": - self.algorithm3D = "6" elif algo3D == "MMG3D": self.algorithm3D = "7" elif algo3D == "R-tree": self.algorithm3D = "9" + elif algo3D == "HXT": + self.algorithm3D = "10" else: self.algorithm3D = "1" @@ -803,7 +803,7 @@ class GmshTools(): ) geo.write( "// 2D mesh algorithm (1=MeshAdapt, 2=Automatic, " - "5=Delaunay, 6=Frontal, 7=BAMG, 8=DelQuad)\n" + "5=Delaunay, 6=Frontal, 7=BAMG, 8=DelQuad, 9=Packing Parallelograms)\n" ) if len(self.bl_setting_list) and self.dimension == 3: geo.write("Mesh.Algorithm = " + "DelQuad" + ";\n") # Frontal/DelQuad are tested @@ -811,7 +811,7 @@ class GmshTools(): geo.write("Mesh.Algorithm = " + self.algorithm2D + ";\n") geo.write( "// 3D mesh algorithm (1=Delaunay, 2=New Delaunay, 4=Frontal, " - "5=Frontal Delaunay, 6=Frontal Hex, 7=MMG3D, 9=R-tree)\n" + "7=MMG3D, 9=R-tree, 10=HTX)\n" ) geo.write("Mesh.Algorithm3D = " + self.algorithm3D + ";\n") geo.write("\n") diff --git a/src/Mod/Fem/femobjects/mesh_gmsh.py b/src/Mod/Fem/femobjects/mesh_gmsh.py index 9cf8bc66a3..81685c5d96 100644 --- a/src/Mod/Fem/femobjects/mesh_gmsh.py +++ b/src/Mod/Fem/femobjects/mesh_gmsh.py @@ -48,17 +48,17 @@ class MeshGmsh(base_fempythonobject.BaseFemPythonObject): "Delaunay", "Frontal", "BAMG", - "DelQuad" + "DelQuad", + "Packing Parallelograms" ] known_mesh_algorithm_3D = [ "Automatic", "Delaunay", "New Delaunay", "Frontal", - "Frontal Delaunay", - "Frontal Hex", "MMG3D", - "R-tree" + "R-tree", + "HXT" ] def __init__(self, obj): @@ -67,6 +67,9 @@ class MeshGmsh(base_fempythonobject.BaseFemPythonObject): def onDocumentRestored(self, obj): self.add_properties(obj) + # refresh the list of known 3D algorithms for existing meshes + # since some algos are meanwhile deprecated and new algos are available + obj.Algorithm3D = MeshGmsh.known_mesh_algorithm_3D def add_properties(self, obj): if not hasattr(obj, "MeshBoundaryLayerList"): diff --git a/src/Mod/Fem/femtaskpanels/task_constraint_sectionprint.py b/src/Mod/Fem/femtaskpanels/task_constraint_sectionprint.py index 7a25b62ea2..56e10e60b7 100644 --- a/src/Mod/Fem/femtaskpanels/task_constraint_sectionprint.py +++ b/src/Mod/Fem/femtaskpanels/task_constraint_sectionprint.py @@ -55,7 +55,9 @@ class _TaskPanel: # geometry selection widget self.selectionWidget = selection_widgets.GeometryElementsSelection( obj.References, - ["Face"] + ["Face"], + False, + False ) # form made from param and selection widget diff --git a/src/Mod/Fem/femtaskpanels/task_constraint_tie.py b/src/Mod/Fem/femtaskpanels/task_constraint_tie.py index db12f9f30e..84241ad53c 100644 --- a/src/Mod/Fem/femtaskpanels/task_constraint_tie.py +++ b/src/Mod/Fem/femtaskpanels/task_constraint_tie.py @@ -61,7 +61,9 @@ class _TaskPanel: # geometry selection widget self.selectionWidget = selection_widgets.GeometryElementsSelection( obj.References, - ["Face"] + ["Face"], + False, + False ) # form made from param and selection widget diff --git a/src/Mod/Fem/femtaskpanels/task_element_fluid1D.py b/src/Mod/Fem/femtaskpanels/task_element_fluid1D.py index 4c2122440c..6eaf6b2230 100644 --- a/src/Mod/Fem/femtaskpanels/task_element_fluid1D.py +++ b/src/Mod/Fem/femtaskpanels/task_element_fluid1D.py @@ -232,7 +232,10 @@ class _TaskPanel: # geometry selection widget self.selectionWidget = selection_widgets.GeometryElementsSelection( - obj.References, ["Edge"] + obj.References, + ["Edge"], + False, + True ) # form made from param and selection widget diff --git a/src/Mod/Fem/femtaskpanels/task_element_geometry1D.py b/src/Mod/Fem/femtaskpanels/task_element_geometry1D.py index b7a67eadae..80f7e25a5c 100644 --- a/src/Mod/Fem/femtaskpanels/task_element_geometry1D.py +++ b/src/Mod/Fem/femtaskpanels/task_element_geometry1D.py @@ -91,7 +91,9 @@ class _TaskPanel: # geometry selection widget self.selectionWidget = selection_widgets.GeometryElementsSelection( obj.References, - ["Edge"] + ["Edge"], + False, + True ) # form made from param and selection widget diff --git a/src/Mod/Fem/femtaskpanels/task_element_geometry2D.py b/src/Mod/Fem/femtaskpanels/task_element_geometry2D.py index ea5adb6329..b0ac865f9f 100644 --- a/src/Mod/Fem/femtaskpanels/task_element_geometry2D.py +++ b/src/Mod/Fem/femtaskpanels/task_element_geometry2D.py @@ -60,7 +60,9 @@ class _TaskPanel: # geometry selection widget self.selectionWidget = selection_widgets.GeometryElementsSelection( obj.References, - ["Face"] + ["Face"], + False, + True ) # form made from param and selection widget diff --git a/src/Mod/Fem/femtaskpanels/task_element_rotation1D.py b/src/Mod/Fem/femtaskpanels/task_element_rotation1D.py index c755ce6e26..85ef6a780b 100644 --- a/src/Mod/Fem/femtaskpanels/task_element_rotation1D.py +++ b/src/Mod/Fem/femtaskpanels/task_element_rotation1D.py @@ -61,7 +61,9 @@ class _TaskPanel: # geometry selection widget self.selectionWidget = selection_widgets.GeometryElementsSelection( obj.References, - ["Edge"] + ["Edge"], + False, + True ) # form made from param and selection widget diff --git a/src/Mod/Fem/femtaskpanels/task_material_common.py b/src/Mod/Fem/femtaskpanels/task_material_common.py index a11c36b7fa..3071cd00ed 100644 --- a/src/Mod/Fem/femtaskpanels/task_material_common.py +++ b/src/Mod/Fem/femtaskpanels/task_material_common.py @@ -192,7 +192,8 @@ class _TaskPanel: self.selectionWidget = selection_widgets.GeometryElementsSelection( obj.References, ["Solid", "Face", "Edge"], - False + False, + True ) # start with Solid in list! # form made from param and selection widget diff --git a/src/Mod/Fem/femtaskpanels/task_mesh_boundarylayer.py b/src/Mod/Fem/femtaskpanels/task_mesh_boundarylayer.py index c53e30f86c..f92a68c2a6 100644 --- a/src/Mod/Fem/femtaskpanels/task_mesh_boundarylayer.py +++ b/src/Mod/Fem/femtaskpanels/task_mesh_boundarylayer.py @@ -72,7 +72,9 @@ class _TaskPanel: # start with Solid in list! self.selectionWidget = selection_widgets.GeometryElementsSelection( obj.References, - ["Solid", "Face", "Edge", "Vertex"] + ["Solid", "Face", "Edge", "Vertex"], + True, + False ) # form made from param and selection widget diff --git a/src/Mod/Fem/femtaskpanels/task_mesh_gmsh.py b/src/Mod/Fem/femtaskpanels/task_mesh_gmsh.py index 21778d7ad5..a82edcdeb9 100644 --- a/src/Mod/Fem/femtaskpanels/task_mesh_gmsh.py +++ b/src/Mod/Fem/femtaskpanels/task_mesh_gmsh.py @@ -77,6 +77,11 @@ class _TaskPanel: QtCore.SIGNAL("activated(int)"), self.choose_dimension ) + QtCore.QObject.connect( + self.form.cb_order, + QtCore.SIGNAL("activated(int)"), + self.choose_order + ) QtCore.QObject.connect( self.Timer, QtCore.SIGNAL("timeout()"), @@ -92,6 +97,10 @@ class _TaskPanel: mesh_gmsh.MeshGmsh.known_element_dimensions ) + self.form.cb_order.addItems( + mesh_gmsh.MeshGmsh.known_element_orders + ) + self.get_mesh_params() self.get_active_analysis() self.update() @@ -126,11 +135,13 @@ class _TaskPanel: self.clmax = self.mesh_obj.CharacteristicLengthMax self.clmin = self.mesh_obj.CharacteristicLengthMin self.dimension = self.mesh_obj.ElementDimension + self.order = self.mesh_obj.ElementOrder def set_mesh_params(self): self.mesh_obj.CharacteristicLengthMax = self.clmax self.mesh_obj.CharacteristicLengthMin = self.clmin self.mesh_obj.ElementDimension = self.dimension + self.mesh_obj.ElementOrder = self.order def update(self): "fills the widgets" @@ -138,6 +149,8 @@ class _TaskPanel: self.form.if_min.setText(self.clmin.UserString) index_dimension = self.form.cb_dimension.findText(self.dimension) self.form.cb_dimension.setCurrentIndex(index_dimension) + index_order = self.form.cb_order.findText(self.order) + self.form.cb_order.setCurrentIndex(index_order) def console_log(self, message="", color="#000000"): if (not isinstance(message, bytes)) and (sys.version_info.major < 3): @@ -168,6 +181,12 @@ class _TaskPanel: self.form.cb_dimension.setCurrentIndex(index) self.dimension = str(self.form.cb_dimension.itemText(index)) # form returns unicode + def choose_order(self, index): + if index < 0: + return + self.form.cb_order.setCurrentIndex(index) + self.order = str(self.form.cb_order.itemText(index)) # form returns unicode + def get_gmsh_version(self): from femmesh import gmshtools version, full_message = gmshtools.GmshTools(self.mesh_obj, self.analysis).get_gmsh_version() diff --git a/src/Mod/Fem/femtaskpanels/task_mesh_group.py b/src/Mod/Fem/femtaskpanels/task_mesh_group.py index b6609ddae5..9462ee3aa8 100644 --- a/src/Mod/Fem/femtaskpanels/task_mesh_group.py +++ b/src/Mod/Fem/femtaskpanels/task_mesh_group.py @@ -66,7 +66,9 @@ class _TaskPanel: # start with Solid in list! self.selectionWidget = selection_widgets.GeometryElementsSelection( obj.References, - ["Solid", "Face", "Edge", "Vertex"] + ["Solid", "Face", "Edge", "Vertex"], + True, + False ) # form made from param and selection widget diff --git a/src/Mod/Fem/femtaskpanels/task_mesh_region.py b/src/Mod/Fem/femtaskpanels/task_mesh_region.py index a93e3a76d9..2a6045b29e 100644 --- a/src/Mod/Fem/femtaskpanels/task_mesh_region.py +++ b/src/Mod/Fem/femtaskpanels/task_mesh_region.py @@ -61,7 +61,9 @@ class _TaskPanel: # start with Solid in list! self.selectionWidget = selection_widgets.GeometryElementsSelection( obj.References, - ["Solid", "Face", "Edge", "Vertex"] + ["Solid", "Face", "Edge", "Vertex"], + True, + False ) # form made from param and selection widget diff --git a/src/Mod/Fem/femtest/data/elmer/group_mesh.geo b/src/Mod/Fem/femtest/data/elmer/group_mesh.geo index e28df28f6e..48cf1a8658 100644 --- a/src/Mod/Fem/femtest/data/elmer/group_mesh.geo +++ b/src/Mod/Fem/femtest/data/elmer/group_mesh.geo @@ -26,9 +26,9 @@ Mesh.ElementOrder = 2; Mesh.SecondOrderLinear = 0; // Second order nodes are created by linear interpolation instead by curvilinear // mesh algorithm, only a few algorithms are usable with 3D boundary layer generation -// 2D mesh algorithm (1=MeshAdapt, 2=Automatic, 5=Delaunay, 6=Frontal, 7=BAMG, 8=DelQuad) +// 2D mesh algorithm (1=MeshAdapt, 2=Automatic, 5=Delaunay, 6=Frontal, 7=BAMG, 8=DelQuad, 9=Packing Parallelograms) Mesh.Algorithm = 2; -// 3D mesh algorithm (1=Delaunay, 2=New Delaunay, 4=Frontal, 5=Frontal Delaunay, 6=Frontal Hex, 7=MMG3D, 9=R-tree) +// 3D mesh algorithm (1=Delaunay, 2=New Delaunay, 4=Frontal, 7=MMG3D, 9=R-tree, 10=HTX) Mesh.Algorithm3D = 1; // meshing diff --git a/src/Mod/Material/CMakeLists.txt b/src/Mod/Material/CMakeLists.txt index 8c544aedde..a7aad23bc1 100644 --- a/src/Mod/Material/CMakeLists.txt +++ b/src/Mod/Material/CMakeLists.txt @@ -25,16 +25,114 @@ SET (MaterialLib_Files StandardMaterial/None.FCMat StandardMaterial/ABS-Generic.FCMat StandardMaterial/Acrylic-Glass-Generic.FCMat + StandardMaterial/AlMg3F24.FCMat + StandardMaterial/AlMgSi1F31.FCMat + StandardMaterial/Aluminum-6061-T6.FCMat + StandardMaterial/AlZn4-5Mg1F35.FCMat StandardMaterial/CalculiX-Steel.FCMat StandardMaterial/Concrete-Generic.FCMat + StandardMaterial/Glass-E-GlassFibre.FCMat StandardMaterial/Glass-Generic.FCMat + StandardMaterial/Glass-S2-GlassFibre.FCMat StandardMaterial/PA6-Generic.FCMat StandardMaterial/PET-Generic.FCMat StandardMaterial/PLA-Generic.FCMat StandardMaterial/PP-Generic.FCMat StandardMaterial/PTFE-Generic.FCMat StandardMaterial/PVC-Generic.FCMat + StandardMaterial/Reinforcement-FIB-B500.FCMat + StandardMaterial/Steel-15CrNi6.FCMat + StandardMaterial/Steel-17CrNiMo6.FCMat + StandardMaterial/Steel-1C22.FCMat + StandardMaterial/Steel-1C35.FCMat + StandardMaterial/Steel-1C45.FCMat + StandardMaterial/Steel-1C60.FCMat + StandardMaterial/Steel-20NiCrMo2.FCMat + StandardMaterial/Steel-28Mn6.FCMat + StandardMaterial/Steel-2C10.FCMat + StandardMaterial/Steel-30CrNiMo8.FCMat + StandardMaterial/Steel-34CrNiMo6.FCMat + StandardMaterial/Steel-36CrNiMo4.FCMat + StandardMaterial/Steel-36NiCrMo16.FCMat + StandardMaterial/Steel-3C15.FCMat + StandardMaterial/Steel-3C22.FCMat + StandardMaterial/Steel-3C35.FCMat + StandardMaterial/Steel-3V45.FCMat + StandardMaterial/Steel-C10.FCMat + StandardMaterial/Steel-C15.FCMat + StandardMaterial/Steel-C22E.FCMat + StandardMaterial/Steel-C25E.FCMat + StandardMaterial/Steel-C30E.FCMat + StandardMaterial/Steel-C40E.FCMat + StandardMaterial/Steel-C50E.FCMat + StandardMaterial/Steel-C55E.FCMat + StandardMaterial/Steel-C60E.FCMat + StandardMaterial/Steel-E295-GC.FCMat + StandardMaterial/Steel-E295.FCMat + StandardMaterial/Steel-E335-GC.FCMat + StandardMaterial/Steel-E335.FCMat + StandardMaterial/Steel-E360-GC.FCMat + StandardMaterial/Steel-E360.FCMat + StandardMaterial/Steel-EN-GJL-100.FCMat + StandardMaterial/Steel-EN-GJL-150.FCMat + StandardMaterial/Steel-EN-GJL-200.FCMat + StandardMaterial/Steel-EN-GJL-250.FCMat + StandardMaterial/Steel-EN-GJL-300.FCMat + StandardMaterial/Steel-EN-GJL-350.FCMat + StandardMaterial/Steel-EN-GJMB-350-10.FCMat + StandardMaterial/Steel-EN-GJMB-550-4.FCMat + StandardMaterial/Steel-EN-GJMB-650-2.FCMat + StandardMaterial/Steel-EN-GJMW-350-4.FCMat + StandardMaterial/Steel-EN-GJMW-360-12.FCMat + StandardMaterial/Steel-EN-GJMW-400-5.FCMat + StandardMaterial/Steel-EN-GJMW-450-7.FCMat + StandardMaterial/Steel-EN-GJS-400-15.FCMat + StandardMaterial/Steel-EN-GJS-500-7.FCMat + StandardMaterial/Steel-EN-GJS-600-3.FCMat + StandardMaterial/Steel-EN-GJS-700-2.FCMat + StandardMaterial/Steel-EN-GJS-800-1.FCMat + StandardMaterial/Steel-G16Mn5.FCMat + StandardMaterial/Steel-G200.FCMat + StandardMaterial/Steel-G20Mn5.FCMat + StandardMaterial/Steel-G230.FCMat + StandardMaterial/Steel-G260.FCMat + StandardMaterial/Steel-G300.FCMat + StandardMaterial/Steel-G30Mn5.FCMat StandardMaterial/Steel-Generic.FCMat + StandardMaterial/Steel-S185.FCMat + StandardMaterial/Steel-S235JO.FCMat + StandardMaterial/Steel-S235JR.FCMat + StandardMaterial/Steel-S235JRG1.FCMat + StandardMaterial/Steel-S260NC.FCMat + StandardMaterial/Steel-S275JO.FCMat + StandardMaterial/Steel-S275JR.FCMat + StandardMaterial/Steel-S275N.FCMat + StandardMaterial/Steel-S335JO.FCMat + StandardMaterial/Steel-S335JR.FCMat + StandardMaterial/Steel-S335N.FCMat + StandardMaterial/Steel-S340MC.FCMat + StandardMaterial/Steel-S355J2G3.FCMat + StandardMaterial/Steel-S380MC.FCMat + StandardMaterial/Steel-S420MC.FCMat + StandardMaterial/Steel-S420N.FCMat + StandardMaterial/Steel-S460MC.FCMat + StandardMaterial/Steel-S460N.FCMat + StandardMaterial/Steel-S500MC.FCMat + StandardMaterial/Steel-S550MC.FCMat + StandardMaterial/Steel-S690MC.FCMat + StandardMaterial/Steel-St-37-2K.FCMat + StandardMaterial/Steel-St-E-255.FCMat + StandardMaterial/Steel-St-E-315.FCMat + StandardMaterial/Steel-St-E-380.FCMat + StandardMaterial/Steel-St-E-460.FCMat + StandardMaterial/Steel-St-E-500.FCMat + StandardMaterial/Steel-X2CrNiMoN17-13-3.FCMat + StandardMaterial/Steel-X2CrNiN24-4.FCMat + StandardMaterial/Steel-X39CrMo17-1.FCMat + StandardMaterial/Steel-X3CrNiMo13-14.FCMat + StandardMaterial/Steel-X5CrNi18-10.FCMat + StandardMaterial/Steel-X5CrNiMo17-12-2.FCMat + StandardMaterial/Steel-X6CrNiTi18-10.FCMat StandardMaterial/TEMPLATE.FCMat StandardMaterial/Wood-Generic.FCMat StandardMaterial/Readme.txt