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

Pin with Label

Pin with label is a powerful annotation tool that creates visual markers with text labels to highlight important points, display calculated values, or provide contextual information in your 3D models. These pins consist of a line connecting two points with customizable text labels, making them perfect for technical documentation, design reviews, and educational materials.

Understanding Pin with Label

Pin with label annotations combine geometric positioning with text information to create clear, professional annotations. They're essential for communicating design intent, displaying calculated properties, and marking critical features in your models.

Key components include:

  • Start Point: The point where the pin originates (usually on or near your geometry)
  • End Point: The point where the pin terminates (typically positioned for optimal label visibility)
  • Direction Vector: Controls the orientation of the label text
  • Label Text: The information to display (can be static text or dynamic calculated values)
  • Label Positioning: Offset and size controls for optimal readability

Simple Pin with Static Label

The most basic use case is creating a pin with static text to mark important points in your model.

Bitbybit Platform

Simple pin with static label

rete logoRete
Script Source (rete)
{
"id": "rete-v2-json",
"nodes": {
"a1b2c3d4e5f6g7h8": {
"id": "a1b2c3d4e5f6g7h8",
"name": "bitbybit.point.pointXYZ",
"customName": "start point",
"async": false,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"x": 0,
"y": 0,
"z": 0
},
"inputs": {},
"position": [
-3.082380360351779,
4.874850306260413
]
},
"b2c3d4e5f6g7h8i9": {
"id": "b2c3d4e5f6g7h8i9",
"name": "bitbybit.point.pointXYZ",
"customName": "end point",
"async": false,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"x": 3,
"y": 2,
"z": 1
},
"inputs": {},
"position": [
-3.8143436709497607,
356.9627885959876
]
},
"c3d4e5f6g7h8i9j0": {
"id": "c3d4e5f6g7h8i9j0",
"name": "bitbybit.vector.vectorXYZ",
"customName": "direction",
"async": false,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"x": 1,
"y": 0,
"z": 0
},
"inputs": {},
"position": [
-8.496903479843652,
707.145616899227
]
},
"d4e5f6g7h8i9j0k1": {
"id": "d4e5f6g7h8i9j0k1",
"name": "bitbybit.occt.dimensions.pinWithLabel",
"customName": "pin with label",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"startPoint": [
0,
0,
0
],
"endPoint": [
0,
5,
2
],
"direction": [
0,
0,
1
],
"offsetFromStart": 0,
"label": "Important Point",
"labelOffset": 0.3,
"labelSize": 0.4
},
"inputs": {
"startPoint": {
"connections": [
{
"node": "a1b2c3d4e5f6g7h8",
"output": "result",
"data": {}
}
]
},
"endPoint": {
"connections": [
{
"node": "b2c3d4e5f6g7h8i9",
"output": "result",
"data": {}
}
]
},
"direction": {
"connections": [
{
"node": "c3d4e5f6g7h8i9j0",
"output": "result",
"data": {}
}
]
}
},
"position": [
567.8101091255851,
313.38590437874376
]
}
}
}

This basic example demonstrates the essential components of a pin with label:

  • Start Point at origin [0, 0, 0] - where the pin begins
  • End Point at [3, 2, 1] - where the pin terminates and the label appears
  • Direction Vector [1, 0, 0] - controls label text orientation (pointing along X-axis)
  • Static Label text "Important Point" - simple text annotation
  • Label positioning with 0.3 offset and 0.4 size for good readability

Pin with Calculated Properties

A more practical application combines pin labels with calculated geometric properties, similar to how technical drawings display measurements and specifications.

Bitbybit Platform

Sphere with volume pin label

