# How to add a unit in the input field of a node group (also Geometry Nodes modifier)?

Some nodes like Vector Rotate or Mapping have scalar and vector fields with $$°$$ symbol or $$m$$ or yet another unit in them:

This also affects how the value is stored in memory – without the $$°$$ symbol it is stored basically without a change, but degrees are stored by being multiplied by $${π\over180} = 0.017453...$$: So I need to add "Degrees" to the field name to make it clear I ask for a value in degrees, and I need to divide it by 0.017453 or use Math: To Degrees node. How do I instead just set the input to display a value in degrees?

• I'm not a %100 on this, but I don't think you can. Blender puts those degree signs automatically when you link a rotation socket into the input, but there's no option to do it manually afaik. If you link a Rotation value into an input socket and then choose "Vector" from the Type menu, for instance, even though it was already a vector type to begin with, it actually loses the degree sign. What does your "Inclination" value come from? From a "Vector Rotate—Angle"? Mar 26, 2022 at 10:38
• You're right. You have to plug an input from a node that has this type of widget (e.g. the “Fac” Input of the MixRGB node) into the group input. It will automatically match the exposed input to the socket you plugged in. Mar 26, 2022 at 11:23

You can use Vector Rotate and Align Vector to Euler to achieve this effect.

As Kuboå mentioned in the comments, GN will "keep" this setting when you insert it into the Group Input: You can even change e.g. the maximum value in the group settings for the slider - it will still be a slider.

1. ⭾ Tab Enter inside the node to which you want to add a socket.
2. Select any node (this solution needs active_node in context).
3. Press ⬆ ShiftF4 to switch to Python Console.
4. Paste one of the codez below, depending on your needs:

Scalar angle$$°$$

C.area.type = 'NODE_EDITOR'; C.active_node.id_data.inputs.new('NodeSocketFloatAngle', 'Angle')


Scalar distance (unit depends on settings, e.g. $$m$$)

C.area.type = 'NODE_EDITOR'; C.active_node.id_data.inputs.new('NodeSocketFloatDistance', 'Distance')


Scalar percentage $$\%$$

C.area.type = 'NODE_EDITOR'; C.active_node.id_data.inputs.new('NodeSocketFloatPercentage', 'Percentage')


Scalar time (unit depends on settings)

C.area.type = 'NODE_EDITOR'; C.active_node.id_data.inputs.new('NodeSocketFloatTimeAbsolute', 'Time')


Scalar factor ("slider")

C.area.type = 'NODE_EDITOR'; C.active_node.id_data.inputs.new('NodeSocketFloatFactor', 'Factor')


🟢 Integer (If you want to limit a custom shader/compositing group input to whole numbers)

C.area.type = 'NODE_EDITOR'; C.active_node.id_data.inputs.new('NodeSocketInt', 'Integer')


🟢 Integer factor (filling the field from left to right)

C.area.type = 'NODE_EDITOR'; C.active_node.id_data.inputs.new('NodeSocketIntFactor', 'Factor')


🟢 Integer percentage $$\%$$

C.area.type = 'NODE_EDITOR'; C.active_node.id_data.inputs.new('NodeSocketIntPercentage', 'Percentage')


🟣 Vector translation (unit depends on settings, e.g. $$m$$)

C.area.type = 'NODE_EDITOR'; C.active_node.id_data.inputs.new('NodeSocketVectorTranslation', 'Translation')


🟣 Vector velocity (unit depends on settings, e.g. $$m/s$$)

C.area.type = 'NODE_EDITOR'; C.active_node.id_data.inputs.new('NodeSocketVectorVelocity', 'Velocity')


🟣 Vector acceleration (unit depends on settings, e.g. $$m/s²$$)

C.area.type = 'NODE_EDITOR'; C.active_node.id_data.inputs.new('NodeSocketVectorAcceleration', 'Acceleration')


🟣 Vector Euler rotation$$°$$

C.area.type = 'NODE_EDITOR'; C.active_node.id_data.inputs.new('NodeSocketVectorEuler', 'Rotation')


❗🟣 Vector direction (

C.area.type = 'NODE_EDITOR'; C.active_node.id_data.inputs.new('NodeSocketVectorDirection', 'Direction')


❗ seems buggy and shows a black circle but that's because the default value is $$(0, 0, 0)$$ - set the default to to $$(0, 0, 1)$$, then delete the node and create a new one from the ⬆ ShiftA menu.

🟣 Vector XYZ (components have X/Y/Z labels)

C.area.type = 'NODE_EDITOR'; C.active_node.id_data.inputs.new('NodeSocketVectorXYZ', 'Vector')


❗👻 Virtual (⚠ CRASHES BLENDER IN GEONODES ⚠ gray color like geonodes last input/output socket)

C.area.type = 'NODE_EDITOR'; C.active_node.id_data.inputs.new('NodeSocketVirtual', 'Fancy Socket')


I decided to not litter this list with: NodeSocketObject - outside of geonodes it behaves just like float but has an orange color. Some people might consider it nice to have an unusual color in their setups, but it can be misleading so I don't want to promote that; same goes for NodeSocketCollection, NodeSocketGeometry, NodeSocketImage, NodeSocketMaterial, NodeSocketShader, NodeSocketString, NodeSocketTexture.

I also removed the Boolean node (NodeSocketBool) - it would be useful if it worked like a float socket, but allowed only 2 values when no link is connected to the socket. At least the integer socket type works.

NodeSocketFloatTime seems to not add any units, so I omitted it, as well as NodeSocketFloatUnsigned and NodeSocketIntUnsigned, as I don't know what they're supposed to do, they do display and pass negative values…