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 kkpdef getNeigungVonProfil(sKennziffer):#TODOpassif __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 kkpdef getNeigungVonProfil(sKennziffer):liste = kkp.Objektliste_Erstellen(sKennziffer)if len(liste) == 0: return 0.0if __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 kkpdef getNeigungVonProfil(sKennziffer):liste = kkp.Objektliste_Erstellen(sKennziffer)if len(liste) == 0: return 0.0iObj = liste[0]punkte = kkp.Get_Profil_Anfg_Ende_Ebene(iObj)if len(punkte) < 3: return 0.0vAnfg = punkte[0]vEnde = punkte[1]vEben = punkte[2]v2 = vEnde – vAnfgv1 = vEben – vAnfgvSenk = v2 * v1v = kkp.Vekt([0,0,1])dWinkel = vSenk.Winkel(v)if dWinkel > 90: dWinkel = 180.0 – dWinkelif dWinkel < 0: dWinkel = dWinkel * -1while dWinkel > 90: dWinkel = dWinkel – 90.0return dWinkelif __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:
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.0vAnfg = punkte[0]vEnde = punkte[1]vEben = punkte[2]v2 = vEnde – vAnfgv1 = vEben – vAnfgvSenk = v2 * v1v = kkp.Vekt([0,0,1])dWinkel = vSenk.Winkel(v)if dWinkel > 90: dWinkel = 180.0 – dWinkelif dWinkel < 0: dWinkel = dWinkel * -1while dWinkel > 90: dWinkel = dWinkel – 90.0listeWinkel.append(dWinkel)return listeWinkelif __name__ == ‚__main__‘:listeWinkel = getNeigungVonProfil(„900.001.010.100.040“)kkp.MsgBox(str(listeWinkel))