topologicpy 0.8.61__py3-none-any.whl → 0.8.71__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
topologicpy/Vertex.py CHANGED
@@ -750,17 +750,8 @@ class Vertex():
750
750
 
751
751
  """
752
752
  from topologicpy.Topology import Topology
753
-
754
- def boundingBox(cell):
755
- vertices = Topology.Vertices(cell)
756
- x = []
757
- y = []
758
- z = []
759
- for aVertex in vertices:
760
- x.append(Vertex.X(aVertex, mantissa=mantissa))
761
- y.append(Vertex.Y(aVertex, mantissa=mantissa))
762
- z.append(Vertex.Z(aVertex, mantissa=mantissa))
763
- return ([min(x), min(y), min(z), max(x), max(y), max(z)])
753
+ from topologicpy.Cell import Cell
754
+ from topologicpy.BVH import BVH
764
755
 
765
756
  if Topology.IsInstance(topology, "Cell"):
766
757
  cells = [topology]
@@ -770,15 +761,17 @@ class Vertex():
770
761
  return None
771
762
  if len(cells) < 1:
772
763
  return None
764
+
765
+ bvh = BVH.ByTopologies(cells, tolerance=tolerance, silent=True)
766
+ candidates = BVH.Clashes(bvh, vertex, tolerance=tolerance)
767
+ print("Vertex.EnclosingCells - candidates:", candidates)
773
768
  enclosingCells = []
774
- for i in range(len(cells)):
775
- bbox = boundingBox(cells[i])
776
- if ((Vertex.X(vertex, mantissa=mantissa) < bbox[0]) or (Vertex.Y(vertex, mantissa=mantissa) < bbox[1]) or (Vertex.Z(vertex, mantissa=mantissa) < bbox[2]) or (Vertex.X(vertex, mantissa=mantissa) > bbox[3]) or (Vertex.Y(vertex, mantissa=mantissa) > bbox[4]) or (Vertex.Z(vertex, mantissa=mantissa) > bbox[5])) == False:
777
- if Vertex.IsInternal(vertex, cells[i], tolerance=tolerance):
778
- if exclusive:
779
- return([cells[i]])
780
- else:
781
- enclosingCells.append(cells[i])
769
+ for i in range(len(candidates)):
770
+ if Vertex.IsInternal(vertex, candidates[i], tolerance=tolerance):
771
+ if exclusive:
772
+ return([candidates[i]])
773
+ else:
774
+ enclosingCells.append(candidates[i])
782
775
  return enclosingCells
783
776
 
784
777
  @staticmethod
@@ -1137,9 +1130,27 @@ class Vertex():
1137
1130
  return not (Vertex.IsPeripheral(vertex, topology, tolerance=tolerance, silent=silent) or Vertex.IsInternal(vertex, topology, tolerance=tolerance, silent=silent))
1138
1131
 
1139
1132
  @staticmethod
1140
- def IsInternal(vertex, topology, tolerance: float = 0.0001, silent: bool = False) -> bool:
1141
- """
1142
- Returns True if the input vertex is inside the input topology. Returns False otherwise.
1133
+ def IsInternal(
1134
+ vertex,
1135
+ topology,
1136
+ maxLeafSize: int = 4,
1137
+ identify: bool = False,
1138
+ tolerance: float = 0.0006,
1139
+ silent: bool = True,
1140
+ ) -> bool:
1141
+ """
1142
+ Returns True if `vertex` lies inside (or on the boundary of) `topology`.
1143
+
1144
+ Broad-phase:
1145
+ - Build a BVH over Cells (3D) or Faces (2D) using BVH.ByTopologies.
1146
+ - Query via BVH.Clashes(bvh, vertex) to get only nearby primitives.
1147
+
1148
+ Narrow-phase (geometric, no Topology.IsInternal):
1149
+ - Boundary snap: if Vertex.Distance(vertex, primitive) <= tolerance -> inside.
1150
+ - 3D: Cast a ray (+X direction). For each candidate Cell, intersect the ray with its Faces.
1151
+ For each intersected Face: project face polygon(s) to 2D (dominant-axis drop) and
1152
+ test point-in-polygon (outer minus holes). Odd number of valid intersections => inside.
1153
+ - 2D: Project the Face loops to 2D and do point-in-polygon (outer minus holes).
1143
1154
 
1144
1155
  Parameters
1145
1156
  ----------
@@ -1147,97 +1158,320 @@ class Vertex():
1147
1158
  The input vertex.
1148
1159
  topology : topologic_core.Topology
1149
1160
  The input topology.
1150
- tolerance : float , optional
1151
- The tolerance for computing if the input vertex is internal to the input topology. Default is 0.0001.
1152
- silent : bool , optional
1153
- If set to True, error and warning messages are suppressed. Default is False.
1161
+ maxLeafSize: int , optional
1162
+ The maximum number of primitives (topologies) that can be stored in a single leaf node of the BVH.
1163
+ Smaller values result in deeper trees with finer spatial subdivision (potentially faster queries but slower build times),
1164
+ while larger values produce shallower trees with coarser spatial grouping (faster builds but less precise queries).
1165
+ Default is 4.
1166
+ identify: bool, optional
1167
+ If set to True, a tuple is returned where the identified subTopology is returned (e.g. (True, edge)). Default is False.
1168
+ tolerance : float, optional
1169
+ Distance and numeric tolerance. Default 1e-7.
1170
+ silent : bool, optional
1171
+ Suppress non-critical prints.
1154
1172
 
1155
1173
  Returns
1156
1174
  -------
1157
1175
  bool
1158
- True if the input vertex is internal to the input topology. False otherwise.
1159
-
1160
1176
  """
