Show topology manipulation tools in slamΒΆ

# Authors: Guillaume Auzias <guillaume.auzias@univ-amu.fr>

# License: BSD (3-clause)
# sphinx_gallery_thumbnail_number = 2

importation of slam modules

import slam.io as sio
import slam.topology as stop
import slam.plot as splt
import slam.generate_parametric_surfaces as sps
import numpy as np
from vispy.scene import Line
from visbrain.objects import VispyObj, SourceObj

here is how to get the vertices that define the boundary of an open mesh

K = [-1, -1]
open_mesh = sps.generate_quadric(K, nstep=[5, 5])

Identify the vertices lying on the boundary of the mesh and order them to get a path traveling across boundary vertices The output is a list of potentially more than one boudaries depending on the topology of the input mesh. Here the mesh has a single boundary

open_mesh_boundary = stop.mesh_boundary(open_mesh)
print(open_mesh_boundary)

Out:

[[1, 2, 3, 4, 9, 14, 19, 24, 23, 22, 21, 20, 15, 10, 5, 0]]

show the result WARNING : BrainObj should be added first before

visb_sc = splt.visbrain_plot(mesh=open_mesh, caption="open mesh")
# create points with vispy
for bound in open_mesh_boundary:
    points = open_mesh.vertices[bound]
    s_rad = SourceObj("rad", points, color="red", symbol="square", radius_min=10)
    visb_sc.add_to_subplot(s_rad)
    lines = Line(pos=open_mesh.vertices[bound], width=10, color="b")
    # wrap the vispy object using visbrain
    l_obj = VispyObj("line", lines)
    visb_sc.add_to_subplot(l_obj)
visb_sc.preview()
example topology

eroding the mesh by removing the faces having 3 vertices on the boundary

eroded_mesh = stop.remove_mesh_boundary_faces(open_mesh, face_vertex_number=1)

show the result

visb_sc2 = splt.visbrain_plot(mesh=eroded_mesh, caption="eroded mesh")
# show again the boundary of original mesh which have been removed with
# corresponding faces by the erosion
for bound in open_mesh_boundary:
    points = open_mesh.vertices[bound]
    s_rad = SourceObj("rad", points, color="red", symbol="square", radius_min=10)
    visb_sc2.add_to_subplot(s_rad)
    lines = Line(pos=open_mesh.vertices[bound], width=10, color="b")
    # wrap the vispy object using visbrain
    l_obj = VispyObj("line", lines)
    visb_sc2.add_to_subplot(l_obj)
visb_sc2.preview()
example topology

here is how to get the vertices that define the boundary of a texture on a mesh Let us first load example data

