I want to draw several cylinders, which I want use to cut holes in a part.
When I draw the cylinders with my script they are unexpected translated on x-axis.
When I retype the text directly in FreeCAD, everything is fine.
I can't figure out what I'm doing wrong.
some of the cylinders are drawn on lines 206 - 209 of the script (see below).
I have to apologize for my script. This is the first script I ever made and I'm aware that it violates programming etiquettes.
Thanks in advance,
Broomy
Specs:
OS: Ubuntu 12.04.4 LTS
Platform: 32-bit
Version: 0.14.3595 (Git)
Branch: master
Hash: d85f44208948427346dcadb133c12bd7991b4d6d
Python version: 2.7.3
Qt version: 4.8.1
Coin version: 3.1.3
SoQt version: 1.5.0
OCC version: 6.7.0
Code: Select all
App.newDocument("Quintar")
from FreeCAD import Base
import Part, math, datetime, os
# Variables
## Golden ratio
goldenratio = 2.0/(math.sqrt(5.0)-1.0)
## stringlengths
slbass = 777.0 # stringlength on bassside
sltreble = slbass/2**(3.0/12.0) # stringlength on trebleside
compensation = 3. # string compensation at the bridge
offsetbridge = (slbass-sltreble)/goldenratio # Offset off the trebleside
offsetnut = (slbass-sltreble)-offsetbridge
## Frets
numberfrets = 25
widthfret = 2.
heightfret = 3.
depthfret = 3.
depthwidthfret = 2.
## single string bridge
bridgelength = 40.0
bridgercylinder = 4
bridgewidth = 10.0
bridgeheight1 = 6.0
bridgeheight2 = 10.0
rlowerhole = 2.0
rhigherhole = 4.0
rsaddle = 3*0.8
offset1 = 1.0
offset2 = offset1+rhigherhole-rlowerhole
## Body
thicknessbodyplate = 18.
fretwherebodymeetsneck = 16
lengthbody = slbass/goldenratio
distancesboltofbridge = 10.
radiusbridgebolt = 2*0.8 # 4mm bolts are used
offsetfrombridge = 25. # offset of cut for tuners
offsettuners = 35. # offset for tuners
totdisttreble = 150. # distance of the line where the tuners are located at trebleside
totdistbass = 120. # distance of the line where the tuners are located at bassside
offsetxlr = 10
widthxlr = 80
lengthxlr = totdisttreble
transxlr = 10
Alignmenthole = 8.
rneckbolts = 4. # radius of holes to fasten the neck
## diameter strings
diastr = []
diastr.append(0.145*25.4)
diastr.append(0.090*25.4)
diastr.append(0.055*25.4)
diastr.append(0.034*25.4)
diastr.append(0.021*25.4)
diastr.append(0.013*25.4)
diastr.append(0.010*25.4)
## stringdistance
sdbridgetreble = 10.5
sdbridgebass = 15.0
factorsd = (sdbridgebass/sdbridgetreble)**(1./(len(diastr)-2.))
sdnuttreble = sdbridgetreble/goldenratio
sdside = 3.0
# width nut and bridge
sdnut = []
sdbridge = []
sdnut.append(0)
sdbridge.append(0)
for i in range(0,(len(diastr)-1)):
sdnut.append(sdnuttreble*factorsd**(len(diastr)-2-i))
sdbridge.append(sdbridgetreble*factorsd**(len(diastr)-2-i))
widthnut = 2.*sdside+sum(sdnut)+sum(diastr)
widthbridge = 2.*sdside+sum(sdbridge)+sum(diastr)
thicknessneck = 18.0
thfretboard = 9.0
# Calculating total quintar length.
xend = slbass-slbass/2**(fretwherebodymeetsneck/12.0)+lengthbody
yend = (widthnut/2.0+(widthbridge-widthnut)/2.0*xend/slbass)
yverschil = yend-widthnut/2.0
angleneck = math.atan2(yverschil,xend) # angle neck in radians
cosangleneck = math.cos(angleneck)
sinangleneck = math.sin(angleneck)
tanangleneck = math.tan(angleneck)
# Frets drawing
doc=App.activeDocument()
grp=doc.addObject("App::DocumentObjectGroup", "Frets")
xbass = []
ybass = []
xtreble = []
ytreble = []
for i in range(0,numberfrets+1):
xbass.append(slbass-slbass/2**(i/12.0))
ybass.append(-(widthnut/2.0+(widthbridge-widthnut)/2.0*xbass[i]/slbass))
xtreble.append(offsetnut+sltreble-sltreble/2.0**(i/12.0))
ytreble.append((widthnut/2.0+(widthbridge-widthnut)/2.0*xtreble[i]/slbass))
edge = Part.makeLine((xbass[i],ybass[i],thicknessneck), (xtreble[i],ytreble[i],thicknessneck))
P = edge.extrude(Base.Vector(0,0,2))
P.translate(Base.Vector(0,0,thfretboard))
Fretnr = "Fret"+str(i)
Fret = FreeCAD.ActiveDocument.addObject("Part::Feature",Fretnr)
Fret.Shape = P
grp.addObject(Fret)
# drawing outline
## points
xoffset = 30
yoffset = (widthnut/2.0-(widthbridge-widthnut)/2.0*xoffset/slbass)
V1 = Base.Vector(-xoffset,-yoffset)
xneckbass = slbass-slbass/2**(numberfrets/12.0)
yneckbass = -(widthnut/2.0+(widthbridge-widthnut)/2.0*xneckbass/slbass)
V2 = Base.Vector(xneckbass,yneckbass)
xnecktreble = slbass-slbass/2**(numberfrets/12.0)
ynecktreble = (widthnut/2.0+(widthbridge-widthnut)/2.0*xnecktreble/slbass)
V3 = Base.Vector(xnecktreble,ynecktreble,0)
V4 = Base.Vector(-xoffset,yoffset)
## lines
L1 = Part.Line(V1,V2)
L2 = Part.Line(V2,V3)
L3 = Part.Line(V3,V4)
L4 = Part.Line(V4,V1)
## make a part and wire of it
S1 = Part.Shape([L1,L2,L3,L4])
W1 = Part.Wire(S1.Edges)
F1 = Part.Face(W1)
P1 = F1.extrude(Base.Vector(0,0,thicknessneck))
P2 = F1.extrude(Base.Vector(0,0,thfretboard))
P2.translate(Base.Vector(0,0,thicknessneck))
# cutout for strings
sdoffsettreble = (sdnuttreble-(sdbridgetreble-sdnuttreble)*xoffset/slbass)
sdoffset = []
sdoffset.append(0)
for i in range(0,(len(diastr)-1)):
sdoffset.append(sdoffsettreble*factorsd**(len(diastr)-2.-i))
# Note: cutout is 20% wider at the end then with 0 fret.
for i in range(len(diastr)):
diastrtemp = diastr[0:i+1]
sdnuttemp = sdnut[0:i+1]
sdbridgetemp = sdbridge[0:i+1]
sdoffsettemp = sdoffset[0:i+1]
ynut = -widthnut/2 + sdside + sum(diastrtemp) - diastr[i] + sum(sdnuttemp)
ybridge = -widthbridge/2.0 + sdside + sum(diastrtemp) - diastr[i] + sum(sdbridgetemp)
xtemp1 = -xoffset
ytemp1 = -yoffset + sdside + sum(diastrtemp) - diastr[i] - 0.1*diastr[i] + sum(sdoffsettemp)
xtemp2 = xbass[0]+(xtreble[0]-xbass[0])*(ynut+widthnut/2.0)/widthnut - 5.0
ytemp2 = ynut + (ybridge-ynut)*xtemp2/slbass
xtemp3 = xtemp2
ytemp3 = ytemp2 + diastr[i]
xtemp4 = -xoffset
ytemp4 = ytemp1 + 1.2*diastr[i]
Vtemp1 = Base.Vector(xtemp1,ytemp1)
Vtemp2 = Base.Vector(xtemp2,ytemp2)
Vtemp3 = Base.Vector(xtemp3,ytemp3)
Vtemp4 = Base.Vector(xtemp4,ytemp4)
Ltemp1 = Part.Line(Vtemp1,Vtemp2)
Ltemp2 = Part.Line(Vtemp2,Vtemp3)
Ltemp3 = Part.Line(Vtemp3,Vtemp4)
Ltemp4 = Part.Line(Vtemp4,Vtemp1)
Stemp = Part.Shape([Ltemp1,Ltemp2,Ltemp3,Ltemp4])
Wtemp = Part.Wire(Stemp.Edges)
Ftemp = Part.Face(Wtemp)
Ptemp = Ftemp.extrude(Base.Vector(0,0,thfretboard))
Ptemp.translate(Base.Vector(0,0,thicknessneck))
P2 = P2.cut(Ptemp)
## Drawing mounting holes
cylindermountingneck = Part.makeCylinder(rneckbolts*0.8,thicknessbodyplate)
cylmneck1 = cylindermountingneck
cylmneck2 = cylindermountingneck
cylmneck3 = cylindermountingneck
cylmneck4 = cylindermountingneck
cylmneck1.translate(Base.Vector(slbass-slbass/2**(fretwherebodymeetsneck/12.0)+20.,0.5*widthnut,-thicknessbodyplate))
cylmneck2.translate(Base.Vector(slbass-slbass/2**(numberfrets/12.0)-20.,0.5*widthnut,-thicknessbodyplate))
cylmneck3.translate(Base.Vector(slbass-slbass/2**(fretwherebodymeetsneck/12.0)+20.,-0.5*widthnut,-thicknessbodyplate))
cylmneck4.translate(Base.Vector(slbass-slbass/2**(numberfrets/12.0)-20.,-0.5*widthnut,-thicknessbodyplate))
P1 = P1.cut(cylmneck1)
P1 = P1.cut(cylmneck2)
P1 = P1.cut(cylmneck2)
P1 = P1.cut(cylmneck2)
Neck = FreeCAD.ActiveDocument.addObject("Part::Feature","Neck")
Neck.Shape = P1
Fretboard = FreeCAD.ActiveDocument.addObject("Part::Feature","Fretboard")
Fretboard.Shape = P2
# Drawing the body
werkelijkeafstand = math.hypot(xend,yverschil) # de werkelijke afstand van het begin van de hals langs de schuine zijde tot helemaal naar achteren
werkelijkelengthbody = lengthbody*werkelijkeafstand/xend # de lengte van de lijn waar ik de cirkeldelen op ga berekenen is langer, dit wordt hier berekend
# berekenen vectoren waar de cirkeldelen uitgemaakt worden.
rgroteboog = (werkelijkelengthbody/goldenratio)/2.0
xcentregroteboog = werkelijkelengthbody-rgroteboog
rkleineboog = (werkelijkelengthbody/math.pow(goldenratio,2))/2.0
xcentrekleineboog = rkleineboog
rcutaway = (werkelijkelengthbody/math.pow(goldenratio,3))/2.0
rcutaway2 = (werkelijkelengthbody/math.pow(goldenratio,4))/2.0
d = rgroteboog+rkleineboog # uitrekenen van snijpunt grote en kleine boog en straal van midden cirkeldeel
xcentremidden = (d**2.0-(rgroteboog+rcutaway)**2.0+(rgroteboog)**2.0)/(2.0*d)
ycentremidden = ((4*d**2.0*(rgroteboog)**2.0-(d**2.0-(rgroteboog+rcutaway)**2.0+(rgroteboog)**2.0)**2)/(4*d**2))**0.5
angle1centremidden = math.atan2(ycentremidden,xcentremidden)
angle2centremidden = math.atan2(ycentremidden,xcentremidden)
d2 = rkleineboog
xVb0 = werkelijkelengthbody
yVb0 = 0
xVb1 = werkelijkelengthbody-rgroteboog
yVb1 = rgroteboog
xVb2 = math.cos(angle2centremidden)*rgroteboog+rgroteboog
yVb2 = math.sin(angle2centremidden)*rgroteboog
xVb3 = rkleineboog + xcentremidden
yVb3 = ycentremidden-rcutaway
xVb4 = rkleineboog + math.cos(angle1centremidden)*rkleineboog
yVb4 = math.sin(angle1centremidden)*rkleineboog
xVb5 = rkleineboog
yVb5 = rkleineboog
xVb6 = rcutaway2
yVb6 = 2*rcutaway2
xVb7 = 2*rcutaway2
yVb7 = rcutaway2
xVb8 = rcutaway2
yVb8 = 0
xVb9 = 0
yVb9 = 0
xVb10 = xbass[numberfrets]+20+lengthbody-xend
yVb10 = 0
xVb = [xVb0,xVb1,xVb2,xVb3,xVb4,xVb5,xVb6,xVb7,xVb8,xVb9,xVb10]
yVb = [yVb0,yVb1,yVb2,yVb3,yVb4,yVb5,yVb6,yVb7,yVb8,yVb9,yVb10]
# Transleren van coördinaten en maken van vectoren
xVbtrans = []
yVbtrans = []
Vpos = []
Vneg = []
for i in range(len(xVb)):
xtemp = xVb[i]+werkelijkeafstand-werkelijkelengthbody
print xtemp
angleofcoord = math.atan2(yVb[i],xtemp)
rcoord = math.hypot(xtemp,yVb[i])
xVbtrans.append(math.cos(angleofcoord+angleneck)*rcoord)
yVbtrans.append(math.sin(angleofcoord+angleneck)*rcoord+widthnut/2.0)
Vpos.append(Base.Vector(xVbtrans[i],yVbtrans[i],0))
Vneg.append(Base.Vector(xVbtrans[i],-yVbtrans[i],0))
# Maken van lijnstukken
Apos1 = Part.Arc(Vpos[0],Vpos[1],Vpos[2])
Apos2 = Part.Arc(Vpos[2],Vpos[3],Vpos[4])
Apos3 = Part.Arc(Vpos[4],Vpos[5],Vpos[6])
Apos4 = Part.Arc(Vpos[6],Vpos[7],Vpos[8])
Lpos1 = Part.Line(Vpos[8],Vpos[10])
Lpos2 = Part.Line(Vpos[10],Base.Vector(xVbtrans[10],0))
Lpos3 = Part.Line(Vpos[8],Vpos[9])
Lpos4 = Part.Line(Vpos[9],Base.Vector(xVbtrans[9],0))
Aneg1 = Part.Arc(Vneg[0],Vneg[1],Vneg[2])
Aneg2 = Part.Arc(Vneg[2],Vneg[3],Vneg[4])
Aneg3 = Part.Arc(Vneg[4],Vneg[5],Vneg[9])
Lneg1 = Part.Line(Vneg[8],Vneg[10])
Lneg2 = Part.Line(Vneg[10],Base.Vector(xVbtrans[10],0))
Lneg3 = Part.Line(Vneg[8],Vneg[9])
Lneg4 = Part.Line(Vneg[9],Base.Vector(xVbtrans[9],0))
back = Part.Line(Base.Vector(xend,-yend,0),Base.Vector(xend,yend,0))
# Tekenen van bovenplaat body
Bodybvnplaat = Part.Shape([Apos1,Apos2,Apos3,Apos4,Lpos1,Lpos2,Lneg2,Lneg1,Lneg3,Aneg3,Aneg2,Aneg1,back])
WBodybvnplaat = Part.Wire(Bodybvnplaat.Edges)
FBodybvnplaat = Part.Face(WBodybvnplaat)
PBodybvnplaat = FBodybvnplaat.extrude(Base.Vector(0,0,thicknessbodyplate))
## uitsparing stemmechanieken
xVbtuner1 = slbass + compensation + offsetfrombridge
yVbtuner1 = -0.5*widthbridge
xVbtuner2 = sltreble + offsetnut + compensation + offsetfrombridge
yVbtuner2 = 0.5*widthbridge
xVbtuner3 = xVbtuner2
yVbtuner3 = 0.5*widthbridge + offsettuners
xVbtuner4temp = math.sqrt(totdisttreble**2-(0.5*widthbridge)**2)
xVbtuner4 = xVbtuner2 + xVbtuner4temp
yVbtuner4 = offsettuners
xVbtuner5temp = math.sqrt(totdistbass**2-(0.5*widthbridge)**2)
xVbtuner5 = xVbtuner1 + xVbtuner5temp
yVbtuner5 = 0
xVbtuner6 = xVbtuner5
yVbtuner6 = -offsettuners
xVbtuner7 = xVbtuner1
yVbtuner7 = -0.5*widthbridge-offsettuners
xVbtuner = [xVbtuner1,xVbtuner2,xVbtuner3,xVbtuner4,xVbtuner5,xVbtuner6,xVbtuner7]
yVbtuner = [yVbtuner1,yVbtuner2,yVbtuner3,yVbtuner4,yVbtuner5,yVbtuner6,yVbtuner7]
Vbtuner = []
for i in range(len(xVbtuner)):
Vbtuner.append(Base.Vector(xVbtuner[i],yVbtuner[i],0))
Lbtuner1 = Part.Line(Vbtuner[0],Vbtuner[1])
Lbtuner2 = Part.Line(Vbtuner[1],Vbtuner[2])
Lbtuner3 = Part.Line(Vbtuner[2],Vbtuner[3])
Lbtuner4 = Part.Line(Vbtuner[3],Vbtuner[4])
Lbtuner5 = Part.Line(Vbtuner[4],Vbtuner[5])
Lbtuner6 = Part.Line(Vbtuner[5],Vbtuner[6])
Lbtuner7 = Part.Line(Vbtuner[6],Vbtuner[0])
Bodybvnplaatcut = Part.Shape([Lbtuner1,Lbtuner2,Lbtuner3,Lbtuner4,Lbtuner5,Lbtuner6,Lbtuner7])
WBodybvnplaatcut = Part.Wire(Bodybvnplaatcut.Edges)
FBodybvnplaatcut = Part.Face(WBodybvnplaatcut)
PBodybvnplaatcut = FBodybvnplaatcut.extrude(Base.Vector(0,0,thicknessbodyplate))
PBodybvnplaat = PBodybvnplaat.cut(PBodybvnplaatcut)
## XLR input cut
rc1 = (yVbtuner4-yVbtuner3)/(xVbtuner4-xVbtuner3)
rc2 = -1/rc1
xVbxlr1 = xVbtuner3 + math.sqrt(offsetxlr**2/(rc2**2+1))
yVbxlr1 = yVbtuner3 + math.sqrt(offsetxlr**2/((1/rc2**2)+1))
xVbxlr2 = xVbxlr1 + math.sqrt(widthxlr**2/(rc2**2+1))
yVbxlr2 = yVbxlr1 + math.sqrt(widthxlr**2/((1/rc2**2)+1))
xVbxlr3 = xVbxlr2 + math.sqrt(lengthxlr**2/(rc1**2+1))
yVbxlr3 = yVbxlr2 - math.sqrt(lengthxlr**2/((1/rc1**2)+1))
xVbxlr4 = xVbxlr1 + math.sqrt(lengthxlr**2/(rc1**2+1))
yVbxlr4 = yVbxlr1 - math.sqrt(lengthxlr**2/((1/rc1**2)+1))
xVbxlr = [xVbxlr1,xVbxlr2,xVbxlr3,xVbxlr4]
yVbxlr = [yVbxlr1,yVbxlr2,yVbxlr3,yVbxlr4]
Vbxlr = []
for i in range(len(xVbxlr)):
Vbxlr.append(Base.Vector(xVbxlr[i],yVbxlr[i],0))
Lbxlr1 = Part.Line(Vbxlr[0],Vbxlr[1])
Lbxlr2 = Part.Line(Vbxlr[1],Vbxlr[2])
Lbxlr3 = Part.Line(Vbxlr[2],Vbxlr[3])
Lbxlr4 = Part.Line(Vbxlr[3],Vbxlr[0])
Bodybvnplaatxlrcut = Part.Shape([Lbxlr1,Lbxlr2,Lbxlr3,Lbxlr4])
WBodybvnplaatxlrcut = Part.Wire(Bodybvnplaatxlrcut.Edges)
FBodybvnplaatxlrcut = Part.Face(WBodybvnplaatxlrcut)
PBodybvnplaatxlrcut = FBodybvnplaatxlrcut.extrude(Base.Vector(0,0,thicknessbodyplate))
xtrans = -math.sqrt(transxlr**2/(rc1**2+1))
ytrans = math.sqrt(transxlr**2/((1/rc1**2)+1))
PBodybvnplaatxlrcut.translate(Base.Vector(xtrans,ytrans,0))
PBodybvnplaat = PBodybvnplaat.cut(PBodybvnplaatxlrcut)
## Alignment cutout and bolts
cylinderalignment = Part.makeCylinder(0.5*Alignmenthole,2.*thicknessbodyplate)
cylalig1 = cylinderalignment
cylalig2 = cylinderalignment
cylalig1.translate(Base.Vector(slbass-slbass/2**(numberfrets/12.0)+40.,-0.5*widthnut,-thicknessbodyplate))
cylalig2.translate(Base.Vector(slbass-slbass/2**(numberfrets/12.0)+40.,0.5*widthnut,-thicknessbodyplate))
Part.show(cylinderalignment)
Part.show(cylalig1)
Part.show(cylalig1)
PBodybvnplaat = PBodybvnplaat.cut(cylalig1)
PBodybvnplaat = PBodybvnplaat.cut(cylalig2)
cylindermountingbody = Part.makeCylinder(rneckbolts,thicknessbodyplate)
cylmbody1 = cylindermountingbody
cylmbody2 = cylindermountingbody
cylmbody3 = cylindermountingbody
cylmbody4 = cylindermountingbody
cylmbody1.translate(Base.Vector(slbass-slbass/2**(fretwherebodymeetsneck/12.0)+20.,0.5*widthnut,-thicknessbodyplate))
cylmbody2.translate(Base.Vector(slbass-slbass/2**(numberfrets/12.0)-20.,0.5*widthnut,-thicknessbodyplate))
cylmbody3.translate(Base.Vector(slbass-slbass/2**(fretwherebodymeetsneck/12.0)+20.,-0.5*widthnut,-thicknessbodyplate))
cylmbody4.translate(Base.Vector(slbass-slbass/2**(numberfrets/12.0)-20.,-0.5*widthnut,-thicknessbodyplate))
PBodybvnplaat = PBodybvnplaat.cut(cylmbody1)
PBodybvnplaat = PBodybvnplaat.cut(cylmbody2)
PBodybvnplaat = PBodybvnplaat.cut(cylmbody3)
PBodybvnplaat = PBodybvnplaat.cut(cylmbody4)
Part.show(cylmbody1)
# Maken van onderplaat body
Bodyndrplaat = Part.Shape([Apos1,Apos2,Apos3,Apos4,Lpos3,Lpos4,Lneg4,Aneg3,Aneg2,Aneg1,back])
WBodyndrplaat = Part.Wire(Bodyndrplaat.Edges)
FBodyndrplaat = Part.Face(WBodyndrplaat)
PBodyndrplaat = FBodyndrplaat.extrude(Base.Vector(0,0,-thicknessbodyplate))
PBodyndrplaatxlrcut = PBodybvnplaatxlrcut
PBodyndrplaatxlrcut.translate(Base.Vector(0,0,-thicknessbodyplate))
PBodyndrplaat = PBodyndrplaat.cut(PBodyndrplaatxlrcut)
PBodyndrplaat = PBodyndrplaat.cut(cylalig1)
PBodyndrplaat = PBodyndrplaat.cut(cylalig2)
# single string bridge tekenen
doc=App.activeDocument()
grp=doc.addObject("App::DocumentObjectGroup", "SingleStringBridge")
xbridgetreble = sltreble + offsetnut
ybridgetreble = 0.5*widthnut + (widthbridge-widthnut)/2*((sltreble+offsetnut)/slbass)
rcbridge = (-0.5*widthbridge-ybridgetreble)/(slbass-xbridgetreble)
bbridge = ybridgetreble - rcbridge*(xbridgetreble-0)
for i in range(len(diastr)):
bridge = Part.makeBox(bridgelength, bridgewidth, bridgeheight1)
bridge = bridge.makeFillet(0.5,bridge.Edges)
cylinder = Part.makeCylinder(bridgercylinder,bridgeheight2,Base.Vector(0.5*bridgelength,0.5*bridgewidth,0),Base.Vector(0,0,1))
bridge = bridge.fuse(cylinder)
cylinder = Part.makeCylinder(rsaddle,bridgeheight2,Base.Vector(0.5*bridgelength,0.5*bridgewidth,0))
bridge = bridge.cut(cylinder)
cylinder = Part.makeCylinder(rhigherhole,bridgeheight1,Base.Vector(offset1+rhigherhole,0.5*bridgewidth,0.5*bridgeheight1))
bridge = bridge.cut(cylinder)
cylinder = Part.makeCylinder(rhigherhole,bridgeheight1,Base.Vector(0.5*bridgelength-bridgercylinder-offset1-rhigherhole,0.5*bridgewidth,0.5*bridgeheight1))
bridge = bridge.cut(cylinder)
cylinder = Part.makeCylinder(rhigherhole,bridgeheight1,Base.Vector(0.5*bridgelength+bridgercylinder+offset1+rhigherhole,0.5*bridgewidth,0.5*bridgeheight1))
bridge = bridge.cut(cylinder)
cylinder = Part.makeCylinder(rhigherhole,bridgeheight1,Base.Vector(bridgelength-offset1-rhigherhole,0.5*bridgewidth,0.5*bridgeheight1))
bridge = bridge.cut(cylinder)
box = Part.makeBox(0.5*bridgelength-bridgercylinder-2.0*offset1-2.0*rhigherhole,2*rhigherhole,bridgeheight2,Base.Vector(offset1+rhigherhole,0.5*bridgewidth-rhigherhole,0.5*bridgeheight1))
bridge = bridge.cut(box)
box = Part.makeBox(0.5*bridgelength-bridgercylinder-2.0*offset1-2.0*rhigherhole,2*rhigherhole,bridgeheight2,Base.Vector(0.5*bridgelength+offset1+bridgercylinder+rhigherhole,0.5*bridgewidth-rhigherhole,0.5*bridgeheight1))
bridge = bridge.cut(box)
cylinder = Part.makeCylinder(rlowerhole,0.5*bridgeheight1,Base.Vector(offset1+rhigherhole,0.5*bridgewidth,0))
bridge = bridge.cut(cylinder)
cylinder = Part.makeCylinder(rlowerhole,0.5*bridgeheight1,Base.Vector(0.5*bridgelength-bridgercylinder-offset1-rhigherhole,0.5*bridgewidth,0))
bridge = bridge.cut(cylinder)
cylinder = Part.makeCylinder(rlowerhole,0.5*bridgeheight1,Base.Vector(0.5*bridgelength+bridgercylinder+offset1+rhigherhole,0.5*bridgewidth,0))
bridge = bridge.cut(cylinder)
cylinder = Part.makeCylinder(rlowerhole,0.5*bridgeheight1,Base.Vector(bridgelength-offset1-rhigherhole,0.5*bridgewidth,0))
bridge = bridge.cut(cylinder)
box = Part.makeBox(0.5*bridgelength-bridgercylinder-2.0*offset1-2.0*rhigherhole,2*rlowerhole,0.5*bridgeheight1,Base.Vector(offset1+rhigherhole,0.5*bridgewidth-rlowerhole,0))
bridge = bridge.cut(box)
box = Part.makeBox(0.5*bridgelength-bridgercylinder-2.0*offset1-2.0*rhigherhole,2*rlowerhole,0.5*bridgeheight1,Base.Vector(0.5*bridgelength+offset1+bridgercylinder+rhigherhole,0.5*bridgewidth-rlowerhole,0))
bridge = bridge.cut(box)
diastrtemp = diastr[0:i+1]
sdnuttemp = sdnut[0:i+1]
sdbridgetemp = sdbridge[0:i+1]
ynut = -widthnut/2.0 + sdside + sum(diastrtemp) - 0.5*diastr[i] + sum(sdnuttemp)
ybridge = -widthbridge/2.0 + sdside + sum(diastrtemp) - 0.5*diastr[i] + sum(sdbridgetemp)
rcstring = (ybridge-ynut)/(slbass-0.)
xintersect = (ynut - bbridge)/(rcbridge-rcstring)
yintersect = ynut + rcstring*xintersect
bridge.translate(Base.Vector(-0.5*bridgelength,-0.5*bridgewidth,0))
bridge.translate(Base.Vector(xintersect+compensation,yintersect,thicknessbodyplate))
# displaying the bridge
SingleStringBridge = FreeCAD.ActiveDocument.addObject("Part::Feature","SingleStringBridge")
SingleStringBridge.Shape = bridge
grp.addObject(SingleStringBridge)
# Drawing of body and neck:
Bodyupperplate = FreeCAD.ActiveDocument.addObject("Part::Feature","Body - Upper plate")
Bodyupperplate.Shape = PBodybvnplaat
Bodyunderplate = FreeCAD.ActiveDocument.addObject("Part::Feature","Body under plate")
Bodyunderplate.Shape = PBodyndrplaat
Gui.SendMsgToActiveView("ViewFit")