diff --git a/2026R1/dpf-framework-26-r1/changelog/changelog.md b/2026R1/dpf-framework-26-r1/changelog/changelog.md
index 4ee41dcd3..bfb6be302 100644
--- a/2026R1/dpf-framework-26-r1/changelog/changelog.md
+++ b/2026R1/dpf-framework-26-r1/changelog/changelog.md
@@ -1,6 +1,6 @@
# Changelog
-Changes since the last released version for DPF 26.1.pre1 (as of 2025-10-31).
+Changes since the last released version for DPF 26.1.pre1 (as of 2025-11-03).
This changelog is organized by category, with sections for different types of updates (new features, bug fixes, changes, performance improvements).
@@ -12,10 +12,11 @@ The following table shows which components have updates in each category.
| cgns | [1 item](#Features_cgns) | |
| changelog | [2 items](#Features_changelog) |[1 item](#Fixes_changelog) |
| ci | [1 item](#Features_ci) |[1 item](#Fixes_ci) |
-| compression | [2 items](#Features_compression) | |
+| compression | [2 items](#Features_compression) |[1 item](#Fixes_compression) |
| core | |[1 item](#Fixes_core) |
| cyclic | [1 item](#Features_cyclic) | |
| doc | [2 items](#Features_doc) | |
+| documentation | [1 item](#Features_documentation) | |
| dpf | [3 items](#Features_dpf) |[1 item](#Fixes_dpf) |
| eng_mat | |[1 item](#Fixes_eng_mat) |
| expansion | [1 item](#Features_expansion) | |
@@ -26,9 +27,9 @@ The following table shows which components have updates in each category.
| h5dpf | [1 item](#Features_h5dpf) |[1 item](#Fixes_h5dpf) |
| hdf5 | [4 items](#Features_hdf5) | |
| hgp | [2 items](#Features_hgp) | |
-| kernel | [1 item](#Features_kernel) |[1 item](#Fixes_kernel) |
+| kernel | [2 items](#Features_kernel) |[1 item](#Fixes_kernel) |
| lsdyna | [1 item](#Features_lsdyna) | |
-| mapdl | [11 items](#Features_mapdl) |[14 items](#Fixes_mapdl) |
+| mapdl | [12 items](#Features_mapdl) |[14 items](#Fixes_mapdl) |
| mapdlpluggin | |[1 item](#Fixes_mapdlpluggin) |
| math | [7 items](#Features_math) | |
| mechanical | [2 items](#Features_mechanical) |[3 items](#Fixes_mechanical) |
@@ -92,6 +93,8 @@ The following table shows which components have updates in each category.
- Use scripting name in operator changelog:
>
+ >
+ >
## ci
### Features
@@ -127,6 +130,14 @@ The following table shows which components have updates in each category.
- Scale and Round Operator:
>
+### Fixes
+
+- Quantization loss of performance:
+ > The quantization ("quantization") operator has became super slow since its last modification.
+ >
+ >
+ >
+ >
## core
### Fixes
@@ -176,6 +187,20 @@ The following table shows which components have updates in each category.
>
>
+## documentation
+### Features
+
+- Add Markdown and LaTeX example operator:
+ > This PR adds an example operator ``markdown_latex_example`` to ``Ans.Dpf.Documentation`` where usage of supported Markdown and LaTeX is showcased.
+ >
+ > It also allows to test whether the operator is properly exposed in all clients and pipelines.
+ >
+ > We take the opportunity to fix support for multiline descriptions in output pins during generation of operator classes in C#.
+ >
+ >
+ >
+ >
+
## dpf
### Features
@@ -403,6 +428,15 @@ The following table shows which components have updates in each category.
## kernel
### Features
+- Add Unit string to express British ton:
+ >
+ >
+ > The string `"ton"` in DPF units denotes the Metric Ton (1000 kg). The string `"tonuk"` now denotes the British ton (also known as Long ton, approximately 1016.05 kg or 2240 pounds of mass).
+ >
+ >
+ >
+ >
+
- Establish thread safety and STL compliance for scopingIterators:
> - Test for thread safety when using scoping Iterators for read access within parallel regions (over fields, over scoping etc).
>
@@ -435,6 +469,13 @@ The following table shows which components have updates in each category.
## mapdl
### Features
+- Adding new operator and result for Nodal Orientations:
+ > Adding new operator and result for Nodal Orientations
+ >
+ >
+ >
+ >
+
- Refactor ElementType handling to increase performance:
>
>
@@ -1358,6 +1399,18 @@ The following table shows which components have updates in each category.
- [nodal_rotational_velocity_Z](https://ansys-a.devportal.io/docs/dpf-framework-2026-r1/operator-specifications/result/nodal_rotational_velocity_Z.md):
> Read/compute nodal rotational velocity Z component of the vector (3rd component) by calling the readers defined by the datasources.
+- [node_orientations](https://ansys-a.devportal.io/docs/dpf-framework-2026-r1/operator-specifications/result/node_orientations.md):
+ > Read/compute node euler angles by calling the readers defined by the datasources.
+
+- [node_orientations_X](https://ansys-a.devportal.io/docs/dpf-framework-2026-r1/operator-specifications/result/node_orientations_X.md):
+ > Read/compute node euler angles X component of the vector (1st component) by calling the readers defined by the datasources.
+
+- [node_orientations_Y](https://ansys-a.devportal.io/docs/dpf-framework-2026-r1/operator-specifications/result/node_orientations_Y.md):
+ > Read/compute node euler angles Y component of the vector (2nd component) by calling the readers defined by the datasources.
+
+- [node_orientations_Z](https://ansys-a.devportal.io/docs/dpf-framework-2026-r1/operator-specifications/result/node_orientations_Z.md):
+ > Read/compute node euler angles Z component of the vector (3rd component) by calling the readers defined by the datasources.
+
#### serialization
@@ -1808,6 +1861,16 @@ The following table shows which components have updates in each category.
> 0.1.0: Addition of is_constant pin
+- [remove_rigid_body_motion](https://ansys-a.devportal.io/docs/dpf-framework-2026-r1/operator-specifications/result/remove_rigid_body_motion.md)
+
+ > 0.0.1: Replace vector of pointers with array of objects to prevent memory leaks
+
+
+- [remove_rigid_body_motion_fc](https://ansys-a.devportal.io/docs/dpf-framework-2026-r1/operator-specifications/result/remove_rigid_body_motion_fc.md)
+
+ > 0.0.1: Replace vector of pointers with array of objects to prevent memory leaks
+
+
- [state_variable](https://ansys-a.devportal.io/docs/dpf-framework-2026-r1/operator-specifications/result/state_variable.md)
> 0.1.0: Add pin eExtendMidNodesPin to add/remove mid-nodes when averaging from ElementalNodal to Nodal. Default:True
diff --git a/2026R1/dpf-framework-26-r1/operator-specifications/result/node_orientations.md b/2026R1/dpf-framework-26-r1/operator-specifications/result/node_orientations.md
new file mode 100644
index 000000000..10c85b9f2
--- /dev/null
+++ b/2026R1/dpf-framework-26-r1/operator-specifications/result/node_orientations.md
@@ -0,0 +1,58 @@
+---
+category: result
+plugin: core
+license: None
+---
+
+# result:node orientations
+
+**Version: 0.0.0**
+
+## Description
+
+Read/compute node euler angles by calling the readers defined by the datasources.
+
+## Inputs
+
+| Input | Name | Expected type(s) | Description |
+|-------|-------|------------------|-------------|
+| Pin 0| time_scoping |[`scoping`](../../core-concepts/dpf-types.md#scoping), [`int32`](../../core-concepts/dpf-types.md#standard-types), [`vector`](../../core-concepts/dpf-types.md#standard-types), [`double`](../../core-concepts/dpf-types.md#standard-types), [`field`](../../core-concepts/dpf-types.md#field), [`vector`](../../core-concepts/dpf-types.md#standard-types) | time/freq values (use doubles or field), time/freq set ids (use ints or scoping) or time/freq step ids (use scoping with TimeFreq_steps location) required in output. To specify time/freq values at specific load steps, put a Field (and not a list) in input with a scoping located on "TimeFreq_steps". Linear time freq intrapolation is performed if the values are not in the result files and the data at the max time or freq is taken when time/freqs are higher than available time/freqs in result files. To get all data for all time/freq sets, connect an int with value -1. |
+| Pin 1| mesh_scoping |[`scopings_container`](../../core-concepts/dpf-types.md#scopings-container), [`scoping`](../../core-concepts/dpf-types.md#scoping) | nodes or elements scoping required in output. The output fields will be scoped on these node or element IDs. To figure out the ordering of the fields data, look at their scoping IDs as they might not be ordered as the input scoping was. The scoping's location indicates whether nodes or elements are asked for. Using scopings container allows you to split the result fields container into domains |
+| Pin 2| fields_container |[`fields_container`](../../core-concepts/dpf-types.md#fields-container) | Fields container already allocated modified inplace |
+| Pin 3| streams_container |[`streams_container`](../../core-concepts/dpf-types.md#streams-container) | result file container allowed to be kept open to cache data |
+| Pin 4
Required| data_sources |[`data_sources`](../../core-concepts/dpf-types.md#data-sources) | result file path container, used if no streams are set |
+| Pin 5| bool_rotate_to_global |[`bool`](../../core-concepts/dpf-types.md#standard-types) | if true the field is rotated to global coordinate system (default true). Please check your results carefully if 'false' is used for Elemental or ElementalNodal results averaged to the Nodes when adjacent elements do not share the same coordinate system, as results may be incorrect. |
+| Pin 7| mesh |[`abstract_meshed_region`](../../core-concepts/dpf-types.md#meshed-region), [`meshes_container`](../../core-concepts/dpf-types.md#meshes-container) | prevents from reading the mesh in the result files |
+
+## Outputs
+
+| Output | Name | Expected type(s) | Description |
+|-------|------|------------------|-------------|
+| **Pin 0**| fields_container |[`fields_container`](../../core-concepts/dpf-types.md#fields-container) | |
+
+## Configurations
+
+| Name| Expected type(s) | Default value | Description |
+|-----|------|----------|-------------|
+| **mutex** |[`bool`](../../core-concepts/dpf-types.md#standard-types) | false | If this option is set to true, the shared memory is prevented from being simultaneously accessed by multiple threads. |
+| **num_threads** |[`int32`](../../core-concepts/dpf-types.md#standard-types) | 0 | Number of threads to use to run in parallel |
+| **run_in_parallel** |[`bool`](../../core-concepts/dpf-types.md#standard-types) | true | Loops are allowed to run in parallel if the value of this config is set to true. |
+
+## Scripting
+
+ **Category**: result
+
+ **Plugin**: core
+
+ **Scripting name**: node_orientations
+
+ **Full name**: result.node_orientations
+
+ **Internal name**: EUL_NOD
+
+ **License**: None
+
+
+## Changelog
+
+- Version 0.0.0: Initial release.
\ No newline at end of file
diff --git a/2026R1/dpf-framework-26-r1/operator-specifications/result/node_orientations_X.md b/2026R1/dpf-framework-26-r1/operator-specifications/result/node_orientations_X.md
new file mode 100644
index 000000000..e3dedac41
--- /dev/null
+++ b/2026R1/dpf-framework-26-r1/operator-specifications/result/node_orientations_X.md
@@ -0,0 +1,59 @@
+---
+category: result
+plugin: core
+license: None
+---
+
+# result:node orientations X
+
+**Version: 0.0.0**
+
+## Description
+
+Read/compute node euler angles X component of the vector (1st component) by calling the readers defined by the datasources.
+
+## Inputs
+
+| Input | Name | Expected type(s) | Description |
+|-------|-------|------------------|-------------|
+| Pin 0| time_scoping |[`scoping`](../../core-concepts/dpf-types.md#scoping), [`int32`](../../core-concepts/dpf-types.md#standard-types), [`vector`](../../core-concepts/dpf-types.md#standard-types), [`double`](../../core-concepts/dpf-types.md#standard-types), [`field`](../../core-concepts/dpf-types.md#field), [`vector`](../../core-concepts/dpf-types.md#standard-types) | time/freq values (use doubles or field), time/freq set ids (use ints or scoping) or time/freq step ids (use scoping with TimeFreq_steps location) required in output. To specify time/freq values at specific load steps, put a Field (and not a list) in input with a scoping located on "TimeFreq_steps". Linear time freq intrapolation is performed if the values are not in the result files and the data at the max time or freq is taken when time/freqs are higher than available time/freqs in result files. To get all data for all time/freq sets, connect an int with value -1. |
+| Pin 1| mesh_scoping |[`scopings_container`](../../core-concepts/dpf-types.md#scopings-container), [`scoping`](../../core-concepts/dpf-types.md#scoping) | nodes or elements scoping required in output. The output fields will be scoped on these node or element IDs. To figure out the ordering of the fields data, look at their scoping IDs as they might not be ordered as the input scoping was. The scoping's location indicates whether nodes or elements are asked for. Using scopings container allows you to split the result fields container into domains |
+| Pin 2| fields_container |[`fields_container`](../../core-concepts/dpf-types.md#fields-container) | FieldsContainer already allocated modified inplace |
+| Pin 3| streams_container |[`streams_container`](../../core-concepts/dpf-types.md#streams-container) | result file container allowed to be kept open to cache data |
+| Pin 4
Required| data_sources |[`data_sources`](../../core-concepts/dpf-types.md#data-sources) | result file path container, used if no streams are set |
+| Pin 5| bool_rotate_to_global |[`bool`](../../core-concepts/dpf-types.md#standard-types) | if true the field is rotated to global coordinate system (default true) |
+| Pin 7| mesh |[`abstract_meshed_region`](../../core-concepts/dpf-types.md#meshed-region), [`meshes_container`](../../core-concepts/dpf-types.md#meshes-container) | prevents from reading the mesh in the result files |
+| Pin 14| read_cyclic |`enum dataProcessing::ECyclicReading`, [`int32`](../../core-concepts/dpf-types.md#standard-types) | if 0 cyclic symmetry is ignored, if 1 cyclic sector is read, if 2 cyclic expansion is done, if 3 cyclic expansion is done and stages are merged (default is 1) |
+
+## Outputs
+
+| Output | Name | Expected type(s) | Description |
+|-------|------|------------------|-------------|
+| **Pin 0**| fields_container |[`fields_container`](../../core-concepts/dpf-types.md#fields-container) | |
+
+## Configurations
+
+| Name| Expected type(s) | Default value | Description |
+|-----|------|----------|-------------|
+| **mutex** |[`bool`](../../core-concepts/dpf-types.md#standard-types) | false | If this option is set to true, the shared memory is prevented from being simultaneously accessed by multiple threads. |
+| **num_threads** |[`int32`](../../core-concepts/dpf-types.md#standard-types) | 0 | Number of threads to use to run in parallel |
+| **run_in_parallel** |[`bool`](../../core-concepts/dpf-types.md#standard-types) | true | Loops are allowed to run in parallel if the value of this config is set to true. |
+
+## Scripting
+
+ **Category**: result
+
+ **Plugin**: core
+
+ **Scripting name**: node_orientations_X
+
+ **Full name**: result.node_orientations_X
+
+ **Internal name**: EUL_NODX
+
+ **License**: None
+
+
+## Changelog
+
+- Version 0.0.0: Initial release.
\ No newline at end of file
diff --git a/2026R1/dpf-framework-26-r1/operator-specifications/result/node_orientations_Y.md b/2026R1/dpf-framework-26-r1/operator-specifications/result/node_orientations_Y.md
new file mode 100644
index 000000000..be1f89600
--- /dev/null
+++ b/2026R1/dpf-framework-26-r1/operator-specifications/result/node_orientations_Y.md
@@ -0,0 +1,59 @@
+---
+category: result
+plugin: core
+license: None
+---
+
+# result:node orientations Y
+
+**Version: 0.0.0**
+
+## Description
+
+Read/compute node euler angles Y component of the vector (2nd component) by calling the readers defined by the datasources.
+
+## Inputs
+
+| Input | Name | Expected type(s) | Description |
+|-------|-------|------------------|-------------|
+| Pin 0| time_scoping |[`scoping`](../../core-concepts/dpf-types.md#scoping), [`int32`](../../core-concepts/dpf-types.md#standard-types), [`vector`](../../core-concepts/dpf-types.md#standard-types), [`double`](../../core-concepts/dpf-types.md#standard-types), [`field`](../../core-concepts/dpf-types.md#field), [`vector`](../../core-concepts/dpf-types.md#standard-types) | time/freq values (use doubles or field), time/freq set ids (use ints or scoping) or time/freq step ids (use scoping with TimeFreq_steps location) required in output. To specify time/freq values at specific load steps, put a Field (and not a list) in input with a scoping located on "TimeFreq_steps". Linear time freq intrapolation is performed if the values are not in the result files and the data at the max time or freq is taken when time/freqs are higher than available time/freqs in result files. To get all data for all time/freq sets, connect an int with value -1. |
+| Pin 1| mesh_scoping |[`scopings_container`](../../core-concepts/dpf-types.md#scopings-container), [`scoping`](../../core-concepts/dpf-types.md#scoping) | nodes or elements scoping required in output. The output fields will be scoped on these node or element IDs. To figure out the ordering of the fields data, look at their scoping IDs as they might not be ordered as the input scoping was. The scoping's location indicates whether nodes or elements are asked for. Using scopings container allows you to split the result fields container into domains |
+| Pin 2| fields_container |[`fields_container`](../../core-concepts/dpf-types.md#fields-container) | FieldsContainer already allocated modified inplace |
+| Pin 3| streams_container |[`streams_container`](../../core-concepts/dpf-types.md#streams-container) | result file container allowed to be kept open to cache data |
+| Pin 4
Required| data_sources |[`data_sources`](../../core-concepts/dpf-types.md#data-sources) | result file path container, used if no streams are set |
+| Pin 5| bool_rotate_to_global |[`bool`](../../core-concepts/dpf-types.md#standard-types) | if true the field is rotated to global coordinate system (default true) |
+| Pin 7| mesh |[`abstract_meshed_region`](../../core-concepts/dpf-types.md#meshed-region), [`meshes_container`](../../core-concepts/dpf-types.md#meshes-container) | prevents from reading the mesh in the result files |
+| Pin 14| read_cyclic |`enum dataProcessing::ECyclicReading`, [`int32`](../../core-concepts/dpf-types.md#standard-types) | if 0 cyclic symmetry is ignored, if 1 cyclic sector is read, if 2 cyclic expansion is done, if 3 cyclic expansion is done and stages are merged (default is 1) |
+
+## Outputs
+
+| Output | Name | Expected type(s) | Description |
+|-------|------|------------------|-------------|
+| **Pin 0**| fields_container |[`fields_container`](../../core-concepts/dpf-types.md#fields-container) | |
+
+## Configurations
+
+| Name| Expected type(s) | Default value | Description |
+|-----|------|----------|-------------|
+| **mutex** |[`bool`](../../core-concepts/dpf-types.md#standard-types) | false | If this option is set to true, the shared memory is prevented from being simultaneously accessed by multiple threads. |
+| **num_threads** |[`int32`](../../core-concepts/dpf-types.md#standard-types) | 0 | Number of threads to use to run in parallel |
+| **run_in_parallel** |[`bool`](../../core-concepts/dpf-types.md#standard-types) | true | Loops are allowed to run in parallel if the value of this config is set to true. |
+
+## Scripting
+
+ **Category**: result
+
+ **Plugin**: core
+
+ **Scripting name**: node_orientations_Y
+
+ **Full name**: result.node_orientations_Y
+
+ **Internal name**: EUL_NODY
+
+ **License**: None
+
+
+## Changelog
+
+- Version 0.0.0: Initial release.
\ No newline at end of file
diff --git a/2026R1/dpf-framework-26-r1/operator-specifications/result/node_orientations_Z.md b/2026R1/dpf-framework-26-r1/operator-specifications/result/node_orientations_Z.md
new file mode 100644
index 000000000..a08337f08
--- /dev/null
+++ b/2026R1/dpf-framework-26-r1/operator-specifications/result/node_orientations_Z.md
@@ -0,0 +1,59 @@
+---
+category: result
+plugin: core
+license: None
+---
+
+# result:node orientations Z
+
+**Version: 0.0.0**
+
+## Description
+
+Read/compute node euler angles Z component of the vector (3rd component) by calling the readers defined by the datasources.
+
+## Inputs
+
+| Input | Name | Expected type(s) | Description |
+|-------|-------|------------------|-------------|
+| Pin 0| time_scoping |[`scoping`](../../core-concepts/dpf-types.md#scoping), [`int32`](../../core-concepts/dpf-types.md#standard-types), [`vector`](../../core-concepts/dpf-types.md#standard-types), [`double`](../../core-concepts/dpf-types.md#standard-types), [`field`](../../core-concepts/dpf-types.md#field), [`vector`](../../core-concepts/dpf-types.md#standard-types) | time/freq values (use doubles or field), time/freq set ids (use ints or scoping) or time/freq step ids (use scoping with TimeFreq_steps location) required in output. To specify time/freq values at specific load steps, put a Field (and not a list) in input with a scoping located on "TimeFreq_steps". Linear time freq intrapolation is performed if the values are not in the result files and the data at the max time or freq is taken when time/freqs are higher than available time/freqs in result files. To get all data for all time/freq sets, connect an int with value -1. |
+| Pin 1| mesh_scoping |[`scopings_container`](../../core-concepts/dpf-types.md#scopings-container), [`scoping`](../../core-concepts/dpf-types.md#scoping) | nodes or elements scoping required in output. The output fields will be scoped on these node or element IDs. To figure out the ordering of the fields data, look at their scoping IDs as they might not be ordered as the input scoping was. The scoping's location indicates whether nodes or elements are asked for. Using scopings container allows you to split the result fields container into domains |
+| Pin 2| fields_container |[`fields_container`](../../core-concepts/dpf-types.md#fields-container) | FieldsContainer already allocated modified inplace |
+| Pin 3| streams_container |[`streams_container`](../../core-concepts/dpf-types.md#streams-container) | result file container allowed to be kept open to cache data |
+| Pin 4
Required| data_sources |[`data_sources`](../../core-concepts/dpf-types.md#data-sources) | result file path container, used if no streams are set |
+| Pin 5| bool_rotate_to_global |[`bool`](../../core-concepts/dpf-types.md#standard-types) | if true the field is rotated to global coordinate system (default true) |
+| Pin 7| mesh |[`abstract_meshed_region`](../../core-concepts/dpf-types.md#meshed-region), [`meshes_container`](../../core-concepts/dpf-types.md#meshes-container) | prevents from reading the mesh in the result files |
+| Pin 14| read_cyclic |`enum dataProcessing::ECyclicReading`, [`int32`](../../core-concepts/dpf-types.md#standard-types) | if 0 cyclic symmetry is ignored, if 1 cyclic sector is read, if 2 cyclic expansion is done, if 3 cyclic expansion is done and stages are merged (default is 1) |
+
+## Outputs
+
+| Output | Name | Expected type(s) | Description |
+|-------|------|------------------|-------------|
+| **Pin 0**| fields_container |[`fields_container`](../../core-concepts/dpf-types.md#fields-container) | |
+
+## Configurations
+
+| Name| Expected type(s) | Default value | Description |
+|-----|------|----------|-------------|
+| **mutex** |[`bool`](../../core-concepts/dpf-types.md#standard-types) | false | If this option is set to true, the shared memory is prevented from being simultaneously accessed by multiple threads. |
+| **num_threads** |[`int32`](../../core-concepts/dpf-types.md#standard-types) | 0 | Number of threads to use to run in parallel |
+| **run_in_parallel** |[`bool`](../../core-concepts/dpf-types.md#standard-types) | true | Loops are allowed to run in parallel if the value of this config is set to true. |
+
+## Scripting
+
+ **Category**: result
+
+ **Plugin**: core
+
+ **Scripting name**: node_orientations_Z
+
+ **Full name**: result.node_orientations_Z
+
+ **Internal name**: EUL_NODZ
+
+ **License**: None
+
+
+## Changelog
+
+- Version 0.0.0: Initial release.
\ No newline at end of file
diff --git a/2026R1/dpf-framework-26-r1/operator-specifications/result/result_category.md b/2026R1/dpf-framework-26-r1/operator-specifications/result/result_category.md
index 9bb343573..641b8c2e2 100644
--- a/2026R1/dpf-framework-26-r1/operator-specifications/result/result_category.md
+++ b/2026R1/dpf-framework-26-r1/operator-specifications/result/result_category.md
@@ -239,6 +239,10 @@
- [nodal rotation Y](nodal_rotation_Y.md)
- [nodal rotation Z](nodal_rotation_Z.md)
- [nodal to global](nodal_to_global.md)
+- [node orientations](node_orientations.md)
+- [node orientations X](node_orientations_X.md)
+- [node orientations Y](node_orientations_Y.md)
+- [node orientations Z](node_orientations_Z.md)
- [normal contact force](normal_contact_force.md)
- [normal contact moment](normal_contact_moment.md)
- [num surface status changes](num_surface_status_changes.md)
diff --git a/2026R1/dpf-framework-26-r1/toc.yml b/2026R1/dpf-framework-26-r1/toc.yml
index 3f460f676..aeec21176 100644
--- a/2026R1/dpf-framework-26-r1/toc.yml
+++ b/2026R1/dpf-framework-26-r1/toc.yml
@@ -1267,6 +1267,14 @@
href: operator-specifications/result/nodal_rotation_Z.md
- name: nodal to global
href: operator-specifications/result/nodal_to_global.md
+ - name: node orientations
+ href: operator-specifications/result/node_orientations.md
+ - name: node orientations X
+ href: operator-specifications/result/node_orientations_X.md
+ - name: node orientations Y
+ href: operator-specifications/result/node_orientations_Y.md
+ - name: node orientations Z
+ href: operator-specifications/result/node_orientations_Z.md
- name: normal contact force
href: operator-specifications/result/normal_contact_force.md
- name: normal contact moment