OSE 3D Printer Workbench Documentation¶

A FreeCAD workbench for designing 3D printers by Open Source Ecology for Distributive Enterprise.
For more information on codebase conventions and patterns, see the OSE Workbench Platform.
Add Frame¶
The Add Frame tool adds a Frame to the active document.
You can use this to begin designing a D3D Pro printer of any size or axis configuration.
Custom Properties¶
Name |
Type |
Default Value |
Description |
---|---|---|---|
Has Corners | Bool |
False |
Whether the frame has 3d printed corners or not. |
Size | Length |
304.8 mm |
Size or dimension of cubic frame. |
Thickness | Length |
3.175 mm |
Thickness of frame. |
Width | Length |
38.1 mm |
Width of frame. |
Add Axis¶
There a three tools in the main toolbar to add a Axis, or Universal Axis object in different orientations to the active document:
Custom Properties¶
Name |
Type |
Default Value |
Description |
---|---|---|---|
Carriage Position | Percent |
50 |
Position of carriage relative to available rod. |
Length | Length |
304.8 mm |
Length of axis corresponds to rod length. |
Orientation | String |
x |
Orientation of axis: X, Y, or Z. |
Rod Diameter | Length |
8 mm |
Diameter of rod. |
Side | String |
top |
Which side the bottom of the axis faces. |
Attaching Axes to the Frame¶
You may attach axes to the frame by selecting one of it’s outer faces, and then clicking a button in the main toolbar to add a axis.

Only certain axes can be attached to certain faces or sides of the frame based on it’s orientation.
Axis Orientation |
Attachable Side(s) |
---|---|
X |
Top |
Y |
Left, Right |
Z |
Front, Rear |
Note: You cannot attach an axis to the Bottom face or side of the frame.
The axis-frame attachment logic assumes the frame is not rotated, and determines whether the user is attaching the axis to the appropriate side of the frame based on whether the selected face is parallel to the XY, YZ, or XZ plane.
Tip
See the Report View for attachment troubleshooting.
Add Heated Bed¶
The Add Heated Bed tool adds a heated bed to the active document.
Custom Properties¶
Name |
Type |
Default Value |
Description |
---|---|---|---|
Size | Length |
203.2 mm |
Size or dimension of heated bed. |
Centering Heated Bed to Frame & Elevating to Z Axes¶
Hold-down
Ctrl
key for selecting multiple objectsSelect one Z axis
Select the Frame
Click the Add Heated Bed button on the main toolbar

See Also¶
Generate Cut List¶
There are two options in the main menu to generate a cut list:
Both options generate a cut list with the following:
Rods for axes, heated bed, and spool holder
Angled bars to construct a frame with 3d printable corners
How it Works¶
Each option queries the active document for Axis objects and the Frame object in order to determine the rods and angled bars for the cut list.
Determining Rod Quantity¶
2 X Axis Rods are added for every X Axis object
2 Y Axis Rods are added or every Y Axis object
2 Z Axis Rods are added for every Z Axis object
3 Spool Holder Rods are added based on the existence of a Frame object
2 Heated Bed Rods are added for every pair of Z Axis objects
Determining Rod Length¶
X Axis Rod Length is adjusted by adding 4 inches
Y Axis Rod Length corresponds with
Length
of the axis in the documentZ Axis Rod Length is adjusted by subtracting 1 inch
Length of Heated Bed Rods and 1 Spool Holder Rod are equal to the length of the Frame
Length of 2 Spool Holder Rods are equal to the length of the Frame minus 1 inch (similar to Z axis rods)
Determining Angled Bar Quantity¶
12 Angled Bars are added based on the existence of a Frame object
Determining Angled Bar Length¶
Angled bar length is calculated from the following formula:
Frame.Size - ((Frame.Width + (Frame.Thickness * 2)) * 2)
For example, a 12 in frame with a 1.5 in Width
and 0.125 in Thickness
could have 8.5 in angled bars.
12 in - ((1.5 in + (0.125 in * 2)) * 2) = 8.5 in

Make Angle Frame Connector¶
The Make Angle Frame Connector tool makes a 3D-printable Angle Frame Connector with the specified parameters entered from the Task Panel.

