@prefix twb:     <https://w3id.org/twb#> .
@prefix bot:     <https://w3id.org/bot#> .
@prefix prov:    <http://www.w3.org/ns/prov#> .
@prefix geo:     <http://www.opengis.net/ont/geosparql#> .
@prefix owl:     <http://www.w3.org/2002/07/owl#> .
@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd:     <http://www.w3.org/2001/XMLSchema#> .
@prefix skos:    <http://www.w3.org/2004/02/skos/core#> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix vann:    <http://purl.org/vocab/vann/> .
@prefix unit:    <http://qudt.org/vocab/unit/> .

# =================================================================================================
#  TWB core — a module of the Thin-Walled Blueprint ontology (TWB)
#
#  The skeleton of a thin-walled blueprint: the blueprint itself, its storeys, the zones (rooms,
#  environment zones, attics, the passages through doors) and the fittings in them, the zero-
#  thickness surfaces with their sides and zone boundaries, the openings they host, the edges and
#  nodes where they meet, line elements and foundations, and the project frame. It says nothing of
#  what anything is built of: that is the other modules'. Extends the Building Topology Ontology
#  (BOT): a surface is a bot:Element in its thin form; edges, zone boundaries, zone separations,
#  opening edges, nodes and passages are bot:Interface.
#
#  TWB is modular, as SEAS is: one namespace (twb:, https://w3id.org/twb#) shared by every module,
#  each module an ontology of its own that imports only the modules it builds on, and every term
#  stating the module that defines it (rdfs:isDefinedBy). https://w3id.org/twb imports them all.
#
#  Working draft, version 0.3.0 (2026-10-13).
# =================================================================================================

<https://w3id.org/twb/core>
    a owl:Ontology ;
    dcterms:title "TWB core"@en ;
    dcterms:description """The skeleton of a thin-walled blueprint: the blueprint itself, its storeys, the zones (rooms,
environment zones, attics, the passages through doors) and the fittings in them, the zero-thickness surfaces with
their sides and zone boundaries, the openings they host, the edges and nodes where they meet, line elements and
foundations, and the project frame. It says nothing of what anything is built of: that is the other modules'.
Extends the Building Topology Ontology (BOT): a surface is a bot:Element in its thin form; edges, zone
boundaries, zone separations, opening edges, nodes and passages are bot:Interface."""@en ;
    dcterms:creator "Mads Holten Rasmussen" ;
    dcterms:license <https://creativecommons.org/licenses/by/4.0/> ;
    dcterms:isPartOf <https://w3id.org/twb> ;
    vann:preferredNamespacePrefix "twb" ;
    vann:preferredNamespaceUri "https://w3id.org/twb#" ;
    owl:versionInfo "0.3.0" ;
    owl:versionIRI <https://w3id.org/twb/core/0.3.0> ;
    dcterms:modified "2026-10-13"^^xsd:date .

# =================================================================================================
#  Annotation properties
# =================================================================================================

twb:unit
    a owl:AnnotationProperty ;
    rdfs:label "unit"@en ;
    rdfs:comment "The QUDT unit in which the values of a datatype property are given."@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:archTerm
    a owl:AnnotationProperty ;
    rdfs:label "arch term"@en ;
    rdfs:comment "The identifier of the corresponding type, field or registry entry in the arch reference implementation."@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:ifcCounterpart
    a owl:AnnotationProperty ;
    rdfs:label "IFC counterpart"@en ;
    rdfs:comment "The closest IFC4 concept, for orientation only. It is not an equivalence."@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

# =================================================================================================
#  Blueprint
# =================================================================================================

twb:Blueprint
    a owl:Class ;
    rdfs:subClassOf prov:Plan ;
    rdfs:label "Blueprint"@en ;
    rdfs:comment """The authored template of one building: its storeys, surfaces, zones, openings and the project-level
recipes, standards, templates and rules that detail them. A blueprint is a plan in the PROV sense: the derived
element-level building is generated by a twb:Derivation that follows it."""@en ;
    twb:archTerm "HouseFile (model/house-file.ts)" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:describesBuilding
    a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "describes building"@en ;
    rdfs:domain twb:Blueprint ;
    rdfs:range bot:Building ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:hasBlueprintPart
    a owl:ObjectProperty ;
    rdfs:label "has blueprint part"@en ;
    rdfs:comment "Links a blueprint to the authored things it consists of: storeys, surfaces, zones, recipes, standards, templates."@en ;
    rdfs:domain twb:Blueprint ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:derivedFrom
    a owl:ObjectProperty ;
    rdfs:subPropertyOf prov:wasDerivedFrom ;
    rdfs:label "derived from"@en ;
    rdfs:comment "Links a derived element to the blueprint thing it was derived from: a surface, an edge, an opening or a line."@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

# =================================================================================================
#  Zones
# =================================================================================================

