# Formeln

Funktionen, die in Formeln, insbesondere bei Zwischenwerten, verwendet werden können:

**+ - \* /** Die bekannten Operanden für Plus, Minus, Mal und Geteilt.

**()** Klammern für die Schachtelung von Formeln.

**sin, cos, tan** Die bekannten Winkelfunktionen Sinus, Cosinus und Tangens. Der Winkel muss in Grad (Kreis = 360°) angegeben werden.

**asin, acos, atan** Die bekannten Winkelfunktionen Arcus Sinus, Arcus Cosinus und Arcus Tangens um aus einem Seitenverhältnis den Winkel in Grad (Kreis = 360°) zu errechnen.

**sqrt** Wurzelfunktion: sqrt(25) ergibt 5.

**^** Exponent. 5^2 (sprich 5 hoch 2) ergibt 25.

**Pi** Zahl Pi. Der Umfang eines Kreises mit 2.5 m Durchmesser errechnet sich als: 2.5\*Pi

**round** Rundung. Es wird kaufmännisch gerundet. round(2.4) ergibt 2.0, round(2.5) ergibt 3.0. Wenn VAB immer aufgerundet werden soll, so lautet die passende Formel: round(VAB+0.5). Wichtige Funktion bei der Berechnung von Verteilungen.

**abs** Absolutwert, Wert ohne Vorzeichen, also ohne Minus.\
abs(25) ergibt 25, abs(-25) ergibt ebenfalls 25. Wichtige Funktion bei Differenzen (Abständen), wenn nicht sicher ist, welcher der beiden Werte größer ist.

#### Formeleditor

(14.01) Im Formeleditor wird links unten nun eine Liste der Variablen angezeigt, die in der Formel verwendet werden. Dahinter ist jeweils der Beschreibungstext angegeben. Klickt man die Variable an, so wird sie im Baum daneben geöffnet und auch ein gegebenenfalls vorhandenes Hilfsbild wird angezeigt. So lässt sich der Inhalt der Formel wesentlich schneller kontrollieren.

(V20.01) HRB-Editor: Anzeige aktueller Werte im Formeleditor: Wird eine Formel im Formeleditor geöffnet, so werden in der Variablenliste nach den Texten auch die aktuellen Werte der Variablen angezeigt. Oben im Dialog sieht man das Ergebnis der ganzen Formel. Diese Anzeigen sind sehr hilfreich bei der Kontrolle der Formeln; man erkennt schneller, ob es an der aktuellen Formel liegt, oder ob für eine Variable ein unerwarteter Wert vorliegt. Die Anzeige der Werte ist nur im HRB-Editor möglich, da nur hier auch die Systemvariablen belegt sind.

#### Alle Variablen im Formeleditor

(15.01) Alle Formeln können mit Bedingungen versehen werden. In Bedingungen können nicht nur Zahlenwerte, sondern auch beliebige andere Variablentypen eingesetzt werden, z.B. Texte. Daher werden nun im Formeleditor alle Variablen angeboten, nicht nur Variablen mit Zahlenformaten.

### Bedingte Formeln, Bedingungen

In Formeln können Bedingungen verarbeitet werden. So lassen sich wesentlich flexiblere Formeln erstellen, die auf Situationen reagieren. Z.B. die Anzahl der nötigen Punktsymbole lässt sich so erheblich reduzieren.

Eine solche Formel besteht aus drei Teilen, die über Semikolon getrennt sind:

**(Bedingung);(Formel für erfüllte Bedingung);(Formel für nicht erfüllte Bedingung)**

(14.03) Bedingungen lassen sich auch schachteln um in einer Formel mehr als 2 Situationen abzudecken.

Beispiele:

**(Bedingung 1);((Bedingung 2);(2 erfüllt);(2 nicht erfüllt));(1 nicht erfüllt)**

**(---------------*****1 erfüllt-------------------*****)**

**(Bedingung 1);(1 erfüllt);((Bedingung 2);(2 erfüllt);(2 nicht erfüllt))**

**(---------------*****1 nicht erfüllt-------------*****)**

Die Schachtelung kann gleichzeitig in "erfüllt" und in "nicht erfüllt" weitergeführt werden.

In der nächsten Ebene kann wieder weiter geschachtelt werden. Beispiel:

**(Bed. 1);(1 erf.);((Bed. 2);(2 erf.);((Bed. 3);(3 erf.);(3 nicht erf.)))**

**(---------*****1 nicht erfüllt----------------------------*****)**

**(---------*****2 nicht erfüllt--------*****)**

#### Vergleiche, die in Bedingungen verwendet werden können:

**=** ist gleich. Wert vor und nach dem Zeichen müssen genau übereinstimmen.\
Beispiel: VAB = 4 ist erfüllt, wenn VAB genau gleich 4 ist.

**!=** nicht gleich. Wert vor dem Zeichen muss unterschiedlich, also größer oder kleiner als der Wert nach dem Zeichen sein.\
Beispiel: VAB!=4 ist erfüllt, wenn VAB größer oder kleiner 4 ist.

**>** größer. Wert vor dem Zeichen muss größer als der Wert nach dem Zeichen sein.\
Beispiel: VAB>4 ist erfüllt, wenn VAB größer 4 ist.

**>=** größer gleich. Wert vor dem Zeichen muss größer als oder gleich dem Wert nach dem Zeichen sein.\
Beispiel: VAB>=4 ist erfüllt, wenn VAB größer oder gleich 4 ist.

**<** kleiner. Wert vor dem Zeichen muss kleiner als der Wert nach dem Zeichen sein.\
Beispiel: VAB<4 ist erfüllt, wenn VAB kleiner 4 ist.

**<=** kleiner gleich. Wert vor dem Zeichen muss kleiner als oder gleich dem Wert nach dem Zeichen sein.\
Beispiel: VAB<=4 ist erfüllt, wenn VAB kleiner oder gleich 4 ist.

#### Verknüpfte Bedingungen, logische Verknüpfungen

Mehrere Bedingungen können logisch verknüpft werden:

**&** logisches **und**. Alle mit und verknüpften Bedingungen müssen erfüllt sein. Wenn also VAB größer als 4 und kleiner als 8 sein muss, so lautet der ganze Ausdruck:\
(VAB>4)&(VAB<8)

**|** logisches **oder**. (V20.01) Mindestens eine der Bedingungen muss erfüllt sein:

> . Als oder-Zeichen wird (wie in C++) das | verwendet. Dies erhält man auf der deutschen Tastatur mit AltGr+"<".
>
> . Wir verwenden hier das normale oder: Wenn mindestens eine der beiden Teil-Bedingungen erfüllt ist, ist der ganze Oder-Ausdruck erfüllt. Es dürfen auch beide Teil-Bedingungen erfüllt sein. (beim exklusiv-oder dürfte nur eine der beiden erfüllt sein).

Die logischen Verknüpfungen **und** und **oder** können auch kombiniert eingesetzt werden. Hier Beispiele für bedingte Formeln:

\[Beispiel:]{.underline} **((V\_abc=a)|(V\_abc=b));(0.04);(0.16)**

Wenn die Variable V\_abc den Wert a **oder** b hat, dann ist der Wert 0.04. In allen anderen Fällen ist der Wert 0.16.

\[Beispiel:]{.underline} **((V\_aa=a)|(V\_bb=b));(0.04);(0.16)**

Wenn die Variable V\_aa den Wert a **oder** V\_bb den Wert b hat, dann ist der Wert 0.04. Die Gesamtbedingung ist auch erfüllt, wenn beide Teile zutreffen (V\_aa=a und V\_bb=b). In allen anderen Fällen ist der Wert 0.16.

\[Beispiel für Simulation exklusives oder:]{.underline} (**((V\_a1=0)&(V\_a2!=0))|((V\_a1!=0)&(V\_a2=0)));(0.04);(0.16)**

Von den Variablen V\_a1 und V\_a2 darf nur genau eine den Wert 0 haben, dann ist der Wert 0.04. In allen anderen Fällen ist der Wert 0.16.

#### Möglichkeiten der Schachtelung von Bedingungen

In bedingten Formeln können die Bedingungen sehr verschachtelt sein, z.B.:

> **(((V\_a1=0)&(V\_a2!=0))|((V\_a1!=0)&(V\_a2=0)));(0.04);(0.16)**

In bedingten Formeln können in den Bedingungen auch Formel stehen, z.B.:

> **(V\_a1=(1+2+V\_a2));(0.04);(0.16)**

In bedingten Formeln können auch in den wahr / falsch-Teilen (nach erstem bzw. zweiten Semikolon) wieder komplette bedingte Formel stehen und damit weiter verschachtelt sein, z.B.:

> **(V\_a1=0);((V\_a2=0);(0.04);(0.16));(0.16)**

Innerhalb einer Bedingung darf jedoch keine vollständige bedingte Formel verwendet werden.

Also folgendes ist nicht zulässig:

> **(0.3<((0.4<0.5);(0.6);(0.1));(0.04);(0.10)**

Wie oben gesagt dürfen Bedingungen an sich beliebig geschachtelt sein und die einzelnen Teile (links und rechts vom Vergleich-Zeichen) auch Formeln enthalten. Aber es darf in der Bedingung nicht nochmal eine komplette bedingte Formel stehen. Dort dürfen also keine Semikola auftauchen.

Logisch lassen sich diese Fälle durch Umstellen der Formel abdecken oder zur besseren Übersicht in mehrere Zwischenwerte zerlegen.

#### Toleranz bei Zahlenvergleichen:

Wenn mit dem Wert einer Berechnung verglichen wird, so muss bedacht werden, dass Zahlen im Rechner mit sehr vielen Nachkommastellen gehalten werden. Anstelle 1.0 kann also im Rechner 0.99999999999 oder 1.00000000000001 stehen. Wenn man nun genau auf 1.0 vergleicht (VA=1.0), so kann der Vergleich fehlschlagen, obwohl die Bedingung technisch gesehen erfüllt ist.

* Hierzu kann man mit einer Toleranz vergleichen. Dazu wird die Differenz zum gewünschten Wert überprüft. Soll VA=1.0 mit einer maximalen Toleranz von 0.01 sein, so muss die Differenz zwischen -0.01 und +0.01 liegen. Die Bedingung kann dann heißen:\
  ((0.01>(VA - 1.0))&(-0.01<(VA - 1.0)))\
  Damit das Vorzeichen eliminiert wird, kann man auch die Funktion abs auf die Differenz anwenden.\
  (0.01>(abs(VA - 1.0)))
* In anderen Fällen genügt es mit einer sicheren Zahl zu Vergleichen. In Verteilungen wird oft eine Anzahl berechnet. Ist nun z.B. die Bedingung, dass die Anzahl (VANZ) größer 3 ist, so vergleichen wir nicht mit größer 3, sondern (VANZ>2.5). Dann ist es egal, ob das eigentliche Ergebnis für VANZ 2.999999 oder 3.0000001 ist.

#### Texte in Bedingungen, Vergleich bei Texten:

Auch Texte können zum Vergleich genutzt werden. Dabei können grundsätzlich Variablen mit allen Einheiten verwendet werden, die nicht einen Zahlenwert haben: txt, Idnr., Enum, A-F, ...

Der Vergleichswert wird direkt als Text ohne besondere Steuerzeichen geschrieben. Soll z.B. die Variable "**V\_Textvariable**" gleich "*Test*" sein, so lautet der Vergleich: **(V\_Textvariable=Test)**

Texte werden alphabetisch sortiert und können deshalb auch auf "größer" und "kleiner" verglichen werden. Dabei ist der Text kleiner, der nach alphabetischer Sortierung zuerst kommt: "**Aluminium**" ist also "*kleiner*" als "**Blei**".

Soll Bedingung sein, dass eine Variable keinen leeren Text enthält, so muss der Wert der Variable "größer" " " (Leerzeichen) sein: **(V\_Textvariable> )**. Es gibt keine Formulierung für einen leeren Text, also müssen wir mit einem möglichst kleinen Text vergleichen. Das " " (Leerzeichen) steht in den Zeichensätzen ganz weit vorne; davor stehen nur noch Steuerzeichen. Wir müssen ein Zeichen vor dem "**#**" einsetzten, da traditionell Identnummern von Hilfsbauteilen mit "**#**" anfangen.

#### Texte in Bedingungen: Sonderfall oa1-Datei (IFC Premium)

In den Bedingungen (= **Condition**) der oa1-Dateien werden Vergleiche mit Systemvariablen gemacht. Dabei ist folgendes zu beachten:

> Ist die Systemvariable eine Zahl, so wird diese direkt geschrieben; Beispiel:\
> **Condition=(OH=1.23)**\
> Handelt es sich jedoch um einen Text, der mit einer Zahl beginnt (nur dann), so muss dieser in Hochkommata geschrieben werden. Beispiel:\
> **Condition=(IFCNAME="1.23")**

#### Auflistungen und Platzhalter in Bedingungen

(15.01) In Bedingungen kann bislang mit einem Wert verglichen werden. Mit den neuen Möglichkeiten das Stockwerk (SWAKT) oder die Ausführung (AUSF) abfragen zu können, bietet sich der Einsatz von Auflistungen und Platzhaltern an.

\[Auflistung]{.underline}: Gilt eine Bedingung nur für das EG, so lautet sie **(SWAKT=GF)**. Soll sie für EG, OG und DG gelten, so lautet die Bedingung **(SWAKT={GF\~UF\~AG})**. Die Auflistung wird in geschweifte Klammern gesetzt, Trennzeichen ist die Tilde '\~'.

\[Platzhalter]{.underline}: Gilt eine Bedingung nur für die Wandausführung "AW WDVS - Standard", so lautet sie **(AUSF=AW WDVS - Standard)**. Soll sie für alle Ausführungen gelten, die mit AW beginnen, so lautet die Bedingung **(AUSF={AW\*})**. Der Ausdruck wird in geschweifte Klammern gesetzt, Platzhalter ist das Sternchen '\*'. Folgende Anordnungen werden berücksichtigt:

> **ABC\*** Beginnt mit *ABC*, beliebiges Ende
>
> **\*ABC** Beginnt beliebig, endet mit *ABC*
>
> **\*ABC\*** Enthält *ABC* an beliebiger Stelle

\[Auflistung und Platzhalter]{.underline}: Beide Möglichkeiten können auch kombiniert werden. Soll die Bedingung für alle Ausführungen gelten, die mit AW oder IW beginnen, so lautet sie **(AUSF={AW\*\~IW\*})**.

### Wiederholungen in Formeln

Nur in Kombielementen: In den Koordinaten der Positionspunkte von Bauteilen, Bibliotheken und Teilzeichnungen (V20.01) und der Referenzpunkte von Punktsymbolen können Wiederholungen formuliert werden:

* Jede Koordinate erhält eine Eingabe in der Form (**Startwert\~Sprung\~Anzahl**). Anzahl 1 bedeutet, dass kein Sprung ausgeführt wird, also nur am Startwert etwas erzeugt wird.
* Wenn Wiederholungen formuliert werden, so müssen sie in X, Y und Z erzeugt werden:

> **X(1.0\~0.1\~5)Y(0.0\~0.0\~1)Z(0.0\~0.0\~1)** Reihe entlang X mit 5 Elementen, Start bei 1.0 mit Schrittweite 0.1
>
> **X(1.0\~0.1\~5)Y(0.0\~0.2\~4)Z(0.0\~0.0\~1)** Reihe entlang X mit 5 Elementen, Start bei 1.0 mit Schrittweite 0.1, diese Reihe 4 mal entlang Y mit Abstand 0.2.

* Mit diesen Wiederholungen lassen sich in einem Schritt Reihen, Gitter oder 3D-Gitter erzeugen.

### Fehlermeldung, Meldung fehlerhafter Formeln

(V20.01) Mit Einführung des neuen Formelsystems wurden auch die Fehlermeldungen überarbeitet:

* Die Anzeige von Formelfehlern wurde erweitert:

> ▫ Formeln werden wahlweise beim Öffnen von Dateien (HRB, Kombielemente, Einstellungen) überprüft. Wenn gewünscht wird dazu vorher in der Projektverwaltung in der Funktion *5-02-1 Protokollfunktionen* die entsprechende Checkbox gesetzt. Das Bauwerk muss neu gestartet werden, um dies zu berücksichtigen.
>
> ▫ Es wird, soweit möglich, die Art des Formelfehlers und die betroffene Formel angezeigt. Diese Meldung kann in die Zwischenablage kopiert werden, um sie dann in der Suchfunktion von Editoren einzusetzen.
>
> ▫ Durch den Button in der Meldung kann die Anzeige weiterer Fehler unterbunden werden. Das gilt dann, bis das Bauwerk (oder HRB-Editor) neu gestartet werden. Die Fehlermeldung einer Division durch 0 kann jedoch nicht unterbunden werden.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.dietrichs.com/das-variablensystem/formeln-und-texte/formeln.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
