FreeCAD’s PartDesign workbench is the closest equivalent to SolidWorks’ Part environment. It uses a feature-based, parametric modeling approach built on OpenCASCADE Technology (OCCT) — the same geometry kernel that powers CATIA and Salome. If you’re coming from SolidWorks, Inventor, or any history-based modeler, you’ll recognize the concepts but encounter a few structural differences that aren’t obvious from the UI.

This guide covers what actually matters for getting productive: the Body container model, how the Sketcher’s constraint system differs from what you’re used to, the core PartDesign features and their underlying OCCT operations, the topological naming problem that plagued earlier versions (and the fix in FreeCAD 1.0), and how to export finished geometry to STEP, DXF, and STL using FreeCAD’s import/export pipeline.

Part Workbench vs PartDesign — Why Two Workbenches

FreeCAD has two workbenches for 3D solid modeling: Part and PartDesign. Understanding the distinction prevents confusion that trips up most newcomers.

Part workbench provides primitive shapes and direct OCCT operations: Box, Cylinder, Sphere, and boolean operations (Cut, Fuse, Common). It works directly on TopoDS_Shape objects without any feature history. There’s no sketch-based workflow, no feature tree in the conventional sense. It’s equivalent to CATIA’s Generative Shape Design if you’re doing surface work, or a very low-level CSG modeler. Useful for quick geometric operations, not for parametric design that will be edited later.

PartDesign workbench is the parametric modeler. It works inside a Body container, uses Sketcher-based profiles, and builds a sequential feature tree where each feature transforms the previous result. Pad, Pocket, Revolution, Fillet, and Chamfer operations are all PartDesign features. This is where you do production modeling.

The practical rule: use PartDesign for any work that needs to be edited or driven by parameters. Use Part for one-off geometry manipulation or when importing geometry from external sources.

The Body Container — What SolidWorks Users Miss

Before creating any geometry in PartDesign, you need a Body. This is the most common point of confusion for engineers coming from SolidWorks, where a part file implicitly has one body and you start sketching directly.

In FreeCAD, Body is an explicit container object. From the source (Mod/PartDesign/App/Body.cpp):

ADD_PROPERTY_TYPE(AllowCompound, (true), "Base", App::Prop_None, "Allow multiple solids in Body");

AllowCompound = true by default in FreeCAD 1.0+. This lets a Body contain multiple non-fused solids, which is useful for weldment-style assemblies built as a single part. In contrast, SolidWorks enforces a single closed solid per configuration and raises errors if a feature produces multiple bodies unintentionally.

Creating a Body: In a new FreeCAD document, switch to PartDesign workbench, then select Part Design > Body. The Body appears in the Model tree. All subsequent features must be inside this Body — if you try to create a sketch without an active Body, PartDesign prompts you to create one.

If you have multiple Bodies in a document, only one is active at a time. Click on a Body in the Model tree to make it active before adding features. Features created in the wrong Body create exactly the kind of confusing dangling-reference problems you’d expect.

The Sketcher — Constraint System and Attachment

FreeCAD’s Sketcher is a fully constrained 2D constraint solver, similar to SolidWorks’ Sketch environment but with some structural differences.

Sketch attachment: When you create a sketch in PartDesign, it’s attached to a face, plane, or datum. The attachment mode is set via the Attachment property in the property panel. Common modes:

  • FlatFace: sketch on a planar face (used by Pad and Pocket)
  • ConcaveEdge, TangentPlane: for advanced attachments to curved geometry

In SolidWorks, sketch planes are implicitly defined when you pick a face and hit “Sketch.” In FreeCAD, the attachment is an explicit property you can change after the fact — useful but also easy to accidentally break.

Constraint types: FreeCAD Sketcher uses the same geometric constraint vocabulary as SolidWorks: Coincident, Horizontal, Vertical, Tangent, Perpendicular, Parallel, Equal, Symmetric, Fixed (block). Dimensional constraints: Lock (fixed position), Horizontal/Vertical distance, Radius, Diameter, Angle, Distance.

