Python source

git-svn-id: http://www.openmesh.org/svnrepo/OpenMesh/trunk@1171 fdac6126-5c0c-442c-9429-916003d36597
This commit is contained in:
Jan Möbius
2014-09-16 11:15:13 +00:00
parent 4613850d8e
commit 8a19cd851e
39 changed files with 6844 additions and 0 deletions

View File

@@ -0,0 +1,333 @@
import unittest
import openmesh
class AddFace(unittest.TestCase):
def test_add_triangles_to_trimesh(self):
self.mesh = openmesh.TriMesh()
self.vhandle = []
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 0, 0)))
# Add two faces
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[0])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
# Test setup:
# 1 === 2
# | / |
# | / |
# | / |
# 0 === 3
# Check setup
self.assertEqual(self.mesh.n_vertices(), 4)
self.assertEqual(self.mesh.n_faces(), 2)
def test_add_quad_to_trimesh(self):
self.mesh = openmesh.TriMesh()
self.vhandle = []
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 0, 0)))
# Add two faces
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
# Test setup:
# 1 === 2
# | / |
# | / |
# | / |
# 0 === 3
# Check setup
self.assertEqual(self.mesh.n_vertices(), 4)
self.assertEqual(self.mesh.n_faces(), 2)
def test_create_triangle_mesh_cube(self):
self.mesh = openmesh.TriMesh()
self.vhandle = []
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, -1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, -1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, 1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, 1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, -1, -1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, -1, -1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, 1, -1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, 1, -1)))
# Add six faces to form a cube
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
#=======================
face_vhandles = []
face_vhandles.append(self.vhandle[7])
face_vhandles.append(self.vhandle[6])
face_vhandles.append(self.vhandle[5])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[7])
face_vhandles.append(self.vhandle[5])
face_vhandles.append(self.vhandle[4])
self.mesh.add_face(face_vhandles)
#=======================
face_vhandles = []
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[4])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[4])
face_vhandles.append(self.vhandle[5])
self.mesh.add_face(face_vhandles)
#=======================
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[5])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[5])
face_vhandles.append(self.vhandle[6])
self.mesh.add_face(face_vhandles)
#=======================
face_vhandles = []
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[6])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[6])
face_vhandles.append(self.vhandle[7])
self.mesh.add_face(face_vhandles)
#=======================
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[7])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[7])
face_vhandles.append(self.vhandle[4])
self.mesh.add_face(face_vhandles)
# Test setup:
#
# 3 ======== 2
# / /|
# / / | z
# 0 ======== 1 | |
# | | | | y
# | 7 | 6 | /
# | | / | /
# | |/ |/
# 4 ======== 5 -------> x
# Check setup
self.assertEqual(self.mesh.n_edges(), 18)
self.assertEqual(self.mesh.n_halfedges(), 36)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_faces(), 12)
def test_create_strange_config(self):
self.mesh = openmesh.TriMesh()
self.vhandle = []
# 2 x-----------x 1
# \ /
# \ /
# \ /
# \ /
# \ /
# 0 x ---x 6
# /|\ |
# / | \ |
# / | \ |
# / | \|
# x----x x
# 3 4 5
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2, 2, 2)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(3, 3, 3)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(4, 4, 4)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(5, 5, 5)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(6, 6, 6)))
self.mesh.add_face(self.vhandle[0], self.vhandle[1], self.vhandle[2])
self.mesh.add_face(self.vhandle[0], self.vhandle[3], self.vhandle[4])
self.mesh.add_face(self.vhandle[0], self.vhandle[5], self.vhandle[6])
# non-manifold!
self.mesh.add_face(self.vhandle[3], self.vhandle[0], self.vhandle[4])
# Check setup
self.assertEqual(self.mesh.n_vertices(), 7)
self.assertEqual(self.mesh.n_faces(), 4)
def test_add_quad_to_polymesh(self):
self.mesh = openmesh.PolyMesh()
self.vhandle = []
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 0, 0)))
# Add one face
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
# Test setup:
# 1 === 2
# | |
# | |
# | |
# 0 === 3
# Check setup
self.assertEqual(self.mesh.n_vertices(), 4)
self.assertEqual(self.mesh.n_faces(), 1)
def test_create_poly_mesh_cube(self):
self.mesh = openmesh.PolyMesh()
self.vhandle = []
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, -1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, -1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, 1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, 1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, -1, -1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, -1, -1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, 1, -1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, 1, -1)))
# Add six faces to form a cube
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[7])
face_vhandles.append(self.vhandle[6])
face_vhandles.append(self.vhandle[5])
face_vhandles.append(self.vhandle[4])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[4])
face_vhandles.append(self.vhandle[5])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[5])
face_vhandles.append(self.vhandle[6])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[6])
face_vhandles.append(self.vhandle[7])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[7])
face_vhandles.append(self.vhandle[4])
self.mesh.add_face(face_vhandles)
# Test setup:
#
# 3 ======== 2
# / /|
# / / | z
# 0 ======== 1 | |
# | | | | y
# | 7 | 6 | /
# | | / | /
# | |/ |/
# 4 ======== 5 -------> x
# Check setup
self.assertEqual(self.mesh.n_edges(), 12)
self.assertEqual(self.mesh.n_halfedges(), 24)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_faces(), 6)
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(AddFace)
unittest.TextTestRunner(verbosity=2).run(suite)

View File

@@ -0,0 +1,86 @@
import unittest
import openmesh
class BoundaryTriangleMesh(unittest.TestCase):
def setUp(self):
self.mesh = openmesh.TriMesh()
# Add some vertices
self.vhandle = []
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0,-1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2,-1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(3, 0, 0)))
# Single point
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0,-2, 0)))
# Add five faces
self.fhandle = []
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[2])
self.fhandle.append(self.mesh.add_face(face_vhandles))
face_vhandles = []
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[4])
self.fhandle.append(self.mesh.add_face(face_vhandles))
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[1])
self.fhandle.append(self.mesh.add_face(face_vhandles))
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[4])
self.fhandle.append(self.mesh.add_face(face_vhandles))
face_vhandles = []
face_vhandles.append(self.vhandle[5])
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[4])
self.fhandle.append(self.mesh.add_face(face_vhandles))
# Test setup:
# 0 ==== 2
# |\ 0 /|\
# | \ / | \
# |2 1 3|4 5
# | / \ | /
# |/ 1 \|/
# 3 ==== 4
#
# Vertex 6 single
def test_boundary_vertex(self):
self.assertTrue (self.mesh.is_boundary(self.vhandle[0]))
self.assertFalse(self.mesh.is_boundary(self.vhandle[1]))
self.assertTrue (self.mesh.is_boundary(self.vhandle[2]))
self.assertTrue (self.mesh.is_boundary(self.vhandle[3]))
self.assertTrue (self.mesh.is_boundary(self.vhandle[4]))
self.assertTrue (self.mesh.is_boundary(self.vhandle[5]))
self.assertTrue (self.mesh.is_boundary(self.vhandle[6]))
def test_boundary_face(self):
self.assertTrue (self.mesh.is_boundary(self.fhandle[0]))
self.assertTrue (self.mesh.is_boundary(self.fhandle[1]))
self.assertTrue (self.mesh.is_boundary(self.fhandle[2]))
self.assertFalse(self.mesh.is_boundary(self.fhandle[3]))
self.assertTrue (self.mesh.is_boundary(self.fhandle[4]))
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(BoundaryTriangleMesh)
unittest.TextTestRunner(verbosity=2).run(suite)

View File

@@ -0,0 +1,530 @@
import unittest
import openmesh
class DeleteFaceTriangleMesh(unittest.TestCase):
def test_delete_half_triangle_mesh_cube_no_edge_status(self):
self.mesh = openmesh.TriMesh()
self.vhandle = []
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, -1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, -1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, 1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, 1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, -1, -1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, -1, -1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, 1, -1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, 1, -1)))
# Add six faces to form a cube
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
#=======================
face_vhandles = []
face_vhandles.append(self.vhandle[7])
face_vhandles.append(self.vhandle[6])
face_vhandles.append(self.vhandle[5])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[7])
face_vhandles.append(self.vhandle[5])
face_vhandles.append(self.vhandle[4])
self.mesh.add_face(face_vhandles)
#=======================
face_vhandles = []
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[4])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[4])
face_vhandles.append(self.vhandle[5])
self.mesh.add_face(face_vhandles)
#=======================
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[5])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[5])
face_vhandles.append(self.vhandle[6])
self.mesh.add_face(face_vhandles)
#=======================
face_vhandles = []
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[6])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[6])
face_vhandles.append(self.vhandle[7])
self.mesh.add_face(face_vhandles)
#=======================
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[7])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[7])
face_vhandles.append(self.vhandle[4])
self.mesh.add_face(face_vhandles)
# Test setup:
#
# 3 ======== 2
# / /|
# / / | z
# 0 ======== 1 | |
# | | | | y
# | 7 | 6 | /
# | | / | /
# | |/ |/
# 4 ======== 5 -------> x
# Check setup
self.assertEqual(self.mesh.n_edges(), 18)
self.assertEqual(self.mesh.n_halfedges(), 36)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_faces(), 12)
# =====================================================
# Now we delete half of the mesh
# =====================================================
self.mesh.request_face_status()
self.mesh.request_vertex_status()
self.mesh.request_halfedge_status()
n_face_to_delete = self.mesh.n_faces() / 2
# Check the variable
self.assertEqual(n_face_to_delete, 6)
for i in range(int(n_face_to_delete)):
self.mesh.delete_face(self.mesh.face_handle(i))
# =====================================================
# Check config afterwards
# =====================================================
self.assertEqual(self.mesh.n_edges(), 18)
self.assertEqual(self.mesh.n_halfedges(), 36)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_faces(), 12)
# =====================================================
# Cleanup and recheck
# =====================================================
self.mesh.garbage_collection()
self.assertEqual(self.mesh.n_edges(), 18)
self.assertEqual(self.mesh.n_halfedges(), 36)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_faces(), 6)
def test_delete_half_triangle_mesh_cube_with_edge_status(self):
self.mesh = openmesh.TriMesh()
self.vhandle = []
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, -1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, -1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, 1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, 1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, -1, -1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, -1, -1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, 1, -1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, 1, -1)))
# Add six faces to form a cube
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
#=======================
face_vhandles = []
face_vhandles.append(self.vhandle[7])
face_vhandles.append(self.vhandle[6])
face_vhandles.append(self.vhandle[5])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[7])
face_vhandles.append(self.vhandle[5])
face_vhandles.append(self.vhandle[4])
self.mesh.add_face(face_vhandles)
#=======================
face_vhandles = []
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[4])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[4])
face_vhandles.append(self.vhandle[5])
self.mesh.add_face(face_vhandles)
#=======================
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[5])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[5])
face_vhandles.append(self.vhandle[6])
self.mesh.add_face(face_vhandles)
#=======================
face_vhandles = []
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[6])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[6])
face_vhandles.append(self.vhandle[7])
self.mesh.add_face(face_vhandles)
#=======================
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[7])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[7])
face_vhandles.append(self.vhandle[4])
self.mesh.add_face(face_vhandles)
# Test setup:
#
# 3 ======== 2
# / /|
# / / | z
# 0 ======== 1 | |
# | | | | y
# | 7 | 6 | /
# | | / | /
# | |/ |/
# 4 ======== 5 -------> x
# Check setup
self.assertEqual(self.mesh.n_edges(), 18)
self.assertEqual(self.mesh.n_halfedges(), 36)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_faces(), 12)
# =====================================================
# Now we delete half of the mesh
# =====================================================
self.mesh.request_face_status()
self.mesh.request_vertex_status()
self.mesh.request_edge_status()
self.mesh.request_halfedge_status()
n_face_to_delete = self.mesh.n_faces() / 2
# Check the variable
self.assertEqual(n_face_to_delete, 6)
for i in range(int(n_face_to_delete)):
self.mesh.delete_face(self.mesh.face_handle(i))
# =====================================================
# Check config afterwards
# =====================================================
self.assertEqual(self.mesh.n_edges(), 18)
self.assertEqual(self.mesh.n_halfedges(), 36)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_faces(), 12)
# =====================================================
# Cleanup and recheck
# =====================================================
self.mesh.garbage_collection()
self.assertEqual(self.mesh.n_edges(), 13)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_faces(), 6)
def test_deletete_half_poly_mesh_cube_without_edge_status(self):
self.mesh = openmesh.PolyMesh()
self.vhandle = []
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, -1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, -1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, 1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, 1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, -1, -1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, -1, -1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, 1, -1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, 1, -1)))
# Add six faces to form a cube
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[7])
face_vhandles.append(self.vhandle[6])
face_vhandles.append(self.vhandle[5])
face_vhandles.append(self.vhandle[4])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[4])
face_vhandles.append(self.vhandle[5])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[5])
face_vhandles.append(self.vhandle[6])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[6])
face_vhandles.append(self.vhandle[7])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[7])
face_vhandles.append(self.vhandle[4])
self.mesh.add_face(face_vhandles)
# Test setup:
#
# 3 ======== 2
# / /|
# / / | z
# 0 ======== 1 | |
# | | | | y
# | 7 | 6 | /
# | | / | /
# | |/ |/
# 4 ======== 5 -------> x
# Check setup
self.assertEqual(self.mesh.n_edges(), 12)
self.assertEqual(self.mesh.n_halfedges(), 24)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_faces(), 6)
# =====================================================
# Now we delete half of the mesh
# =====================================================
self.mesh.request_face_status()
self.mesh.request_vertex_status()
self.mesh.request_halfedge_status()
n_face_to_delete = self.mesh.n_faces() / 2
# Check the variable
self.assertEqual(n_face_to_delete, 3)
for i in range(int(n_face_to_delete)):
self.mesh.delete_face(self.mesh.face_handle(i))
# =====================================================
# Check config afterwards
# =====================================================
self.assertEqual(self.mesh.n_edges(), 12)
self.assertEqual(self.mesh.n_halfedges(), 24)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_faces(), 6)
# =====================================================
# Cleanup and recheck
# =====================================================
self.mesh.garbage_collection()
self.assertEqual(self.mesh.n_edges(), 12)
self.assertEqual(self.mesh.n_halfedges(), 24)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_faces(), 3)
def test_deletete_half_poly_mesh_cube_with_edge_status(self):
self.mesh = openmesh.PolyMesh()
self.vhandle = []
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, -1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, -1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, 1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, 1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, -1, -1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, -1, -1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, 1, -1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, 1, -1)))
# Add six faces to form a cube
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[7])
face_vhandles.append(self.vhandle[6])
face_vhandles.append(self.vhandle[5])
face_vhandles.append(self.vhandle[4])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[4])
face_vhandles.append(self.vhandle[5])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[5])
face_vhandles.append(self.vhandle[6])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[6])
face_vhandles.append(self.vhandle[7])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[7])
face_vhandles.append(self.vhandle[4])
self.mesh.add_face(face_vhandles)
# Test setup:
#
# 3 ======== 2
# / /|
# / / | z
# 0 ======== 1 | |
# | | | | y
# | 7 | 6 | /
# | | / | /
# | |/ |/
# 4 ======== 5 -------> x
# Check setup
self.assertEqual(self.mesh.n_edges(), 12)
self.assertEqual(self.mesh.n_halfedges(), 24)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_faces(), 6)
# =====================================================
# Now we delete half of the mesh
# =====================================================
self.mesh.request_face_status()
self.mesh.request_vertex_status()
self.mesh.request_edge_status()
self.mesh.request_halfedge_status()
n_face_to_delete = self.mesh.n_faces() / 2
# Check the variable
self.assertEqual(n_face_to_delete, 3)
for i in range(int(n_face_to_delete)):
self.mesh.delete_face(self.mesh.face_handle(i))
# =====================================================
# Check config afterwards
# =====================================================
self.assertEqual(self.mesh.n_edges(), 12)
self.assertEqual(self.mesh.n_halfedges(), 24)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_faces(), 6)
# =====================================================
# Cleanup and recheck
# =====================================================
self.mesh.garbage_collection()
self.assertEqual(self.mesh.n_edges(), 10)
self.assertEqual(self.mesh.n_halfedges(), 20)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_faces(), 3)
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(DeleteFaceTriangleMesh)
unittest.TextTestRunner(verbosity=2).run(suite)

