乐筑天下

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

带视口扭角的translate词&lt&燃气轮机;0

[复制链接]

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2006-7-15 14:30:52 | 显示全部楼层 |阅读模式
我在另一个网站上看到了一个有趣的问题
想法是在纸空间中选取一个点,并将该点转换为模型空间
在2d环境中,似乎1)将点从图纸空间转换到模型空间
2)通过减去视口扭角将其旋转约0,0
测试I'首先,在模型空间中绘制一个带有世界ucs和俯视图的矩形
Paperspace有一个视口,具有使用ucs、Z、45实现的扭曲视图;计划;键入命令
我们并不是想找出一个扭曲的模型空间
这里有几个测试子
  1. Sub MsPoint1()
  2.     Dim VP As Variant
  3.     Dim Po As AcadPoint
  4.     Dim oDoc As AcadDocument
  5.     Dim oUtil As AcadUtility
  6.     Dim Zero(2) As Double
  7.     Dim oCirc As AcadCircle
  8.     Dim Pv As AcadPViewport
  9.     Dim vTP As Variant
  10.    
  11.     Set oDoc = ThisDrawing
  12.     Set oUtil = oDoc.Utility
  13.     ThisDrawing.ActiveSpace = acPaperSpace
  14.     oDoc.MSpace = False
  15.    
  16.     Set Pv = ThisDrawing.PaperSpace(1)
  17.     VP = oUtil.GetPoint(, "Pick point in paperspace")
  18.     Debug.Print Pv.TwistAngle, Pv.TwistAngle * 180 / Pi
  19.     Set Po = ThisDrawing.PaperSpace.AddPoint(VP)
  20.     vTP = oUtil.TranslateCoordinates(VP, acPaperSpaceDCS, acDisplayDCS, False)
  21.     vTP = oUtil.TranslateCoordinates(vTP, acDisplayDCS, acWorld, False)
  22.    
  23.     Set oCirc = oDoc.ModelSpace.AddCircle(vTP, 1)
  24.     oCirc.Copy
  25.     oCirc.Rotate Zero, -Pv.TwistAngle
  26.     oCirc.color = acBlue
  27. End Sub
这个测试首先是在纸空间中测试旋转;除非取消注释,否则无法工作
  1. Sub MsPoint2()
  2.     Dim VP As Variant
  3.     Dim Po As AcadPoint
  4.     Dim oDoc As AcadDocument
  5.     Dim oUtil As AcadUtility
  6.     Dim Zero(2) As Double
  7.     Dim Pzero
  8.     Dim oCirc As AcadCircle
  9.     Dim Pv As AcadPViewport
  10.     Dim vTP As Variant
  11.    
  12.     Set oDoc = ThisDrawing
  13.     Set oUtil = oDoc.Utility
  14.     ThisDrawing.ActiveSpace = acPaperSpace
  15.     oDoc.MSpace = False
  16.    
  17.     Set Pv = ThisDrawing.PaperSpace(1)
  18.     Pzero = Zero
  19.     VP = oUtil.GetPoint(, "Pick point in paperspace")
  20.     Debug.Print Pv.TwistAngle, Pv.TwistAngle * 180 / Pi
  21.     Set Po = ThisDrawing.PaperSpace.AddPoint(VP)
  22.     Set Po = ThisDrawing.PaperSpace.AddPoint(Zero)
  23.    
  24.     'Pzero = oUtil.TranslateCoordinates(Zero, acWorld, acDisplayDCS, False)
  25.     'Pzero = oUtil.TranslateCoordinates(Pzero, acDisplayDCS, acPaperSpaceDCS, False)
  26.     'Set Po = ThisDrawing.PaperSpace.AddPoint(Pzero)
  27.     'Po.color = acMagenta
  28.    
  29.     Set Po = ThisDrawing.PaperSpace.AddPoint(VP)
  30.     Po.Rotate Pzero, -Pv.TwistAngle
  31.     VP = Po.Coordinates
  32.     vTP = oUtil.TranslateCoordinates(VP, acPaperSpaceDCS, acDisplayDCS, False)
  33.     vTP = oUtil.TranslateCoordinates(vTP, acDisplayDCS, acWorld, False)
  34.    
  35.     Set oCirc = oDoc.ModelSpace.AddCircle(vTP, 1)
  36.     oCirc.color = acGreen
  37. End Sub

