乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 73|回复: 5

读取三维旋转特性

[复制链接]

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2008-10-27 09:38:54 | 显示全部楼层 |阅读模式
大家好,我有一段代码,可以读回图形中块引用的旋转属性。现在我需要能够看到块引用在所有三个平面上的旋转 在WCS中,我始终将旋转特性理解为围绕XY平面中的插入点。如何读回相对于插入点的XZ和YZ旋转?
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2008-10-27 10:22:35 | 显示全部楼层
如果你能遵循matricies,我可以发布其余的代码
  1. Function BlockRefMatrix(oBref As AcadBlockReference) As Variant
  2.     Dim V, m(3, 3) As Double, M1, M2
  3.     Dim j As Integer
  4.     Dim x, y, Z, ins
  5.     Dim Rot As Double
  6.    
  7.     Rot = oBref.Rotation
  8.     Z = oBref.Normal
  9.     V = GetOcsFromNormal(Z)
  10.     x = V(0): y = V(1)
  11.     ins = oBref.InsertionPoint
  12.    
  13.     M1 = RotZ(-Rot)
  14.     For j = 0 To 2
  15.         m(0, j) = x(j)
  16.         m(1, j) = y(j)
  17.         m(2, j) = Z(j)
  18.         m(3, j) = ins(j)
  19.     Next j
  20.     m(3, 3) = 1
  21.     If Rot = 0 Then
  22.         BlockRefMatrix = m
  23.     Else
  24.         M2 = M4xM4(m, M1)
  25.         BlockRefMatrix = M2
  26.     End If
  27.    
  28.    
  29. End Function
  30. Function GetOcsFromNormal(N As Variant) As Variant
  31.     'Arbitrary Axis Algorithm in dxf help
  32.     'N is the normal vector.
  33.     'Wy is the world Y axis, which is always (0,1,0).
  34.     'Wz is the world Z axis, which is always (0,0,1).
  35.     Dim Wy(2) As Double
  36.     Dim Wz(2) As Double
  37.     Dim Nx As Double, Ny As Double
  38.     Dim Ax, Ay, Ocs(1) As Variant
  39.    
  40.     N = NormaliseVector(N)
  41.     Wy(0) = 0: Wy(1) = 1: Wy(2) = 0
  42.     Wz(0) = 0: Wz(1) = 0: Wz(2) = 1
  43.     Nx = N(0): Ny = N(1)
  44.     If (Abs(Nx)  3 Then
  45.         For I = 0 To 3
  46.              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)
  47.         Next
  48.     Else
  49.         For I = 0 To 3
  50.              Debug.Print m(I, 0), m(I, 1), m(I, 2), m(I, 3)
  51.         Next
  52.     End If
  53.    
  54. End Sub
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

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

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2008-10-27 17:06:19 | 显示全部楼层
矩阵在C语言中很容易,如果你把代码的旋转部分放到红色代码的网络部分,你应该得到一些帮助
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

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

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2008-10-28 08:50:56 | 显示全部楼层
我个人讨厌在cad中构建矩阵的方式,我提供的代码对我来说是有意义的。我通过回溯getsubentity提供的cad矩阵发现了这一点,它提供了将子实体从blockref放回0,0 blockdef的矩阵。这与;我想要一个逆矩阵和一个转置矩阵
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-7-3 18:35 , Processed in 0.861228 second(s), 76 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表