Assembly Workbench

From FreeCAD Documentation
This page is a translated version of the page Assembly Workbench and the translation is 7% complete.
Outdated translations are marked like this.
Icona dell'ambiente Assembly

Introduzione

disponibile dalla versione 1.0

L' Ambiente Assembly è il nuovo ambiente di lavoro integrato in FreeCAD per l'assemblaggio.

Strumenti

Assembly

  • Create Assembly: creates a root assembly in the current document, or a sub-assembly in a pre-existing active assembly.
  • Create Exploded View: creates an exploded views container in the active assembly that contains one or more exploded views.

Joints

  • Toggle Grounded: fixes the position and orientation of a shape in relation to the coordinate system of the assembly it belongs to.
  • Create a Fixed Joint: creates a joint locking two assembly parts together, preventing any movement or rotation but can be also used to define other types of joints.
  • Create Revolute Joint: creates a hinged joint, allowing rotation around a single axis between two selected parts.
  • Create Cylindrical Joint: creates a cylindrical joint between two selected parts, allowing rotation around a single axis and a movement along the same axis.
  • Create Slider Joint: creates a slider (prismatic) joint between two selected parts, allowing a linear movement along a single axis while restricting rotation.
  • Create Ball Joint: creates a spherical joint between two selected parts at a single point, allowing free rotation around the point while keeping both parts connected at this point.
  • Create Distance Joint: creates a distance joint between two selected parts, fixing the distance between both parts.
  • Create Parallel Joint: creates a parallel joint between two selected parts, setting the Z axes of selected coordinate systems parallel.
  • Create Perpendicular Joint: creates a perpendicular joint between two selected parts, setting the Z axes of selected coordinate systems perpendicular.
  • Create Angle Joint: creates an angle joint between two selected parts, fixing the angle between the Z axes of selected coordinate systems.
  • Create Rack and Pinion Joint: creates a rack and pinion joint that couples the translation of a part of a slider joint and the rotation of a part of a revolute joint.
  • Create Screw Joint: creates a screw (helical) joint that couples the translation of a part of a slider joint and the rotation of a part of a revolute joint.
  • Create Gear/Belt Joint:
  • Create Gears Joint: creates a gears joint that couples the rotation of two parts of two different revolute joints.
  • Create Belt Joint: creates a belt joint that couples the rotation of two parts of two different revolute joints.

Preferences

Example

This example is temporary and may be removed once proper descriptions/tutorials are available.

Un assieme cinematico

The assembly to be created consists of four parts: a Base, a Slider Rod, a Crank, and a Connecting Rod. They are connected with four joints.

Assembled parts: Base (amber), Slider Rod (light blue), Crank (red), Connecting Rod (green)

Prepare parts

In this example all parts and the assembly are created in one document.

The cylindrical geometries of the objects are either parallel or perpendicular, the rest of the shapes is not relevant for this example unless there are clashes. With this in mind you can model your own objects or create them with the Python code below. The code will create a new document with the four objects (simpler than in the images). Just copy-paste the following lines in the Python console:

import FreeCAD as App
import FreeCADGui as Gui
import Part

doc = App.newDocument()

box1 = Part.makeBox(140, 40, 7, App.Vector(0, -20, 0))
cyl1 = Part.makeCylinder(4, 8, App.Vector(120, 0, 7))
box2 = Part.makeBox(20, 12, 10, App.Vector(5, -6, 7))
cyl2 = Part.makeCylinder(6, 20, App.Vector(25, 0, 17), App.Vector(-1, 0, 0))
cyl3 = Part.makeCylinder(4, 20, App.Vector(25, 0, 17), App.Vector(-1, 0, 0))
shape = box1.fuse([cyl1, box2, cyl2]).removeSplitter().cut(cyl3)
base = doc.addObject("Part::Feature", "Base")
base.Shape = shape

box1 = Part.makeBox(4, 12, 12, App.Vector(-12, -6, 0))
box2 = Part.makeBox(14, 12, 4, App.Vector(-8, -6, 0))
cyl1 = Part.makeCylinder(4, 8, App.Vector(0, 0, 4))
cyl2 = Part.makeCylinder(4, 88, App.Vector(-12, 0, 6),App.Vector(-1, 0, 0))
shape = box1.fuse([box2, cyl1, cyl2]).removeSplitter()
slider_rod = doc.addObject("Part::Feature", "SliderRod")
slider_rod.Shape = shape
slider_rod.Placement.Base = App.Vector(100, -40, 0)

cyl1 = Part.makeCylinder(7.5, 4)
box1 = Part.makeBox(15, 30, 4, App.Vector(-7.5, 0, 0))
cyl2 = Part.makeCylinder(7.5, 4, App.Vector(0, 30, 0))
cyl3 = Part.makeCylinder(4, 6, App.Vector(0, 30, 4))
cyl4 = Part.makeCylinder(4, 4)
shape = cyl1.fuse([box1, cyl2]).removeSplitter().fuse(cyl3).cut(cyl4)
crank = doc.addObject("Part::Feature", "Crank")
crank.Shape = shape
crank.Placement.Base = App.Vector(125, -70, 0)

