【问题标题】:How to find the bounding box of a TEXT element from AutoCAD DXF file如何从 AutoCAD DXF 文件中找到 TEXT 元素的边界框
【发布时间】:2015-10-24 20:49:39
【问题描述】:

我担心这是没有简单答案的问题之一。

我有 ASCII DXF 格式的 AutoCAD 图纸。我正在扫描它们以查找文本元素。我需要为每个文本元素计算边界框的顶点坐标。 (如果有人使用不同的术语,对我来说,边界框是一个假设的矩形,可以绘制使得文本完全适合矩形内)

考虑到每个元素可能有不同的字体、不同的文本样式、不同的比例、不同的方向、旋转等,这非常复杂。

我从 DXF 文件中的 TEXT 实体条目中获取原点和对齐点(如果有)。我还可以从同一个地方获得旋转和高度比例因子。但我特别纠结于如何获得宽度,因为每个字符的宽度都不同,并且可能有任意数量的不同字体。如果这是 windows 编程,我会使用 windows API 函数来获取有关正在使用的字体的指标,但 autocad 似乎没有任何类比。

有人知道怎么做吗?

【问题讨论】:

  • 你能提供一个示例文件的链接吗?

标签: autocad dxf


【解决方案1】:

如果使用的字体是 TTF,您可以使用 Windows API 来查找特定文本行的宽度。如果是SHX,那就更难了。您必须找到一种读取 .shx 文件的方法,以便计算每个字符的宽度。这里是编译成 SHX 的 SHP 文件的描述:http://docs.autodesk.com/ACD/2010/ENU/AutoCAD%202010%20User%20Documentation/index.html?url=WS73099cc142f4875513fb5cd10c4aa30d6b-7f42.htm,topicNumber=d0e400463

例如,如果您居住在美国,对这些文件进行逆向工程可能会很乏味并且被视为非法。

您还可以制作一个 AutoCAD 插件(使用 ObjectARX 或其他 API)来计算每个字符的宽度并将这些宽度存储在一个大表中。然后,您必须查找此表以计算特定字符串的宽度。

还有主要 SHX 文件的 True Type 版本(我认为它们与 Inventor 一起安装)。

请注意,宽度上有一个比例因子(代码 41),MTEXT 实体可以包含格式代码...

【讨论】:

  • 添加到@maxence 回复,您可以在 AutoCAD 中使用插件进行操作,并且您不需要在机器上安装 AutoCAD,只需使用 AutoCAD I/O 网络服务(上传 DXF 并使用计算边界框的自定义.NET,然后下载输出结果)。
【解决方案2】:

此例程更改文本插入,以使文本位置保持绘制状态,这也提供了您正在寻找的功能。

Function TEXT_align(entity As AcadEntity, opt As String) As AcadEntity
Set TEXT_align = Nothing

Dim MTEXT As AcadMText
Dim TTEXT As ACADTEXT
Dim ATTRIB As AcadAttribute

Dim Dest_min As Variant
Dim Dest_max As Variant
Dim Source_min As Variant
Dim Source_max As Variant

Call entity.GetBoundingBox(Source_min, Source_max)

Select Case LCase(entity.objectname)
    Case "acdbtext"
        Set TTEXT = entity
        Select Case UCase(opt)

            Case "TL": TTEXT.alignment = acAlignmentTopLeft
            Case "TC": TTEXT.alignment = acAlignmentTopCenter
            Case "TR": TTEXT.alignment = acAlignmentTopRight
            Case "ML": TTEXT.alignment = acAlignmentMiddleLeft
            Case "MC": TTEXT.alignment = acAlignmentMiddleCenter
            Case "MR": TTEXT.alignment = acAlignmentMiddleRight
            Case "BL": TTEXT.alignment = acAlignmentBottomLeft
            Case "BC": TTEXT.alignment = acAlignmentBottomCenter
            Case "BR": TTEXT.alignment = acAlignmentBottomRight
        End Select
    Case "acdbmtext"

        Set MTEXT = entity

        Select Case UCase(opt)
            Case "TL": MTEXT.ATTACHMENTPOINT = acAttachmentPointTopLeft
            Case "TC": MTEXT.ATTACHMENTPOINT = acAttachmentPointTopCenter
            Case "TR": MTEXT.ATTACHMENTPOINT = acAttachmentPointTopRight
            Case "ML": MTEXT.ATTACHMENTPOINT = acAttachmentPointMiddleLeft
            Case "MC": MTEXT.ATTACHMENTPOINT = acAttachmentPointMiddleCenter
            Case "MR": MTEXT.ATTACHMENTPOINT = acAttachmentPointMiddleRight
            Case "BL": MTEXT.ATTACHMENTPOINT = acAttachmentPointBottomLeft
            Case "BC": MTEXT.ATTACHMENTPOINT = acAttachmentPointBottomCenter
            Case "BR": MTEXT.ATTACHMENTPOINT = acAttachmentPointBottomRight
        End Select
    Case "acdbattributedefinition"
        Set ATTRIB = entity

        Select Case UCase(opt)
            Case "TL": ATTRIB.alignment = acAlignmentTopLeft
            Case "TC": ATTRIB.alignment = acAlignmentTopCenter
            Case "TR": ATTRIB.alignment = acAlignmentTopRight
            Case "ML": ATTRIB.alignment = acAlignmentMiddleLeft
            Case "MC": ATTRIB.alignment = acAlignmentMiddleCenter
            Case "MR": ATTRIB.alignment = acAlignmentMiddleRight
            Case "BL": ATTRIB.alignment = acAlignmentBottomLeft
            Case "BC": ATTRIB.alignment = acAlignmentBottomCenter
            Case "BR": ATTRIB.alignment = acAlignmentBottomRight
        End Select
    Case Else
        Exit Function
End Select

Call entity.GetBoundingBox(Dest_min, Dest_max)

entity.MOVE Dest_min, Source_min

End Function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 2021-04-15
    • 2017-05-07
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多