Skip to main content

Star Ornament

OCCT category icon with a stylized logo representation

🎄 Nothing says festive season quite like a beautiful star ornament. In this beginner-friendly tutorial, you'll learn how to create a classic 3D printable star that can grace the top of your tree or hang as a festive decoration.

This tutorial introduces fundamental CAD concepts: creating polygon wires, applying fillets for smooth edges, and extruding 2D shapes into 3D solids. These techniques form the foundation for countless holiday decorations and beyond!

The Star Shape

Our star begins as a simple 2D wire created using the createStarWire function. This generates a classic five-pointed star shape that we'll then fillet (round the corners) and extrude into a 3D solid. The fillet operation gives our star a softer, more elegant look while also making it safer to handle and easier to 3D print.

Bitbybit Platform

Star ornament

rete logoRete
Script Source (rete)
{
"id": "rete-v2-json",
"nodes": {
"a1b2c3d4e5f6a7b8": {
"id": "a1b2c3d4e5f6a7b8",
"name": "bitbybit.occt.shapes.wire.createStarWire",
"customName": "star wire",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"center": [
0,
0,
0
],
"direction": [
0,
1,
0
],
"numRays": 5,
"outerRadius": 5,
"innerRadius": 2,
"offsetOuterEdges": 0,
"half": false
},
"inputs": {},
"position": [
200,
300
]
},
"b2c3d4e5f6a7b8c9": {
"id": "b2c3d4e5f6a7b8c9",
"name": "bitbybit.occt.fillets.fillet2d",
"customName": "fillet 2d",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"radius": 0.3
},
"inputs": {
"shape": {
"connections": [
{
"node": "a1b2c3d4e5f6a7b8",
"output": "result",
"data": {}
}
]
}
},
"position": [
600,
300
]
},
"c3d4e5f6a7b8c9d0": {
"id": "c3d4e5f6a7b8c9d0",
"name": "bitbybit.occt.shapes.face.createFaceFromWire",
"customName": "face from wire",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"planar": true
},
"inputs": {
"shape": {
"connections": [
{
"node": "b2c3d4e5f6a7b8c9",
"output": "result",
"data": {}
}
]
}
},
"position": [
1000,
300
]
},
"d4e5f6a7b8c9d0e1": {
"id": "d4e5f6a7b8c9d0e1",
"name": "bitbybit.occt.operations.extrude",
"customName": "extrude",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"direction": [
0,
1,
0
]
},
"inputs": {
"shape": {
"connections": [
{
"node": "c3d4e5f6a7b8c9d0",
"output": "result",
"data": {}
}
]
}
},
"position": [
1400,
300
]
},
"e5f6a7b8c9d0e1f2": {
"id": "e5f6a7b8c9d0e1f2",
"name": "bitbybit.occt.fillets.filletEdges",
"customName": "fillet edges",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"radius": 0.15
},
"inputs": {
"shape": {
"connections": [
{
"node": "d4e5f6a7b8c9d0e1",
"output": "result",
"data": {}
}
]
}
},
"position": [
1800,
300
]
},
"a932fe6ce769acfa": {
"id": "a932fe6ce769acfa",
"name": "bitbybit.draw.drawAnyAsync",
"customName": "draw any async",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
}
},
"inputs": {
"entity": {
"connections": [
{
"node": "e5f6a7b8c9d0e1f2",
"output": "result",
"data": {}
}
]
},
"options": {
"connections": [
{
"node": "da2acd0d47017c24",
"output": "result",
"data": {}
}
]
}
},
"position": [
2473.1987035849716,
300.3324882556685
]
},
"da2acd0d47017c24": {
"id": "da2acd0d47017c24",
"name": "bitbybit.draw.optionsOcctShapeMaterial",
"customName": "options occt shape material",
"async": false,
"drawable": false,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"precision": 0.001,
"drawEdges": true,
"edgeColour": "#000000",
"edgeWidth": 1
},
"inputs": {
"faceMaterial": {
"connections": [
{
"node": "afe922cb471989f2",
"output": "result",
"data": {}
}
]
}
},
"position": [
2004.6249617003418,
806.4137688290969
]
},
"afe922cb471989f2": {
"id": "afe922cb471989f2",
"name": "bitbybit.babylon.material.pbrMetallicRoughness.create",
"customName": "pbr metallic roughness",
"async": false,
"drawable": false,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"name": "Custom Material",
"baseColor": "#ffffff",
"emissiveColor": "#00ffcc",
"metallic": 0.8,
"roughness": 0.99,
"alpha": 1,
"backFaceCulling": false,
"zOffset": 2
},
"inputs": {},
"position": [
1613.2900739427882,
845.1250503184503
]
}
}
}

