diff --git a/src/Mod/Fem/FemInputWriterCcx.py b/src/Mod/Fem/FemInputWriterCcx.py index 378a44240..df1628e68 100644 --- a/src/Mod/Fem/FemInputWriterCcx.py +++ b/src/Mod/Fem/FemInputWriterCcx.py @@ -974,7 +974,12 @@ class FemInputWriterCcx(FemInputWriter.FemInputWriter): if all_found is False: if not self.femelement_table: self.femelement_table = FemMeshTools.get_femelement_table(self.femmesh) - FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_table, self.material_objects) + # we gone use the binary search for get_femelements_by_femnodes(), thus we need the parameter values self.femnodes_ele_table + if not self.femnodes_mesh: + self.femnodes_mesh = self.femmesh.Nodes + if not self.femnodes_ele_table: + self.femnodes_ele_table = FemMeshTools.get_femnodes_ele_table(self.femnodes_mesh, self.femelement_table) + FemMeshTools.get_femelement_sets(self.femmesh, self.femelement_table, self.material_objects, self.femnodes_ele_table) for mat_data in self.material_objects: mat_obj = mat_data['Object'] ccx_elset = {} diff --git a/src/Mod/Fem/FemMeshTools.py b/src/Mod/Fem/FemMeshTools.py index f36069b56..ae269ba75 100644 --- a/src/Mod/Fem/FemMeshTools.py +++ b/src/Mod/Fem/FemMeshTools.py @@ -42,13 +42,18 @@ def get_femnodes_by_femobj_with_references(femmesh, femobj): return node_set -def get_femelements_by_references(femmesh, femelement_table, references): +def get_femelements_by_references(femmesh, femelement_table, references, femnodes_ele_table=None): '''get the femelements for a list of references ''' references_femelements = [] for ref in references: ref_femnodes = get_femnodes_by_refshape(femmesh, ref) # femnodes for the current ref - references_femelements += get_femelements_by_femnodes_std(femelement_table, ref_femnodes) # femelements for all references + if femnodes_ele_table: + # blind fast binary search, works for volumes only + references_femelements += get_femelements_by_femnodes_bin(femelement_table, femnodes_ele_table, ref_femnodes) # femelements for all references + else: + # standars search + references_femelements += get_femelements_by_femnodes_std(femelement_table, ref_femnodes) # femelements for all references return references_femelements @@ -324,7 +329,7 @@ def get_femvolumeelements_by_femfacenodes(femelement_table, node_list): return e -def get_femelement_sets(femmesh, femelement_table, fem_objects): # fem_objects = FreeCAD FEM document objects +def get_femelement_sets(femmesh, femelement_table, fem_objects, femnodes_ele_table=None): # fem_objects = FreeCAD FEM document objects # get femelements for reference shapes of each obj.References count_femelements = 0 referenced_femelements = [] @@ -334,7 +339,7 @@ def get_femelement_sets(femmesh, femelement_table, fem_objects): # fem_objects fem_object['ShortName'] = get_elset_short_name(obj, fem_object_i) # unique short identifier if obj.References: ref_shape_femelements = [] - ref_shape_femelements = get_femelements_by_references(femmesh, femelement_table, obj.References) + ref_shape_femelements = get_femelements_by_references(femmesh, femelement_table, obj.References, femnodes_ele_table) referenced_femelements += ref_shape_femelements count_femelements += len(ref_shape_femelements) fem_object['FEMElements'] = ref_shape_femelements