twb:Room
    a owl:Class ;
    rdfs:subClassOf bot:Space ;
    rdfs:label "Room"@en ;
    rdfs:comment """A space on one storey whose purpose is authored (twb:zoneKind) and whose outline is derived from the
surfaces and zone separations that enclose it. Only a point inside it (twb:seed) is stored."""@en ;
    twb:archTerm "Zone (packages/model/src/zone.ts)" ;
    twb:ifcCounterpart "IfcSpace" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:EnvironmentZone
    a owl:Class ;
    rdfs:subClassOf bot:Zone ;
    rdfs:label "Environment zone"@en ;
    rdfs:comment """What lies on the far side of a surface when it is not a room of the building: the outdoor air, the
ground, a ventilated crawl space, an unheated space. Modelled as zones so that every surface side faces a zone,
and adjacency rules need no special case for the exterior."""@en ;
    twb:ifcCounterpart "IfcRelSpaceBoundary.InternalOrExternalBoundary" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:OutdoorAir
    a twb:EnvironmentZone ;
    twb:isHeated false ;
    rdfs:label "Outdoor air"@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:Ground
    a twb:EnvironmentZone ;
    twb:isHeated false ;
    rdfs:label "Ground"@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:CrawlSpace
    a twb:EnvironmentZone ;
    twb:isHeated false ;
    rdfs:label "Ventilated crawl space"@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:UnheatedSpace
    a twb:EnvironmentZone ;
    twb:isHeated false ;
    rdfs:label "Unheated space"@en ;
    rdfs:comment "A space outside the heated volume that is not outdoor air: a cold attic, a garage, a shed."@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:zoneKind
    a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "zone kind"@en ;
    rdfs:domain twb:Room ;
    rdfs:range twb:ZoneKind ;
    twb:archTerm "Zone.kindId (apps/frame-builder/src/zones/zone-kinds.ts)" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:ZoneKind
    a owl:Class ;
    rdfs:subClassOf skos:Concept ;
    rdfs:label "Zone kind"@en ;
    rdfs:comment "What a room is for. The qualities rules read (wet, heated, ventilation role) are stated on the kind."@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:isWet
    a owl:DatatypeProperty ;
    rdfs:label "is wet"@en ;
    rdfs:comment "Whether rooms of this kind are wet rooms (floor drain, shower), with consequences for their linings."@en ;
    rdfs:domain twb:ZoneKind ;
    rdfs:range xsd:boolean ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:isHeated
    a owl:DatatypeProperty ;
    rdfs:label "is heated"@en ;
    rdfs:comment "Whether a zone, or the rooms of a kind, are inside the heated volume."@en ;
    rdfs:range xsd:boolean ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:ventilationRole
    a owl:ObjectProperty ;
    rdfs:label "ventilation role"@en ;
    rdfs:domain twb:ZoneKind ;
    rdfs:range twb:VentilationRole ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:VentilationRole
    a owl:Class ;
    rdfs:subClassOf skos:Concept ;
    rdfs:label "Ventilation role"@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:Fixture
    a owl:Class ;
    rdfs:subClassOf bot:Element ;
    rdfs:label "Fixture"@en ;
    rdfs:comment """A fixed fitting in a room: a WC, a basin, a worktop, a kitchen island, an appliance, a shower, a bathtub.
Authored as its kind (twb:fixtureKind), its storey, the centre of its footprint (twb:pointMm) and, when they differ
from the kind's own, its size (twb:footprintMm) and the way its front faces (twb:facing). The room it stands in is not
stored: it is the room around its centre, so that a file cannot place a basin in a room it is not in. (0.2.0)"""@en ;
    twb:archTerm "Fixture (apps/frame-builder/src/room-fixtures/fixtures.ts)" ;
    twb:ifcCounterpart "IfcSanitaryTerminal, IfcFurniture, IfcElectricAppliance" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:fixtureKind
    a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "fixture kind"@en ;
    rdfs:domain twb:Fixture ;
    rdfs:range twb:FixtureKind ;
    twb:archTerm "Fixture.kind" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:FixtureKind
    a owl:Class ;
    rdfs:subClassOf skos:Concept ;
    rdfs:label "Fixture kind"@en ;
    rdfs:comment "What a fitting is. Its common size and whether it covers the floor are stated on the kind."@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:fixtureVariant
    a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "fixture variant"@en ;
    rdfs:comment """Which way of its kind a fitting comes: a WC floor-standing or wall-hung, a floor drain linear (Unidrain) or a
point drain (Blücher). Stated when read off the drawing or picked by the user; left out, the kind's default. (#251)"""@en ;
    rdfs:domain twb:Fixture ;
    rdfs:range twb:FixtureVariant ;
    twb:archTerm "Fixture.variant" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:FixtureVariant
    a owl:Class ;
    rdfs:subClassOf skos:Concept ;
    rdfs:label "Fixture variant"@en ;
    rdfs:comment "One way a kind of fitting comes: the kinds it is a way of are its twb:variantOf."@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:variantOf
    a owl:ObjectProperty ;
    rdfs:label "variant of"@en ;
    rdfs:comment "A kind of fitting this is a way of. One variant may serve several kinds: a WC and a basin are both wall-hung."@en ;
    rdfs:domain twb:FixtureVariant ;
    rdfs:range twb:FixtureKind ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:defaultWidth
    a owl:DatatypeProperty ;
    rdfs:label "default width"@en ;
    rdfs:comment "The width along the front a fitting of this kind has when its file gives none."@en ;
    rdfs:domain twb:FixtureKind ;
    rdfs:range xsd:decimal ;
    twb:unit unit:MilliM ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:defaultDepth
    a owl:DatatypeProperty ;
    rdfs:label "default depth"@en ;
    rdfs:comment "The depth back from the front a fitting of this kind has when its file gives none."@en ;
    rdfs:domain twb:FixtureKind ;
    rdfs:range xsd:decimal ;
    twb:unit unit:MilliM ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:coversFloor
    a owl:DatatypeProperty ;
    rdfs:label "covers floor"@en ;
    rdfs:comment """Whether fittings of this kind stand on the floor over their whole footprint (base units, an island, an
appliance, a bathtub), so that floor heating is kept out from under them. A WC, a basin and a shower do not."""@en ;
    rdfs:domain twb:FixtureKind ;
    rdfs:range xsd:boolean ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:Supply a twb:VentilationRole ; skos:prefLabel "supply"@en ; skos:inScheme twb:VentilationRoles ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:Extract a twb:VentilationRole ; skos:prefLabel "extract"@en ; skos:inScheme twb:VentilationRoles ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:Neutral a twb:VentilationRole ; skos:prefLabel "neutral"@en ; skos:inScheme twb:VentilationRoles ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:VentilationRoles a skos:ConceptScheme ; skos:prefLabel "Ventilation roles"@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:seed
    a owl:ObjectProperty ;
    rdfs:label "seed"@en ;
    rdfs:comment "A point inside the room, from which its outline is found. The outline itself is derived, never stored."@en ;
    rdfs:domain twb:Room ;
    rdfs:range geo:Geometry ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:ZoneSeparation
    a owl:Class ;
    rdfs:subClassOf bot:Interface ;
    rdfs:label "Zone separation"@en ;
    rdfs:comment """A line in plan dividing two rooms where no surface stands between them (an open kitchen and its
living room). It bounds rooms and nothing else: it carries no recipe and is realised by nothing."""@en ;
    twb:archTerm "ZoneSeparation (packages/model/src/zone.ts)" ;
    twb:ifcCounterpart "IfcVirtualElement with IfcRelSpaceBoundary (VIRTUAL)" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