View File

@@ -0,0 +1,289 @@
import unittest
import openmesh
class Property(unittest.TestCase):
def setUp(self):
self.mesh = openmesh.TriMesh()
self.vhandle = []
def test_vertex_property_copy_properties_int(self):
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 0, 0)))
# Add two faces
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[0])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
# Test setup:
# 1 === 2
# | / |
# | / |
# | / |
# 0 === 3
# Check setup
self.assertEqual(self.mesh.n_vertices(), 4)
self.assertEqual(self.mesh.n_faces(), 2)
# Add a vertex property
intHandle = openmesh.VPropHandle()
self.assertFalse(self.mesh.get_property_handle(intHandle, "intProp"))
self.mesh.add_property(intHandle, "intProp")
self.assertTrue(self.mesh.get_property_handle(intHandle, "intProp"))
# Fill property
for vh in self.mesh.vertices():
self.mesh.set_property(intHandle, vh, vh.idx())
# Check if property it is ok
v_it = self.mesh.vertices()
self.assertEqual(self.mesh.property(intHandle, v_it.next()), 0)
self.assertEqual(self.mesh.property(intHandle, v_it.next()), 1)
self.assertEqual(self.mesh.property(intHandle, v_it.next()), 2)
self.assertEqual(self.mesh.property(intHandle, v_it.next()), 3)
# Check vertex positions
v_it = self.mesh.vertices()
vh = v_it.next()
self.assertEqual(self.mesh.point(vh)[0], 0)
self.assertEqual(self.mesh.point(vh)[1], 0)
self.assertEqual(self.mesh.point(vh)[2], 0)
vh = v_it.next()
self.assertEqual(self.mesh.point(vh)[0], 0)
self.assertEqual(self.mesh.point(vh)[1], 1)
self.assertEqual(self.mesh.point(vh)[2], 0)
vh = v_it.next()
self.assertEqual(self.mesh.point(vh)[0], 1)
self.assertEqual(self.mesh.point(vh)[1], 1)
self.assertEqual(self.mesh.point(vh)[2], 0)
vh = v_it.next()
self.assertEqual(self.mesh.point(vh)[0], 1)
self.assertEqual(self.mesh.point(vh)[1], 0)
self.assertEqual(self.mesh.point(vh)[2], 0)
# Copy from vertex 1 to 0, with skipping build in properties
self.mesh.copy_all_properties(self.vhandle[1], self.vhandle[0])
v_it = self.mesh.vertices()
vh = v_it.next()
self.assertEqual(self.mesh.point(vh)[0], 0)
self.assertEqual(self.mesh.point(vh)[1], 0)
self.assertEqual(self.mesh.point(vh)[2], 0)
vh = v_it.next()
self.assertEqual(self.mesh.point(vh)[0], 0)
self.assertEqual(self.mesh.point(vh)[1], 1)
self.assertEqual(self.mesh.point(vh)[2], 0)
vh = v_it.next()
self.assertEqual(self.mesh.point(vh)[0], 1)
self.assertEqual(self.mesh.point(vh)[1], 1)
self.assertEqual(self.mesh.point(vh)[2], 0)
vh = v_it.next()
self.assertEqual(self.mesh.point(vh)[0], 1)
self.assertEqual(self.mesh.point(vh)[1], 0)
self.assertEqual(self.mesh.point(vh)[2], 0)
v_it = self.mesh.vertices()
self.assertEqual(self.mesh.property(intHandle, v_it.next()), 1)
self.assertEqual(self.mesh.property(intHandle, v_it.next()), 1)
self.assertEqual(self.mesh.property(intHandle, v_it.next()), 2)
self.assertEqual(self.mesh.property(intHandle, v_it.next()), 3)
# Copy from vertex 2 to 3, including build in properties
self.mesh.copy_all_properties(self.vhandle[2], self.vhandle[3], True)
v_it = self.mesh.vertices()
vh = v_it.next()
self.assertEqual(self.mesh.point(vh)[0], 0)
self.assertEqual(self.mesh.point(vh)[1], 0)
self.assertEqual(self.mesh.point(vh)[2], 0)
vh = v_it.next()
self.assertEqual(self.mesh.point(vh)[0], 0)
self.assertEqual(self.mesh.point(vh)[1], 1)
self.assertEqual(self.mesh.point(vh)[2], 0)
vh = v_it.next()
self.assertEqual(self.mesh.point(vh)[0], 1)
self.assertEqual(self.mesh.point(vh)[1], 1)
self.assertEqual(self.mesh.point(vh)[2], 0)
vh = v_it.next()
self.assertEqual(self.mesh.point(vh)[0], 1)
self.assertEqual(self.mesh.point(vh)[1], 1)
self.assertEqual(self.mesh.point(vh)[2], 0)
v_it = self.mesh.vertices()
self.assertEqual(self.mesh.property(intHandle, v_it.next()), 1)
self.assertEqual(self.mesh.property(intHandle, v_it.next()), 1)
self.assertEqual(self.mesh.property(intHandle, v_it.next()), 2)
self.assertEqual(self.mesh.property(intHandle, v_it.next()), 2)
def test_check_status_properties_halfedge_edge_all_deleted(self):
self.mesh.request_vertex_status()
self.mesh.request_face_status()
self.mesh.request_halfedge_status()
self.mesh.request_edge_status()
# Define positions
p1 = openmesh.Vec3d(0, 0, 0)
p2 = openmesh.Vec3d(0, 1, 0)
p3 = openmesh.Vec3d(1, 1, 0)
p4 = openmesh.Vec3d(0, 0, 1)
# Add some vertices
vh1 = self.mesh.add_vertex(p1)
vh2 = self.mesh.add_vertex(p2)
vh3 = self.mesh.add_vertex(p3)
vh4 = self.mesh.add_vertex(p4)
# Add some faces
f1 = self.mesh.add_face(vh1, vh3, vh2)
f2 = self.mesh.add_face(vh1, vh2, vh4)
f3 = self.mesh.add_face(vh2, vh3, vh4)
f4 = self.mesh.add_face(vh3, vh1, vh4)
# Delete all faces
self.mesh.delete_face(f1)
self.mesh.delete_face(f2)
self.mesh.delete_face(f3)
self.mesh.delete_face(f4)
for heh in self.mesh.halfedges():
self.assertTrue(self.mesh.status(self.mesh.edge_handle(heh)).deleted())
self.assertTrue(self.mesh.status(heh).deleted())
def test_copy_all_properties_vertex_after_remove_of_property(self):
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 0, 0)))
# Add two faces
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[0])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
# Test setup:
# 1 === 2
# | / |
# | / |
# | / |
# 0 === 3
# Check setup
self.assertEqual(self.mesh.n_vertices(), 4)
self.assertEqual(self.mesh.n_faces(), 2)
# Add a double vertex property
doubleHandle = openmesh.VPropHandle()
self.assertFalse(self.mesh.get_property_handle(doubleHandle, "doubleProp"))
self.mesh.add_property(doubleHandle, "doubleProp")
self.assertTrue(self.mesh.get_property_handle(doubleHandle, "doubleProp"))
# Add a int vertex property
intHandle = openmesh.VPropHandle()
self.assertFalse(self.mesh.get_property_handle(intHandle, "intProp"))
self.mesh.add_property(intHandle, "intProp")
self.assertTrue(self.mesh.get_property_handle(intHandle, "intProp"))
# Now remove the double property again
self.mesh.remove_property(doubleHandle)
# Fill int property
for vh in self.mesh.vertices():
self.mesh.set_property(intHandle, vh, vh.idx())
# Check if property it is ok
v_it = self.mesh.vertices()
self.assertEqual(self.mesh.property(intHandle, v_it.next()), 0)
self.assertEqual(self.mesh.property(intHandle, v_it.next()), 1)
self.assertEqual(self.mesh.property(intHandle, v_it.next()), 2)
self.assertEqual(self.mesh.property(intHandle, v_it.next()), 3)
# Check vertex positions
v_it = self.mesh.vertices()
vh = v_it.next()
self.assertEqual(self.mesh.point(vh)[0], 0)
self.assertEqual(self.mesh.point(vh)[1], 0)
self.assertEqual(self.mesh.point(vh)[2], 0)
vh = v_it.next()
self.assertEqual(self.mesh.point(vh)[0], 0)
self.assertEqual(self.mesh.point(vh)[1], 1)
self.assertEqual(self.mesh.point(vh)[2], 0)
vh = v_it.next()
self.assertEqual(self.mesh.point(vh)[0], 1)
self.assertEqual(self.mesh.point(vh)[1], 1)
self.assertEqual(self.mesh.point(vh)[2], 0)
vh = v_it.next()
self.assertEqual(self.mesh.point(vh)[0], 1)
self.assertEqual(self.mesh.point(vh)[1], 0)
self.assertEqual(self.mesh.point(vh)[2], 0)
# Copy from vertex 1 to 0, with skipping build in properties
self.mesh.copy_all_properties(self.vhandle[1], self.vhandle[0])
v_it = self.mesh.vertices()
vh = v_it.next()
self.assertEqual(self.mesh.point(vh)[0], 0)
self.assertEqual(self.mesh.point(vh)[1], 0)
self.assertEqual(self.mesh.point(vh)[2], 0)
vh = v_it.next()
self.assertEqual(self.mesh.point(vh)[0], 0)
self.assertEqual(self.mesh.point(vh)[1], 1)
self.assertEqual(self.mesh.point(vh)[2], 0)
vh = v_it.next()
self.assertEqual(self.mesh.point(vh)[0], 1)
self.assertEqual(self.mesh.point(vh)[1], 1)
self.assertEqual(self.mesh.point(vh)[2], 0)
vh = v_it.next()
self.assertEqual(self.mesh.point(vh)[0], 1)
self.assertEqual(self.mesh.point(vh)[1], 0)
self.assertEqual(self.mesh.point(vh)[2], 0)
v_it = self.mesh.vertices()
self.assertEqual(self.mesh.property(intHandle, v_it.next()), 1)
self.assertEqual(self.mesh.property(intHandle, v_it.next()), 1)
self.assertEqual(self.mesh.property(intHandle, v_it.next()), 2)
self.assertEqual(self.mesh.property(intHandle, v_it.next()), 3)
# Copy from vertex 2 to 3, including build in properties
self.mesh.copy_all_properties(self.vhandle[2], self.vhandle[3], True)
v_it = self.mesh.vertices()
vh = v_it.next()
self.assertEqual(self.mesh.point(vh)[0], 0)
self.assertEqual(self.mesh.point(vh)[1], 0)
self.assertEqual(self.mesh.point(vh)[2], 0)
vh = v_it.next()
self.assertEqual(self.mesh.point(vh)[0], 0)
self.assertEqual(self.mesh.point(vh)[1], 1)
self.assertEqual(self.mesh.point(vh)[2], 0)
vh = v_it.next()
self.assertEqual(self.mesh.point(vh)[0], 1)
self.assertEqual(self.mesh.point(vh)[1], 1)
self.assertEqual(self.mesh.point(vh)[2], 0)
vh = v_it.next()
self.assertEqual(self.mesh.point(vh)[0], 1)
self.assertEqual(self.mesh.point(vh)[1], 1)
self.assertEqual(self.mesh.point(vh)[2], 0)
v_it = self.mesh.vertices()
self.assertEqual(self.mesh.property(intHandle, v_it.next()), 1)
self.assertEqual(self.mesh.property(intHandle, v_it.next()), 1)
self.assertEqual(self.mesh.property(intHandle, v_it.next()), 2)
self.assertEqual(self.mesh.property(intHandle, v_it.next()), 2)
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(Property)
unittest.TextTestRunner(verbosity=2).run(suite)

View File

@@ -0,0 +1,71 @@
import unittest
import openmesh
class Python(unittest.TestCase):
def setUp(self):
self.mesh = openmesh.TriMesh()
# Add some vertices
self.vhandle = []
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0,-1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2,-1, 0)))
# Add four faces using Python lists
vertex_list = [self.vhandle[0], self.vhandle[1], self.vhandle[2]]
self.mesh.add_face(vertex_list)
vertex_list = [self.vhandle[1], self.vhandle[3], self.vhandle[4]]
self.mesh.add_face(vertex_list)
vertex_list = [self.vhandle[0], self.vhandle[3], self.vhandle[1]]
self.mesh.add_face(vertex_list)
vertex_list = [self.vhandle[2], self.vhandle[1], self.vhandle[4]]
self.mesh.add_face(vertex_list)
# Test setup:
# 0 ==== 2
# |\ 0 /|
# | \ / |
# |2 1 3|
# | / \ |
# |/ 1 \|
# 3 ==== 4
def test_python_iterator(self):
# Iterate over all vertices
indices = [0, 1, 2, 3, 4]
for v, idx in zip(self.mesh.vertices(), indices):
self.assertEqual(v.idx(), idx)
def test_python_circulator(self):
# Iterate around vertex 1 at the middle
indices = [4, 3, 0, 2]
for v, idx in zip(self.mesh.vv(self.vhandle[1]), indices):
self.assertEqual(v.idx(), idx)
def test_property_manager(self):
# Check if vertex property exists
self.assertFalse(openmesh.VPropertyManager.property_exists(self.mesh, "prop"))
# Create a new vertex property
propman = openmesh.VPropertyManager(self.mesh, "prop")
self.assertTrue(propman.property_exists(self.mesh, "prop"))
# Check initial property values
for v in self.mesh.vertices():
self.assertEqual(propman[v], None)
# Set property values
propman.set_range(self.mesh.vertices(), 0.0)
# Check again
for v in self.mesh.vertices():
self.assertEqual(propman[v], 0.0)
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(Python)
unittest.TextTestRunner(verbosity=2).run(suite)

View File