1161
- from topologicpy.Edge import Edge
1162
- from topologicpy.Wire import Wire
1177
+ # --- Local imports (TopologicPy) ---
1178
+ from topologicpy.Topology import Topology
1179
+ from topologicpy.Vertex import Vertex
1163
1180
  from topologicpy.Face import Face
1181
+ from topologicpy.Cell import Cell
1182
+ from topologicpy.Shell import Shell
1164
1183
  from topologicpy.CellComplex import CellComplex
1165
1184
  from topologicpy.Cluster import Cluster
1166
- from topologicpy.Topology import Topology
1167
- import inspect
1168
-
1169
- if not Topology.IsInstance(vertex, "Vertex"):
1170
- if not silent:
1171
- print("Vertex.IsInternal - Error: The input vertex parameter is not a valid vertex. Returning None.", vertex, topology)
1172
- curframe = inspect.currentframe()
1173
- calframe = inspect.getouterframes(curframe, 2)
1174
- print('caller name:', calframe[1][3])
1175
- return None
1176
- if not Topology.IsInstance(topology, "Topology"):
1177
- if not silent:
1178
- print("Vertex.IsInternal - Error: The input topology parameter is not a valid topology. Returning None.")
1179
- curframe = inspect.currentframe()
1180
- calframe = inspect.getouterframes(curframe, 2)
1181
- print('caller name:', calframe[1][3])
1182
- return None
1185
+ from topologicpy.Wire import Wire
1186
+ from topologicpy.Edge import Edge
1187
+ from topologicpy.BVH import BVH
1188
+ from topologicpy.BVH import AABB
1189
+ from topologicpy.Helper import Helper
1183
1190
 
