FreeCAD / src /Mod /Part /MakeBottle.py
AbdulElahGwaith's picture
Upload folder using huggingface_hub
985c397 verified
#! python
# SPDX-License-Identifier: LGPL-2.1-or-later
# (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, 0)
aPnt2 = Base.Vector(-myWidth / 2.0, -myThickness / 4.0, 0)
aPnt3 = Base.Vector(0, -myThickness / 2.0, 0)
aPnt4 = Base.Vector(myWidth / 2.0, -myThickness / 4.0, 0)
aPnt5 = Base.Vector(myWidth / 2.0, 0, 0)
aArcOfCircle = Part.Arc(aPnt2, aPnt3, aPnt4)
aSegment1 = Part.LineSegment(aPnt1, aPnt2)
aSegment2 = Part.LineSegment(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.0
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.0e-3)
myThreading = Part.makeThread(
myNeckHeight / 10, myNeckRadius * 0.06, myHeight / 10, myNeckRadius * 0.99
)
myThreading.translate(Base.Vector(0, 0, myHeight))
myCompound = Part.makeCompound([myBody, myThreading])
return myCompound
def makeBoreHole():
# create a document if needed
if App.ActiveDocument is 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.LineSegment(V1, V2)
# and the second one
L2 = Part.LineSegment(V4, V3)
S1 = Part.Shape([C1, C2, L1, L2])
W = Part.Wire(S1.Edges)
F = Part.makeFace(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.makeFace(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.makeFace(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 objects 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()