@@ -0,0 +1,229 @@
import unittest
import openmesh
class ReadWriteOBJ(unittest.TestCase):
def setUp(self):
self.mesh = openmesh.TriMesh()
def test_load_simple_obj(self):
ok = openmesh.read_mesh(self.mesh, "cube-minimal.obj")
self.assertTrue(ok)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_edges(), 18)
self.assertEqual(self.mesh.n_faces(), 12)
def test_load_simple_obj_check_halfedge_and_vertex_normals(self):
self.mesh.request_halfedge_normals()
self.mesh.request_vertex_normals()
options = openmesh.Options()
options += openmesh.Options.VertexNormal
file_name = "cube-minimal.obj"
ok = openmesh.read_mesh(self.mesh, file_name, options)
self.assertTrue(ok)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_edges(), 18)
self.assertEqual(self.mesh.n_faces(), 12)
self.assertEqual(self.mesh.n_halfedges(), 36)
# =====================================================
# Check vertex normals
# =====================================================
self.assertEqual(self.mesh.normal(self.mesh.vertex_handle(0))[0], 0.0)
self.assertEqual(self.mesh.normal(self.mesh.vertex_handle(0))[1], -1.0)
self.assertEqual(self.mesh.normal(self.mesh.vertex_handle(0))[2], 0.0)
self.assertEqual(self.mesh.normal(self.mesh.vertex_handle(3))[0], 0.0)
self.assertEqual(self.mesh.normal(self.mesh.vertex_handle(3))[1], 0.0)
self.assertEqual(self.mesh.normal(self.mesh.vertex_handle(3))[2], 1.0)
self.assertEqual(self.mesh.normal(self.mesh.vertex_handle(4))[0], 0.0)
self.assertEqual(self.mesh.normal(self.mesh.vertex_handle(4))[1], -1.0)
self.assertEqual(self.mesh.normal(self.mesh.vertex_handle(4))[2], 0.0)
self.assertEqual(self.mesh.normal(self.mesh.vertex_handle(7))[0], 0.0)
self.assertEqual(self.mesh.normal(self.mesh.vertex_handle(7))[1], 0.0)
self.assertEqual(self.mesh.normal(self.mesh.vertex_handle(7))[2], 1.0)
# =====================================================
# Check halfedge normals
# =====================================================
self.assertEqual(self.mesh.normal(self.mesh.halfedge_handle( 0))[0], 0.0)
self.assertEqual(self.mesh.normal(self.mesh.halfedge_handle( 0))[1], 0.0)
self.assertEqual(self.mesh.normal(self.mesh.halfedge_handle( 0))[2], -1.0)
self.assertEqual(self.mesh.normal(self.mesh.halfedge_handle(10))[0], -1.0)
self.assertEqual(self.mesh.normal(self.mesh.halfedge_handle(10))[1], 0.0)
self.assertEqual(self.mesh.normal(self.mesh.halfedge_handle(10))[2], 0.0)
self.assertEqual(self.mesh.normal(self.mesh.halfedge_handle(19))[0], 0.0)
self.assertEqual(self.mesh.normal(self.mesh.halfedge_handle(19))[1], 1.0)
self.assertEqual(self.mesh.normal(self.mesh.halfedge_handle(19))[2], 0.0)
self.assertEqual(self.mesh.normal(self.mesh.halfedge_handle(24))[0], 1.0)
self.assertEqual(self.mesh.normal(self.mesh.halfedge_handle(24))[1], 0.0)
self.assertEqual(self.mesh.normal(self.mesh.halfedge_handle(24))[2], 0.0)
self.assertEqual(self.mesh.normal(self.mesh.halfedge_handle(30))[0], 0.0)
self.assertEqual(self.mesh.normal(self.mesh.halfedge_handle(30))[1], -1.0)
self.assertEqual(self.mesh.normal(self.mesh.halfedge_handle(30))[2], 0.0)
self.assertEqual(self.mesh.normal(self.mesh.halfedge_handle(35))[0], 0.0)
self.assertEqual(self.mesh.normal(self.mesh.halfedge_handle(35))[1], 0.0)
self.assertEqual(self.mesh.normal(self.mesh.halfedge_handle(35))[2], 1.0)
self.mesh.release_vertex_normals()
self.mesh.release_halfedge_normals()
def test_load_simple_obj_force_vertex_colors_although_not_available(self):
self.mesh.request_vertex_colors()
file_name = "cube-minimal.obj"
options = openmesh.Options()
options += openmesh.Options.VertexColor
ok = openmesh.read_mesh(self.mesh, file_name, options)
self.assertTrue(ok)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_edges(), 18)
self.assertEqual(self.mesh.n_faces(), 12)
self.assertEqual(self.mesh.n_halfedges(), 36)
def test_load_simple_obj_check_texcoords(self):
self.mesh.request_halfedge_texcoords2D()
options = openmesh.Options()
options += openmesh.Options.FaceTexCoord
file_name = "cube-minimal-texCoords.obj"
ok = openmesh.read_mesh(self.mesh, file_name, options)
self.assertTrue(ok)
self.assertEqual(self.mesh.texcoord2D(self.mesh.halfedge_handle( 0))[0], 1.0)
self.assertEqual(self.mesh.texcoord2D(self.mesh.halfedge_handle( 0))[1], 1.0)
self.assertEqual(self.mesh.texcoord2D(self.mesh.halfedge_handle(10))[0], 3.0)
self.assertEqual(self.mesh.texcoord2D(self.mesh.halfedge_handle(10))[1], 3.0)
self.assertEqual(self.mesh.texcoord2D(self.mesh.halfedge_handle(19))[0], 6.0)
self.assertEqual(self.mesh.texcoord2D(self.mesh.halfedge_handle(19))[1], 6.0)
self.assertEqual(self.mesh.texcoord2D(self.mesh.halfedge_handle(24))[0], 7.0)
self.assertEqual(self.mesh.texcoord2D(self.mesh.halfedge_handle(24))[1], 7.0)
self.assertEqual(self.mesh.texcoord2D(self.mesh.halfedge_handle(30))[0], 9.0)
self.assertEqual(self.mesh.texcoord2D(self.mesh.halfedge_handle(30))[1], 9.0)
self.assertEqual(self.mesh.texcoord2D(self.mesh.halfedge_handle(35))[0], 12.0)
self.assertEqual(self.mesh.texcoord2D(self.mesh.halfedge_handle(35))[1], 12.0)
self.mesh.release_halfedge_texcoords2D()
def test_load_obj_with_material(self):
self.mesh.request_face_colors()
options = openmesh.Options()
options += openmesh.Options.FaceColor
file_name = "square_material.obj"
ok = openmesh.read_mesh(self.mesh, file_name, options)
self.assertTrue(ok)
fh = self.mesh.face_handle(self.mesh.halfedge_handle(0))
self.assertTrue(fh.is_valid())
self.assertAlmostEqual(self.mesh.color(fh)[0], 0.5, 2)
self.assertAlmostEqual(self.mesh.color(fh)[1], 0.5, 2)
self.assertAlmostEqual(self.mesh.color(fh)[2], 0.5, 2)
self.mesh.release_face_colors()
def test_load_simple_obj_with_vertex_colors_after_vertices(self):
self.mesh.request_vertex_colors()
options = openmesh.Options()
options += openmesh.Options.VertexColor
file_name = "cube-minimal-vertex-colors-after-vertex-definition.obj"
ok = openmesh.read_mesh(self.mesh, file_name, options)
self.assertTrue(ok)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_edges(), 18)
self.assertEqual(self.mesh.n_faces(), 12)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(0))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(0))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(0))[2], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(3))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(3))[1], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(3))[2], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(4))[0], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(4))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(4))[2], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(7))[0], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(7))[1], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(7))[2], 1.0)
self.mesh.release_vertex_colors()
def test_load_simple_obj_with_vertex_colors_as_vc_lines(self):
self.mesh.request_vertex_colors()
options = openmesh.Options()
options += openmesh.Options.VertexColor
file_name = "cube-minimal-vertex-colors-as-vc-lines.obj"
ok = openmesh.read_mesh(self.mesh, file_name, options)
self.assertTrue(ok)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_edges(), 18)
self.assertEqual(self.mesh.n_faces(), 12)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(0))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(0))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(0))[2], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(3))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(3))[1], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(3))[2], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(4))[0], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(4))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(4))[2], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(7))[0], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(7))[1], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(7))[2], 1.0)
self.mesh.release_vertex_colors()
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(ReadWriteOBJ)
unittest.TextTestRunner(verbosity=2).run(suite)

View File

@@ -0,0 +1,163 @@
import unittest
import openmesh
class ReadWriteOFF(unittest.TestCase):
def setUp(self):
self.mesh = openmesh.TriMesh()
def test_load_simple_off_file(self):
ok = openmesh.read_mesh(self.mesh, "cube1.off")
self.assertTrue(ok)
self.assertEqual(self.mesh.n_vertices(), 7526)
self.assertEqual(self.mesh.n_edges(), 22572)
self.assertEqual(self.mesh.n_faces(), 15048)
def test_write_and_read_vertex_colors_to_and_from_off_file(self):
self.mesh.request_vertex_colors()
self.mesh.add_vertex(openmesh.Vec3d(0, 0, 1))
self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0))
self.mesh.add_vertex(openmesh.Vec3d(0, 1, 1))
self.mesh.add_vertex(openmesh.Vec3d(1, 0, 1))
# Using the default openmesh Python color type
testColor = openmesh.Vec4f(1.0, 0.5, 0.25, 1.0)
# Setting colors (different from black)
for v in self.mesh.vertices():
self.mesh.set_color(v, testColor)
# Check if the colors are correctly set
count = 0
for v in self.mesh.vertices():
color = self.mesh.color(v)
if color[0] != testColor[0] or color[1] != testColor[1] or color[2] != testColor[2]:
count += 1
self.assertEqual(count, 0)
options = openmesh.Options()
options += openmesh.Options.VertexColor
options += openmesh.Options.ColorFloat
openmesh.write_mesh(self.mesh, "temp.off", options)
openmesh.read_mesh(self.mesh, "temp.off", options)
# Check if vertices still have the same color
count = 0
for v in self.mesh.vertices():
color = self.mesh.color(v)
if color[0] != testColor[0] or color[1] != testColor[1] or color[2] != testColor[2]:
count += 1
self.assertEqual(count, 0)
self.mesh.release_vertex_colors()
def test_write_and_read_float_vertex_colors_to_and_from_off_file(self):
self.mesh.request_vertex_colors()
options = openmesh.Options(openmesh.Options.VertexColor)
ok = openmesh.read_mesh(self.mesh, "meshlab.ply", options)
self.assertTrue(ok)
options.clear()
options += openmesh.Options.VertexColor
options += openmesh.Options.ColorFloat
# Write the mesh
ok = openmesh.write_mesh(self.mesh, "cube_floating.off", options)
self.assertTrue(ok)
ok = openmesh.read_mesh(self.mesh, "cube_floating.off", options)
self.assertTrue(ok)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_edges(), 18)
self.assertEqual(self.mesh.n_faces(), 12)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(0))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(0))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(0))[2], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(3))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(3))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(3))[2], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(4))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(4))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(4))[2], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(7))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(7))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(7))[2], 1.0)
self.assertFalse(options.vertex_has_normal())
self.assertFalse(options.vertex_has_texcoord())
self.assertTrue(options.vertex_has_color())
self.assertTrue(options.color_is_float())
self.mesh.release_vertex_colors()
def test_write_and_read_binary_float_vertex_colors_to_and_from_off_file(self):
self.mesh.request_vertex_colors()
options = openmesh.Options(openmesh.Options.VertexColor)
ok = openmesh.read_mesh(self.mesh, "meshlab.ply", options)
self.assertTrue(ok)
options.clear()
options += openmesh.Options.VertexColor
options += openmesh.Options.Binary
options += openmesh.Options.ColorFloat
# Write the mesh
ok = openmesh.write_mesh(self.mesh, "cube_floating_binary.off", options)
self.assertTrue(ok)
self.mesh.clear()
options.clear()
options += openmesh.Options.VertexColor
options += openmesh.Options.Binary
options += openmesh.Options.ColorFloat
ok = openmesh.read_mesh(self.mesh, "cube_floating_binary.off", options)
self.assertTrue(ok)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_edges(), 18)
self.assertEqual(self.mesh.n_faces(), 12)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(0))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(0))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(0))[2], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(3))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(3))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(3))[2], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(4))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(4))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(4))[2], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(7))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(7))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(7))[2], 1.0)
self.assertFalse(options.vertex_has_normal())
self.assertFalse(options.vertex_has_texcoord())
self.assertFalse(options.face_has_color())
self.assertTrue(options.vertex_has_color())
self.assertTrue(options.color_is_float())
self.assertTrue(options.is_binary())
self.mesh.release_vertex_colors()
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(ReadWriteOFF)
unittest.TextTestRunner(verbosity=2).run(suite)

View File

@@ -0,0 +1,201 @@
import unittest
import openmesh
import os
class ReadWriteOM(unittest.TestCase):
def setUp(self):
self.mesh = openmesh.TriMesh()
def test_load_simple_om_force_vertex_colors_although_not_available(self):
self.mesh.request_vertex_colors()
file_name = "cube-minimal.om"
options = openmesh.Options()
options += openmesh.Options.VertexColor
ok = openmesh.read_mesh(self.mesh, file_name, options)
self.assertTrue(ok)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_edges(), 18)
self.assertEqual(self.mesh.n_faces(), 12)
self.assertEqual(self.mesh.n_halfedges(), 36)
self.assertFalse(options.vertex_has_normal())
self.assertFalse(options.vertex_has_texcoord())
self.assertFalse(options.vertex_has_color())
def test_load_simple_om_with_texcoords(self):
self.mesh.request_vertex_texcoords2D()
options = openmesh.Options()
options += openmesh.Options.VertexTexCoord
ok = openmesh.read_mesh(self.mesh, "cube-minimal-texCoords.om", options)
self.assertTrue(ok)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_edges(), 18)
self.assertEqual(self.mesh.n_faces(), 12)
self.assertEqual(self.mesh.texcoord2D(self.mesh.vertex_handle(0))[0], 10.0)
self.assertEqual(self.mesh.texcoord2D(self.mesh.vertex_handle(0))[1], 10.0)
self.assertEqual(self.mesh.texcoord2D(self.mesh.vertex_handle(2))[0], 6.0)
self.assertEqual(self.mesh.texcoord2D(self.mesh.vertex_handle(2))[1], 6.0)
self.assertEqual(self.mesh.texcoord2D(self.mesh.vertex_handle(4))[0], 9.0)
self.assertEqual(self.mesh.texcoord2D(self.mesh.vertex_handle(4))[1], 9.0)
self.assertEqual(self.mesh.texcoord2D(self.mesh.vertex_handle(7))[0], 12.0)
self.assertEqual(self.mesh.texcoord2D(self.mesh.vertex_handle(7))[1], 12.0)
self.assertFalse(options.vertex_has_normal())
self.assertTrue(options.vertex_has_texcoord())
self.assertFalse(options.vertex_has_color())
self.mesh.release_vertex_texcoords2D()
def test_load_simple_om_with_vertex_colors(self):
self.mesh.request_vertex_colors()
options = openmesh.Options()
options += openmesh.Options.VertexColor
ok = openmesh.read_mesh(self.mesh, "cube-minimal-vertexColors.om", options)
self.assertTrue(ok)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_edges(), 18)
self.assertEqual(self.mesh.n_faces(), 12)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(0))[0], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(0))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(0))[2], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(3))[0], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(3))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(3))[2], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(4))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(4))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(4))[2], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(7))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(7))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(7))[2], 1.0)
self.assertFalse(options.vertex_has_normal())
self.assertFalse(options.vertex_has_texcoord())
self.assertTrue(options.vertex_has_color())
self.mesh.release_vertex_colors()
def test_write_triangle(self):
filename = "triangle-minimal.om";
# Generate data
v1 = self.mesh.add_vertex(openmesh.Vec3d(1.0, 0.0, 0.0))
v2 = self.mesh.add_vertex(openmesh.Vec3d(0.0, 1.0, 0.0))
v3 = self.mesh.add_vertex(openmesh.Vec3d(0.0, 0.0, 1.0))
self.mesh.add_face(v1, v2, v3)
# Save
ok = openmesh.write_mesh(self.mesh, filename)
self.assertTrue(ok)
# Reset
self.mesh.clear()
# Load
ok = openmesh.read_mesh(self.mesh, filename)
self.assertTrue(ok)
# Compare
self.assertEqual(self.mesh.n_vertices(), 3)
self.assertEqual(self.mesh.n_edges(), 3)
self.assertEqual(self.mesh.n_faces(), 1)
self.assertEqual(self.mesh.point(v1), openmesh.Vec3d(1.0, 0.0, 0.0))
self.assertEqual(self.mesh.point(v2), openmesh.Vec3d(0.0, 1.0, 0.0))
self.assertEqual(self.mesh.point(v3), openmesh.Vec3d(0.0, 0.0, 1.0))
# Cleanup
os.remove(filename)
def test_write_triangle_vertex_integer_color(self):
self.mesh.request_vertex_colors()
options = openmesh.Options()
options += openmesh.Options.VertexColor
options += openmesh.Options.ColorFloat
filename = "triangle-minimal-ColorsPerVertex.om"
# Generate data
v1 = self.mesh.add_vertex(openmesh.Vec3d(1.0, 0.0, 0.0))
v2 = self.mesh.add_vertex(openmesh.Vec3d(0.0, 1.0, 0.0))
v3 = self.mesh.add_vertex(openmesh.Vec3d(0.0, 0.0, 1.0))
self.mesh.add_face(v1, v2, v3)
c1 = openmesh.Vec4f(0.00, 0.00, 0.50, 1.00)
c2 = openmesh.Vec4f(0.25, 0.00, 0.00, 1.00)
c3 = openmesh.Vec4f(0.00, 0.75, 0.00, 1.00)
self.mesh.set_color(v1, c1)
self.mesh.set_color(v2, c2)
self.mesh.set_color(v3, c3)
# Save
ok = openmesh.write_mesh(self.mesh, filename, options)
self.assertTrue(ok)
self.mesh.release_vertex_colors()
# Load
cmpMesh = openmesh.TriMesh()
cmpMesh.request_vertex_colors()
ok = openmesh.read_mesh(cmpMesh, filename, options)
self.assertTrue(ok)
self.assertTrue(cmpMesh.has_vertex_colors())
# Compare
self.assertEqual(self.mesh.n_vertices(), 3)
self.assertEqual(self.mesh.n_edges(), 3)
self.assertEqual(self.mesh.n_faces(), 1)
self.assertEqual(cmpMesh.point(v1), openmesh.Vec3d(1.0, 0.0, 0.0))
self.assertEqual(cmpMesh.point(v2), openmesh.Vec3d(0.0, 1.0, 0.0))
self.assertEqual(cmpMesh.point(v3), openmesh.Vec3d(0.0, 0.0, 1.0))
self.assertAlmostEqual(cmpMesh.color(v1)[0], c1[0], 2)
self.assertAlmostEqual(cmpMesh.color(v1)[1], c1[1], 2)
self.assertAlmostEqual(cmpMesh.color(v1)[2], c1[2], 2)
self.assertAlmostEqual(cmpMesh.color(v1)[3], c1[3], 2)
self.assertAlmostEqual(cmpMesh.color(v2)[0], c2[0], 2)
self.assertAlmostEqual(cmpMesh.color(v2)[1], c2[1], 2)
self.assertAlmostEqual(cmpMesh.color(v2)[2], c2[2], 2)
self.assertAlmostEqual(cmpMesh.color(v2)[3], c2[3], 2)
self.assertAlmostEqual(cmpMesh.color(v3)[0], c3[0], 2)
self.assertAlmostEqual(cmpMesh.color(v3)[1], c3[1], 2)
self.assertAlmostEqual(cmpMesh.color(v3)[2], c3[2], 2)
self.assertAlmostEqual(cmpMesh.color(v3)[3], c3[3], 2)
# Clean up
cmpMesh.release_vertex_colors()
os.remove(filename)
# TODO property tests
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(ReadWriteOM)
unittest.TextTestRunner(verbosity=2).run(suite)