rete logoRete
Script Source (rete)
{
"id": "rete-v2-json",
"nodes": {
"c66568678586089d": {
"id": "c66568678586089d",
"name": "bitbybit.math.numberSlider",
"customName": "radius",
"data": {
"options": {
"min": 1,
"max": 5,
"step": 0.1,
"width": 300,
"updateOnDrag": true
},
"number": 2.5
},
"inputs": {},
"position": [
42.37234172395962,
107.44633517914559
]
},
"b2c3d4e5f6g7h8i9": {
"id": "b2c3d4e5f6g7h8i9",
"name": "bitbybit.occt.shapes.solid.createSphere",
"customName": "sphere",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"radius": 2.5,
"center": [
0,
0,
0
]
},
"inputs": {
"radius": {
"connections": [
{
"node": "c66568678586089d",
"output": "result",
"data": {}
}
]
}
},
"position": [
1028.4532554896928,
63.44938865666802
]
},
"c3d4e5f6g7h8i9j0": {
"id": "c3d4e5f6g7h8i9j0",
"name": "bitbybit.occt.shapes.solid.getSolidVolume",
"customName": "get volume",
"async": true,
"drawable": false,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
}
},
"inputs": {
"shape": {
"connections": [
{
"node": "b2c3d4e5f6g7h8i9",
"output": "result",
"data": {}
}
]
}
},
"position": [
1424.1082301913739,
60.27055877703206
]
},
"d4e5f6g7h8i9j0k1": {
"id": "d4e5f6g7h8i9j0k1",
"name": "bitbybit.math.roundToDecimals",
"customName": "round volume",
"async": false,
"drawable": false,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"number": 1.123456,
"decimalPlaces": 2
},
"inputs": {
"number": {
"connections": [
{
"node": "c3d4e5f6g7h8i9j0",
"output": "result",
"data": {}
}
]
}
},
"position": [
1797.4006197699327,
61.31067901531682
]
},
"e5f6g7h8i9j0k1l2": {
"id": "e5f6g7h8i9j0k1l2",
"name": "bitbybit.text.format",
"customName": "format volume",
"async": false,
"drawable": false,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"text": "Vol: {0} m3",
"values": [
"World"
]
},
"inputs": {
"values": {
"connections": [
{
"node": "aed40f273ec67645",
"output": "list",
"data": {}
}
]
}
},
"position": [
2924.572795632677,
19.910741652073355
]
},
"aed40f273ec67645": {
"id": "aed40f273ec67645",
"name": "bitbybit.lists.createList",
"customName": "volume list",
"data": {},
"inputs": {
"listElements": {
"connections": [
{
"node": "g7h8i9j0k1l2m3n4",
"output": "result",
"data": {}
}
]
}
},
"position": [
2546.460084525186,
96.60716110138223
]
},
"g7h8i9j0k1l2m3n4": {
"id": "g7h8i9j0k1l2m3n4",
"name": "bitbybit.text.toString",
"customName": "volume to string",
"async": false,
"drawable": false,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
}
},
"inputs": {
"item": {
"connections": [
{
"node": "d4e5f6g7h8i9j0k1",
"output": "result",
"data": {}
}
]
}
},
"position": [
2170.95886498554,
58.543647593272425
]
},
"h8i9j0k1l2m3n4o5": {
"id": "h8i9j0k1l2m3n4o5",
"name": "bitbybit.point.pointXYZ",
"customName": "pin start",
"async": false,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"x": 0,
"y": 0,
"z": 0
},
"inputs": {
"z": {
"connections": [
{
"node": "c66568678586089d",
"output": "result",
"data": {}
}
]
}
},
"position": [
1810.5462022760823,
-1193.3432054975422
]
},
"i9j0k1l2m3n4o5p6": {
"id": "i9j0k1l2m3n4o5p6",
"name": "bitbybit.point.pointXYZ",
"customName": "pin end",
"async": false,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"x": 4,
"y": 3,
"z": 0
},
"inputs": {
"z": {
"connections": [
{
"node": "j0k1l2m3n4o5p6q7",
"output": "result",
"data": {}
}
]
}
},
"position": [
2196.4694618686303,
-808.0481131190422
]
},
"j0k1l2m3n4o5p6q7": {
"id": "j0k1l2m3n4o5p6q7",
"name": "bitbybit.math.add",
"customName": "pin height",
"async": false,
"drawable": false,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"first": 1,
"second": 2
},
"inputs": {
"first": {
"connections": [
{
"node": "c66568678586089d",
"output": "result",
"data": {}
}
]
}
},
"position": [
1794.5859002094235,
-731.4406370552683
]
},
"k1l2m3n4o5p6q7r8": {
"id": "k1l2m3n4o5p6q7r8",
"name": "bitbybit.vector.vectorXYZ",
"customName": "direction",
"async": false,
"drawable": true,
"data": {
"genericNodeData": {
"hide": true,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"x": 1,
"y": 0,
"z": 0
},
"inputs": {},
"position": [
2197.6871669225566,
-433.8215024712347
]
},
"l2m3n4o5p6q7r8s9": {
"id": "l2m3n4o5p6q7r8s9",
"name": "bitbybit.occt.dimensions.pinWithLabel",
"customName": "volume pin",
"async": true,
"drawable": true,
"data": {
"genericNodeData": {
"hide": false,
"oneOnOne": false,
"flatten": 0,
"forceExecution": false
},
"startPoint": [
0,
0,
0
],
"endPoint": [
0,
5,
2
],
"direction": [
0,
0,
1
],
"offsetFromStart": 0,
"label": "Volume Pin",
"labelOffset": 0.3,
"labelSize": 0.4
},
"inputs": {
"startPoint": {
"connections": [
{
"node": "h8i9j0k1l2m3n4o5",
"output": "result",
"data": {}
}
]
},
"endPoint": {
"connections": [
{
"node": "i9j0k1l2m3n4o5p6",
"output": "result",
"data": {}
}
]
},
"direction": {
"connections": [
{
"node": "k1l2m3n4o5p6q7r8",
"output": "result",
"data": {}
}
]
},
"label": {
"connections": [
{
"node": "e5f6g7h8i9j0k1l2",
"output": "result",
"data": {}
}
]
}
},
"position": [
3518.309591588108,
-857.7165027776839
]
}
}
}

This example demonstrates how to combine pin labels with calculated geometric properties:

  • Parametric Sphere: Created with a configurable radius (2.5 units)
  • Volume Calculation: Uses getSolidVolume to compute the sphere's volume
  • Dynamic Formatting: Rounds volume to 2 decimal places and formats with units ("Vol: 65.45 m³")
  • Smart Positioning: Pin starts at the sphere's top surface and extends to a clear viewing position
  • Responsive Layout: Pin height adjusts based on sphere radius for consistent visual presentation

This pattern is commonly used in engineering applications where you need to annotate models with calculated properties that update automatically when geometry parameters change.