es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Filtrar líneas en todos los LWPOLYLINE en un documento DXF utilizando Python ezdxf.

¿Cómo puedo obtener las coordenadas de las LÍNEAS de una LWPOLYLINE en un documento DXF?

Tengo el siguiente código:

import sys
import ezdxf
Coordenadas = str()
Coordenadas_texto = str()

try:
    doc = ezdxf.readfile(str(arq)+".dxf")
except IOError:
    print('Error de archivo. Certifique-se que es un archivo .dxf')
    sys.exit(1)
except ezdxf.DXFStructureError:
    print('Archivo inválido o corrupto.')
    sys.exit(2)       

msp = doc.modelspace()

for insert in msp.query('INSERT'):
    block = doc.blocks[insert.dxf.name]
    for e in block:
        if e.dxftype() == 'LINE':
            Coordenadas = Coordenadas + str(e.dxf.start) + "\n"              
            Coordenadas = Coordenadas + str(e.dxf.end) + "\n"

El bucle “for” anterior obtiene el bloque “INSERT” y los divide para que solo pueda obtener LÍNEAS. Intenté hacer lo mismo para LWPOLYLINE pero no funcionó.

El código a continuación obtiene todas las coordenadas, pero necesito filtrar y obtener las coordenadas línea por línea:

for flag_ref in msp.query('LWPOLYLINE'):
    for entity in flag_ref:
        print(entity)

El código a continuación dejó de funcionar repentinamente, creo que la biblioteca ezdxf cambió. Estoy obteniendo el error

‘LWPolyline’ object has no attribute ‘virtual_entities’

for flag_ref in msp.query('LWPOLYLINE'):
    for entity in flag_ref.virtual_entities():
        if entity.dxftype() == 'LINE':
            Coordenadas = Coordenadas + str(entity.dxf.start)+ "\n"
            Coordenadas = Coordenadas + str(entity.dxf.end)+ "\n"
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para obtener las coordenadas de línea de un LWPOLYLINE en un documento DXF utilizando Python y la biblioteca ezdxf, puedes usar el siguiente código:

    for lwpolyline in msp.query('LWPOLYLINE'):
        if not lwpolyline.closed: # filtramos las entidades LWPOLYLINE cerradas
            for start, end in zip(lwpolyline.vertices[:-1], lwpolyline.vertices[1:]):
                Coordenadas = Coordenadas + str(start.dxf.location) + "\n"
                Coordenadas = Coordenadas + str(end.dxf.location) + "\n"
    

    En este caso, utilizamos el método query para obtener todas las entidades LWPOLYLINE en el espacio de modelos (modelspace). Luego, recorremos cada entidad filtrando las polilíneas cerradas. Finalmente, iteramos sobre los vértices de la polilínea utilizando el atributo vertices y la función zip para obtener los vértices de inicio y fin de cada segmento de línea. Obtenemos las coordenadas de cada vértice utilizando el atributo dxf.location y las agregamos a la variable de cadena Coordenadas.

    Ten en cuenta que este enfoque asume que la entidad LWPOLYLINE no tiene segmentos curvados, es decir, solo contiene segmentos de línea recta. Si la polilínea contiene segmentos curvados, la conversión a líneas requeriría un procesamiento adicional.

Comments are closed.