1184
- if Topology.IsInstance(topology, "Vertex"):
1185
- return Vertex.Distance(vertex, topology) <= tolerance
1186
- elif Topology.IsInstance(topology, "Edge"):
1187
- try:
1188
- parameter = Edge.ParameterAtVertex(topology, vertex)
1189
- except:
1190
- parameter = 400 #arbitrary large number greater than 1
1191
- if parameter == None:
1192
- return False
1193
- return 0 <= parameter <= 1
1194
- elif Topology.IsInstance(topology, "Wire"):
1195
- vertices = [v for v in Topology.Vertices(topology) if Vertex.Degree(v, topology) > 1]
1196
- edges = Wire.Edges(topology)
1197
- sub_list = vertices + edges
1198
- for sub in sub_list:
1199
- if Vertex.IsInternal(vertex, sub, tolerance=tolerance, silent=silent):
1200
- return True
1201
- return False
1202
- elif Topology.IsInstance(topology, "Face"):
1203
- # Test the distance first
1204
- if Vertex.PerpendicularDistance(vertex, topology) > tolerance:
1205
- return False
1206
- if Vertex.IsPeripheral(vertex, topology):
1191
+ # --------------------------
1192
+ # Utilities
1193
+ # --------------------------
1194
+ def v_coords(v):
1195
+ return Vertex.X(v), Vertex.Y(v), Vertex.Z(v)
1196
+
1197
+ def vec_sub(a, b):
1198
+ return (a[0]-b[0], a[1]-b[1], a[2]-b[2])
1199
+
1200
+ def vec_dot(a, b):
1201
+ return a[0]*b[0] + a[1]*b[1] + a[2]*b[2]
1202
+
1203
+ def vec_cross(a, b):
1204
+ return (a[1]*b[2]-a[2]*b[1], a[2]*b[0]-a[0]*b[2], a[0]*b[1]-a[1]*b[0])
1205
+
1206
+ def vec_len(a):
1207
+ return (a[0]*a[0]+a[1]*a[1]+a[2]*a[2])**0.5
1208
+
1209
+ def vec_norm(a):
1210
+ l = vec_len(a)
1211
+ if l == 0:
1212
+ return (0.0, 0.0, 0.0)
1213
+ return (a[0]/l, a[1]/l, a[2]/l)
1214
+
1215
+ # Plane from 3 points
1216
+ def face_plane(face):
1217
+ # Returns (n, d) where plane: n·X + d = 0; n is unit normal.
1218
+ # Use first 3 distinct points of the external boundary.
1219
+ w_ext = Face.ExternalBoundary(face)
1220
+ verts = Wire.Vertices(w_ext)
1221
+ pts = [v_coords(v) for v in verts]
1222
+ # Find non-collinear triplet
1223
+ p0 = pts[0]
1224
+ n = None
1225
+ for i in range(1, len(pts)-1):
1226
+ v1 = vec_sub(pts[i], p0)
1227
+ v2 = vec_sub(pts[i+1], p0)
1228
+ n_try = vec_cross(v1, v2)
1229
+ if vec_len(n_try) > 1e-15:
1230
+ n = vec_norm(n_try)
1231
+ break
1232
+ if n is None:
1233
+ # Degenerate face; assign arbitrary normal
1234
+ n = (1.0, 0.0, 0.0)
1235
+ d = -vec_dot(n, p0)
1236
+ return n, d
1237
+
1238
+ def dominant_axis(n):
1239
+ # Return axis to drop when projecting to 2D (index 0=x,1=y,2=z)
1240
+ ax = abs(n[0]); ay = abs(n[1]); az = abs(n[2])
1241
+ if ax >= ay and ax >= az:
1242
+ return 0
1243
+ if ay >= ax and ay >= az:
1244
+ return 1
1245
+ return 2
1246
+
1247
+ def project_point(p, drop_axis):
1248
+ if drop_axis == 0:
1249
+ return (p[1], p[2])
1250
+ elif drop_axis == 1:
1251
+ return (p[0], p[2])
1252
+ else:
1253
+ return (p[0], p[1])
1254
+
1255
+ def ray_plane_intersection(orig, dirv, n, d):
1256
+ # Solve n·(orig + t*dir) + d = 0 -> t = -(n·orig + d) / (n·dir)
1257
+ ndotdir = vec_dot(n, dirv)
1258
+ if abs(ndotdir) < 1e-15:
1259
+ return None # parallel
1260
+ t = -(vec_dot(n, orig) + d) / ndotdir
1261
+ return t
1262
+
1263
+ # 2D point-in-polygon (ray crossing). Polygon is list of 2D points (closed or open).
1264
+ def pip_ray_cross_2d(pt, poly):
1265
+ x, y = pt
1266
+ inside = False
1267
+ n = len(poly)
1268
+ if n < 3:
1207
1269
  return False
1208
- normal = Face.Normal(topology)
1209
- proj_v = Vertex.Project(vertex, topology)
1210
- v1 = Topology.TranslateByDirectionDistance(proj_v, normal, 1)
1211
- v2 = Topology.TranslateByDirectionDistance(proj_v, normal, -1)
1212
- edge = Edge.ByVertices(v1, v2)
1213
- intersect = edge.Intersect(topology)
1214
- if intersect == None:
1270
+ for i in range(n):
1271
+ x1, y1 = poly[i]
1272
+ x2, y2 = poly[(i+1) % n]
1273
+ # Check if point is on edge (within tolerance)
1274
+ # Project distance to segment
1275
+ # (cheap check first)
1276
+ minx = min(x1, x2) - 1e-15
1277
+ maxx = max(x1, x2) + 1e-15
1278
+ miny = min(y1, y2) - 1e-15
1279
+ maxy = max(y1, y2) + 1e-15
1280
+ if minx <= x <= maxx and miny <= y <= maxy:
1281
+ # Cross product close to zero?
1282
+ dx1, dy1 = x - x1, y - y1
1283
+ dx2, dy2 = x2 - x1, y2 - y1
1284
+ cross = dx1 * dy2 - dy1 * dx2
1285
+ if abs(cross) <= 1e-12:
1286
+ return True # on boundary
1287
+ # Ray crossing
1288
+ cond1 = (y1 > y) != (y2 > y)
1289
+ if cond1:
1290
+ xinters = (x2 - x1) * (y - y1) / (y2 - y1 + 1e-300) + x1
1291
+ if x <= xinters + 1e-15:
1292
+ inside = not inside
1293
+ return inside
1294
+
1295
+ def polygon_with_holes_contains_2d(pt, outer, holes):
1296
+ if not pip_ray_cross_2d(pt, outer):
1215
1297
  return False
