topologicpy 0.8.13__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:
@@ -2185,62 +2185,154 @@ class Cell():
2185
2185
  return Cell.Area(cell=cell, mantissa=mantissa)
2186
2186
 
2187
2187
  @staticmethod
2188
- def Tetrahedron(origin= None, radius: float = 0.5,
2189
- direction: list = [0, 0, 1], placement: str ="center", tolerance: float = 0.0001):
2188
+ def Tetrahedron(origin = None, length: float = 1, depth: int = 1, direction=[0,0,1], placement="center", mantissa: int = 6, tolerance: float = 0.0001, silent: bool = False):
2190
2189
  """
2191
- Creates a tetrahedron. See https://en.wikipedia.org/wiki/Tetrahedron.
2190
+ Creates a recursive tetrahedron cell.
2192
2191
 
2193
2192
  Parameters
2194
2193
  ----------
2195
2194
  origin : topologic_core.Vertex , optional
2196
2195
  The origin location of the tetrahedron. The default is None which results in the tetrahedron being placed at (0, 0, 0).
2197
- radius : float , optional
2198
- The radius of the tetrahedron's circumscribed sphere. The default is 0.5.
2196
+ length : float , optional
2197
+ The length of the edge of the tetrahedron. The default is 1.
2198
+ depth : int , optional
2199
+ The desired maximum number of recrusive subdivision levels.
2199
2200
  direction : list , optional
2200
2201
  The vector representing the up direction of the tetrahedron. The default is [0, 0, 1].
2201
2202
  placement : str , optional
2202
2203
  The description of the placement of the origin of the tetrahedron. This can be "bottom", "center", or "lowerleft". It is case insensitive. The default is "center".
2204
+ mantissa : int , optional
2205
+ The desired length of the mantissa. The default is 6.
2203
2206
  tolerance : float , optional
2204
2207
  The desired tolerance. The default is 0.0001.
2205
2208
 
2206
2209
  Returns
2207
2210
  -------
2208
- topologic_core.Cell
2211
+ topologic_core.CellComplex
2209
2212
  The created tetrahedron.
2210
2213
 
2211
2214
  """
2212
-
2213
2215
  from topologicpy.Vertex import Vertex
2214
- from topologicpy.Wire import Wire
2215
2216
  from topologicpy.Face import Face
2217
+ from topologicpy.Cell import Cell
2218
+ from topologicpy.CellComplex import CellComplex
2219
+ from topologicpy.Cluster import Cluster
2216
2220
  from topologicpy.Topology import Topology
2217
- import math
2221
+ from topologicpy.Dictionary import Dictionary
2218
2222
 
2219
- if not Topology.IsInstance(origin, "Vertex"):
2220
- origin = Vertex.ByCoordinates(0, 0, 0)
2221
- if not Topology.IsInstance(origin, "Vertex"):
2222
- print("Cell.Tetrahedron - Error: The input origin parameter is not a valid topologic vertex. Returning None.")
2223
- return None
2223
+ from math import sqrt
2224
2224
 