# --- Ceilings and attics (0.2.0) --------------------------------------------------------------------

twb:ceilingKind
    a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "ceiling kind"@en ;
    rdfs:comment """How a room is ceiled: a choice, not a height. Left out, a room is ceiled flat. The ceiling surfaces this
implies are derived (twb:CeilingSurface), and so is the attic over them (twb:Attic)."""@en ;
    rdfs:domain twb:Room ;
    rdfs:range twb:CeilingKind ;
    twb:archTerm "Zone.ceiling (packages/model/src/zone.ts)" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:CeilingKind a owl:Class ; rdfs:subClassOf skos:Concept ; rdfs:label "Ceiling kind"@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:CeilingKinds a skos:ConceptScheme ; skos:prefLabel "Ceiling kinds"@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:FlatCeiling a twb:CeilingKind ; skos:prefLabel "flat"@en ; skos:notation "flat" ; skos:inScheme twb:CeilingKinds ;
    skos:definition "Flat on the top of the room's walls: under a pitched roof the trusses' bottom chords or the ceiling joists tying the rafters, under a floor its joists."@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:OpenCeiling a twb:CeilingKind ; skos:prefLabel "open"@en ; skos:notation "open" ; skos:inScheme twb:CeilingKinds ;
    skos:definition "Open to the floor above or the roof; the partitions round the room run up to it."@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:LoweredCeiling a twb:CeilingKind ; skos:prefLabel "lowered"@en ; skos:notation "lowered" ; skos:inScheme twb:CeilingKinds ;
    skos:definition "Hung lower than the walls' top, at twb:ceilingHeight."@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:ceilingHeight
    a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:label "ceiling height"@en ;
    rdfs:comment "A lowered ceiling's height above its storey's floor, on the frame's centreline like every height."@en ;
    rdfs:domain twb:Room ;
    rdfs:range xsd:decimal ;
    twb:unit unit:MilliM ;
    twb:archTerm "Zone.ceilingMm" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:Attic
    a owl:Class ;
    rdfs:subClassOf bot:Space ;
    rdfs:label "Attic"@en ;
    rdfs:comment """Derived: the space between ceilings and the roof over them; ceilings side by side make one attic. It is
cold when insulated at its ceilings and inside the heated volume when insulated at the roof, whichever loses the
least heat."""@en ;
    twb:archTerm "AtticZone (envelope/attic.ts)" ;
    twb:ifcCounterpart "IfcSpace (USERDEFINED)" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:insulatedAt
    a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "insulated at"@en ;
    rdfs:domain twb:Attic ;
    rdfs:range twb:AtticInsulation ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:AtticInsulation a owl:Class ; rdfs:subClassOf skos:Concept ; rdfs:label "Attic insulation"@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:AtticInsulations a skos:ConceptScheme ; skos:prefLabel "Attic insulation"@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:InsulatedAtCeiling a twb:AtticInsulation ; skos:prefLabel "at the ceiling (cold attic)"@en ; skos:notation "ceiling" ; skos:inScheme twb:AtticInsulations ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:InsulatedAtRoof a twb:AtticInsulation ; skos:prefLabel "at the roof (warm attic)"@en ; skos:notation "roof" ; skos:inScheme twb:AtticInsulations ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:atticOver
    a owl:ObjectProperty ;
    rdfs:label "attic over"@en ;
    rdfs:comment "A room an attic lies over."@en ;
    rdfs:domain twb:Attic ;
    rdfs:range twb:Room ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

# --- Passages through doors (0.2.0) -----------------------------------------------------------------

