转换坐标

AutoCAD ActiveX/VBA

 
转换坐标
 
 
 

TranslateCoordinates 方法可以将点或位移从一个坐标系转换到另一个坐标系。称为 OriginalPoint 的点参数可以被解释为三维点或三维位移矢量。此参数由 Boolean 参数 Disp 来区分。如果 Disp 参数设置为 TRUEOriginalPoint 参数将被视为位移矢量;否则视为点。两个以上的参数可以确定 OriginalPoint 所在的坐标系,以及 OriginalPoint 将要转换到的坐标系。可以在 FromTo 参数中指定以下 AutoCAD 坐标系:

WCS

世界坐标系:参考坐标系。所有其他坐标系都相对于 WCS 定义,该坐标系恒定不变。相对于 WCS 测量的值可以稳定地转换到其他坐标系中。除非另行指定,ActiveX 方法和特性传入和传出的所有点都以 WCS 表示。

UCS

用户坐标系 (UCS):正在使用的坐标系。用户可以指定 UCS 以方便执行绘图任务。所有传递到 AutoCAD 命令的点,包括从 AutoLISP 例程以及外部函数返回的点,都是当前 UCS 中的点(除非用户于命令提示中在点之前加上了 *)。如果希望应用程序以 WCS、OCS 或 DCS 向 AutoCAD 命令发送坐标,必须先通过调用 TranslateCoordinates 方法,将这些坐标转换为 UCS。

OCS

对象坐标系:由 Polyline 和 LightweightPolyline 对象的特定方法和特性指定的点值以此坐标系表示(相对于对象)。根据对象的用途,这些点通常会转换为 WCS、当前 UCS 或当前 DCS。相对地,WCS、UCS 或 DCS 中的点在使用相同的特性写入数据库之前,必须将其转换为 OCS。关于采用此坐标系的方法和特性,请参见 AutoCAD《ActiveX and VBA Reference》。

将坐标转换到 OCS 或从 OCS 转换坐标时,必须在 TranslateCoordinates 函数的最后一个参数中输入 OCS 的法线。

DCS

显示坐标系:即对象在显示前要进行转换的坐标系。DCS 的原点是存储在 AutoCAD 系统变量 TARGET 中的点,并且其 Z 轴为观察方向。也就是说,某个视口始终是其 DCS 的一个平面视图。这些坐标可以用来确定对 AutoCAD 用户显示画面的位置。

PSDCS

图纸空间 DCS:此坐标系只能与当前活动模型空间视口的 DCS 相互转换。这种转换实质上是一种二维转换,其中的 XY 坐标在 Disp 参数设置为 FALSE 时,始终要进行缩放和偏移。Z 坐标也要缩放,但并不转换。因此,它可用于确定两个坐标系之间的缩放比例。PSDCS 只能转换到当前的模型空间视口中。如果 from 参数等于 PSDCS,则 to 参数必须等于 DCS,反之亦然。

将 OCS 坐标转换为 WCS 坐标

本样例在模型空间中创建一条多段线。然后,以 OCS 和 WCS 坐标显示多段线的第一个顶点。从 OCS 转换为 WCS 时,需要在 TranslateCoordinates 方法的最后一个参数中提供 OCS 法线。

Sub Ch8_TranslateCoordinates()
    ' 在模型空间中创建多段线。
    Dim plineObj As AcadPolyline
    Dim points(0 To 14) As Double
      
    ' 定义二维多段线的点
    points(0) = 1: points(1) = 1: points(2) = 0
    points(3) = 1: points(4) = 2: points(5) = 0
    points(6) = 2: points(7) = 2: points(8) = 0
    points(9) = 3: points(10) = 2: points(11) = 0
    points(12) = 4: points(13) = 4: points(14) = 0
      
    ' 在模型空间中创建一个优化多段线对象
    Set plineObj = ThisDrawing.ModelSpace.AddPolyline(points)
      
    ' 找出多段线第一个顶点的
    ' X 和 Y 坐标
    Dim firstVertex As Variant
    firstVertex = plineObj.Coordinate(0)
      
    ' 使用 elevation 特性找出多段线
    ' 的 Z 坐标
    firstVertex(2) = plineObj.Elevation
      
    ' 更改多段线的法线,使
    ' 坐标系之间的差值
    ' 更加明显。
    Dim plineNormal(0 To 2) As Double
    plineNormal(0) = 0#
    plineNormal(1) = 1#
    plineNormal(2) = 2#
    plineObj.Normal = plineNormal
      
    ' 将 OCS 坐标转换为 WCS
    Dim coordinateWCS As Variant
    coordinateWCS = ThisDrawing.Utility.TranslateCoordinates _
          (firstVertex, acOCS, acWorld, False, plineNormal)
      
    ' 显示点的坐标
    MsgBox "The first vertex has the following coordinates:" _
           & vbCrLf & "OCS: " & firstVertex(0) & ", " & _
           firstVertex(1) & ", " & firstVertex(2) & vbCrLf & _
           "WCS: " & coordinateWCS(0) & ", " & _
           coordinateWCS(1) & ", " & coordinateWCS(2)
End Sub