回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2006-7-15 14:44:58 | 显示全部楼层
现在把它用于3d,我几乎没有成功,我想知道是否有什么是正确的
在视口中,点击topview重置ucs;x->90然后计划
这将为您提供一个pviewport;有;没有扭曲
运行MsPoint1,你会看到平移坐标没有给出正确的点,所以I'我现在有点不知所措
;在编写了自己版本的getentity之后,我意识到getentity并不't给你实际的点,这肯定会与捕捉对象上的点有关,但我看不出它在一个简单的翻译中是如何起作用的
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2006-7-15 16:39:22 | 显示全部楼层
情况变得更糟了
当您拾取一个点时,活动ucs似乎是视口ucs的ucs
所以平移坐标转换为ucs。由于纸张空间是二维的,因此需要沿viewdir平移到拾取的对象,以找到真实世界的坐标
此子模块开始工作(直到您转到模型空间)
  1. Sub MsPoint1a()
  2.     Dim VP As Variant
  3.     Dim Po As AcadPoint
  4.     Dim oDoc As AcadDocument
  5.     Dim oUtil As AcadUtility
  6.     Dim Zero(2) As Double
  7.     Dim oCirc As AcadCircle
  8.     Dim Pv As AcadPViewport
  9.     Dim vTP As Variant
  10.     Dim UcsMspace As AcadUCS
  11.     Dim UcsModelspace As AcadUCS
  12.    
  13.     Set oDoc = ThisDrawing
  14.     Set oUtil = oDoc.Utility
  15.     ThisDrawing.ActiveSpace = acPaperSpace
  16.     oDoc.MSpace = False
  17.    
  18.     Set Pv = ThisDrawing.PaperSpace(1)
  19.     VP = oUtil.GetPoint(, "Pick point in paperspace")
  20.     Set Po = ThisDrawing.PaperSpace.AddPoint(VP)
  21.     vTP = oUtil.TranslateCoordinates(VP, acPaperSpaceDCS, acDisplayDCS, False)
  22.     oDoc.MSpace = True
  23.     vTP = oUtil.TranslateCoordinates(vTP, acDisplayDCS, acUCS, False)
  24.     vTP = oUtil.TranslateCoordinates(vTP, acUCS, acWorld, False)
  25.     Set oCirc = oDoc.ModelSpace.AddCircle(vTP, 1)
  26.     oCirc.Copy
  27.     oCirc.Rotate Zero, -Pv.TwistAngle
  28.     oCirc.color = acBlue
  29. End Sub
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2006-7-15 19:53:57 | 显示全部楼层
我有它,现在它#039;它走了,不管怎样都能用
  1. Option Explicit
  2. Private Declare Function GetCursor Lib "user32" () As Long
  3. Private Declare Function GetWindowRect Lib "user32.dll" (ByVal hwnd As Long, lpRect As RECT) As Long
  4. Private Type RECT
  5.     Left As Long
  6.     Top As Long
  7.     Right As Long
  8.     Bottom As Long
  9. End Type
  10. Function ConvertPaperSpacePtToModelspace(Pt As Variant, Vp As AcadPViewport)
  11.     Dim oDoc As AcadDocument
  12.     Dim oUtil As AcadUtility
  13.     Dim Ent As AcadEntity
  14.     Dim oPt As AcadPoint
  15.     Dim Zero(2) As Double
  16.     Set oDoc = ThisDrawing
  17.     Set oUtil = oDoc.Utility
  18.     Pt = oUtil.TranslateCoordinates(Pt, acPaperSpaceDCS, acDisplayDCS, False)
  19.     ThisDrawing.MSpace = True
  20.     Pt = oUtil.TranslateCoordinates(Pt, acDisplayDCS, acWorld, False)
  21.    
  22.     Set Ent = SelectAtPt(, , Pt)
  23.     Pt = PickPtToEnt(Ent, Pt)
  24.    
  25.     Set oPt = oDoc.ModelSpace.AddPoint(Pt)
  26.     'oPt.Rotate Zero, -Vp.TwistAngle
  27.     oPt.color = acRed
  28.     oDoc.MSpace = False
  29. End Function
  30. Sub TestMsPoint()
  31.     Dim Vpt As Variant
  32.     Dim oDoc As AcadDocument
  33.     Dim oUtil As AcadUtility
  34.     Dim Pv As AcadPViewport
  35.     Set oDoc = ThisDrawing
  36.     Set oUtil = oDoc.Utility
  37.     ThisDrawing.ActiveSpace = acPaperSpace
  38.     oDoc.MSpace = False
  39.    
  40.     Set Pv = ThisDrawing.PaperSpace(1)
  41.     Vpt = oUtil.GetPoint(, "Pick point in paperspace")
  42.    
  43.     ConvertPaperSpacePtToModelspace Vpt, Pv
  44. End Sub
