Rotation of one object relative to another

Hello . I'm trying to rotate one object relative to another. But it's not like it doesn't work so that when the slider changes, it's smooth.

In 1 case, I managed to make it rotate, but there it constantly adds value when the slider changes.
In 2 cases, I managed to make a smooth rotation, but for some reason it rotates relative to 0 coordinates.

Help solve the problem.

try (destroydialog Transformer) catch()
 
rollout Transformer "Transformer" width:200
(
	local nodeRoot
	local originTM = #()
	local nodeArray = #()
 
	group "Position: "
	(
		dotNetControl pos_x "System.Windows.Forms.TrackBar"  pos:[6,26] width:188 height:25
		dotNetControl pos_y "System.Windows.Forms.TrackBar"  pos:[6,53] width:188 height:25
		dotNetControl pos_z "System.Windows.Forms.TrackBar"  pos:[6,80] width:188 height:25
	)
	group "Position: "
	(
		dotNetControl rot_x "System.Windows.Forms.TrackBar"  pos:[6,138] width:188 height:25
		dotNetControl rot_y "System.Windows.Forms.TrackBar"  pos:[6,165] width:188 height:25
		dotNetControl rot_z "System.Windows.Forms.TrackBar"  pos:[6,192] width:188 height:25
	)
 
	button hold_tm_bt "Hold Transform" width:190 
	button reset_tm_bt "Zero Offset" width:190 
 
	fn transform_Relatively nodeArray node_root rot_x:0 rot_y:0 rot_z:0 = 
	(
		local obj_Trans = #()
 
		if nodeArr.count > 0 do
		(
			for i = 1 to nodeArr.count do
			(
				offset_rot = (eulerangles rot_x rot_y rot_z)
				node_trans = nodeArray[i].transform
				in coordsys (transmatrix node_root.transform.pos) nodeArray[i].rotation *= offset_rot
			)
		)
	)
 
	on rot_z MouseUp do
	(
		print "UP"
	)
 
	on  rot_z  ValueChanged val do
	( 
        nodeArray = selection as array
		Transform_Relatively nodeArray nodeRoot rot_x:rot_x.value rot_y:rot_y.value rot_z:rot_z.value
	) 
 
	on hold_tm_bt pressed do if isvalidnode (node = selection[1]) do
	(
		nodeArray = selection as array
		Transform_Relatively nodeArray nodeRoot rot_x:rot_x.value rot_y:rot_y.value rot_z:rot_y.value
	)
	on reset_tm_bt pressed do
	(
		nodeRoot = selection[1]
	)
 
)
createdialog Transformer
!REG3XP1!>
 
 
try (destroydialog Transformer) catch()
 
struct ANIM_DATA (bone_name, bone_transform)

rollout Transformer "Transformer" width:200
(
	local nodeRoot
	local originTM = #()
	local nodeArray = #()
 
	group "Position: "
	(
		 dotNetControl pos_x "System.Windows.Forms.TrackBar"  pos:[6,26] width:188 height:25
		dotNetControl pos_y "System.Windows.Forms.TrackBar"  pos:[6,53] width:188 height:25
		dotNetControl pos_z "System.Windows.Forms.TrackBar"  pos:[6,80] width:188 height:25
	)
	group "Position: "
	(
		dotNetControl rot_x "System.Windows.Forms.TrackBar"  pos:[6,138] width:188 height:25
		dotNetControl rot_y "System.Windows.Forms.TrackBar"  pos:[6,165] width:188 height:25
		dotNetControl rot_z "System.Windows.Forms.TrackBar"  pos:[6,192] width:188 height:25
	)
 
	button hold_tm_bt "Hold Transform" width:190 
	button reset_tm_bt "Zero Offset" width:190 
 
	fn transform_Relatively nodeArray originTM node_root rot_x:0 rot_y:0 rot_z:0 = 
	(
		local obj_Trans = #()
 
		if nodeArray.count > 0 do
		(
			for i = 1 to nodeArray.count do
			(
				offset_rot = (eulerangles rot_x rot_y rot_z) as matrix3
				node_trans = originTM[i]
 
				in coordsys (transmatrix node_root.transform.pos) node_trans *= offset_rot
				--in coordsys node_root ( node_trans *= offset_rot )
 
				append obj_Trans ( ANIM_DATA nodeArray[i].name node_trans )
			)
 
		)
			for data in obj_Trans do
			(
				obj = getNodeByName data.bone_name
				if obj == undefined do continue
				--add world transform
				obj.transform  = data.bone_transform
			)
 
	)
 
	on rot_z MouseDown do
	(
		originTM = #()
 
		if isvalidnode (node = selection[1]) do
		(
			nodeArray = mcBiped.sort_NodeByHeirarchy()
 
			for i = 1 to nodeArr.count do
			(
				append originTM nodeArray[i].transform
			)
		)
	)
 
	on rot_z MouseUp do
	(
		originTM = #()
		nodeArray = mcBiped.sort_NodeByHeirarchy()
 
		for i = 1 to nodeArr.count do
		(
			append originTM nodeArray[i].transform
		)
		rot_z.value = 0
	)
 
	on  rot_z  ValueChanged val do
	( 
		Transform_Relatively nodeArray originTM nodeRoot rot_x:rot_x.value rot_y:rot_y.value rot_z:rot_z.value
	) 
 
	on hold_tm_bt pressed do if isvalidnode (node = selection[1]) do
	(
		nodeArray = mcBiped.sort_NodeByHeirarchy()
 
		originTM = #()
		nodeArray = mcBiped.sort_NodeByHeirarchy()
 
		for i = 1 to nodeArr.count do
		(
			append originTM nodeArray[i].transform
		)
 
 		Transform_Relatively nodeArray originTM nodeRoot rot_x:rot_x.value rot_y:rot_y.value rot_z:45
	)
	on reset_tm_bt pressed do
	(
		nodeRoot = selection[1]
	)
 
 
)
createdialog Transformer
 
[geshifilter-code]

[/geshifilter-code]