One difference: FreeCAD’s Sketcher shows a constraint count — the solver reports how many degrees of freedom remain. A fully constrained sketch shows 0 DOF. An under-constrained sketch shows the count of remaining DOF in green (FreeCAD 1.0+ added colors). When the sketch is over-constrained, the redundant constraints turn red. SolidWorks shows a similar status but less prominently.

External geometry: FreeCAD’s equivalent of SolidWorks’ “Convert Entities” is Sketcher > Sketcher geometries > External geometry. This projects edges of existing geometry onto the sketch plane as reference entities (shown in purple by default). These references update when the source geometry changes. Unlike SolidWorks, external geometry in FreeCAD is read-only inside the sketch — you cannot drag or constrain it, only use it as a reference for dimensioning.

Core PartDesign Features

Pad (Extrude)

Pad is the PartDesign extrude operation. It takes a closed sketch profile and extrudes it perpendicular to the sketch plane to add material.

From the FreeCAD source (Mod/PartDesign/App/FeatureExtrude.cpp):

#include <BRepFeat_MakePrism.hxx>
#include <BRepPrimAPI_MakePrism.hxx>

FreeCAD uses BRepFeat_MakePrism (from OpenCASCADE) rather than the simpler BRepPrimAPI_MakePrism. The distinction matters: BRepFeat_MakePrism is topology-aware and propagates through the Body’s current solid using Boolean fusion at each step, tracking the parent solid’s faces for topological naming purposes. BRepPrimAPI_MakePrism just extrudes a profile into space without tracking any parent topology.

This internal choice is why PartDesign features are topology-linked — the Pad knows which faces of the parent solid it fused into. The topological naming problem (below) is a consequence of this linkage.

Pad options:

  • Type: Dimension (fixed distance), To Last (extends to last face it hits), To First (first face), To Face (up-to a selected face), Two Dimensions (different distances each direction), Symmetric to Plane
  • Taper Angle: Draft applied to the extrusion walls (positive = inward taper)
  • Midplane: Extrudes equal distance each side of the sketch plane
  • Reversed: Flips extrusion direction

Pocket (Cut)

Pocket is the subtractive counterpart to Pad. It cuts material from the current Body solid using a sketch profile. The underlying OCCT operation is BRepFeat_MakePrism in subtraction mode (Boolean Cut rather than Boolean Fuse).

Pocket requires an existing solid — you cannot create a Pocket as the first feature in a Body. The same type options apply: Dimension, To Last, To First, To Face, Two Dimensions, Through All.

Through All uses BRepFeat_MakePrism in “through all” mode, which internally computes the bounding box of the current solid and extrudes far enough to guarantee intersection. This occasionally produces unexpected results on very thin or unusual geometries.

Revolution

Revolution (equivalent to SolidWorks’ Revolve) rotates a sketch profile around an axis to create a solid of revolution. The sketch must not cross the axis line. The axis can be a sketch line, the sketch’s horizontal/vertical axis, or a datum axis.

The underlying OCCT operation uses BRepPrimAPI_MakeRevol. Unlike Pad/Pocket which use BRepFeat_MakePrism, Revolution uses the simpler direct OCCT primitive because rotational sweeps don’t have the same topology-propagation requirements.

Fillet and Chamfer

Fillet applies a constant-radius round to edges of the current solid. From the source (FeatureFillet.h), this wraps OCCT’s BRepFilletAPI_MakeFillet API. FreeCAD’s PartDesign Fillet supports:

  • Multiple edge selection
  • Constant radius only (variable-radius fillet requires the Part workbench’s Part_Fillet directly via OCCT)
  • Tangent propagation: the fillet propagates along tangent edges automatically

Chamfer wraps BRepFilletAPI_MakeChamfer and adds beveled edges at a fixed distance or angle.

One SolidWorks behavior that does not exist in FreeCAD PartDesign Fillet: you cannot fillet a face (which in SolidWorks fillets all edges of that face). FreeCAD requires explicit edge selection. For complex models, this means selecting many edges individually rather than clicking a face.

The Topological Naming Problem — and the FreeCAD 1.0 Fix

