@@ -78,6 +78,7 @@ def add(nodedata: dict, parentnode: ElementNode) -> None:
7878 for childdata in nodedata ["children" ]:
7979 guid = childdata ["element" ]
8080 element = model ._guid_element [guid ]
81+ element .model = model
8182 attr = childdata .get ("attributes" ) or {}
8283 childnode = ElementNode (element = element , name = childdata ["name" ], ** attr )
8384 parentnode .add (childnode )
@@ -605,7 +606,29 @@ def materials(self) -> Generator[Material, None, None]:
605606 """
606607 return iter (self ._guid_material .values ())
607608
608- def collisions (self ):
609+ def collisions (self ) -> Generator [tuple [Element , Element ], None , None ]:
610+ """Yield all collision pairs in the model.
611+
612+ Yields
613+ ------
614+ tuple[:class:`Element`, :class:`Element`]
615+ The collision pairs.
616+
617+ Notes
618+ -----
619+ Collisions are not identified automatically.
620+ To identify collision, run :meth:`identify_interactions` or :meth:`compute_collisions` first.
621+
622+ """
623+ for edge in self .graph .edges ():
624+ collision = self .graph .edge_attribute (edge , name = "collision" )
625+ if collision :
626+ u , v = edge
627+ a = self .graph .node_element (u )
628+ b = self .graph .node_element (v )
629+ yield a , b
630+
631+ def contacts (self ):
609632 raise NotImplementedError
610633
611634 # def elements_connected_by(self, interaction_type: Type[Interaction]) -> list[list[Element]]:
@@ -653,11 +676,34 @@ def collisions(self):
653676 # Compute
654677 # =============================================================================
655678
656- def compute_bvh (self , nodetype = ElementOBBNode , max_depth = None , leafsize = 1 ) -> ElementBVH :
679+ def compute_bvh (self , nodetype = ElementOBBNode , max_depth : Optional [int ] = None , leafsize : Optional [int ] = 1 ) -> ElementBVH :
680+ """Compute the Bounding Volume Hierarchy (BVH) of the elements for fast collision checks.
681+
682+ Parameters
683+ ----------
684+ nodetype : :class:`ElementOBBNode`
685+ The type of bounding volume node used in the tree.
686+ max_depth : int, optional
687+ The maximum depth used for constructing the BVH.
688+ leafsize : int, optional
689+ The number of elements contained in a BVH leaf node.
690+
691+ Returns
692+ -------
693+ :class:`ElementBVH`
694+
695+ """
657696 self ._bvh = ElementBVH .from_elements (self .elements (), nodetype = nodetype , max_depth = max_depth , leafsize = leafsize )
658697 return self ._bvh
659698
660699 def compute_kdtree (self ) -> KDTree :
700+ """Compute the KD tree of the elements for fast nearest neighbour queries.
701+
702+ Returns
703+ -------
704+ :class:`KDTree`
705+
706+ """
661707 self ._kdtree = KDTree (list (self .elements ()))
662708 return self ._kdtree
663709
@@ -666,9 +712,30 @@ def compute_kdtree(self) -> KDTree:
666712 # =============================================================================
667713
668714 def element_nnbrs (self , element : Element , k = 1 ) -> list [tuple [Element , float ]]:
715+ """"""
669716 return [nbr for nbr in self .point_nnbrs (element .point , k = k + 1 ) if nbr [0 ] is not element ]
670717
671718 def point_nnbrs (self , point , k = 1 ) -> list [tuple [Element , float ]]:
672719 if k == 1 :
673720 return [self .kdtree .nearest_neighbor (point )]
674721 return self .kdtree .nearest_neighbors (point , number = k )
722+
723+ # def identify_interactions(self, reset_graph=True, k=None) -> None:
724+ # """Identify element interactions by computing element collision pairs and adding an interaction edge per pair.
725+
726+ # Returns
727+ # -------
728+ # None
729+
730+ # """
731+ # if reset_graph:
732+ # self.graph.clear_edges()
733+
734+ # k = k or 1
735+ # for element in self.elements():
736+ # for nbr, distance in self.element_nnbrs(element, k=k):
737+ # if self.has_interaction():
738+ # continue
739+ # # dos something with the distance?
740+ # if element.is_collision(nbr, precise=True):
741+ # pass
0 commit comments