View File

@@ -0,0 +1,342 @@
import unittest
import openmesh
class ReadWritePLY(unittest.TestCase):
def setUp(self):
self.mesh = openmesh.TriMesh()
def test_load_simple_point_ply_file_with_bad_encoding(self):
ok = openmesh.read_mesh(self.mesh, "pointCloudBadEncoding.ply")
self.assertTrue(ok)
self.assertEqual(self.mesh.n_vertices(), 10)
self.assertEqual(self.mesh.n_edges(), 0)
self.assertEqual(self.mesh.n_faces(), 0)
def test_load_simple_point_ply_file_with_good_encoding(self):
ok = openmesh.read_mesh(self.mesh, "pointCloudGoodEncoding.ply")
self.assertTrue(ok)
self.assertEqual(self.mesh.n_vertices(), 10)
self.assertEqual(self.mesh.n_edges(), 0)
self.assertEqual(self.mesh.n_faces(), 0)
def test_load_simple_ply(self):
ok = openmesh.read_mesh(self.mesh, "cube-minimal.ply")
self.assertTrue(ok)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_edges(), 18)
self.assertEqual(self.mesh.n_faces(), 12)
def test_load_simple_ply_force_vertex_colors_although_not_available(self):
self.mesh.request_vertex_colors()
file_name = "cube-minimal.ply"
options = openmesh.Options()
options += openmesh.Options.VertexColor
ok = openmesh.read_mesh(self.mesh, file_name, options)
self.assertTrue(ok)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_edges(), 18)
self.assertEqual(self.mesh.n_faces(), 12)
self.assertEqual(self.mesh.n_halfedges(), 36)
self.assertFalse(options.vertex_has_normal())
self.assertFalse(options.vertex_has_texcoord())
self.assertFalse(options.vertex_has_color())
def test_load_simple_ply_with_vertex_colors(self):
self.mesh.request_vertex_colors()
file_name = "cube-minimal.ply"
options = openmesh.Options()
options += openmesh.Options.VertexColor
ok = openmesh.read_mesh(self.mesh, "cube-minimal-vertexColors.ply", options)
self.assertTrue(ok)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_edges(), 18)
self.assertEqual(self.mesh.n_faces(), 12)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(0))[0], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(0))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(0))[2], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(3))[0], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(3))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(3))[2], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(4))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(4))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(4))[2], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(7))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(7))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(7))[2], 1.0)
self.assertFalse(options.vertex_has_normal())
self.assertFalse(options.vertex_has_texcoord())
self.assertTrue(options.vertex_has_color())
self.mesh.release_vertex_colors()
def test_load_ply_from_mesh_lab_with_vertex_colors(self):
self.mesh.request_vertex_colors()
options = openmesh.Options()
options += openmesh.Options.VertexColor
ok = openmesh.read_mesh(self.mesh, "meshlab.ply", options)
self.assertTrue(ok)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_edges(), 18)
self.assertEqual(self.mesh.n_faces(), 12)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(0))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(0))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(0))[2], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(3))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(3))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(3))[2], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(4))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(4))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(4))[2], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(7))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(7))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(7))[2], 1.0)
self.assertFalse(options.vertex_has_normal())
self.assertFalse(options.vertex_has_texcoord())
self.assertTrue(options.vertex_has_color())
self.mesh.release_vertex_colors()
def test_write_and_read_binary_ply_with_vertex_colors(self):
self.mesh.request_vertex_colors()
options = openmesh.Options()
options += openmesh.Options.VertexColor
ok = openmesh.read_mesh(self.mesh, "meshlab.ply", options)
self.assertTrue(ok)
options += openmesh.Options.Binary
ok = openmesh.write_mesh(self.mesh, "meshlab_binary.ply", options)
self.assertTrue(ok)
self.mesh.clear
ok = openmesh.read_mesh(self.mesh, "meshlab_binary.ply", options)
self.assertTrue(ok)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_edges(), 18)
self.assertEqual(self.mesh.n_faces(), 12)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(0))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(0))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(0))[2], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(3))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(3))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(3))[2], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(4))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(4))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(4))[2], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(7))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(7))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(7))[2], 1.0)
self.assertFalse(options.vertex_has_normal())
self.assertFalse(options.vertex_has_texcoord())
self.assertTrue(options.vertex_has_color())
self.mesh.release_vertex_colors()
def test_write_and_read_ply_with_float_vertex_colors(self):
self.mesh.request_vertex_colors()
options = openmesh.Options()
options += openmesh.Options.VertexColor
ok = openmesh.read_mesh(self.mesh, "meshlab.ply", options)
self.assertTrue(ok)
options += openmesh.Options.ColorFloat
ok = openmesh.write_mesh(self.mesh, "meshlab_float.ply", options)
self.assertTrue(ok)
self.mesh.clear
ok = openmesh.read_mesh(self.mesh, "meshlab_float.ply", options)
self.assertTrue(ok)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_edges(), 18)
self.assertEqual(self.mesh.n_faces(), 12)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(0))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(0))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(0))[2], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(3))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(3))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(3))[2], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(4))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(4))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(4))[2], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(7))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(7))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(7))[2], 1.0)
self.assertFalse(options.vertex_has_normal())
self.assertFalse(options.vertex_has_texcoord())
self.assertTrue(options.vertex_has_color())
self.assertTrue(options.color_is_float())
self.mesh.release_vertex_colors()
def test_write_and_read_binary_ply_with_float_vertex_colors(self):
self.mesh.request_vertex_colors()
options = openmesh.Options()
options += openmesh.Options.VertexColor
ok = openmesh.read_mesh(self.mesh, "meshlab.ply", options)
self.assertTrue(ok)
options += openmesh.Options.ColorFloat
options += openmesh.Options.Binary
ok = openmesh.write_mesh(self.mesh, "meshlab_binary_float.ply", options)
self.assertTrue(ok)
self.mesh.clear
ok = openmesh.read_mesh(self.mesh, "meshlab_binary_float.ply", options)
self.assertTrue(ok)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_edges(), 18)
self.assertEqual(self.mesh.n_faces(), 12)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(0))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(0))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(0))[2], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(3))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(3))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(3))[2], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(4))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(4))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(4))[2], 1.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(7))[0], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(7))[1], 0.0)
self.assertEqual(self.mesh.color(self.mesh.vertex_handle(7))[2], 1.0)
self.assertFalse(options.vertex_has_normal())
self.assertFalse(options.vertex_has_texcoord())
self.assertTrue(options.vertex_has_color())
self.assertTrue(options.color_is_float())
self.assertTrue(options.is_binary())
self.mesh.release_vertex_colors()
def test_load_simple_ply_with_texcoords(self):
self.mesh.request_vertex_texcoords2D()
options = openmesh.Options()
options += openmesh.Options.VertexTexCoord
ok = openmesh.read_mesh(self.mesh, "cube-minimal-texCoords.ply", options)
self.assertTrue(ok)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_edges(), 18)
self.assertEqual(self.mesh.n_faces(), 12)
self.assertEqual(self.mesh.texcoord2D(self.mesh.vertex_handle(0))[0], 10.0)
self.assertEqual(self.mesh.texcoord2D(self.mesh.vertex_handle(0))[1], 10.0)
self.assertEqual(self.mesh.texcoord2D(self.mesh.vertex_handle(2))[0], 6.0)
self.assertEqual(self.mesh.texcoord2D(self.mesh.vertex_handle(2))[1], 6.0)
self.assertEqual(self.mesh.texcoord2D(self.mesh.vertex_handle(4))[0], 9.0)
self.assertEqual(self.mesh.texcoord2D(self.mesh.vertex_handle(4))[1], 9.0)
self.assertEqual(self.mesh.texcoord2D(self.mesh.vertex_handle(7))[0], 12.0)
self.assertEqual(self.mesh.texcoord2D(self.mesh.vertex_handle(7))[1], 12.0)
self.assertFalse(options.vertex_has_normal())
self.assertTrue(options.vertex_has_texcoord())
self.assertFalse(options.vertex_has_color())
self.mesh.release_vertex_texcoords2D()
def test_load_simple_ply_with_normals(self):
self.mesh.request_vertex_normals()
options = openmesh.Options()
options += openmesh.Options.VertexNormal
ok = openmesh.read_mesh(self.mesh, "cube-minimal-normals.ply", options)
self.assertTrue(ok)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_edges(), 18)
self.assertEqual(self.mesh.n_faces(), 12)
self.assertTrue(options.vertex_has_normal())
self.assertFalse(options.vertex_has_texcoord())
self.assertFalse(options.vertex_has_color())
self.assertEqual(self.mesh.normal(self.mesh.vertex_handle(0))[0], 0.0)
self.assertEqual(self.mesh.normal(self.mesh.vertex_handle(0))[1], 0.0)
self.assertEqual(self.mesh.normal(self.mesh.vertex_handle(0))[2], 1.0)
self.assertEqual(self.mesh.normal(self.mesh.vertex_handle(3))[0], 1.0)
self.assertEqual(self.mesh.normal(self.mesh.vertex_handle(3))[1], 0.0)
self.assertEqual(self.mesh.normal(self.mesh.vertex_handle(3))[2], 0.0)
self.assertEqual(self.mesh.normal(self.mesh.vertex_handle(4))[0], 1.0)
self.assertEqual(self.mesh.normal(self.mesh.vertex_handle(4))[1], 0.0)
self.assertEqual(self.mesh.normal(self.mesh.vertex_handle(4))[2], 1.0)
self.assertEqual(self.mesh.normal(self.mesh.vertex_handle(7))[0], 1.0)
self.assertEqual(self.mesh.normal(self.mesh.vertex_handle(7))[1], 1.0)
self.assertEqual(self.mesh.normal(self.mesh.vertex_handle(7))[2], 2.0)
self.mesh.release_vertex_normals()
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(ReadWritePLY)
unittest.TextTestRunner(verbosity=2).run(suite)

View File

@@ -0,0 +1,75 @@
import unittest
import openmesh
class ReadWriteSTL(unittest.TestCase):
def setUp(self):
self.mesh = openmesh.TriMesh()
def test_load_simple_stl_file(self):
ok = openmesh.read_mesh(self.mesh, "cube1.stl")
self.assertTrue(ok)
self.assertEqual(self.mesh.n_vertices(), 7526)
self.assertEqual(self.mesh.n_edges(), 22572)
self.assertEqual(self.mesh.n_faces(), 15048)
def test_load_simple_stl_file_with_normals(self):
self.mesh.request_face_normals()
options = openmesh.Options()
options += openmesh.Options.FaceNormal
ok = openmesh.read_mesh(self.mesh, "cube1.stl", options)
self.assertTrue(ok)
self.assertAlmostEqual(self.mesh.normal(self.mesh.face_handle(0))[0], -0.038545)
self.assertAlmostEqual(self.mesh.normal(self.mesh.face_handle(0))[1], -0.004330)
self.assertAlmostEqual(self.mesh.normal(self.mesh.face_handle(0))[2], 0.999247)
self.assertEqual(self.mesh.n_vertices(), 7526)
self.assertEqual(self.mesh.n_edges(), 22572)
self.assertEqual(self.mesh.n_faces(), 15048)
self.mesh.release_face_normals()
def test_load_simple_stl_binary_file(self):
ok = openmesh.read_mesh(self.mesh, "cube1Binary.stl")
self.assertTrue(ok)
self.assertEqual(self.mesh.n_vertices(), 7526)
self.assertEqual(self.mesh.n_edges(), 22572)
self.assertEqual(self.mesh.n_faces(), 15048)
def test_load_simple_stl_binary_file_with_normals(self):
self.mesh.request_face_normals()
options = openmesh.Options()
options += openmesh.Options.FaceNormal
options += openmesh.Options.Binary
ok = openmesh.read_mesh(self.mesh, "cube1Binary.stl", options)
self.assertTrue(ok)
self.assertTrue(options.is_binary())
self.assertTrue(options.face_has_normal())
self.assertFalse(options.vertex_has_normal())
self.assertAlmostEqual(self.mesh.normal(self.mesh.face_handle(0))[0], -0.038545, 5)
self.assertAlmostEqual(self.mesh.normal(self.mesh.face_handle(0))[1], -0.004330, 5)
self.assertAlmostEqual(self.mesh.normal(self.mesh.face_handle(0))[2], 0.999247, 5)
self.assertEqual(self.mesh.n_vertices(), 7526)
self.assertEqual(self.mesh.n_edges(), 22572)
self.assertEqual(self.mesh.n_faces(), 15048)
self.mesh.release_face_normals()
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(ReadWriteSTL)
unittest.TextTestRunner(verbosity=2).run(suite)

View File

@@ -0,0 +1,87 @@
import unittest
import openmesh
class SplitCopy(unittest.TestCase):
def test_split_copy_triangle_mesh(self):
self.mesh = openmesh.TriMesh()
self.vhandle = []
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0.25, 0.25, 0)))
# Add one face
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[0])
fh = self.mesh.add_face(face_vhandles)
# Test setup:
# 1 === 2
# | /
# | /
# | /
# 0
# Set property
fprop_int = openmesh.FPropHandle()
self.mesh.add_property(fprop_int)
self.mesh.set_property(fprop_int, fh, 999)
# Split face with new vertex
self.mesh.split_copy(fh, self.vhandle[3])
# Check setup
for f in self.mesh.faces():
self.assertEqual(self.mesh.property(fprop_int, f), 999)
def test_split_copy_polymesh(self):
self.mesh = openmesh.PolyMesh()
self.vhandle = []
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0.5, 0.5, 0)))
# Add one face
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[3])
fh = self.mesh.add_face(face_vhandles)
# Test setup:
# 1 === 2
# | |
# | |
# | |
# 0 === 3
# Set property
fprop_int = openmesh.FPropHandle()
self.mesh.add_property(fprop_int)
self.mesh.set_property(fprop_int, fh, 999)
# Split face with new vertex
self.mesh.split_copy(fh, self.vhandle[4])
# Check setup
for f in self.mesh.faces():
self.assertEqual(self.mesh.property(fprop_int, f), 999)
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(SplitCopy)
unittest.TextTestRunner(verbosity=2).run(suite)

