1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
//! IFC4X3 sectioned sweeps along a directrix: typed refusals by name.
//!
//! `IfcSectionedSolidHorizontal` and `IfcSectionedSurface` sweep a list of
//! cross sections along a `Directrix`. Each section sits at an
//! `IfcAxis2PlacementLinear` whose `Location` is an
//! `IfcPointByDistanceExpression`: a distance (or parameter) along a basis
//! curve plus lateral and vertical offsets. IFC4.3 then defines the shape
//! between stations by linear interpolation "between profile points with the
//! same tag along the directrix", with the profile normal taken from the
//! placement rather than the directrix tangent.
//!
//! # Why both are refused
//!
//! Neither has an exact neutral carrier in Axiolid 0.3:
//!
//! - `SolidOperation::SectionedSpine` takes sections at RESOLVED frames
//! (`Transform3`). A station here is a curve measure; resolving it to a
//! frame is curve evaluation at a distance, which ADR 0004 keeps out of
//! lowering (it is the opt-in `constraint::placement::derive` capability).
//! Even with resolved frames, `SectionedSpine` states no horizontal frame
//! law between stations and no tag-matched interpolation, so mapping onto
//! it would substitute a different solid.
//! - Axiolid has no sectioned-SURFACE relation at all, and its sections are
//! open profiles (`IfcOpenCrossProfileDef`), which `SectionedSpine`, a
//! solid over area profiles, cannot take.
//!
//! Each refusal is [`crate::GeometryError::Unsupported`] naming the entity
//! and the missing neutral primitive. The open cross profile itself lowers
//! exactly through [`crate::lower::lower_open_profile_node`].
//!
//! `IfcSectionedSolid`, the parent of `IfcSectionedSolidHorizontal`, is
//! ABSTRACT in IFC4X3 ADD2 and so never appears in a file.
use NodeId;
use EntityId;
use crateGeometryResult;
use crateLoweringSession;
/// IFC type of the horizontal sectioned solid.
pub const SECTIONED_SOLID_HORIZONTAL_TYPE: &str = "IFCSECTIONEDSOLIDHORIZONTAL";
/// IFC type of the sectioned surface.
pub const SECTIONED_SURFACE_TYPE: &str = "IFCSECTIONEDSURFACE";
/// Why an `IfcSectionedSolidHorizontal` is refused.
pub const SECTIONED_SOLID_HORIZONTAL: &str =
"kernel: sections stand at IfcAxis2PlacementLinear stations (a measure \
along the directrix plus offsets) and are swept horizontally with \
tag-matched linear interpolation; the neutral SectionedSpine takes only \
resolved section frames, and resolving a station is curve evaluation";
/// Why an `IfcSectionedSurface` is refused.
pub const SECTIONED_SURFACE: &str =
"kernel: no neutral sectioned-surface relation exists; its open sections \
stand at IfcAxis2PlacementLinear stations along the directrix and are \
joined by tag, and the neutral SectionedSpine is a solid over area \
profiles";
/// Refuse an `IfcSectionedSolidHorizontal` with its named reason.
pub
/// Refuse an `IfcSectionedSurface` with its named reason.
pub