# -*- coding: utf-8 -*-

import FreeCAD as App
from FreeCAD import Placement, Rotation, Vector
import matplotlib
from io import StringIO
from math import sqrt, tan, atan, atan2, degrees, radians, hypot, sin, cos, pi, fmod

D=FreeCAD.newDocument("Fitting")

# Erzeugt ein Fitting mit zwei Muffen
# Außenmuffe: Anschluß wird innen hineingesteckt, die Muffe ist also außen, Maße gelten für die Innenwand (analog zu einem Innengewinde)
# Innenmuffe: Anschluß wird außen aufgesteckt, die Muffe ist also innen, Maße gelten für die Außenwandwand (analog zu einem Außengewinde)

###### Start anwendungsspezifischer Parameter #####
# Muffe 1
M1_I = True             # True wenn Innenmuffe, False wenn Außenmuffe
M1_D_vorne = 22         # vorderer Durchmesser der Muffe, Innendurchmesser für Außenmuffe, Außendurchmesser für Innenmuffe
M1_D_hinten = 26        # hinterer Durchmesser der Muffe, Innendurchmesser für Außenmuffe, Außendurchmesser für Innenmuffe
M1_SB = 1               # Muffe1 Schlitzbreite
M1_SH = 10              # Muffe1 Schlitzhöhe
M1_SA = 8               # Muffe1 Schlitzanzahl
M1_L = 30               # Länge der Muffe
M1_WD = 5               # Wanddicke der Muffe

# Muffe 2
M2_I = False            # True wenn Innenmuffe, False wenn Außenmuffe
M2_D_vorne = 36         # vorderer Durchmesser der Muffe, Innendurchmesser für Außenmuffe, Außendurchmesser für Innenmuffe
M2_D_hinten = 33        # hinterer Durchmesser der Muffe, Innendurchmesser für Außenmuffe, Außendurchmesser für Innenmuffe
M2_SB = 0.5             # Muffe2 Schlitzbreite
M2_SH = 30              # Muffe2 Schlitzhöhe
M2_SA = 20              # Muffe2 Schlitzanzahl
M2_L = 40               # Länge der Muffe
M2_WD = 2.5             # Wanddicke der Muffe

Winkel = True           # True: Länge des Übergangsstücks wird aus dem Winkel U_Alpha berechnet, False: Länge ist U_L
U_Alpha = 30            # Öffnungswinkel des Übergangsstücks wenn Winkel==True
U_L = 5                 # Länge des Übergangsstücks wenn Winkel==False

vec0=Vector(0,0,0)      # Nullvektor
vecx=Vector(1,0,0)      # Drehachse x
vecy=Vector(0,1,0)      # Drehachse y
vecz=Vector(0,0,1)      # Drehachse z

Farbe_Fitting = matplotlib.colors.to_rgb('lightgreen')
###### Ende anwendungsspezifischer Parameter #####

def MakeCone(d1, d2, h):
# Kegel oder Zylinder generieren
   if (d1 != d2): #makeCone fails if d1==d2
      kegel = Part.makeCone(d1/2, d2/2, h)
   else:
      kegel = Part.makeCylinder(d1/2, h)
   return(kegel)

def MakeSchlitze(sb, sl, sh, sa): # Breite, Länge, Höhe, Anzahl
   for i in range (0, sa):
      p = Part.makeBox(sb, sl, sh).translate(Vector(-sb/2, 0, 0))
      if (i == 0):
         Schlitz = p.copy()
      else:
         Schlitz = Schlitz.fuse(p.rotate(vec0, vecz, i*360/sa))
   return(Schlitz)

# benötigte Maße berechnen

if (M1_I):
# Muffe 1 ist eine Innenmuffe
   m1iv = M1_D_vorne - 2 * M1_WD        # Innendurchmesser vorne
   m1ih = M1_D_hinten - 2 * M1_WD       # Innendurchmesser hinten
   m1av = M1_D_vorne                    # Außendurchmesser vorne
   m1ah = M1_D_hinten                   # Außendurchmesser hinten
