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.
IfcOpenShell
IfcOpenShell is an open source (LGPL) software library for working with Industry Foundation Classes (IFC). Complete parsing support is provided for IFC2x3 TC1, IFC4 Add2 TC1, IFC4x1, IFC4x2, and IFC4x3 Add2. Extensive geometric support is implemented for the IFC releases IFC2x3 TC1 and IFC4 Add2 TC1. Extending with support for arbitrary IFC schemas is possible at compile-time when using C++ and at run-time when using Python.
In addition to a C++ and Python API, IfcOpenShell comes with an ecosystem of tools, notably including IfcConvert (an application to convert IFC models to other formats), Bonsai (an add-on to Blender providing a graphical IFC authoring platform), and many other libraries, CLI apps, and more. Support is also provided for auxiliary standards such as BCF and IDS.
For more information, see:
Development is sponsored through your generous donations!
Contents
| Name | Description | License | Service |
|---|---|---|---|
| bcf | Library to read and write BCF-XML and query OpenCDE BCF-API modules | LGPL-3.0-or-later | |
| bonsai | Add-on to Blender providing a graphical native IFC authoring platform | GPL-3.0-or-later | |
| bsdd | Library to query the bSDD API | LGPL-3.0-or-later | |
| ifc2ca | Utility to convert IFC structural analysis models to Code_Aster | LGPL-3.0-or-later | |
| ifc4d | Convert to and from IFC and project management software | LGPL-3.0-or-later | |
| ifc5d | Report and optimise cost information from IFC | LGPL-3.0-or-later | |
| ifcbimtester | Wrapper for Gherkin based unit testing for IFC models | LGPL-3.0-or-later | |
| ifcblender | Historic Blender IFC import add-on | LGPL-3.0-or-later* | |
| ifccityjson | Convert CityJSON to IFC | LGPL-3.0-or-later | |
| ifcclash | Clash detection library and CLI app | LGPL-3.0-or-later | |
| ifcconvert | CLI app to convert IFC to many other formats | LGPL-3.0-or-later* | |
| ifccsv | Library and CLI app to export and import schedules from IFC | LGPL-3.0-or-later | |
| ifcdiff | Compare changes between IFC models | LGPL-3.0-or-later | |
| ifcedit | CLI wrapper for ifcopenshell.api IFC model mutation functions | LGPL-3.0-or-later | |
| ifcfm | Extract IFC data for FM handover requirements | LGPL-3.0-or-later | |
| ifcmax | Historic extension for IFC support in 3DS Max | LGPL-3.0-or-later* | |
| ifcmcp | MCP server for querying and editing IFC building models | LGPL-3.0-or-later | |
| ifcopenshell-python | Python library for IFC manipulation | LGPL-3.0-or-later* | |
| ifcpatch | Utility to run pre-packaged scripts to manipulate IFCs | LGPL-3.0-or-later | |
| ifcquery | CLI tool for querying and inspecting IFC building models | LGPL-3.0-or-later | |
| ifcsverchok | Blender Add-on for visual node programming with IFC | GPL-3.0-or-later | |
| ifctester | Library, CLI and webapp for IDS model auditing | LGPL-3.0-or-later |
The IfcOpenShell C++ codebase is split into multiple interal libraries:
| Name | Description | License |
|---|---|---|
| ifcgeom | Internal library for IfcOpenShell | LGPL-3.0-or-later* |
| ifcgeom_schema_agnostic | Internal library for IfcOpenShell | LGPL-3.0-or-later* |
| ifcgeomserver | Internal library for IfcOpenShell | LGPL-3.0-or-later* |
| ifcjni | Internal library for IfcOpenShell | LGPL-3.0-or-later* |
| ifcparse | Internal library for IfcOpenShell | LGPL-3.0-or-later* |
| ifcwrap | Internal library for IfcOpenShell | LGPL-3.0-or-later* |
| qtviewer | Internal library for IfcOpenShell | LGPL-3.0-or-later* |
| serializers | Internal library for IfcOpenShell | LGPL-3.0-or-later* |