If you’ve used FreeCAD before version 1.0, you’ve encountered the Topological Naming Problem (TNP): modifying an upstream feature (changing a sketch, reordering features) causes downstream features to reference the wrong face or edge — fillets jump to the wrong edge, holes appear in the wrong position. This is the single most-cited reason engineers avoided FreeCAD for production work.

Why it happened: FreeCAD internally identifies faces and edges by index within the current B-Rep shape. An index like Face5 refers to the 6th face in the shape’s face list. When you modify an upstream feature, the face list reorders and Face5 now points to a different face. The downstream feature that referenced Face5 now operates on the wrong face.

SolidWorks avoids this by using stable persistent face IDs tied to the modeling history — each face carries a GUID-like identifier that survives edits. CATIA’s B-Rep model uses a similar persistence mechanism.

FreeCAD 1.0 (released December 2023) introduced the Topological Naming Mitigation — a new algorithm that generates stable face/edge identifiers based on the modeling history rather than raw B-Rep indices. This doesn’t guarantee zero renames under all edits, but dramatically reduces the breakage rate on common operations like adding features between existing ones, changing sketch dimensions, and reordering non-conflicting features.

If you’re using FreeCAD 0.21 or earlier, the TNP is a real workflow risk. If you’re on FreeCAD 1.0+, it’s largely resolved for the standard PartDesign workflow.

Exporting from FreeCAD

STEP Export

FreeCAD’s STEP export uses OpenCASCADE’s STEPControl_Writer — the same OCCT component used by Salome and other OCCT-based applications. This is meaningfully different from SolidWorks’ STEP translator, which serializes through Parasolid’s PK_PART_transmit before handing off to Dassault’s catssdstepform.dll.

To export to STEP from PartDesign:

  1. Select the Body or the active solid in the Model tree
  2. File > Export (or right-click > Export)
  3. Choose *STEP with colors (*.step, .stp) for AP214, or *STEP (*.step, .stp) for AP203
  4. Click Export

FreeCAD exports AP214 by default. AP242 is not yet fully supported through the GUI, though the OCCT libraries FreeCAD is built against do support AP242 at the library level. For AP242 with PMI, use a dedicated STEP tool or Onshape as the intermediary.

OCCT STEP vs Parasolid STEP differences: Because FreeCAD’s STEP output comes from OCCT’s kernel rather than Parasolid, the B-Rep representation of the same nominal shape may differ at the entity level. Blends (fillets) that are analytic tori in Parasolid may be NURBS-approximated in OCCT’s serialization, or vice versa. For most downstream uses (CNC machining, FEA meshing, visualization), this doesn’t matter. For workflows that depend on feature recognition or round-trip fidelity, verify the output against your downstream tool’s import behavior. Our STEP file format deep dive covers how the AP versions differ and what each kernel contributes to the output.

DXF Export

FreeCAD does not directly export a 3D solid to DXF the way SolidWorks does (which projects flat pattern geometry). FreeCAD’s DXF export path goes through the TechDraw workbench, which creates 2D projected views of 3D geometry — the equivalent of SolidWorks’ Drawing environment.

Workflow for DXF export:

  1. Switch to TechDraw workbench
  2. TechDraw > Insert Default Page (creates an A3 or A4 sheet with a template)
  3. Select the Body in the Model tree, then TechDraw > Views > View to insert a projected view
  4. Set the direction (Top, Front, Right, or custom) in the View’s properties
  5. File > Export > SVG or DXF (via Drawing) to export the 2D view

TechDraw’s DXF output uses OCCT’s BRep_Tool to project visible edges and then writes entity types (LINE, ARC, CIRCLE) to DXF R14 format. It does not export dimension annotations or tolerances into the DXF entities — those remain in TechDraw’s SVG representation only. For fabrication DXF files, review that all edges are present and the projection scale is 1:1 before sending.

For flat-pattern DXF from sheet metal parts: FreeCAD has a Sheet Metal workbench (community extension) that produces flat patterns. The Sheet Metal workbench’s FlatFace feature creates an unfolded shape that can be exported to DXF via Part workbench’s direct 2D export. This is less integrated than SolidWorks’ native flat pattern pipeline but works for standard gauge sheet metal.

