乐筑天下

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

带有视口扭曲的TranslateCoord<>0

[复制链接]

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2006-7-15 14:30:52 | 显示全部楼层 |阅读模式
我在另一个网站上看到了一个有趣的问题。
这个想法是在纸质空间中选择一个点并将该点转换为模型空间。
在2d环境中,似乎
1)将点从纸质空间转换为模型空间
2)将其旋转约0,0减去视口扭曲角。
我正在做的测试是通过在模型空间中绘制一个矩形开始的,其中包含一个世界ucs和一个赢富数据。
纸质空间有一个视口,带有一个扭曲的视图,通过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<br>我几乎没有成功,我想知道是否有什么是正确的
在视口中,点击topview重置ucs
ucs->x->90,然后规划
这将为您提供无扭曲的pviewport
运行MsPoint1,您将看到TranslateCoordinates没有给出正确的点
,因此我在这一点上有点不知所措
在编写了我自己版本的getentity之后,我意识到getentity并没有给你实际的分数
,这肯定会与捕捉对象上的点一起发挥作用,但我看不出在简单的翻译中它是如何发挥作用的
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2006-7-15 16:39:22 | 显示全部楼层
情况变得更糟。
当您选择一个点时,活动的 ucs 似乎是视口 ucs 的 ucs。
因此,TranslateCoordinates翻译成ucs。由于paperspace是2d的,因此您需要沿着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 | 显示全部楼层
我有了它,现在它消失了,这无论如何都有效
  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

回复

使用道具 举报

12

主题

150

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
198
发表于 2006-7-24 22:59:12 | 显示全部楼层
Bryco,
我不确定为什么或如何,但这似乎适用于我的任何视口,没有更小的东西。它可能会提供一些见解。经过大量的尝试错误,我遇到了这种组合。
  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以获得正确的翻译。
如何在不改变的情况下做到这一点是关键。
回复

使用道具 举报

12

主题

150

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

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

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

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

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-6 03:21 , Processed in 0.283052 second(s), 69 queries .

© 2020-2025 乐筑天下

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