twb:Passage
    a owl:Class ;
    rdfs:subClassOf bot:Interface ;
    rdfs:label "Passage"@en ;
    rdfs:comment """Derived: the way through a door between the two zones on its sides — a door between two rooms, or the
front door between a room and the outdoor air. Passages make the blueprint a graph of rooms one can walk, and are
where it is said from which side a door can be opened (twb:openableFrom)."""@en ;
    twb:ifcCounterpart "IfcRelSpaceBoundary through an IfcDoor; IfcDoor.OperationType" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:passageThrough
    a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:subPropertyOf bot:interfaceOf ;
    rdfs:label "passage through"@en ;
    rdfs:domain twb:Passage ;
    rdfs:range twb:Door ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:connectsZone
    a owl:ObjectProperty ;
    rdfs:subPropertyOf bot:interfaceOf ;
    rdfs:label "connects zone"@en ;
    rdfs:comment "One of the two zones a passage connects."@en ;
    rdfs:domain twb:Passage ;
    rdfs:range bot:Zone ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:openableFrom
    a owl:ObjectProperty ;
    rdfs:label "openable from"@en ;
    rdfs:comment "A zone from which the passage's door can be opened. Left out, from both; stated, an access restriction."@en ;
    rdfs:domain twb:Passage ;
    rdfs:range bot:Zone ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:leadsTo
    a owl:ObjectProperty ;
    rdfs:label "leads to"@en ;
    rdfs:comment """Derived: one can walk from this zone into that one through a passage whose door opens from this side
(rule 41). Not symmetric once a passage is restricted with twb:openableFrom, so that the rooms one can reach and
the rooms one can leave are two questions (CQ15), and a room one cannot leave is a finding (twbsh:EgressShape)."""@en ;
    rdfs:domain bot:Zone ;
    rdfs:range bot:Zone ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

# =================================================================================================
#  Surfaces and their sides
# =================================================================================================

twb:Surface
    a owl:Class ;
    rdfs:subClassOf bot:Element ;
    rdfs:label "Surface"@en ;
    rdfs:comment """A planar, zero-thickness polygon on the reference plane of a wall, floor or roof — in a timber frame,
the centreline of its studs, joists or rafters. It is the thin-walled form of a building element: the recipe it
carries says what it is made of, its edges say how it meets its neighbours, and the zones on its two sides say
what it must do. What kind of surface it is (wall, floor, roof) is read off its geometry and may be pinned."""@en ;
    twb:archTerm "Surface (packages/model/src/surface.ts)" ;
    twb:ifcCounterpart "IfcWall / IfcSlab / IfcRoof with an Axis or reference-surface representation and IfcMaterialLayerSetUsage" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:WallSurface
    a owl:Class ;
    rdfs:subClassOf twb:Surface ;
    rdfs:label "Wall surface"@en ;
    rdfs:comment "A vertical surface."@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:FloorSurface
    a owl:Class ;
    rdfs:subClassOf twb:Surface ;
    rdfs:label "Floor surface"@en ;
    rdfs:comment "A horizontal surface at the lowest level of the model, or one that something stands on."@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:RoofSurface
    a owl:Class ;
    rdfs:subClassOf twb:Surface ;
    rdfs:label "Roof surface"@en ;
    rdfs:comment "A sloped surface, or a horizontal one that nothing stands on."@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:CeilingSurface
    a owl:Class ;
    rdfs:subClassOf twb:Surface ;
    rdfs:label "Ceiling surface"@en ;
    rdfs:comment """Derived (0.2.0): the horizontal surface a room's ceiling choice implies, at the top of its walls or at
its lowered height. It carries the ceiling recipe and is the floor of the attic over it."""@en ;
    twb:archTerm "RoomCeiling (recipe/room-ceilings.ts), AtticSpace.ceilingId (envelope/attic.ts)" ;
    twb:ifcCounterpart "IfcCovering (CEILING) / IfcSlab" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:ceilingOf
    a owl:ObjectProperty ;
    rdfs:subPropertyOf twb:derivedFrom ;
    rdfs:label "ceiling of"@en ;
    rdfs:comment "A room whose ceiling choice a ceiling surface was derived from."@en ;
    rdfs:domain twb:CeilingSurface ;
    rdfs:range twb:Room ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:surfacePartOf
    a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:subPropertyOf twb:derivedFrom ;
    rdfs:label "surface part of"@en ;
    rdfs:comment """Derived (0.2.0): the authored surface a part was split from where something crosses it — a gable split
at the ceiling into the wall below and the attic's wall above — so that each part carries its own recipe."""@en ;
    rdfs:domain twb:Surface ;
    rdfs:range twb:Surface ;
    twb:archTerm "AtticLayout.sources (envelope/attic.ts)" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:pinnedStudSection
    a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:label "pinned stud section"@en ;
    rdfs:comment "A stud section pinned for this one wall, by catalogue id. Left out, framing sizes it."@en ;
    rdfs:domain twb:WallSurface ;
    rdfs:range xsd:string ;
    twb:archTerm "Surface.studSection" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:kindPinned
    a owl:DatatypeProperty ;
    rdfs:label "kind pinned"@en ;
    rdfs:comment "True when the surface's kind was stated by its author rather than read off its geometry."@en ;
    rdfs:domain twb:Surface ;
    rdfs:range xsd:boolean ;
    twb:archTerm "Surface.kindOverride" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:loadBearing
    a owl:DatatypeProperty ;
    rdfs:label "load bearing"@en ;
    rdfs:domain twb:Surface ;
    rdfs:range xsd:boolean ;
    twb:archTerm "Surface.loadBearing" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:RoofGroup
    a owl:Class ;
    rdfs:label "Roof group"@en ;
    rdfs:comment "The planes of one roof, framed on one rafter grid (a dormer is its own group)."@en ;
    twb:archTerm "Surface.roofGroupId" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:inRoofGroup
    a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "in roof group"@en ;
    rdfs:domain twb:RoofSurface ;
    rdfs:range twb:RoofGroup ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:SurfaceSide
    a owl:Class ;
    rdfs:label "Surface side"@en ;
    rdfs:comment """One of the two faces of a thin surface: the one its normal points out of (positive) or the other
(negative). Sides are where zones meet a surface, where requirements and coverings attach, and how a recipe is
oriented: its first layer lies on the inside side."""@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:hasSide
    a owl:ObjectProperty, owl:InverseFunctionalProperty ;
    rdfs:label "has side"@en ;
    rdfs:domain twb:Surface ;
    rdfs:range twb:SurfaceSide ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:positiveSide
    a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:subPropertyOf twb:hasSide ;
    rdfs:label "positive side"@en ;
    rdfs:comment "The side the surface normal points out of. The normal follows the winding of the boundary."@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:negativeSide
    a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:subPropertyOf twb:hasSide ;
    rdfs:label "negative side"@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:isInside
    a owl:DatatypeProperty ;
    rdfs:label "is inside"@en ;
    rdfs:comment """True for the side the surface's recipe starts from — the warm side of an envelope surface. For an
interior partition with a symmetric build-up the choice is conventional."""@en ;
    rdfs:domain twb:SurfaceSide ;
    rdfs:range xsd:boolean ;
    twb:ifcCounterpart "IfcMaterialLayerSetUsage.DirectionSense" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:facesZone
    a owl:ObjectProperty ;
    rdfs:label "faces zone"@en ;
    rdfs:comment "The zones a side faces. A side may face several rooms; the shares are given by twb:ZoneBoundary."@en ;
    rdfs:domain twb:SurfaceSide ;
    rdfs:range bot:Zone ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:ZoneBoundary
    a owl:Class ;
    rdfs:subClassOf bot:Interface ;
    rdfs:label "Zone boundary"@en ;
    rdfs:comment """The part of one side of a surface that one zone faces, with its area: the interface between a zone and
a surface (a second-level space boundary in IFC terms). Requirements that depend on adjacency are inferred here."""@en ;
    twb:ifcCounterpart "IfcRelSpaceBoundary2ndLevel" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:onSide
    a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "on side"@en ;
    rdfs:domain twb:ZoneBoundary ;
    rdfs:range twb:SurfaceSide ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:area
    a owl:DatatypeProperty ;
    rdfs:label "area"@en ;
    rdfs:range xsd:decimal ;
    twb:unit unit:M2 ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

