1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
| Option Explicit
Sub Main() Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swModelView As SldWorks.ModelView Dim viewMatrix As SldWorks.MathTransform Dim i As Integer
Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc Set swModelView = swModel.ActiveView
Set viewMatrix = swModelView.Orientation3 Debug.Print "Orignal Orientation Martrix: " For i = 0 To 9 Step 3 Debug.Print viewMatrix.ArrayData(i), viewMatrix.ArrayData(i + 1), viewMatrix.ArrayData(i + 2), viewMatrix.ArrayData(i / 3 + 12) Next i
Dim x(2) As Variant Dim y(2) As Variant Dim z(2) As Variant Dim ar(2) As Variant Dim alpha As Double Dim k As Single If viewMatrix.ArrayData(0) * viewMatrix.ArrayData(3) * viewMatrix.ArrayData(6) = 0 Then Debug.Print "No Need to Rotate" End ElseIf Abs(viewMatrix.ArrayData(0)) < Abs(viewMatrix.ArrayData(3)) And Abs(viewMatrix.ArrayData(0)) < Abs(viewMatrix.ArrayData(6)) Then x(0) = 0 x(1) = viewMatrix.ArrayData(1) x(2) = IIf(viewMatrix.ArrayData(2) > 0, Sqrt(1 - viewMatrix.ArrayData(1) ^ 2), -Sqrt(1 - viewMatrix.ArrayData(1) ^ 2))
ar(0) = Cross(Array(viewMatrix.ArrayData(0), viewMatrix.ArrayData(1), viewMatrix.ArrayData(2)), x)(0) ar(1) = Cross(Array(viewMatrix.ArrayData(0), viewMatrix.ArrayData(1), viewMatrix.ArrayData(2)), x)(1) ar(2) = Cross(Array(viewMatrix.ArrayData(0), viewMatrix.ArrayData(1), viewMatrix.ArrayData(2)), x)(2) k = 1 / Sqrt(ar(0) ^ 2 + ar(1) ^ 2 + ar(2) ^ 2) ar(0) = Array(ar(0) * k, ar(1) * k, ar(2) * k)(0) ar(1) = Array(ar(0) * k, ar(1) * k, ar(2) * k)(1) ar(2) = Array(ar(0) * k, ar(1) * k, ar(2) * k)(2)
alpha = Arccos(x(1) ^ 2 + viewMatrix.ArrayData(3) * x(2))
y(0) = Rodrigues(Array(viewMatrix.ArrayData(3), viewMatrix.ArrayData(4), viewMatrix.ArrayData(5)), ar, alpha)(0) y(1) = Rodrigues(Array(viewMatrix.ArrayData(3), viewMatrix.ArrayData(4), viewMatrix.ArrayData(5)), ar, alpha)(1) y(2) = Rodrigues(Array(viewMatrix.ArrayData(3), viewMatrix.ArrayData(4), viewMatrix.ArrayData(5)), ar, alpha)(2) z(0) = Rodrigues(Array(viewMatrix.ArrayData(6), viewMatrix.ArrayData(7), viewMatrix.ArrayData(8)), ar, alpha)(0) z(1) = Rodrigues(Array(viewMatrix.ArrayData(6), viewMatrix.ArrayData(7), viewMatrix.ArrayData(8)), ar, alpha)(1) z(2) = Rodrigues(Array(viewMatrix.ArrayData(6), viewMatrix.ArrayData(7), viewMatrix.ArrayData(8)), ar, alpha)(2) ElseIf Abs(viewMatrix.ArrayData(3)) < Abs(viewMatrix.ArrayData(0)) And Abs(viewMatrix.ArrayData(3)) < Abs(viewMatrix.ArrayData(6)) Then y(0) = 0 y(1) = viewMatrix.ArrayData(4) y(2) = IIf(viewMatrix.ArrayData(5) > 0, Sqrt(1 - viewMatrix.ArrayData(4) ^ 2), -Sqrt(1 - viewMatrix.ArrayData(4) ^ 2))
ar(0) = Cross(Array(viewMatrix.ArrayData(3), viewMatrix.ArrayData(4), viewMatrix.ArrayData(5)), y)(0) ar(1) = Cross(Array(viewMatrix.ArrayData(3), viewMatrix.ArrayData(4), viewMatrix.ArrayData(5)), y)(1) ar(2) = Cross(Array(viewMatrix.ArrayData(3), viewMatrix.ArrayData(4), viewMatrix.ArrayData(5)), y)(2)
k = 1 / Sqrt(ar(0) ^ 2 + ar(1) ^ 2 + ar(2) ^ 2) ar(0) = Array(ar(0) * k, ar(1) * k, ar(2) * k)(0) ar(1) = Array(ar(0) * k, ar(1) * k, ar(2) * k)(1) ar(2) = Array(ar(0) * k, ar(1) * k, ar(2) * k)(2)
alpha = Arccos(y(1) ^ 2 + viewMatrix.ArrayData(5) * y(2))
x(0) = Rodrigues(Array(viewMatrix.ArrayData(0), viewMatrix.ArrayData(1), viewMatrix.ArrayData(2)), ar, alpha)(0) x(1) = Rodrigues(Array(viewMatrix.ArrayData(0), viewMatrix.ArrayData(1), viewMatrix.ArrayData(2)), ar, alpha)(1) x(2) = Rodrigues(Array(viewMatrix.ArrayData(0), viewMatrix.ArrayData(1), viewMatrix.ArrayData(2)), ar, alpha)(2) z(0) = Rodrigues(Array(viewMatrix.ArrayData(6), viewMatrix.ArrayData(7), viewMatrix.ArrayData(8)), ar, alpha)(0) z(1) = Rodrigues(Array(viewMatrix.ArrayData(6), viewMatrix.ArrayData(7), viewMatrix.ArrayData(8)), ar, alpha)(1) z(2) = Rodrigues(Array(viewMatrix.ArrayData(6), viewMatrix.ArrayData(7), viewMatrix.ArrayData(8)), ar, alpha)(2) Else z(0) = 0 z(1) = viewMatrix.ArrayData(7) z(2) = IIf(viewMatrix.ArrayData(8) > 0, Sqrt(1 - viewMatrix.ArrayData(7) ^ 2), -Sqrt(1 - viewMatrix.ArrayData(7) ^ 2))
ar(0) = Cross(Array(viewMatrix.ArrayData(6), viewMatrix.ArrayData(7), viewMatrix.ArrayData(8)), z)(0)
k = 1 / Sqrt(ar(0) ^ 2 + ar(1) ^ 2 + ar(2) ^ 2) ar(0) = Array(ar(0) * k, ar(1) * k, ar(2) * k)(0) ar(1) = Array(ar(0) * k, ar(1) * k, ar(2) * k)(1) ar(2) = Array(ar(0) * k, ar(1) * k, ar(2) * k)(2)
alpha = Arccos(z(1) ^ 2 + viewMatrix.ArrayData(8) * z(2))
x(0) = Rodrigues(Array(viewMatrix.ArrayData(0), viewMatrix.ArrayData(1), viewMatrix.ArrayData(2)), ar, alpha)(0) x(1) = Rodrigues(Array(viewMatrix.ArrayData(0), viewMatrix.ArrayData(1), viewMatrix.ArrayData(2)), ar, alpha)(1) x(2) = Rodrigues(Array(viewMatrix.ArrayData(0), viewMatrix.ArrayData(1), viewMatrix.ArrayData(2)), ar, alpha)(2) y(0) = Rodrigues(Array(viewMatrix.ArrayData(3), viewMatrix.ArrayData(4), viewMatrix.ArrayData(5)), ar, alpha)(0) y(1) = Rodrigues(Array(viewMatrix.ArrayData(3), viewMatrix.ArrayData(4), viewMatrix.ArrayData(5)), ar, alpha)(1) y(2) = Rodrigues(Array(viewMatrix.ArrayData(3), viewMatrix.ArrayData(4), viewMatrix.ArrayData(5)), ar, alpha)(2) End If
Debug.Print Chr(10) & "Rotation Axis: ", ar(0), ar(1), ar(2) Debug.Print "Rotation Angel: " & alpha Debug.Print Chr(10) & "New Orientation Martrix: " Debug.Print x(0), x(1), x(2) Debug.Print y(0), y(1), y(2) Debug.Print z(0), z(1), z(2)
Dim rotationArray(15) As Double rotationArray(0) = x(0): rotationArray(1) = x(1): rotationArray(2) = x(2): rotationArray(12) = 1 rotationArray(3) = y(0): rotationArray(4) = y(1): rotationArray(5) = y(2): rotationArray(13) = 0 rotationArray(6) = z(0): rotationArray(7) = z(1): rotationArray(8) = z(2): rotationArray(14) = 0 rotationArray(9) = viewMatrix.ArrayData(9): rotationArray(10) = viewMatrix.ArrayData(10): rotationArray(11) = viewMatrix.ArrayData(11): rotationArray(15) = 0
Dim swMathUtil As SldWorks.MathUtility Dim swTransform As SldWorks.MathTransform Set swMathUtil = swApp.GetMathUtility Set swTransform = swMathUtil.CreateTransform(rotationArray) swModelView.Orientation3 = swTransform swModel.GraphicsRedraw2
End Sub
Function Rodrigues(m As Variant, n As Variant, alpha As Double) As Variant
Rodrigues = Array(m(0) * Cos(alpha) + Sin(alpha) * Cross(n, m)(0) + (1 - Cos(alpha)) * Dot(n, Dot(n, m))(0), m(1) * Cos(alpha) + Sin(alpha) * Cross(n, m)(1) + (1 - Cos(alpha)) * Dot(n, Dot(n, m))(1), m(2) * Cos(alpha) + Sin(alpha) * Cross(n, m)(2) + (1 - Cos(alpha)) * Dot(n, Dot(n, m))(2))
End Function
Function Cross(m As Variant, n As Variant) As Variant
Cross = Array(m(1) * n(2) - m(2) * n(1), m(2) * n(0) - m(0) * n(2), m(0) * n(1) - m(1) * n(0))
End Function
Function Dot(m As Variant, n As Variant) As Variant
Dot = Array(m(0) * n(0), m(1) * n(1), m(2) * n(2))
End Function
|