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 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
| 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 k As Double x(0) = viewMatrix.ArrayData(0) x(1) = viewMatrix.ArrayData(1) x(2) = viewMatrix.ArrayData(2) y(0) = viewMatrix.ArrayData(3) y(1) = viewMatrix.ArrayData(4) y(2) = viewMatrix.ArrayData(5) z(0) = viewMatrix.ArrayData(6) z(1) = viewMatrix.ArrayData(7) z(2) = viewMatrix.ArrayData(8) If viewMatrix.ArrayData(0) * viewMatrix.ArrayData(3) * viewMatrix.ArrayData(6) = 0 Then Debug.Print "No Need to Rotate" End End If Dim x_alpha As Double Dim y_alpha As Double Dim z_alpha As Double x_alpha = Arcsin(Abs_v(Dot(x, Array(1, 0, 0)))) y_alpha = Arcsin(Abs_v(Dot(y, Array(1, 0, 0)))) z_alpha = Arcsin(Abs_v(Dot(z, Array(1, 0, 0)))) Debug.Print Chr(10) & "Angle Between the Vector And the YZ Plane:", x_alpha, y_alpha, z_alpha If x_alpha < y_alpha And x_alpha < z_alpha Then Debug.Print "X Rotation Angel: " & x_alpha x(0) = 0 x(1) = x(1) / Sqrt(x(1) ^ 2 + x(2) ^ 2) x(2) = x(2) / Sqrt(x(1) ^ 2 + x(2) ^ 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)
y(0) = Rodrigues(Array(viewMatrix.ArrayData(3), viewMatrix.ArrayData(4), viewMatrix.ArrayData(5)), ar, x_alpha)(0) y(1) = Rodrigues(Array(viewMatrix.ArrayData(3), viewMatrix.ArrayData(4), viewMatrix.ArrayData(5)), ar, x_alpha)(1) y(2) = Rodrigues(Array(viewMatrix.ArrayData(3), viewMatrix.ArrayData(4), viewMatrix.ArrayData(5)), ar, x_alpha)(2) z(0) = Rodrigues(Array(viewMatrix.ArrayData(6), viewMatrix.ArrayData(7), viewMatrix.ArrayData(8)), ar, x_alpha)(0) z(1) = Rodrigues(Array(viewMatrix.ArrayData(6), viewMatrix.ArrayData(7), viewMatrix.ArrayData(8)), ar, x_alpha)(1) z(2) = Rodrigues(Array(viewMatrix.ArrayData(6), viewMatrix.ArrayData(7), viewMatrix.ArrayData(8)), ar, x_alpha)(2) ElseIf y_alpha < x_alpha And y_alpha < z_alpha Then Debug.Print "Y Rotation Angel: " & y_alpha y(0) = 0 y(1) = y(1) / Sqrt(y(1) ^ 2 + y(2) ^ 2) y(2) = y(2) / Sqrt(y(1) ^ 2 + y(2) ^ 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)
x(0) = Rodrigues(Array(viewMatrix.ArrayData(0), viewMatrix.ArrayData(1), viewMatrix.ArrayData(2)), ar, y_alpha)(0) x(1) = Rodrigues(Array(viewMatrix.ArrayData(0), viewMatrix.ArrayData(1), viewMatrix.ArrayData(2)), ar, y_alpha)(1) x(2) = Rodrigues(Array(viewMatrix.ArrayData(0), viewMatrix.ArrayData(1), viewMatrix.ArrayData(2)), ar, y_alpha)(2) z(0) = Rodrigues(Array(viewMatrix.ArrayData(6), viewMatrix.ArrayData(7), viewMatrix.ArrayData(8)), ar, y_alpha)(0) z(1) = Rodrigues(Array(viewMatrix.ArrayData(6), viewMatrix.ArrayData(7), viewMatrix.ArrayData(8)), ar, y_alpha)(1) z(2) = Rodrigues(Array(viewMatrix.ArrayData(6), viewMatrix.ArrayData(7), viewMatrix.ArrayData(8)), ar, y_alpha)(2) Else Debug.Print "Z Rotation Angel: " & z_alpha z(0) = 0 z(1) = z(1) / Sqrt(z(1) ^ 2 + z(2) ^ 2) z(2) = z(2) / Sqrt(z(1) ^ 2 + z(2) ^ 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)
x(0) = Rodrigues(Array(viewMatrix.ArrayData(0), viewMatrix.ArrayData(1), viewMatrix.ArrayData(2)), ar, z_alpha)(0) x(1) = Rodrigues(Array(viewMatrix.ArrayData(0), viewMatrix.ArrayData(1), viewMatrix.ArrayData(2)), ar, z_alpha)(1) x(2) = Rodrigues(Array(viewMatrix.ArrayData(0), viewMatrix.ArrayData(1), viewMatrix.ArrayData(2)), ar, z_alpha)(2) y(0) = Rodrigues(Array(viewMatrix.ArrayData(3), viewMatrix.ArrayData(4), viewMatrix.ArrayData(5)), ar, z_alpha)(0) y(1) = Rodrigues(Array(viewMatrix.ArrayData(3), viewMatrix.ArrayData(4), viewMatrix.ArrayData(5)), ar, z_alpha)(1) y(2) = Rodrigues(Array(viewMatrix.ArrayData(3), viewMatrix.ArrayData(4), viewMatrix.ArrayData(5)), ar, z_alpha)(2) End If
Debug.Print Chr(10) & "Rotation Axis: ", ar(0), ar(1), ar(2) 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
Function Abs_v(v As Variant) As Double
Abs_v = Sqrt(v(0) ^ 2 + v(1) ^ 2 + v(2) ^ 2)
End Function
|