乐筑天下

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

圆范数

[复制链接]

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2007-8-2 19:21:56 | 显示全部楼层 |阅读模式

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2007-8-2 19:27:31 | 显示全部楼层
所以,要么我设置每个对象正常,要么我让世界当前,这可能是一个清洗。Mick这种情况在C#中也会发生吗?
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2007-8-2 19:38:09 | 显示全部楼层
感谢回复,
实际上,如果我将Wcs设为当前,正常就可以了(0,0,1)。
插入时,blockref也接收ucs法线,因此我正在计算旋转并保持法线不变。数学是有点棘手的(我可以看到这一切,但我似乎需要一个矩阵,所以这是不值得的),所以我想我会插入它设置法线为0,0,1,然后使用ucs矩阵转换它。这是简单的解决办法,但我不会说是最好的。
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2007-8-2 20:10:33 | 显示全部楼层
以防有人懂数学。通过将ucs xdir向量从ucs法线(x和y的叉积)转换到世界法线,然后将新的向量角度与世界x轴进行比较,可以找到旋转。
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2007-8-2 21:52:23 | 显示全部楼层
这听起来像是你需要做你在op中所说的,在wcs中创建块,然后将其xform到所需的位置,无论如何,这都是很好的做法,并保持了origin-al数学的简单性。如果你能在插入块时得到目标ucs,那将很容易 -
创建块@ origin,
获取当前的ucs(或类似)
构建矩阵与ucs
xform块并完成。
hth
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2007-8-2 22:00:57 | 显示全部楼层
好建议米克。
作为插入函数,以下工作正常,但我稍后必须更改插入点(oBref.InsertionPoint=insPt),不知道为什么。
  1. Function InsertBlockref(Space As AcadBlock, insPt As Variant, sName As String, Optional Sc As Double = 1, Optional Rot As Double = 0) As AcadBlockReference
  2.     Dim oBref As AcadBlockReference
  3.     Dim Zero(2) As Double
  4.     Dim N(2) As Double, oUcs As AcadUCS
  5.     Dim Att
  6.    
  7.     Set oBref = Space.InsertBlock(Zero, sName, Sc, Sc, Sc, Rot)
  8.     If ThisDrawing.GetVariable("Worlducs") = 1 Then
  9.         Set InsertBlockref = oBref
  10.         Exit Function
  11.     End If
  12.    
  13.     N(2) = 1
  14.     oBref.Normal = N
  15.     If oBref.HasAttributes Then
  16.         For Each Att In oBref.GetAttributes
  17.             Att.Normal = N
  18.         Next Att
  19.     End If
  20.     Set oUcs = GetActiveUcs
  21.     oBref.TransformBy oUcs.GetUCSMatrix
  22.     oBref.InsertionPoint = insPt
  23.     Set InsertBlockref = oBref
  24. End Function

和一个函数
  1. Function GetActiveUcs() As AcadUCS
  2.     Dim Origin
  3.     Dim Xaxis
  4.     Dim Yaxis
  5.     Dim strNm As String, sUcs As String
  6.     sUcs = ThisDrawing.GetVariable("UCSNAME")
  7.     If sUcs = "" Then
  8.         ' Current UCS is not saved so get the data and save it
  9.         'A ucs is saved when a user makes and saves one or
  10.         ' a user clicks on an isoview button
  11.         With ThisDrawing
  12.             If .GetVariable("WORLDUCS") = 1 Then
  13.                 Xaxis = Zero: Yaxis = Zero
  14.                 Xaxis(0) = 1: Yaxis(1) = 1
  15.                 Set GetActiveUcs = ThisDrawing.UserCoordinateSystems.Add(Zero, Xaxis, Yaxis, "World")
  16.                 Exit Function
  17.             End If
  18.             Origin = .GetVariable("UCSORG")
  19.             Xaxis = .GetVariable("UCSXDIR")
  20.             Yaxis = .GetVariable("UCSYDIR")
  21.             strNm = "Active"
  22.         End With
  23.         Set GetActiveUcs = ThisDrawing.UserCoordinateSystems.Add(Zero, Xaxis, Yaxis, strNm)
  24.         'Changing the origin later stops the error message
  25.         '-2145320930   UCS X axis and Y axis are not perpendicular
  26.         GetActiveUcs.Origin = Origin
  27.         ThisDrawing.ActiveUCS = GetActiveUcs
  28.     Else
  29.         Select Case sUcs
  30.             Case "*TOP*", "TOP"
  31.                 Set GetActiveUcs = SetOrthoUCS("Top")
  32.             Case "*BOTTOM*"
  33.                 Set GetActiveUcs = SetOrthoUCS("Bottom")
  34.             Case "*LEFT*"
  35.                 Set GetActiveUcs = SetOrthoUCS("Left")
  36.             Case "*RIGHT*"
  37.                 Set GetActiveUcs = SetOrthoUCS("Right")
  38.             Case "*FRONT*"
  39.                 Set GetActiveUcs = SetOrthoUCS("Front")
  40.             Case "*BACK*"
  41.                 Set GetActiveUcs = SetOrthoUCS("Back")
  42.             Case Else
  43.                 Set GetActiveUcs = ThisDrawing.ActiveUCS  'current UCS is saved
  44.             End Select
  45.     End If
  46. End Function

