topologicpy 0.8.14__py3-none-any.whl → 0.8.15__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/Cell.py CHANGED
@@ -1909,7 +1909,7 @@ class Cell():
1909
1909
  uRect = Wire.Rectangle(origin=origin, width=height*1.2, length=length*1.2, direction=[1, 0, 0], placement="center")
1910
1910
  for i in range(1, uSides):
1911
1911
  sliceFaces.append(Topology.Translate(Face.ByWire(uRect, tolerance=tolerance), width/uSides*i - width*0.5, 0, 0))
1912
- vRect = Wire.Rectangle(origin=origin, width=height*1.2, length=width*1.2, direction=[0, 1, 0], placement="center")
1912
+ vRect = Wire.Rectangle(origin=origin, length=height*1.2, width=width*1.2, direction=[0, 1, 0], placement="center")
1913
1913
  for i in range(1, vSides):
1914
1914
  sliceFaces.append(Topology.Translate(Face.ByWire(vRect, tolerance=tolerance), 0, length/vSides*i - length*0.5, 0))
1915
1915
  if len(sliceFaces) > 0:
topologicpy/Matrix.py CHANGED
@@ -47,6 +47,83 @@ class Matrix:
47
47
  matC.append(tempRow)
48
48
  return matC
49
49
 
50
+ @staticmethod
51
+ def ByCoordinateSystems(source, target, mantissa: int = 6, silent: bool = False):
52
+ """
53
+ Calculates the 4x4 transformation matrix that maps the source coordinate system to the target coordinate system.
54
+ An example of a coordinate system matrix is:
55
+ source = [
56
+ [0, 0, 0], # Origin
57
+ [1, 0, 0], # X-axis
58
+ [0, 1, 0], # Y-axis
59
+ [0, 0, 1] # Z-axis
60
+ ]
61
+
62
+ Parameters
63
+ ----------
64
+ source : list
65
+ The 4X3 matrix representing source coordinate system. The rows are in the order: Origin, X-Axis, Y-Axis, Z-Axis.
66
+ target : list
67
+ The 4X3 matrix representing target coordinate system. The rows are in the order: Origin, X-Axis, Y-Axis, Z-Axis.
68
+ mantissa : int , optional
69
+ The desired length of the mantissa. The default is 6.
70
+ silent : bool , optional
71
+ If set to True, no error and warning messages are printed. Otherwise, they are. The default is False.
72
+
73
+ Returns
74
+ -------
75
+ list
76
+ The 4x4 transformation matrix.
77
+ """
78
+ import numpy as np
79
+
80
+ if not isinstance(source, list):
81
+ if not silent:
82
+ print("Matrix.ByCoordinateSystems - Error: The source input parameter is not a valid list. Returning None.")
83
+ return None
84
+ if not isinstance(target, list):
85
+ if not silent:
86
+ print("Matrix.ByCoordinateSystems - Error: The taget input parameter is not a valid list. Returning None.")
87
+ return None
88
+
89
+ # Convert to numpy arrays
90
+ source_matrix = np.array(source)
91
+ target_matrix = np.array(target)
92
+
93
+ if source_matrix.shape != (4, 3):
94
+ if not silent:
95
+ print("Matrix.ByCoordinateSystems - Error: The source input parameter must be 4x3 matrix. Returning None.")
96
+ return None
97
+ if target_matrix.shape != (4, 3):
98
+ if not silent:
99
+ print("Matrix.ByCoordinateSystems - Error: The target input parameter must be 4x3 matrix. Returning None.")
100
+ return None
101
+
102
+ # Convert input matrices to homogeneous transformations
103
+ source_to_world = np.eye(4)
104
+ source_to_world[:3, 0] = source_matrix[1, :] # X-axis
105
+ source_to_world[:3, 1] = source_matrix[2, :] # Y-axis
106
+ source_to_world[:3, 2] = source_matrix[3, :] # Z-axis
107
+ source_to_world[:3, 3] = source_matrix[0, :] # Origin
108
+
109
+ target_to_world = np.eye(4)
110
+ target_to_world[:3, 0] = target_matrix[1, :] # X-axis
111
+ target_to_world[:3, 1] = target_matrix[2, :] # Y-axis
112
+ target_to_world[:3, 2] = target_matrix[3, :] # Z-axis
113
+ target_to_world[:3, 3] = target_matrix[0, :] # Origin
114
+
115
+ # Compute the world-to-source transformation (inverse of source_to_world)
116
+ world_to_source = np.linalg.inv(source_to_world)
117
+
118
+ # Compute the source-to-target transformation
119
+ source_to_target = target_to_world @ world_to_source
120
+
121
+ # Convert the result to a list and round values
122
+ result_list = source_to_target.tolist()
123
+ rounded_result = [[round(value, mantissa) for value in row] for row in result_list]
124
+
125
+ return rounded_result
126
+
50
127
  @staticmethod