# =================================================================================================
#  Openings
# =================================================================================================

twb:Opening
    a owl:Class ;
    rdfs:subClassOf bot:Element ;
    rdfs:label "Opening"@en ;
    rdfs:comment """A rectangle in a surface's own frame and what fills it. Its position is stored in that frame so that it
stays put when the surface is moved or re-pitched. Hosted by its surface (bot:hostsElement)."""@en ;
    twb:archTerm "SurfaceOpening" ;
    twb:ifcCounterpart "IfcOpeningElement with IfcWindow or IfcDoor (IfcRelVoidsElement, IfcRelFillsElement)" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:Window a owl:Class ; rdfs:subClassOf twb:Opening ; rdfs:label "Window"@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:Door a owl:Class ; rdfs:subClassOf twb:Opening ; rdfs:label "Door"@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:GarageDoor a owl:Class ; rdfs:subClassOf twb:Opening ; rdfs:label "Garage door"@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:RoofWindow a owl:Class ; rdfs:subClassOf twb:Window ; rdfs:label "Roof window"@en ;
    rdfs:comment "A window hosted by a roof surface (0.2.0). Its hole is sized from the product and checked against the rafters."@en ;
    twb:archTerm "roof-windows/ (VELUX catalogue)" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:hingeAtEnd a owl:DatatypeProperty ; rdfs:label "hinge at end"@en ;
    rdfs:comment "A door hinged on its far jamb (along the host's u axis) rather than its near one."@en ;
    rdfs:domain twb:Door ; rdfs:range xsd:boolean ; twb:archTerm "DoorSwing.hingeAtEnd" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:swingsBack a owl:DatatypeProperty ; rdfs:label "swings back"@en ;
    rdfs:comment "A door that opens to the back (the negative side) of its host surface."@en ;
    rdfs:domain twb:Door ; rdfs:range xsd:boolean ; twb:archTerm "DoorSwing.swingsBack" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:doorLeaves a owl:ObjectProperty, owl:FunctionalProperty ; rdfs:label "door leaves"@en ;
    rdfs:domain twb:Door ; rdfs:range twb:DoorLeaves ; twb:archTerm "DoorLeaves" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:DoorLeaves a owl:Class ; rdfs:subClassOf skos:Concept ; rdfs:label "Door leaves"@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:DoorLeavesScheme a skos:ConceptScheme ; skos:prefLabel "Door leaves"@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:SingleLeaf a twb:DoorLeaves ; skos:prefLabel "single"@en ; skos:notation "single" ; skos:inScheme twb:DoorLeavesScheme ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:OneAndAHalfLeaves a twb:DoorLeaves ; skos:prefLabel "one and a half"@en ; skos:notation "one-and-a-half" ; skos:inScheme twb:DoorLeavesScheme ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:DoubleLeaves a twb:DoorLeaves ; skos:prefLabel "double"@en ; skos:notation "double" ; skos:inScheme twb:DoorLeavesScheme ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:glazingDivision a owl:DatatypeProperty, owl:FunctionalProperty ; rdfs:label "glazing division"@en ;
    rdfs:comment "How a window's or a glazed door's frame is divided, as its elevation shows it: a JSON object of mullions (vertical posts), transoms (horizontal ones) and panes ([across, up] per field, the glazing bars). Absent is one undivided pane."@en ;
    rdfs:domain twb:Opening ; rdfs:range rdf:JSON ; twb:archTerm "OpeningGlazing" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:Hole
    a owl:Class ;
    rdfs:label "Hole"@en ;
    rdfs:comment "A void in a surface that nothing fills. It is left out of the surface's recipe entirely."@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:hasHole
    a owl:ObjectProperty ;
    rdfs:label "has hole"@en ;
    rdfs:domain twb:Surface ;
    rdfs:range twb:Hole ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:u a owl:DatatypeProperty ; rdfs:label "u"@en ;
    rdfs:comment "Distance along the host surface's u axis to the opening's near edge."@en ;
    rdfs:domain twb:Opening ; rdfs:range xsd:decimal ; twb:unit unit:MilliM ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:v a owl:DatatypeProperty ; rdfs:label "v"@en ;
    rdfs:comment "Distance along the host surface's v axis (up, on a wall) to the opening's underside."@en ;
    rdfs:domain twb:Opening ; rdfs:range xsd:decimal ; twb:unit unit:MilliM ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:width a owl:DatatypeProperty ; rdfs:label "width"@en ; rdfs:range xsd:decimal ; twb:unit unit:MilliM ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:height a owl:DatatypeProperty ; rdfs:label "height"@en ; rdfs:range xsd:decimal ; twb:unit unit:MilliM ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:OpeningEdge
    a owl:Class ;
    rdfs:subClassOf bot:Interface ;
    rdfs:label "Opening edge"@en ;
    rdfs:comment "One side of an opening's perimeter — head, sill or jamb — as the interface between the opening and its host surface."@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:hasPerimeterEdge
    a owl:ObjectProperty, owl:InverseFunctionalProperty ;
    rdfs:label "has perimeter edge"@en ;
    rdfs:domain twb:Opening ;
    rdfs:range twb:OpeningEdge ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:openingEdgeRole
    a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "opening edge role"@en ;
    rdfs:domain twb:OpeningEdge ;
    rdfs:range twb:OpeningEdgeRole ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:OpeningEdgeRole a owl:Class ; rdfs:subClassOf skos:Concept ; rdfs:label "Opening edge role"@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:Head a twb:OpeningEdgeRole ; skos:prefLabel "head"@en ; skos:inScheme twb:OpeningEdgeRoles ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:Sill a twb:OpeningEdgeRole ; skos:prefLabel "sill"@en ; skos:definition "The bottom edge of a window."@en ; skos:inScheme twb:OpeningEdgeRoles ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:Threshold a twb:OpeningEdgeRole ; skos:prefLabel "threshold"@en ; skos:definition "The bottom edge of a door."@en ; skos:inScheme twb:OpeningEdgeRoles ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:Jamb a twb:OpeningEdgeRole ; skos:prefLabel "jamb"@en ; skos:inScheme twb:OpeningEdgeRoles ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:OpeningEdgeRoles a skos:ConceptScheme ; skos:prefLabel "Opening edge roles"@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

