topologicpy 0.8.59__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/BVH.py +478 -211
- topologicpy/Cell.py +5 -2
- topologicpy/Dictionary.py +17 -6
- topologicpy/Face.py +23 -50
- topologicpy/Graph.py +660 -42
- topologicpy/Kuzu.py +1 -1
- topologicpy/Shell.py +50 -14
- topologicpy/Topology.py +138 -108
- topologicpy/Vertex.py +333 -99
- topologicpy/version.py +1 -1
- {topologicpy-0.8.59.dist-info → topologicpy-0.8.71.dist-info}/METADATA +1 -1
- {topologicpy-0.8.59.dist-info → topologicpy-0.8.71.dist-info}/RECORD +15 -15
- {topologicpy-0.8.59.dist-info → topologicpy-0.8.71.dist-info}/WHEEL +0 -0
- {topologicpy-0.8.59.dist-info → topologicpy-0.8.71.dist-info}/licenses/LICENSE +0 -0
- {topologicpy-0.8.59.dist-info → topologicpy-0.8.71.dist-info}/top_level.txt +0 -0
topologicpy/Vertex.py
CHANGED
@@ -750,17 +750,8 @@ class Vertex():
|
|
750
750
|
|
751
751
|
"""
|
752
752
|
from topologicpy.Topology import Topology
|
753
|
-
|
754
|
-
|
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(
|
775
|
-
|
776
|
-
|
777
|
-
|
778
|
-
|
779
|
-
|
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(
|
1141
|
-
|
1142
|
-
|
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
|
-
|
1151
|
-
The
|
1152
|
-
|
1153
|
-
|
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
|
-
|
1162
|
-
from topologicpy.
|
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.
|
1167
|
-
import
|
1168
|
-
|
1169
|
-
|
1170
|
-
|
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
|
-
|
1185
|
-
|
1186
|
-
|
1187
|
-
|
1188
|
-
|
1189
|
-
|
1190
|
-
|
1191
|
-
|
1192
|
-
|
1193
|
-
|
1194
|
-
|
1195
|
-
|
1196
|
-
|
1197
|
-
|
1198
|
-
|
1199
|
-
|
1200
|
-
|
1201
|
-
|
1202
|
-
|
1203
|
-
|
1204
|
-
if
|
1205
|
-
return
|
1206
|
-
|
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
|
-
|
1209
|
-
|
1210
|
-
|
1211
|
-
|
1212
|
-
|
1213
|
-
|
1214
|
-
|
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
|
-
|
1218
|
-
|
1219
|
-
|
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
|
-
|
1222
|
-
|
1223
|
-
|
1224
|
-
|
1225
|
-
|
1226
|
-
|
1227
|
-
|
1228
|
-
|
1229
|
-
|
1230
|
-
|
1231
|
-
|
1232
|
-
|
1233
|
-
|
1234
|
-
|
1235
|
-
|
1236
|
-
|
1237
|
-
|
1238
|
-
|
1239
|
-
|
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.
|
1
|
+
__version__ = '0.8.71'
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: topologicpy
|
3
|
-
Version: 0.8.
|
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,39 +1,39 @@
|
|
1
1
|
topologicpy/ANN.py,sha256=gpflv4lFypOW789vO7mSkMLaMF_ZftVOCqCvtGr6-JA,47873
|
2
2
|
topologicpy/Aperture.py,sha256=wNn5miB_IrGCBYuQ18HXQYRva20dUC3id4AJCulL7to,2723
|
3
|
-
topologicpy/BVH.py,sha256=
|
3
|
+
topologicpy/BVH.py,sha256=ts0Ru24ILjjfHa54SYNhMc8Jkyxwej1DV0Jv7P_6BoU,22513
|
4
4
|
topologicpy/CSG.py,sha256=09la1-xzS9vr-WnV7tpJ0I-mkZ-XY0MRSd5iB50Nfgw,15556
|
5
|
-
topologicpy/Cell.py,sha256=
|
5
|
+
topologicpy/Cell.py,sha256=xkt9lfutgSwr_1lah1U5n48UnrLIggznNKUmEe2FA2g,177505
|
6
6
|
topologicpy/CellComplex.py,sha256=Kbz63rGeE08bJfMXFvB-AptoKHiaCK5OtiV1wz8Y-Fk,68081
|
7
7
|
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=
|
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=
|
15
|
-
topologicpy/Graph.py,sha256=
|
14
|
+
topologicpy/Face.py,sha256=aIo955DwDwPD829ezIxKcWRktOncD3VuSXXAeTXxXcs,201122
|
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
|
18
18
|
topologicpy/Honeybee.py,sha256=DzaG9wpkJdcDWcjOGXhuN5X0gCqypmZGBa1y5E2MkjU,48964
|
19
|
-
topologicpy/Kuzu.py,sha256=
|
19
|
+
topologicpy/Kuzu.py,sha256=fxaDPWM5Xam7Tot0olPZsazS_7xgE_Vo-jf0Sbv3VZE,36298
|
20
20
|
topologicpy/Matrix.py,sha256=bOofT34G3YHu9aMIWx60YHAJga4R0GbDjsZBUD4Hu_k,22706
|
21
21
|
topologicpy/Neo4j.py,sha256=J8jU_mr5-mWC0Lg_D2dMjMlx1rY_eh8ks_aubUuTdWw,22319
|
22
22
|
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=
|
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=
|
29
|
+
topologicpy/Topology.py,sha256=9reHlXzUXYbXt0FJbThL3Wr0JEF2oAHuNRerU2BshxM,473587
|
30
30
|
topologicpy/Vector.py,sha256=pEC8YY3TeHGfGdeNgvdHjgMDwxGabp5aWjwYC1HSvMk,42236
|
31
|
-
topologicpy/Vertex.py,sha256=
|
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=
|
35
|
-
topologicpy-0.8.
|
36
|
-
topologicpy-0.8.
|
37
|
-
topologicpy-0.8.
|
38
|
-
topologicpy-0.8.
|
39
|
-
topologicpy-0.8.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|