1313from compas .utilities import pairwise
1414
1515
16+ def iter_edges_from_vertices (vertices ):
17+ for i , u in enumerate (vertices ):
18+ j = (i + 1 ) % len (vertices )
19+ yield u , vertices [j ]
20+
21+
1622class HalfFace (Datastructure ):
1723 """Base half-face data structure for representing volumetric meshes.
1824
@@ -474,22 +480,14 @@ def add_halfface(self, vertices, fkey=None, attr_dict=None, **kwattr):
474480 self ._halfface [fkey ] = vertices
475481 for name , value in attr .items ():
476482 self .face_attribute (fkey , name , value )
477- for i in range (- 2 , len (vertices ) - 2 ):
478- u = vertices [i ]
479- v = vertices [i + 1 ]
480- w = vertices [i + 2 ]
481- if u == v or v == w :
482- continue
483- self .add_vertex (key = u )
484- self .add_vertex (key = v )
485- self .add_vertex (key = w )
483+ for u , v in iter_edges_from_vertices (vertices ):
486484 if v not in self ._plane [u ]:
487485 self ._plane [u ][v ] = {}
488- self ._plane [u ][v ][w ] = None
489- if v not in self ._plane [w ]:
490- self ._plane [w ][ v ] = {}
491- if u not in self ._plane [w ][ v ]:
492- self . _plane [ w ][ v ][ u ] = None
486+ self ._plane [u ][v ][fkey ] = None
487+ if u not in self ._plane [v ]:
488+ self ._plane [v ][ u ] = {}
489+ self ._plane [v ][ u ][ fkey ] = None
490+
493491 return fkey
494492
495493 def add_cell (self , faces , ckey = None , attr_dict = None , ** kwattr ):
@@ -543,14 +541,12 @@ def add_cell(self, faces, ckey=None, attr_dict=None, **kwattr):
543541 for vertices in faces :
544542 fkey = self .add_halfface (vertices )
545543 vertices = self .halfface_vertices (fkey )
546- for i in range (- 2 , len (vertices ) - 2 ):
547- u = vertices [i ]
548- v = vertices [i + 1 ]
549- w = vertices [i + 2 ]
544+ for u , v in iter_edges_from_vertices (vertices ):
550545 if u not in self ._cell [ckey ]:
551546 self ._cell [ckey ][u ] = {}
552- self ._plane [u ][v ][w ] = ckey
547+ self ._plane [u ][v ][fkey ] = ckey
553548 self ._cell [ckey ][u ][v ] = fkey
549+
554550 return ckey
555551
556552 # --------------------------------------------------------------------------
@@ -608,14 +604,11 @@ def delete_cell(self, cell):
608604 del self ._vertex [vertex ]
609605 for face in cell_faces :
610606 vertices = self .halfface_vertices (face )
611- for i in range (- 2 , len (vertices ) - 2 ):
612- u = vertices [i ]
613- v = vertices [i + 1 ]
614- w = vertices [i + 2 ]
615- self ._plane [u ][v ][w ] = None
616- if self ._plane [w ][v ][u ] is None :
617- del self ._plane [u ][v ][w ]
618- del self ._plane [w ][v ][u ]
607+ for u , v in iter_edges_from_vertices (vertices ):
608+ self ._plane [u ][v ][face ] = None
609+ if self ._plane [v ][u ][face ] is None :
610+ del self ._plane [u ][v ][face ]
611+ del self ._plane [v ][u ][face ]
619612 del self ._halfface [face ]
620613 key = "-" .join (map (str , sorted (vertices )))
621614 if key in self ._face_data :
@@ -2473,10 +2466,9 @@ def edge_halffaces(self, edge):
24732466 halfface = self ._cell [cell ][v ][u ]
24742467 if self .is_halfface_on_boundary (halfface ):
24752468 break
2476- for i in range ( len ( cells )) :
2469+ for _ in cells :
24772470 halfface = self ._cell [cell ][u ][v ]
2478- w = self .halfface_vertex_descendent (halfface , v )
2479- cell = self ._plane [w ][v ][u ]
2471+ cell = self ._plane [v ][u ][halfface ]
24802472 halffaces .append (halfface )
24812473 return halffaces
24822474
@@ -2612,8 +2604,8 @@ def halfface_cell(self, halfface):
26122604 :meth:`halfface_opposite_cell`
26132605
26142606 """
2615- u , v , w = self ._halfface [halfface ][0 : 3 ]
2616- return self ._plane [u ][v ][w ]
2607+ u , v = self ._halfface [halfface ][: 2 ]
2608+ return self ._plane [u ][v ][halfface ]
26172609
26182610 def halfface_opposite_cell (self , halfface ):
26192611 """The cell to which the opposite halfface belongs to.
@@ -2633,8 +2625,8 @@ def halfface_opposite_cell(self, halfface):
26332625 :meth:`halfface_cell`
26342626
26352627 """
2636- u , v , w = self ._halfface [halfface ][0 : 3 ]
2637- return self ._plane [w ][ v ][u ]
2628+ u , v = self ._halfface [halfface ][: 2 ]
2629+ return self ._plane [v ][u ][ halfface ]
26382630
26392631 def halfface_opposite_halfface (self , halfface ):
26402632 """The opposite face of a face.
@@ -2659,11 +2651,9 @@ def halfface_opposite_halfface(self, halfface):
26592651 For a boundary face, the opposite face is None.
26602652
26612653 """
2662- u , v , w = self ._halfface [halfface ][0 :3 ]
2663- nbr = self ._plane [w ][v ][u ]
2664- if nbr is None :
2665- return None
2666- return self ._cell [nbr ][v ][u ]
2654+ u , v = self ._halfface [halfface ][:2 ]
2655+ nbr = self ._plane [v ][u ][halfface ]
2656+ return None if nbr is None else self ._cell [nbr ][v ][u ]
26672657
26682658 def halfface_adjacent_halfface (self , halfface , halfedge ):
26692659 """Return the halfface adjacent to the halfface across the halfedge.
@@ -2693,11 +2683,8 @@ def halfface_adjacent_halfface(self, halfface, halfedge):
26932683 u , v = halfedge
26942684 cell = self .halfface_cell (halfface )
26952685 nbr_halfface = self ._cell [cell ][v ][u ]
2696- w = self .halfface_vertex_ancestor (nbr_halfface , v )
2697- nbr_cell = self ._plane [u ][v ][w ]
2698- if nbr_cell is None :
2699- return None
2700- return self ._cell [nbr_cell ][v ][u ]
2686+ nbr_cell = self ._plane [u ][v ][nbr_halfface ]
2687+ return None if nbr_cell is None else self ._cell [nbr_cell ][v ][u ]
27012688
27022689 def halfface_vertex_ancestor (self , halfface , vertex ):
27032690 """Return the vertex before the specified vertex in a specific face.
@@ -2783,8 +2770,7 @@ def halfface_manifold_neighbors(self, halfface):
27832770 cell = self .halfface_cell (halfface )
27842771 for u , v in self .halfface_halfedges (halfface ):
27852772 nbr_halfface = self ._cell [cell ][v ][u ]
2786- w = self .halfface_vertex_ancestor (nbr_halfface , v )
2787- nbr_cell = self ._plane [u ][v ][w ]
2773+ nbr_cell = self ._plane [u ][v ][nbr_halfface ]
27882774 if nbr_cell is not None :
27892775 nbr = self ._cell [nbr_cell ][v ][u ]
27902776 nbrs .append (nbr )
@@ -2843,8 +2829,8 @@ def is_halfface_on_boundary(self, halfface):
28432829 :meth:`is_vertex_on_boundary`, :meth:`is_edge_on_boundary`, :meth:`is_cell_on_boundary`
28442830
28452831 """
2846- u , v , w = self ._halfface [halfface ][0 : 3 ]
2847- return self ._plane [w ][ v ][u ] is None
2832+ u , v = self ._halfface [halfface ][: 2 ]
2833+ return self ._plane [v ][u ][ halfface ] is None
28482834
28492835 # --------------------------------------------------------------------------
28502836 # Cell topology
0 commit comments