Dokumentation der Formelsprache in Regeln
René Holzer
Product Owner
Dieses Projekt definiert eine Ausdrückesprache („Expression Language”)
für IFC-Modelle.
Ein Ausdruck wird im Kontext eines Elements des
IFC-Modells sowie einer spezifischen Eigenschaft dieses Elements
ausgewertet.
Folgende Themen werden hier behandelt:
Schnittstelle
Es gibt zwei Wege, mit ifc-expression zu interagieren:
- Einen Ausdruck direkt auswerten — Ergebnis:
ExprEvalSuccessResult | ExprEvalError - Oder:
- Einen Ausdruck parsen — Ergebnis:
IfcExpressionParseResult - Einen
IfcExpressionParseResultauswerten — Ergebnis:ExprEvalSuccessResult | ExprEvalError
- Einen Ausdruck parsen — Ergebnis:
Verwendung
Um ifc-expressions mit Ihrem IFC-Modell zu verbinden, müssen Sie eine
Implementierung von
src/context/IfcExpressionContext bereitstellen. Ohne einen solchen
Kontext können Ausdrücke, die Referenzen auf das Modell enthalten, nicht
ausgewertet werden.
import {IfcExpression} from "ifc-expression";
import {IfcExpressionContext} from "./IfcExpressionContext";
const result = IfcExpression.evaluate("1 + 1"); // Auswertung ohne Kontext
console.log(JSON.stringify(result));
// ExprEvalSuccessObj {
// status: 1000,
// result: NumericValue {
// value: 2
// }
//}
const ctx: IfcExpressionContext = ... ; // hier Ihren Kontext einfügen
const result2 = IfcExpression.evaluate("$element.property('width').value() * 2 ", ctx);
Kurzübersicht
Beschreibung | Expression |
|---|---|
| Aktuellen Eigenschaftswert abrufen: | $property.value() |
| Name des Property Sets abrufen, in dem sich die Eigenschaft befindet: | $property.propertySet.name() |
| Name des Typs des aktuellen Elements abrufen: | $element.type().name() |
Wert der Eigenschaft myProp aus dem Property Set myPset des aktuellen Elements abrufen: | $element.propertySet(‘myPset’).property(‘myProp’).value() |
| Alternative Schreibweise: | VALUE(PROPERTY(PROPERTY_SET($element, ‘myPset’),‘myProp’)) |
Prüfen, ob die Eigenschaft myProp im Property Set myPset im aktuellen Element existiert: | $element.propertySet(‘myPset’).property(‘myProp’).exists() |
Hinweise:
- Funktions-/Methodennamen sind nicht case-sensitive\
- Operatoren:
+ - * / ^für numerische Werte&& || >< !für Booleans (><= xor)== != >= <= > <für Strings, Booleans und numerische Werte
.toString()ist auf allen Typen verfügbarREPLACE,MATCHES,CONTAINSnutzen nur das Wildcard*REGEXREPLACE,REGEXMATCHES,REGEXCONTAINSnutzen vollständige JavaScript-RegExps
IFC Expression Language Syntax
Das Projekt verwendet ANTLR4 für das Parsing.
Die Grammatik befindet sich in src/grammar/ifcExpression.g4.
Ein Ausdruck liefert einen Wert des Typs:
stringnumericbooleanifcObjectRef\- oder einen temporalen Typ (
IfcDateTime,IfcDate,IfcTime,IfcDuration,IfcTimeStamp)
Es kann nur ein einzelner Ausdruck angegeben werden.
Es gibt keine Kontrollstrukturen oder benutzerdefinierten
Funktionen/Typen.
Ausdrucksarten
Ein Ausdruck kann sein:
- ein Literal wie
'hello world'oder17 - eine Variablenreferenz wie
$propertyoder$element - ein Funktionsaufruf, z. B.
REPLACE("hello", "he", "hi") - ein Methodenaufruf, z. B.
"hello".replace("he","hi") - ein Ausdruck mit Operatoren wie
+,&&,==
Datentypen
- string — z. B.
'abc'oder"abc" - boolean —
TRUE,false - numeric — z. B.
1,3.141 - array — z. B.
[1,2,"hi"]
Operatoren
Numerische Operatoren
+Addition\-Subtraktion\*Multiplikation\/Division\^Potenzierung
Boolesche Operatoren
&&AND\||OR\><XOR\!NOT
String-Operatoren
+String-Konkatenation
Funktionen
Konvertierungsfunktionen
toString(a),
toNumeric(a),
toIfcDateTime(a) …
** **LISTE VERVOLLSTÄNDIGEN**
Temporale Funktionen
addDuration(IfcTimeStamp|IfcDateTime, IfcDuration)
Vergleichsfunktionen
equals(a,b)
greaterThan(a,b)
greaterThanOrEquals(a,b)
lessThan(a,b)
lessThanOrEqual(a,b)
Boolesche Funktionen
not(a)
and(a,b)
or(a,b)
xor(a,b)
implies(a,b)
String-Matching
contains(string, pattern)
regexContains(string, regex)
matches(string, pattern)
regexMatches(string, regex)
String-Ersetzung
replace(string, pattern, replacement)
regexReplace(string, regex, replacement)
IFC-Objektzugriff
property(object, name)
propertySet(object)
propertySet(object, name)
type(object)
exists(object)
Übersetzungs- & Bedingungsfunktionen
map(input, mapping, default)
if(condition, thenValue, elseValue)
choose(mapping, default)