Joint Result Script Example#
Download the RS3_Result_Scripting_Example folder for this example.
from rs3.RS3Modeler import RS3Modeler
from rs3.results.ResultEnums import InterfaceResultTypes
from rs3.Geometry import Point, Cube
import os
Get the current folder directory.
current_dir = os.path.dirname(os.path.abspath(""))
Specify a port number that is not in use and start the RS3 program.
port = 60504
RS3Modeler.startApplication(port)
2026-03-13 17:09:42,439 - Rocscience.RS3 - INFO - Attempting to start the application at C:\Program Files\Rocscience\RS3\RS3 and binding server to port 60504...
Connect with the RS3 Modeler.
modeler = RS3Modeler(port)
For the demonstration purposes only, the model is copied for reuse. You may change the model path to your own model path.
model = modeler.openFile(rf"{current_dir}\example_models\RS3_Result_Scripting_Example\RS3_Result_Scripting_Example.rs3v3")
1. Get Node Results#
1.1 Define a box region to filter joint elements (optional)#
A Cube is defined by two corners. Only mesh nodes inside or intersecting the box will be returned. If you omit the region in the next step, all nodes in the model would be returned.
joint_query_region = Cube(
corner1=Point(x=3.0, y=14.0, z=-21.0),
corner2=Point(x=26.0, y=16.0, z=1.0),
)
1.2 Get the joint results object for the desired stage(s)#
Request joint results for two stages. joint_results_list[0] = stage 4, [1] = stage 5.
joint_results_list = model.Results.getJointResults(stageNumber=[4, 5])
Stage 4
joint_results_stage_4 = joint_results_list[0]
joint_node_results_s4 = joint_results_stage_4.getJointNodeResults()
joint_node_by_id_s4 = {nr.NodeID: nr for nr in joint_node_results_s4}
print(f"Joint: total node results for stage 4: {len(joint_node_results_s4)}")
Joint: total node results for stage 4: 458
joint_element_results_s4 = joint_results_stage_4.getJointElementResults(
region=joint_query_region,
)
print(f"Joint: element results in region for stage 4: {len(joint_element_results_s4)}")
Joint: element results in region for stage 4: 50
element_index = 0
selected_joint_element_s4 = joint_element_results_s4[element_index]
joint_attached_nodes_s4 = selected_joint_element_s4.AttachedNodeIDs
shear_disp_s4 = selected_joint_element_s4.getResults(InterfaceResultTypes.DISPLACEMENT_SHEAR)
normal_disp_s4 = selected_joint_element_s4.getResults(InterfaceResultTypes.DISPLACEMENT_NORMAL)
print(f"Nodal results for joint element ID {selected_joint_element_s4.ElementID}:")
num_node_pairs_s4 = int(len(joint_attached_nodes_s4)/2)
for i in range(num_node_pairs_s4):
node_id = joint_attached_nodes_s4[i]
virtual_node_id = joint_attached_nodes_s4[i+num_node_pairs_s4]
nr_s4 = joint_node_by_id_s4[node_id]
shear_val = shear_disp_s4[i]
normal_val = normal_disp_s4[i]
print(
f" Node Pair {(node_id, virtual_node_id)}: (x, y, z, Relative Shear Disp., Relative Normal Disp.) = "
f"({nr_s4.XCoordinate}, {nr_s4.YCoordinate}, {nr_s4.ZCoordinate}, {shear_val}, {normal_val})"
)
Nodal results for joint element ID 81231:
Node Pair (4948, 14880): (x, y, z, Relative Shear Disp., Relative Normal Disp.) = (25.6535873692461, 13.258816860594816, -3.552713678800501e-15, 0.00013422658477781323, 8.194546454307267e-05)
Node Pair (4949, 14881): (x, y, z, Relative Shear Disp., Relative Normal Disp.) = (25.6535873692461, 15.0, -1.7763568394002505e-15, 0.00012989772319076887, 8.430580903496631e-05)
Node Pair (4932, 14872): (x, y, z, Relative Shear Disp., Relative Normal Disp.) = (24.52229989882357, 14.12610331963225, -1.0618840689177063, 0.0001075489087358885, 8.155018914220158e-06)
Stage 5
joint_results_stage_5 = joint_results_list[1]
joint_node_results_s5 = joint_results_stage_5.getJointNodeResults()
joint_node_by_id_s5 = {nr.NodeID: nr for nr in joint_node_results_s5}
print(f"Joint: total node results for stage 5: {len(joint_node_results_s5)}")
Joint: total node results for stage 5: 458
joint_element_results_s5 = joint_results_stage_5.getJointElementResults(region=joint_query_region)
selected_joint_element_s5 = joint_element_results_s5[element_index]
joint_attached_nodes_s5 = selected_joint_element_s5.AttachedNodeIDs
shear_disp_s5 = selected_joint_element_s5.getResults(
InterfaceResultTypes.DISPLACEMENT_SHEAR,
)
normal_disp_s5 = selected_joint_element_s5.getResults(
InterfaceResultTypes.DISPLACEMENT_NORMAL,
)
print(f"Nodal results for joint element ID {selected_joint_element_s5.ElementID}:")
num_node_pairs_s5 = int(len(joint_attached_nodes_s5)/2)
for i in range(num_node_pairs_s5):
node_id = joint_attached_nodes_s5[i]
virtual_node_id = joint_attached_nodes_s5[i+num_node_pairs_s5]
nr_s5 = joint_node_by_id_s5[node_id]
shear_val = shear_disp_s5[i]
normal_val = normal_disp_s5[i]
print(
f" Node Pair {(node_id, virtual_node_id)}: (x, y, z, Relative Shear Disp., Relative Normal Disp.) = "
f"({nr_s5.XCoordinate}, {nr_s5.YCoordinate}, {nr_s5.ZCoordinate}, {shear_val}, {normal_val})"
)
Nodal results for joint element ID 81231:
Node Pair (4948, 14880): (x, y, z, Relative Shear Disp., Relative Normal Disp.) = (25.6535873692461, 13.258816860594816, -3.552713678800501e-15, 0.0005128569233693311, 0.000252546207422967)
Node Pair (4949, 14881): (x, y, z, Relative Shear Disp., Relative Normal Disp.) = (25.6535873692461, 15.0, -1.7763568394002505e-15, 0.0005480472002880548, 0.00027645215759602125)
Node Pair (4932, 14872): (x, y, z, Relative Shear Disp., Relative Normal Disp.) = (24.52229989882357, 14.12610331963225, -1.0618840689177063, 0.0004961965421816254, 0.0002630609019895012)
Since accessing results doesn’t change the model, close the model without saving.
model.close(False)
Close the program.
modeler.closeProgram()
Full Script#
# Joint Result Script Example
# Download the [RS3_Result_Scripting_Example folder](https://github.com/Rocscience/rs3-scripting/tree/main/docs/example_code/example_models/RS3_Result_Scripting_Example) for this example.
from rs3.RS3Modeler import RS3Modeler
from rs3.results.ResultEnums import InterfaceResultTypes
from rs3.Geometry import Point, Cube
import os
# Get the current folder directory.
current_dir = os.path.dirname(os.path.abspath(""))
# Specify a port number that is not in use and start the RS3 program.
port = 60504
RS3Modeler.startApplication(port)
# Connect with the RS3 Modeler.
modeler = RS3Modeler(port)
# For the demonstration purposes only, the model is copied for reuse. You may change the model path to your own model path.
model = modeler.openFile(rf"{current_dir}\example_models\RS3_Result_Scripting_Example\RS3_Result_Scripting_Example.rs3v3")
# 1. Get Node Results
# 1.1 Define a box region to filter joint elements (optional)
#
# A Cube is defined by two corners. Only mesh nodes inside or intersecting
# the box will be returned. If you omit the region in the next step, all
# nodes in the model would be returned.
joint_query_region = Cube(
corner1=Point(x=3.0, y=14.0, z=-21.0),
corner2=Point(x=26.0, y=16.0, z=1.0),
)
# 1.2 Get the joint results object for the desired stage(s)
#
# Request joint results for two stages. joint_results_list[0] = stage 4, [1] = stage 5.
joint_results_list = model.Results.getJointResults(stageNumber=[4, 5])
# Stage 4
joint_results_stage_4 = joint_results_list[0]
joint_node_results_s4 = joint_results_stage_4.getJointNodeResults()
joint_node_by_id_s4 = {nr.NodeID: nr for nr in joint_node_results_s4}
print(f"Joint: total node results for stage 4: {len(joint_node_results_s4)}")
joint_element_results_s4 = joint_results_stage_4.getJointElementResults(
region=joint_query_region,
)
print(f"Joint: element results in region for stage 4: {len(joint_element_results_s4)}")
element_index = 0
selected_joint_element_s4 = joint_element_results_s4[element_index]
joint_attached_nodes_s4 = selected_joint_element_s4.AttachedNodeIDs
shear_disp_s4 = selected_joint_element_s4.getResults(InterfaceResultTypes.DISPLACEMENT_SHEAR)
normal_disp_s4 = selected_joint_element_s4.getResults(InterfaceResultTypes.DISPLACEMENT_NORMAL)
print(f"Nodal results for joint element ID {selected_joint_element_s4.ElementID}:")
num_node_pairs_s4 = int(len(joint_attached_nodes_s4)/2)
for i in range(num_node_pairs_s4):
node_id = joint_attached_nodes_s4[i]
virtual_node_id = joint_attached_nodes_s4[i+num_node_pairs_s4]
nr_s4 = joint_node_by_id_s4[node_id]
shear_val = shear_disp_s4[i]
normal_val = normal_disp_s4[i]
print(
f" Node Pair {(node_id, virtual_node_id)}: (x, y, z, Relative Shear Disp., Relative Normal Disp.) = "
f"({nr_s4.XCoordinate}, {nr_s4.YCoordinate}, {nr_s4.ZCoordinate}, {shear_val}, {normal_val})"
)
# Stage 5
joint_results_stage_5 = joint_results_list[1]
joint_node_results_s5 = joint_results_stage_5.getJointNodeResults()
joint_node_by_id_s5 = {nr.NodeID: nr for nr in joint_node_results_s5}
print(f"Joint: total node results for stage 5: {len(joint_node_results_s5)}")
joint_element_results_s5 = joint_results_stage_5.getJointElementResults(region=joint_query_region)
selected_joint_element_s5 = joint_element_results_s5[element_index]
joint_attached_nodes_s5 = selected_joint_element_s5.AttachedNodeIDs
shear_disp_s5 = selected_joint_element_s5.getResults(
InterfaceResultTypes.DISPLACEMENT_SHEAR,
)
normal_disp_s5 = selected_joint_element_s5.getResults(
InterfaceResultTypes.DISPLACEMENT_NORMAL,
)
print(f"Nodal results for joint element ID {selected_joint_element_s5.ElementID}:")
num_node_pairs_s5 = int(len(joint_attached_nodes_s5)/2)
for i in range(num_node_pairs_s5):
node_id = joint_attached_nodes_s5[i]
virtual_node_id = joint_attached_nodes_s5[i+num_node_pairs_s5]
nr_s5 = joint_node_by_id_s5[node_id]
shear_val = shear_disp_s5[i]
normal_val = normal_disp_s5[i]
print(
f" Node Pair {(node_id, virtual_node_id)}: (x, y, z, Relative Shear Disp., Relative Normal Disp.) = "
f"({nr_s5.XCoordinate}, {nr_s5.YCoordinate}, {nr_s5.ZCoordinate}, {shear_val}, {normal_val})"
)
# Since accessing results doesn't change the model, close the model without saving.
model.close(False)
2026-03-13 17:10:29,993 - Rocscience.RS3 - INFO - Attempting to start the application at C:\Program Files\Rocscience\RS3\RS3 and binding server to port 60504...
Joint: total node results for stage 4: 458
Joint: element results in region for stage 4: 50
Nodal results for joint element ID 81231:
Node Pair (4948, 14880): (x, y, z, Relative Shear Disp., Relative Normal Disp.) = (25.6535873692461, 13.258816860594816, -3.552713678800501e-15, 0.00013422658477781323, 8.194546454307267e-05)
Node Pair (4949, 14881): (x, y, z, Relative Shear Disp., Relative Normal Disp.) = (25.6535873692461, 15.0, -1.7763568394002505e-15, 0.00012989772319076887, 8.430580903496631e-05)
Node Pair (4932, 14872): (x, y, z, Relative Shear Disp., Relative Normal Disp.) = (24.52229989882357, 14.12610331963225, -1.0618840689177063, 0.0001075489087358885, 8.155018914220158e-06)
Joint: total node results for stage 5: 458
Nodal results for joint element ID 81231:
Node Pair (4948, 14880): (x, y, z, Relative Shear Disp., Relative Normal Disp.) = (25.6535873692461, 13.258816860594816, -3.552713678800501e-15, 0.0005128569233693311, 0.000252546207422967)
Node Pair (4949, 14881): (x, y, z, Relative Shear Disp., Relative Normal Disp.) = (25.6535873692461, 15.0, -1.7763568394002505e-15, 0.0005480472002880548, 0.00027645215759602125)
Node Pair (4932, 14872): (x, y, z, Relative Shear Disp., Relative Normal Disp.) = (24.52229989882357, 14.12610331963225, -1.0618840689177063, 0.0004961965421816254, 0.0002630609019895012)