如何从AutoCAD DXF文件

时间:2015-08-02 19:09:07

标签: autocad dxf

我担心这是其中一个问题而没有简单的答案。

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

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

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

任何人都知道该怎么做?

2 个答案:

答案 0 :(得分:0)

如果使用的字体是TTF,则可以使用Windows API查找特定文本行的宽度。如果是SHX,那就更难了。您必须找到一种方法来读取.shx文件,以便计算每个字符的宽度。以下是SHP文件的描述,这些文件被编译为SHX: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实体可以包含格式代码......

答案 1 :(得分:0)

'此例程以使文本位置保持为'绘制'的方式更改文本插入。 “还会浏览您正在寻找的功能。

函数TEXT_align(实体作为AcadEntity,选择作为字符串)作为AcadEntity     设置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

结束功能