2225
- vb1 = Vertex.ByCoordinates(math.sqrt(8/9), 0, -1/3)
2226
- vb2 = Vertex.ByCoordinates(-math.sqrt(2/9), math.sqrt(2/3), -1/3)
2227
- vb3 = Vertex.ByCoordinates(-math.sqrt(2/9), -math.sqrt(2/3), -1/3)
2228
- vb4 = Vertex.ByCoordinates(0, 0, 1)
2229
- f1 = Face.ByVertices([vb1, vb2, vb3])
2230
- f2 = Face.ByVertices([vb4, vb1, vb2])
2231
- f3 = Face.ByVertices([vb4, vb2, vb3])
2232
- f4 = Face.ByVertices([vb4, vb3, vb1])
2233
- tetrahedron = Cell.ByFaces([f1, f2, f3, f4])
2234
- tetrahedron = Topology.Scale(tetrahedron, origin=Vertex.Origin(), x=0.5, y=0.5, z=0.5)
2235
- tetrahedron = Topology.Scale(tetrahedron, origin=Vertex.Origin(), x=radius/0.5, y=radius/0.5, z=radius/0.5)
2225
+ def subdivide_tetrahedron(tetrahedron, depth):
2226
+ """
2227
+ Recursively subdivides a tetrahedron into smaller tetrahedra.
2236
2228
 
2237
- if placement.lower() == "lowerleft":
2238
- tetrahedron = Topology.Translate(tetrahedron, radius, radius, radius)
2229
+ Parameters:
2230
+ tetrahedron (Cell): The tetrahedron to subdivide.
2231
+ depth (int): Recursion depth for the subdivision.
2232
+
2233
+ Returns:
2234
+ list: List of smaller tetrahedral cells.
2235
+ """
2236
+ if depth == 0:
2237
+ return [tetrahedron]
2238
+
2239
+ # Extract the vertices of the tetrahedron
2240
+ vertices = Topology.Vertices(tetrahedron)
2241
+ v0, v1, v2, v3 = vertices
2242
+
2243
+ # Calculate midpoints of the edges
2244
+ m01 = Vertex.ByCoordinates((v0.X() + v1.X()) / 2, (v0.Y() + v1.Y()) / 2, (v0.Z() + v1.Z()) / 2)
2245
+ m02 = Vertex.ByCoordinates((v0.X() + v2.X()) / 2, (v0.Y() + v2.Y()) / 2, (v0.Z() + v2.Z()) / 2)
2246
+ m03 = Vertex.ByCoordinates((v0.X() + v3.X()) / 2, (v0.Y() + v3.Y()) / 2, (v0.Z() + v3.Z()) / 2)
2247
+ m12 = Vertex.ByCoordinates((v1.X() + v2.X()) / 2, (v1.Y() + v2.Y()) / 2, (v1.Z() + v2.Z()) / 2)
2248
+ m13 = Vertex.ByCoordinates((v1.X() + v3.X()) / 2, (v1.Y() + v3.Y()) / 2, (v1.Z() + v3.Z()) / 2)
2249
+ m23 = Vertex.ByCoordinates((v2.X() + v3.X()) / 2, (v2.Y() + v3.Y()) / 2, (v2.Z() + v3.Z()) / 2)
2250
+
2251
+ # Create smaller tetrahedra
2252
+ tetrahedra = [
2253
+ Cell.ByFaces([
2254
+ Face.ByVertices([v0, m01, m02]),
2255
+ Face.ByVertices([v0, m01, m03]),
2256
+ Face.ByVertices([v0, m02, m03]),
2257
+ Face.ByVertices([m01, m02, m03])
2258
+ ]),
2259
+ Cell.ByFaces([
2260
+ Face.ByVertices([m01, v1, m12]),
2261
+ Face.ByVertices([m01, v1, m13]),
2262
+ Face.ByVertices([m01, m12, m13]),
2263
+ Face.ByVertices([v1, m12, m13])
2264
+ ]),
2265
+ Cell.ByFaces([
2266
+ Face.ByVertices([m02, m12, v2]),
2267
+ Face.ByVertices([m02, m12, m23]),
2268
+ Face.ByVertices([m02, v2, m23]),
2269
+ Face.ByVertices([m12, v2, m23])
2270
+ ]),
2271
+ Cell.ByFaces([
2272
+ Face.ByVertices([m03, m13, m23]),
2273
+ Face.ByVertices([m03, v3, m13]),
2274
+ Face.ByVertices([m03, v3, m23]),
2275
+ Face.ByVertices([m13, v3, m23])
2276
+ ])
2277
+ ]
2278
+
2279
+ # Recursively subdivide the smaller tetrahedra
2280
+ result = []
2281
+ for t in tetrahedra:
2282
+ result.extend(subdivide_tetrahedron(t, depth - 1))
2283
+ return result
2284
+
2285
+ if not Topology.IsInstance(origin, "vertex"):
2286
+ origin = Vertex.Origin()
2287
+
2288
+ # Define the four vertices of the tetrahedron
2289
+ v0 = Vertex.ByCoordinates(0, 0, 0)
2290
+ v1 = Vertex.ByCoordinates(length, 0, 0)
2291
+ v2 = Vertex.ByCoordinates(length/2, sqrt(3)/2*length, 0)
2292
+ v3 = Vertex.ByCoordinates(length/2, sqrt(3)/2*length/3, sqrt(2/3)*length)
2293
+
2294
+ # Create the initial tetrahedron
2295
+ tetrahedron = Cell.ByFaces([
2296
+ Face.ByVertices([v0, v1, v2]),
2297
+ Face.ByVertices([v0, v1, v3]),
2298
+ Face.ByVertices([v1, v2, v3]),
2299
+ Face.ByVertices([v2, v0, v3]),
2300
+ ])
2301
+
2302
+ bbox = Topology.BoundingBox(tetrahedron)
2303
+ d = Topology.Dictionary(bbox)
2304
+ bb_width = Dictionary.ValueAtKey(d, "width")
2305
+ bb_length = Dictionary.ValueAtKey(d, "length")
2306
+ bb_height = Dictionary.ValueAtKey(d, "height")
2307
+
2308
+ centroid = Topology.Centroid(tetrahedron)
2309
+ c_x, c_y, c_z = Vertex.Coordinates(centroid, mantissa=mantissa)
2310
+
2311
+ if placement.lower() == "center":
2312
+ tetrahedron = Topology.Translate(tetrahedron, -c_x, -c_y, -c_z)
2239
2313
  elif placement.lower() == "bottom":