cyl1 = Part.makeCylinder(6, 4)
box1 = Part.makeBox(50, 12, 4, App.Vector(0, -6, 0))
cyl2 = Part.makeCylinder(6, 4, App.Vector(50, 0, 0))
cyl3 = Part.makeCylinder(4, 4)
cyl4 = Part.makeCylinder(4, 4, App.Vector(50, 0, 0))
shape = cyl1.fuse([box1, cyl2]).removeSplitter().cut(cyl3.fuse(cyl4))
connecting_rod = doc.addObject("Part::Feature", "ConnectingRod")
connecting_rod.Shape = shape
connecting_rod.Placement.Base = App.Vector(25, -70, 0)

mat = base.ViewObject.ShapeAppearance[0]
mat.DiffuseColor = (0.80, 0.60, 0.15, 0.0)
base.ViewObject.ShapeAppearance = (mat,)

mat = slider_rod.ViewObject.ShapeAppearance[0]
mat.DiffuseColor = (0.55, 0.70, 0.70, 0.0)
slider_rod.ViewObject.ShapeAppearance = (mat,)

mat = crank.ViewObject.ShapeAppearance[0]
mat.DiffuseColor = (0.70, 0.30, 0.20, 0.0)
crank.ViewObject.ShapeAppearance = (mat,)

mat = connecting_rod.ViewObject.ShapeAppearance[0]
mat.DiffuseColor = (0.55, 0.70, 0.0, 0.0)
connecting_rod.ViewObject.ShapeAppearance = (mat,)

doc.recompute()
view = Gui.ActiveDocument.ActiveView
view.viewIsometric()
view.fitAll()

Add an assembly

With the Create Assembly tool add an assembly to the document.

Tree view of Parts and Assembly

Move the parts into the assembly

In the Tree view drag and drop the parts on the Assembly object. They can now be handled by the Assembly's solver.

The Parts are in the Assembly container now

Ground a part

To keep the assembly at the desired position, the base part should be locked, or grounded as it is called here. Select the Base in the Tree view or in the 3D view and use the Toggle grounded tool. This fixes the position of the Base in relation to the local coordinate system (LCS) of the Assembly container. A GroundedJoint object is added to the Joints container.

Expand the Joints container to find the GroundedJoint object

Alternative: Insert Link

Instead of the two steps mentioned above it is also possible to use the Insert Link tool to place objects inside an assembly. The first object automatically becomes the grounded part. So you need to start with the Base object. The tool creates links and the original objects remain outside the assembly. To avoid confusion it is advisable to make them invisible.

Apply joints

A joint connects exactly two elements of different parts. They can optionally be selected before the desired joint tool is invoked (any number of selected elements other than two results in an empty selection). The elements define the position and orientation of a LCS represented by a filled circle on the local XY plane and three lines along the local X (red), Y (green), and Z (blue) axes.

  • A Revolute joint between Base and Crank

Selected elements + Create Revolute Joint → rearranged Crank

Move the Crank using the left mouse button. Only a rotation around the pivot should be possible.

  • A Slider joint between Base and Slider Rod

Selected elements + Create Slider Joint → rearranged Slider Rod

Move the SliderRod using the left mouse button. Only a displacement along its centerline should be possible.

  • A Revolute joint between Crank and Connecting Rod

Selected elements + Create Revolute Joint → rearranged Connecting Rod

Move the ConnectingRod using the left mouse button. Only a rotation around the pivot should be possible.

If there are several joints in a line we have to help the solver find a sensible solution.
If required, click and drag the parts into an easier to compute position.

  • A Cylindrical joint between Connecting Rod and Slider Rod

Selected elements + Create Cylindrical Joint → finished Assembly

In the finished assembly use the mouse pointer to drag the parts according to the used joints.

Note

The pin of the Slider Rod is redundantly orientated. Its centerline is parallel to the pin of the Base through the kinematic chain from Base via Crank and Connecting Rod, i.e. its local Z axis cannot rotate around any X or Y axis. The Slider joint also prevents the rotation of its Z axis around two local axes and so results in two redundantly constrained degrees of freedom. A Cylindrical joint instead of the Slider joint would only lock one rotation resulting in only a single redundantly constrained degree of freedom.

Drive the crank

To control the layout of the assembly by the angle between the Base and the Crank we have to change the Revolute joint between them to a Fixed joint. To do so double-click the Revolute object in the Tree view. In the dialog change Revolute to Fixed and change the Rotation value as desired (the movement should follow the mouse wheel action).

Note that a joint type change will change the joint's Label, but not its Name. In this case the Label is changed to "Fixed".

To animate the assembly we can change the Rotation (Offset1.Angle) of the Fixed joint with Python code. Just copy-paste the following lines in the Python console:

import math
import FreeCAD as App
import FreeCADGui as Gui

actuator = App.ActiveDocument.getObjectsByLabel("Fixed")[0]

for angle in range(0, 361, 10):
    # A full rotation of the Crank in steps of 10°
    actuator.Offset1.Rotation.Angle = math.radians(angle)
    App.ActiveDocument.recompute()
    Gui.updateGui()