STL Export

STL export in FreeCAD uses OpenCASCADE’s BRepMesh_IncrementalMesh to tessellate the B-Rep solid into triangles, then writes the mesh as ASCII or binary STL.

To export STL:

  1. Select the Body in the Model tree
  2. File > Export → choose STL Mesh (*.stl)
  3. Before clicking Export, go to Edit > Preferences > Import-Export > Mesh Formats to set the tessellation quality. The Max deflection parameter controls triangle density — lower values produce more triangles and a smoother mesh; default is 0.1 mm.

One note for 3D printing: the default FreeCAD STL tessellation is coarser than what SolidWorks produces at its default settings. If your printed parts show visible faceting on curved surfaces, reduce the Max deflection to 0.01–0.05 mm before exporting.

FreeCAD Python API for Automation

FreeCAD exposes a Python API that mirrors the C++ feature model. For PartDesign automation:

import FreeCAD as App
import Part
import PartDesign

# Get or create the active document
doc = App.activeDocument()

# Create a Body
body = doc.addObject("PartDesign::Body", "Body")

# Create a sketch on the XY plane
sketch = doc.addObject("Sketcher::SketchObject", "Sketch")
body.addObject(sketch)
sketch.AttachmentSupport = (doc.getObject("XY_Plane"), "")
sketch.MapMode = "FlatFace"

# Add a circle to the sketch
sketch.addGeometry(Part.Circle(App.Vector(0, 0, 0), App.Vector(0, 0, 1), 10))
# Constrain the radius
sketch.addConstraint(Sketcher.Constraint("Radius", 0, 10))

doc.recompute()

# Pad the sketch by 20mm
pad = doc.addObject("PartDesign::Pad", "Pad")
body.addObject(pad)
pad.Profile = sketch
pad.Length = 20.0
pad.Midplane = False
pad.Reversed = False

doc.recompute()

# Export to STEP
import ImportGui
ImportGui.export([body], "/path/to/output.step")

This shows the pattern: create a feature object, assign it to the Body, set its properties, then call recompute(). The Python API directly reflects the C++ property model — pad.Length sets the same property as the “Length” field in the Pad dialog.

Where FreeCAD Falls Short vs SolidWorks

Sheet metal: FreeCAD’s Sheet Metal workbench is community-maintained and lacks some of the reliability of SolidWorks’ native sheet metal. Flat patterns work for simple geometry; complex bend sequences with edge flanges and corner relief can produce incorrect unfolds. Verify every flat pattern against your physical tolerances before committing to production.

Drawing (TechDraw): TechDraw’s automated section view generation, broken-out sections, and crop views lag behind SolidWorks’ Drawing environment. For complex drawing packages, TechDraw requires more manual intervention.

API ecosystem: SolidWorks has thousands of commercial add-ins and macros accumulated over 30 years. FreeCAD’s add-in ecosystem is smaller, though growing. Weldment automation, BOM integration, and DXF batch export tools that exist for SolidWorks as polished commercial add-ins like CadShift typically need to be scripted manually or sourced from community extensions in FreeCAD.

Large assemblies: FreeCAD handles assemblies differently from SolidWorks. The Assembly4 and Assembly3 workbenches (community) and the now-built-in Assembly workbench in FreeCAD 1.0 work well for moderate assemblies. Above a few hundred parts, FreeCAD’s open-document model (which loads all parts fully, without SolidWorks’ Lightweight or SpeedPak equivalents) can strain memory.

For teams making the comparison between SolidWorks, Inventor, and FreeCAD at scale, the fillet kernel comparison shows how OCCT’s blend algorithm differs from Parasolid’s at the geometry level — a difference that matters for precision manufacturing but not for most engineering workflows. And for teams considering whether cloud or desktop is the right deployment model, see our cloud CAD vs desktop CAD comparison.

FreeCAD is a capable parametric CAD tool that has improved substantially with version 1.0. For engineers exploring open-source alternatives, the PartDesign + TechDraw + Sheet Metal combination covers the majority of mechanical design workflows without the licensing cost. The remaining gaps are real, but narrowing.