Swept profile box
Let's say you want to start designing with a box. Simple extrusion is good if you do not have a complex profile. A way to work with a more complex shape is to draw the profile in 2D, and then sweep it along a base sketch.
const { makeSolid, makeFace, assembleWire, EdgeFinder, genericSweep, Plane } =
replicad;
function profileBox(inputProfile, base) {
const start = inputProfile.blueprint.firstPoint;
const profile = inputProfile.translate(-start[0], -start[1]);
const end = profile.blueprint.lastPoint;
const baseSketch = base.sketchOnPlane();
// We create the side of the box
const side = baseSketch.clone().sweepSketch(
(plane) => {
return profile.sketchOnPlane(plane);
},
{
withContact: true,
}
);
// We put all the pieces together
return makeSolid([
side,
// The face generated by sweeping the end of the profile
makeFace(assembleWire(new EdgeFinder().inPlane("XY", end[1]).find(side))),
// The face generated by the base
baseSketch.face(),
]);
}
This code assumes some things about its input:
- the input profile is a single open line
- the base is a single closed line
- there is only one profile point at the coordinate of the end of the profile
The box will have its base in the XY
plane.
Let's build an example
const { makeSolid, makeFace, assembleWire, EdgeFinder, genericSweep, Plane } =
replicad;
function profileBox(inputProfile, base) {
const start = inputProfile.blueprint.firstPoint;
const profile = inputProfile.translate(-start[0], -start[1]);
const end = profile.blueprint.lastPoint;
const baseSketch = base.sketchOnPlane();
// We create the side of the box
const side = baseSketch.clone().sweepSketch(
(plane) => {
return profile.sketchOnPlane(plane);
},
{
withContact: true,
}
);
// We put all the pieces together
return makeSolid([
side,
// The face generated by sweeping the end of the profile
makeFace(assembleWire(new EdgeFinder().inPlane("XY", end[1]).find(side))),
// The face generated by the base
baseSketch.face(),
]);
}
const { draw, drawRoundedRectangle } = replicad;
function main() {
const base = drawRoundedRectangle(30, 20, 5);
const profile = draw()
.line(5, 5)
.line(2, 3)
.hLine(-2)
.vLine(-1)
.bulgeArcTo([0, 1], 0.2)
.done();
return profileBox(profile, base);
}