def test_two_domains(self): surface_1 = SVMTK.Surface() surface_1.make_cube(-1.,-1.,-1.,1.,1.,1.,1) surface_2 = SVMTK.Surface() surface_2.make_cube(-2.,-2.,-2.,2.,2.,2.,1) domain = SVMTK.Domain([surface_1,surface_2]) self.assertEqual(domain.number_of_surfaces(),2)
def create_gwv_mesh(pial_stl, white_stl, ventricles_stl, output, remove_ventricles=True): # Create SVMTk Surfaces from STL files pial = svmtk.Surface(pial_stl) white = svmtk.Surface(white_stl) ventricles = svmtk.Surface(ventricles_stl) surfaces = [pial, white, ventricles] # Define identifying tags for the different regions tags = {"pial": 1, "white": 2, "ventricle": 3} # Define the corresponding subdomain map smap = svmtk.SubdomainMap() smap.add("100", tags["pial"]) smap.add("110", tags["white"]) smap.add("111", tags["ventricle"]) # Mesh and tag the domain from the surfaces and map domain = svmtk.Domain(surfaces, smap) resolution = 32 domain.create_mesh(resolution) # Remove subdomain with right tag from the domain if remove_ventricles: domain.remove_subdomain(tags["ventricle"]) # Save the mesh domain.save(output)
def test_seperate_close_surfaces(self): s1 = SVMTK.Surface() s2 = SVMTK.Surface() s3 = SVMTK.Surface() s1.make_cube(1., 0., 1., 2., 1., 2., 1) s2.make_cube(1., 1, 1., 2., 2., 2., 1) self.assertTrue(SVMTK.separate_close_surfaces(s1, s2))
def test_sperate_overlapping_surface_2(self): s1 = SVMTK.Surface() s2 = SVMTK.Surface() s3 = SVMTK.Surface() s1.make_cube(1., 0., 1., 2., 1., 2., 5) s2.make_cube(1., 1., 1., 2., 2., 2., 5) s3.make_cube(1.2, 0.5, 1.2, 1.8, 1.5, 1.8, 5) self.assertTrue(SVMTK.separate_overlapping_surfaces(s1, s2, s3))
def test_strictly_inside(self): surface1 = SVMTK.Surface() surface1.make_cube(0., 0., 0., 2., 2., 2., 10) surface2 = SVMTK.Surface() surface2.make_cube(-0.5, -0.5, -0.5, 2.5, 2.5, 2.5, 10) for i in range(5): surface2.strictly_inside(surface1, -.8) surface2.collapse_edges(0.3) surface2.smooth_laplacian(0.8, 1) self.assertEqual(surface2.strictly_inside(surface1, -0.1), 0)
def test_separate_enclosed_surface(self): surface1 = SVMTK.Surface() surface1.make_cube(0., 0., 0., 2., 2., 2., 4) surface2 = SVMTK.Surface() surface2.make_cube(0.05, 0.05, 0.05, 1.95, 1.95, 1.95, 4) for i in range(4): surface2.separate_enclosed_surface(surface1, -0.3) surface2.smooth_laplacian(0.3, 1) self.assertEqual(surface2.separate_enclosed_surface(surface1, -0.1), 0)
def test_seperate_overlapping_surfaces(self): s1 = SVMTK.Surface() s2 = SVMTK.Surface() s3 = SVMTK.Surface() s1.make_cube(1., 0., 1., 2., 1., 2., 1) s2.make_cube(1., 1, 1., 2., 2., 2., 1) s3.make_cube(1.2, 0.5, 1.2, 1.8, 1.5, 1.8, 1) s1.union(s3) s1.adjust_boundary(-0.01) s2.adjust_boundary(-0.01) self.assertTrue(SVMTK.separate_overlapping_surfaces(s1, s2))
def test_mehsing_domains_with_map(self): surface_1 = SVMTK.Surface() surface_1.make_cube(-1.,-1.,-1.,1.,1.,1.,1) surface_2 = SVMTK.Surface() surface_2.make_cube(-2.,-2.,-2.,2.,2.,2.,1) sf= SVMTK.SubdomainMap() sf.add("01",3) sf.add("11",2) domain = SVMTK.Domain([surface_1,surface_2],sf) domain.create_mesh(1.) self.assertTrue(domain.number_of_cells() >0)
def test_connected_components(self): surface1 = SVMTK.Surface() surface1.make_cube(0., 0., 0., 1., 1., 1., 10) surface2 = SVMTK.Surface() surface2.make_cube(1.5, 0, 0, 2., 1., 1., 10) slice_ = SVMTK.Slice(SVMTK.Plane_3(0, 0, 1, -0.5)) slice_.slice_surfaces([surface1, surface2]) slice_.create_mesh(1.) slice_.add_surface_domains([surface1, surface2]) self.assertEqual(slice_.connected_components(), 2) slice_.keep_largest_connected_component() self.assertEqual(slice_.connected_components(), 1)
def test_surface_io(self): surface = SVMTK.Surface() surface.make_cube(0., 0., 0., 1., 1., 1., 1) surface.save("tests/Data/cube.off") surface.save("tests/Data/cube.stl") surface = SVMTK.Surface("tests/Data/cube.off") self.assertTrue(surface.num_vertices() == 8 and surface.num_faces() == 12 and surface.num_edges() == 18) surface = SVMTK.Surface("tests/Data/cube.stl") self.assertTrue(surface.num_vertices() == 8 and surface.num_faces() == 12 and surface.num_edges() == 18)
def test_reconstruction(self): surface = SVMTK.Surface() surface.make_cube(0., 0., 0., 10., 10., 10., 10) surface.reconstruct(20, 1.0, 1.0) surface.collapse_edges() self.assertTrue(surface.num_vertices() > 0 and surface.num_faces() > 0 and surface.num_edges() > 0)
def test_separate_narrow_gaps(self): s1 = SVMTK.Surface("tests/Data/narrow_gap.off") self.assertEqual(s1.separate_narrow_gaps(), 64) for i in range(5): s1.separate_narrow_gaps() s1.collapse_edges(0.3) self.assertEqual(s1.separate_narrow_gaps(), 0)
def test_shortest_surface_path(self): surface = SVMTK.Surface() surface.make_cube(-1., -1., -1., 1., 1., 1., 1) a = surface.shortest_surface_path(SVMTK.Point_3(-1, -1, 1), SVMTK.Point_3(1, -1, 1)) self.assertTrue(a[1] == SVMTK.Point_3(-1, -1, 1) and a[0] == SVMTK.Point_3(1, -1, 1))
def test_surface_clip(self): surface = SVMTK.Surface() surface.make_cube(-1., -1., -1., 1., 1., 1., 1) surface.clip(0, 0, 1., 0, True) self.assertEqual(surface.span(0), (-1.0, 1.0)) self.assertEqual(surface.span(1), (-1.0, 1.0)) self.assertEqual(surface.span(2), (-1., 0.0))
def test_surfaces_shapes(self): surface = SVMTK.Surface() surface.make_cube(0., 0., 0., 1., 1., 1., 1) self.assertTrue(surface.num_vertices() == 8 and surface.num_faces() == 12 and surface.num_edges() == 18) surface.clear() self.assertEqual(surface.num_vertices(), 0) surface.make_cone(0., 0., 0., 0, 0., 2., 4.0, 2.0, 3) self.assertTrue(surface.num_vertices() == 8 and surface.num_faces() == 12 and surface.num_edges() == 18) surface.clear() self.assertEqual(surface.num_vertices(), 0) surface.make_cone(0., 0., 0., 0, 0., 2., 1.0, 0.0, 3) self.assertTrue(surface.num_vertices() == 20 and surface.num_faces() == 36 and surface.num_edges() == 54) surface.clear() self.assertEqual(surface.num_vertices(), 0) surface.make_cylinder(0., 0., 0., 1., 1.0, .1, 2.0, 4) self.assertTrue(surface.num_vertices() == 14 and surface.num_faces() == 24 and surface.num_edges() == 36) surface.clear() self.assertEqual(surface.num_vertices(), 0)
def test_domainmeshing_with_borders(self): surface = SVMTK.Surface() surface.make_cube(0.0,0.0,0.0,1.0,1.0,1.0,1) domain = SVMTK.Domain(surface) domain.add_sharp_border_edges(surface) domain.create_mesh(1.) self.assertTrue(domain.number_of_curves() > 0)
def test_surface_meshing(self): surface = SVMTK.Surface() surface.make_sphere(0.0, 0.0, 0.0, 1.0, 1.0) self.assertTrue(surface.num_vertices() > 0 and surface.num_faces() > 0 and surface.num_edges() > 0) surface.clear() surface.implicit_surface(ellipsoid_function, 1.0, 10, 1.0, 1.0) self.assertTrue(surface.num_vertices() > 0 and surface.num_faces() > 0 and surface.num_edges() > 0)
def test_adjust_boundary(self): surface = SVMTK.Surface() surface.make_cube(-1., -1., -1., 1., 1., 1., 1) surface.adjust_boundary(-0.1) self.assertTrue(surface.span(0)[1] - surface.span(0)[0] < 2.) surface.clear() surface.make_cube(-1., -1., -1., 1., 1., 1., 1) surface.adjust_boundary(0.1) self.assertTrue(surface.span(0)[1] - surface.span(0)[0] > 2.)
def test_domain_with_polyline_meshing(self): surface = SVMTK.Surface(); surface.make_sphere(0.0,0.0,0.0,3.0,1.0) domain = SVMTK.Domain(surface) line0 = [SVMTK.Point_3(0,0,0.0), SVMTK.Point_3(0,1.0,1.0)] domain.add_feature( line0) domain.create_mesh(1.) self.assertTrue(domain.number_of_curves() >0)
def test_surface_remeshing(self): surface = SVMTK.Surface() surface.make_cube(0., 0., 0., 1., 1., 1., 1) self.assertTrue(surface.num_vertices() == 8 and surface.num_faces() == 12 and surface.num_edges() == 18) surface.isotropic_remeshing(1.0, 1, 1) self.assertTrue(surface.num_vertices() == 14 and surface.num_faces() == 24 and surface.num_edges() == 36)
def boolean_operations(self): surface1 = SVMTK.Surface() surface1.make_cube(0., 0., 0., 1., 1., 1., 1) surface2 = SVMTK.Surface() surface2.make_cube(0.5, 0.5, 0.5, 1.5, 1.5, 1.5, 1) surface1.union(surface2) self.assertTrue(surface.num_vertices() == 20 and surface.num_faces() == 36 and surface.num_edges() == 54) surface1.clear() surface1.make_cube(0., 0., 0., 1., 1., 1., 1) surface1.intersection(surface2) self.assertTrue(surface.num_vertices() == 8 and surface.num_faces() == 12 and surface.num_edges() == 18) surface2.difference(surface1) self.assertTrue(surface.num_vertices() == 14 and surface.num_faces() == 24 and surface.num_edges() == 36)
def test_get_boundary_and_patches(self): surface_1 = SVMTK.Surface() surface_1.make_cube(-1.,-1.,-1.,1.,1.,1.,1) surface_2 = SVMTK.Surface() surface_2.make_cube(-2.,-2.,-2.,2.,2.,2.,1) sf= SVMTK.SubdomainMap() sf.add("01",3) sf.add("11",2) domain = SVMTK.Domain([surface_1,surface_2],sf) domain.create_mesh(1.) surface = domain.get_boundary(0) self.assertTrue(surface.num_vertices()==77 and surface.num_faces()==137 and surface.num_edges()==219) surface = domain.get_boundary(1) self.assertEqual(surface.num_vertices(), 0) surface = domain.get_boundary(3) self.assertTrue(surface.num_vertices()==128 and surface.num_faces()==235 and surface.num_edges()==366) surfaces = domain.get_boundaries() print(len(surfaces)) self.assertEqual(len(surfaces),2)
def test_slice_subdomains(self): slice_ = SVMTK.Slice(SVMTK.Plane_3(0, 0, 1, 0)) surface1 = SVMTK.Surface() surface1.make_cube(-1., -1., -1., 1., 1., 1., 1) surface2 = SVMTK.Surface() surface2.make_cube(-2., -2., -2., 2., 2., 2., 1) sf = SVMTK.SubdomainMap(0) sf.add("11", 2) sf.add("11", 2) slice_ = SVMTK.Slice(SVMTK.Plane_3(0, 0, 1, 0)) slice_.slice_surfaces([surface1, surface2]) slice_.create_mesh(1.) slice_.add_surface_domains([surface1, surface2]) self.assertEqual(slice_.number_of_subdomains(), 2) slice_.add_surface_domains([surface1, surface2], sf) self.assertEqual(slice_.number_of_subdomains(), 1) slice_.remove_subdomains(2) self.assertEqual(slice_.number_of_subdomains(), 0)
def test_slice_meshing(self): surface = SVMTK.Surface() surface.make_cube(0., 0., 0., 1., 1., 1., 1) slice_ = surface.slice(1, 1, 1, -0.5) self.assertTrue(slice_.number_of_constraints() > 0) slice_.create_mesh(1.) self.assertTrue(slice_.number_of_faces() > 0) slice_.save("tests/Data/slice.vtu") slice_.save("tests/Data/slice.stl") slice_.save("tests/Data/slice.off") slice_.save("tests/Data/slice.mesh")
def create_gw_mesh(pial_stl, white_stl, output): # Load the surfaces into SVM-Tk and combine in list pial = svmtk.Surface(pial_stl) white = svmtk.Surface(white_stl) surfaces = [pial, white] # Create a map for the subdomains with tags # 1 for inside the first and outside the second ("10") # 2 for inside the first and inside the second ("11") smap = svmtk.SubdomainMap() smap.add("10", 1) smap.add("11", 2) # Create a tagged domain from the list of surfaces # and the map domain = svmtk.Domain(surfaces, smap) # Create and save the volume mesh resolution = 32 domain.create_mesh(resolution) domain.save(output)
def remesh_surface(stl_input, output, L, n, do_not_move_boundary_edges=False): # Load input STL file surface = svmtk.Surface(stl_input) # Remesh surface surface.isotropic_remeshing(L, n, do_not_move_boundary_edges) # Save remeshed STL surface surface.save(output)
def test_collapse_and_split_edges(self): surface = SVMTK.Surface() surface.make_cube(0., 0., 0., 1., 1., 1., 1) self.assertTrue(surface.num_vertices() == 8 and surface.num_faces() == 12 and surface.num_edges() == 18) surface.split_edges(0.5) self.assertEqual(surface.num_edges(), 108) surface.collapse_edges(0.4) self.assertEqual(surface.num_edges(), 45) surface.split_edges(0.5) surface.collapse_edges() self.assertEqual(surface.num_edges(), 45)
def smoothen_surface(stl_input, output, n=1, eps=1.0, preserve_volume=True): # Load input STL file surface = svmtk.Surface(stl_input) # Smooth using Taubin smoothing # if volume should be preserved, # otherwise use Laplacian smoothing if preserve_volume: surface.smooth_taubin(n) else: surface.smooth_laplacian(eps, n) # Save smoothened STL surface surface.save(output)
def create_brain_mesh(stls, output, resolution=32, remove_ventricles=True): # Load each of the Surfaces surfaces = [svmtk.Surface(stl) for stl in stls] # Take the union of the left (#3) and right (#4) # white surface and put the result into # the (former left) white surface surfaces[2].union(surfaces[3]) # ... and drop the right white surface from the list surfaces.pop(3) # Define identifying tags for the different regions tags = {"pial": 1, "white": 2, "ventricle": 3} # Label the different regions smap = svmtk.SubdomainMap() smap.add("1000", tags["pial"]) smap.add("0100", tags["pial"]) smap.add("1010", tags["white"]) smap.add("0110", tags["white"]) smap.add("1110", tags["white"]) smap.add("1011", tags["ventricle"]) smap.add("0111", tags["ventricle"]) smap.add("1111", tags["ventricle"]) # Generate mesh at given resolution domain = svmtk.Domain(surfaces, smap) domain.create_mesh(resolution) # Remove ventricles perhaps if remove_ventricles: domain.remove_subdomain(tags["ventricle"]) # Save mesh domain.save(output)
def test_span(self): surface = SVMTK.Surface() surface.make_cube(0., 0., 0., 2., 1., 3., 1) self.assertEqual(surface.span(0), (0., 2)) self.assertEqual(surface.span(1), (0., 1)) self.assertEqual(surface.span(2), (0., 3))