Ryan Schultz ad9d368a3a Keep render override transparency alive across geometry edits
Transparency vanished after editing an element and did not come back, e.g. the
enable_editing_extrusion_profile -> direct_profile_edit -> edit_extrusion_profile
round trip. Editing geometry replaces the object's data outright
(Geometry.change_object_data does obj.data = data), so the material slots come
back from IFC and the temporary transparent copies are dropped. Nothing notified
this module, so the preview was lost until the toggle was cycled.

Worse, the loss was permanent and destructive. bpy.data.materials.remove unlinks
from every user, so deleting a temp material that had ridden onto the rebuilt mesh
emptied the live slot -- stripping the element's material entirely, after which
there was nothing left to make transparent. Each edit cycle claimed another one.

- restore_transparency only undoes a slot that still holds the material it put
  there, and remaps any other remaining reference back to the original before
  deleting, so a temp material is never removed out from under a live slot.
- A depsgraph_update_post handler re-applies after a rebuild. The OBJECT-mode
  check is inside the deferred timer, not at scheduling time: edit mode is entered
  in between, and syncing then found slots mid-flux.

The same pass reworks this for real models, where a rule can match thousands of
objects rather than the handful it was built against:

- Temp materials are shared per (source material, amount) instead of copied per
  slot, so the datablock count is a handful rather than one per occurrence.
  Sharing is safe for user_remap because every user of a temp material had the
  same original, recorded on it as SOURCE_KEY.
- sync_live_effects is incremental. Slots already carrying the right material are
  kept, only what is no longer wanted is undone, and only what is uncovered is
  applied. A steady-state re-sync now touches nothing, and it can no longer
  dismantle a preview it is unable to rebuild.
- Staleness checks are scoped to the objects a depsgraph update actually touched,
  and the expensive probes are guarded so they are not evaluated when tracing is
  off.
- Sync adopts orphans: a temp material left on a rebuilt mesh is traced back via
  SOURCE_KEY and re-registered, rather than silently baked into the saved file.

Tracing is left in place behind DEBUG (currently on) since this needs further
exercise on real models. NOTES.md documents the reload-survival design, the scale
approach, and the confirmed limitation that elements with no material cannot be
made transparent, because the effect works by copying an existing material.

Smoke-tested headless on Blender 4.5.7: three objects sharing one source material
produce exactly one temp material, and a stray reference is remapped rather than
emptied.

Generated with the assistance of an AI coding tool.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 23:06:44 -05:00
2025-12-19 18:53:14 +05:00
2025-12-19 18:53:14 +05:00
2026-01-26 17:10:03 +05:00
2026-04-26 21:29:16 +02:00
2026-01-26 17:10:02 +05:00
2023-09-14 09:29:20 +02:00
2026-02-18 09:09:46 +11:00
2025-08-28 20:05:45 +02:00
2025-08-28 20:05:45 +02:00
2026-04-13 19:38:25 +05:00
2026-04-13 19:40:25 +05:00

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!

Open Collective Contributors

Contents

Name Description License Service
bcf Library to read and write BCF-XML and query OpenCDE BCF-API modules LGPL-3.0-or-later PyPI Anaconda-Server Badge
bonsai Add-on to Blender providing a graphical native IFC authoring platform GPL-3.0-or-later Official GitHub Unstable Chocolatey
bsdd Library to query the bSDD API LGPL-3.0-or-later PyPI
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 PyPI
ifc5d Report and optimise cost information from IFC LGPL-3.0-or-later PyPI
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 PyPI
ifcclash Clash detection library and CLI app LGPL-3.0-or-later PyPI
ifcconvert CLI app to convert IFC to many other formats LGPL-3.0-or-later* Official GitHub
ifccsv Library and CLI app to export and import schedules from IFC LGPL-3.0-or-later PyPI
ifcdiff Compare changes between IFC models LGPL-3.0-or-later PyPI
ifcedit CLI wrapper for ifcopenshell.api IFC model mutation functions LGPL-3.0-or-later PyPI
ifcfm Extract IFC data for FM handover requirements LGPL-3.0-or-later PyPI
ifcmax Historic extension for IFC support in 3DS Max LGPL-3.0-or-later* Official
ifcmcp MCP server for querying and editing IFC building models LGPL-3.0-or-later PyPI
ifcopenshell-python Python library for IFC manipulation LGPL-3.0-or-later* Official GitHub PyPI Anaconda Anaconda Docker AUR AUR Unstable Pyodide WASM Wheels tag
ifcpatch Utility to run pre-packaged scripts to manipulate IFCs LGPL-3.0-or-later PyPI
ifcquery CLI tool for querying and inspecting IFC building models LGPL-3.0-or-later PyPI
ifcsverchok Blender Add-on for visual node programming with IFC GPL-3.0-or-later GitHub
ifctester Library, CLI and webapp for IDS model auditing LGPL-3.0-or-later PyPI

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*
S
Description
No description provided
Readme 567 MiB
Languages
C++ 57.3%
Python 36.3%
C 3.9%
Gherkin 0.7%
JavaScript 0.3%
Other 1.3%