Bryco 发表于 2008-10-27 09:38:54

读取三维旋转特性

大家好,我有一段代码,可以读回图形中块引用的旋转属性。现在我需要能够看到块引用在所有三个平面上的旋转 在WCS中,我始终将旋转特性理解为围绕XY平面中的插入点。如何读回相对于插入点的XZ和YZ旋转?

Bryco 发表于 2008-10-27 10:22:35

如果你能遵循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 发表于 2008-10-27 12:19:57

再次感谢你,Bryco,
你的代码对我来说是一个很好的开始。我将不得不把它转换成C#那样'这是我用来驱动AutoCAD的,但从那里我将看到矩阵可以做什么
对我来说,最重要的部分是将一个块的方向复制到另一个块。我在考虑提取角度并应用旋转3D,但正如你所说,我不&35;039;我不知道顺序 通过使用矩阵的旋转分量,并通过TransformBy将其应用于另一个块引用,我可能可以实现同样的效果。

Bryco 发表于 2008-10-27 17:06:19

矩阵在C语言中很容易,如果你把代码的旋转部分放到红色代码的网络部分,你应该得到一些帮助

Bryco 发表于 2008-10-27 22:27:08

在转换为C#并尝试将其应用于TransformBy之后,我最终使其工作起来,
结果表明,必须首先对生成的块矩阵进行转置或重建列才能使用TransformBy 它将完全重新创建一个块#039;如果应用于0,0,0处的未旋转块,它的位置和方向。如果不进行转置,它将执行最奇怪的操作,包括任意缩放和使块消失(可能变得很小,不确定):丑陋:
当我意识到AutoCAD帮助中的变换矩阵示例在底部行中有未使用的0,0,0,而在测试输出中是最右边的时,我注意到了差异
我想知道为什么会这样,这段代码会这样构建它(只是好奇)?

Bryco 发表于 2008-10-28 08:50:56

我个人讨厌在cad中构建矩阵的方式,我提供的代码对我来说是有意义的。我通过回溯getsubentity提供的cad矩阵发现了这一点,它提供了将子实体从blockref放回0,0 blockdef的矩阵。这与;我想要一个逆矩阵和一个转置矩阵
页: [1]
查看完整版本: 读取三维旋转特性