51
128
  def ByRotation(angleX=0, angleY=0, angleZ=0, order="xyz"):
52
129
  def rotateXMatrix(radians):
topologicpy/Topology.py CHANGED
@@ -1498,6 +1498,8 @@ class Topology():
1498
1498
  edges = [e for e in edges if e]
1499
1499
  faces = [f for f in faces if f]
1500
1500
 
1501
+ return_topology = None
1502
+
1501
1503
  if not vertices:
1502
1504
  return None
1503
1505
 
@@ -1527,7 +1529,7 @@ class Topology():
1527
1529
  if topologyType == "wire" and edges:
1528
1530
  topEdges = [Edge.ByVertices([topVerts[e[0]], topVerts[e[1]]], tolerance=tolerance) for e in edges]
1529
1531
  if topEdges:
1530
- returnTopology = topologyByEdges(topEdges, topologyType)
1532
+ return_topology = topologyByEdges(topEdges, topologyType)
1531
1533
  elif faces:
1532
1534
  for aFace in faces:
1533
1535
  faceEdges = [Edge.ByVertices([topVerts[aFace[i]], topVerts[aFace[i + 1]]], tolerance=tolerance) for i in range(len(aFace) - 1)]
@@ -1545,14 +1547,14 @@ class Topology():
1545
1547
  except:
1546
1548
  pass
1547
1549
  if topFaces:
1548
- returnTopology = topologyByFaces(topFaces, topologyType=topologyType, tolerance=tolerance)
1550
+ return_topology = topologyByFaces(topFaces, topologyType=topologyType, tolerance=tolerance)
1549
1551
  elif edges:
1550
1552
  topEdges = [Edge.ByVertices([topVerts[e[0]], topVerts[e[1]]], tolerance=tolerance) for e in edges]
1551
1553
  if topEdges:
1552
- returnTopology = topologyByEdges(topEdges, topologyType)
1554
+ return_topology = topologyByEdges(topEdges, topologyType)
1553
1555
  else:
1554
- returnTopology = Cluster.ByTopologies(topVerts)
1555
- return returnTopology
1556
+ return_topology = Cluster.ByTopologies(topVerts)
1557
+ return return_topology
1556
1558
 
1557
1559
  @staticmethod