Parameters¶
- Slot Width
Width of three inner slots.
- Slot Thickness
Thickness of three inner slots.
- Orientation
One of eight possible corners of the frame.
- Add Set Screw
Whether to add a set screw mechanism.
Useful for larger frames when worried about slips or frame mis-alignment.
Attention
Assumes M6 set-screw and nut.
- Add Filleting
Whether to round edges of three inner slots.
Tip
Makes inserting angled bars later a little easier.
See Also¶
Including Move and Rotate Tools¶
This document covers how to include the Move and Rotate functions of the Draft Workbench.
Load the Draft Workbench by selecting it from the workbench dropdown.

Select Tools, and then Customize from the Main menu.

Next, select the Toolbars tab.

Select OSE 3D Printer from the dropdown in the right pane.
Click the New… button.
Name the toolbar Move + Rotate, and click OK.

Select the Draft workbench from the dropdown in the left pane.
Find the Move and Rotate tools and use the Move right button, or right arrow to add them to the Move + Rotate toolbar.

You should now have the Move and Rotate tools alongside the OSE 3D Printer tools.

See Also
Customize Toolbars on the FreeCAD Wiki.
ose3dprinter¶
The ose3dprinter
package is:
Independent of the
freecad.ose3dprinter
packageMust not know about the FreeCAD GUI (i.e.
FreeCADGui
orGui
)Executable from a command-line context
ose3dprinter.attachment¶
Attachment functions to make 3D Printer parts appear attached to each other.
ose3dprinter.attachment.get_axis_frame_attachment_kwargs¶
ose3dprinter.attachment.get_extruder_axis_attachment_kwargs¶
ose3dprinter.model¶
Models for 3D Printer parts.
ose3dprinter.model.axis¶
axis_model¶
-
class
AxisModel
(obj, length=304.8, carriage_position=50, orientation='x', side='top', placement=Placement [Pos=(0,0,0), Yaw-Pitch-Roll=(0,0,0)], origin_translation_offset=Vector (0.0, 0.0, 0.0))¶ Bases:
osecore.app.model.Model
Encapsulates the data (i.e. topography and shape) for a Axis, and is separate from the “view” or GUI representation.
-
Type
= 'OSEAxis'¶
-
calculate_carriage_box_x
()¶
-
calculate_top_of_carriage_box_for_z_axis
()¶
-
execute
(obj)¶ Called on document recompute
-
is_x
()¶ Return whether or not this axis is a X axis.
This assumes the axis is parallel to the XY, YZ, or XZ planes, and not rotated in a weird diagonal or skewed way.
- Returns
Whether this axis is a X axis.
- Return type
bool
-
is_y
()¶ Return whether or not this axis is a Y axis.
This assumes the axis is parallel to the XY, YZ, or XZ planes, and not rotated in a weird diagonal or skewed way.
- Returns
Whether this axis is a Y axis.
- Return type
bool
-
is_z
()¶ Return whether or not this axis is a Z axis.
This assumes the axis is parallel to the XY, YZ, or XZ planes, and not rotated in a weird diagonal or skewed way.
- Returns
Whether this axis is a Z axis.
- Return type
bool
-
ose3dprinter.model.extruder¶
extruder_model¶
-
class
ExtruderModel
(obj, placement=Placement [Pos=(0,0,0), Yaw-Pitch-Roll=(0,0,0)], origin_translation_offset=Vector (0.0, 0.0, 0.0))¶ Bases:
osecore.app.model.Model
Encapsulates the data (i.e. topography and shape) for a Extruder, and is separate from the “view” or GUI representation.
- Based on:
https://wiki.opensourceecology.org/wiki/File:Simpleextruderassy.fcstd
- See:
https://wiki.opensourceecology.org/wiki/File:Finalextruder.png
-
Type
= 'OSEExtruder'¶
-
execute
(obj)¶ Called on document recompute
ose3dprinter.model.frame¶
ose3dprinter.model.frame.get_face_side¶
face_side_strategy_factory¶
x_axis_face_side_strategy¶
-
class
XAxisFaceSideStrategy
¶ Bases:
ose3dprinter.model.frame.get_face_side.face_side_strategy.FaceSideStrategy
y_axis_face_side_strategy¶
-
class
YAxisFaceSideStrategy
¶ Bases:
ose3dprinter.model.frame.get_face_side.face_side_strategy.FaceSideStrategy
z_axis_face_side_strategy¶
-
class
ZAxisFaceSideStrategy
¶ Bases:
ose3dprinter.model.frame.get_face_side.face_side_strategy.FaceSideStrategy
ose3dprinter.model.frame.get_faces_for_side¶
get_faces_for_side¶
-
get_faces_for_side
(frame, side)¶ Gets a dictionary of outer faces of the frame by their Side.
- Parameters
frame (Document Object) – Frame object
- Returns
Dictionary where the keys are a Side, and value is a Face
- Return type
dict
get_faces_for_side_of_frame_with_corners¶
-
get_axis_orientation
(side)¶
-
get_faces_for_side_of_frame_with_corners
(frame_with_corners, side)¶ TODO: Doesn’t include faces of angle frame connector tabs
- Parameters
frame_with_corners (Document object) – Frame object with HasCorners property = True
side (See Side enum.) – Side of frame.
- Returns
List of faces within bound of side for a frame with corners.
- Return type
List[Part.Faces]
frame_model¶
-
class
FrameModel
(obj, size=304.8, width=38.1, thickness=3.175, has_corners=False, placement=Placement [Pos=(0,0,0), Yaw-Pitch-Roll=(0,0,0)], origin_translation_offset=Vector (0.0, 0.0, 0.0))¶ Bases:
osecore.app.model.Model
Encapsulates the data (i.e. topography and shape) for a Frame, and is separate from the “view” or GUI representation.
See D3D Frame on the Open Source Ecology Wiki: https://wiki.opensourceecology.org/wiki/D3D_Frame
-
Type
= 'OSEFrame'¶
-
property
XMax
¶
-
property
XMin
¶
-
property
YMax
¶
-
property
YMin
¶
-
property
ZMax
¶
-
property
ZMin
¶
-
property
distance_between_axis_side_mount_holes
¶
-
execute
(obj)¶ Called on document recompute
-
get_face_side
(face, axis_orientation)¶
-
get_faces_for_side
(side)¶
-
get_outer_faces
()¶
-
ose3dprinter.model.heated_bed¶
heated_bed_model¶
-
class
HeatedBedModel
(obj, placement=Placement [Pos=(0,0,0), Yaw-Pitch-Roll=(0,0,0)], origin_translation_offset=Vector (0.0, 0.0, 0.0))¶ Bases:
osecore.app.model.Model
Encapsulates the data (i.e. topography and shape) for a Heated Bed, and is separate from the “view” or GUI representation.
-
Type
= 'OSEHeatedBed'¶
-
execute
(obj)¶ Called on document recompute
-
ose3dprinter.part¶
Parts for 3D Printer.
ose3dprinter.part.axis¶
axis¶
-
class
Axis
¶ Bases:
object
-
classmethod
calculate_carriage_box_x
(rod_length, carriage_position)¶
-
carriage_box_width
= 52¶
-
classmethod
cut_holes_in_motor_side_box
(motor_side_box, box_height, motor_box_length)¶
-
distance_between_hole_and_inner_motor_side
= 12.59¶
-
distance_between_holes
= 22.44¶
-
classmethod
distance_between_idler_side_holes_and_outer_edge
()¶
-
classmethod
distance_between_inner_motor_side_holes_and_outer_edge
()¶
-
hole_radius
= 3.39¶
-
idler_box_length
= 66¶
-
idler_box_width
= 26¶
-
classmethod
make
(rod_length: float, rod_radius: float, carriage_position: int, orientation: str, side: str, initial_placement: Base.Placement, origin_translation_offset: Base.Vector) → Part.Compound¶
-
motor_box_width
= 59.5¶
-
x_distance_between_holes
= 23.36¶
-
classmethod
-
get_placement
(orientation, side, box_height, length, motor_box_length)¶
ose3dprinter.part.extruder¶
cooling_and_sensor_mount¶
-
class
CoolingAndSensorMount
¶ Bases:
object
Cooling and Sensor mount for extruder, and sensor itself.
- Based on:
https://wiki.opensourceecology.org/wiki/File:ExtruderActiveCoolingAndSensor.FCStd
- See:
- Sensor:
https://wiki.opensourceecology.org/images/thumb/9/9e/8mmsensor.jpg/120px-8mmsensor.jpg
-
classmethod
make
(slanted_side_width, main_part_length, main_part_bottom_base_overhang_width)¶
-
vent_box_width
= 5¶
-
make_cooling_and_sensor_slanted_side
(thickness, length)¶ 20
| | 55 | | 19——-| 787
-
make_sensor_and_sensor_holder
(sensor_holder_box_width, sensor_holder_box_height)¶ /——- | O | ——-
main_extruder_part¶
-
class
MainExtruderPart
¶ Bases:
object
Main extruder part
- Based on:
https://wiki.opensourceecology.org/wiki/File:Mainextruderpart.fcstd
- See:
https://wiki.opensourceecology.org/wiki/File:Mainextruderpart.png
-
base_height
= 7¶
-
classmethod
make
(width, length, bottom_base_overhang_width)¶
-
make_slanted_side
(width_or_thickness, height)¶ 25.25
51.10
ose3dprinter.part.frame¶
angle_frame_connector¶
-
class
AngleFrameConnector
¶ Bases:
object
Encapsulates the data (i.e. topography and shape) for an Angle Frame Connector, and is separate from the “view” or GUI representation.
An angle frame connector is made up of three brackets.
-
axis_side_mount_length
= 27.75¶
-
axis_side_mount_width
= 5¶
-
classmethod
calculate_bracket_length
(width, thickness)¶
-
classmethod
calculate_bracket_width
(thickness)¶
-
classmethod
calculate_y_axis_overhang_distance
()¶
-
classmethod
distance_between_axis_side_mount_holes_and_frame
()¶
-
classmethod
make
(width, thickness, corner='bottom_left_front', with_set_screw=False, with_filleting=False)¶ Make an angle frame connector.
- Parameters
width (float) – Width of the angled frame.
thickness (float) – Thickness of the angled frame.
corner (str, optional) – Which corner to orient the angle frame connector to. Defaults to bottom left front corner.
with_set_screw (bool) – Whether to include set screw mechanism.
with_filleting (bool) – Whether to include filleting.
- Returns
an angle frame connector
- Return type
Part.Shape
-
-
cut_screw_screw
(bracket, width, height, thickness, set_screw_block_width)¶
-
cut_set_screw_hole
(bracket, height, thickness, cylinder)¶
-
fillet_bracket
(bracket, height)¶
-
find_top_wires_parallel_to_xy_plane
(bracket, height)¶
-
fuse_nut_ramps_to_bracket
(bracket, thickness, set_screw_cutout_length, set_screw_cutout_width, ramp_height)¶ Fuse nut ramps to bracket so nut doesn’t spin when tightening screw.
| |__- Parameters
bracket (Part.Shape) – Bracket
set_screw_cutout_length (float) – Length of set screw cutout
set_screw_cutout_width (float) – Width of set screw cutout
-
get_angle_frame_connector_placement
(corner, length)¶
-
get_inner_points
(width, thickness)¶
-
get_is_top_shape
(height)¶
-
get_outer_points
(width, thickness, set_screw_block_width, with_set_screw)¶
-
get_placement_by_corner
(length)¶
-
is_wire_parallel_to_xy_plane
(wire)¶
-
make_angle_connector_corner
(bracket_length, bracket_width)¶
-
make_cylinder
(radius, height)¶
-
make_set_screw_cutout
(length, nut_height, height)¶ Make set screw cutout in the shape of a pentagon, or home plate in baseball.
-
make_tri_bracket
(width, height, thickness, with_set_screw=False, with_filleting=False)¶ Make tri-bracket.
Three tri-brackets make up the angle frame connector.
- Parameters
width (float) – Width of bracket.
height (float) – Height of bracket.
thickness (float) – Thickness of bracket
with_set_screw (bool) – Whether to include set screw mechanism.
with_filleting (bool) – Whether to include filleting.
angled_bar¶
-
class
AngledBar
¶ Bases:
object
-
static
make
(length, width, thickness, orientation='bottom_front_flat')¶ Make an angled bar with bottom-left-most corner in the origin (0, 0, 0)
- Parameters
length (float) – Length of angled bar.
width (float) – Width of angled bar. after an inner sheet is cut out of the center.
thickness (float) – Thickness of angled bar.
orientation (str) – Orientation of angled bar. Must be one of AngledBarOrientation. Defaults to AngledBarOrientation.BOTTOM_FRONT_FLAT.
- Returns
An angled bar.
- Return type
Part.Shape
-
static
-
fuse_parts
(*parts)¶
-
get_angled_bar_placement
(orientation, length, width)¶
-
get_placement_by_orientation
(length, width)¶
angled_bar_frame¶
-
class
AngledBarFrame
¶ Bases:
object
Frame made from 12 angled bars connected by angle frame connectors.
-
static
make
(side, width, thickness)¶ Make a frame from from 12 angled bars connected by angle frame connectors. No welding or epoxy required, and the frame can be disassembled.
- Parameters
side (float) – Side or dimension of frame from one corner to the opposite corner.
width (float) – Width of angled bar.
thickness (float) – Thickness of each angled bar.
- Returns
A frame made up of angled bars, connected by angle frame connectors.
- Return type
Part.Shape
-
static
-
make_bottom_or_top_of_angled_frame
(bar_length, width, thickness, bar_orientations, corners, bracket_length, rear_translation, rear_bar_translation)¶
angled_bar_orientation¶
-
class
AngledBarOrientation
¶ Bases:
object
Represents the orientation for one edge of an angled bar frame.
-
BOTTOM_FRONT_FLAT
= 'bottom_front_flat'¶
-
BOTTOM_LEFT_FLAT
= 'bottom_left_flat'¶
-
BOTTOM_REAR_FLAT
= 'bottom_rear_flat'¶
-
BOTTOM_RIGHT_FLAT
= 'bottom_right_flat'¶
-
FRONT_LEFT_UPRIGHT
= 'front_left_upright'¶
-
FRONT_RIGHT_UPRIGHT
= 'front_right_upright'¶
-
REAR_LEFT_UPRIGHT
= 'rear_left_upright'¶
-
REAR_RIGHT_UPRIGHT
= 'rear_right_upright'¶
-
TOP_FRONT_FLAT
= 'top_front_flat'¶
-
TOP_LEFT_FLAT
= 'top_left_flat'¶
-
TOP_REAR_FLAT
= 'top_rear_flat'¶
-
TOP_RIGHT_FLAT
= 'top_right_flat'¶
-
axis_side_mount¶
-
class
AxisSideMount
¶ Bases:
object
TODO: Rename to TopAngleFrameConnectorTab?
-
attachment_overlap
= 10.22¶
-
classmethod
calculate_distance_between_holes_and_connector
(length)¶
-
classmethod
calculate_overhang_distance
(length)¶
-
distance_between_hole_and_outer_edge
= 9.38554¶
-
height
= 65.2¶
-
hole_radius
= 3.39¶
-
classmethod
make
(width, length, top_corner)¶ Returns which side of the angle frame connector to add the axis mount to.
- Parameters
width (float) – Width of axis side mount.
top_corner (str) – A top corner: top left front, top right front, top left rear, or top right rear.
- Returns
Axis side mount
- Return type
Part.Shape
-
classmethod
make_trapezoid_tab
(width, length, attachment_overlap)¶ / / / |_________________|
-
-
get_placement
(top_corner, height, attachment_overlap)¶
-
get_placement_by_top_corner
(height, attachment_overlap)¶
cnc_cut_frame¶
-
class
CNCCutFrame
¶ Bases:
object
-
static
make
(side, width, sheet_thickness)¶ Make a frame from flat sheets cut by a CNC machine, then welded or epoxied together.
This approach works best with welding.
- Parameters
side (float) – Dimension of one side of a cubic sheet.
width (float) – Width of outer sheet, after an inner sheet is cut out of the center.
sheet_thickness (float) – Thickness of each sheet.
- Returns
A frame “welded” together from eight CNC cut sheets.
- Return type
Part.Shape
-
static
-
make_sheet
(side, width, thickness)¶ Make one side of the frame or “sheet”.
A sheet is a cubic plane of metal with dimensions specified by side, thickness specified by thickness, and inner sheet cut out of the center, leaving the outer width with a dimension specified by width.
- Parameters
side (float) – Dimension of one side of the cubic sheet.
width (float) – Width of outer sheet, after an inner sheet is cut out of the center.
thickness (float) – Thickness of the sheet.
- Returns
A sheet, or one side of a frame.
- Return type
Part.Shape
corner¶
-
class
Corner
¶ Bases:
object
Represents corners of a cube. TODO: Rename to CubeCorner?
-
BOTTOM_LEFT_FRONT
= 'bottom_left_front'¶
-
BOTTOM_LEFT_REAR
= 'bottom_left_rear'¶
-
BOTTOM_RIGHT_FRONT
= 'bottom_right_front'¶
-
BOTTOM_RIGHT_REAR
= 'bottom_right_rear'¶
-
TOP_LEFT_FRONT
= 'top_left_front'¶
-
TOP_LEFT_REAR
= 'top_left_rear'¶
-
TOP_RIGHT_FRONT
= 'top_right_front'¶
-
TOP_RIGHT_REAR
= 'top_right_rear'¶
-
-
is_top_corner
(corner)¶ Returns whether a corner is a top corner.
- Parameters
corner (str) – A corner.
- Returns
Whether the corner is a top corner or not.
- Return type
bool