# Difference between TreeNode and ProgramNode

**URL:** <https://forum.universal-robots.com/t/difference-between-treenode-and-programnode/7808>\
**Category:** URCaps SDK\
**Created:** [June 25, 2020, 8:26am UTC](https://forum.universal-robots.com/t/difference-between-treenode-and-programnode/7808 "2020-06-25T08:26:10Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![highouse1990](https://avatars.discourse-cdn.com/v4/letter/h/a87d85/32.png) [@highouse1990](https://forum.universal-robots.com/u/highouse1990)\
**Post date:** [June 25, 2020, 8:26am UTC](https://forum.universal-robots.com/t/difference-between-treenode-and-programnode/7808/1 "2020-06-25T08:26:10Z")

</div>

what’s the difference between TreeNode and ProgramNode

---

<div class="post-metadata">

**Author:** ![Ebbe](https://sea2.discourse-cdn.com/flex020/user_avatar/forum.universal-robots.com/ebbe/32/1413_2.png) [@Ebbe](https://forum.universal-robots.com/u/Ebbe)\
**Post date:** [June 26, 2020, 5:50am UTC](https://forum.universal-robots.com/t/difference-between-treenode-and-programnode/7808/2 "2020-06-26T05:50:28Z")

</div>

From the documentation on [Universal Robots - URCap - API Reference Docs](https://plus.universal-robots.com/api-reference/)

> ## Interface TreeNode
> 
> - @ProviderType public interface TreeNode
> 
> This interface represents a node in the program tree that can be used to construct a sub-tree rooted in a URCap program node.
> 
> Using the [`ProgramModel.getRootTreeNode(ProgramNodeContribution)`](https://plus.universal-robots.com/apidoc/70014/com/ur/urcap/api/domain/program/ProgramModel.html#getRootTreeNode-com.ur.urcap.api.contribution.ProgramNodeContribution-) to obtain a root for the sub-tree, it is possible to add children. For each call to [`addChild(ProgramNode)`](https://plus.universal-robots.com/apidoc/70014/com/ur/urcap/api/domain/program/structure/TreeNode.html#addChild-com.ur.urcap.api.domain.program.nodes.ProgramNode-), a new [`TreeNode`](https://plus.universal-robots.com/apidoc/70014/com/ur/urcap/api/domain/program/structure/TreeNode.html) is returned, that can, in turn, act as a root for yet another sub-tree.
> 
> ## Interface ProgramNode
> 
> - All Known Subinterfaces:
> 
> [AssignmentNode](https://plus.universal-robots.com/apidoc/70014/com/ur/urcap/api/domain/program/nodes/builtin/AssignmentNode.html), [CircleMoveNode](https://plus.universal-robots.com/apidoc/70014/com/ur/urcap/api/domain/program/nodes/builtin/CircleMoveNode.html), [CommentNode](https://plus.universal-robots.com/apidoc/70014/com/ur/urcap/api/domain/program/nodes/builtin/CommentNode.html), [DirectionNode](https://plus.universal-robots.com/apidoc/70014/com/ur/urcap/api/domain/program/nodes/builtin/DirectionNode.html), [ElseIfNode](https://plus.universal-robots.com/apidoc/70014/com/ur/urcap/api/domain/program/nodes/builtin/ElseIfNode.html), [ElseNode](https://plus.universal-robots.com/apidoc/70014/com/ur/urcap/api/domain/program/nodes/builtin/ElseNode.html), [FolderNode](https://plus.universal-robots.com/apidoc/70014/com/ur/urcap/api/domain/program/nodes/builtin/FolderNode.html), [ForceNode](https://plus.universal-robots.com/apidoc/70014/com/ur/urcap/api/domain/program/nodes/builtin/ForceNode.html), [GripperNode](https://plus.universal-robots.com/apidoc/70014/com/ur/urcap/api/domain/program/nodes/contributable/device/gripper/GripperNode.html), [HaltNode](https://plus.universal-robots.com/apidoc/70014/com/ur/urcap/api/domain/program/nodes/builtin/HaltNode.html), [IfNode](https://plus.universal-robots.com/apidoc/70014/com/ur/urcap/api/domain/program/nodes/builtin/IfNode.html), [LoopNode](https://plus.universal-robots.com/apidoc/70014/com/ur/urcap/api/domain/program/nodes/builtin/LoopNode.html), [MoveNode](https://plus.universal-robots.com/apidoc/70014/com/ur/urcap/api/domain/program/nodes/builtin/MoveNode.html), [PalletNode](https://plus.universal-robots.com/apidoc/70014/com/ur/urcap/api/domain/program/nodes/builtin/PalletNode.html), [PopupNode](https://plus.universal-robots.com/apidoc/70014/com/ur/urcap/api/domain/program/nodes/builtin/PopupNode.html), [ScrewdrivingNode](https://plus.universal-robots.com/apidoc/70014/com/ur/urcap/api/domain/program/nodes/builtin/ScrewdrivingNode.html), [SeekNode](https://plus.universal-robots.com/apidoc/70014/com/ur/urcap/api/domain/program/nodes/builtin/SeekNode.html), [SetNode](https://plus.universal-robots.com/apidoc/70014/com/ur/urcap/api/domain/program/nodes/builtin/SetNode.html), [UntilNode](https://plus.universal-robots.com/apidoc/70014/com/ur/urcap/api/domain/program/nodes/builtin/UntilNode.html), [URCapProgramNode](https://plus.universal-robots.com/apidoc/70014/com/ur/urcap/api/domain/program/nodes/contributable/URCapProgramNode.html), [WaitNode](https://plus.universal-robots.com/apidoc/70014/com/ur/urcap/api/domain/program/nodes/builtin/WaitNode.html), [WaypointNode](https://plus.universal-robots.com/apidoc/70014/com/ur/urcap/api/domain/program/nodes/builtin/WaypointNode.html)
> 
> public interface ProgramNode
> 
> This interface represents PolyScope program nodes.
> 
> The program nodes can be created using [`ProgramNodeFactory`](https://plus.universal-robots.com/apidoc/70014/com/ur/urcap/api/domain/program/nodes/ProgramNodeFactory.html).

So the TreeNode interface can be used to insert ProgramNodes instances to the program tree. You can take a look at the many samples that is adding child nodes.