1298
+ for hole in holes:
1299
+ if pip_ray_cross_2d(pt, hole):
1300
+ return False
1216
1301
  return True
1217
- elif Topology.IsInstance(topology, "Shell"):
1218
- if Vertex.IsPeripheral(vertex, topology, tolerance=tolerance, silent=silent):
1219
- return False
1302
+
1303
+ def face_loops_2d(face, drop_axis):
1304
+ # Returns (outer2d, [hole2d,...])
1305
+ w_ext = Face.ExternalBoundary(face)
1306
+ outer_vs = Wire.Vertices(w_ext)
1307
+ outer = [project_point(v_coords(v), drop_axis) for v in outer_vs]
1308
+
1309
+ holes_2d = []
1310
+ try:
1311
+ inner_wires = Face.InternalBoundaries(face) or []
1312
+ except Exception:
1313
+ inner_wires = []
1314
+ for w in inner_wires:
1315
+ vs = Wire.Vertices(w)
1316
+ holes_2d.append([project_point(v_coords(v), drop_axis) for v in vs])
1317
+ return outer, holes_2d
1318
+
1319
+ # Ray casting against one face; returns hit-point (3D) if the ray hits inside the face.
1320
+ def ray_hits_face(orig, dirv, face, tol=1e-12):
1321
+ n, d = face_plane(face)
1322
+ t = ray_plane_intersection(orig, dirv, n, d)
1323
+ if t is None or t < -tol:
1324
+ return None # behind or parallel
1325
+ # Intersection point
1326
+ ip = (orig[0] + t*dirv[0], orig[1] + t*dirv[1], orig[2] + t*dirv[2])
1327
+ # Project to 2D in face's dominant plane and do PIP against loops
1328
+ ax = dominant_axis(n)
1329
+ outer2d, holes2d = face_loops_2d(face, ax)
1330
+ ip2d = project_point(ip, ax)
1331
+ if polygon_with_holes_contains_2d(ip2d, outer2d, holes2d):
1332
+ return ip
1333
+ return None
1334
+
1335
+ # 2D containment in an Edge
1336
+ def point_in_vertex(vtx, vertex, tol):
1337
+ # Boundary snap first
1338
+ if Vertex.Distance(vtx, vertex) <= tol:
1339
+ return True
1340
+ return False
1341
+
1342
+ # 2D containment in an Edge
1343
+ def point_in_edge(vtx, edge, tol):
1344
+ # Boundary snap first
1345
+ if Vertex.Distance(vtx, edge) <= tol:
1346
+ return True
1347
+ return False
1348
+
1349
+ # 2D containment in a Face (vertex assumed coplanar or nearly so)
1350
+ def point_in_face(vtx, face, tol):
1351
+ status = topologic.FaceUtility.IsInside(face, vtx, tol)
1352
+ return status
1353
+
1354
+ # 3D containment in a Cell via ray casting (+X direction)
1355
+ def point_in_cell(vtx, cell, tol):
1356
+ status = Cell.ContainmentStatus(cell, vtx, tolerance = tol)
1357
+ return status == 0
1358
+
1359
+ # --------------------------
1360
+ # Check if inside AABB
1361
+ # --------------------------
1362
+ points = [Vertex.Coordinates(v) for v in Topology.Vertices(topology)]
1363
+ aabb = AABB.from_points(points)
1364
+ if not aabb.contains_point(Vertex.Coordinates(vertex)):
1365
+ return False
1366
+
1367
+ # --------------------------
1368
+ # Collect primitives
1369
+ # --------------------------
1370
+ def collect_cells(topo):
1371
+ if Topology.IsInstance(topo, "cell"):
1372
+ return [topo]
1220
1373
  else:
