2

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

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

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

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

有谁知道该怎么做?

4

2 回答 2

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,主题编号=d0e400463

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

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

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

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

于 2015-08-03T06:53:31.557 回答
0

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

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
于 2019-01-21T14:01:54.247 回答