FreeCAD/src/Mod/Part/MakeBottle.py
2014-09-17 11:57:32 +02:00

136 lines
3.7 KiB
Python

#! python
# -*- coding: utf-8 -*-
# (c) 2008 Werner Mayer LGPL
import Part, math
import FreeCAD, FreeCADGui
App=FreeCAD
Gui=FreeCADGui
from FreeCAD import Base
def makeBottle(myWidth=50.0, myHeight=70.0, myThickness=30.0):
aPnt1=Base.Vector(-myWidth/2.,0,0)
aPnt2=Base.Vector(-myWidth/2.,-myThickness/4.,0)
aPnt3=Base.Vector(0,-myThickness/2.,0)
aPnt4=Base.Vector(myWidth/2.,-myThickness/4.,0)
aPnt5=Base.Vector(myWidth/2.,0,0)
aArcOfCircle = Part.Arc(aPnt2,aPnt3,aPnt4)
aSegment1=Part.Line(aPnt1,aPnt2)
aSegment2=Part.Line(aPnt4,aPnt5)
aEdge1=aSegment1.toShape()
aEdge2=aArcOfCircle.toShape()
aEdge3=aSegment2.toShape()
aWire=Part.Wire([aEdge1,aEdge2,aEdge3])
aTrsf=Base.Matrix()
aTrsf.rotateZ(math.pi) # rotate around the z-axis
aMirroredWire=aWire.copy()
aMirroredWire.transformShape(aTrsf)
myWireProfile=Part.Wire([aWire,aMirroredWire])
myFaceProfile=Part.Face(myWireProfile)
aPrismVec=Base.Vector(0,0,myHeight)
myBody=myFaceProfile.extrude(aPrismVec)
myBody=myBody.makeFillet(myThickness/12.0,myBody.Edges)
neckLocation=Base.Vector(0,0,myHeight)
neckNormal=Base.Vector(0,0,1)
myNeckRadius = myThickness / 4.
myNeckHeight = myHeight / 10
myNeck = Part.makeCylinder(myNeckRadius,myNeckHeight,neckLocation,neckNormal)
myBody = myBody.fuse(myNeck)
faceToRemove = 0
zMax = -1.0
for xp in myBody.Faces:
surf = xp.Surface
if type(surf) == Part.Plane:
z = surf.Position.z
if z > zMax:
zMax = z
faceToRemove = xp
# This doesn't work for any reason
myBody = myBody.makeThickness([faceToRemove],-myThickness/50 , 1.e-3)
myThreading = Part.makeThread(myNeckHeight/10, myNeckRadius*0.06, myHeight/10, myNeckRadius*0.99)
myThreading.translate(Base.Vector(0,0,myHeight))
myCompound = Part.Compound([myBody, myThreading])
return myCompound
def makeBoreHole():
# create a document if needed
if App.ActiveDocument == None:
App.newDocument("Solid")
Group = App.ActiveDocument.addObject("App::DocumentObjectGroup","Group")
Group.Label="Bore hole"
V1 = Base.Vector(0,10,0)
V2 = Base.Vector(30,10,0)
V3 = Base.Vector(30,-10,0)
V4 = Base.Vector(0,-10,0)
VC1 = Base.Vector(-10,0,0)
C1 = Part.Arc(V1,VC1,V4)
# and the second one
VC2 = Base.Vector(40,0,0)
C2 = Part.Arc(V2,VC2,V3)
L1 = Part.Line(V1,V2)
# and the second one
L2 = Part.Line(V4,V3)
S1 = Part.Shape([C1,C2,L1,L2])
W=Part.Wire(S1.Edges)
F=Part.Face(W)
P=F.extrude(Base.Vector(0,0,5))
# add objects with the shape
Wire=Group.newObject("Part::Feature","Wire")
Wire.Shape=W
Face=Group.newObject("Part::Feature","Face")
Face.Shape=F
Prism=Group.newObject("Part::Feature","Extrude")
Prism.Shape=P
c=Part.Circle(Base.Vector(0,0,-1),Base.Vector(0,0,1),2.0)
w=Part.Wire(c.toShape())
f=Part.Face(w)
p=f.extrude(Base.Vector(0,0,7))
P=P.cut(p)
# add first borer
Bore1=Group.newObject("Part::Feature","Borer_1")
Bore1.Shape=p
Hole1=Group.newObject("Part::Feature","Borer_Hole1")
Hole1.Shape=P
c=Part.Circle(Base.Vector(0,-11,2.5),Base.Vector(0,1,0),1.0)
w=Part.Wire(c.toShape())
f=Part.Face(w)
p=f.extrude(Base.Vector(0,22,0))
P=P.cut(p)
# add second borer
Bore2=Group.newObject("Part::Feature","Borer_2")
Bore2.Shape=p
Hole2=Group.newObject("Part::Feature","Borer_Hole2")
Hole2.Shape=P
App.ActiveDocument.recompute()
# hide all objets except of the final one
Gui.ActiveDocument.getObject(Wire.Name).hide()
Gui.ActiveDocument.getObject(Face.Name).hide()
Gui.ActiveDocument.getObject(Prism.Name).hide()
Gui.ActiveDocument.getObject(Bore1.Name).hide()
Gui.ActiveDocument.getObject(Hole1.Name).hide()
Gui.ActiveDocument.getObject(Bore2.Name).hide()
Gui.ActiveDocument.ActiveView.fitAll()