Mesh Creased Catmull-Clark

../_images/mesh-subdivision-creased.png
from compas.geometry import Box, Translation
from compas.geometry import dot_vectors
from compas.datastructures import Mesh

from compas_view2.app import App

box = Box.from_width_height_depth(1, 1, 1)
cage = Mesh.from_shape(box)
cage.update_default_edge_attributes({'crease': 0})

top = sorted(cage.faces(), key=lambda face: dot_vectors(cage.face_normal(face), [0, 0, 1]))[-1]
bottom = sorted(cage.faces(), key=lambda face: dot_vectors(cage.face_normal(face), [0, 0, -1]))[-1]

c0 = cage.copy()
c1 = c0.transformed(Translation.from_vector([1.5, 0, 0]))
c2 = c1.transformed(Translation.from_vector([1.5, 0, 0]))
c3 = c2.transformed(Translation.from_vector([1.5, 0, 0]))
c4 = c3.transformed(Translation.from_vector([1.5, 0, 0]))
c5 = c4.transformed(Translation.from_vector([1.5, 0, 0]))

c1.edges_attribute('crease', 1, keys=list(cage.face_halfedges(top)))
c1.edges_attribute('crease', 1, keys=list(cage.face_halfedges(bottom)))

c2.edges_attribute('crease', 2, keys=list(cage.face_halfedges(top)))
c2.edges_attribute('crease', 2, keys=list(cage.face_halfedges(bottom)))

c3.edges_attribute('crease', 3, keys=list(cage.face_halfedges(top)))
c3.edges_attribute('crease', 3, keys=list(cage.face_halfedges(bottom)))

c4.edges_attribute('crease', 4, keys=list(cage.face_halfedges(top)))
c4.edges_attribute('crease', 4, keys=list(cage.face_halfedges(bottom)))

c5.edges_attribute('crease', 5, keys=list(cage.face_halfedges(top)))
c5.edges_attribute('crease', 5, keys=list(cage.face_halfedges(bottom)))

s0 = c0.subdivide(k=5)
s1 = c1.subdivide(k=5)
s2 = c2.subdivide(k=5)
s3 = c3.subdivide(k=5)
s4 = c4.subdivide(k=5)
s5 = c5.subdivide(k=5)

viewer = App()

viewer.add(c0, show_faces=False, show_edges=True)
viewer.add(s0)

viewer.add(c1, show_faces=False, show_edges=True)
viewer.add(s1)

viewer.add(c2, show_faces=False, show_edges=True)
viewer.add(s2)

viewer.add(c3, show_faces=False, show_edges=True)
viewer.add(s3)

viewer.add(c4, show_faces=False, show_edges=True)
viewer.add(s4)

viewer.add(c5, show_faces=False, show_edges=True)
viewer.add(s5)

viewer.run()