# =================================================================================================
#  Edges and their types
# =================================================================================================

twb:Edge
    a owl:Class ;
    rdfs:subClassOf bot:Interface ;
    rdfs:label "Edge"@en ;
    rdfs:comment """A straight stretch where surfaces meet — a corner, an eave, a ridge, a wall foot — or, for a roof, an edge
that meets nothing (a free edge). It is the interface between the elements its surfaces stand for, and the place
where the joint between their recipes is specified."""@en ;
    twb:archTerm "EnvelopeEdge (envelope/edge-joints.ts)" ;
    twb:ifcCounterpart "IfcRelConnectsPathElements (walls), IfcRelConnectsElements with IfcConnectionCurveGeometry" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:edgeOf
    a owl:ObjectProperty ;
    rdfs:subPropertyOf bot:interfaceOf ;
    rdfs:label "edge of"@en ;
    rdfs:comment "The surfaces meeting at the edge: two at a junction, one at a free edge."@en ;
    rdfs:domain twb:Edge ;
    rdfs:range twb:Surface ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:alongInteriorOf
    a owl:ObjectProperty ;
    rdfs:subPropertyOf bot:interfaceOf ;
    rdfs:label "along interior of"@en ;
    rdfs:comment """The surface whose interior — not boundary — the edge runs along: the through wall of a T-junction, the
deck a partition stands on. Such an edge is a boundary edge of its other surface only."""@en ;
    rdfs:domain twb:Edge ;
    rdfs:range twb:Surface ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:edgeType
    a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "edge type"@en ;
    rdfs:comment "What kind of junction the edge is. Derived from the kinds, recipes and geometry of its surfaces."@en ;
    rdfs:domain twb:Edge ;
    rdfs:range twb:EdgeType ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:EdgeType
    a owl:Class ;
    rdfs:subClassOf skos:Concept ;
    rdfs:label "Edge type"@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:EdgeTypes a skos:ConceptScheme ; skos:prefLabel "Edge types"@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:WallWallJunction a twb:EdgeType ; skos:prefLabel "wall–wall junction"@en ; skos:inScheme twb:EdgeTypes ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:OutsideCorner a twb:EdgeType ; skos:broader twb:WallWallJunction ; skos:inScheme twb:EdgeTypes ;
    skos:prefLabel "outside corner"@en ; skos:notation "wall-corner" ;
    skos:definition "Two exterior walls meeting at a convex corner of the building."@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:InsideCorner a twb:EdgeType ; skos:broader twb:WallWallJunction ; skos:inScheme twb:EdgeTypes ;
    skos:prefLabel "inside corner"@en ; skos:notation "wall-corner:inside" ;
    skos:definition "Two exterior walls meeting at a re-entrant corner."@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:TJunction a twb:EdgeType ; skos:broader twb:WallWallJunction ; skos:inScheme twb:EdgeTypes ;
    skos:prefLabel "T-junction"@en ; skos:notation "wall-partition" ;
    skos:definition "A partition meeting an exterior wall, its end edge lying along the other wall."@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:PartitionJunction a twb:EdgeType ; skos:broader twb:WallWallJunction ; skos:inScheme twb:EdgeTypes ;
    skos:prefLabel "partition junction"@en ;
    skos:definition "Two interior partitions meeting, in a corner, a T or a cross."@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:InPlaneJoint a twb:EdgeType ; skos:inScheme twb:EdgeTypes ;
    skos:prefLabel "in-plane joint"@en ;
    skos:definition "Two surfaces continuing in one plane — a wall split by a storey line or a change of recipe."@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:RoofWallJunction a twb:EdgeType ; skos:prefLabel "roof–wall junction"@en ; skos:inScheme twb:EdgeTypes ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:Eave a twb:EdgeType ; skos:broader twb:RoofWallJunction ; skos:inScheme twb:EdgeTypes ;
    skos:prefLabel "eave"@en ; skos:notation "eave" ;
    skos:definition "A roof meeting the wall under its low, level edge (or its high edge, on a monopitch)."@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:Verge a twb:EdgeType ; skos:broader twb:RoofWallJunction ; skos:inScheme twb:EdgeTypes ;
    skos:prefLabel "verge"@en ; skos:notation "verge" ;
    skos:definition "A roof meeting the gable wall under its sloping edge."@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:RoofRoofJunction a twb:EdgeType ; skos:prefLabel "roof–roof junction"@en ; skos:inScheme twb:EdgeTypes ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:Ridge a twb:EdgeType ; skos:broader twb:RoofRoofJunction ; skos:inScheme twb:EdgeTypes ; skos:prefLabel "ridge"@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:Hip a twb:EdgeType ; skos:broader twb:RoofRoofJunction ; skos:inScheme twb:EdgeTypes ; skos:prefLabel "hip"@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:Valley a twb:EdgeType ; skos:broader twb:RoofRoofJunction ; skos:inScheme twb:EdgeTypes ; skos:prefLabel "valley"@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:WallFloorJunction a twb:EdgeType ; skos:prefLabel "wall–floor junction"@en ; skos:notation "wall-floor" ; skos:inScheme twb:EdgeTypes ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:WallFoot a twb:EdgeType ; skos:broader twb:WallFloorJunction ; skos:inScheme twb:EdgeTypes ;
    skos:prefLabel "wall foot"@en ; skos:definition "An exterior wall standing on a floor deck."@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:WallHead a twb:EdgeType ; skos:broader twb:WallFloorJunction ; skos:inScheme twb:EdgeTypes ;
    skos:prefLabel "wall head"@en ; skos:definition "An exterior wall meeting the deck or ceiling above it."@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:PartitionFoot a twb:EdgeType ; skos:broader twb:WallFloorJunction ; skos:inScheme twb:EdgeTypes ;
    skos:prefLabel "partition foot"@en ; skos:definition "A partition standing on a floor deck, along the deck's interior."@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:PartitionHead a twb:EdgeType ; skos:inScheme twb:EdgeTypes ;
    skos:prefLabel "partition head"@en ;
    skos:definition "A partition meeting the deck, ceiling or roof above it, along that surface's interior."@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:CeilingJunction a twb:EdgeType ; skos:prefLabel "ceiling junction"@en ; skos:inScheme twb:EdgeTypes ;
    skos:definition "Where a derived ceiling surface meets what stands round its room: the walls it rests on, or the roof at the eaves (0.2.0)."@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:FreeEdge a twb:EdgeType ; skos:inScheme twb:EdgeTypes ;
    skos:prefLabel "free edge"@en ;
    skos:definition "An edge of a surface that meets no other surface: the eave of a carport roof, the high edge of a monopitch."@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:isInsideCorner
    a owl:DatatypeProperty ;
    rdfs:label "is inside corner"@en ;
    rdfs:comment "True where the two surfaces face each other's outside, as in a re-entrant corner."@en ;
    rdfs:domain twb:Edge ;
    rdfs:range xsd:boolean ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:length
    a owl:DatatypeProperty ;
    rdfs:label "length"@en ;
    rdfs:range xsd:decimal ;
    twb:unit unit:MilliM ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:overhang
    a owl:DatatypeProperty ;
    rdfs:label "overhang"@en ;
    rdfs:comment "How far a roof's outer layers and rafters run on past this roof edge, measured in the roof's plane."@en ;
    rdfs:domain twb:Edge ;
    rdfs:range xsd:decimal ;
    twb:unit unit:MilliM ;
    twb:archTerm "RoofOverhangs.edges" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:defaultEavesOverhang
    a owl:DatatypeProperty ;
    rdfs:label "default eaves overhang"@en ;
    rdfs:domain twb:Blueprint ; rdfs:range xsd:decimal ; twb:unit unit:MilliM ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:defaultVergeOverhang
    a owl:DatatypeProperty ;
    rdfs:label "default verge overhang"@en ;
    rdfs:domain twb:Blueprint ; rdfs:range xsd:decimal ; twb:unit unit:MilliM ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

