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

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

doc=FreeCAD.newDocument("Spulenhalter")

D_Draht = 1.55          # Drahtdurchmesser
Add_Z = 0.1             # Höhe über der Platine
Abstand = 0.2           # Windungsabstand
D_Spule = 33.5          # Spulendurchmesser
Windungen = 18.0        # Windungszahl
Vertikal = True         # vertikal wenn True
Wand = 2.0              # Wandstärke

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_Spulenhalter = matplotlib.colors.to_rgb('gray')

Steigung = D_Draht+Abstand # Steigung

Box_W = D_Spule + 2 * D_Draht + 1
Box_H = Steigung * Windungen

# Helix generieren
helix = doc.addObject("Part::Helix", "Helix")
helix.Pitch = Steigung
helix.Height = Steigung*(Windungen+2)
helix.Radius = D_Spule/2
helix.ViewObject.Visibility = False

# Sketch generieren, wird entlang der Helix gesweeped
sketch = doc.addObject('Sketcher::SketchObject', 'Drahtquerschnitt')
sketch.Placement = Placement(vec0, Rotation(0.707107, 0, 0, 0.707107))
sketch.MapMode = "Deactivated"
sketch.addGeometry(Part.Circle(Vector(D_Spule/2,0,0),vecz,D_Draht/2),False)
sketch.ViewObject.Visibility = False

# Sweep ausführen
sweep = doc.addObject('Part::Sweep','Spule')
sweep.Sections=[sketch, ]
sweep.Spine=(helix,['Edge1',])
sweep.Solid=True
sweep.Frenet=False

# Zylinder für den Halter generieren und Spule davon abziehen
halter = doc.addObject("Part::Cylinder","Halter")
halter.Label = "Halter"
halter.Radius = D_Spule/2
halter.Height = Steigung*(Windungen+2)
from BOPTools import BOPFeatures
bp = BOPFeatures.BOPFeatures(doc)
bp.make_cut(["Halter", "Spule", ])                      # erzeugt "Cut"
halter.ViewObject.ShapeColor=Farbe_Spulenhalter
doc.getObject('Cut').Label = "Spulenhalter_gekerbt"

# Box zum Beschneiden des Spulenhalters erzeugen
box = doc.addObject("Part::Box","Box")
box.Label = "Begrenzungsbox"
box.Width = Box_W
box.Length = Box_W
box.Height = Box_H
doc.Box.Placement=Placement(Vector(-Box_W/2,-Box_W/2,Steigung), Rotation(vecz,0), vec0)
from BOPTools import BOPFeatures
bp = BOPFeatures.BOPFeatures(doc)
bp.make_multi_common(["Box", "Cut", ])                  # erzeugt "Common"
doc.Common.Placement=Placement(Vector(0,0,-Steigung), Rotation(vecz,0), vec0)
doc.getObject('Common').Label = "Spulenhalter_beschnitten"

# Kern des Spulenhalters ausschneiden
bohrung = doc.addObject("Part::Cylinder","Bohrung")
bohrung.Label = "Kernbohrung"
bohrung.Radius = D_Spule/2-Wand
bohrung.Height = Steigung*(Windungen+2)
doc.Bohrung.Placement=Placement(Vector(0,0,-Steigung), Rotation(vecz,0), vec0)
from BOPTools import BOPFeatures
bp = BOPFeatures.BOPFeatures(doc)
bp.make_cut(["Common", "Bohrung", ])                    # erzeugt "Cut001"

output = StringIO()
print("Spulenhalter-D", D_Spule, "mm-W", Windungen, "-H", Box_H, "mm", file=output, sep='', end='')

doc.getObject('Cut001').Label = output.getvalue()

doc.recompute()

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