View File

@@ -0,0 +1,269 @@
import unittest
import openmesh
class TrimeshCirculatorCurrentHalfedgeHandleReplacement(unittest.TestCase):
def setUp(self):
self.mesh = openmesh.TriMesh()
self.vhandle = []
def test_dereference(self):
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, -1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2, -1, 0)))
# Add four faces
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[2])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[4])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[1])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[4])
self.mesh.add_face(face_vhandles)
# Test setup:
# 0 ==== 2
# |\ 0 /|
# | \ / |
# |2 1 3|
# | / \ |
# |/ 1 \|
# 3 ==== 4
# Starting vertex is 1->4
# output from fh_it.current_halfedge_handle()
current_halfedge_handles = [4, 0, 2, 10, 6, 8, 1, 12, 7, 14, 3, 11]
i = 0
for f in self.mesh.faces():
for he in self.mesh.fh(f):
self.assertEqual(he.idx(), current_halfedge_handles[i])
i += 1
def test_vv_iter(self):
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, -1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2, -1, 0)))
# Add four faces
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[2])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[4])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[1])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[4])
self.mesh.add_face(face_vhandles)
# Test setup:
# 0 ==== 2
# |\ 0 /|
# | \ / |
# |2 1 3|
# | / \ |
# |/ 1 \|
# 3 ==== 4
# Starting vertex is 1->4
# output from vv_it.current_halfedge_handle()
current_halfedge_handles = [5, 0, 12, 11, 6, 1, 2, 15, 3, 4, 13, 7, 8, 9, 10, 14]
eh0 = []
eh1 = []
i = 0
for v in self.mesh.vertices():
for vv in self.mesh.vv(v):
he = openmesh.HalfedgeHandle(current_halfedge_handles[i])
eh0.append(self.mesh.edge_handle(he))
i += 1
for v in self.mesh.vertices():
for he in self.mesh.voh(v):
eh1.append(self.mesh.edge_handle(he))
self.assertEqual(len(eh0), len(eh1))
for i in range(len(eh0)):
self.assertEqual(eh0[i], eh1[i])
def test_fe_iter(self):
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, -1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2, -1, 0)))
# Add four faces
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[2])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[4])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[1])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[4])
self.mesh.add_face(face_vhandles)
# Test setup:
# 0 ==== 2
# |\ 0 /|
# | \ / |
# |2 1 3|
# | / \ |
# |/ 1 \|
# 3 ==== 4
# Starting vertex is 1->4
# output from fe_it.current_halfedge_handle()
current_halfedge_handles = [4, 0, 2, 10, 6, 8, 1, 12, 7, 14, 3, 11]
heh0 = []
heh1 = []
i = 0
for f in self.mesh.faces():
for e in self.mesh.fe(f):
heh0.append(openmesh.HalfedgeHandle(current_halfedge_handles[i]))
i += 1
for f in self.mesh.faces():
for he in self.mesh.fh(f):
heh1.append(he)
self.assertEqual(len(heh0), len(heh1))
for i in range(len(heh0)):
self.assertEqual(heh0[i], heh1[i])
def test_vf_iter_boundary(self):
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(3, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(4, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2, -1, 0)))
# Add three faces
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[2])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[4])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[5])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
# Test setup:
#
# 0 ------ 2 ------ 4
# \ / \ /
# \ 0 / \ 1 /
# \ / \ /
# 1 ------- 3
# \ /
# \ 2 /
# \ /
# \ /
# 5
# output from fe_it.current_halfedge_handle()
current_halfedge_handles = [0, 2, 12, 4, 6, 8, 16, 10, 14]
fh0 = []
fh1 = []
i = 0
for v in self.mesh.vertices():
for f in self.mesh.vf(v):
he = openmesh.HalfedgeHandle(current_halfedge_handles[i])
fh0.append(self.mesh.face_handle(he))
i += 1
for v in self.mesh.vertices():
for f in self.mesh.vf(v):
fh1.append(f)
self.assertEqual(len(fh0), len(fh1))
for i in range(len(fh0)):
self.assertEqual(fh0[i], fh1[i])
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(TrimeshCirculatorCurrentHalfedgeHandleReplacement)
unittest.TextTestRunner(verbosity=2).run(suite)

View File

@@ -0,0 +1,50 @@
import unittest
import openmesh
class TriMeshCirculatorFaceEdge(unittest.TestCase):
def setUp(self):
self.mesh = openmesh.TriMesh()
# Add some vertices
self.vhandle = []
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(3, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(4, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2,-1, 0)))
# Add four faces
self.mesh.add_face(self.vhandle[0], self.vhandle[1], self.vhandle[2])
self.mesh.add_face(self.vhandle[2], self.vhandle[1], self.vhandle[3])
self.mesh.add_face(self.vhandle[2], self.vhandle[3], self.vhandle[4])
self.mesh.add_face(self.vhandle[1], self.vhandle[5], self.vhandle[3])
'''
Test setup:
0 ------ 2 ------ 4
\ / \ /
\ 0 / \ 2 /
\ / 1 \ /
1 ------- 3
\ /
\ 3 /
\ /
\ /
5
'''
def test_face_edge_iter_without_holes_increment(self):
# Iterate around face 1 at the middle
fe_it = openmesh.FaceEdgeIter(self.mesh, self.mesh.face_handle(1))
self.assertEqual(fe_it.__next__().idx(), 4)
self.assertEqual(fe_it.__next__().idx(), 1)
self.assertEqual(fe_it.__next__().idx(), 3)
self.assertRaises(StopIteration, fe_it.__next__)
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(TriMeshCirculatorFaceEdge)
unittest.TextTestRunner(verbosity=2).run(suite)

View File

@@ -0,0 +1,156 @@
import unittest
import openmesh
class TrimeshCirculatorFaceFace(unittest.TestCase):
def setUp(self):
self.mesh = openmesh.TriMesh()
self.vhandle = []
def test_face_face_iter_with_holes(self):
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(3, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(4, 1, 0)))
# Add three faces
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[2])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[4])
self.mesh.add_face(face_vhandles)
# Test setup:
#
# 0 ------ 2 ------ 4
# \ / \ /
# \ 0 / \ 2 /
# \ / 1 \ /
# 1 ------- 3
ff_it = self.mesh.ff(self.mesh.face_handle(1))
self.assertEqual(ff_it.__next__().idx(), 2)
self.assertEqual(ff_it.__next__().idx(), 0)
self.assertRaises(StopIteration, ff_it.__next__)
def test_face_face_iter_without_holes(self):
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(3, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(4, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2, -1, 0)))
# Add four faces
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[2])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[4])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[5])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
# Test setup:
#
# 0 ------ 2 ------ 4
# \ / \ /
# \ 0 / \ 2 /
# \ / 1 \ /
# 1 ------- 3
# \ /
# \ 3 /
# \ /
# \ /
# 5
ff_it = self.mesh.ff(self.mesh.face_handle(1))
self.assertEqual(ff_it.__next__().idx(), 2)
self.assertEqual(ff_it.__next__().idx(), 0)
self.assertEqual(ff_it.__next__().idx(), 3)
self.assertRaises(StopIteration, ff_it.__next__)
def test_face_face_iter_without_holes(self):
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 0, 0)))
# Add two faces
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[1])
fh1 = self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[2])
fh2 = self.mesh.add_face(face_vhandles)
# Test setup:
#
# 1 -------- 2
# | f0 / |
# | / f1 |
# 0 -------- 3
# Check setup
self.assertEqual(self.mesh.n_vertices(), 4)
self.assertEqual(self.mesh.n_faces(), 2)
face_iter = self.mesh.ff(fh1)
# Get the face via the handle
faceHandle1 = face_iter.__next__()
face1 = self.mesh.face(faceHandle1)
self.assertEqual(faceHandle1.idx(), 1)
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(TrimeshCirculatorFaceFace)
unittest.TextTestRunner(verbosity=2).run(suite)

View File

@@ -0,0 +1,50 @@
import unittest
import openmesh
class TriMeshCirculatorFaceHalfEdge(unittest.TestCase):
def setUp(self):
self.mesh = openmesh.TriMesh()
# Add some vertices
self.vhandle = []
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(3, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(4, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2,-1, 0)))
# Add four faces
self.mesh.add_face(self.vhandle[0], self.vhandle[1], self.vhandle[2])
self.mesh.add_face(self.vhandle[2], self.vhandle[1], self.vhandle[3])
self.mesh.add_face(self.vhandle[2], self.vhandle[3], self.vhandle[4])
self.mesh.add_face(self.vhandle[1], self.vhandle[5], self.vhandle[3])
'''
Test setup:
0 ------ 2 ------ 4
\ / \ /
\ 0 / \ 2 /
\ / 1 \ /
1 ------- 3
\ /
\ 3 /
\ /
\ /
5
'''
def test_face_halfedge_iter_without_holes_increment(self):
# Iterate around face 1 at the middle
fh_it = openmesh.FaceHalfedgeIter(self.mesh, self.mesh.face_handle(1))
self.assertEqual(fh_it.__next__().idx(), 8)
self.assertEqual(fh_it.__next__().idx(), 3)
self.assertEqual(fh_it.__next__().idx(), 6)
self.assertRaises(StopIteration, fh_it.__next__)
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(TriMeshCirculatorFaceHalfEdge)
unittest.TextTestRunner(verbosity=2).run(suite)

View File

@@ -0,0 +1,48 @@
import unittest
import openmesh
class TriMeshCirculatorFaceVertex(unittest.TestCase):
def setUp(self):
self.mesh = openmesh.TriMesh()
# Add some vertices
self.vhandle = []
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0,-1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2,-1, 0)))
# Add four faces
self.fh0 = self.mesh.add_face(self.vhandle[0], self.vhandle[1], self.vhandle[2])
self.mesh.add_face(self.vhandle[1], self.vhandle[3], self.vhandle[4])
self.mesh.add_face(self.vhandle[0], self.vhandle[3], self.vhandle[1])
self.mesh.add_face(self.vhandle[2], self.vhandle[1], self.vhandle[4])
'''
Test setup:
0 ==== 2
|\ 0 /|
| \ / |
|2 1 3|
| / \ |
|/ 1 \|
3 ==== 4
'''
def test_face_vertex_iter_without_increment(self):
self.assertEqual(self.fh0.idx(), 0)
# Iterate around face 0 at the top
fv_it = openmesh.FaceVertexIter(self.mesh, self.fh0)
self.assertEqual(fv_it.__next__().idx(), 0)
self.assertEqual(fv_it.__next__().idx(), 1)
self.assertEqual(fv_it.__next__().idx(), 2)
self.assertRaises(StopIteration, fv_it.__next__)
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(TriMeshCirculatorFaceVertex)
unittest.TextTestRunner(verbosity=2).run(suite)

View File

@@ -0,0 +1,131 @@
import unittest
import openmesh
class TrimeshCirculatorHalfedgeLoop(unittest.TestCase):
def setUp(self):
self.mesh = openmesh.TriMesh()
self.vhandle = []
def test_halfedge_loop_with_face(self):
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(3, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(4, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2, -1, 0)))
# Add four faces
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[2])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[4])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[5])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
# Test setup:
#
# edge x => halfedge x/x+1
# i.e. edge 0 => halfedge 0/1
#
# 0 --4--- 2 ------ 4
# \ / \ /
# 0 0 2 6 2 /
# \ / 1 \ /
# 1 ---8--- 3
# \ /
# \ 3 /
# \ /
# \ /
# 5
# Circle around face 1
hl_it = self.mesh.hl(self.mesh.halfedge_handle(3))
self.assertEqual(hl_it.__next__().idx(), 3)
self.assertEqual(hl_it.__next__().idx(), 6)
self.assertEqual(hl_it.__next__().idx(), 8)
self.assertRaises(StopIteration, hl_it.__next__)
def test_halfedge_loop_without_face(self):
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(3, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(4, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2, -1, 0)))
# Add three faces
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[2])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[4])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[5])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
# Test setup:
#
# H => hole (no face)
# fx => face #x
# edge 0 => halfedge 0/1
#
# 0 --4--- 2 -10--- 4
# \ / \ /
# 0 f0 2 6 f2 8
# \ / H \ /
# 1 ---16---3
# \ /
# 12 f3 14
# \ /
# \ /
# 5
# Circle around the hole
hl_it = self.mesh.hl(self.mesh.halfedge_handle(3))
self.assertEqual(hl_it.__next__().idx(), 3)
self.assertEqual(hl_it.__next__().idx(), 17)
self.assertEqual(hl_it.__next__().idx(), 7)
self.assertRaises(StopIteration, hl_it.__next__)
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(TrimeshCirculatorHalfedgeLoop)
unittest.TextTestRunner(verbosity=2).run(suite)

View File

@@ -0,0 +1,55 @@
import unittest
import openmesh
class TriMeshCirculatorVertexEdge(unittest.TestCase):
def setUp(self):
self.mesh = openmesh.TriMesh()
# Add some vertices
self.vhandle = []
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0,-1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2,-1, 0)))
# Add four faces
self.mesh.add_face(self.vhandle[0], self.vhandle[1], self.vhandle[2])
self.mesh.add_face(self.vhandle[1], self.vhandle[3], self.vhandle[4])
self.mesh.add_face(self.vhandle[0], self.vhandle[3], self.vhandle[1])
self.mesh.add_face(self.vhandle[2], self.vhandle[1], self.vhandle[4])
'''
Test setup:
0 ==== 2
|\ 0 /|
| \ / |
|2 1 3|
| / \ |
|/ 1 \|
3 ==== 4
'''
def test_vertex_edge_iter_without_holes_increment(self):
# Iterate around vertex 1 at the middle
ve_it = openmesh.VertexEdgeIter(self.mesh, self.vhandle[1])
self.assertEqual(ve_it.__next__().idx(), 5)
self.assertEqual(ve_it.__next__().idx(), 3)
self.assertEqual(ve_it.__next__().idx(), 0)
self.assertEqual(ve_it.__next__().idx(), 1)
self.assertRaises(StopIteration, ve_it.__next__)
def test_vertex_edge_iter_boundary_increment(self):
# Iterate around vertex 2 at the boundary
ve_it = openmesh.VertexEdgeIter(self.mesh, self.vhandle[2])
self.assertEqual(ve_it.__next__().idx(), 7)
self.assertEqual(ve_it.__next__().idx(), 1)
self.assertEqual(ve_it.__next__().idx(), 2)
self.assertRaises(StopIteration, ve_it.__next__)
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(TriMeshCirculatorVertexEdge)
unittest.TextTestRunner(verbosity=2).run(suite)

View File

