def find_beams_connected_to_plate(pl: Plate, beams: List[Beam]) -> List[Beam]: """Return all beams with their midpoints inside a specified plate for a given list of beams""" from ada.concepts.containers import Nodes nid = Counter(1) nodes = Nodes( [Node((bm.n2.p + bm.n1.p) / 2, next(nid), refs=[bm]) for bm in beams]) res = nodes.get_by_volume(pl.bbox.p1, pl.bbox.p2) all_beams_within = list(chain.from_iterable([r.refs for r in res])) return all_beams_within
def test_in_between(): p1 = 284.651885, 130.233454, 553.35 p2 = 284.651885, 130.233454, 553.425 p3 = 284.651885, 130.233454, 553.5 p4 = 284.651885, 130.233454, 554.5 n1 = Node(p1, 1) n2 = Node(p2, 2) n3 = Node(p3, 3) n4 = Node(p4, 4) nodes = Nodes([n1, n2, n3, n4]) res = Nodes(nodes.get_by_volume(p=p1)) assert len(res) == 1
def get_singular_node_by_volume(nodes: Nodes, p: np.ndarray, tol=Settings.point_tol) -> Node: """Returns existing node within the volume, or creates and returns a new Node at the point""" nds = nodes.get_by_volume(p, tol=tol) if len(nds) > 0: node, *other_nodes = nds if len(other_nodes) > 0: logging.warning( f"More than 1 node within point {p}, other nodes: {other_nodes}. Returns node {node}" ) return node else: return Node(p)
def test_get_by_volume_point(nodes): n1, n2, n3, n4, n5, n6, n7, n8, n9, n10 = nodes s = Nodes(nodes) c = Nodes(s.get_by_volume(p=(4.0, 5.0, 1.0))) assert c == Nodes([n7])
def test_get_by_volume_cylinder(nodes): n1, n2, n3, n4, n5, n6, n7, n8, n9, n10 = nodes s = Nodes(nodes) c = Nodes(s.get_by_volume(p=(1.0, 1.0, 0.5), vol_cyl=(0.2, 4, 0.2))) assert c == Nodes([n2, n6, n9])
def test_get_by_volume_box(nodes): n1, n2, n3, n4, n5, n6, n7, n8, n9, n10 = nodes s = Nodes(nodes) c = Nodes(s.get_by_volume(p=(1.5, 0.5, 0.5), vol_box=(4.5, 5.5, 8.5))) assert c == Nodes([n3, n7, n8])