# =================================================================================================
#  Nodes: where edges meet
# =================================================================================================

twb:Node
    a owl:Class ;
    rdfs:subClassOf bot:Interface ;
    rdfs:label "Node"@en ;
    rdfs:comment """A point where edges meet: an eave's end at a verge, a ridge's end, a corner of the building. What runs
along the edges — trims, flashings, gutters — has to be finished there, and how takes both edges to say: the node
is to edges what the edge is to surfaces."""@en ;
    twb:archTerm "node (envelope/trim-nodes.ts)" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:nodeOf
    a owl:ObjectProperty ;
    rdfs:subPropertyOf bot:interfaceOf ;
    rdfs:label "node of"@en ;
    rdfs:domain twb:Node ;
    rdfs:range twb:Edge ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

# =================================================================================================
#  Line elements and foundations (0.2.0)
# =================================================================================================

twb:LineElement
    a owl:Class ;
    rdfs:subClassOf bot:Element ;
    rdfs:label "Line element"@en ;
    rdfs:comment "A piece of timber drawn as a line — a free column or beam, a pergola, a carport — with its role stated, not read off its geometry."@en ;
    twb:archTerm "FileLine, GuideRole (model/guide.ts)" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:Column a owl:Class ; rdfs:subClassOf twb:LineElement ; rdfs:label "Column"@en ; twb:ifcCounterpart "IfcColumn" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:Beam a owl:Class ; rdfs:subClassOf twb:LineElement ; rdfs:label "Beam"@en ; twb:ifcCounterpart "IfcBeam" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:Foundation
    a owl:Class ;
    rdfs:subClassOf bot:Element ;
    rdfs:label "Foundation"@en ;
    rdfs:comment """A foundation drawn in plan under the floor: a strip along a line, or one at a point. Its build-up and
size are derived by the program from the loads it carries and the ground it stands on (0.2.0)."""@en ;
    twb:archTerm "Foundation (foundation/foundation.ts)" ;
    twb:ifcCounterpart "IfcFooting / IfcPile" ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:StripFoundation a owl:Class ; rdfs:subClassOf twb:Foundation ; rdfs:label "Strip foundation"@en ;
    rdfs:comment "A foundation along a line, realised as foundation surfaces with plinth, footing and blinding recipes."@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:PadFoundation a owl:Class ; rdfs:subClassOf twb:Foundation ; rdfs:label "Pad foundation"@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:ScrewFoundation a owl:Class ; rdfs:subClassOf twb:Foundation ; rdfs:label "Screw foundation"@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:PileFoundation a owl:Class ; rdfs:subClassOf twb:Foundation ; rdfs:label "Pile foundation"@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