The end of the range must be greater than 360 to also include this angle as a valid result.

Example universal joint

This example is temporary and may be removed once proper descriptions/tutorials are available.

Universal joint assembly

In this example a universal joint is created.

The assembly consists of three solid parts: two identical Forks and a Cross. Two additional non solid elements, Axle1 and Axle2, representing the angled axles, are also needed. The axles and the solid parts are connected with several joints.

Prepare parts

In this example all parts and the assembly are created in one document.

The Python code below will create a new document with four objects (only 1 Fork). Just copy-paste the following lines in the Python console:

import math
import FreeCAD as App
import FreeCADGui as Gui
import Part

doc = App.newDocument()

axle1 = doc.addObject("Part::Line", "Axle1")
axle1.X2 = -80
axle1.Y2 = 0
axle1.Z2 = 0

axle2 = doc.addObject("Part::Line", "Axle2")
axle2.X2 = 80
axle2.Y2 = 0
axle2.Z2 = 0
axle2.Placement.Rotation.Angle = math.radians(20)

sph1 = Part.makeSphere(50, App.Vector(0, 0, 0), App.Vector(-1, 0, 0), 0, 90, 360)
box1 = Part.makeBox(50, 40, 80, App.Vector(-50, -20, -40))
cyl1 = Part.makeCylinder(20, 80, App.Vector(0, 0, -40))
cyl2 = Part.makeCylinder(20, 80, App.Vector(0, 0, 0), App.Vector(-1, 0, 0))
cyl3 = Part.makeCylinder(30, 60, App.Vector(0, -30, 0), App.Vector(0, 1, 0))
box2 = Part.makeBox(30, 60, 60, App.Vector(0, -30, -30))
cyl4 = Part.makeCylinder(15, 80, App.Vector(0, 0, -40))
cyl5 = Part.makeCylinder(15, 80, App.Vector(0, 0, 0), App.Vector(-1, 0, 0))
shape = sph1.common(box1).fuse([cyl1, cyl2]).cut(cyl3.fuse([box2, cyl4, cyl5]))
fork = doc.addObject("Part::Feature", "Fork")
fork.Shape = shape.removeSplitter()
fork.Placement.Base = App.Vector(0, 100, 0)

cyl1 = Part.makeCylinder(15, 80, App.Vector(0, 0, -40))
cyl2 = Part.makeCylinder(15, 80, App.Vector(0, -40, 0), App.Vector(0, 1, 0))
shape = cyl1.fuse([cyl2])
cross = doc.addObject("Part::Feature", "Cross")
cross.Shape = shape.removeSplitter()
cross.Placement.Base = App.Vector(70, 100, 0)

mat = fork.ViewObject.ShapeAppearance[0]
mat.DiffuseColor = (0.80, 0.60, 0.15, 0.0)
fork.ViewObject.ShapeAppearance = (mat,)

mat = cross.ViewObject.ShapeAppearance[0]
mat.DiffuseColor = (0.55, 0.70, 0.70, 0.0)
cross.ViewObject.ShapeAppearance = (mat,)

doc.recompute()
view = Gui.ActiveDocument.ActiveView
view.viewIsometric()
view.fitAll()

Change angle of axles

The angle between the axles is set to 20 degrees. If you want to change this value select Axle2 and change the Placement.Angle property. This property must be changed before moving Axle2 into the assembly.

Warning: parts may collide if the angle is too large.

Add an assembly

With the Create Assembly tool add an assembly to the document.

Move the axles into the assembly

In the Tree view drag and drop the axles on the Assembly object.

Ground the axles

Select the two axles in the Tree view and use the Toggle grounded tool.

Move the solids into the assembly

For the other objects we will use the Insert Component tool:

  1. Invoke the tool.
  2. In the dialog that opens click the Cross object once, and the Fork object twice.
  3. Press the OK button.
  4. Make the objects outside the assembly invisible.
  5. If the objects inside the assembly overlap too much you can drag them to a new position.

Apply joints

  • A Revolute joint between Axle1 and Fork001

Selected elements + Create Revolute Joint + Offset of +40mm or -40mm → rearranged Fork001

If you invoke the tool first and then select the elements, you can click near the correct endpoint of Axle1 to avoid having to enter an offset.

  • A Cylindrical joint between Fork001 and Cross001

Selected elements + Create Cylindrical Joint → rearranged Cross001

  • A Cylindrical joint between Axle2 and Fork002

Selected elements + Create Cylindrical Joint → rearranged Fork002

If required reverse the direction of the joint using the button in the task panel.

  • A Cylindrical joint between Cross001 and Fork002

Selected elements + Create Cylindrical Joint → rearranged Cross001 and Fork002

Drive the universal joint

The universal joint can be driven by moving Fork001 with the left mouse.

If you want to check the situation at distinct rotation angles do the following:

  1. Change the Cylindrical joint between Axle1 and Fork001 to a Fixed joint.
  2. Select the Offset1.Angle property of the Fixed joint and roll the mouse wheel.
  3. The universal joint may be positioned to any angle.