Skip to main content
OCCT category icon with a stylized logo representation

Multiple Wire Offsets

Multiple wire offsetting creates a series of parallel curves at specified distances from an original open wire. This technique generates multiple paths that maintain the same general shape as the original while being displaced perpendicular to the wire direction. The operation is useful for various applications including toolpath generation, pattern creation, and design iterations where you need parallel geometric elements.

The process involves creating an initial open wire through point interpolation, then systematically generating offset curves at incrementally increasing distances. Each offset curve preserves the original wire's character while providing controlled spacing for your specific application needs.

Interactive Example

The following example demonstrates creating multiple offset curves from a single interpolated wire, showing how a simple reference path can generate a family of parallel curves.

Bitbybit Platform

Multiple Wire Offsets

rete logoRete
Script Source (rete)
{
"id": "rete-v2-json",
"nodes": {
"38ab4551ee8c1af6": {
"id": "38ab4551ee8c1af6",
"name": "bitbybit.lists.createList",
"customName": "create list",
"data": {},
"inputs": {
"listElements": {
"connections": [
{
"node": "p1",
"output": "result",
"data": {}
},
{
"node": "p2",
"output": "result",
"data": {}
},
{
"node": "p3",
"output": "result",
"data": {}
},
{
"node": "p4",
"output": "result",
"data": {}
},
{
"node": "p5",
"output": "result",
"data": {}
}
]
}
},
"position": [
400,
200
]
},
"p1": {
"id": "p1",
"name": "bitbybit.vector.vectorXYZ",
"customName": "point 1",
"async": false,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"x": -4,
"y": 0,
"z": -2
},
"inputs": {},
"position": [
-190.80902171677602,
-389.40998864339485
]
},
"p2": {
"id": "p2",
"name": "bitbybit.vector.vectorXYZ",
"customName": "point 2",
"async": false,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"x": -2,
"y": 0,
"z": 2
},
"inputs": {},
"position": [
-184.48746508777663,
-51.45988709568172
]
},
"p3": {
"id": "p3",
"name": "bitbybit.vector.vectorXYZ",
"customName": "point 3",
"async": false,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"x": 0,
"y": 0,
"z": 1
},
"inputs": {},
"position": [
-182.69518017759944,
284.6979295418542
]
},
"p4": {
"id": "p4",
"name": "bitbybit.vector.vectorXYZ",
"customName": "point 4",
"async": false,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"x": 2,
"y": 0,
"z": 3
},
"inputs": {},
"position": [
-178.16590845877727,
621.8445930263844
]
},
"p5": {
"id": "p5",
"name": "bitbybit.vector.vectorXYZ",
"customName": "point 5",
"async": false,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"x": 4,
"y": 0,
"z": 0
},
"inputs": {},
"position": [
-177.78626190144908,
960.9248052563768
]
},
"basewire": {
"id": "basewire",
"name": "bitbybit.occt.shapes.wire.interpolatePoints",
"customName": "base wire",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"periodic": false,
"tolerance": 0.01
},
"inputs": {
"points": {
"connections": [
{
"node": "38ab4551ee8c1af6",
"output": "list",
"data": {}
}
]
}
},
"position": [
798.0752802442432,
7.828210074300614
]
},
"e80cf9124defa4d4": {
"id": "e80cf9124defa4d4",
"name": "bitbybit.math.numberSlider",
"customName": "number slider",
"data": {
"options": {
"min": 0.1,
"max": 2,
"step": 0.1,
"width": 300,
"updateOnDrag": false
},
"number": 2
},
"inputs": {},
"position": [
507.72512479553654,
683.9608294997644
]
},
"offset1": {
"id": "offset1",
"name": "bitbybit.occt.operations.offset",
"customName": "offset 1",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"distance": 0.2,
"tolerance": 0.01
},
"inputs": {
"shape": {
"connections": [
{
"node": "basewire",
"output": "result",
"data": {}
}
]
},
"distance": {
"connections": [
{
"node": "e80cf9124defa4d4",
"output": "result",
"data": {}
}
]
}
},
"position": [
1221.466307302009,
35.9679552097118
]
},
"multiply2": {
"id": "multiply2",
"name": "bitbybit.math.twoNrOperation",
"customName": "distance x2",
"async": false,
"drawable": false,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"first": 1,
"second": 1,
"operation": "multiply"
},
"inputs": {
"first": {
"connections": [
{
"node": "e80cf9124defa4d4",
"output": "result",
"data": {}
}
]
},
"second": {
"connections": [
{
"node": "two",
"output": "result",
"data": {}
}
]
}
},
"position": [
1224.7781345357528,
420.76788306204287
]
},
"multiply3": {
"id": "multiply3",
"name": "bitbybit.math.twoNrOperation",
"customName": "distance x3",
"async": false,
"drawable": false,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"first": 1,
"second": 1,
"operation": "multiply"
},
"inputs": {
"first": {
"connections": [
{
"node": "e80cf9124defa4d4",
"output": "result",
"data": {}
}
]
},
"second": {
"connections": [
{
"node": "three",
"output": "result",
"data": {}
}
]
}
},
"position": [
1223.336847020343,
763.5274114633796
]
},
"two": {
"id": "two",
"name": "bitbybit.math.number",
"customName": "2",
"async": false,
"drawable": false,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"number": 2
},
"inputs": {},
"position": [
794.9971478885859,
358.9193706214926
]
},
"three": {
"id": "three",
"name": "bitbybit.math.number",
"customName": "3",
"async": false,
"drawable": false,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"number": 3
},
"inputs": {},
"position": [
776.7709280853388,
864.3650074471401
]
},
"offset2": {
"id": "offset2",
"name": "bitbybit.occt.operations.offset",
"customName": "offset 2",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"distance": 0.2,
"tolerance": 0.01
},
"inputs": {
"shape": {
"connections": [
{
"node": "basewire",
"output": "result",
"data": {}
}
]
},
"distance": {
"connections": [
{
"node": "multiply2",
"output": "result",
"data": {}
}
]
}
},
"position": [
1753.5553421737566,
-819.7376021048046
]
},
"offset3": {
"id": "offset3",
"name": "bitbybit.occt.operations.offset",
"customName": "offset 3",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"distance": 0.2,
"tolerance": 0.01
},
"inputs": {
"shape": {
"connections": [
{
"node": "basewire",
"output": "result",
"data": {}
}
]
},
"distance": {
"connections": [
{
"node": "multiply3",
"output": "result",
"data": {}
}
]
}
},
"position": [
1755.7551374986147,
-412.67129767464064
]
},
"basestyle": {
"id": "basestyle",
"name": "bitbybit.draw.optionsOcctShapeSimple",
"customName": "base wire style",
"async": false,
"drawable": false,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"precision": 0.01,
"drawFaces": false,
"faceColour": "#ff0000",
"drawEdges": true,
"edgeColour": "#00ff00",
"edgeWidth": 10
},
"inputs": {},
"position": [
2185.479415729077,
24.660799545770598
]
},
"offset1style": {
"id": "offset1style",
"name": "bitbybit.draw.optionsOcctShapeSimple",
"customName": "offset 1 style",
"async": false,
"drawable": false,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"precision": 0.01,
"drawFaces": false,
"faceColour": "#ff0000",
"drawEdges": true,
"edgeColour": "#ff9900",
"edgeWidth": 10
},
"inputs": {},
"position": [
2185.41761280114,
479.95843456556105
]
},
"offset2style": {
"id": "offset2style",
"name": "bitbybit.draw.optionsOcctShapeSimple",
"customName": "offset 2 style",
"async": false,
"drawable": false,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"precision": 0.01,
"drawFaces": false,
"faceColour": "#ff0000",
"drawEdges": true,
"edgeColour": "#ff6600",
"edgeWidth": 10
},
"inputs": {},
"position": [
2189.911568561141,
949.1264124123878
]
},
"offset3style": {
"id": "offset3style",
"name": "bitbybit.draw.optionsOcctShapeSimple",
"customName": "offset 3 style",
"async": false,
"drawable": false,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"precision": 0.01,
"drawFaces": false,
"faceColour": "#ff0000",
"drawEdges": true,
"edgeColour": "#ff3300",
"edgeWidth": 10
},
"inputs": {},
"position": [
2198.7405582664474,
1412.2906772596061
]
},
"drawbase": {
"id": "drawbase",
"name": "bitbybit.draw.drawAnyAsync",
"customName": "draw base wire",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
}
},
"inputs": {
"entity": {
"connections": [
{
"node": "basewire",
"output": "result",
"data": {}
}
]
},
"options": {
"connections": [
{
"node": "basestyle",
"output": "result",
"data": {}
}
]
}
},
"position": [
2962.5743950324195,
-338.5447476522748
]
},
"drawoffset1": {
"id": "drawoffset1",
"name": "bitbybit.draw.drawAnyAsync",
"customName": "draw offset 1",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
}
},
"inputs": {
"entity": {
"connections": [
{
"node": "offset1",
"output": "result",
"data": {}
}
]
},
"options": {
"connections": [
{
"node": "offset1style",
"output": "result",
"data": {}
}
]
}
},
"position": [
2966.944744936546,
20.383033435246347
]
},
"drawoffset2": {
"id": "drawoffset2",
"name": "bitbybit.draw.drawAnyAsync",
"customName": "draw offset 2",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
}
},
"inputs": {
"entity": {
"connections": [
{
"node": "offset2",
"output": "result",
"data": {}
}
]
},
"options": {
"connections": [
{
"node": "offset2style",
"output": "result",
"data": {}
}
]
}
},
"position": [
2968.163145515878,
374.15611583371833
]
},
"drawoffset3": {
"id": "drawoffset3",
"name": "bitbybit.draw.drawAnyAsync",
"customName": "draw offset 3",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
}
},
"inputs": {
"entity": {
"connections": [
{
"node": "offset3",
"output": "result",
"data": {}
}
]
},
"options": {
"connections": [
{
"node": "offset3style",
"output": "result",
"data": {}
}
]
}
},
"position": [
2971.5181616038944,
746.5142215618604
]
}
}
}

Understanding the Workflow

The multiple wire offset workflow demonstrates a practical approach to generating parallel curves. You start by defining control points that establish the desired path geometry, then create a smooth interpolated wire that serves as your reference curve. Each offset operation takes this base wire and creates a new curve at a specified distance, with the distance typically calculated as multiples of a base offset value.

The stepover distance parameter controls the spacing between parallel curves and can be adjusted based on your specific requirements. In the example, we use multiples of 0.5 units to create three additional curves, each progressively further from the original. The visualization uses different colors to clearly distinguish between the base curve and its offsets, making it easy to understand the relationship between all generated elements.

This technique provides a foundation for various applications where parallel geometric elements are needed, from manufacturing processes to architectural design patterns. The consistent spacing and predictable geometric relationships make it particularly valuable for systematic design approaches where precision and repeatability are important.