Zum Inhalt

Eine Wandprüfung, Schritt für Schritt

Bilderreise: Seite 3 von 3

Dieses Beispiel macht aus einer geschriebenen Anforderung drei klare Prüfungen. Die ganze Seite ist ohne Code verständlich. Quellbeispiele bleiben eingeklappt, bis Sie sie anzeigen möchten.

Ein mit 331 markiertes Objekt wird darauf geprüft, Wand, tragend und außen zu sein

Ein Lernbeispiel

Diese Seite ist keine Rechts- oder Normenberatung. Sie verwendet ein geprüftes Lernbeispiel auf Grundlage der DIN-276-Kostengruppe 331. Nutzen Sie für die Produktion die lizenzierte Norm und die Klassifikationsregeln Ihres Projekts.

Das Ziel

Für jedes Objekt mit dem System DIN 276:2018-12 und dem Code 331 werden drei Fragen gestellt:

Frage Erwartete Antwort
Ist es eine Wand? Ja, einschließlich unterstützter Wanduntertypen
Ist es tragend? Ja, im benannten Wand-Property-Set
Ist es außenliegend? Ja, überall dort, wo das unterstützte Modell diese Information speichert

Die öffentliche IFC-Dokumentation bestätigt, dass Pset_WallCommon für Wände LoadBearing und IsExternal als Ja-/Nein-Eigenschaften definiert.

Schritt 1: Die wichtigen Dinge benennen

Wörterbuch

Zuerst erhalten die Ideen stabile Namen: eine Wand sowie die Informationen „tragend“ und „außenliegend“. Das Beispiel hält auch die passenden IFC-Namen fest. Die Prüfungen verwenden diese gemeinsamen Namen. Falls ein anderes Modellformat andere Namen nutzt, kann ein Werkzeug sie mit denselben Ideen verbinden.

Pkl-Quelltext anzeigen
objectTypes {
  ["axioval:example.ifc.wall"] = new Definitions.ObjectTypeDefinition {
    id = "axioval:example.ifc.wall"
    name = new Types.LocalizedText { default = "Wall" }
    externalNames {
      new Definitions.ExternalName {
        typeSystem = "https://identifier.buildingsmart.org/uri/buildingsmart/ifc/4.3"
        name = "IfcWall"
      }
    }
  }
}

properties {
  ["axioval:example.ifc.load-bearing"] = new Definitions.PropertyDefinition {
    id = "axioval:example.ifc.load-bearing"
    name = new Types.LocalizedText { default = "Load bearing" }
    valueKind = "boolean"
    externalNames {
      new Definitions.ExternalName {
        typeSystem = "https://identifier.buildingsmart.org/uri/buildingsmart/ifc/4.3"
        name = "LoadBearing"
      }
    }
  }
}

Schritt 2: Wiederverwendbare Prüfungsarten beschreiben

Rezept

Das Beispiel braucht zwei Rezepte: Den Typ eines Objekts mit einem erwarteten Typ vergleichen und eine Ja-/Nein-Information mit der erwarteten Antwort vergleichen. Ein Werkzeug muss ein Rezept bereits verstehen, bevor es es verwenden kann. Ein gemeinsames Paket beschreibt Prüfungen, fügt einem Werkzeug aber kein neues Prüfverhalten hinzu.

Pkl-Quelltext anzeigen
["axioval:example.boolean-property-equals"] = new Definitions.RuleDefinition {
  id = "axioval:example.boolean-property-equals"
  capability = "axioval:capability.property-value-equals"
  name = new Types.LocalizedText { default = "Boolean property equals" }
  parameters {
    ["property"] = new Definitions.ParameterDefinition {
      id = "property"
      kind = "propertyReference"
      referencedValueKind = "boolean"
    }
    ["expected"] = new Definitions.ParameterDefinition {
      id = "expected"
      kind = "boolean"
    }
  }
}

Schritt 3: Festlegen, was geprüft wird

Umfang

