brunopostle reported that a curtain wall used as a standalone room side
(not decomposed into IfcMember/IfcPlate children) was invisible to
space/boundary generation, since only IfcWall, IfcColumn, IfcMember,
IfcVirtualElement, and IfcPlate were treated as bounding classes.
CyrilWaechter concretely proposed adding curtain wall to that
detection list, while explicitly leaving structural elements (a
separate, still-open design question) alone.
IfcCurtainWall is not a schema subtype of IfcWall, so it was silently
skipped by every class list that checked "is this a wall/column/etc."
Three separate lists needed it:
- tool.Spatial.is_bounding_class, used by "Generate Space" (cursor
cutting-plane detection).
- tool.Spatial.get_boundary_elements, used by "Generate Spaces From
Walls" (bulk perimeter detection).
- AddBoundary.auto_generate_boundaries' building_elements gather, used
by "Add Boundary" when auto-detecting nearby elements for a single
selected IfcSpace.
The separate manual AddBoundary path (selecting an IfcSpace plus one
IfcElement directly) was already class-agnostic and did not need a
change; verified live that it already creates a boundary against an
IfcCurtainWall today.
Verified live in headless Blender: a synthetic 4m x 4m room with 3
IfcWalls and one standalone IfcCurtainWall (single object, not
aggregated into members/plates) produced 0 spaces via "Generate
Spaces From Walls" before this fix, and 1 correctly-bounded space
after. The manual "Add Boundary" (IfcSpace + IfcCurtainWall selected)
path created an IfcRelSpaceBoundary against the curtain wall both
before and after, confirming it needed no change.
IfcWindow remains untouched; CyrilWaechter was explicit that
whether to auto-detect standalone windows/structural elements is a
separate, unresolved design question.
Fixes#3995
Generated with the assistance of an AI coding tool.
It was passing `IFC4X3` directly to `schema_by_name` which is expecting
schema identifier (e.g. IFC4X3_ADD2, not IFC4X3 allowed by `IFC_SCHEMA`
- IFC4X3 is one of the IFC4X3 iterations while it was in development,
not the final one).
Noticed by tests failing:
FAILED
test/util/test_schema.py::TestGeometryClassesIntroducedAfter::test_ifc4x3_to_ifc2x3_is_superset_of_ifc4_to_ifc2x3
- RuntimeError: No schema named IFC4X3
FAILED
test/util/test_schema.py::TestGeometryClassesIntroducedAfter::test_ifc4_to_ifc4x3_is_empty
- RuntimeError: No schema named IFC4X3
Error was:
```
configure: error: could not find a working compiler, see config.log for details
```
config.log:
```
conftest.c: In function 'f':
conftest.c:12:48: error: too many arguments to function 'g'; expected 0, have 6
12 | for(i=0;i<1;i++){if(e(got,got,9,d[i].n)==0)h();g(i,d[i].src,d[i].n,got,d[i].want,9);if(d[i].n)h();}}
| ^ ~
```
Last reference to this file was dropped in 7ae685dbf, though the ref was
pointing to `/patches/opencollada/pr622.patch`, so IIUC
`patches/pr622.patch` was never used.
AST parser has changed a bit and there are some minor differences in the .py output. Updating files just to avoid seeing these diffs when rerunning rule compiler.
Example error:
```
ast.Str(s=node.attr),
^^^^^^^
AttributeError: module 'ast' has no attribute 'Str'
```
`ast.Str` was deprecated since 3.8 and was removed in 3.14, see https://docs.python.org/3/whatsnew/3.14.html#id9
Because uv was always trying to install when starting a venv in `ifcopenshell` folder, though they might be already available globally. And also they were listed twice - in pyproject and in the ci-lint.yml, now there's a single source of truth.