From a181cb0b1b675e4231d1e66a5ba9075d4e4d1588 Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Sat, 10 Sep 2016 19:06:58 -0300 Subject: [PATCH] Arch: Prefer vertical extrusions when recreating extrusions from IFC files --- src/Mod/Arch/ArchCommands.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/Mod/Arch/ArchCommands.py b/src/Mod/Arch/ArchCommands.py index 823e124c75..dc41f77c7a 100644 --- a/src/Mod/Arch/ArchCommands.py +++ b/src/Mod/Arch/ArchCommands.py @@ -939,20 +939,28 @@ def getExtrusionData(shape): for i1, f1 in enumerate(faces): for i2, f2 in enumerate(faces): if f1[0].hashCode() != f2[0].hashCode(): - if round(f1[1].getAngle(f2[1]),8) == 3.14159265: + if round(f1[1].getAngle(f2[1]),4) == 3.1416: pairs.append([i1,i2]) if not pairs: return None - for p in pairs: - hc = [faces[p[0]][0].hashCode(),faces[p[1]][0].hashCode()] - ok = True + valids = [] + for pair in pairs: + hc = [faces[pair[0]][0].hashCode(),faces[pair[1]][0].hashCode()] # check if other normals are all at 90 degrees + ok = True for f in faces: if f[0].hashCode() not in hc: - if round(f[1].getAngle(faces[p[0]][1]),8) != 1.57079633: + if round(f[1].getAngle(faces[pair[0]][1]),4) != 1.5708: ok = False if ok: - return [faces[p[0]][0],faces[p[1]][0].CenterOfMass.sub(faces[p[0]][0].CenterOfMass)] + valids.append([faces[pair[0]][0],faces[pair[1]][0].CenterOfMass.sub(faces[pair[0]][0].CenterOfMass)]) + for v in valids: + # prefer vertical extrusions + if v[1].getAngle(FreeCAD.Vector(0,0,1)) < 0.0001: + return v + # otherwise return the first found + if valids: + return valids[0] return None def printMessage( message ):