Unexpected placement of cylinders when using a script

Need help, or want to share a macro? Post here!
Forum rules
Be nice to others! Respect the FreeCAD code of conduct!
Post Reply
Broomy
Posts: 4
Joined: Thu Mar 13, 2014 7:44 am

Unexpected placement of cylinders when using a script

Post by Broomy »

I'm creating a script to draw a guitar. The script enables me to redraw the guitar easily when I change a parameter, p.a. the stringlength, thickness of the neck, etc.

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")
jmaustpc
Veteran
Posts: 11207
Joined: Tue Jul 26, 2011 6:28 am
Location: Australia

Re: Unexpected placement of cylinders when using a script

Post by jmaustpc »

Hi Broomy
welcome here....

I had a quick look while I approved your post....I could easily be wrong ....but I noticed you have a decimal point after 20 before the comma...I don't know what Python would think of that?...for an example look at line 201 character 83....

I know very little about Python, but I noticed this so I thought I would mention it in case it is a problem.

Jim
Broomy
Posts: 4
Joined: Thu Mar 13, 2014 7:44 am

Re: Unexpected placement of cylinders when using a script

Post by Broomy »

Thanks Jim,
And I would like to say that I'm really impressed by all the great documentation on this site.

I've added the . to make it clear for Python that it is no integer. I've run in some issues when I was trying to calculate with whole numbers and decimal numbers (p.a. 20 + 10.5). The whole numbers was interpreted as a integer.

I have tried it again with the point removed but the situation stays the same.
User avatar
wandererfan
Veteran
Posts: 6320
Joined: Tue Nov 06, 2012 5:42 pm
Contact:

Re: Unexpected placement of cylinders when using a script

Post by wandererfan »

Broomy wrote:some of the cylinders are drawn on lines 206 - 209 of the script (see below).
I haven't done a complete review, but a couple of things to start looking at:

"cylmneck? = cylindermountingneck" gives Python 4 different names for the same piece of data, unlike other languages where you would get 4 separate pieces of data. Using copy() gets you 4 different cylinders that you can move to 4 different places. As is, you've moved the same cylinder 4 times.

Code: Select all

## Drawing mounting holes

cylindermountingneck = Part.makeCylinder(rneckbolts*0.8,thicknessbodyplate)
cylmneck1 = cylindermountingneck.copy()      # use copy() to get 4 separate cylinders
cylmneck2 = cylindermountingneck.copy()
cylmneck3 = cylindermountingneck.copy()
cylmneck4 = cylindermountingneck.copy()
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(cylmneck3)        # assume: sb 4 different cuts?
P1 = P1.cut(cylmneck4)        # assume: sb 4 different cuts?
Also, I think there's a typo in the last 2 cuts.

wf
Broomy
Posts: 4
Joined: Thu Mar 13, 2014 7:44 am

Re: Unexpected placement of cylinders when using a script

Post by Broomy »

Thank you for your fast reply wf,

You where right about the typos.
I've imported the "copy" module and did as you said and everything went well.
Thanks!

Hans

Code: Select all

App.newDocument("Quintar")

from FreeCAD import Base
import Part, math, datetime, os, copy

# 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.copy()
cylmneck2 = cylindermountingneck.copy()
cylmneck3 = cylindermountingneck.copy()
cylmneck4 = cylindermountingneck.copy()
cylmneck1.translate(Base.Vector(slbass-slbass/2**(fretwherebodymeetsneck/12.0)+20.0,0.4*widthnut,-thicknessbodyplate))
cylmneck2.translate(Base.Vector(slbass-slbass/2**(numberfrets/12.0)-20.0,0.4*widthnut,-thicknessbodyplate))
cylmneck3.translate(Base.Vector(slbass-slbass/2**(fretwherebodymeetsneck/12.0)+20.0,-0.4*widthnut,-thicknessbodyplate))
cylmneck4.translate(Base.Vector(slbass-slbass/2**(numberfrets/12.0)-20.0,-0.4*widthnut,-thicknessbodyplate))

P1 = P1.cut(cylmneck1)
P1 = P1.cut(cylmneck2)
P1 = P1.cut(cylmneck3)
P1 = P1.cut(cylmneck4)
  
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.copy()
cylalig2 = cylinderalignment.copy()
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))

PBodybvnplaat = PBodybvnplaat.cut(cylalig1)
PBodybvnplaat = PBodybvnplaat.cut(cylalig2)

# 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.copy()
PBodyndrplaatxlrcut.translate(Base.Vector(0,0,-thicknessbodyplate))
PBodyndrplaat = PBodyndrplaat.cut(PBodyndrplaatxlrcut)
PBodyndrplaat = PBodyndrplaat.cut(cylalig1)
PBodyndrplaat = PBodyndrplaat.cut(cylalig2)

cylindermountingbody = Part.makeCylinder(rneckbolts,thicknessbodyplate)
cylmbody1 = cylindermountingbody.copy()
cylmbody2 = cylindermountingbody.copy()
cylmbody3 = cylindermountingbody.copy()
cylmbody4 = cylindermountingbody.copy()
cylmbody1.translate(Base.Vector(slbass-slbass/2**(fretwherebodymeetsneck/12.0)+20.,0.4*widthnut,-thicknessbodyplate))
cylmbody2.translate(Base.Vector(slbass-slbass/2**(numberfrets/12.0)-20.,0.4*widthnut,-thicknessbodyplate))
cylmbody3.translate(Base.Vector(slbass-slbass/2**(fretwherebodymeetsneck/12.0)+20.,-0.4*widthnut,-thicknessbodyplate))
cylmbody4.translate(Base.Vector(slbass-slbass/2**(numberfrets/12.0)-20.,-0.4*widthnut,-thicknessbodyplate))
PBodyndrplaat = PBodyndrplaat.cut(cylmbody1)
PBodyndrplaat = PBodyndrplaat.cut(cylmbody2)
PBodyndrplaat = PBodyndrplaat.cut(cylmbody3)
PBodyndrplaat = PBodyndrplaat.cut(cylmbody4)


# 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")
User avatar
wandererfan
Veteran
Posts: 6320
Joined: Tue Nov 06, 2012 5:42 pm
Contact:

Re: Unexpected placement of cylinders when using a script

Post by wandererfan »

Broomy wrote:I've imported the "copy" module and did as you said and everything went well.
Glad it worked out. You don't need to import the copy module. FreeCAD shape objects have a copy method built-in.

wf
Broomy
Posts: 4
Joined: Thu Mar 13, 2014 7:44 am

Re: Unexpected placement of cylinders when using a script

Post by Broomy »

Ok thanks.
Post Reply