python 如何在 DXF 中查找形状的尺寸?

How to find dimensions of a shape in DXF in python?

我正在尝试从 dxf 文件中获取形状的尺寸。我尝试查看 dxfgrabber 和 ezdxf 库,我采用 最低点和最高点 来获取尺寸,但结果是错误的。 使用 dxfgrabber:

import dxfgrabber
import numpy as np
import sys

dxf = dxfgrabber.readfile(sys.argv[1])
shapes = dxf.entities.get_entities()
minX, maxX, minY, maxY = 999999,0,999999,0
for shape in shapes:
    print('dxftype', shape.dxftype)
    if shape.dxftype == 'LINE':
        x, y = shape.start[0], shape.start[1]
        if x < minX:
            minX = x
        if y < minY:
            minY = y
        if x >= maxX:
            maxX = x
        if y >= maxY:
            maxY = y
        x, y = shape.end[0], shape.end[1]
        if x < minX:
            minX = x
        if y < minY:
            minY = y
        if x >= maxX:
            maxX = x
        if y >= maxY:
            maxY = y
    if shape.dxftype == 'ARC':
        x, y = shape.center[0], shape.center[1]
        if x < minX:
            minX = x
        if y < minY:
            minY = y
        if x >= maxX:
            maxX = x
        if y >= maxY:
            maxY = y
print('minX', minX, 'minY', minY)
print('maxX', maxX, 'maxY', maxY)
print('x1', 0, 'y1', 0)
print('x2', maxX-minX, 'y2', maxY-minY)

使用 ezdxf:

modelspace = dwg.modelspace()
for e in modelspace:
     if e.dxftype() == 'LINE':
         print("start point: ",  e.dxf.start)
         print("end point: ",  e.dxf.end)
     if e.dxftype() == 'ARC':
         print("ARC on layer: ", e.dxf.layer)
         print("center point ", e.dxf.center)

并手动取了minX minY maxX maxY。
是否有任何计算方法或任何现有库来获取尺寸?

And manually took the minX, minY, maxX, maxY.

使用元素的边界范围是不正确的。如果 LINE 不是垂直或水平的,则尤其如此。一旦它处于旋转,你的逻辑就会失败。

Is there any way of calculating, or any existing libraries to get the dimensions ?

我无法具体评论您使用的软件库。他们可能只读取 DXF 文件,不提供其他功能。

看来您正在处理二维数据。在你的问题中显示:

  • 线
  • 圆弧

对于 LINE 元素,这里是一个示例(在 Visual Basic for Applications 中):

Public Function Get2DLength(aryPoint1 As Variant, _
                            aryPoint2 As Variant) As Double

    Dim dDeltaX As Double
    Dim dDeltaY As Double

    dDeltaX = aryPoint2(0) - aryPoint1(0)
    dDeltaY = aryPoint2(1) - aryPoint1(1)

    Get2DLength = Sqr((dDeltaX * dDeltaX) + (dDeltaY * dDeltaY))

End Function

如果您使用的是 3D 数据,则通过引入 dDeltaZ.

来扩展该方法

您应该能够将其移植到您的环境中。恐怕无法对 ARC 个元素发表评论。


我很快 Google 找到了一个相关的 Whosebug question,它提供了计算弧长的公式:

Arc Length = Radius * (Angle In Radian)

评论中有二级link,提供更多信息。

所以你现在应该可以准确计算出你的长度了。