Fem: Add support for 2D geometries to Contact constraint - fixes #13280

This commit is contained in:
marioalexis
2025-08-28 23:12:15 -03:00
parent 0d625b3110
commit 40604881e5
3 changed files with 32 additions and 18 deletions

View File

@@ -227,8 +227,10 @@ void TaskFemConstraintContact::addToSelectionSlave()
}
for (const auto& subName : subNames) { // for every selected sub element
bool addMe = true;
if (subName.substr(0, 4) != "Face") {
QMessageBox::warning(this, tr("Selection error"), tr("Only faces can be picked"));
if ((subName.substr(0, 4) != "Face") && (subName.substr(0, 4) != "Edge")) {
QMessageBox::warning(this,
tr("Selection error"),
tr("Only faces can be picked (edges in 2D models)"));
return;
}
for (auto itr = std::ranges::find(SubElements, subName); itr != SubElements.end();
@@ -352,8 +354,10 @@ void TaskFemConstraintContact::addToSelectionMaster()
}
for (const auto& subName : subNames) { // for every selected sub element
bool addMe = true;
if (subName.substr(0, 4) != "Face") {
QMessageBox::warning(this, tr("Selection error"), tr("Only faces can be picked"));
if ((subName.substr(0, 4) != "Face") && (subName.substr(0, 4) != "Edge")) {
QMessageBox::warning(this,
tr("Selection error"),
tr("Only faces can be picked (edges in 2D models)"));
return;
}
for (auto itr = std::ranges::find(SubElements.begin(), SubElements.end(), subName);

View File

@@ -442,16 +442,15 @@ class MeshSetsGetter:
for femobj in self.member.cons_contact:
# femobj --> dict, FreeCAD document object is femobj["Object"]
print_obj_info(femobj["Object"])
contact_slave_faces, contact_master_faces = meshtools.get_contact_obj_faces(
self.femmesh, self.femelement_table, self.femnodes_ele_table, femobj
)
# [ele_id, ele_face_id], [ele_id, ele_face_id], ...]
# whereas the ele_face_id might be ccx specific
femobj["ContactSlaveFaces"] = contact_slave_faces
femobj["ContactMasterFaces"] = contact_master_faces
# FreeCAD.Console.PrintLog("{}\n".format(femobj["ContactSlaveFaces"]))
# FreeCAD.Console.PrintLog("{}\n".format(femobj["ContactMasterFaces"]))
obj = femobj["Object"]
print_obj_info(obj)
result = []
ref_data = meshtools.pair_obj_reference(obj.References)
for ref_pair in ref_data:
result.append(meshtools.get_ccx_elements(self, ref_pair))
femobj["ContactSlaveFaces"] = result[:-1]
femobj["ContactMasterFaces"] = result[-1:]
# information in the regard of element faces constraints
# forum post: https://forum.freecad.org/viewtopic.php?f=18&t=42783&p=370286#p366723

View File

@@ -57,12 +57,23 @@ def get_after_write_constraint():
def write_meshdata_constraint(f, femobj, contact_obj, ccxwriter):
# slave DEP
f.write(f"*SURFACE, NAME=DEP{contact_obj.Name}\n")
for i in femobj["ContactSlaveFaces"]:
f.write(f"{i[0]},S{i[1]}\n")
for refs, surf, is_sub_el in femobj["ContactSlaveFaces"]:
if is_sub_el:
for elem, fno in surf:
f.write(f"{elem},S{fno}\n")
else:
for elem in surf:
f.write(f"{elem},S2\n")
# master IND
f.write(f"*SURFACE, NAME=IND{contact_obj.Name}\n")
for i in femobj["ContactMasterFaces"]:
f.write(f"{i[0]},S{i[1]}\n")
for refs, surf, is_sub_el in femobj["ContactMasterFaces"]:
if is_sub_el:
for elem, fno in surf:
f.write(f"{elem},S{fno}\n")
else:
for elem in surf:
f.write(f"{elem},S2\n")
def write_constraint(f, femobj, contact_obj, ccxwriter):