Skip to content

Commit 4fe88e2

Browse files
authored
Merge pull request #1177 from compas-dev/origin/fix_halfface_plane
Fix halfface _plane
2 parents c9c41e7 + 9170587 commit 4fe88e2

File tree

3 files changed

+39
-52
lines changed

3 files changed

+39
-52
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
204204
* Fixed bug in `compas.datastructures.Mesh.insert_vertex`.
205205
* Fixed bug in `compas.geometry.angle_vectors_signed`.
206206
* Changed `compas.artists.MeshArtist` default colors.
207+
* Changed internal _plane storage of the `compas.datastructures.Halfface` from `_plane[u][v][w]` to `_plane[u][v][fkey]`
207208

208209
### Removed
209210

src/compas/datastructures/halfface/halfface.py

Lines changed: 34 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@
1313
from 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+
1622
class 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

tests/compas/datastructures/test_halfface.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ def test_edges_where_predicate():
175175

176176
def test_faces_where():
177177
hf = HalfFace(default_face_attributes={"a": 1, "b": 2})
178-
for vkey in range(4):
178+
for vkey in range(5):
179179
hf.add_vertex(vkey)
180180
for i in range(3):
181181
hf.add_halfface([i, i + 1, i + 2])
@@ -185,7 +185,7 @@ def test_faces_where():
185185

186186
def test_faces_where_predicate():
187187
hf = HalfFace(default_face_attributes={"a": 1, "b": 2})
188-
for vkey in range(4):
188+
for vkey in range(5):
189189
hf.add_vertex(vkey)
190190
for i in range(3):
191191
hf.add_halfface([i, i + 1, i + 2])
@@ -200,7 +200,7 @@ def test_faces_where_predicate():
200200

201201
def test_cells_where():
202202
hf = HalfFace(default_cell_attributes={"a": 1, "b": 2})
203-
for vkey in range(5):
203+
for vkey in range(6):
204204
hf.add_vertex(vkey)
205205
for i in range(3):
206206
hf.add_cell(
@@ -217,7 +217,7 @@ def test_cells_where():
217217

218218
def test_cells_where_predicate():
219219
hf = HalfFace(default_cell_attributes={"a": 1, "b": 2})
220-
for vkey in range(5):
220+
for vkey in range(6):
221221
hf.add_vertex(vkey)
222222
for i in range(3):
223223
hf.add_cell(

0 commit comments

Comments
 (0)