2240
- tetrahedron = Topology.Translate(tetrahedron, 0, 0, radius)
2241
- tetrahedron = Topology.Place(tetrahedron, originA=Vertex.Origin(), originB=origin)
2242
- tetrahedron = Topology.Orient(tetrahedron, origin=origin, dirA=[0, 0, 1], dirB=direction, tolerance=tolerance)
2243
- return tetrahedron
2314
+ tetrahedron = Topology.Translate(tetrahedron,-c_x, -c_y, 0)
2315
+ elif placement.lower() == "upperleft":
2316
+ tetrahedron = Topology.Translate(tetrahedron, 0, 0, -bb_height)
2317
+ elif placement.lower() == "upperright":
2318
+ tetrahedron = Topology.Translate(tetrahedron, -bb_width, -bb_length, -bb_height)
2319
+ elif placement.lower() == "bottomright":
2320
+ tetrahedron = Topology.Translate(tetrahedron, -bb_width, -bb_length, 0)
2321
+ elif placement.lower() == "top":
2322
+ tetrahedron = Topology.Translate(tetrahedron,-c_x, -c_y, -bb_height)
2323
+
2324
+ tetrahedron = Topology.Place(tetrahedron, Vertex.Origin(), origin)
2325
+ if not direction == [0,0,1]:
2326
+ tetrahedron = Topology.Orient(tetrahedron, origin=origin, dirA=[0,0,1], dirB=direction)
2327
+
2328
+ depth = max(depth, 0)
2329
+ if depth == 0:
2330
+ return tetrahedron
2331
+ else:
2332
+ # Recursively subdivide the tetrahedron
2333
+ subdivided_tetrahedra = subdivide_tetrahedron(tetrahedron, depth)
2334
+ # Create a cell complex from the subdivided tetrahedra
2335
+ return CellComplex.ExternalBoundary(CellComplex.ByCells([tetrahedron]+subdivided_tetrahedra))
2244
2336
 
2245
2337
  @staticmethod
2246
2338
  def Torus(origin= None, majorRadius: float = 0.5, minorRadius: float = 0.125, uSides: int = 16, vSides: int = 8, direction: list = [0, 0, 1], placement: str = "center", tolerance: float = 0.0001):
@@ -1012,6 +1012,151 @@ class CellComplex():
1012
1012
  shells = Topology.Shells(cellComplex)
1013
1013
  return shells
1014
1014
 
