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)
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.