如何在Python中找到DXF中形状的尺寸?

时间:2018-03-07 11:55:03

标签: python-3.x drawing cad dxf

我正在尝试从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。
有没有计算方法,或任何现有的库来获取尺寸?

1 个答案:

答案 0 :(得分:1)

  

并手动接听minXminYmaxXmaxY

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

  

是否有任何计算方法或任何现有的库来获取尺寸?

我无法对您正在使用的软件库做出具体评论。他们可能只读取DXF文件并且不提供其他功能。

您似乎正在使用2D数据。在你的问题是显示:

  • LINE
  • ARC

对于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,我找到了一个相关的StackOverflow question,它提供了计算弧长的公式:

  

Arc Length = Radius * (Angle In Radian)

评论中有一个辅助link,其中包含更多信息。

所以你现在应该能够准确地计算出你的长度。