DumbProfileGenerator only ever used IfcMaterialProfileSet.CompositeProfile,
or otherwise the first IfcMaterialProfile, when instantiating an occurrence
from a profile-based type, silently discarding every other material profile
in the set (e.g. a steel beam with a timber cladding profile would only
render the steel part, with no way to recover the cladding).
When there is no composite profile but more than one material profile, the
occurrence's Body representation is now built with one extruded item per
IfcMaterialProfile, all sharing a single placement so profiles authored with
a relative offset (e.g. a cladding profile nested against a structural one)
stay correctly positioned. Each item is tagged with an IfcShapeAspect named
after its material profile and gets that material's style applied directly,
mirroring the item/shape-aspect pattern already used by the door and window
representation generators. The element's material assignment keeps
referencing the type's IfcMaterialProfileSetUsage unchanged, since that
already carries the per-profile material; the shape aspect only correlates
each geometry item back to it.
The composite-profile case (an authored single silhouette, e.g. for
structural analysis) is untouched and still takes priority when present.
Fixes#2052.
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.