明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3443|回复: 12

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

  [复制链接]
发表于 2011-2-10 22:09:28 | 显示全部楼层 |阅读模式
有没有比以下代码更简洁一点的方法,或者以下代码如何再简练一点?
  1.     ''' <summary>
  2.     ''' 获取单行文字或多行文字的外包矩形角点坐标
  3.     ''' 0为左下角点,1为右下角点,2为右上角点,3为左上角点
  4.     ''' </summary>
  5.     ''' <param name="id">单行文字或多行文字的ID</param>
  6.     ''' <returns></returns>
  7.     ''' <remarks></remarks>
  8.     Public Shared Function GetTextBounds(ByVal id As ObjectId) As Point3dCollection
  9.         Dim tmpPoint As New Point3dCollection
  10.         Using trans As Transaction = db.TransactionManager.StartTransaction
  11.             Dim ent As Entity = trans.GetObject(id, OpenMode.ForWrite)
  12.             Dim Angle As Double
  13.             If TypeOf ent Is DBText Then
  14.                 Dim tmpText As DBText = ent
  15.                 Angle = tmpText.Rotation
  16.                 tmpText.Rotation = 0
  17.                 With tmpPoint
  18.                     .Add(tmpText.GeometricExtents.MinPoint)
  19.                     .Add(New Point3d(tmpText.GeometricExtents.MaxPoint.X, tmpText.GeometricExtents.MinPoint.Y, tmpText.GeometricExtents.MinPoint.Z))
  20.                     .Add(tmpText.GeometricExtents.MaxPoint)
  21.                     .Add(New Point3d(tmpText.GeometricExtents.MinPoint.X, tmpText.GeometricExtents.MaxPoint.Y, tmpText.GeometricExtents.MinPoint.Z))
  22.                 End With
  23.                 tmpText.Rotation = Angle
  24.                 For i As Integer = 0 To tmpPoint.Count - 1
  25.                     tmpPoint.Item(i) = tmpPoint.Item(i).RotateBy(Angle, Vector3d.ZAxis, tmpText.Position)
  26.                 Next
  27.             ElseIf TypeOf ent Is MText Then
  28.                 Dim tmpText As MText = ent
  29.                 Angle = tmpText.Rotation
  30.                 tmpText.Rotation = 0
  31.                 With tmpPoint
  32.                     .Add(tmpText.GeometricExtents.MinPoint)
  33.                     .Add(New Point3d(tmpText.GeometricExtents.MaxPoint.X, tmpText.GeometricExtents.MinPoint.Y, tmpText.GeometricExtents.MinPoint.Z))
  34.                     .Add(tmpText.GeometricExtents.MaxPoint)
  35.                     .Add(New Point3d(tmpText.GeometricExtents.MinPoint.X, tmpText.GeometricExtents.MaxPoint.Y, tmpText.GeometricExtents.MinPoint.Z))
  36.                 End With
  37.                 tmpText.Rotation = Angle
  38.                 For i As Integer = 0 To tmpPoint.Count - 1
  39.                     tmpPoint.Item(i) = tmpPoint.Item(i).RotateBy(Angle, Vector3d.ZAxis, tmpText.Location)
  40.                 Next
  41.             End If
  42.             trans.Commit()
  43.         End Using
  44.         Return tmpPoint
  45.     End Function

发表于 2011-2-10 22:42:45 | 显示全部楼层
tmpText.GeometricExtents就是范围了
搞的这么麻烦
 楼主| 发表于 2011-2-10 23:06:34 | 显示全部楼层
本帖最后由 ywlm 于 2011-2-10 23:25 编辑

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


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2011-2-10 23:30:50 | 显示全部楼层
本帖最后由 雪山飞狐_lzh 于 2011-2-10 23:32 编辑

哦,简单的方法?
你的是把文本角度置0,再获取GeometricExtents
应该有直接计算的方法
 楼主| 发表于 2011-2-10 23:56:20 | 显示全部楼层
在Lisp里是先根据文字对象旋转坐标系,然后获取角点坐标,接着画矩形框,再还原坐标系。但在.net里不知如何实现?
发表于 2011-2-11 09:17:14 | 显示全部楼层
学习,GeometricExtents这个属性求出的好像不行啊?就是在旋转角度是0的情况下求出的还是有问题,不知道是我设置有问题还是一个bug?
发表于 2011-2-11 11:07:58 | 显示全部楼层

直接解方程

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2011-2-11 16:57:03 | 显示全部楼层
因X1和Y1为未知,当α为45,135,225,315度时有无穷多个解,当α为其它角度时有唯一的解。
X1不等于文字高度,因为“f,j"这些字母还要考虑上升和下沉的距离。
发表于 2011-2-22 10:27:22 | 显示全部楼层
将dbtext的角度设置为0,然后获取矩形框,然后将矩形框4个点,再使用其文字角度计算(以文字的基点)旋转计算其旋转后的坐标。
 楼主| 发表于 2011-3-3 08:54:09 | 显示全部楼层
9楼的朋友,我上面的程序就是按这个思路的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-23 15:14 , Processed in 0.184332 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表