获取文字角点坐标有没有更简洁一点的方法
有没有比以下代码更简洁一点的方法,或者以下代码如何再简练一点?''' <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
tmpText.GeometricExtents就是范围了
搞的这么麻烦 本帖最后由 ywlm 于 2011-2-10 23:25 编辑
因为考虑了文字的旋转角度,所以我也感觉烦,用tmpText.GeometricExtents得出来的范围好象不行
本帖最后由 雪山飞狐_lzh 于 2011-2-10 23:32 编辑
哦,简单的方法?
你的是把文本角度置0,再获取GeometricExtents
应该有直接计算的方法
在Lisp里是先根据文字对象旋转坐标系,然后获取角点坐标,接着画矩形框,再还原坐标系。但在.net里不知如何实现? 学习,GeometricExtents这个属性求出的好像不行啊?就是在旋转角度是0的情况下求出的还是有问题,不知道是我设置有问题还是一个bug?
直接解方程
因X1和Y1为未知,当α为45,135,225,315度时有无穷多个解,当α为其它角度时有唯一的解。
X1不等于文字高度,因为“f,j"这些字母还要考虑上升和下沉的距离。 将dbtext的角度设置为0,然后获取矩形框,然后将矩形框4个点,再使用其文字角度计算(以文字的基点)旋转计算其旋转后的坐标。 9楼的朋友,我上面的程序就是按这个思路的。
页:
[1]
2