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! ๐ŸŒŸ