@@ -0,0 +1,93 @@
import unittest
import openmesh
class TriMeshCirculatorVertexFace(unittest.TestCase):
def setUp(self):
self.mesh = openmesh.TriMesh()
# Add some vertices
self.vhandle = []
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0,-1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2,-1, 0)))
def test_vertex_face_iter_with_holes_increment(self):
# Add two faces
self.mesh.add_face(self.vhandle[0], self.vhandle[1], self.vhandle[2])
self.mesh.add_face(self.vhandle[1], self.vhandle[3], self.vhandle[4])
'''
Test setup:
0 ==== 2
\ /
\ /
1
/ \
/ \
3 ==== 4
'''
# Iterate around vertex 1 at the middle (with holes in between)
vf_it = openmesh.VertexFaceIter(self.mesh, self.vhandle[1])
self.assertEqual(vf_it.__next__().idx(), 0)
self.assertEqual(vf_it.__next__().idx(), 1)
self.assertRaises(StopIteration, vf_it.__next__)
def test_vertex_face_iter_without_holes_increment(self):
# Add four faces
self.mesh.add_face(self.vhandle[0], self.vhandle[1], self.vhandle[2])
self.mesh.add_face(self.vhandle[1], self.vhandle[3], self.vhandle[4])
self.mesh.add_face(self.vhandle[0], self.vhandle[3], self.vhandle[1])
self.mesh.add_face(self.vhandle[2], self.vhandle[1], self.vhandle[4])
'''
Test setup:
0 ==== 2
|\ 0 /|
| \ / |
|2 1 3|
| / \ |
|/ 1 \|
3 ==== 4
'''
# Iterate around vertex 1 at the middle (without holes in between)
vf_it = openmesh.VertexFaceIter(self.mesh, self.vhandle[1])
self.assertEqual(vf_it.__next__().idx(), 3)
self.assertEqual(vf_it.__next__().idx(), 1)
self.assertEqual(vf_it.__next__().idx(), 2)
self.assertEqual(vf_it.__next__().idx(), 0)
self.assertRaises(StopIteration, vf_it.__next__)
def test_vertex_face_iter_boundary_increment(self):
# Add four faces
self.mesh.add_face(self.vhandle[0], self.vhandle[1], self.vhandle[2])
self.mesh.add_face(self.vhandle[1], self.vhandle[3], self.vhandle[4])
self.mesh.add_face(self.vhandle[0], self.vhandle[3], self.vhandle[1])
self.mesh.add_face(self.vhandle[2], self.vhandle[1], self.vhandle[4])
'''
Test setup:
0 ==== 2
|\ 0 /|
| \ / |
|2 1 3|
| / \ |
|/ 1 \|
3 ==== 4
'''
# Iterate around vertex 2 at the boundary (without holes in between)
vf_it = openmesh.VertexFaceIter(self.mesh, self.vhandle[2])
self.assertEqual(vf_it.__next__().idx(), 3)
self.assertEqual(vf_it.__next__().idx(), 0)
self.assertRaises(StopIteration, vf_it.__next__)
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(TriMeshCirculatorVertexFace)
unittest.TextTestRunner(verbosity=2).run(suite)

View File

@@ -0,0 +1,80 @@
import unittest
import openmesh
class TriMeshCirculatorVertexIHalfEdge(unittest.TestCase):
def setUp(self):
self.mesh = openmesh.TriMesh()
# Add some vertices
self.vhandle = []
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0,-1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2,-1, 0)))
# Add four faces
self.mesh.add_face(self.vhandle[0], self.vhandle[1], self.vhandle[2])
self.mesh.add_face(self.vhandle[1], self.vhandle[3], self.vhandle[4])
self.mesh.add_face(self.vhandle[0], self.vhandle[3], self.vhandle[1])
self.mesh.add_face(self.vhandle[2], self.vhandle[1], self.vhandle[4])
'''
Test setup:
0 ==== 2
|\ 0 /|
| \ / |
|2 1 3|
| / \ |
|/ 1 \|
3 ==== 4
Starting halfedge is 1->4
'''
def test_vertex_incoming_halfedge_without_holes_increment(self):
# Iterate around vertex 1 at the middle
vih_it = openmesh.VertexIHalfedgeIter(self.mesh, self.vhandle[1])
heh = vih_it.__next__()
self.assertEqual(heh.idx(), 10)
self.assertEqual(self.mesh.face_handle(heh).idx(), 1)
heh = vih_it.__next__()
self.assertEqual(heh.idx(), 7)
self.assertEqual(self.mesh.face_handle(heh).idx(), 2)
heh = vih_it.__next__()
self.assertEqual(heh.idx(), 0)
self.assertEqual(self.mesh.face_handle(heh).idx(), 0)
heh = vih_it.__next__()
self.assertEqual(heh.idx(), 3)
self.assertEqual(self.mesh.face_handle(heh).idx(), 3)
self.assertRaises(StopIteration, vih_it.__next__)
def test_vertex_incoming_halfedge_boundary_increment(self):
# Iterate around vertex 2 at the boundary
vih_it = openmesh.VertexIHalfedgeIter(self.mesh, self.vhandle[2])
heh = vih_it.__next__()
self.assertEqual(heh.idx(), 14)
self.assertEqual(self.mesh.face_handle(heh).idx(), 3)
heh = vih_it.__next__()
self.assertEqual(heh.idx(), 2)
self.assertEqual(self.mesh.face_handle(heh).idx(), 0)
heh = vih_it.__next__()
self.assertEqual(heh.idx(), 5)
self.assertEqual(self.mesh.face_handle(heh).idx(), -1)
self.assertRaises(StopIteration, vih_it.__next__)
def test_vertex_incoming_halfedge_dereference_increment(self):
# Iterate around vertex 1 at the middle
vih_it = openmesh.VertexIHalfedgeIter(self.mesh, self.vhandle[1])
heh = vih_it.__next__()
eh = self.mesh.edge_handle(heh)
vh = self.mesh.to_vertex_handle(heh)
self.assertEqual(heh.idx(), 10)
self.assertEqual(eh.idx(), 5)
self.assertEqual(vh.idx(), 1)
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(TriMeshCirculatorVertexIHalfEdge)
unittest.TextTestRunner(verbosity=2).run(suite)

View File

@@ -0,0 +1,80 @@
import unittest
import openmesh
class TriMeshCirculatorVertexOHalfEdge(unittest.TestCase):
def setUp(self):
self.mesh = openmesh.TriMesh()
# Add some vertices
self.vhandle = []
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0,-1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2,-1, 0)))
# Add four faces
self.mesh.add_face(self.vhandle[0], self.vhandle[1], self.vhandle[2])
self.mesh.add_face(self.vhandle[1], self.vhandle[3], self.vhandle[4])
self.mesh.add_face(self.vhandle[0], self.vhandle[3], self.vhandle[1])
self.mesh.add_face(self.vhandle[2], self.vhandle[1], self.vhandle[4])
'''
Test setup:
0 ==== 2
|\ 0 /|
| \ / |
|2 1 3|
| / \ |
|/ 1 \|
3 ==== 4
Starting halfedge is 1->4
'''
def test_vertex_outgoing_halfedge_without_holes_increment(self):
# Iterate around vertex 1 at the middle
voh_it = openmesh.VertexOHalfedgeIter(self.mesh, self.vhandle[1])
heh = voh_it.__next__()
self.assertEqual(heh.idx(), 11)
self.assertEqual(self.mesh.face_handle(heh).idx(), 3)
heh = voh_it.__next__()
self.assertEqual(heh.idx(), 6)
self.assertEqual(self.mesh.face_handle(heh).idx(), 1)
heh = voh_it.__next__()
self.assertEqual(heh.idx(), 1)
self.assertEqual(self.mesh.face_handle(heh).idx(), 2)
heh = voh_it.__next__()
self.assertEqual(heh.idx(), 2)
self.assertEqual(self.mesh.face_handle(heh).idx(), 0)
self.assertRaises(StopIteration, voh_it.__next__)
def test_vertex_outgoing_halfedge_boundary_increment(self):
# Iterate around vertex 2 at the boundary
voh_it = openmesh.VertexOHalfedgeIter(self.mesh, self.vhandle[2])
heh = voh_it.__next__()
self.assertEqual(heh.idx(), 15)
self.assertEqual(self.mesh.face_handle(heh).idx(), -1)
heh = voh_it.__next__()
self.assertEqual(heh.idx(), 3)
self.assertEqual(self.mesh.face_handle(heh).idx(), 3)
heh = voh_it.__next__()
self.assertEqual(heh.idx(), 4)
self.assertEqual(self.mesh.face_handle(heh).idx(), 0)
self.assertRaises(StopIteration, voh_it.__next__)
def test_vertex_outgoing_halfedge_dereference_increment(self):
# Iterate around vertex 1 at the middle
voh_it = openmesh.VertexOHalfedgeIter(self.mesh, self.vhandle[1])
heh = voh_it.__next__()
eh = self.mesh.edge_handle(heh)
vh = self.mesh.to_vertex_handle(heh)
self.assertEqual(heh.idx(), 11)
self.assertEqual(eh.idx(), 5)
self.assertEqual(vh.idx(), 4)
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(TriMeshCirculatorVertexOHalfEdge)
unittest.TextTestRunner(verbosity=2).run(suite)

View File

@@ -0,0 +1,56 @@
import unittest
import openmesh
class TriMeshCirculatorVertexVertex(unittest.TestCase):
def setUp(self):
self.mesh = openmesh.TriMesh()
# Add some vertices
self.vhandle = []
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0,-1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2,-1, 0)))
# Add four faces
self.mesh.add_face(self.vhandle[0], self.vhandle[1], self.vhandle[2])
self.mesh.add_face(self.vhandle[1], self.vhandle[3], self.vhandle[4])
self.mesh.add_face(self.vhandle[0], self.vhandle[3], self.vhandle[1])
self.mesh.add_face(self.vhandle[2], self.vhandle[1], self.vhandle[4])
'''
Test setup:
0 ==== 2
|\ 0 /|
| \ / |
|2 1 3|
| / \ |
|/ 1 \|
3 ==== 4
Starting vertex is 1->4
'''
def test_vertex_vertex_increment(self):
# Iterate around vertex 1 at the middle
vv_it = openmesh.VertexVertexIter(self.mesh, self.vhandle[1])
self.assertEqual(vv_it.__next__().idx(), 4)
self.assertEqual(vv_it.__next__().idx(), 3)
self.assertEqual(vv_it.__next__().idx(), 0)
self.assertEqual(vv_it.__next__().idx(), 2)
self.assertRaises(StopIteration, vv_it.__next__)
def test_vertex_vertex_boundary_increment(self):
# Iterate around vertex 2 at the boundary
vv_it = openmesh.VertexVertexIter(self.mesh, self.vhandle[2])
self.assertEqual(vv_it.__next__().idx(), 4)
self.assertEqual(vv_it.__next__().idx(), 1)
self.assertEqual(vv_it.__next__().idx(), 0)
self.assertRaises(StopIteration, vv_it.__next__)
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(TriMeshCirculatorVertexVertex)
unittest.TextTestRunner(verbosity=2).run(suite)

View File