1558
1560
  def ByBIMPath(path, guidKey: str = "guid", colorKey: str = "color", typeKey: str = "type",
@@ -6264,7 +6266,7 @@ class Topology():
6264
6266
  @staticmethod
6265
6267
  def IsSimilar(topologyA, topologyB, removeCoplanarFaces: bool = False, mantissa: int = 6, epsilon: float = 0.1, tolerance: float = 0.0001, silent: bool = False):
6266
6268
  """
6267
- Returns True if the input topologies are similar. False otherwise. See https://en.wikipedia.org/wiki/Similarity_(geometry).
6269
+ Calculates if the input topologies are similar. See https://en.wikipedia.org/wiki/Similarity_(geometry).
6268
6270
 
6269
6271
  Parameters
6270
6272
  ----------
@@ -6286,7 +6288,8 @@ class Topology():
6286
6288
  Returns
6287
6289
  -------
6288
6290
  [bool, list]
6289
- True if the input topologies are similar., False otherwise and the matrix needed to tranform topologyA to match topologyB
6291
+ True if the input topologies are similar, False otherwise and the matrix needed to tranform topologyA to match topologyB.
6292
+ If the topologies are not similar, the transformation matrix is None.
6290
6293
 
6291
6294
  """
6292
6295
  from topologicpy.Vertex import Vertex
@@ -6308,7 +6311,6 @@ class Topology():
6308
6311
  if removeCoplanarFaces == True:
6309
6312
  topologyA = Topology.RemoveCoplanarFaces(topologyA, epsilon=epsilon, tolerance=tolerance)
6310
6313
  topologyB = Topology.RemoveCoplanarFaces(topologyB, epsilon=epsilon, tolerance=tolerance)
6311
- Topology.Show(topologyA, topologyB)
6312
6314
  len_vertices_a = len(Topology.Vertices(topologyA))
6313
6315
  if len_vertices_a < 1 and not Topology.IsInstance(topologyA, "vertex"):
6314
6316
  if not silent:
@@ -6398,90 +6400,58 @@ class Topology():
6398
6400
  if len(faces_a) > 0 and len(faces_b) > 0:
6399
6401
  largest_faces_a = Topology.LargestFaces(topologyA)
6400
6402
  largest_faces_b = Topology.LargestFaces(topologyB)
6401
-
6403
+ else:
6404
+ if not silent:
6405
+ print("Topology.IsSimilar - Error: The topologies do not have faces. Returning None.")
6406
+ return False, None
6402
6407
 
6403
6408
  # Process largest faces
6404
- largest_faces_a = Topology.LargestFaces(topologyA)
6405
- largest_faces_b = Topology.LargestFaces(topologyB)
6406
- face_a_d = Dictionary.ByKeyValue("faceColor", "red")
6407
- face_b_d = Dictionary.ByKeyValue("faceColor", "blue")
6408
6409
  for face_a in largest_faces_a:
6410
+ l_edge_a = Topology.LongestEdges(face_a)[0]
6411
+ length_a = Edge.Length(l_edge_a)
6409
6412
  centroid_a = Topology.Centroid(face_a)
6410
- normal_a = Face.Normal(face_a)
6413
+ origin_a = Vertex.Coordinates(centroid_a)
6414
+ zaxis_a = Face.Normal(face_a)
6411
6415
  third_vertex_a = Face.ThirdVertex(face_a) # Pick a third vertex for orientation
6412
- orientation_a = Vector.Normalize(Vector.ByVertices(centroid_a, third_vertex_a))
6416
+ xaxis_a = Vector.Normalize(Vector.ByVertices(centroid_a, third_vertex_a))
6417
+ yaxis_a = Vector.Cross(xaxis_a, zaxis_a)
6418
+ # Build Coordinate System matrix. The origin will be (0,0,0) once the trans matrix is applied.
6419
+ cs_a = [[0,0,0]]+[xaxis_a]+[yaxis_a]+[zaxis_a]
6420
+ tran_matrix_a = Matrix.ByTranslation(translateX=-origin_a[0], translateY=-origin_a[1], translateZ=-origin_a[2])
6413
6421
 
6422
+ # Check against the faces of B:
6414
6423
  for face_b in largest_faces_b:
6415
- face_copy_b = Topology.SetDictionary(Topology.Copy(face_b), face_b_d)
6424
+ l_edge_b = Topology.LongestEdges(face_b)[0]
6425
+ length_b = Edge.Length(l_edge_b)
6426
+ scale_factor = length_b/length_a
6427
+ scale_matrix = Matrix.ByScaling(scaleX=scale_factor, scaleY=scale_factor, scaleZ=scale_factor)
6416
6428
  centroid_b = Topology.Centroid(face_b)
6417
- normal_b = Face.Normal(face_b)
6429
+ origin_b = Vertex.Coordinates(centroid_b)
6430
+ zaxis_b = Face.Normal(face_b)
6418
6431
  third_vertex_b = Face.ThirdVertex(face_b)
6419
- orientation_b = Vector.Normalize(Vector.ByVertices(centroid_b, third_vertex_b))
6420
-
6432
+ xaxis_b = Vector.Normalize(Vector.ByVertices(centroid_b, third_vertex_b))
6433
+ yaxis_b = Vector.Cross(xaxis_b, zaxis_b)
6434
+ cs_b = [origin_b]+[xaxis_b]+[yaxis_b]+[zaxis_b]
6421
6435
  # Compute transformation matrix
6422
- rotation_matrix = Matrix.ByVectors(normal_a, normal_b, orientation_a, orientation_b)
6423
- scaling_factor = (Face.Area(face_b) / Face.Area(face_a)) ** (1/2)
6424
- scaling_matrix = Matrix.ByScaling(scaling_factor, scaling_factor, scaling_factor)
6425
-
6426
- translation_matrix = Matrix.ByTranslation(
6427
- Vertex.X(centroid_b) - Vertex.X(centroid_a),
6428
- Vertex.Y(centroid_b) - Vertex.Y(centroid_a),
6429
- Vertex.Z(centroid_b) - Vertex.Z(centroid_a)
6430
- )
6431
- combined_matrix = Matrix.Multiply(rotation_matrix, scaling_matrix)
6432
- combined_matrix = Matrix.Multiply(translation_matrix, combined_matrix)
6433
-
6434
- transformed_centroid_a = Topology.Transform(centroid_a, combined_matrix)
6435
-
6436
- # One last translation to synchronise the two centroids.
6437
- translation_matrix = Matrix.ByTranslation(
6438
- Vertex.X(centroid_b) - Vertex.X(transformed_centroid_a),
6439
- Vertex.Y(centroid_b) - Vertex.Y(transformed_centroid_a),
6440
- Vertex.Z(centroid_b) - Vertex.Z(transformed_centroid_a)
6441
- )
6442
- combined_matrix = Matrix.Multiply(translation_matrix, combined_matrix)
6436
+ # translate to origin, scale, then transform coordinate systems
6437
+ combined_matrix = Matrix.Multiply(scale_matrix, tran_matrix_a)
6438
+ matching_matrix = Matrix.ByCoordinateSystems(cs_a, cs_b)
6439
+ combined_matrix = Matrix.Multiply(matching_matrix, combined_matrix)
6443
6440
  # Apply transformation and compare
6444
- transformedA = Topology.Transform(topologyA, combined_matrix)
6445
- transformed_face_a = Topology.Transform(face_a, combined_matrix)
6446
- transformed_face_a = Topology.SetDictionary(face_a, face_a_d)
6447
-
6448
- Topology.Show(transformedA, topologyB, transformed_face_a, face_copy_b, faceColorKey="faceColor", vertexSizeKey="vertexSize")
6449
- if Topology.IsVertexCongruent(transformedA, topologyB, mantissa=mantissa, epsilon=epsilon, tolerance=tolerance, silent=silent):
6450
- return True, combined_matrix
6441
+ try:
6442
+ transformedA = Topology.Transform(topologyA, combined_matrix)
6443
+ status = Topology.IsVertexCongruent(transformedA, topologyB, mantissa=mantissa, epsilon=epsilon, tolerance=tolerance, silent=silent)
6444
+ if status:
6445
+ return True, combined_matrix
6446
+ except:
6447
+ pass
6451
6448
 
6452
6449
  return False, None
6453
- # for l_f_a in largest_faces_a:
6454
- # l_e_a = Face.NormalEdge(l_f_a)
6455
- # centroid_a = Edge.StartVertex(l_e_a)
6456
- # dir_a = Vector.Normalize(Edge.Direction(l_e_a))
6457
- # trans_matrix_a = Matrix.ByTranslation(-Vertex.X(centroid_a), -Vertex.Y(centroid_a), -Vertex.Z(centroid_a))
6458
- # sf_a = 1/Face.Area(l_f_a)
6459
- # scaling_matrix_a = Matrix.ByScaling(sf_a, sf_a, sf_a)
6460
- # for l_f_b in largest_faces_b:
6461
- # l_e_b = Face.NormalEdge(l_f_b)
6462
- # centroid_b = Edge.StartVertex(l_e_b)
6463
- # dir_b = Vector.Normalize(Edge.Direction(l_e_b))
6464
- # rotation_matrix = Matrix.ByVectors(dir_a, dir_b)
6465
- # sf_b = 1/Face.Area(l_f_b)
6466
- # scaling_matrix_b = Matrix.ByScaling(sf_b, sf_b, sf_b)
6467
- # trans_matrix_b = Matrix.ByTranslation(-Vertex.X(centroid_b), -Vertex.Y(centroid_b), -Vertex.Z(centroid_b))
6468
- # combined_matrix_a = Matrix.Multiply(rotation_matrix, scaling_matrix_a)
6469
- # combined_matrix_a = Matrix.Multiply(combined_matrix_a, trans_matrix_a)
6470
- # combined_matrix_b = Matrix.Multiply(scaling_matrix_b, trans_matrix_b)
6471
- # top_a = Topology.Transform(topologyA, combined_matrix_a)
6472
- # top_b = Topology.Transform(topologyB, combined_matrix_b)
6473
- # Topology.Show(top_a, top_b)
6474
- # if Topology.IsVertexCongruent(top_a, top_b, mantissa=mantissa, epsilon=epsilon, tolerance=tolerance, silent=silent):
6475
- # Topology.Show(top_a, top_b)
6476
- # final_matrix = Matrix.Multiply(Matrix.Invert(combined_matrix_b), combined_matrix_a)
6477
- # return True, final_matrix
6478
6450
 
6479
- return False, None
6480
-
6481
6451
  @staticmethod
6482
6452
  def IsVertexCongruent(topologyA, topologyB, mantissa: int = 6, epsilon: float = 0.1, tolerance: float = 0.0001, silent : bool = False):
6483
6453
  """
6484
- Returns True if the input topologies are vertex matched (have same number of vertices and all vertices are congruent within a tolerance). Returns False otherwise.
6454
+ Returns True if the input topologies are vertex congruent (have same number of vertices and all vertices are congruent within a tolerance). Returns False otherwise.
6485
6455
 
6486
6456
  Parameters
6487
6457
  ----------
@@ -6491,6 +6461,9 @@ class Topology():
6491
6461
  The second input topology.
6492
6462
  mantissa : int , optional
6493
6463
  The desired length of the mantissa. The default is 6.
6464
+ epsilon : float , optional
6465
+ The desired accepted tolerance for the number of matched number of vertices. For example, an epsilon of 0.1 indicates that
6466
+ the algorithm will return True even if 10% of the vertices do not match. The default is 0.1.
6494
6467
  tolerance : float , optional
6495
6468
  The desired tolerance. The default is 0.0001.
6496
6469
  silent : bool , optional
@@ -6504,7 +6477,7 @@ class Topology():
6504
6477
  """
6505
6478
  from topologicpy.Vertex import Vertex
6506
6479
 
6507
- def coordinates_unmatched_ratio(list1, list2, tolerance):
6480
+ def coordinates_unmatched_ratio(list1, list2, mantissa, tolerance):
6508
6481
  """
6509
6482
  Calculates the percentage of coordinates in list1 that do not have a corresponding
6510
6483
  coordinate in list2 within a specified tolerance, with each match being unique.
@@ -6543,7 +6516,7 @@ class Topology():
6543
6516
  total_coordinates = len(list1)
6544
6517
  unmatched_ratio = (unmatched_count / total_coordinates)
6545
6518
 
6546
- return unmatched_ratio
6519
+ return round(unmatched_ratio, mantissa)
6547
6520
 
6548
6521
  if not Topology.IsInstance(topologyA, "topology"):
6549
6522
  if not silent:
@@ -6568,11 +6541,12 @@ class Topology():
6568
6541
  return None
6569
6542
  # Number of vertices
6570
6543
  max_len = max([len_vertices_a, len_vertices_b])
6571
- if abs(len_vertices_a - len_vertices_a)/max_len >= epsilon:
6544
+ ratio = round(float(abs(len_vertices_a - len_vertices_b))/float(max_len), mantissa)
6545
+ if ratio > epsilon:
6572
6546
  return False
6573
6547
  coords_a = [Vertex.Coordinates(v, mantissa=mantissa) for v in vertices_a]
6574
6548
  coords_b = [Vertex.Coordinates(v, mantissa=mantissa) for v in vertices_b]
6575
- unmatched_ratio = coordinates_unmatched_ratio(coords_a, coords_b, tolerance=tolerance)
6549
+ unmatched_ratio = coordinates_unmatched_ratio(coords_a, coords_b, mantissa=mantissa, tolerance=tolerance)
6576
6550
  if unmatched_ratio <= epsilon:
6577
6551
  return True
6578
6552
  return False
topologicpy/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = '0.8.14'
1
+ __version__ = '0.8.15'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: topologicpy
3
- Version: 0.8.14
3
+ Version: 0.8.15
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,7 +1,7 @@
1
1
  topologicpy/ANN.py,sha256=m_WxD1lgQqDhUpaM20Lia6TmJACDYaAE96wigsi-99U,47932
2
2
  topologicpy/Aperture.py,sha256=p9pUzTQSBWoUaDiug1V1R1hnEIEwYSXFg2t7iRAmNRY,2723
3
3
  topologicpy/BVH.py,sha256=1q2lR5eDs7Wnwv7M-Kr7Cj3GG_iy7d1ddaZqWGHdX-w,12932
4
- topologicpy/Cell.py,sha256=DYVXGfzioMBsQOkrP-BhJ5iHExKhTGAxOhMlmWeG4vw,118262
4
+ topologicpy/Cell.py,sha256=BN6hjYpN6Fse0mn7d7oHh65D7c6Mt1Yu7iK3lEp_Cj0,118262
5
5
  topologicpy/CellComplex.py,sha256=udDzbMub3d2QYn1XGMzt3F9Su2VXuAGvn0eoTtOIn3g,58207
6
6
  topologicpy/Cluster.py,sha256=o5jdMRpcGfSGGiXQdFg-e9XcnBF5AqTj3xb1nSpwJWE,58606
7
7
  topologicpy/Color.py,sha256=q9xsGmxFMz7sQKmygwSVS12GaTRB-OT0-_i6t3-cthE,20307
@@ -15,7 +15,7 @@ topologicpy/Graph.py,sha256=FBmiMObzztPwZFJ2T846Ivz0Y1kpzMF0sF-PDUMPk4o,498946
15
15
  topologicpy/Grid.py,sha256=2s9cSlWldivn1i9EUz4OOokJyANveqmRe_vR93CAndI,18245
16
16
  topologicpy/Helper.py,sha256=4H5KPiv_eiEs489UOOyGLe9RaeoZIfmMh3mk_YCHmXg,29100
17
17
  topologicpy/Honeybee.py,sha256=uDVtDbloydNoaBFcSNukKL_2PLyD6XKkCp1VHz1jtaU,21751
18
- topologicpy/Matrix.py,sha256=mqcCk14kM9OOwJPwd9ce-8SFM0IxS3jYb2XpWhVjUAc,19503
18
+ topologicpy/Matrix.py,sha256=i22RLP5ebUAMuU7V1tZ__Z4lf1pg9fzq9nENsDZUV74,22779
19
19
  topologicpy/Neo4j.py,sha256=BKOF29fRgXmdpMGkrNzuYbyqgCJ6ElPPMYlfTxXiVbc,22392
20
20
  topologicpy/Plotly.py,sha256=RU_VioIRLGIYzwyKI9OQHOx9OxxGppdpagysgTbdxIE,115942
21
21
  topologicpy/Polyskel.py,sha256=DDUayC29LI1EkxdK09F0DgGyH-NCOU1LE3J2Imz0rEI,19832
@@ -23,14 +23,14 @@ topologicpy/PyG.py,sha256=LU9LCCzjxGPUM31qbaJXZsTvniTtgugxJY7y612t4A4,109757
23
23
  topologicpy/Shell.py,sha256=--dJoSdz6BapxVEyG2DI0W5apO_xwLORj5qmR15yl2Y,87983
24
24
  topologicpy/Speckle.py,sha256=AlsGlSDuKRtX5jhVsPNSSjjbZis079HbUchDH_5RJmE,18187
25
25
  topologicpy/Sun.py,sha256=42tDWMYpwRG7Z2Qjtp94eRgBuqySq7k8TgNUZDK7QxQ,36837
26
- topologicpy/Topology.py,sha256=mhRKJlFJLe_IGxj_bQ5lbK277YKod7PLXWzZ2Suq8ng,465493
26
+ topologicpy/Topology.py,sha256=O91rRl32hG3YvKowSDGbxaq3zdM16RIChT4HF9hNODM,463786
27
27
  topologicpy/Vector.py,sha256=GkGt-aJ591IJ2IPffMAudvITLDPi2qZibZc4UAav6m8,42407
28
28
  topologicpy/Vertex.py,sha256=xr8KSgKnx-hgVp-eIvMPAKRv04R-wk-_4zc57xVyEqE,80793
29
29
  topologicpy/Wire.py,sha256=x7tOeR1o5qi5cXp_d9JrQrSXfYztCWiBC1OnVl6Yp7A,228463
30
30
  topologicpy/__init__.py,sha256=vlPCanUbxe5NifC4pHcnhSzkmmYcs_UrZrTlVMsxcFs,928
31
- topologicpy/version.py,sha256=Lw9k1hHakMjGPEzEp8wU2hEIGzA0_SHXmAYeLmbM_Kg,23
32
- topologicpy-0.8.14.dist-info/LICENSE,sha256=FK0vJ73LuE8PYJAn7LutsReWR47-Ooovw2dnRe5yV6Q,681
33
- topologicpy-0.8.14.dist-info/METADATA,sha256=HVOo7iDJt80dFu4DEf_0H0du_Zq8rCW2WFLikjwb7HU,10513
34
- topologicpy-0.8.14.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
35
- topologicpy-0.8.14.dist-info/top_level.txt,sha256=J30bDzW92Ob7hw3zA8V34Jlp-vvsfIkGzkr8sqvb4Uw,12
36
- topologicpy-0.8.14.dist-info/RECORD,,
31
+ topologicpy/version.py,sha256=HbO2F5YBMLHRpphNJizV3_Sp8T0xTu3xaqHhjkNWPRc,23
32
+ topologicpy-0.8.15.dist-info/LICENSE,sha256=FK0vJ73LuE8PYJAn7LutsReWR47-Ooovw2dnRe5yV6Q,681
33
+ topologicpy-0.8.15.dist-info/METADATA,sha256=ft8T8ED9kou73cq52cvDshxjosXDKXdtXLqososiUNM,10513
34
+ topologicpy-0.8.15.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
35
+ topologicpy-0.8.15.dist-info/top_level.txt,sha256=J30bDzW92Ob7hw3zA8V34Jlp-vvsfIkGzkr8sqvb4Uw,12
36
+ topologicpy-0.8.15.dist-info/RECORD,,