1221
- edges = Topology.Edges(topology)
1222
- for edge in edges:
1223
- if Vertex.IsInternal(vertex, edge, tolerance=tolerance, silent=silent):
1224
- return True
1225
- faces = Topology.Faces(topology)
1226
- for face in faces:
1227
- if Vertex.IsInternal(vertex, face, tolerance=tolerance, silent=silent):
1228
- return True
1229
- return False
1230
- elif Topology.IsInstance(topology, "Cell"):
1231
- return topologic.CellUtility.Contains(topology, vertex, tolerance) == 0 # Hook to Core
1232
- elif Topology.IsInstance(topology, "CellComplex"):
1233
- ext_boundary = CellComplex.ExternalBoundary(topology)
1234
- return Vertex.IsInternal(vertex, ext_boundary, tolerance=tolerance, silent=silent)
1235
- elif Topology.IsInstance(topology, "Cluster"):
1236
- sub_list = Cluster.FreeTopologies(topology)
1237
- for sub in sub_list:
1238
- if Vertex.IsInternal(vertex, sub, tolerance=tolerance, silent=silent):
1239
- return True
1374
+ return Topology.Cells(topo)
1375
+
1376
+ def collect_faces(topo):
1377
+ if Topology.IsInstance(topo, "face"):
1378
+ return [topo]
1379
+ else:
1380
+ return Topology.Faces(topo)
1381
+
1382
+ def collect_edges(topo):
1383
+ if Topology.IsInstance(topo, "edge"):
1384
+ return [topo]
1385
+ else:
1386
+ return Topology.Edges(topo)
1387
+ def collect_vertices(topo):
1388
+ if Topology.IsInstance(topo, "vertex"):
1389
+ return [topo]
1390
+ else:
1391
+ return Topology.Vertices(topo)
1392
+
1393
+ if Topology.IsInstance(topology, "cluster"):
1394
+ cells = collect_cells(topology)
1395
+ faces = collect_faces(topology)
1396
+ edges = collect_edges(topology)
1397
+ vertices = collect_vertices(topology)
1398
+ else:
1399
+ cells = collect_cells(topology)
1400
+ faces = [] if cells else collect_faces(topology)
1401
+ edges = [] if faces else collect_edges(topology)
1402
+ vertices = [] if edges else collect_vertices(topology)
1403
+ if not cells and not faces and not edges and not vertices:
1240
1404
  return False
1405
+
1406
+ # --------------------------
1407
+ # Build BVH and fetch candidates
1408
+ # --------------------------
1409
+ primitives = []
1410
+ primitives.extend(vertices)
1411
+ primitives.extend(edges)
1412
+ primitives.extend(faces)
1413
+ primitives.extend(cells)
1414
+ bvh = BVH.ByTopologies(primitives, maxLeafSize=maxLeafSize, tolerance=tolerance, silent=True)
1415
+ try:
1416
+ candidates = BVH.Clashes(bvh, vertex, tolernace=tolerance) or []
1417
+ except Exception:
1418
+ # Fallback if your BVH needs a non-degenerate query
1419
+ candidates = primitives
1420
+
1421
+ if not candidates:
1422
+ return False
1423
+
1424
+ # sort by types so that priority is given to lower dimensional types (e.g. vertices, then edges, then faces, then cells)
1425
+ types = [Topology.Type(c) for c in candidates]
1426
+ candidates = Helper.Sort(candidates, types)
1427
+ # --------------------------
1428
+ # Narrow phase
1429
+ # --------------------------
1430
+ for c in candidates:
1431
+ if Topology.IsInstance(c, "cell"):
1432
+ # Exact geometric test
1433
+ try:
1434
+ if point_in_cell(vertex, c, tolerance):
1435
+ if identify:
1436
+ return (True, c)
1437
+ else:
1438
+ return True
1439
+ except Exception:
1440
+ if not silent:
1441
+ print("Warning: point_in_cell failed on a candidate.")
1442
+ elif Topology.IsInstance(c, "face"):
1443
+ try:
1444
+ if point_in_face(vertex, c, tolerance):
1445
+ if identify:
1446
+ return (True, c)
1447
+ else:
1448
+ return True
1449
+ return True
1450
+ except Exception:
1451
+ if not silent:
1452
+ print("Warning: point_in_face failed on a candidate.")
1453
+ elif Topology.IsInstance(c, "edge"):
1454
+ try:
1455
+ if point_in_edge(vertex, c, tolerance):
1456
+ if identify:
1457
+ return (True, c)
1458
+ else:
1459
+ return True
1460
+ except Exception:
1461
+ if not silent:
1462
+ print("Warning: point_in_edge failed on a candidate.")
1463
+ elif Topology.IsInstance(c, "vertex"):
1464
+ try:
1465
+ if point_in_vertex(vertex, c, tolerance):
1466
+ if identify:
1467
+ return (True, c)
1468
+ else:
1469
+ return True
1470
+ except Exception:
1471
+ if not silent:
1472
+ print("Warning: point_in_vertex failed on a candidate.")
1473
+ if identify:
1474
+ return (False, None)
1241
1475
  return False
