mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-21 10:23:41 +00:00
snapshot
This commit is contained in:
@@ -1646,7 +1646,7 @@ class CreateDrawing(bpy.types.Operator):
|
|||||||
camera_looks_up = self.camera.matrix_world.col[2].z < 0
|
camera_looks_up = self.camera.matrix_world.col[2].z < 0
|
||||||
|
|
||||||
# GUIDs of pairs under investigation (first 12 chars used as key)
|
# GUIDs of pairs under investigation (first 12 chars used as key)
|
||||||
_dg = {"39Iwvbn41B7O", "08yv0FO$j2Aw", "1dM2d4kqjFH8", "2lwj_pzhrADf"}
|
_dg = {"39Iwvbn41B7O", "08yv0FO$j2Aw", "1dM2d4kqjFH8", "2lwj_pzhrADf", "2NR8CMK21CwO", "0XMcotQ9nDsx"}
|
||||||
|
|
||||||
obj_cache = {}
|
obj_cache = {}
|
||||||
|
|
||||||
@@ -1740,11 +1740,14 @@ class CreateDrawing(bpy.types.Operator):
|
|||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
contained = aabb_contains(corners_a, corners_b) or aabb_contains(corners_b, corners_a)
|
if aabb_contains(corners_a, corners_b):
|
||||||
if contained:
|
if _dbg: print(f"[DBG] COPL {guid_a[:12]}/{guid_b[:12]} PASS contained (b inside a)")
|
||||||
if _dbg: print(f"[DBG] COPL {guid_a[:12]}/{guid_b[:12]} PASS contained")
|
adjacency_cache[key] = "contained_b"
|
||||||
adjacency_cache[key] = True
|
return "contained_b"
|
||||||
return True
|
if aabb_contains(corners_b, corners_a):
|
||||||
|
if _dbg: print(f"[DBG] COPL {guid_a[:12]}/{guid_b[:12]} PASS contained (a inside b)")
|
||||||
|
adjacency_cache[key] = "contained_a"
|
||||||
|
return "contained_a"
|
||||||
# Coplanarity check: use the largest-face normal for each object.
|
# Coplanarity check: use the largest-face normal for each object.
|
||||||
# Area-weighted averages fail for slabs because top/bottom faces cancel.
|
# Area-weighted averages fail for slabs because top/bottom faces cancel.
|
||||||
def dominant_world_normal(obj):
|
def dominant_world_normal(obj):
|
||||||
@@ -2116,12 +2119,15 @@ class CreateDrawing(bpy.types.Operator):
|
|||||||
if style_j != style_i:
|
if style_j != style_i:
|
||||||
if _wp: print(f"[DBG] PAIR {guid_i[:12]}/{guid_j[:12]} SKIP style style_i={style_i} style_j={style_j}")
|
if _wp: print(f"[DBG] PAIR {guid_i[:12]}/{guid_j[:12]} SKIP style style_i={style_i} style_j={style_j}")
|
||||||
continue
|
continue
|
||||||
if not are_coplanar_and_adjacent(guid_i, guid_j):
|
_copl_result = are_coplanar_and_adjacent(guid_i, guid_j)
|
||||||
|
if not _copl_result:
|
||||||
if _wp: print(f"[DBG] PAIR {guid_i[:12]}/{guid_j[:12]} SKIP coplanar")
|
if _wp: print(f"[DBG] PAIR {guid_i[:12]}/{guid_j[:12]} SKIP coplanar")
|
||||||
continue
|
continue
|
||||||
if _wp: print(f"[DBG] PAIR {guid_i[:12]}/{guid_j[:12]} JOINED — segs_i={len(segs_i)} segs_j={len(segs_j)}")
|
if _wp: print(f"[DBG] PAIR {guid_i[:12]}/{guid_j[:12]} JOINED — segs_i={len(segs_i)} segs_j={len(segs_j)}")
|
||||||
matched = 0
|
matched = 0
|
||||||
|
|
||||||
|
_is_contained = _copl_result in ("contained_a", "contained_b")
|
||||||
|
|
||||||
# Group each element's segments by axis-aligned line.
|
# Group each element's segments by axis-aligned line.
|
||||||
# All segments on the same line (within TOL) are merged into a
|
# All segments on the same line (within TOL) are merged into a
|
||||||
# single interval union before computing the shared portion.
|
# single interval union before computing the shared portion.
|
||||||
@@ -2143,6 +2149,17 @@ class CreateDrawing(bpy.types.Operator):
|
|||||||
lines_i = group_by_line(segs_i)
|
lines_i = group_by_line(segs_i)
|
||||||
lines_j = group_by_line(segs_j)
|
lines_j = group_by_line(segs_j)
|
||||||
|
|
||||||
|
if _is_contained and _wp:
|
||||||
|
print(f"[DBG] CONTAINED keys_i={sorted(lines_i)} keys_j={sorted(lines_j)}")
|
||||||
|
print(f"[DBG] CONTAINED bbox_i={segs_bbox(segs_i)} bbox_j={segs_bbox(segs_j)}")
|
||||||
|
for _k in sorted(set(lines_i) & set(lines_j)):
|
||||||
|
_ui = ivs_union(lines_i[_k]["ivs"])
|
||||||
|
_uj = ivs_union(lines_j[_k]["ivs"])
|
||||||
|
print(f"[DBG] SHARED key={_k} union_i={_ui} union_j={_uj} intersect={ivs_intersect(_ui, _uj)}")
|
||||||
|
for _k in sorted(set(lines_i) - set(lines_j)):
|
||||||
|
_ui = ivs_union(lines_i[_k]["ivs"])
|
||||||
|
print(f"[DBG] ONLY-I key={_k} union_i={_ui}")
|
||||||
|
|
||||||
# Track whether bilateral found shared keys but skipped them
|
# Track whether bilateral found shared keys but skipped them
|
||||||
# due to offset overlap. If so, both elements have explicit
|
# due to offset overlap. If so, both elements have explicit
|
||||||
# segments at the shared line — the unilateral fallback must
|
# segments at the shared line — the unilateral fallback must
|
||||||
@@ -2158,14 +2175,11 @@ class CreateDrawing(bpy.types.Operator):
|
|||||||
if not shared:
|
if not shared:
|
||||||
continue
|
continue
|
||||||
_bilateral_had_explicit_keys = True
|
_bilateral_had_explicit_keys = True
|
||||||
# Only remove when the shared portion covers the full union
|
# For contained pairs the ivs_equal full-extent guard is
|
||||||
# of at least one element on this line. An offset partial
|
# skipped: a partial overlap between an outer element's long
|
||||||
# overlap — where two back-to-back walls happen to have
|
# edge and a physically-contained inner element's short edge
|
||||||
# segments on the same line but at different running-direction
|
# is still a genuine shared interface, not an offset-wall case.
|
||||||
# positions — would cover neither element's full union and
|
if not _is_contained and not (ivs_equal(shared, union_i) or ivs_equal(shared, union_j)):
|
||||||
# must not be removed (the line between them is a real
|
|
||||||
# architectural boundary).
|
|
||||||
if not (ivs_equal(shared, union_i) or ivs_equal(shared, union_j)):
|
|
||||||
if _wp: print(f"[DBG] SKIP offset-overlap key={key} shared={shared} union_i={union_i} union_j={union_j}")
|
if _wp: print(f"[DBG] SKIP offset-overlap key={key} shared={shared} union_i={union_i} union_j={union_j}")
|
||||||
continue
|
continue
|
||||||
if _wp: print(f"[DBG] MATCHED key={key} shared={shared} union_i={union_i} union_j={union_j}")
|
if _wp: print(f"[DBG] MATCHED key={key} shared={shared} union_i={union_i} union_j={union_j}")
|
||||||
@@ -2187,7 +2201,9 @@ class CreateDrawing(bpy.types.Operator):
|
|||||||
# (not explicitly drawn as a path segment), segments from the other
|
# (not explicitly drawn as a path segment), segments from the other
|
||||||
# element that lie on the boundary of that element's SVG bbox are
|
# element that lie on the boundary of that element's SVG bbox are
|
||||||
# still on the shared face and should be removed.
|
# still on the shared face and should be removed.
|
||||||
if matched == 0 and not _bilateral_had_explicit_keys and segs_i and segs_j:
|
# Not applicable to contained pairs (bilateral handles their
|
||||||
|
# shared interface; unilateral would over-remove here).
|
||||||
|
if not _is_contained and matched == 0 and not _bilateral_had_explicit_keys and segs_i and segs_j:
|
||||||
bbox_i = segs_bbox(segs_i)
|
bbox_i = segs_bbox(segs_i)
|
||||||
bbox_j = segs_bbox(segs_j)
|
bbox_j = segs_bbox(segs_j)
|
||||||
if bbox_i and bbox_j:
|
if bbox_i and bbox_j:
|
||||||
|
|||||||
Reference in New Issue
Block a user