twb:isIncorporated
    a owl:DatatypeProperty ;
    rdfs:label "is incorporated"@en ;
    rdfs:comment "True when a foundation as drawn is in the model the building is derived from; a drawing still under check is not."@en ;
    rdfs:domain twb:Foundation ;
    rdfs:range xsd:boolean ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

# =================================================================================================
#  Storeys and geometry
# =================================================================================================

twb:elevation
    a owl:DatatypeProperty ;
    rdfs:label "elevation"@en ;
    rdfs:comment "Base elevation of a storey, at the reference plane of its floor."@en ;
    rdfs:domain bot:Storey ;
    rdfs:range xsd:decimal ;
    twb:unit unit:MilliM ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:storeyHeight
    a owl:DatatypeProperty ;
    rdfs:label "storey height"@en ;
    rdfs:comment "Reference plane to reference plane of the storey above."@en ;
    rdfs:domain bot:Storey ;
    rdfs:range xsd:decimal ;
    twb:unit unit:MilliM ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

twb:ProjectCRS
    a owl:Class ;
    rdfs:label "Project coordinate reference system"@en ;
    rdfs:comment """The local Cartesian frame geometry literals are given in: x east, y north, z up, in millimetres, origin
at the building's own reference point. Its IRI prefixes every WKT literal of a blueprint."""@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .

<https://w3id.org/twb/crs/project-mm>
    a twb:ProjectCRS ;
    rdfs:label "Project frame, millimetres"@en ;
    rdfs:isDefinedBy <https://w3id.org/twb/core> .