1242
1476
 
1243
1477
  @staticmethod
topologicpy/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = '0.8.61'
1
+ __version__ = '0.8.71'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: topologicpy
3
- Version: 0.8.61
3
+ Version: 0.8.71
4
4
  Summary: An AI-Powered Spatial Modelling and Analysis Software Library for Architecture, Engineering, and Construction.
5
5
  Author-email: Wassim Jabi <wassim.jabi@gmail.com>
6
6
  License: AGPL v3 License
@@ -1,6 +1,6 @@
1
1
  topologicpy/ANN.py,sha256=gpflv4lFypOW789vO7mSkMLaMF_ZftVOCqCvtGr6-JA,47873
2
2
  topologicpy/Aperture.py,sha256=wNn5miB_IrGCBYuQ18HXQYRva20dUC3id4AJCulL7to,2723
3
- topologicpy/BVH.py,sha256=JA4bb-9hgMfVZ_syzmSmTL3ueCq-0vMUGMPZxNcawAY,13023
3
+ topologicpy/BVH.py,sha256=ts0Ru24ILjjfHa54SYNhMc8Jkyxwej1DV0Jv7P_6BoU,22513
4
4
  topologicpy/CSG.py,sha256=09la1-xzS9vr-WnV7tpJ0I-mkZ-XY0MRSd5iB50Nfgw,15556
5
5
  topologicpy/Cell.py,sha256=xkt9lfutgSwr_1lah1U5n48UnrLIggznNKUmEe2FA2g,177505
6
6
  topologicpy/CellComplex.py,sha256=Kbz63rGeE08bJfMXFvB-AptoKHiaCK5OtiV1wz8Y-Fk,68081
@@ -8,10 +8,10 @@ topologicpy/Cluster.py,sha256=G49AuhJHQ1s819cB5MtVdmAGgkag19IC3dRP1ub1Wh4,58608
8
8
  topologicpy/Color.py,sha256=hzSmgBWhiuYc55RSipkQNIgGtgyhC5BqY8AakNYEK-U,24486
9
9
  topologicpy/Context.py,sha256=G3CwMvN8Jw2rnQRwB-n4MaQq_wLS0vPimbXKwsdMJ80,3055
10
10
  topologicpy/DGL.py,sha256=O7r22ss0tgak4kWaACkyExhR_rZ46O_bqIBpxAcwJkw,138918
11
- topologicpy/Dictionary.py,sha256=Z4YQ88tONWd-0X0dENQ8IZqIOa9mbBqhJkTBsHmft2g,44619
11
+ topologicpy/Dictionary.py,sha256=goODXIM6AoC5Qn_d8LGc5pRoxZKgIWbkn3IOEbsQ4c4,44999
12
12
  topologicpy/Edge.py,sha256=DifItuyabFDUFC7CVMlt2DeMFMNaGOqCg43iU9CPP0A,74029
13
13
  topologicpy/EnergyModel.py,sha256=hB1aiJe45gdDMFm1AhkBr-1djjtXSzn24iRpQMk43-4,57749
14
- topologicpy/Face.py,sha256=aX9EcR3JGbLITElhd25J0Z8m9U8KkmbYivGg3oZN-Uw,202296
14
+ topologicpy/Face.py,sha256=aIo955DwDwPD829ezIxKcWRktOncD3VuSXXAeTXxXcs,201122
15
15
  topologicpy/Graph.py,sha256=ytXl9VLj243o9LhY0A8P_gp4_Ce_VrHW5oaC2WK6Mbc,782718
16
16
  topologicpy/Grid.py,sha256=3OsBMyHh4w8gpFOTMKHMNTpo62V0CwRNu5cwm87yDUA,18421
