Scripted Parts: Ball Bearing - Part 2: Difference between revisions
No edit summary |
No edit summary |
||
Line 104: | Line 104: | ||
#Lines for basic shape of outer ring |
#Lines for basic shape of outer ring |
||
L1o=Part.makeLine((R4,0,RR),(R4,0, |
L1o=Part.makeLine((R4,0,TH-RR),(R4,0,RR)) |
||
L2o=Part.makeLine((R4-RR,0, |
L2o=Part.makeLine((R4-RR,0,0),(R3+RR,0,0)) |
||
L3o=Part.makeLine((R3,0, |
L3o=Part.makeLine((R3,0,RR),(R3,0,TH-RR)) |
||
L4o=Part.makeLine((R3+RR,0, |
L4o=Part.makeLine((R3+RR,0,TH),(R4-RR,0,TH)) |
||
#Corner rounding for basic shape of outer ring |
#Corner rounding for basic shape of outer ring |
||
A1o=Part.makeCircle(RR,Base.Vector(R4-RR,0, |
A1o=Part.makeCircle(RR,Base.Vector(R4-RR,0,RR),Base.Vector(0,1,0),0,90) |
||
A2o=Part.makeCircle(RR,Base.Vector(R3+RR,0, |
A2o=Part.makeCircle(RR,Base.Vector(R3+RR,0,RR),Base.Vector(0,1,0),90,180) |
||
A3o=Part.makeCircle(RR,Base.Vector(R3+RR,0,RR),Base.Vector(0,1,0),180,270) |
A3o=Part.makeCircle(RR,Base.Vector(R3+RR,0,TH-RR),Base.Vector(0,1,0),180,270) |
||
A4o=Part.makeCircle(RR,Base.Vector(R4-RR,0,RR),Base.Vector(0,1,0),270,360) |
A4o=Part.makeCircle(RR,Base.Vector(R4-RR,0,TH-RR),Base.Vector(0,1,0),270,360) |
||
#Connect Lines and arcs to make wire and upgrade to face |
#Connect Lines and arcs to make wire and upgrade to face, revolve and apply cut to obtain groove |
||
OR=Part.Wire([L1o,A1o,L2o,A2o,L3o,A3o,L4o,A4o]) |
OR=Part.Wire([L1o,A1o,L2o,A2o,L3o,A3o,L4o,A4o]) |
||
OR=Part.Face( |
OR=Part.Face(OR) |
||
OR=OR.revolve(Base.Vector(0,0,1),Base.Vector( |
OR=OR.revolve(Base.Vector(0,0,1),Base.Vector(0,0,360)) |
||
C1=Part.makeCircle(RBall,Base.Vector(R2+(R3-R2)/2,0,TH/2),Base.Vector(0,1,0),0,360) |
|||
GRo=Part.Wire([C1]) |
|||
GRo=Part.Face(GRo) |
|||
GRo=GRo.revolve(Base.Vector(0,0,1),Base.Vector(0,0,360)) |
|||
OR=OR.cut(GRo) |
|||
Part.show(OR) |
|||
#Lines for basic shape of inner ring |
|||
#Todo |
|||
L1i=Part.makeLine((R2,0,TH-RR),(R2,0,RR)) |
|||
L2i=Part.makeLine((R2-RR,0,0),(R1+RR,0,0)) |
|||
L3i=Part.makeLine((R1,0,RR),(R1,0,TH-RR)) |
|||
L4i=Part.makeLine((R1+RR,0,TH),(R2-RR,0,TH)) |
|||
#Corner rounding for basic shape of inner ring |
|||
A1i=Part.makeCircle(RR,Base.Vector(R2-RR,0,RR),Base.Vector(0,1,0),0,90) |
|||
A2i=Part.makeCircle(RR,Base.Vector(R1+RR,0,RR),Base.Vector(0,1,0),90,180) |
|||
A3i=Part.makeCircle(RR,Base.Vector(R1+RR,0,TH-RR),Base.Vector(0,1,0),180,270) |
|||
A4i=Part.makeCircle(RR,Base.Vector(R2-RR,0,TH-RR),Base.Vector(0,1,0),270,360) |
|||
#Connect Lines and arcs to make wire and upgrade to face, revolve and apply cut to obtain groove |
|||
IR=Part.Wire([L1i,A1i,L2i,A2i,L3i,A3i,L4i,A4i]) |
|||
IR=Part.Face(IR) |
|||
IR=IR.revolve(Base.Vector(0,0,1),Base.Vector(0,0,360)) |
|||
C2=Part.makeCircle(RBall,Base.Vector(R2+(R3-R2)/2,0,TH/2),Base.Vector(0,1,0),0,360) |
|||
GRi=Part.Wire([C2]) |
|||
GRi=Part.Face(GRi) |
|||
GRi=GRi.revolve(Base.Vector(0,0,1),Base.Vector(0,0,360)) |
|||
IR=IR.cut(GRi) |
|||
Part.show(IR) |
|||
#Balls# |
|||
for i in range(NBall): |
|||
Ball=Part.makeSphere(RBall) |
|||
Alpha=(i*2*math.pi)/NBall |
|||
BV=(CBall*math.cos(Alpha),CBall*math.sin(Alpha),TH/2) |
|||
Ball.translate(BV) |
|||
Part.show(Ball) |
|||
#Make it pretty# |
#Make it pretty# |
Revision as of 19:48, 17 August 2016
Tutorial |
Topic |
---|
Part Scripting - Ball Bearing #2 |
Level |
Beginner |
Time to complete |
30 min |
Authors |
r-frank |
FreeCAD version |
0.16.6706 |
Example files |
See also |
None |
Introduction
This tutorial is meant as a beginner's introduction to creating parts with python scripts within FreeCAD.
This tutorial will cover how to build a ball bearing with a workflow that consists of creating sketches and revolving them.
The code will produce a new FreeCAD document with 12 shapes (Inner Ring, Outer Ring and 10 balls/spheres).
It will look like this:
Workflow
The workflow is more or less identical how you would create the part in part design workbench.
Just some small differences.
- Create a new empty document and make it the active document
- Draw the basic shape of the outer ring consisting of four straight lines and four arcs
- Connect the lines and arcs and upgrade them to one single wire
- Upgrade the wire to a face
- Revolve the face to get a shape
- Draw a circle
- Upgrade circle to wire
- Upgrade wire to face
- Revolve face and apply boolean cut to obtain groove in outer ring
- Draw the basic shape of the inner ring consisting of four straight lines and four arcs
- Connect the lines and arcs and upgrade them to one single wire
- Upgrade the wire to a face
- Revolve the face to get a shape
- Draw a circle
- Upgrade circle to wire
- Upgrade wire to face
- Revolve face and apply boolean cut to obtain groove in inner ring
- Insert balls with same workflow as in part 1 (because of effectiveness)
- Set view to axometric
- Zoom to fit all
Making the groove
Bla and blub ...
Inserting the balls
Notes
Bla and blub ...
Links
Scripted objects: The wiki page explaing the basics of scripting
Topological data scripting: A tutorial for covering basics of scripting
Scripted Parts: Ball Bearing - Part 1: Doing it with part primitives
Bearings from scripted sketches: Base for this tutorial, thanks to JMG ...
Code
## Ball-bearing script
## 11.08.2016 by r-frank (BPLRFE/LearnFreeCAD on Youtube)
## based on ball bearing script by JMG
## (http://linuxforanengineer.blogspot.de/2013/12/bearings-from-scripted-sketches.html)
#needed for doing boolean operations
import Part
#needed for calculating the positions of the balls
import math
#needed for translation and rotation of objects
from FreeCAD import Base
#VALUES#
#(radius of shaft/inner radius of inner ring)
R1=15.0
#(outer radius of inner ring)
R2=25.0
#(inner radius of outer ring)
R3=30.0
#(outer radius of outer ring)
R4=40.0
#(thickness of bearing)
TH=15.0
#(number of balls)
NBall=10
#(radius of ball)
RBall=5.0
#(rounding radius for fillets)
RR=1
#first coordinate of center of ball
CBall=((R3-R2)/2)+R2
#second coordinate of center of ball
PBall=TH/2
#Create new document
App.newDocument("Unnamed")
App.setActiveDocument("Unnamed")
App.ActiveDocument=App.getDocument("Unnamed")
Gui.ActiveDocument=Gui.getDocument("Unnamed")
#Lines for basic shape of outer ring
L1o=Part.makeLine((R4,0,TH-RR),(R4,0,RR))
L2o=Part.makeLine((R4-RR,0,0),(R3+RR,0,0))
L3o=Part.makeLine((R3,0,RR),(R3,0,TH-RR))
L4o=Part.makeLine((R3+RR,0,TH),(R4-RR,0,TH))
#Corner rounding for basic shape of outer ring
A1o=Part.makeCircle(RR,Base.Vector(R4-RR,0,RR),Base.Vector(0,1,0),0,90)
A2o=Part.makeCircle(RR,Base.Vector(R3+RR,0,RR),Base.Vector(0,1,0),90,180)
A3o=Part.makeCircle(RR,Base.Vector(R3+RR,0,TH-RR),Base.Vector(0,1,0),180,270)
A4o=Part.makeCircle(RR,Base.Vector(R4-RR,0,TH-RR),Base.Vector(0,1,0),270,360)
#Connect Lines and arcs to make wire and upgrade to face, revolve and apply cut to obtain groove
OR=Part.Wire([L1o,A1o,L2o,A2o,L3o,A3o,L4o,A4o])
OR=Part.Face(OR)
OR=OR.revolve(Base.Vector(0,0,1),Base.Vector(0,0,360))
C1=Part.makeCircle(RBall,Base.Vector(R2+(R3-R2)/2,0,TH/2),Base.Vector(0,1,0),0,360)
GRo=Part.Wire([C1])
GRo=Part.Face(GRo)
GRo=GRo.revolve(Base.Vector(0,0,1),Base.Vector(0,0,360))
OR=OR.cut(GRo)
Part.show(OR)
#Lines for basic shape of inner ring
L1i=Part.makeLine((R2,0,TH-RR),(R2,0,RR))
L2i=Part.makeLine((R2-RR,0,0),(R1+RR,0,0))
L3i=Part.makeLine((R1,0,RR),(R1,0,TH-RR))
L4i=Part.makeLine((R1+RR,0,TH),(R2-RR,0,TH))
#Corner rounding for basic shape of inner ring
A1i=Part.makeCircle(RR,Base.Vector(R2-RR,0,RR),Base.Vector(0,1,0),0,90)
A2i=Part.makeCircle(RR,Base.Vector(R1+RR,0,RR),Base.Vector(0,1,0),90,180)
A3i=Part.makeCircle(RR,Base.Vector(R1+RR,0,TH-RR),Base.Vector(0,1,0),180,270)
A4i=Part.makeCircle(RR,Base.Vector(R2-RR,0,TH-RR),Base.Vector(0,1,0),270,360)
#Connect Lines and arcs to make wire and upgrade to face, revolve and apply cut to obtain groove
IR=Part.Wire([L1i,A1i,L2i,A2i,L3i,A3i,L4i,A4i])
IR=Part.Face(IR)
IR=IR.revolve(Base.Vector(0,0,1),Base.Vector(0,0,360))
C2=Part.makeCircle(RBall,Base.Vector(R2+(R3-R2)/2,0,TH/2),Base.Vector(0,1,0),0,360)
GRi=Part.Wire([C2])
GRi=Part.Face(GRi)
GRi=GRi.revolve(Base.Vector(0,0,1),Base.Vector(0,0,360))
IR=IR.cut(GRi)
Part.show(IR)
#Balls#
for i in range(NBall):
Ball=Part.makeSphere(RBall)
Alpha=(i*2*math.pi)/NBall
BV=(CBall*math.cos(Alpha),CBall*math.sin(Alpha),TH/2)
Ball.translate(BV)
Part.show(Ball)
#Make it pretty#
App.activeDocument().recompute()
Gui.activeDocument().activeView().viewAxometric()
Gui.SendMsgToActiveView("ViewFit")