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

import FreeCAD
from FreeCAD import Placement, Rotation, Vector
import matplotlib
from io import StringIO

Anzahl = 2              # Anzahl der Gleiter
#Laenge = 150            # Länge des Gleiters
Laenge = 50             # Länge des Gleiters
Abstand = 128.5         # Abstand der Schrauben, nominal 128 mm für den Griff, kleine Zugabe für Schrumpfung
AbstandMS = 80          # Abstand der Madenschrauben zum Festklemmen

# Bohrungen:
#        ,------------------------------- Durchmesser
#        |    ,-------------------------- Tiefe des Senkkopfes (k)
#        |    |    ,--------------------- Durchmesser des Senkkopfs (Dk)
#        |    |    |    ,---------------- Position
#        |    |    |    |
#drill = [4.3, 2.5, 8.4,          (Laenge-Abstand)/2,            # Befestigung Griff
#         4.3, 2.5, 8.4, Laenge - (Laenge-Abstand)/2,            # Befestigung Griff
#         3.2, 0.0, 0.0,          (Laenge - AbstandMS)/2,        # Kernloch für Madenschraube
#         3.2, 0.0, 0.0, Laenge - (Laenge - AbstandMS)/2         # Kernloch für Madenschraube
#        ]
drill = [
         3.2, 0.0, 0.0, Laenge/2
        ]
dd = 4 # Dimension von drill

doc=FreeCAD.newDocument("Profil_B-Typ_Nut6_Gleiter")

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

# Farben
Farbe_Gleiter = matplotlib.colors.to_rgb('lightblue')

def MakeGleiter(Laenge, pos):
# Gleiter
   global drill
   global dd

   B_Nut = 6.25         # Breite der Profilnut
   D_Nut = 1.40         # Dicke der Nut
   D_oben = 0.6         # Überstand des Gleiters aus dem Profil
   Spiel = 0.1          # Spiel
   B_GlO = 11.5         # Obere Breite des Gleiters
   B_GlU = 8.5          # Untere Breite des Gleiters
   D_Gl = 2.5           # Dicke des Gleiters im Profil

   B_GlN = B_Nut - 2*Spiel # Breite des Gleiters in der Nut
   H_GlN = D_Nut + D_oben  # Höhe des Gleiters in der Nut

   S1 = Part.Shape(
   Part.makePolygon([
   Vector(-B_GlN/2,H_GlN),
   Vector( B_GlN/2,H_GlN),
   Vector( B_GlN/2,0),
   Vector( B_GlO/2, 0),
   Vector( B_GlU/2, -D_Gl),
   Vector(-B_GlU/2, -D_Gl),
   Vector(-B_GlO/2, 0),
   Vector(-B_GlN/2, 0),
   Vector(-B_GlN/2, H_GlN)
   ])
   )

   Gleiter = Part.Face(Part.Wire(S1.Edges)).extrude(Vector(0, 0, Laenge))

# Bohren
   for i in range (0, round(len(drill)/dd)):
      Schnitt = Part.makeCylinder(drill[dd*i]/2,H_GlN+D_Gl+2,vec0,vecy)
      if (drill[dd*i+1] != 0): # versenken
         hp = drill[dd*i+1] + drill[dd*i+0]/2             # Gesamthöhe der Pyramide, Tiefe im Zylinder ist gleich dem Radius das Zylinders, wegen 90°-Winkel
         Cone = Part.makeCone(0, hp, hp, vec0, -vecy)   # Radius des breiten Endes ist gleich der Gesamthöhe, wegen 90°-Winkel
         Cone = Cone.common(Part.makeCylinder(drill[dd*i+2]/2,20,vec0,-vecy))      # breites Ende des Zylinders beschneiden
         Cone = Cone.translate(Vector(0,drill[dd*i+0]/2,0))
         Schnitt = Schnitt.fuse(Cone)
      Schnitt = Schnitt.translate(Vector(0,-D_Gl+drill[dd*i+1],drill[dd*i+3]))
      Gleiter = Gleiter.cut(Schnitt)

   Gleiter = Gleiter.translate(Vector(pos*(B_GlO+1),0,0))
   return(Gleiter)

for pos in range (0,Anzahl):
   p = MakeGleiter(Laenge,pos)
   if (pos == 0):
      Gleiter = p.copy()
   else:
      Gleiter = Gleiter.fuse(p)

output = StringIO()
print("Gleiter_Profil_B-Typ_Nut6_",Anzahl,"x",Laenge, file=output, sep='', end='')

# Namen und Farben zuweisen
p1=doc.addObject("Part::Feature")
p1.Shape = Gleiter
p1.ViewObject.ShapeColor=Farbe_Gleiter
p1.Label=output.getvalue()

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