Understanding the Code

Star Wire Creation

The createStarWire function generates our star shape with these key parameters:

  • numRays: The number of star points (5 for a classic star)
  • outerRadius: Distance from center to the tips
  • innerRadius: Distance from center to the inner valleys
  • direction: The normal vector (facing up in Y direction)

Filleting for Polish

We apply two rounds of filleting:

  1. 2D Fillet: Rounds the corners of the wire before extrusion, creating smooth transitions between the star's points
  2. 3D Fillet: Applied after extrusion to round all edges, making the ornament pleasant to touch and easier to print

Extrusion

The extrusion transforms our 2D face into a 3D solid. The direction vector [0, 1, 0] creates a 1-unit thick star. Adjust this for thicker or thinner ornaments!

Adding a Hole

To hang your star ornament on a tree, we need to add a hole at the top. We'll use a boolean difference operation to cut a cylinder through the top point of the star. This is a fundamental CAD technique that allows you to subtract one shape from another.

The cylinder is positioned at the top of the star (at the outer radius on the Z-axis) and oriented along the Y-axis to create a clean hole through the thickness of the ornament.

Bitbybit Platform

Star ornament with hanging hole

rete logoRete
Script Source (rete)
{
"id": "rete-v2-json",
"nodes": {
"a1b2c3d4e5f6a7b8": {
"id": "a1b2c3d4e5f6a7b8",
"name": "bitbybit.occt.shapes.wire.createStarWire",
"customName": "star wire",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"center": [
0,
0,
0
],
"direction": [
0,
1,
0
],
"numRays": 5,
"outerRadius": 5,
"innerRadius": 2,
"offsetOuterEdges": 0,
"half": false
},
"inputs": {
"outerRadius": {
"connections": [
{
"node": "19d651a0af7f2e63",
"output": "result",
"data": {}
}
]
},
"innerRadius": {
"connections": [
{
"node": "6776cf8d29fe5fd4",
"output": "result",
"data": {}
}
]
}
},
"position": [
200,
300
]
},
"b2c3d4e5f6a7b8c9": {
"id": "b2c3d4e5f6a7b8c9",
"name": "bitbybit.occt.fillets.fillet2d",
"customName": "fillet 2d",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"radius": 0.3
},
"inputs": {
"shape": {
"connections": [
{
"node": "a1b2c3d4e5f6a7b8",
"output": "result",
"data": {}
}
]
}
},
"position": [
600,
300
]
},
"c3d4e5f6a7b8c9d0": {
"id": "c3d4e5f6a7b8c9d0",
"name": "bitbybit.occt.shapes.face.createFaceFromWire",
"customName": "face from wire",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"planar": true
},
"inputs": {
"shape": {
"connections": [
{
"node": "b2c3d4e5f6a7b8c9",
"output": "result",
"data": {}
}
]
}
},
"position": [
1000,
300
]
},
"d4e5f6a7b8c9d0e1": {
"id": "d4e5f6a7b8c9d0e1",
"name": "bitbybit.occt.operations.extrude",
"customName": "extrude",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"direction": [
0,
1,
0
]
},
"inputs": {
"shape": {
"connections": [
{
"node": "c3d4e5f6a7b8c9d0",
"output": "result",
"data": {}
}
]
}
},
"position": [
1400,
300
]
},
"cylinder1": {
"id": "cylinder1",
"name": "bitbybit.occt.shapes.solid.createCylinder",
"customName": "cylinder for hole",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"radius": 0.2,
"height": 2,
"center": [
0,
0,
0
],
"direction": [
0,
1,
0
],
"angle": 360,
"originOnCenter": false
},
"inputs": {
"center": {
"connections": [
{
"node": "7979ffd005e581aa",
"output": "result",
"data": {}
}
]
}
},
"position": [
1003.3384125703533,
-164.570359716235
]
},
"difference1": {
"id": "difference1",
"name": "bitbybit.occt.booleans.difference",
"customName": "cut hole",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"keepEdges": false
},
"inputs": {
"shapes": {
"connections": [
{
"node": "4eb728eefee546d6",
"output": "list",
"data": {}
}
]
},
"shape": {
"connections": [
{
"node": "d4e5f6a7b8c9d0e1",
"output": "result",
"data": {}
}
]
}
},
"position": [
1906.9976302985747,
42.43067709905108
]
},
"a932fe6ce769acfa": {
"id": "a932fe6ce769acfa",
"name": "bitbybit.draw.drawAnyAsync",
"customName": "draw any async",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
}
},
"inputs": {
"options": {
"connections": [
{
"node": "da2acd0d47017c24",
"output": "result",
"data": {}
}
]
},
"entity": {
"connections": [
{
"node": "65a615921768d8f2",
"output": "result",
"data": {}
}
]
}
},
"position": [
2774.350559505484,
373.984817304014
]
},
"da2acd0d47017c24": {
"id": "da2acd0d47017c24",
"name": "bitbybit.draw.optionsOcctShapeMaterial",
"customName": "options occt shape material",
"async": false,
"drawable": false,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"precision": 0.001,
"drawEdges": true,
"edgeColour": "#000000",
"edgeWidth": 1
},
"inputs": {
"faceMaterial": {
"connections": [
{
"node": "afe922cb471989f2",
"output": "result",
"data": {}
}
]
}
},
"position": [
2297.0262463648737,
467.78209772556175
]
},
"afe922cb471989f2": {
"id": "afe922cb471989f2",
"name": "bitbybit.babylon.material.pbrMetallicRoughness.create",
"customName": "pbr metallic roughness",
"async": false,
"drawable": false,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"name": "Custom Material",
"baseColor": "#ffffff",
"emissiveColor": "#00ffcc",
"metallic": 0.8,
"roughness": 0.99,
"alpha": 1,
"backFaceCulling": false,
"zOffset": 2
},
"inputs": {},
"position": [
1888.9653155293959,
509.6748934617672
]
},
"4eb728eefee546d6": {
"id": "4eb728eefee546d6",
"name": "bitbybit.lists.createList",
"customName": "create list",
"data": {},
"inputs": {
"listElements": {
"connections": [
{
"node": "cylinder1",
"output": "result",
"data": {}
}
]
}
},
"position": [
1386.3322074430675,
-128.37722709859008
]
},
"19d651a0af7f2e63": {
"id": "19d651a0af7f2e63",
"name": "bitbybit.math.numberSlider",
"customName": "number slider",
"data": {
"number": 5.1
},
"inputs": {},
"position": [
-1013.0248874665731,
301.2566859224661
]
},
"6776cf8d29fe5fd4": {
"id": "6776cf8d29fe5fd4",
"name": "bitbybit.math.divide",
"customName": "divide",
"async": false,
"drawable": false,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"first": 1,
"second": 3
},
"inputs": {
"first": {
"connections": [
{
"node": "19d651a0af7f2e63",
"output": "result",
"data": {}
}
]
}
},
"position": [
-375.6561358564627,
561.2867534889871
]
},
"7979ffd005e581aa": {
"id": "7979ffd005e581aa",
"name": "bitbybit.vector.vectorXYZ",
"customName": "vector xyz",
"async": false,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"x": 0,
"y": 0,
"z": 0
},
"inputs": {
"x": {
"connections": [
{
"node": "679ea6925ec1e71e",
"output": "result",
"data": {}
}
]
}
},
"position": [
617.285893936524,
-86.01988260431061
]
},
"679ea6925ec1e71e": {
"id": "679ea6925ec1e71e",
"name": "bitbybit.math.divide",
"customName": "divide",
"async": false,
"drawable": false,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"first": 1,
"second": 2
},
"inputs": {
"first": {
"connections": [
{
"node": "19d651a0af7f2e63",
"output": "result",
"data": {}
}
]
}
},
"position": [
200.28435820031467,
-80.92053393533374
]
},
"65a615921768d8f2": {
"id": "65a615921768d8f2",
"name": "bitbybit.occt.fillets.filletEdges",
"customName": "fillet edges",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"radius": 0.15
},
"inputs": {
"shape": {
"connections": [
{
"node": "difference1",
"output": "result",
"data": {}
}
]
}
},
"position": [
2302.1515129203385,
43.623665791764665
]
}
}
}