else:
# Muffe 1 ist eine Außenmuffe
   m1iv = M1_D_vorne                    # Innendurchmesser vorne
   m1ih = M1_D_hinten                   # Innendurchmesser hinten
   m1av = M1_D_vorne + 2 * M1_WD        # Außendurchmesser vorne
   m1ah = M1_D_hinten + 2 * M1_WD       # Außendurchmesser hinten

if (M2_I):
# Muffe 2 ist eine Innenmuffe
   m2iv = M2_D_vorne - 2 * M2_WD        # Innendurchmesser vorne
   m2ih = M2_D_hinten - 2 * M2_WD       # Innendurchmesser hinten
   m2av = M2_D_vorne                    # Außendurchmesser vorne
   m2ah = M2_D_hinten                   # Außendurchmesser hinten
else:
# Muffe 2 ist eine Außenmuffe
   m2iv = M2_D_vorne                    # Innendurchmesser vorne
   m2ih = M2_D_hinten                   # Innendurchmesser hinten
   m2av = M2_D_vorne + 2 * M2_WD        # Außendurchmesser vorne
   m2ah = M2_D_hinten + 2 * M2_WD       # Außendurchmesser hinten

m1sl = m1av/2 if m1av > m1ah else m1ah/2     # Muffe1 Schlitzlänge
m2sl = m2av/2 if m2av > m2ah else m2ah/2     # Muffe2 Schlitzlänge

#Länge des Übergangsstücks
if (Winkel):
   b = (m2ah - m1ah) / 2
   PI = 3.1415926535897932384626433832795
   U_L = abs(b / tan(U_Alpha*PI/180))

# print(m1iv,m1ih,m1av,m1ah,m2iv,m2ih,m2av,m2ah,M1_L,M2_L,U_L)

# Basisformen generieren
Muffe1  = MakeCone(m1av, m1ah, M1_L)   # Muffe1
Muffe2  = MakeCone(m2ah, m2av, M2_L)   # Muffe2

Muffe1I = MakeCone(m1iv, m1ih, M1_L)   # Innenschnitt der Muffe1
Muffe2I = MakeCone(m2ih, m2iv, M2_L)   # Innenschnitt der Muffe2

#Schlitze1 = MakeSchlitze(M1_SB, m1sl, M1_SH, M1_SA)
#Schlitze2 = MakeSchlitze(M2_SB, m2sl, M2_SH, M2_SA).translate(Vector(0, 0, M2_L-M2_SH))

# Schnitte
Muffe1 = Muffe1.cut(Muffe1I)
Muffe2 = Muffe2.cut(Muffe2I)

if (M1_SA > 0):
   Muffe1 = Muffe1.cut(MakeSchlitze(M1_SB, m1sl, M1_SH, M1_SA))
if (M2_SA > 0):
   Muffe2 = Muffe2.cut(MakeSchlitze(M2_SB, m2sl, M2_SH, M2_SA).translate(Vector(0, 0, M2_L-M2_SH)))

# verschieben
Muffe2  = Muffe2.translate(Vector(0,0,M1_L+U_L))

# alles verlöten
Fitting = Muffe1.fuse(Muffe2)

# Übergangsstück hinzufügen wenn größer als null
if (U_L != 0):
   U_A = MakeCone(m1ah, m2ah, U_L)        # Übergangsstück Außen
   U_I = MakeCone(m1ih, m2ih, U_L)        # Übergangsstück Innen
   U = U_A.cut(U_I)
   U       = U.translate(Vector(0,0,M1_L))
   Fitting = Fitting.fuse(U)

# Namen und Farben zuweisen
p1=D.addObject("Part::Feature")
p1.Shape = Fitting
p1.ViewObject.ShapeColor=Farbe_Fitting
p1.Label="Fitting"

view = FreeCADGui.ActiveDocument.ActiveView
view.fitAll()

D.recompute()