1015
+ @staticmethod
1016
+ def Tetrahedron(origin = None, length: float = 1, depth: int = 1, direction=[0,0,1], placement="center", mantissa: int = 6, tolerance: float = 0.0001, silent: bool = False):
1017
+ """
1018
+ Creates a recursive tetrahedron cellComplex with internal cells.
1019
+
1020
+ Parameters
1021
+ ----------
1022
+ origin : topologic_core.Vertex , optional
1023
+ The origin location of the tetrahedron. The default is None which results in the tetrahedron being placed at (0, 0, 0).
1024
+ length : float , optional
1025
+ The length of the edge of the tetrahedron. The default is 1.
1026
+ depth : int , optional
1027
+ The desired maximum number of recrusive subdivision levels.
1028
+ direction : list , optional
1029
+ The vector representing the up direction of the tetrahedron. The default is [0, 0, 1].
1030
+ placement : str , optional
1031
+ The description of the placement of the origin of the tetrahedron. This can be "bottom", "center", or "lowerleft". It is case insensitive. The default is "center".
1032
+ mantissa : int , optional
1033
+ The desired length of the mantissa. The default is 6.
1034
+ tolerance : float , optional
1035
+ The desired tolerance. The default is 0.0001.
1036
+
1037
+ Returns
1038
+ -------
1039
+ topologic_core.CellComplex
1040
+ The created tetrahedron.
1041
+
1042
+ """
1043
+ from topologicpy.Vertex import Vertex
1044
+ from topologicpy.Face import Face
1045
+ from topologicpy.Cell import Cell
1046
+ from topologicpy.Topology import Topology
1047
+ from topologicpy.Dictionary import Dictionary
1048
+
1049
+ from math import sqrt
1050
+
1051
+ def subdivide_tetrahedron(tetrahedron, depth):
1052
+ """
1053
+ Recursively subdivides a tetrahedron into smaller tetrahedra.
1054
+
1055
+ Parameters:
1056
+ tetrahedron (Cell): The tetrahedron to subdivide.
1057
+ depth (int): Recursion depth for the subdivision.
1058
+
1059
+ Returns:
1060
+ list: List of smaller tetrahedral cells.
1061
+ """
1062
+ if depth == 0:
1063
+ return [tetrahedron]
1064
+
1065
+ # Extract the vertices of the tetrahedron
1066
+ vertices = Topology.Vertices(tetrahedron)
1067
+ v0, v1, v2, v3 = vertices
1068
+
1069
+ # Calculate midpoints of the edges
1070
+ m01 = Vertex.ByCoordinates((v0.X() + v1.X()) / 2, (v0.Y() + v1.Y()) / 2, (v0.Z() + v1.Z()) / 2)
1071
+ m02 = Vertex.ByCoordinates((v0.X() + v2.X()) / 2, (v0.Y() + v2.Y()) / 2, (v0.Z() + v2.Z()) / 2)
1072
+ m03 = Vertex.ByCoordinates((v0.X() + v3.X()) / 2, (v0.Y() + v3.Y()) / 2, (v0.Z() + v3.Z()) / 2)
1073
+ m12 = Vertex.ByCoordinates((v1.X() + v2.X()) / 2, (v1.Y() + v2.Y()) / 2, (v1.Z() + v2.Z()) / 2)
1074
+ m13 = Vertex.ByCoordinates((v1.X() + v3.X()) / 2, (v1.Y() + v3.Y()) / 2, (v1.Z() + v3.Z()) / 2)
1075
+ m23 = Vertex.ByCoordinates((v2.X() + v3.X()) / 2, (v2.Y() + v3.Y()) / 2, (v2.Z() + v3.Z()) / 2)
1076
+
1077
+ # Create smaller tetrahedra
1078
+ tetrahedra = [
1079
+ Cell.ByFaces([
1080
+ Face.ByVertices([v0, m01, m02]),
1081
+ Face.ByVertices([v0, m01, m03]),
1082
+ Face.ByVertices([v0, m02, m03]),
1083
+ Face.ByVertices([m01, m02, m03])
1084
+ ]),
1085
+ Cell.ByFaces([
1086
+ Face.ByVertices([m01, v1, m12]),
1087
+ Face.ByVertices([m01, v1, m13]),
1088
+ Face.ByVertices([m01, m12, m13]),
1089
+ Face.ByVertices([v1, m12, m13])
1090
+ ]),
1091
+ Cell.ByFaces([
1092
+ Face.ByVertices([m02, m12, v2]),
1093
+ Face.ByVertices([m02, m12, m23]),
1094
+ Face.ByVertices([m02, v2, m23]),
1095
+ Face.ByVertices([m12, v2, m23])
1096
+ ]),
1097
+ Cell.ByFaces([
1098
+ Face.ByVertices([m03, m13, m23]),
1099
+ Face.ByVertices([m03, v3, m13]),
1100
+ Face.ByVertices([m03, v3, m23]),
1101
+ Face.ByVertices([m13, v3, m23])
1102
+ ])
1103
+ ]
1104
+
1105
+ # Recursively subdivide the smaller tetrahedra
1106
+ result = []
1107
+ for t in tetrahedra:
1108
+ result.extend(subdivide_tetrahedron(t, depth - 1))
1109
+ return result
1110
+
1111
+ if not Topology.IsInstance(origin, "vertex"):
1112
+ origin = Vertex.Origin()
1113
+
1114
+ # Define the four vertices of the tetrahedron
1115
+ v0 = Vertex.ByCoordinates(0, 0, 0)
1116
+ v1 = Vertex.ByCoordinates(length, 0, 0)
1117
+ v2 = Vertex.ByCoordinates(length/2, sqrt(3)/2*length, 0)
1118
+ v3 = Vertex.ByCoordinates(length/2, sqrt(3)/2*length/3, sqrt(2/3)*length)
1119
+
1120
+ # Create the initial tetrahedron
1121
+ tetrahedron = Cell.ByFaces([
1122
+ Face.ByVertices([v0, v1, v2]),
1123
+ Face.ByVertices([v0, v1, v3]),
1124
+ Face.ByVertices([v1, v2, v3]),
1125
+ Face.ByVertices([v2, v0, v3]),
1126
+ ])
1127
+
1128
+ bbox = Topology.BoundingBox(tetrahedron)
1129
+ d = Topology.Dictionary(bbox)
1130
+ bb_width = Dictionary.ValueAtKey(d, "width")
1131
+ bb_length = Dictionary.ValueAtKey(d, "length")
1132
+ bb_height = Dictionary.ValueAtKey(d, "height")
1133
+
1134
+ centroid = Topology.Centroid(tetrahedron)
1135
+ c_x, c_y, c_z = Vertex.Coordinates(centroid, mantissa=mantissa)
1136
+
1137
+ if placement.lower() == "center":
1138
+ tetrahedron = Topology.Translate(tetrahedron, -c_x, -c_y, -c_z)
1139
+ elif placement.lower() == "bottom":
1140
+ tetrahedron = Topology.Translate(tetrahedron,-c_x, -c_y, 0)
1141
+ elif placement.lower() == "upperleft":
1142
+ tetrahedron = Topology.Translate(tetrahedron, 0, 0, -bb_height)
1143
+ elif placement.lower() == "upperright":
1144
+ tetrahedron = Topology.Translate(tetrahedron, -bb_width, -bb_length, -bb_height)
1145
+ elif placement.lower() == "bottomright":
1146
+ tetrahedron = Topology.Translate(tetrahedron, -bb_width, -bb_length, 0)
1147
+ elif placement.lower() == "top":
1148
+ tetrahedron = Topology.Translate(tetrahedron,-c_x, -c_y, -bb_height)
1149
+
1150
+ tetrahedron = Topology.Place(tetrahedron, Vertex.Origin(), origin)
1151
+ if not direction == [0,0,1]:
1152
+ tetrahedron = Topology.Orient(tetrahedron, origin=origin, dirA=[0,0,1], dirB=direction)
1153
+
1154
+ depth = max(depth, 1)
1155
+ # Recursively subdivide the tetrahedron
1156
+ subdivided_tetrahedra = subdivide_tetrahedron(tetrahedron, depth)
1157
+ # Create a cell complex from the subdivided tetrahedra
1158
+ return CellComplex.ByCells([tetrahedron]+subdivided_tetrahedra)
1159
+
1015
1160
  @staticmethod