Wählen Sie jedes Objekt mit Code 331 aus, nicht nur Wände. Wäre eine Platte fälschlich als 331 markiert, würde eine Auswahl nur von Wänden sie verbergen, bevor die Wandprüfung sie melden könnte.

Pkl-Quelltext anzeigen
local kg331Objects = new Selectors.ClassificationSelector {
  system = "DIN 276:2018-12"
  code = "331"
  includeDescendants = false
}

Schritt 4: Die Wandprüfung ausfüllen

Ausgefüllte Karte

Nun wird das Rezept „Objekttyp gleich“ mit dem gemeinsamen Namen Wall verbunden und auf alle in Schritt 3 gewählten Objekte angewendet.

Pkl-Quelltext anzeigen
new RuleSets.RuleInstance {
  id = "kg331-is-wall"
  definitionId = "axioval:example.entity-type-equals"
  name = new Types.LocalizedText { default = "KG 331 objects are walls" }
  parameters {
    ["objectType"] = new Values.ObjectTypeReferenceValue {
      objectType = "axioval:example.ifc.wall"
      includeSubtypes = true
    }
  }
  applicability = kg331Objects
}

Schritt 5: Sagen, wann der Ort wichtig ist

Zwei Möglichkeiten

Die beiden Eigenschaftsprüfungen treffen bewusst unterschiedliche Entscheidungen.

Tragend: Der benannte Ort ist wichtig

Das Projekt erwartet LoadBearing in Pset_WallCommon. Die Prüfung nennt sowohl die Information als auch diesen genauen Ort. Dieselbe Information an anderer Stelle genügt nicht.

Pkl-Quelltext anzeigen
["property"] = new Values.PropertyReferenceValue {
  property = "axioval:example.ifc.load-bearing"
  propertySet = "axioval:example.ifc.pset-wall-common"
}
["expected"] = new Values.BooleanValue { value = true }

Außenliegend: Jeder unterstützte Ort ist in Ordnung

Diese Prüfung interessiert die Antwort, nicht der Name ihres Speicherorts. Ein Werkzeug durchsucht seine unterstützten Orte. Findet es widersprüchliche Antworten, muss es einen Konflikt melden, statt still eine auszuwählen.

Pkl-Quelltext anzeigen
["property"] = new Values.PropertyReferenceValue {
  property = "axioval:example.ifc.is-external"
}
["expected"] = new Values.BooleanValue { value = true }

Schritt 6: Das vollständige Paket prüfen

Bereit zum Teilen

Die abschließende Prüfung liest die Paketbezeichnung, öffnet nur die aufgelisteten Dateien, löst jeden gemeinsamen Namen auf, bestätigt jeden Wert und vergleicht das Ergebnis mit geprüften Beispielen. Fehlende, unbekannte, widersprüchliche oder falsch typisierte Teile stoppen den Ablauf.

Validierungsbefehl anzeigen
PATH="$HOME/.local/bin:$PATH" ./scripts/check.sh

Das Beispiel ist vollständig

Eine Objektgruppe wird ausgewählt. Drei getrennte Fragen werden gestellt. Jeder Fehler kann genau erklären, was falsch war.

Wie es weitergeht

Praktischer Leitfaden

Wann ist der Ort wichtig?

Entdecken Sie die zwei Möglichkeiten, auf eine Eigenschaft zu verweisen.

Leitfaden öffnen
Technisches Detail

Wie nimmt ein Werkzeug ein Paket an?

Lesen Sie den geordneten Vertrag für Sicherheit und Prüfung.

Vertiefung öffnen
Implementierungsaufgaben für Werkzeugentwickler

Ein Prüfwerkzeug löst externe Namen im aktiven Modellformat auf, liest Klassifikationen und Eigenschaftsbeziehungen, unterscheidet fehlende, widersprüchliche, ungültige und aufgelöste Informationen, implementiert jede deklarierte Fähigkeit und meldet jede fehlgeschlagene Regel mit einer stabilen Nachricht.

Der vollständige geprüfte Quelltext liegt unter examples/din-276-331.