Neigung von einem Profil abfragen

Oft macht es Sinn, abzufragen, welche Neigung ein Profil hat. Das ist beispielsweise dann interessant, wenn man wissen möchte, welche Dachneigung vorliegt.

Zuerst sollten wir uns aber ein geeignetes Profil suchen, von dem wir die Dachneigung abfragen. Wahrscheinlich ist der erste Gedanke, dass man einen Mittelsparren verwenden sollte. Das ist auch prinzipiell in Ordnung, aber bei Mittelsparren hat das KKP eine Besonderheit. Mittelsparren sind in der Regel in eine Dachfläche eingebaut. Die Dachfläche hat immer dieselbe Kennziffer wie die Sparren darin. Das heißt, wir müssen bei Innensparren immer erst prüfen, ob wir überhaupt ein Profil abfragen oder ob wir eine Dachfläche abfragen. Um das Beispiel einfacher zu halten, wähle ich deshalb einen linken Seitensparren, um von dort die Neigung abzufragen.

Mein Pre-Setup-Skript sieht also erst einmal so aus:

# -*- coding: utf-8 -*-
import kkp
def getNeigungVonProfil(sKennziffer):
    #TODO
    pass
if __name__ == ‚__main__‘:
    dWinkel = getNeigungVonProfil(„900.001.010.100.040“)
    kkp.MsgBox(str(dWinkel))

Zunächst brauche ich die Objektnummer von meinem Profil. Da ich eventuell viele Profile in meiner Zeichnung haben kann, muss ich in der API die Objektliste für die Kennziffer vom linken Seitensparren abfragen.

# -*- coding: utf-8 -*-
import kkp
def getNeigungVonProfil(sKennziffer):
    liste = kkp.Objektliste_Erstellen(sKennziffer)
    if len(liste) == 0: return 0.0
if __name__ == ‚__main__‘:
    dWinkel = getNeigungVonProfil(„900.001.010.100.040“)
    kkp.MsgBox(str(dWinkel))

Ich beschränke mich in diesem Beispiel nur auf das erste gefundene Profil mit der Kennziffer.  Wenn ich alle Profile mit der Kennziffer abfragen wollte, wäre das aber prinzipiell das gleiche. Ich müsste die Abfrage nur in eine Schleife packen und das Ergebnis nicht in eine einzelne Zahl sondern in eine Array (Liste) von Zahlen ablegen.

Von meinem Profil muss ich dann die Einfügepunkte abfragen. Dazu bietet mir das KKP eine einfache Funktion. Danach kommt dann etwas Mathematik, genauer gesagt Vektorrechnung.

Die roten Markierungen geben in etwa wieder wo sich die Einfügepunkte des Profils befinden. Aus diesen Punkten bilden wir die Vektoren V1 und v2 (gelb eingezeichnet). Da diese nicht unbedingt gerade im Raum liegen, z.B. bei Abwalmungen oder Ecken, müssen wir den Winkel gegen die Y Achse als Vektor = (0,1,0) prüfen. Damit wir das können müssen wir also auch die Senkrechte zu v1 und v2 bilden (Kreuzprodukt). Und während sich das alles sehr kompliziert anhört, ist die Programmierung doch recht einfach. Hier das komplette Skript:

 

# -*- coding: utf-8 -*-
import kkp
def getNeigungVonProfil(sKennziffer):
    liste = kkp.Objektliste_Erstellen(sKennziffer)
    if len(liste) == 0: return 0.0
    iObj = liste[0]
    punkte = kkp.Get_Profil_Anfg_Ende_Ebene(iObj)
    if len(punkte) < 3: return 0.0
    vAnfg = punkte[0]
    vEnde = punkte[1]
    vEben = punkte[2]
    v2 = vEnde – vAnfg
    v1 = vEben – vAnfg
    vSenk = v2 * v1
    v = kkp.Vekt([0,0,1])
    dWinkel = vSenk.Winkel(v)
    if dWinkel > 90: dWinkel = 180.0 – dWinkel
    if dWinkel < 0: dWinkel = dWinkel * -1
    while dWinkel > 90: dWinkel = dWinkel – 90.0
    return dWinkel
if __name__ == ‚__main__‘:
    dWinkel = getNeigungVonProfil(„900.001.010.100.040“)
    kkp.MsgBox(str(dWinkel))

Alternativ könnte ich ja auch alle Dachneigungen abfragen von allen linken Seitensparren abfragen.

Hier das Skript:

# -*- coding: utf-8 -*-
import kkp
def getNeigungVonProfil(sKennziffer):
    listeWinkel = []
    liste = kkp.Objektliste_Erstellen(sKennziffer)
    for iObj in liste:
        iObj = liste[0]
        punkte = kkp.Get_Profil_Anfg_Ende_Ebene(iObj)
        if len(punkte) < 3: return 0.0
        vAnfg = punkte[0]
        vEnde = punkte[1]
        vEben = punkte[2]
        v2 = vEnde – vAnfg
        v1 = vEben – vAnfg
        vSenk = v2 * v1
        v = kkp.Vekt([0,0,1])
        dWinkel = vSenk.Winkel(v)
        if dWinkel > 90: dWinkel = 180.0 – dWinkel
        if dWinkel < 0: dWinkel = dWinkel * -1
        while dWinkel > 90: dWinkel = dWinkel – 90.0
        listeWinkel.append(dWinkel)
    return listeWinkel
if __name__ == ‚__main__‘:
    listeWinkel = getNeigungVonProfil(„900.001.010.100.040“)
    kkp.MsgBox(str(listeWinkel))