Skip to main content

Parts

When you build models with multiple components, auto-fusion can work against you — you don't want a bolt to merge into a bracket. part() creates isolation boundaries so components stay separate.

Defining a part

Wrap modeling operations in a part() call:

import { part, sketch, extrude } from 'fluidcad/core';
import { rect, circle } from 'fluidcad/core';

part("base", () => {
sketch("xy", () => {
rect(120, 80).center()
})
extrude(10)
})

part("pillar", () => {
sketch("xy", () => {
circle(30)
})
extrude(60)
})

Shapes inside "base" fuse with each other, and shapes inside "pillar" fuse with each other, but the two parts stay separate — even though the pillar sits on top of the base.

Base and pillar parts

Passing options

The part() callback receives an options object. You pass options when you instantiate the part with use():

import { part, use, cylinder, select, color } from 'fluidcad/core';
import { face } from 'fluidcad/filters';

const peg = part("peg", (options) => {
cylinder(options?.radius || 10, options?.height || 40)
select(face())
color("orange")
})

use(peg, { radius: 15, height: 60 }) // custom size
use(peg) // default size

Use options?.property || defaultValue to provide defaults when an option isn't passed.

Importing parts from other files

Parts are regular ES module exports. Define a part in one file and import it in another:

// peg.fluid.js
import { part, cylinder, select, color } from 'fluidcad/core';
import { face } from 'fluidcad/filters';

export const peg = part("peg", (options) => {
cylinder(options?.radius || 10, options?.height || 40)
select(face())
color("orange")
})
// assembly.fluid.js
import { peg } from './peg.fluid.js';
import { use, sketch, extrude, translate } from 'fluidcad/core';
import { rect } from 'fluidcad/core';

// Base plate
sketch("xy", () => {
rect(100, 60).center()
})
extrude(5)

// Place pegs with different sizes
const p1 = use(peg, { radius: 8, height: 30 })
translate(30, 15, 5)

const p2 = use(peg, { radius: 12, height: 50 })
translate(-30, -15, 5)

This pattern lets you build libraries of reusable parametric components.