mesh = sio.load_mesh("../examples/data/example_mesh.gii")
# rotate the mesh for better visualization
transfo_flip = np.array([[-1, 0, 0, 0], [0, 1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])
mesh.apply_transform(transfo_flip)

# Load the example texture and compute its boundary
tex_parcel = sio.load_texture("../examples/data/example_texture_parcel.gii")
texture_bound = stop.texture_boundary(mesh, tex_parcel.darray[0], 20)

show the results

visb_sc3 = splt.visbrain_plot(
    mesh=mesh, tex=tex_parcel.darray[0], caption="texture boundary"
)
cols = ["red", "green", "yellow", "blue"]
ind = 0
for bound in texture_bound:
    points = mesh.vertices[bound]
    s_rad = SourceObj("rad", points, color="red", symbol="square", radius_min=10)
    visb_sc3.add_to_subplot(s_rad)
    lines = Line(pos=mesh.vertices[bound], width=10, color=cols[ind])
    # wrap the vispy object using visbrain
    l_obj = VispyObj("line", lines)
    visb_sc3.add_to_subplot(l_obj)
    ind += 1
    if ind == len(cols):
        ind = 0
visb_sc3.preview()
example topology

================= cut_mesh ================= Cut he mesh into subparts corresponding to the different values in the texture tex_parcel

parc_u = np.unique(tex_parcel.darray[0])
print(
    "Here the texture contains {0} different values: {1}" "".format(len(parc_u), parc_u)
)

Out:

Here the texture contains 5 different values: [ 0.       20.       50.000004 50.00005  99.99989 ]

Let us cut the mesh

sub_meshes, sub_tex, sub_corresp = stop.cut_mesh(mesh, tex_parcel.darray[0])
# The output submeshes are ordered following texture values
# The second output of cut_mesh gives the texture value corresponding to
# each submesh
print(
    "Corresponding texture values are given by" " the second ouput: {}".format(sub_tex)
)

# The respective indices of the vertices of each submesh in the original
# mesh before the cut is given by the third output:
print(sub_corresp)

Out:

Corresponding texture values are given by the second ouput: [100.0, 50.0, 20.0, 0.0]
[[53, 54, 56, 57, 62, 63, 66, 67, 75, 215, 216, 225, 231, 234, 235, 237, 239, 240, 241, 242, 246, 247, 248, 252, 253, 254, 255, 260, 261, 263, 266, 270, 274, 275, 276, 280, 939, 960, 961, 963, 970, 987, 988, 998, 1015, 1041, 1042, 1043, 1052, 1053, 1072, 1073, 1100, 1101, 1133, 1152, 2117, 2119, 2120, 2121, 2123, 2124, 2125, 2126, 2127, 2143, 2144, 2145, 2154, 2155, 2156, 2157, 2247, 2253, 2254, 2256, 2271, 2272, 2273, 2274, 2276, 2277, 2278, 2279, 2287], [27, 28, 44, 50, 51, 52, 55, 59, 148, 153, 161, 162, 165, 166, 178, 184, 185, 213, 220, 230, 236, 244, 245, 250, 258, 259, 354, 756, 757, 758, 764, 772, 777, 778, 779, 792, 814, 843, 922, 978, 982, 983, 984, 986, 1005, 1007, 1031, 1051, 1834, 1876, 1901, 1902, 1905, 1906, 1907, 1936, 1949, 1950, 1951, 1953, 1975, 1976, 2042, 2070, 2077, 2078, 2079, 2080, 2095, 2108, 2109, 2110, 2111, 2112, 2141, 2142, 2153, 2168, 2169, 2170, 2180, 2181, 2182, 2206, 2207, 2208, 2209, 2237, 2238, 2246, 2269], [9, 11, 13, 21, 26, 29, 31, 35, 37, 112, 116, 117, 118, 119, 120, 124, 125, 127, 129, 130, 131, 132, 139, 142, 145, 147, 151, 152, 156, 159, 170, 171, 172, 173, 174, 175, 176, 177, 182, 183, 191, 192, 193, 199, 200, 334, 342, 687, 688, 692, 697, 699, 706, 710, 711, 712, 713, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 735, 736, 737, 738, 739, 749, 750, 752, 754, 755, 761, 786, 787, 803, 832, 842, 867, 1722, 1739, 1740, 1741, 1742, 1752, 1753, 1754, 1763, 1790, 1791, 1792, 1798, 1862, 1863, 1864, 1868, 1870, 1873, 1875, 1886, 1887, 1888, 1889, 1890, 1892, 1893, 1895, 1897, 1898, 1900, 1903, 1904, 1919, 1920, 1931, 1932, 1933, 1941, 1942, 1943, 1944, 1945, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1971, 1973, 1974, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2011, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2028, 2029, 2050, 2071, 2073], [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 27, 28, 30, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 52, 53, 55, 56, 58, 59, 60, 61, 63, 64, 65, 67, 68, 69, 70, 71, 72, 73, 74, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 121, 122, 123, 124, 126, 127, 128, 129, 133, 134, 135, 136, 137, 138, 140, 141, 143, 144, 146, 149, 150, 151, 154, 155, 157, 158, 160, 163, 164, 165, 166, 167, 168, 169, 170, 176, 177, 178, 179, 180, 181, 184, 185, 186, 187, 188, 189, 190, 191, 192, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 221, 222, 223, 224, 226, 227, 228, 229, 232, 233, 238, 242, 243, 245, 249, 251, 254, 256, 257, 258, 259, 260, 262, 264, 265, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 707, 708, 709, 712, 714, 715, 716, 717, 721, 729, 730, 731, 732, 733, 734, 740, 741, 742, 743, 744, 745, 746, 747, 748, 751, 753, 758, 759, 760, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, 773, 774, 775, 776, 777, 780, 781, 782, 783, 784, 785, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 800, 801, 802, 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, 895, 896, 897, 898, 899, 900, 901, 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 962, 964, 965, 966, 967, 968, 969, 971, 972, 973, 974, 975, 976, 977, 979, 980, 981, 985, 986, 989, 990, 991, 992, 993, 994, 995, 996, 997, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301, 1302, 1303, 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1311, 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338, 1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347, 1348, 1349, 1350, 1351, 1352, 1353, 1354, 1355, 1356, 1357, 1358, 1359, 1360, 1361, 1362, 1363, 1364, 1365, 1366, 1367, 1368, 1369, 1370, 1371, 1372, 1373, 1374, 1375, 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1415, 1416, 1417, 1418, 1419, 1420, 1421, 1422, 1423, 1424, 1425, 1426, 1427, 1428, 1429, 1430, 1431, 1432, 1433, 1434, 1435, 1436, 1437, 1438, 1439, 1440, 1441, 1442, 1443, 1444, 1445, 1446, 1447, 1448, 1449, 1450, 1451, 1452, 1453, 1454, 1455, 1456, 1457, 1458, 1459, 1460, 1461, 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, 1472, 1473, 1474, 1475, 1476, 1477, 1478, 1479, 1480, 1481, 1482, 1483, 1484, 1485, 1486, 1487, 1488, 1489, 1490, 1491, 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, 1513, 1514, 1515, 1516, 1517, 1518, 1519, 1520, 1521, 1522, 1523, 1524, 1525, 1526, 1527, 1528, 1529, 1530, 1531, 1532, 1533, 1534, 1535, 1536, 1537, 1538, 1539, 1540, 1541, 1542, 1543, 1544, 1545, 1546, 1547, 1548, 1549, 1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, 1558, 1559, 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1568, 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1598, 1599, 1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637, 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1648, 1649, 1650, 1651, 1652, 1653, 1654, 1655, 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, 1666, 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, 1678, 1679, 1680, 1681, 1682, 1683, 1684, 1685, 1686, 1687, 1688, 1689, 1690, 1691, 1692, 1693, 1694, 1695, 1696, 1697, 1698, 1699, 1700, 1701, 1702, 1703, 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, 1720, 1721, 1722, 1723, 1724, 1725, 1726, 1727, 1728, 1729, 1730, 1731, 1732, 1733, 1734, 1735, 1736, 1737, 1738, 1740, 1741, 1743, 1744, 1745, 1746, 1747, 1748, 1749, 1750, 1751, 1752, 1754, 1755, 1756, 1757, 1758, 1759, 1760, 1761, 1762, 1763, 1764, 1765, 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, 1782, 1783, 1784, 1785, 1786, 1787, 1788, 1789, 1793, 1794, 1795, 1796, 1797, 1798, 1799, 1800, 1801, 1802, 1803, 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1811, 1812, 1813, 1814, 1815, 1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853, 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1865, 1866, 1867, 1869, 1871, 1872, 1874, 1875, 1876, 1877, 1878, 1879, 1880, 1881, 1882, 1883, 1884, 1885, 1886, 1891, 1894, 1896, 1898, 1899, 1902, 1903, 1905, 1908, 1909, 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1921, 1922, 1923, 1924, 1925, 1926, 1927, 1928, 1929, 1930, 1934, 1935, 1936, 1937, 1938, 1939, 1940, 1946, 1947, 1948, 1950, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1969, 1970, 1972, 1974, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2007, 2008, 2010, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2026, 2027, 2028, 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057, 2058, 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074, 2075, 2076, 2079, 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2096, 2097, 2098, 2099, 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, 2111, 2112, 2113, 2114, 2115, 2116, 2117, 2118, 2119, 2122, 2125, 2126, 2127, 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136, 2137, 2138, 2139, 2140, 2142, 2145, 2146, 2147, 2148, 2149, 2150, 2151, 2152, 2153, 2156, 2157, 2158, 2159, 2160, 2161, 2162, 2163, 2164, 2165, 2166, 2167, 2169, 2170, 2171, 2172, 2173, 2174, 2175, 2176, 2177, 2178, 2179, 2182, 2183, 2184, 2185, 2186, 2187, 2188, 2189, 2190, 2191, 2192, 2193, 2194, 2195, 2196, 2197, 2198, 2199, 2200, 2201, 2202, 2203, 2204, 2205, 2206, 2207, 2210, 2211, 2212, 2213, 2214, 2215, 2216, 2217, 2218, 2219, 2220, 2221, 2222, 2223, 2224, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2233, 2234, 2235, 2236, 2237, 2239, 2240, 2241, 2242, 2243, 2244, 2245, 2246, 2247, 2248, 2249, 2250, 2251, 2252, 2255, 2257, 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265, 2266, 2267, 2268, 2270, 2274, 2275, 2280, 2281, 2282, 2283, 2284, 2285, 2286, 2288, 2289, 2290, 2291, 2292, 2293, 2294, 2295, 2296, 2297, 2298, 2299, 2300, 2301, 2302, 2303, 2304, 2305, 2306, 2307, 2308, 2309, 2310, 2311, 2312, 2313, 2314, 2315, 2316, 2317, 2318, 2319, 2320, 2321, 2322, 2323, 2324, 2325, 2326, 2327]]

show the mesh with the cuted subparts in different colors

scene_list = list()
cuted_mesh = sub_meshes[-1]
joint_mesh = sub_meshes[0]
joint_tex = np.zeros((sub_meshes[0].vertices.shape[0],))
last_ind = sub_meshes[0].vertices.shape[0]
for ind, sub_mesh in enumerate(sub_meshes[1:]):
    sub_tex = np.ones((sub_mesh.vertices.shape[0],)) * (ind + 1)
    joint_mesh += sub_mesh
    joint_tex = np.hstack((joint_tex, sub_tex))
visb_sc3 = splt.visbrain_plot(
    mesh=joint_mesh, tex=joint_tex, caption="mesh parts shown in different colors"
)
ind = 0
boundaries = stop.mesh_boundary(cuted_mesh)
for bound in boundaries:
    s_rad = SourceObj(
        "rad",
        cuted_mesh.vertices[bound],
        color=cols[ind],
        symbol="square",
        radius_min=10,
    )
    visb_sc3.add_to_subplot(s_rad)
    lines = Line(pos=cuted_mesh.vertices[bound], color=cols[ind], width=10)
    # wrap the vispy object using visbrain
    l_obj = VispyObj("line", lines)
    visb_sc3.add_to_subplot(l_obj)
    ind += 1
    if ind == len(cols):
        ind = 0

visb_sc3.preview()
example topology

show the largest submesh with the boundaries of cutted parts

visb_sc4 = splt.visbrain_plot(mesh=cuted_mesh, caption="open mesh")
# create points with vispy
for bound in boundaries:
    points = cuted_mesh.vertices[bound]
    s_rad = SourceObj("rad", points, color="blue", symbol="square", radius_min=10)
    visb_sc4.add_to_subplot(s_rad)
    lines = Line(pos=cuted_mesh.vertices[bound], width=10, color="r")
    # wrap the vispy object using visbrain
    l_obj = VispyObj("line", lines)
    visb_sc4.add_to_subplot(l_obj)
visb_sc4.preview()
example topology

================= close_mesh ================= close the largest submesh

mesh_closed, nb_verts_added = stop.close_mesh(cuted_mesh)

# The closed mesh is watertight while before closing if was not
print(mesh.is_watertight)
print(mesh_closed.is_watertight)

Out:

True
True

show the closed mesh

visb_sc5 = splt.visbrain_plot(mesh=mesh_closed, caption="closed mesh")
visb_sc5.preview()
example topology

Total running time of the script: ( 0 minutes 4.424 seconds)

Gallery generated by Sphinx-Gallery