ywlm 发表于 2011-2-10 22:09:28

获取文字角点坐标有没有更简洁一点的方法

有没有比以下代码更简洁一点的方法,或者以下代码如何再简练一点?
    ''' <summary>
    ''' 获取单行文字或多行文字的外包矩形角点坐标
    ''' 0为左下角点,1为右下角点,2为右上角点,3为左上角点
    ''' </summary>
    ''' <param name="id">单行文字或多行文字的ID</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function GetTextBounds(ByVal id As ObjectId) As Point3dCollection
      Dim tmpPoint As New Point3dCollection
      Using trans As Transaction = db.TransactionManager.StartTransaction
            Dim ent As Entity = trans.GetObject(id, OpenMode.ForWrite)
            Dim Angle As Double
            If TypeOf ent Is DBText Then
                Dim tmpText As DBText = ent
                Angle = tmpText.Rotation
                tmpText.Rotation = 0
                With tmpPoint
                  .Add(tmpText.GeometricExtents.MinPoint)
                  .Add(New Point3d(tmpText.GeometricExtents.MaxPoint.X, tmpText.GeometricExtents.MinPoint.Y, tmpText.GeometricExtents.MinPoint.Z))
                  .Add(tmpText.GeometricExtents.MaxPoint)
                  .Add(New Point3d(tmpText.GeometricExtents.MinPoint.X, tmpText.GeometricExtents.MaxPoint.Y, tmpText.GeometricExtents.MinPoint.Z))
                End With
                tmpText.Rotation = Angle
                For i As Integer = 0 To tmpPoint.Count - 1
                  tmpPoint.Item(i) = tmpPoint.Item(i).RotateBy(Angle, Vector3d.ZAxis, tmpText.Position)
                Next
            ElseIf TypeOf ent Is MText Then
                Dim tmpText As MText = ent
                Angle = tmpText.Rotation
                tmpText.Rotation = 0
                With tmpPoint
                  .Add(tmpText.GeometricExtents.MinPoint)
                  .Add(New Point3d(tmpText.GeometricExtents.MaxPoint.X, tmpText.GeometricExtents.MinPoint.Y, tmpText.GeometricExtents.MinPoint.Z))
                  .Add(tmpText.GeometricExtents.MaxPoint)
                  .Add(New Point3d(tmpText.GeometricExtents.MinPoint.X, tmpText.GeometricExtents.MaxPoint.Y, tmpText.GeometricExtents.MinPoint.Z))
                End With
                tmpText.Rotation = Angle
                For i As Integer = 0 To tmpPoint.Count - 1
                  tmpPoint.Item(i) = tmpPoint.Item(i).RotateBy(Angle, Vector3d.ZAxis, tmpText.Location)
                Next
            End If
            trans.Commit()
      End Using
      Return tmpPoint
    End Function

雪山飞狐_lzh 发表于 2011-2-10 22:42:45

tmpText.GeometricExtents就是范围了
搞的这么麻烦

ywlm 发表于 2011-2-10 23:06:34

本帖最后由 ywlm 于 2011-2-10 23:25 编辑

因为考虑了文字的旋转角度,所以我也感觉烦,用tmpText.GeometricExtents得出来的范围好象不行


雪山飞狐_lzh 发表于 2011-2-10 23:30:50

本帖最后由 雪山飞狐_lzh 于 2011-2-10 23:32 编辑

哦,简单的方法?
你的是把文本角度置0,再获取GeometricExtents
应该有直接计算的方法

ywlm 发表于 2011-2-10 23:56:20

在Lisp里是先根据文字对象旋转坐标系,然后获取角点坐标,接着画矩形框,再还原坐标系。但在.net里不知如何实现?

pengzong155 发表于 2011-2-11 09:17:14

学习,GeometricExtents这个属性求出的好像不行啊?就是在旋转角度是0的情况下求出的还是有问题,不知道是我设置有问题还是一个bug?

雪山飞狐_lzh 发表于 2011-2-11 11:07:58


直接解方程

ywlm 发表于 2011-2-11 16:57:03

因X1和Y1为未知,当α为45,135,225,315度时有无穷多个解,当α为其它角度时有唯一的解。
X1不等于文字高度,因为“f,j"这些字母还要考虑上升和下沉的距离。

sbydo 发表于 2011-2-22 10:27:22

将dbtext的角度设置为0,然后获取矩形框,然后将矩形框4个点,再使用其文字角度计算(以文字的基点)旋转计算其旋转后的坐标。

ywlm 发表于 2011-3-3 08:54:09

9楼的朋友,我上面的程序就是按这个思路的。
页: [1] 2
查看完整版本: 获取文字角点坐标有没有更简洁一点的方法