回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2007-8-2 22:20:13 | 显示全部楼层
嗨,Bryco,以为我会复活这个线程,因为我现在自己也有同样的问题,我不能一辈子知道为什么他们没有在vba中实现更多的几何类,特别是矩阵。哦,好吧...
我从上面的函数中获取它,如果没有ucs名称,即它是“”,我们将得到一个空对象ID错误,因此我们必须将当前ucs保存到ucs表中,并从那里获取它以将对象转换为当前ucs,这是对的吗?
另外,你有 SetOrthoUCS 函数吗?
谢谢,
米克。
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2007-8-3 17:03:29 | 显示全部楼层
同意Mick的观点,C#有这么多现成的好数学。
  1. Public Function SetOrthoUCS(Optional strUcs As String = "Top") As AcadUCS
  2.     Dim dOrigin(2) As Double
  3.     Dim dXaxisPnt(2) As Double
  4.     Dim dYaxisPnt(2) As Double
  5.     'all the ucs' will originate from 0,0,0 as per the behavior in acad
  6.     Select Case strUcs
  7.         Case "Top"
  8.             dXaxisPnt(0) = 1: dXaxisPnt(1) = 0: dXaxisPnt(2) = 0
  9.             dYaxisPnt(0) = 0: dYaxisPnt(1) = 1: dYaxisPnt(2) = 0
  10.       
  11.         Case "Bottom"
  12.             dXaxisPnt(0) = -1: dXaxisPnt(1) = 0: dXaxisPnt(2) = 0
  13.             dYaxisPnt(0) = 0: dYaxisPnt(1) = 1: dYaxisPnt(2) = 0
  14.         
  15.         Case "Right"
  16.             dXaxisPnt(0) = 0: dXaxisPnt(1) = 1: dXaxisPnt(2) = 0
  17.             dYaxisPnt(0) = 0: dYaxisPnt(1) = 0: dYaxisPnt(2) = 1
  18.         
  19.    
  20.         Case "Left"
  21.             dXaxisPnt(0) = 0: dXaxisPnt(1) = -1: dXaxisPnt(2) = 0
  22.             dYaxisPnt(0) = 0: dYaxisPnt(1) = 0: dYaxisPnt(2) = 1
  23.         
  24.    
  25.         Case "Front"
  26.             dXaxisPnt(0) = 1: dXaxisPnt(1) = 0: dXaxisPnt(2) = 0
  27.             dYaxisPnt(0) = 0: dYaxisPnt(1) = 0: dYaxisPnt(2) = 1
  28.    
  29.       
  30.         Case "Back"
  31.             dXaxisPnt(0) = -1: dXaxisPnt(1) = 0: dXaxisPnt(2) = 0
  32.             dYaxisPnt(0) = 0: dYaxisPnt(1) = 0: dYaxisPnt(2) = 1
  33.             
  34.         Case Else
  35.             Exit Function
  36.     End Select
  37.     Set SetOrthoUCS = ThisDrawing.UserCoordinateSystems.Add(dOrigin, dXaxisPnt, dYaxisPnt, strUcs)
  38.     ThisDrawing.ActiveUCS = SetOrthoUCS
  39. End Function

回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2008-1-2 17:47:44 | 显示全部楼层
谢谢布里科,我会给那些运行,看看它如何进行。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-5 13:05 , Processed in 0.318246 second(s), 71 queries .

© 2020-2025 乐筑天下

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