Counting entities within a bounding box with ezdxf

689 Views Asked by At

I'm trying to select the densest (in terms contained elements) areas of a DXF layer in ezdxf. These boxes are evenly spaced and shaped.

In other words: given a BoundingBox2d instance bbox, how to obtain number of entities (lines, poly lines, basically - everything) contained in ezdxf.layouts.layout.Modelspace instance msp within that bbox? The msp variable contains modelspace with only one variable turned on.

Intuitively, it should be something like:

def count_elements_in_layer_and_bbox(msp: Modelspace, layer: str, bbox: BoundingBox2d) -> int
       
    # turn off all layers but one 
    for l in msp.layers:
        if layer == l.dxf.name:
            l.on()
        else:
            l.off()

        # get entities within the bbox - this is the line I don't know how to approach
        entities = msp.intersect(bbox).dxf.entities
    return len(enitites)
1

There are 1 best solutions below

0
On BEST ANSWER

ezdxf is a DXF file format interface not a CAD application. So switching layers on/off has no influence on the content of the modelspace.

But ezdxf gives you other tools to select entities based on DXF attributes like the query() method. BTW a layer is just a DXF attribute and not a real container:


from ezdxf import bbox

def count_entities(msp, layer, selection_box):
    count = 0
    # select all entities of a certain layer
    for e in msp.query(f"*[layer=='{layer}']"):
        # put a single entity into a list to get its bounding box
        entity_box = bbox.extents([e])
        if selection_box.has_intersection(entity_box):
            count += 1
    return count

Read the docs for query() and also read the limitations of the bbox module.