from Rhino import *
import System
import clr
import rhinoscriptsyntax as rs
import scriptcontext as sc
import Rhino
import math
from math import atan2, degrees, pi


def ResetBlockZRotation():
    #f will be added to the angle result value
    # f=0 origin at 9 oclock,  f=-90 if origin at 12 oclock, -180 origin at 3 oclock, etc
    f = 0
    block = rs.GetObject('Block Instance ?', 4096, True)
    #delete dots and place new dots with block rotation along Z value
    r = DecomposeXformRotation(rs.BlockInstanceXform(block))
    v = Round(r(2) *  ( 180 /  ( 4 * Atn(1) ) ), 0) + f
    #Minus sign at 180 if clockwise
    if v < 0:
        v = v + 360
    rs.RotateObject(block, Rhino.BlockInstanceInsertPoint(block), v, False)
    Print("Block rotation reset to zero")

def DecomposeXformRotation(arrXform):
    _ret = None
    arrRotate[0] = Rhino.ATan2(- arrXform(2, 1), arrXform(2, 2))
    arrRotate[1] = Rhino.ASin(arrXform(2, 0))
    arrRotate[2] = Rhino.ATan2(arrXform(1, 0), arrXform(0, 0))
    _ret = arrRotate
    return _ret

# VB2PY (UntranslatedCode) Option Explicit
ResetBlockZRotation()