|
|
|
|
|
|
|
|
|
|
| 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)
|
|
|
| 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
|
|
|
|
|
| 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():
|
|
|
| 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)
|
|
|
| VC2 = Base.Vector(40, 0, 0)
|
| C2 = Part.Arc(V2, VC2, V3)
|
| L1 = Part.LineSegment(V1, V2)
|
|
|
| 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))
|
|
|
|
|
| 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)
|
|
|
|
|
| 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)
|
|
|
|
|
| Bore2 = Group.newObject("Part::Feature", "Borer_2")
|
| Bore2.Shape = p
|
| Hole2 = Group.newObject("Part::Feature", "Borer_Hole2")
|
| Hole2.Shape = P
|
|
|
| App.ActiveDocument.recompute()
|
|
|
|
|
| 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()
|
|
|