Пример #1
0
 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()
Пример #2
0
    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()
Пример #3
0
 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()
    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()
Пример #5
0
def read_obj(filename):
    mesh = OM.TriMesh()
    options = OM.Options()
    ok = OM.read_mesh(mesh, filename, options)
    mesh.request_face_normals()
    mesh.update_face_normals()
    if not ok:
        raise RuntimeError('read_obj() failed to read file: ' + filename)
    return mesh
    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()
    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)
Пример #8
0
 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()
Пример #9
0
 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_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_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_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()
Пример #13
0
    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)
    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()