1016
1161
  def Torus(origin= None, majorRadius: float = 0.5, minorRadius: float = 0.125, uSides: int = 16, vSides: int = 8, direction: list = [0, 0, 1], placement: str = "center", tolerance: float = 0.0001):
1017
1162
  """
topologicpy/Honeybee.py CHANGED
@@ -300,33 +300,27 @@ class Honeybee:
300
300
  sensorGrids = []
301
301
  for spaceNumber, tpCell in enumerate(tpCells):
302
302
  tpDictionary = Topology.Dictionary(tpCell)
303
- tpCellName = None
304
- tpCellStory = None
303
+ tpCellName = "Untitled Space"
304
+ tpCellStory = fl[0]
305
305
  tpCellProgramIdentifier = None
306
306
  tpCellConstructionSetIdentifier = None
307
307
  tpCellConditioned = True
308
308
  if tpDictionary:
309
309
  keyName = getKeyName(tpDictionary, 'Story')
310
- try:
311
- tpCellStory = Dictionary.ValueAtKey(tpDictionary, keyName)
312
- if tpCellStory:
313
- tpCellStory = tpCellStory.replace(" ","_")
314
- except:
315
- tpCellStory = fl[spaceNumber]
310
+ tpCellStory = Dictionary.ValueAtKey(tpDictionary, keyName, silent=True) or fl[spaceNumber]
311
+ if tpCellStory:
312
+ tpCellStory = tpCellStory.replace(" ","_")
313
+ else:
314
+ tpCellStory = "Untitled_Floor"
316
315
  if roomNameKey:
317
316
  keyName = getKeyName(tpDictionary, roomNameKey)
318
317
  else:
319
318
  keyName = getKeyName(tpDictionary, 'Name')
320
- try:
321
- tpCellName = Dictionary.ValueAtKey(tpDictionary,keyName)
322
- if tpCellName:
323
- tpCellName = createUniqueName(tpCellName.replace(" ","_"), spaceNames, 1)
324
- except:
325
- tpCellName = tpCellStory+"_SPACE_"+(str(spaceNumber+1))
319
+ tpCellName = Dictionary.ValueAtKey(tpDictionary,keyName, silent=True) or createUniqueName(tpCellStory+"_SPACE_"+(str(spaceNumber+1)), spaceNames, 1)
326
320
  if roomTypeKey:
327
321
  keyName = getKeyName(tpDictionary, roomTypeKey)
328
322
  try:
329
- tpCellProgramIdentifier = Dictionary.ValueAtKey(tpDictionary, keyName)
323
+ tpCellProgramIdentifier = Dictionary.ValueAtKey(tpDictionary, keyName, silent=True)
330
324
  if tpCellProgramIdentifier:
331
325
  program = prog_type_lib.program_type_by_identifier(tpCellProgramIdentifier)
332
326
  elif defaultProgramIdentifier:
@@ -335,7 +329,7 @@ class Honeybee:
335
329
  program = prog_type_lib.office_program #Default Office Program as a last resort
336
330
  keyName = getKeyName(tpDictionary, 'construction_set')
337
331
  try:
338
- tpCellConstructionSetIdentifier = Dictionary.ValueAtKey(tpDictionary, keyName)
332
+ tpCellConstructionSetIdentifier = Dictionary.ValueAtKey(tpDictionary, keyName, silent=True)
339
333
  if tpCellConstructionSetIdentifier:
340
334
  constr_set = constr_set_lib.construction_set_by_identifier(tpCellConstructionSetIdentifier)
341
335
  elif defaultConstructionSetIdentifier:
@@ -344,7 +338,7 @@ class Honeybee:
344
338
  constr_set = constr_set_lib.construction_set_by_identifier("Default Generic Construction Set")
345
339
  else:
346
340
  tpCellStory = fl[spaceNumber]
347
- tpCellName = tpCellStory+"_SPACE_"+(str(spaceNumber+1))
341
+ tpCellName = str(tpCellStory)+"_SPACE_"+(str(spaceNumber+1))
348
342
  program = prog_type_lib.office_program
349
343
  constr_set = constr_set_lib.construction_set_by_identifier("Default Generic Construction Set")
350
344
  spaceNames.append(tpCellName)
@@ -366,7 +360,7 @@ class Honeybee:
366
360
  tpFaceApertureDictionary = Topology.Dictionary(apertureTopology)
367
361
  if tpFaceApertureDictionary:
368
362
  apertureKeyName = getKeyName(tpFaceApertureDictionary, apertureTypeKey)
369
- tpFaceApertureType = Dictionary.ValueAtKey(tpFaceApertureDictionary,apertureKeyName)
363
+ tpFaceApertureType = Dictionary.ValueAtKey(tpFaceApertureDictionary,apertureKeyName, silent=True)
370
364
  hbFaceAperturePoints = []
371
365
  tpFaceApertureVertices = []
372
366
  tpFaceApertureVertices = Topology.Vertices(Face.ExternalBoundary(apertureTopology))
@@ -383,7 +377,7 @@ class Honeybee:
383
377
  else:
384
378
  tpFaceDictionary = Topology.Dictionary(tpCellFace)
385
379
  if (abs(tpCellFaceNormal[2]) < 1e-6) and tpFaceDictionary: #It is a mostly vertical wall and has a dictionary
386
- apertureRatio = Dictionary.ValueAtKey(tpFaceDictionary,'apertureRatio')
380
+ apertureRatio = Dictionary.ValueAtKey(tpFaceDictionary,'apertureRatio', silent=True)
387
381
  if apertureRatio:
388
382
  hbRoomFace.apertures_by_ratio(apertureRatio, tolerance=0.01)
389
383
  fType = honeybee.facetype.get_type_from_normal(Vector3D(tpCellFaceNormal[0],tpCellFaceNormal[1],tpCellFaceNormal[2]), roof_angle=30, floor_angle=150)
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.13'
1
+ __version__ = '0.8.15'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: topologicpy
3
- Version: 0.8.13
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,8 +1,8 @@
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=Wwr2RsNEagfdt4Uz0GYosRTgNQj0pc5NOlzEWbL7cjQ,114343
5
- topologicpy/CellComplex.py,sha256=23bO0RYFIg6MOyt3PMFayaK523Alt8aHhc6UyJO02X0,51610
4
+ topologicpy/Cell.py,sha256=BN6hjYpN6Fse0mn7d7oHh65D7c6Mt1Yu7iK3lEp_Cj0,118262
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
8
8
  topologicpy/Context.py,sha256=ppApYKngZZCQBFWaxIMi2z2dokY23c935IDCBosxDAE,3055
@@ -14,8 +14,8 @@ topologicpy/Face.py,sha256=tn3PI-t9rXikgI1QMclw0PFwQ5vvyLi-wJKqZZZ9xmw,182755
14
14
  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
- topologicpy/Honeybee.py,sha256=Y_El6M8x3ixvvIe_VcRiwj_4C89ZZg5_WlT7adbCkpw,21849
18
- topologicpy/Matrix.py,sha256=mqcCk14kM9OOwJPwd9ce-8SFM0IxS3jYb2XpWhVjUAc,19503
17
+ topologicpy/Honeybee.py,sha256=uDVtDbloydNoaBFcSNukKL_2PLyD6XKkCp1VHz1jtaU,21751
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=XjaqL6H5ZzfJyu62UXI4UhwezcxfWWIh4nGQ9YuybtM,23
32
- topologicpy-0.8.13.dist-info/LICENSE,sha256=FK0vJ73LuE8PYJAn7LutsReWR47-Ooovw2dnRe5yV6Q,681
33
- topologicpy-0.8.13.dist-info/METADATA,sha256=5SZpCgIN0s9DGq8P0heNOhibtizlRvUZIb2fP0gJAtE,10513
34
- topologicpy-0.8.13.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
35
- topologicpy-0.8.13.dist-info/top_level.txt,sha256=J30bDzW92Ob7hw3zA8V34Jlp-vvsfIkGzkr8sqvb4Uw,12
36
- topologicpy-0.8.13.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,,