读取三维旋转特性
大家好,我有一段代码,可以读回图形中块引用的旋转属性。现在我需要能够看到块引用在所有三个平面上的旋转 ;在WCS中,我始终将旋转特性理解为围绕XY平面中的插入点。如何读回相对于插入点的XZ和YZ旋转?如果你能遵循matricies,我可以发布其余的代码Function BlockRefMatrix(oBref As AcadBlockReference) As Variant
Dim V, m(3, 3) As Double, M1, M2
Dim j As Integer
Dim x, y, Z, ins
Dim Rot As Double
Rot = oBref.Rotation
Z = oBref.Normal
V = GetOcsFromNormal(Z)
x = V(0): y = V(1)
ins = oBref.InsertionPoint
M1 = RotZ(-Rot)
For j = 0 To 2
m(0, j) = x(j)
m(1, j) = y(j)
m(2, j) = Z(j)
m(3, j) = ins(j)
Next j
m(3, 3) = 1
If Rot = 0 Then
BlockRefMatrix = m
Else
M2 = M4xM4(m, M1)
BlockRefMatrix = M2
End If
End Function
Function GetOcsFromNormal(N As Variant) As Variant
'Arbitrary Axis Algorithm in dxf help
'N is the normal vector.
'Wy is the world Y axis, which is always (0,1,0).
'Wz is the world Z axis, which is always (0,0,1).
Dim Wy(2) As Double
Dim Wz(2) As Double
Dim Nx As Double, Ny As Double
Dim Ax, Ay, Ocs(1) As Variant
N = NormaliseVector(N)
Wy(0) = 0: Wy(1) = 1: Wy(2) = 0
Wz(0) = 0: Wz(1) = 0: Wz(2) = 1
Nx = N(0): Ny = N(1)
If (Abs(Nx)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
再次感谢你,Bryco,
你的代码对我来说是一个很好的开始。我将不得不把它转换成C#那样';这是我用来驱动AutoCAD的,但从那里我将看到矩阵可以做什么
对我来说,最重要的部分是将一个块的方向复制到另一个块。我在考虑提取角度并应用旋转3D,但正如你所说,我不&35;039;我不知道顺序 ;通过使用矩阵的旋转分量,并通过TransformBy将其应用于另一个块引用,我可能可以实现同样的效果。 矩阵在C语言中很容易,如果你把代码的旋转部分放到红色代码的网络部分,你应该得到一些帮助 在转换为C#并尝试将其应用于TransformBy之后,我最终使其工作起来,
结果表明,必须首先对生成的块矩阵进行转置或重建列才能使用TransformBy ;它将完全重新创建一个块#039;如果应用于0,0,0处的未旋转块,它的位置和方向。如果不进行转置,它将执行最奇怪的操作,包括任意缩放和使块消失(可能变得很小,不确定):丑陋:
当我意识到AutoCAD帮助中的变换矩阵示例在底部行中有未使用的0,0,0,而在测试输出中是最右边的时,我注意到了差异
我想知道为什么会这样,这段代码会这样构建它(只是好奇)? 我个人讨厌在cad中构建矩阵的方式,我提供的代码对我来说是有意义的。我通过回溯getsubentity提供的cad矩阵发现了这一点,它提供了将子实体从blockref放回0,0 blockdef的矩阵。这与;我想要一个逆矩阵和一个转置矩阵
页:
[1]