@@ -0,0 +1,516 @@
import unittest
import openmesh
class Collapse(unittest.TestCase):
def setUp(self):
self.mesh = openmesh.TriMesh()
self.vhandle = []
def test_collapse_quad_with_center(self):
# 0--------1
# |\ /|
# | \ / |
# | \ / |
# | 2 |
# | / \ |
# | / \ |
# 3--------4
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 2, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(2, 2, 0)))
# Add four faces
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[1])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[2])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[4])
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[4])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[2])
self.mesh.add_face(face_vhandles)
self.mesh.request_vertex_status()
self.mesh.request_edge_status()
self.mesh.request_face_status()
# Get the halfedge
v2v1 = self.mesh.find_halfedge(self.vhandle[2], self.vhandle[1])
self.assertTrue(v2v1.is_valid())
self.assertTrue(self.mesh.is_collapse_ok(v2v1))
# Execute it as a crash test
self.mesh.collapse(v2v1)
def test_collapse_tetrahedron_complex(self):
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 0, 0)))
# Add four faces
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[2])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[0])
self.mesh.add_face(face_vhandles)
self.mesh.request_vertex_status()
self.mesh.request_edge_status()
self.mesh.request_face_status()
v0v1 = self.mesh.halfedge_handle(0)
v1v0 = self.mesh.opposite_halfedge_handle(v0v1)
v1vL = self.mesh.next_halfedge_handle(v0v1)
vLv1 = self.mesh.opposite_halfedge_handle(v1vL)
vLv0 = self.mesh.next_halfedge_handle(v1vL)
v0vL = self.mesh.opposite_halfedge_handle(vLv0)
vLvR = self.mesh.next_halfedge_handle(v0vL)
vRvL = self.mesh.opposite_halfedge_handle(vLvR)
v0vR = self.mesh.next_halfedge_handle(v1v0)
vRv0 = self.mesh.opposite_halfedge_handle(v0vR)
vRv1 = self.mesh.next_halfedge_handle(v0vR)
v1vR = self.mesh.opposite_halfedge_handle(vRv1)
v0 = self.mesh.from_vertex_handle(v0v1)
v1 = self.mesh.to_vertex_handle(v0v1)
vL = self.mesh.to_vertex_handle(self.mesh.next_halfedge_handle(v0v1))
vR = self.mesh.to_vertex_handle(self.mesh.next_halfedge_handle(v1v0))
# ===================================================================
# Check preconditions
# ===================================================================
self.assertTrue(self.mesh.is_collapse_ok(v0v1))
self.assertTrue(self.mesh.is_collapse_ok(v1v0))
# Test the Vertex indices
self.assertEqual(v0.idx(), 0)
self.assertEqual(v1.idx(), 1)
self.assertEqual(vL.idx(), 2)
self.assertEqual(vR.idx(), 3)
# Check the halfedges
self.assertEqual(v0v1.idx(), 0)
self.assertEqual(v1v0.idx(), 1)
self.assertEqual(v1vL.idx(), 2)
self.assertEqual(vLv1.idx(), 3)
self.assertEqual(vLv0.idx(), 4)
self.assertEqual(v0vL.idx(), 5)
self.assertEqual(vLvR.idx(), 6)
self.assertEqual(vRvL.idx(), 7)
self.assertEqual(vRv0.idx(), 8)
self.assertEqual(v0vR.idx(), 9)
self.assertEqual(v1vR.idx(), 10)
self.assertEqual(vRv1.idx(), 11)
# ===================================================================
# Execute collapse
# ===================================================================
self.mesh.collapse(v0v1)
# ===================================================================
# Check configuration afterwards
# ===================================================================
# Now the configuration should look like this:
# The numbers at the side denote the halfedges
# 1
# / \
# / \
# // \\
# 3/2 11\10
# // \\
# / 6--> \
# 2 ----------- 3
# <--7
self.assertEqual(self.mesh.n_faces(), 4)
# Check if the right vertices got deleted
self.assertTrue(self.mesh.status(self.mesh.face_handle(0)).deleted())
self.assertFalse(self.mesh.status(self.mesh.face_handle(1)).deleted())
self.assertFalse(self.mesh.status(self.mesh.face_handle(2)).deleted())
self.assertTrue(self.mesh.status(self.mesh.face_handle(3)).deleted())
# Check the vertices of the two remaining faces
fh_1 = self.mesh.face_handle(1)
fh_2 = self.mesh.face_handle(2)
fv_it = self.mesh.fv(fh_1)
self.assertTrue(fv_it.__next__().idx(), 1)
self.assertTrue(fv_it.__next__().idx(), 2)
self.assertTrue(fv_it.__next__().idx(), 3)
fv_it = self.mesh.fv(fh_2)
self.assertTrue(fv_it.__next__().idx(), 2)
self.assertTrue(fv_it.__next__().idx(), 1)
self.assertTrue(fv_it.__next__().idx(), 3)
# Get the first halfedge of face 1
fh_1_he = self.mesh.halfedge_handle(fh_1)
self.assertEqual(fh_1_he.idx(), 11)
self.assertEqual(self.mesh.to_vertex_handle(fh_1_he).idx(), 1)
next = self.mesh.next_halfedge_handle(fh_1_he)
self.assertEqual(next.idx(), 2)
self.assertEqual(self.mesh.to_vertex_handle(next).idx(), 2)
next = self.mesh.next_halfedge_handle(next)
self.assertEqual(next.idx(), 6)
self.assertEqual(self.mesh.to_vertex_handle(next).idx(), 3)
# Get the first halfedge of face 2
fh_2_he = self.mesh.halfedge_handle(fh_2)
self.assertEqual(fh_2_he.idx(), 7)
self.assertEqual(self.mesh.to_vertex_handle(fh_2_he).idx(), 2)
next = self.mesh.next_halfedge_handle(fh_2_he)
self.assertEqual(next.idx(), 3)
self.assertEqual(self.mesh.to_vertex_handle(next).idx(), 1)
next = self.mesh.next_halfedge_handle(next)
self.assertEqual(next.idx(), 10)
self.assertEqual(self.mesh.to_vertex_handle(next).idx(), 3)
# Vertex 1 outgoing
voh_it = self.mesh.voh(self.mesh.vertex_handle(1))
self.assertEqual(voh_it.__next__().idx(), 10)
self.assertEqual(voh_it.__next__().idx(), 2)
self.assertRaises(StopIteration, voh_it.__next__)
# Vertex 2 outgoing
voh_it = self.mesh.voh(self.mesh.vertex_handle(2))
self.assertEqual(voh_it.__next__().idx(), 3)
self.assertEqual(voh_it.__next__().idx(), 6)
self.assertRaises(StopIteration, voh_it.__next__)
# Vertex 2 outgoing
voh_it = self.mesh.voh(self.mesh.vertex_handle(3))
self.assertEqual(voh_it.__next__().idx(), 11)
self.assertEqual(voh_it.__next__().idx(), 7)
self.assertRaises(StopIteration, voh_it.__next__)
# ===================================================================
# Cleanup
# ===================================================================
self.mesh.garbage_collection()
# ===================================================================
# Check configuration afterwards
# ===================================================================
# Now the configuration should look like this:
# The numbers at the side denote the halfedges
# 0
# / \
# / \
# // \\
# 4/5 0\1
# // \\
# / 3--> \
# 2 ----------- 1
# <--2
self.assertEqual(self.mesh.n_faces(), 2)
# Check the vertices of the two remaining faces
fh_0 = self.mesh.face_handle(0)
fh_1 = self.mesh.face_handle(1)
fv_it = self.mesh.fv(fh_0)
self.assertEqual(fv_it.__next__().idx(), 2)
self.assertEqual(fv_it.__next__().idx(), 1)
self.assertEqual(fv_it.__next__().idx(), 0)
fv_it = self.mesh.fv(fh_1)
self.assertEqual(fv_it.__next__().idx(), 1)
self.assertEqual(fv_it.__next__().idx(), 2)
self.assertEqual(fv_it.__next__().idx(), 0)
# Get the first halfedge of face 1
fh_0_he = self.mesh.halfedge_handle(fh_0)
self.assertEqual(fh_0_he.idx(), 5)
self.assertEqual(self.mesh.to_vertex_handle(fh_0_he).idx(), 2)
next = self.mesh.next_halfedge_handle(fh_0_he)
self.assertEqual(next.idx(), 3)
self.assertEqual(self.mesh.to_vertex_handle(next).idx(), 1)
next = self.mesh.next_halfedge_handle(next)
self.assertEqual(next.idx(), 0)
self.assertEqual(self.mesh.to_vertex_handle(next).idx(), 0)
# Get the first halfedge of face 1
fh_1_he = self.mesh.halfedge_handle(fh_1)
self.assertEqual(fh_1_he.idx(), 1)
self.assertEqual(self.mesh.to_vertex_handle(fh_1_he).idx(), 1)
next = self.mesh.next_halfedge_handle(fh_1_he)
self.assertEqual(next.idx(), 2)
self.assertEqual(self.mesh.to_vertex_handle(next).idx(), 2)
next = self.mesh.next_halfedge_handle(next)
self.assertEqual(next.idx(), 4)
self.assertEqual(self.mesh.to_vertex_handle(next).idx(), 0)
# Vertex 0 outgoing
voh_it = self.mesh.voh(self.mesh.vertex_handle(0))
self.assertEqual(voh_it.__next__().idx(), 1)
self.assertEqual(voh_it.__next__().idx(), 5)
self.assertRaises(StopIteration, voh_it.__next__)
# Vertex 1 outgoing
voh_it = self.mesh.voh(self.mesh.vertex_handle(1))
self.assertEqual(voh_it.__next__().idx(), 0)
self.assertEqual(voh_it.__next__().idx(), 2)
self.assertRaises(StopIteration, voh_it.__next__)
# Vertex 2 outgoing
voh_it = self.mesh.voh(self.mesh.vertex_handle(2))
self.assertEqual(voh_it.__next__().idx(), 3)
self.assertEqual(voh_it.__next__().idx(), 4)
self.assertRaises(StopIteration, voh_it.__next__)
self.assertFalse(self.mesh.is_collapse_ok(self.mesh.halfedge_handle(0)))
self.assertFalse(self.mesh.is_collapse_ok(self.mesh.halfedge_handle(1)))
self.assertFalse(self.mesh.is_collapse_ok(self.mesh.halfedge_handle(2)))
self.assertFalse(self.mesh.is_collapse_ok(self.mesh.halfedge_handle(3)))
self.assertFalse(self.mesh.is_collapse_ok(self.mesh.halfedge_handle(4)))
self.assertFalse(self.mesh.is_collapse_ok(self.mesh.halfedge_handle(5)))
def test_collapse_tetrahedron(self):
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 0, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 0, -1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, 0, 0)))
# Add six faces
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[4])
face_vhandles.append(self.vhandle[2])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[4])
face_vhandles.append(self.vhandle[0])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[4])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[0])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
self.mesh.request_vertex_status()
self.mesh.request_edge_status()
self.mesh.request_face_status()
# =============================================
# Collapse halfedge from 0 to 4
# =============================================
heh_collapse1 = self.mesh.halfedge_handle(0)
self.assertEqual(self.mesh.to_vertex_handle(heh_collapse1).idx(), 4)
self.assertEqual(self.mesh.from_vertex_handle(heh_collapse1).idx(), 0)
self.assertTrue(self.mesh.is_collapse_ok(heh_collapse1))
self.mesh.collapse(heh_collapse1)
heh_collapse2 = self.mesh.halfedge_handle(2)
self.assertEqual(self.mesh.to_vertex_handle(heh_collapse2).idx(), 2)
self.assertEqual(self.mesh.from_vertex_handle(heh_collapse2).idx(), 4)
self.assertTrue(self.mesh.is_collapse_ok(heh_collapse2))
self.mesh.collapse(heh_collapse2)
heh_collapse3 = self.mesh.halfedge_handle(6)
self.assertEqual(self.mesh.to_vertex_handle(heh_collapse3).idx(), 2)
self.assertEqual(self.mesh.from_vertex_handle(heh_collapse3).idx(), 3)
self.assertFalse(self.mesh.is_collapse_ok(heh_collapse3))
def test_large_collapse_halfedge(self):
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 2, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 0, -1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 2, -1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 3, 0, 0)))
# Add six faces
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[5])
face_vhandles.append(self.vhandle[1])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[5])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[2])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[4])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[4])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[4])
face_vhandles.append(self.vhandle[6])
self.mesh.add_face(face_vhandles)
# Test setup:
# 0 ==== 2
# / \ /|\
# / \ / | \
# 5 --- 1 | 6
# \ / \ | /
# \ / \|/
# 3 ==== 4
# Request the status bits
self.mesh.request_vertex_status()
self.mesh.request_edge_status()
self.mesh.request_face_status()
# =============================================
# Collapse halfedge from 1 to 4
# =============================================
heh_collapse = openmesh.HalfedgeHandle()
for he in self.mesh.halfedges():
if self.mesh.from_vertex_handle(he).idx() == 1 and self.mesh.to_vertex_handle(he).idx() == 4:
heh_collapse = he
# Check our halfedge
self.assertEqual(self.mesh.to_vertex_handle(heh_collapse).idx(), 4)
self.assertEqual(self.mesh.from_vertex_handle(heh_collapse).idx(), 1)
self.assertTrue(self.mesh.is_collapse_ok(heh_collapse))
# Remember the end vertices
vh_from = self.mesh.from_vertex_handle(heh_collapse)
vh_to = self.mesh.to_vertex_handle(heh_collapse)
# Collapse it
self.mesh.collapse(heh_collapse)
self.assertTrue(self.mesh.status(vh_from).deleted())
self.assertFalse(self.mesh.status(vh_to).deleted())
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(Collapse)
unittest.TextTestRunner(verbosity=2).run(suite)

View File

@@ -0,0 +1,168 @@
import unittest
import openmesh
class TriMeshGarbageCollection(unittest.TestCase):
def setUp(self):
self.mesh = openmesh.TriMesh()
self.mesh.request_vertex_status()
self.mesh.request_edge_status()
self.mesh.request_halfedge_status()
self.mesh.request_face_status()
# Add some vertices
self.vhandle = []
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, -1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, -1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, 1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, 1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, -1, -1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, -1, -1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, 1, -1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, 1, -1)))
# Add six faces to form a cube
self.mesh.add_face(self.vhandle[0], self.vhandle[1], self.vhandle[3])
self.mesh.add_face(self.vhandle[1], self.vhandle[2], self.vhandle[3])
self.mesh.add_face(self.vhandle[7], self.vhandle[6], self.vhandle[5])
self.mesh.add_face(self.vhandle[7], self.vhandle[5], self.vhandle[4])
self.mesh.add_face(self.vhandle[1], self.vhandle[0], self.vhandle[4])
self.mesh.add_face(self.vhandle[1], self.vhandle[4], self.vhandle[5])
self.mesh.add_face(self.vhandle[2], self.vhandle[1], self.vhandle[5])
self.mesh.add_face(self.vhandle[2], self.vhandle[5], self.vhandle[6])
self.mesh.add_face(self.vhandle[3], self.vhandle[2], self.vhandle[6])
self.mesh.add_face(self.vhandle[3], self.vhandle[6], self.vhandle[7])
self.mesh.add_face(self.vhandle[0], self.vhandle[3], self.vhandle[7])
self.mesh.add_face(self.vhandle[0], self.vhandle[7], self.vhandle[4])
# Test setup:
#
# 3 ======== 2
# / /|
# / / | z
# 0 ======== 1 | |
# | | | | y
# | 7 | 6 | /
# | | / | /
# | |/ |/
# 4 ======== 5 -------> x
def test_standard_garbage_collection(self):
# Check setup
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_faces(), 12)
self.mesh.delete_vertex(self.vhandle[0])
# Check setup
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_faces(), 12)
self.mesh.garbage_collection()
# Check setup
self.assertEqual(self.mesh.n_vertices(), 7)
self.assertEqual(self.mesh.n_faces(), 8)
def test_tracked_garbage_collection(self):
# Check setup
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_faces(), 12)
#==================================================
# Create lists containing the current handles
#==================================================
vertexHandles = []
for v in self.mesh.vertices():
vertexHandles.append(v)
halfedgeHandles = []
for he in self.mesh.halfedges():
halfedgeHandles.append(he)
faceHandles = []
for f in self.mesh.faces():
faceHandles.append(f)
# Deleting vertex 0
self.mesh.delete_vertex(self.vhandle[0])
# Check setup
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_faces(), 12)
self.mesh.garbage_collection(vertexHandles, halfedgeHandles, faceHandles, True, True, True)
# Check setup
self.assertEqual(self.mesh.n_vertices(), 7)
self.assertEqual(self.mesh.n_faces(), 8)
# Check setup of vertices
self.assertEqual(vertexHandles[0].idx(), -1)
self.assertEqual(vertexHandles[1].idx(), 1)
self.assertEqual(vertexHandles[2].idx(), 2)
self.assertEqual(vertexHandles[3].idx(), 3)
self.assertEqual(vertexHandles[4].idx(), 4)
self.assertEqual(vertexHandles[5].idx(), 5)
self.assertEqual(vertexHandles[6].idx(), 6)
self.assertEqual(vertexHandles[7].idx(), 0)
# Check setup of halfedge handles
self.assertEqual(halfedgeHandles[0 ].idx(), -1)
self.assertEqual(halfedgeHandles[1 ].idx(), -1)
self.assertEqual(halfedgeHandles[2 ].idx(), 2)
self.assertEqual(halfedgeHandles[3 ].idx(), 3)
self.assertEqual(halfedgeHandles[4 ].idx(), -1)
self.assertEqual(halfedgeHandles[5 ].idx(), -1)
self.assertEqual(halfedgeHandles[6 ].idx(), 6)
self.assertEqual(halfedgeHandles[7 ].idx(), 7)
self.assertEqual(halfedgeHandles[8 ].idx(), 8)
self.assertEqual(halfedgeHandles[9 ].idx(), 9)
self.assertEqual(halfedgeHandles[10].idx(), 10)
self.assertEqual(halfedgeHandles[11].idx(), 11)
self.assertEqual(halfedgeHandles[12].idx(), 12)
self.assertEqual(halfedgeHandles[13].idx(), 13)
self.assertEqual(halfedgeHandles[14].idx(), 14)
self.assertEqual(halfedgeHandles[15].idx(), 15)
self.assertEqual(halfedgeHandles[16].idx(), 16)
self.assertEqual(halfedgeHandles[17].idx(), 17)
self.assertEqual(halfedgeHandles[18].idx(), 18)
self.assertEqual(halfedgeHandles[19].idx(), 19)
self.assertEqual(halfedgeHandles[20].idx(), -1)
self.assertEqual(halfedgeHandles[21].idx(), -1)
self.assertEqual(halfedgeHandles[22].idx(), 22)
self.assertEqual(halfedgeHandles[23].idx(), 23)
self.assertEqual(halfedgeHandles[24].idx(), 24)
self.assertEqual(halfedgeHandles[25].idx(), 25)
self.assertEqual(halfedgeHandles[26].idx(), 26)
self.assertEqual(halfedgeHandles[27].idx(), 27)
self.assertEqual(halfedgeHandles[28].idx(), 20)
self.assertEqual(halfedgeHandles[29].idx(), 21)
self.assertEqual(halfedgeHandles[30].idx(), 4)
self.assertEqual(halfedgeHandles[31].idx(), 5)
self.assertEqual(halfedgeHandles[32].idx(), 0)
self.assertEqual(halfedgeHandles[33].idx(), 1)
self.assertEqual(halfedgeHandles[34].idx(), -1)
self.assertEqual(halfedgeHandles[35].idx(), -1)
# Check setup of faces
self.assertEqual(faceHandles[0 ].idx(), -1)
self.assertEqual(faceHandles[1 ].idx(), 1)
self.assertEqual(faceHandles[2 ].idx(), 2)
self.assertEqual(faceHandles[3 ].idx(), 3)
self.assertEqual(faceHandles[4 ].idx(), -1)
self.assertEqual(faceHandles[5 ].idx(), 5)
self.assertEqual(faceHandles[6 ].idx(), 6)
self.assertEqual(faceHandles[7 ].idx(), 7)
self.assertEqual(faceHandles[8 ].idx(), 4)
self.assertEqual(faceHandles[9 ].idx(), 0)
self.assertEqual(faceHandles[10].idx(), -1)
self.assertEqual(faceHandles[11].idx(), -1)
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(TriMeshGarbageCollection)
unittest.TextTestRunner(verbosity=2).run(suite)

View File

