I'm still not quite sure what you are doing, but here is the rest.
Yes this gives both a transformation and a rotation in x,y & z
If you have your immediatewindow up (ctrl+G) you will see the matrix print out (the way I like it printed out)
I think you will find what you need, I'm not sure how to translate them directly into angles as the order is important
Option Explicit
Sub TEST()
Dim b As AcadBlockReference, ent As AcadEntity, V, m
ThisDrawing.Utility.GetEntity ent, V, "Pick"
If ent Is Nothing Then Exit Sub
If Not TypeOf ent Is AcadBlockReference Then Exit Sub
Set b = ent
m = BlockRefMatrix(b)
PrintM m
End Sub
Function RotZ(ang As Double) As Variant
'Rotate by an angle around the z axis
Dim m
Dim CosAng As Double, sinAng As Double
CosAng = Cos(ang): sinAng = Sin(ang)
m = IDMatrix
m(0, 0) = CosAng
m(0, 1) = -sinAng
m(1, 0) = sinAng
m(1, 1) = CosAng
RotZ = m
End Function
Function M4xM4(M1, M2) As Variant
'Matrix x matrix
Dim m(3, 3) As Double
Dim I As Integer, j As Integer
Dim k As Integer
Dim Sum As Double
For I = 0 To 3
For j = 0 To 3
For k = 0 To 3
Sum = Sum + M1(k, j) * M2(I, k)
Next k
m(I, j) = Sum
Sum = 0
Next j
Next I
M4xM4 = m
End Function
Function NormaliseVector(V As Variant) As Variant
Dim Unit As Double
Dim Vn(2) As Double
Unit = Sqr(V(0) * V(0) + V(1) * V(1) + V(2) * V(2))
Vn(0) = V(0) / Unit: Vn(1) = V(1) / Unit: Vn(2) = V(2) / Unit
NormaliseVector = Vn
End Function
Function Crossproduct(a, b) As Variant
Dim Ax As Double, Ay As Double, Az As Double
Dim Bx As Double, By As Double, Bz As Double
Dim Unit As Double
Dim c(2) As Double
'get CrossProduct
Ax = a(0): Ay = a(1): Az = a(2)
Bx = b(0): By = b(1): Bz = b(2)
c(0) = Ay * Bz - Az * By
c(1) = Az * Bx - Ax * Bz
c(2) = Ax * By - Ay * Bx
'Convert to unit normal
Unit = Sqr(c(0) * c(0) + c(1) * c(1) + c(2) * c(2))
c(0) = c(0) / Unit: c(1) = c(1) / Unit: c(2) = c(2) / Unit
Crossproduct = c
End Function
Function IDMatrix()
Dim m(3, 3) As Double
Dim I As Integer, j As Integer
m(0, 0) = 1
m(1, 1) = 1
m(2, 2) = 1
m(3, 3) = 1
IDMatrix = m
End Function
Sub PrintM(m)
Dim I As Integer
Dim j As Integer
Debug.Print
If UBound(m, 2) > 3 Then
For I = 0 To 3
Debug.Print m(I, 0), m(I, 1), m(I, 2), m(I, 3), m(I, 4), m(I, 5), m(I, 6), m(I, 7)
Next
Else
For I = 0 To 3
Debug.Print m(I, 0), m(I, 1), m(I, 2), m(I, 3)
Next
End If
End Sub