136 lines
3.7 KiB
Python
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()
|