Understanding the Hanging Hole

The hanging hole is created using these key concepts:

  1. Cylinder Creation: We create a cylinder using createCylinder with:

    • center: [0, -0.5, 4.2] - positioned at the top star point (Z = 4.2 is slightly inside the outer radius of 5)
    • radius: 0.4 - small enough to leave material around the hole
    • height: 2 - extends through the full thickness of the star
  2. Boolean Difference: The difference operation subtracts the cylinder from the star, creating a clean hole. This is one of the most powerful CAD operations, allowing you to:

    • Create holes and cutouts
    • Carve complex shapes
    • Remove material precisely

Exporting to STL for 3D Printing

Now that we have our star ornament ready, let's export it as an STL file for 3D printing! The saveShapeStl function converts our OCCT shape into a binary STL file that can be opened in any slicer software.

Bitbybit Platform

Star ornament with STL export

rete logoRete
Script Source (rete)
{
"id": "rete-v2-json",
"nodes": {
"a1b2c3d4e5f6a7b8": {
"id": "a1b2c3d4e5f6a7b8",
"name": "bitbybit.occt.shapes.wire.createStarWire",
"customName": "star wire",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"center": [
0,
0,
0
],
"direction": [
0,
1,
0
],
"numRays": 5,
"outerRadius": 5,
"innerRadius": 2,
"offsetOuterEdges": 0,
"half": false
},
"inputs": {
"outerRadius": {
"connections": [
{
"node": "fec2dafcd515af38",
"output": "result",
"data": {}
}
]
},
"innerRadius": {
"connections": [
{
"node": "6776cf8d29fe5fd4",
"output": "result",
"data": {}
}
]
}
},
"position": [
200,
300
]
},
"b2c3d4e5f6a7b8c9": {
"id": "b2c3d4e5f6a7b8c9",
"name": "bitbybit.occt.fillets.fillet2d",
"customName": "fillet 2d",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"radius": 0.3
},
"inputs": {
"shape": {
"connections": [
{
"node": "a1b2c3d4e5f6a7b8",
"output": "result",
"data": {}
}
]
}
},
"position": [
600,
300
]
},
"c3d4e5f6a7b8c9d0": {
"id": "c3d4e5f6a7b8c9d0",
"name": "bitbybit.occt.shapes.face.createFaceFromWire",
"customName": "face from wire",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"planar": true
},
"inputs": {
"shape": {
"connections": [
{
"node": "b2c3d4e5f6a7b8c9",
"output": "result",
"data": {}
}
]
}
},
"position": [
1000,
300
]
},
"d4e5f6a7b8c9d0e1": {
"id": "d4e5f6a7b8c9d0e1",
"name": "bitbybit.occt.operations.extrude",
"customName": "extrude",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"direction": [
0,
1,
0
]
},
"inputs": {
"shape": {
"connections": [
{
"node": "c3d4e5f6a7b8c9d0",
"output": "result",
"data": {}
}
]
}
},
"position": [
1400,
300
]
},
"cylinder1": {
"id": "cylinder1",
"name": "bitbybit.occt.shapes.solid.createCylinder",
"customName": "cylinder for hole",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"radius": 0.2,
"height": 2,
"center": [
0,
0,
0
],
"direction": [
0,
1,
0
],
"angle": 360,
"originOnCenter": false
},
"inputs": {
"center": {
"connections": [
{
"node": "7979ffd005e581aa",
"output": "result",
"data": {}
}
]
}
},
"position": [
1003.3384125703533,
-164.570359716235
]
},
"difference1": {
"id": "difference1",
"name": "bitbybit.occt.booleans.difference",
"customName": "cut hole",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"keepEdges": false
},
"inputs": {
"shapes": {
"connections": [
{
"node": "4db2839f06602c56",
"output": "list",
"data": {}
}
]
},
"shape": {
"connections": [
{
"node": "d4e5f6a7b8c9d0e1",
"output": "result",
"data": {}
}
]
}
},
"position": [
1906.9976302985747,
42.43067709905108
]
},
"a932fe6ce769acfa": {
"id": "a932fe6ce769acfa",
"name": "bitbybit.draw.drawAnyAsync",
"customName": "draw any async",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
}
},
"inputs": {
"options": {
"connections": [
{
"node": "da2acd0d47017c24",
"output": "result",
"data": {}
}
]
},
"entity": {
"connections": [
{
"node": "65a615921768d8f2",
"output": "result",
"data": {}
}
]
}
},
"position": [
2774.350559505484,
373.984817304014
]
},
"da2acd0d47017c24": {
"id": "da2acd0d47017c24",
"name": "bitbybit.draw.optionsOcctShapeMaterial",
"customName": "options occt shape material",
"async": false,
"drawable": false,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"precision": 0.001,
"drawEdges": true,
"edgeColour": "#000000",
"edgeWidth": 1
},
"inputs": {
"faceMaterial": {
"connections": [
{
"node": "afe922cb471989f2",
"output": "result",
"data": {}
}
]
}
},
"position": [
2297.0262463648737,
467.78209772556175
]
},
"afe922cb471989f2": {
"id": "afe922cb471989f2",
"name": "bitbybit.babylon.material.pbrMetallicRoughness.create",
"customName": "pbr metallic roughness",
"async": false,
"drawable": false,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"name": "Custom Material",
"baseColor": "#ffffff",
"emissiveColor": "#00ffcc",
"metallic": 0.8,
"roughness": 0.99,
"alpha": 1,
"backFaceCulling": false,
"zOffset": 2
},
"inputs": {},
"position": [
1888.9653155293959,
509.6748934617672
]
},
"4db2839f06602c56": {
"id": "4db2839f06602c56",
"name": "bitbybit.lists.createList",
"customName": "create list",
"data": {},
"inputs": {
"listElements": {
"connections": [
{
"node": "cylinder1",
"output": "result",
"data": {}
}
]
}
},
"position": [
1386.3322074430675,
-128.37722709859008
]
},
"fec2dafcd515af38": {
"id": "fec2dafcd515af38",
"name": "bitbybit.math.numberSlider",
"customName": "number slider",
"data": {
"number": 5.1
},
"inputs": {},
"position": [
-1013.0248874665731,
301.2566859224661
]
},
"6776cf8d29fe5fd4": {
"id": "6776cf8d29fe5fd4",
"name": "bitbybit.math.divide",
"customName": "divide",
"async": false,
"drawable": false,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"first": 1,
"second": 3
},
"inputs": {
"first": {
"connections": [
{
"node": "fec2dafcd515af38",
"output": "result",
"data": {}
}
]
}
},
"position": [
-375.6561358564627,
561.2867534889871
]
},
"7979ffd005e581aa": {
"id": "7979ffd005e581aa",
"name": "bitbybit.vector.vectorXYZ",
"customName": "vector xyz",
"async": false,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"x": 0,
"y": 0,
"z": 0
},
"inputs": {
"x": {
"connections": [
{
"node": "679ea6925ec1e71e",
"output": "result",
"data": {}
}
]
}
},
"position": [
617.285893936524,
-86.01988260431061
]
},
"679ea6925ec1e71e": {
"id": "679ea6925ec1e71e",
"name": "bitbybit.math.divide",
"customName": "divide",
"async": false,
"drawable": false,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"first": 1,
"second": 2
},
"inputs": {
"first": {
"connections": [
{
"node": "fec2dafcd515af38",
"output": "result",
"data": {}
}
]
}
},
"position": [
200.28435820031467,
-80.92053393533374
]
},
"65a615921768d8f2": {
"id": "65a615921768d8f2",
"name": "bitbybit.occt.fillets.filletEdges",
"customName": "fillet edges",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"radius": 0.15
},
"inputs": {
"shape": {
"connections": [
{
"node": "difference1",
"output": "result",
"data": {}
}
]
}
},
"position": [
2302.1515129203385,
43.623665791764665
]
},
"f61c10222fe8b6cd": {
"id": "f61c10222fe8b6cd",
"name": "bitbybit.occt.io.saveShapeStl",
"customName": "save shape stl",
"async": true,
"drawable": false,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"fileName": "star.stl",
"precision": 0.001,
"adjustYtoZ": false,
"tryDownload": true,
"binary": true
},
"inputs": {
"shape": {
"connections": [
{
"node": "65a615921768d8f2",
"output": "result",
"data": {}
}
]
}
},
"position": [
2788.424323239864,
-185.299280890669
]
}
}
}

Understanding STL Export

The saveShapeStl function exports your 3D model with these options:

  • fileName: The name of the downloaded file (e.g., star.stl)
  • precision: Controls mesh quality (0.001 is high quality)
  • adjustYtoZ: Set to false to keep the Y-up orientation, or true for Z-up (some 3D printers prefer this)
  • tryDownload: Automatically triggers the file download
  • binary: Uses binary STL format (smaller file size than ASCII)

Making It Your Own 🎁

Try these festive variations:

  • Six-pointed Star: Change numRays to 6 for a Star of David style
  • Chubby Star: Increase innerRadius closer to outerRadius
  • Tree Topper: Increase the thickness for a substantial tree-top star

3D Printing Tips

Your star ornament is print-ready! For best results:

  • Layer Height: 0.2mm works great
  • Infill: 15-20% is sufficient for lightweight ornaments
  • Material: PLA in gold, silver, or festive red looks stunning
  • Support: Usually not needed when printed flat

Happy holidays and happy modeling! 🌟