17
17
  topologicpy/Helper.py,sha256=Nr6pyzl0sZm4Cu11wOqoYKu6yYal5N6A9jErXnaZBJc,31765
@@ -23,17 +23,17 @@ topologicpy/Plotly.py,sha256=OQvCzAXqu_QYn8iY0rjc8ZB4XwwK70pWjnnoMzDdcc0,123167
23
23
  topologicpy/Polyskel.py,sha256=oVfM4lqSMPTjnkHfsRU9VI8Blt6Vf0LVPkD9ebz7Wmw,27082
24
24
  topologicpy/PyG.py,sha256=wOsoBFxMgwZYWjj86OMkz_PJuQ02locV_djhSDD6dVc,109644
25
25
  topologicpy/ShapeGrammar.py,sha256=KYsKDLXWdflAcYMAIz84AUF-GMkbTmaBDd2-ovbilqU,23336
26
- topologicpy/Shell.py,sha256=ioO4raCJfXtYldQg-adpcLVeJPEA6od6cAA5ro7t6r4,96792
26
+ topologicpy/Shell.py,sha256=JBTw3T1CjJt3ZPTjG1eBU2Oe2n_helW9ioML_bYK2_U,98545
27
27
  topologicpy/Speckle.py,sha256=-eiTqJugd7pHiHpD3pDUcDO6CGhVyPV14HFRzaqEoaw,18187
28
28
  topologicpy/Sun.py,sha256=8S6dhCKfOhUGVny-jEk87Q08anLYMB1JEBKRGCklvbQ,36670
29
- topologicpy/Topology.py,sha256=O3K4B47K0ic4jMj4OC9ZuqDPV6I7QRZ6r7Q9SHPEqaI,474206
29
+ topologicpy/Topology.py,sha256=9reHlXzUXYbXt0FJbThL3Wr0JEF2oAHuNRerU2BshxM,473587
30
30
  topologicpy/Vector.py,sha256=pEC8YY3TeHGfGdeNgvdHjgMDwxGabp5aWjwYC1HSvMk,42236
31
- topologicpy/Vertex.py,sha256=r_3cicgpino96ymm1ANptfOuqE59b99YWwksxyPOYK4,85914
31
+ topologicpy/Vertex.py,sha256=eO74ZcuQUmiEHy5-Xyn7YDlt3R7YKoqB-BEwF-TUcDM,94101
32
32
  topologicpy/Wire.py,sha256=gjgQUGHdBdXUIijgZc_VIW0E39w-smaVhhdl0jF63fQ,230466
33
33
  topologicpy/__init__.py,sha256=RMftibjgAnHB1vdL-muo71RwMS4972JCxHuRHOlU428,928
34
- topologicpy/version.py,sha256=v9RYfeFVriaSopTI1WMyzj0QSU9vvxnXtU_efzx9Iek,23
35
- topologicpy-0.8.61.dist-info/licenses/LICENSE,sha256=FK0vJ73LuE8PYJAn7LutsReWR47-Ooovw2dnRe5yV6Q,681
36
- topologicpy-0.8.61.dist-info/METADATA,sha256=AUdc_jfqI7o0MlB6Izlr_BIUcpjbN71DLKCHBY1UYsA,10535
37
- topologicpy-0.8.61.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
38
- topologicpy-0.8.61.dist-info/top_level.txt,sha256=J30bDzW92Ob7hw3zA8V34Jlp-vvsfIkGzkr8sqvb4Uw,12
39
- topologicpy-0.8.61.dist-info/RECORD,,
34
+ topologicpy/version.py,sha256=49ezdJH-CaZn_7E1pYgol2MJ6KVA4JWjsEILF4g69nI,23
35
+ topologicpy-0.8.71.dist-info/licenses/LICENSE,sha256=FK0vJ73LuE8PYJAn7LutsReWR47-Ooovw2dnRe5yV6Q,681
36
+ topologicpy-0.8.71.dist-info/METADATA,sha256=eJ0CeTYd_RvHdNXNjmyK1IRQzZqzuEDmqSuwbdLAGEY,10535
37
+ topologicpy-0.8.71.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
38
+ topologicpy-0.8.71.dist-info/top_level.txt,sha256=J30bDzW92Ob7hw3zA8V34Jlp-vvsfIkGzkr8sqvb4Uw,12
39
+ topologicpy-0.8.71.dist-info/RECORD,,