@@ -0,0 +1,396 @@
import unittest
import openmesh
class TriMeshIterators(unittest.TestCase):
def setUp(self):
self.mesh = openmesh.TriMesh()
self.vhandle = []
def test_vertex_iter(self):
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 0, 0)))
# Add two faces
self.mesh.add_face(self.vhandle[2], self.vhandle[1], self.vhandle[0])
self.mesh.add_face(self.vhandle[2], self.vhandle[0], self.vhandle[3])
# Test setup:
# 1 === 2
# | / |
# | / |
# | / |
# 0 === 3
v_it = self.mesh.vertices()
self.assertEqual(v_it.__next__().idx(), 0)
self.assertEqual(v_it.__next__().idx(), 1)
self.assertEqual(v_it.__next__().idx(), 2)
self.assertEqual(v_it.__next__().idx(), 3)
self.assertRaises(StopIteration, v_it.__next__)
def test_vertex_iter_start_position(self):
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 0, 0)))
# Add two faces
self.mesh.add_face(self.vhandle[2], self.vhandle[1], self.vhandle[0])
self.mesh.add_face(self.vhandle[2], self.vhandle[0], self.vhandle[3])
# Test setup:
# 1 === 2
# | / |
# | / |
# | / |
# 0 === 3
v_it = openmesh.VertexIter(self.mesh, self.mesh.vertex_handle(2))
self.assertEqual(v_it.__next__().idx(), 2)
self.assertEqual(v_it.__next__().idx(), 3)
self.assertRaises(StopIteration, v_it.__next__)
def test_edge_iter(self):
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 0, 0)))
# Add two faces
self.mesh.add_face(self.vhandle[2], self.vhandle[1], self.vhandle[0])
self.mesh.add_face(self.vhandle[2], self.vhandle[0], self.vhandle[3])
# Test setup:
# 1 === 2
# | / |
# | / |
# | / |
# 0 === 3
e_it = self.mesh.edges()
e = e_it.__next__()
self.assertEqual(e.idx(), 0)
he = self.mesh.halfedge_handle(e, 0)
self.assertEqual(self.mesh.to_vertex_handle(he).idx(), 1)
self.assertEqual(self.mesh.from_vertex_handle(he).idx(), 2)
he = self.mesh.halfedge_handle(e, 1)
self.assertEqual(self.mesh.to_vertex_handle(he).idx(), 2)
self.assertEqual(self.mesh.from_vertex_handle(he).idx(), 1)
e = e_it.__next__()
self.assertEqual(e.idx(), 1)
he = self.mesh.halfedge_handle(e, 0)
self.assertEqual(self.mesh.to_vertex_handle(he).idx(), 0)
self.assertEqual(self.mesh.from_vertex_handle(he).idx(), 1)
he = self.mesh.halfedge_handle(e, 1)
self.assertEqual(self.mesh.to_vertex_handle(he).idx(), 1)
self.assertEqual(self.mesh.from_vertex_handle(he).idx(), 0)
e = e_it.__next__()
self.assertEqual(e.idx(), 2)
he = self.mesh.halfedge_handle(e, 0)
self.assertEqual(self.mesh.to_vertex_handle(he).idx(), 2)
self.assertEqual(self.mesh.from_vertex_handle(he).idx(), 0)
he = self.mesh.halfedge_handle(e, 1)
self.assertEqual(self.mesh.to_vertex_handle(he).idx(), 0)
self.assertEqual(self.mesh.from_vertex_handle(he).idx(), 2)
e = e_it.__next__()
self.assertEqual(e.idx(), 3)
he = self.mesh.halfedge_handle(e, 0)
self.assertEqual(self.mesh.to_vertex_handle(he).idx(), 3)
self.assertEqual(self.mesh.from_vertex_handle(he).idx(), 0)
he = self.mesh.halfedge_handle(e, 1)
self.assertEqual(self.mesh.to_vertex_handle(he).idx(), 0)
self.assertEqual(self.mesh.from_vertex_handle(he).idx(), 3)
e = e_it.__next__()
self.assertEqual(e.idx(), 4)
he = self.mesh.halfedge_handle(e, 0)
self.assertEqual(self.mesh.to_vertex_handle(he).idx(), 2)
self.assertEqual(self.mesh.from_vertex_handle(he).idx(), 3)
he = self.mesh.halfedge_handle(e, 1)
self.assertEqual(self.mesh.to_vertex_handle(he).idx(), 3)
self.assertEqual(self.mesh.from_vertex_handle(he).idx(), 2)
def test_halfedge_iter_skipping(self):
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, -1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, -1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, 1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, 1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, -1, -1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, -1, -1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, 1, -1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, 1, -1)))
# Add six faces to form a cube
self.mesh.add_face(self.vhandle[0], self.vhandle[1], self.vhandle[3])
self.mesh.add_face(self.vhandle[1], self.vhandle[2], self.vhandle[3])
self.mesh.add_face(self.vhandle[7], self.vhandle[6], self.vhandle[5])
self.mesh.add_face(self.vhandle[7], self.vhandle[5], self.vhandle[4])
self.mesh.add_face(self.vhandle[1], self.vhandle[0], self.vhandle[4])
self.mesh.add_face(self.vhandle[1], self.vhandle[4], self.vhandle[5])
self.mesh.add_face(self.vhandle[2], self.vhandle[1], self.vhandle[5])
self.mesh.add_face(self.vhandle[2], self.vhandle[5], self.vhandle[6])
self.mesh.add_face(self.vhandle[3], self.vhandle[2], self.vhandle[6])
self.mesh.add_face(self.vhandle[3], self.vhandle[6], self.vhandle[7])
self.mesh.add_face(self.vhandle[0], self.vhandle[3], self.vhandle[7])
self.mesh.add_face(self.vhandle[0], self.vhandle[7], self.vhandle[4])
# Test setup:
#
# 3 ======== 2
# / /|
# / / | z
# 0 ======== 1 | |
# | | | | y
# | 7 | 6 | /
# | | / | /
# | |/ |/
# 4 ======== 5 -------> x
# Check setup
self.assertEqual(self.mesh.n_edges(), 18)
self.assertEqual(self.mesh.n_halfedges(), 36)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_faces(), 12)
# Run over all halfedges
heCounter = 0
self.mesh.request_face_status()
self.mesh.request_vertex_status()
self.mesh.request_halfedge_status()
# Get second edge
eh = self.mesh.edge_handle(2)
# Delete one edge
self.mesh.delete_edge(eh)
# Check setup ( No garbage collection, so nothing should change!)
self.assertEqual(self.mesh.n_edges(), 18)
self.assertEqual(self.mesh.n_halfedges(), 36)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_faces(), 12)
# =====================================================
# Check skipping iterator
# =====================================================
ok_4 = True
ok_5 = True
count = 0
for he in self.mesh.shalfedges():
if he.idx() == 4:
ok_4 = False
if he.idx() == 5:
ok_5 = False
count += 1
self.assertEqual(count, 34)
self.assertTrue(ok_4)
self.assertTrue(ok_5)
# =====================================================
# Check non skipping iterator
# =====================================================
ok_4 = False
ok_5 = False
count = 0
for he in self.mesh.halfedges():
if he.idx() == 4:
ok_4 = True
if he.idx() == 5:
ok_5 = True
count += 1
self.assertEqual(count, 36)
self.assertTrue(ok_4)
self.assertTrue(ok_5)
def test_halfedge_iter_skipping_low_level(self):
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, -1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, -1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, 1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, 1, 1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, -1, -1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, -1, -1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d( 1, 1, -1)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(-1, 1, -1)))
# Add six faces to form a cube
self.mesh.add_face(self.vhandle[0], self.vhandle[1], self.vhandle[3])
self.mesh.add_face(self.vhandle[1], self.vhandle[2], self.vhandle[3])
self.mesh.add_face(self.vhandle[7], self.vhandle[6], self.vhandle[5])
self.mesh.add_face(self.vhandle[7], self.vhandle[5], self.vhandle[4])
self.mesh.add_face(self.vhandle[1], self.vhandle[0], self.vhandle[4])
self.mesh.add_face(self.vhandle[1], self.vhandle[4], self.vhandle[5])
self.mesh.add_face(self.vhandle[2], self.vhandle[1], self.vhandle[5])
self.mesh.add_face(self.vhandle[2], self.vhandle[5], self.vhandle[6])
self.mesh.add_face(self.vhandle[3], self.vhandle[2], self.vhandle[6])
self.mesh.add_face(self.vhandle[3], self.vhandle[6], self.vhandle[7])
self.mesh.add_face(self.vhandle[0], self.vhandle[3], self.vhandle[7])
self.mesh.add_face(self.vhandle[0], self.vhandle[7], self.vhandle[4])
# Test setup:
#
# 3 ======== 2
# / /|
# / / | z
# 0 ======== 1 | |
# | | | | y
# | 7 | 6 | /
# | | / | /
# | |/ |/
# 4 ======== 5 -------> x
# Check setup
self.assertEqual(self.mesh.n_edges(), 18)
self.assertEqual(self.mesh.n_halfedges(), 36)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_faces(), 12)
# Run over all halfedges
heCounter = 0
self.mesh.request_face_status()
self.mesh.request_vertex_status()
self.mesh.request_halfedge_status()
# Get second edge
eh = self.mesh.edge_handle(2)
# Delete one edge
self.mesh.delete_edge(eh)
# Check setup ( No garbage collection, so nothing should change!)
self.assertEqual(self.mesh.n_edges(), 18)
self.assertEqual(self.mesh.n_halfedges(), 36)
self.assertEqual(self.mesh.n_vertices(), 8)
self.assertEqual(self.mesh.n_faces(), 12)
# =====================================================
# Try to add low level edge with invalid incidents and
# check skipping iterator
# =====================================================
# Add a low level edge without handles
eh_test = self.mesh.edge_handle(self.mesh.new_edge(openmesh.VertexHandle(), openmesh.VertexHandle()))
count = 0
found_4 = False
found_5 = False
found_36 = False
found_37 = False
for he in self.mesh.shalfedges():
if he.idx() == 4:
found_4 = True
if he.idx() == 5:
found_5 = True
if he.idx() == 36:
found_36 = True
if he.idx() == 37:
found_37 = True
count += 1
self.assertEqual(count, 36)
self.assertFalse(found_4)
self.assertFalse(found_5)
self.assertTrue(found_36)
self.assertTrue(found_37)
# =====================================================
# Try to delete one edge with invalid incidents and
# check skipping iterator
# =====================================================
# Delete one edge and recheck (Halfedges 4 and 5)
self.mesh.delete_edge(eh_test)
count = 0
found_4 = False
found_5 = False
found_36 = False
found_37 = False
for he in self.mesh.shalfedges():
if he.idx() == 4:
found_4 = True
if he.idx() == 5:
found_5 = True
if he.idx() == 36:
found_36 = True
if he.idx() == 37:
found_37 = True
count += 1
self.assertEqual(count, 34)
self.assertFalse(found_4)
self.assertFalse(found_5)
self.assertFalse(found_36)
self.assertFalse(found_37)
def test_face_iter_empty_mesh_one_deleted_face(self):
# Request delete_face capability
self.mesh.request_vertex_status()
self.mesh.request_edge_status()
self.mesh.request_face_status()
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 1, 0)))
# Add one face
fh = self.mesh.add_face(self.vhandle[2], self.vhandle[1], self.vhandle[0])
is_delete_isolated_vertex = False
self.mesh.delete_face(fh, is_delete_isolated_vertex)
# Test setup:
# 1 === 2
# | /
# | /
# | /
# 0
# Normal iterators
f_it = self.mesh.faces()
self.assertEqual(f_it.__next__().idx(), 0)
self.assertRaises(StopIteration, f_it.__next__)
# Same with skipping iterators
f_it = self.mesh.sfaces()
self.assertRaises(StopIteration, f_it.__next__)
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(TriMeshIterators)
unittest.TextTestRunner(verbosity=2).run(suite)

View File

@@ -0,0 +1,103 @@
import unittest
import openmesh
class Normals(unittest.TestCase):
def setUp(self):
self.mesh = openmesh.TriMesh()
# Add some vertices
self.vhandle = []
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 0, 1)))
# Add four faces
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[2])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[0])
self.mesh.add_face(face_vhandles)
def test_normal_calculations(self):
# Check one Request only vertex normals
# Face normals are required for vertex and halfedge normals, so
# that prevent access to non existing properties are in place
self.mesh.request_vertex_normals()
self.mesh.request_halfedge_normals()
# Check blocks
self.mesh.update_normals()
# Request required face normals
self.mesh.request_face_normals()
# Automatically compute all normals
# As only vertex normals are requested and no face normals, this will compute nothing.
self.mesh.update_normals()
# Face normals alone
self.mesh.update_face_normals()
# Vertex normals alone (require valid face normals)
self.mesh.update_vertex_normals()
# Halfedge normals alone (require valid face normals)
self.mesh.update_halfedge_normals()
def test_calc_vertex_normal_fast(self):
self.mesh.request_vertex_normals()
self.mesh.request_halfedge_normals()
self.mesh.request_face_normals()
normal = openmesh.Vec3d()
self.mesh.calc_vertex_normal_fast(self.vhandle[2], normal)
def test_calc_vertex_normal_correct(self):
self.mesh.request_vertex_normals()
self.mesh.request_halfedge_normals()
self.mesh.request_face_normals()
normal = openmesh.Vec3d()
self.mesh.calc_vertex_normal_correct(self.vhandle[2], normal)
def test_calc_vertex_normal_loop(self):
self.mesh.request_vertex_normals()
self.mesh.request_halfedge_normals()
self.mesh.request_face_normals()
normal = openmesh.Vec3d()
self.mesh.calc_vertex_normal_loop(self.vhandle[2], normal)
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(Normals)
unittest.TextTestRunner(verbosity=2).run(suite)

View File

@@ -0,0 +1,129 @@
import unittest
import openmesh
from math import pi, fabs
class Others(unittest.TestCase):
def setUp(self):
self.mesh = openmesh.TriMesh()
self.vhandle = []
def test_is_estimated_feature_edge(self):
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 0, 1)))
# Add four faces
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[2])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[3])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[0])
self.mesh.add_face(face_vhandles)
# ===============================================
# Setup complete
# ===============================================
# Check one Request only vertex normals
# Face normals are required for vertex and halfedge normals, so
# that prevent access to non existing properties are in place
self.mesh.request_vertex_normals()
self.mesh.request_halfedge_normals()
self.mesh.request_face_normals()
# Automatically compute all normals
# As only vertex normals are requested and no face normals, this will compute nothing.
self.mesh.update_normals()
he = self.mesh.halfedges().__next__()
self.assertTrue(self.mesh.is_estimated_feature_edge(he, 0.0))
self.assertTrue(self.mesh.is_estimated_feature_edge(he, 0.125 * pi))
self.assertTrue(self.mesh.is_estimated_feature_edge(he, 0.250 * pi))
self.assertTrue(self.mesh.is_estimated_feature_edge(he, 0.375 * pi))
self.assertTrue(self.mesh.is_estimated_feature_edge(he, 0.500 * pi))
self.assertFalse(self.mesh.is_estimated_feature_edge(he, 0.625 * pi))
self.assertFalse(self.mesh.is_estimated_feature_edge(he, 0.750 * pi))
self.assertFalse(self.mesh.is_estimated_feature_edge(he, 0.875 * pi))
self.assertFalse(self.mesh.is_estimated_feature_edge(he, 1.000 * pi))
def test_is_estimated_feature_edge(self):
# Test setup:
# 1 -- 2
# | / |
# | / |
# 0 -- 3
# Add some vertices
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 0, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(0, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 1, 0)))
self.vhandle.append(self.mesh.add_vertex(openmesh.Vec3d(1, 0, 0)))
# Add two faces
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[1])
face_vhandles.append(self.vhandle[2])
self.mesh.add_face(face_vhandles)
face_vhandles = []
face_vhandles.append(self.vhandle[0])
face_vhandles.append(self.vhandle[2])
face_vhandles.append(self.vhandle[3])
self.mesh.add_face(face_vhandles)
# ===============================================
# Setup complete
# ===============================================
he = self.mesh.halfedge_handle(4)
self.assertEqual(self.mesh.to_vertex_handle(he).idx(), 0)
self.assertEqual(self.mesh.from_vertex_handle(he).idx(), 2)
self.assertEqual(self.mesh.edge_handle(he).idx(), 2)
eh = self.mesh.edge_handle(he)
self.assertEqual(self.mesh.calc_dihedral_angle(eh), 0.0)
# Modify point
tmp = (openmesh.Vec3d(0.0, 0.0, -1.0) + openmesh.Vec3d(1.0, 1.0, -1.0)) * 0.5
self.mesh.set_point(self.vhandle[2], tmp)
difference = fabs(1.36944 - self.mesh.calc_dihedral_angle(eh))
self.assertTrue(difference < 0.00001)
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(Others)
unittest.TextTestRunner(verbosity=2).run(suite)

View File

@@ -0,0 +1,30 @@
import unittest
import openmesh
class VectorTest(unittest.TestCase):
def test_compute_triangle_surface_with_cross_product(self):
# vec1
# x
# |
# |
# |
# x------>x vec2
vec1 = openmesh.Vec3d(0.0, 1.0, 0.0)
vec2 = openmesh.Vec3d(1.0, 0.0, 0.0)
area = 0.5 * openmesh.cross(vec1, vec2).norm()
self.assertEqual(area, 0.5)
area = 0.5 * (vec1 % vec2).norm()
self.assertEqual(area, 0.5)
def test_abs_test(self):
vec1 = openmesh.Vec3d(0.5, 0.5, -0.5)
self.assertEqual(vec1.l8_norm(), 0.5)
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(VectorTest)
unittest.TextTestRunner(verbosity=2).run(suite)