我担心这是其中一个问题而没有简单的答案。
我有ASCII DXF格式的AutoCAD图纸。我正在扫描它们的文本元素。我需要计算每个文本元素的边界框顶点的坐标。 (如果有人使用不同的术语,对我来说,边界框是一个假想的矩形,可以绘制,使文本完全适合矩形)
考虑到每个元素可能具有不同的字体,不同的文本样式,不同的比例,不同的方向,旋转等,这是非常复杂的。
我从DXF文件中的TEXT实体条目中获取原点和对齐点(如果有的话)。我也可以从同一个地方获得旋转和高度比例因子。但我特别坚持如何获得宽度,因为每个字符的宽度不同,可能有任意数量的不同字体。如果这是Windows编程我将使用Windows API函数来获取有关正在使用的字体的指标,但autocad似乎没有任何类比。
任何人都知道该怎么做?
答案 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
结束功能