和一些函数
  1. Private Function PickPtToEnt(Ent As AcadEntity, v) As Variant
  2.     Dim Dir, N
  3.     Dim newV(2) As Double
  4.     Dim Dist As Double
  5.     Dim dOrigin As Variant
  6.     Dim Z As Double, Pt
  7.    
  8.     N = Ent.Normal
  9.     Dir = ToWcs(ThisDrawing.GetVariable("viewdir")) '''
  10.     If TypeOf Ent Is AcadLWPolyline Then
  11.         Z = Ent.Elevation
  12.     Else
  13.         Pt = Ent.Center
  14.         Z = (Pt(0) * N(0)) + (Pt(1) * N(1)) + (Pt(2) * N(2))
  15.     End If
  16.     Dir = SubtractVectors(Dir, ThisDrawing.GetVariable("ucsorg"))
  17.     Dist = (Z - (v(0) * N(0)) - (v(1) * N(1)) - (v(2) * N(2))) _
  18.                         / ((Dir(0) * N(0)) + (Dir(1) * N(1)) + (Dir(2) * N(2)))
  19.     newV(0) = v(0) + Dist * Dir(0)
  20.     newV(1) = v(1) + Dist * Dir(1)
  21.     newV(2) = v(2) + Dist * Dir(2)
  22.     PickPtToEnt = newV
  23. ThisDrawing.ModelSpace.AddPoint newV
  24. End Function
  25. Function ToWcs(Pt As Variant) As Variant
  26.     ToWcs = ThisDrawing.Utility.TranslateCoordinates(Pt, acUCS, acWorld, False)
  27. End Function
  28. Function SubtractVectors(V1, V2) As Variant
  29.     Dim V3(2) As Double
  30.     V3(0) = V1(0) - V2(0)
  31.     V3(1) = V1(1) - V2(1)
  32.     V3(2) = V1(2) - V2(2)
  33.     SubtractVectors = V3
  34. End Function
  35. Public Function SelectAtPt(Optional ObType As String, Optional msg As String = "Pick:", Optional varPick As Variant, _
  36.    Optional ssName As String = "SS") As AcadEntity
  37.     'ObType="LWPolyline" or "Circle","Line","Insert","Viewport"
  38.    
  39.     Dim oSSet As AcadSelectionSet
  40.     Dim oSSets As AcadSelectionSets
  41.     Dim Pt1(2) As Double, Pt2(2) As Double
  42.     Dim FType(0) As Integer
  43.     Dim FData(0) As Variant
  44.     Dim i As Integer, x
  45.     FType(0) = 0
  46.     FData(0) = ObType
  47.     If IsMissing(varPick) Then
  48.         'varPick = GetPointEX(, msg)
  49.         varPick = ThisDrawing.Utility.GetPoint(, msg)
  50.     End If
  51.     If IsEmpty(varPick) Then Exit Function ''''''''''''''''
  52.     x = CursorSelection(varPick)
  53.     For i = 0 To 2
  54.         Pt1(i) = x(i)
  55.         Pt2(i) = x(i + 3)
  56.     Next
  57.     Set oSSets = ThisDrawing.SelectionSets
  58.     DeleteSelectionSet ssName
  59.     Set oSSet = oSSets.Add(ssName)
  60.     If ObType = "" Then
  61.         oSSet.Select acSelectionSetCrossing, Pt1, Pt2
  62.     Else
  63.         oSSet.Select acSelectionSetCrossing, Pt1, Pt2, FilterType:=FType, FilterData:=FData
  64.     End If
  65.     Select Case oSSet.Count
  66.     Case 0
  67.     Case 1
  68.         Set SelectAtPt = oSSet(0)
  69.     Case Else
  70.         oSSet.Highlight True
  71.    End Select
  72.     oSSet.Delete
  73. End Function
  74. 'CCP Jan 8 2004 Revised April 3 2004  by Troy Williams
  75. Public Function CursorSelection(varPick As Variant)
  76.     If IsEmpty(varPick) Then Exit Function ''''''''''''''''
  77.     'varpick comes in as a wcs value
  78.     Dim dStart(0 To 2) As Double
  79.     Dim dEnd(0 To 2) As Double
  80.     Dim vTemp As Variant
  81.     Dim pts(5) As Double
  82.     Dim R As RECT  ' receives window rectangle in pixels
  83.     Dim RetVal As Long  ' return value
  84.     Dim pixelHeight As Double
  85.     Dim dblDist As Double
  86.    
  87.     RetVal = GetWindowRect(ThisDrawing.hwnd, R)
  88.     pixelHeight = R.Bottom - R.Top
  89.     dblDist = (ThisDrawing.GetVariable("pickbox") / pixelHeight) * ThisDrawing.GetVariable("viewsize")
  90.     dblDist = dblDist * 1.04
  91.     vTemp = ThisDrawing.Utility.TranslateCoordinates(varPick, acWorld, acUCS, False) ''''''''''''''
  92.     dStart(0) = vTemp(0) - dblDist: dStart(1) = vTemp(1) - dblDist: dStart(2) = vTemp(2)
  93.     dEnd(0) = vTemp(0) + dblDist: dEnd(1) = vTemp(1) + dblDist: dEnd(2) = vTemp(2)
  94.    
  95.     pts(0) = dStart(0)
  96.     pts(1) = dStart(1)
  97.     pts(2) = dStart(2)
  98.     pts(3) = dEnd(0)
  99.     pts(4) = dEnd(1)
  100.     pts(5) = dEnd(2)
  101.    
  102.     CursorSelection = pts
  103.     'ThisDrawing.GetVariable("pickbox")=pixels?
  104.     'pixelHeight=windows api height of active screen in pixels
  105.     'ThisDrawing.GetVariable("viewsize")=Stores the height of the view in the current viewport. Expressed in drawing units
  106. End Function
  107. Public Function DeleteSelectionSet(SSetName As String)
  108.     Dim SSets As AcadSelectionSets
  109.     Dim sset As AcadSelectionSet
  110.     Set SSets = ThisDrawing.SelectionSets
  111.     For Each sset In SSets
  112.         If sset.Name = SSetName Then
  113.             sset.Delete
  114.             Exit For
  115.         End If
  116.     Next
  117.     Set SSets = Nothing
  118. End Function
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2006-7-24 22:59:12 | 显示全部楼层
Bryco,
我不知道为什么或如何,但这似乎适用于任何视口,没有mattrer what。这可能会提供一些见解。经过大量的尝试和错误,我发现了这种组合
  1. thisdrawing.ActiveSpace = acPaperSpace
  2. thisdrawing.SendCommand "_ucs" & vbCr & "w" & vbCr
  3. thisdrawing.MSpace = False
  4. Set ActLayout = thisdrawing.ActiveLayout
  5. Set util = thisdrawing.Utility
  6. returnPnt1 = thisdrawing.Utility.GetPoint(, "Enter point inside of the viewport you wish to add balloons to: ")
  7. Dim MyViewPortHandle As String
  8. For Each Ent In thisdrawing.PaperSpace
  9.   If LCase(Ent.ObjectName) = "acdbviewport" And _
  10.      LCase(Ent.Layer)  "0" Then
  11.      
  12.      Set currView = Ent
  13.      MyViewPortHandle = currView.Handle
  14.      currView.GetBoundingBox minExt, maxExt
  15.      ViewportX = Round(maxExt(0) - minExt(0), 5)
  16.      ViewportY = Round(maxExt(1) - minExt(1), 5)
  17.      ViewportZ = Round(maxExt(2) - minExt(2), 5)
  18.      
  19.        If returnPnt1(0) > minExt(0) And _
  20.           returnPnt1(0)  minExt(1) And _
  21.           returnPnt1(1) < maxExt(1) Then
  22.          
  23.           HoldPoint1(0) = minExt(0)
  24.           HoldPoint1(1) = minExt(1)
  25.           HoldPoint1(2) = 0
  26.           HoldPoint2(0) = maxExt(0)
  27.           HoldPoint2(1) = maxExt(1)
  28.           HoldPoint2(2) = 0
  29.           GoTo translateNow
  30.        End If
  31.       
  32.   End If
  33. Next
  34. translateNow:
  35. thisdrawing.ActiveSpace = acPaperSpace
  36. thisdrawing.MSpace = True
  37. thisdrawing.ActivePViewport = currView
  38. thisdrawing.SendCommand "_ucs" & vbCr & "v" & vbCr
  39. P1 = HoldPoint1
  40. P2 = HoldPoint2
  41. P1 = util.TranslateCoordinates(P1, acPaperSpaceDCS, acDisplayDCS, False)
  42. M1 = util.TranslateCoordinates(P1, acDisplayDCS, acUCS, False)
  43.       
  44. P2 = util.TranslateCoordinates(P2, acPaperSpaceDCS, acDisplayDCS, False)
  45. M2 = util.TranslateCoordinates(P2, acDisplayDCS, acUCS, False)
  46. thisdrawing.ActiveSpace = acPaperSpace
  47. thisdrawing.MSpace = True
  48. thisdrawing.ActivePViewport = currView
  49. thisdrawing.SendCommand "_ucs" & vbCr & "v" & vbCr
  50. On Error Resume Next
  51. thisdrawing.SelectionSets("newselset").Delete
  52. On Error GoTo ET
  53. Set ssobjects = thisdrawing.SelectionSets.Add("newselset")
  54.   ssobjects.SelectOnScreen
  55. Dim MinValue As Double
  56. Dim MaxValue As Double
  57. Dim MidValue As Double
  58. On Error Resume Next
  59. For Each Ent In ssobjects
  60.    If LCase(Ent.ObjectName) = "acdb3dsolid" Then
  61.       
  62.       Set MySolid = Ent
  63.       thisdrawing.MSpace = True
  64.       thisdrawing.SendCommand "_ucs" & vbCr & "w" & vbCr
  65.       Dim momentOfInertia As Variant
  66.       momentOfInertia = MySolid.Centroid
  67.       M1 = momentOfInertia
  68.      
  69.       
  70.       P1 = util.TranslateCoordinates(M1, acWorld, acDisplayDCS, False)
  71.       P1 = util.TranslateCoordinates(P1, acDisplayDCS, acPaperSpaceDCS, False)
  72.       
  73.       thisdrawing.MSpace = False
  74.       
  75.       Set MSpt = thisdrawing.PaperSpace.AddPoint(P1)
  76.       MSpt.Color = 30
  77.       
  78.    End If
  79. Next
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2006-7-25 00:59:24 | 显示全部楼层
谢谢Dave,但你似乎也在做类似的事情。我们都在改变;mspace以获得正确的翻译
如何做到这一点而不改变是诀窍。
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2006-7-25 09:12:24 | 显示全部楼层
你的代码令人印象深刻。我一直在看它,变得很不耐烦,因为我想试试。我现在有太多事情要做了。我只是使用质心,所以我有;感觉我的代码不能用于自动标注模块,但你的代码可以
在我忘记之前,我似乎记得在我所有的尝试和错误中,我得到了一些混合的结果,将regen插入到混合中。也许这个问题是由视口的套现引起的?只是一个猜测,但是如果我们能够以一种优雅的方式绕过UCS问题,代码可能会更快,并且也会对其进行明确的修复,以便清楚地看到和记录该问题&引用;你是这方面的老手;,正如米克所说,你的帮助是无价的。谢谢你与我和小组其他成员分享的一切。
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2006-7-25 10:13:27 | 显示全部楼层
谢谢Dave。这是vba的另一部分;我可能不会得到。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-6 04:42 , Processed in 0.968714 second(s), 68 queries .

© 2020-2025 乐筑天下

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