mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-09 17:31:45 +00:00
94faaa3160
Two related cleanups bundled because each was too small on its own. == Drop dead Geometry.has_material_styles duplicate == Two parallel has_material_styles implementations existed on HEAD: * Geometry.has_material_styles (tool/geometry.py:853, added by3483683cb"Add tool.Geometry helpers for body representation + placement"): checks each material via tool.Material.get_style for an IfcSurfaceStyle. This is the implementation gizmos-8088 uses — its core/root.py:58 calls geometry.has_material_styles. * Root.has_material_styles (tool/root.py:75, added bye76455913"Route _has_material_styles through tool.Root.has_material_styles"): checks each material for a HasRepresentation inverse. Added to fix the test/core/test_root.py::TestCopyClass::test_AAAAAAAAAAAA failure by routing the check through a Prophecy-mockable seam. HEAD's core/root.py:59 calls root.has_material_styles. The Geometry version became orphaned by that migration — zero callers historically (git log -S "Geometry.has_material_styles" returns nothing). The Root placement is the right architectural home: has_material_styles pairs with assign_body_styles in the copy_class flow as "is there material-defined styling? if not, apply body styling" — both decisions live on the same interface, called in sequence from the same caller. The semantic delta (HasRepresentation vs IfcSurfaceStyle) is a close approximation in real IFC files where HasRepresentation almost always indicates a styled material; if precision becomes necessary, the Root impl can be tightened independently of this cleanup. Drop the Geometry method + its abstract declaration in core/tool.py. == Sanitation sweep per CLAUDE.md §4a == Eight rot-prone references in code we authored on this branch get their first-draft mistakes cleaned up. The §4a rule (no sibling symbol names, no test paths, no motivation history in docstrings) got added during this branch, so older commits sometimes named their siblings in prose; this is a focused cleanup of the worst offenders. * bim/module/model/wall.py:201 — _CommitWallDraftsFirstMixin docstring carried motivation history ("...that every multi-wall operator … used to repeat at the top of _execute"). Rewrite to describe only the current contract. * bim/module/model/wall.py:1910 — cycle_type_operator comment named two sibling methods. Rephrase to describe what happens at the slot. * bim/module/model/wall.py:2025 — _active_instances ClassVar comment named WallGizmoPreviewDecorator. Rephrase to "the wall-gizmo preview decorator" (role, not class). * bim/module/drawing/gizmos.py:3402 — GizmoFillet hit_uses_bbox comment named GizmoWallJoinIntersection. Rephrase to "the wall-join gizmo group". * bim/module/drawing/gizmos.py:3887 — GizmoCountLabel docstring had a :meth:`set_count` cross-reference. Drop — reader sees the method next to the class. * bim/module/model/host_add_opening_gizmo.py:201 — poll-exclusion comment named GizmoWallEdition + GizmoRoofEdition. Rephrase to describe why we skip ("walls and parametric roofs both render their own toggle in the pen row"). * bim/module/void/operator.py:45 — preserve_placement comment named FilledOpeningGenerator.generate. Rephrase to "the filling-opening generator gates its snap-to-wall-axis block on this flag". * bim/parametric_lifecycle.py:64 — module docstring named the test file path (test/bim/test_parametric_registry.py). Rewrite to "enforced by the registry contract tests". Sweep otherwise clean: no third-party software names in this-branch- authored comments (upstream Revit / Tekla / ArchiCAD references are legitimate external-constraint workarounds, §4a-allowed). No PR/issue numbers we authored except the FIXME(PR5) in tool/parametric.py:150, deliberately preserved until PR6's MEP slice resolves it. Generated with the assistance of an AI coding tool.