topologicpy 0.7.43__py3-none-any.whl → 0.7.44__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.
@@ -20,7 +20,7 @@ import math
20
20
  from collections import OrderedDict
21
21
  import os
22
22
  from os.path import exists
23
- from datetime import datetime
23
+ from datetime import datetime, timezone
24
24
  import warnings
25
25
 
26
26
  try:
@@ -249,18 +249,24 @@ class EnergyModel:
249
249
  weatherFilePath = os.path.join(os.path.dirname(os.path.realpath(__file__)), "assets", "EnergyModel", "GBR_London.Gatwick.037760_IWEC.epw")
250
250
  designDayFilePath = os.path.join(os.path.dirname(os.path.realpath(__file__)), "assets", "EnergyModel", "GBR_London.Gatwick.037760_IWEC.ddy")
251
251
  translator = openstudio.osversion.VersionTranslator()
252
- osmFile = openstudio.openstudioutilitiescore.toPath(osModelPath)
253
- osModel = translator.loadModel(osmFile)
252
+ # DEBUGGING
253
+ #osmFile = openstudio.openstudioutilitiescore.toPath(osModelPath)
254
+ #osModel = translator.loadModel(osmFile)
255
+ osModel = translator.loadModel(osModelPath)
254
256
  if osModel.isNull():
255
257
  print("EnergyModel.ByTopology - Error: The openstudio model is null. Returning None.")
256
258
  return None
257
259
  else:
258
260
  osModel = osModel.get()
259
- osEPWFile = openstudio.openstudioutilitiesfiletypes.EpwFile.load(openstudio.toPath(weatherFilePath))
261
+ # DEBUGGING
262
+ #osEPWFile = openstudio.openstudioutilitiesfiletypes.EpwFile.load(openstudio.toPath(weatherFilePath))
263
+ osEPWFile = openstudio.openstudioutilitiesfiletypes.EpwFile.load(weatherFilePath)
260
264
  if osEPWFile.is_initialized():
261
265
  osEPWFile = osEPWFile.get()
262
266
  openstudio.model.WeatherFile.setWeatherFile(osModel, osEPWFile)
263
- ddyModel = openstudio.openstudioenergyplus.loadAndTranslateIdf(openstudio.toPath(designDayFilePath))
267
+ # DEBUGGING
268
+ #ddyModel = openstudio.openstudioenergyplus.loadAndTranslateIdf(openstudio.toPath(designDayFilePath))
269
+ ddyModel = openstudio.openstudioenergyplus.loadAndTranslateIdf(designDayFilePath)
264
270
  if ddyModel.is_initialized():
265
271
  ddyModel = ddyModel.get()
266
272
  for ddy in ddyModel.getObjectsByType(openstudio.IddObjectType("OS:SizingPeriod:DesignDay")):
@@ -578,8 +584,9 @@ class EnergyModel:
578
584
  if not overwrite and exists(path):
579
585
  print("EnergyModel.ExportToGBXML - Error: a file already exists at the specified path and overwrite is set to False. Returning None.")
580
586
  return None
581
-
582
- return openstudio.gbxml.GbXMLForwardTranslator().modelToGbXML(model, openstudio.openstudioutilitiescore.toPath(path))
587
+ # DEBUGGING
588
+ #return openstudio.gbxml.GbXMLForwardTranslator().modelToGbXML(model, openstudio.openstudioutilitiescore.toPath(path))
589
+ return openstudio.gbxml.GbXMLForwardTranslator().modelToGbXML(model, path)
583
590
 
584
591
 
585
592
  @staticmethod
@@ -629,8 +636,10 @@ class EnergyModel:
629
636
  print("EnergyModel.ExportToOSM - Error: a file already exists at the specified path and overwrite is set to False. Returning None.")
630
637
  return None
631
638
  osCondition = False
632
- osPath = openstudio.openstudioutilitiescore.toPath(path)
633
- osCondition = model.save(osPath, overwrite)
639
+ # DEBUGGING
640
+ #osPath = openstudio.openstudioutilitiescore.toPath(path)
641
+ #osCondition = model.save(osPath, overwrite)
642
+ osCondition = model.save(path, overwrite)
634
643
  return osCondition
635
644
 
636
645
  @staticmethod
@@ -821,7 +830,7 @@ class EnergyModel:
821
830
  if removeFiles:
822
831
  deleteOldFiles(outputFolder)
823
832
  pbar = tqdm(desc='Running Simulation', total=100, leave=False)
824
- utcnow = datetime.utcnow()
833
+ utcnow = datetime.now(timezone.utc)
825
834
  timestamp = utcnow.strftime("UTC-%Y-%m-%d-%H-%M-%S")
826
835
  if not outputFolder:
827
836
  home = os.path.expanduser('~')
@@ -831,28 +840,32 @@ class EnergyModel:
831
840
  os.mkdir(outputFolder)
832
841
  pbar.update(10)
833
842
  osmPath = os.path.join(outputFolder, model.getBuilding().name().get() + ".osm")
834
- model.save(openstudio.openstudioutilitiescore.toPath(osmPath), True)
843
+ # DEBUGGING
844
+ #model.save(openstudio.openstudioutilitiescore.toPath(osmPath), True)
845
+ model.save(osmPath, True)
835
846
  oswPath = os.path.join(outputFolder, model.getBuilding().name().get() + ".osw")
836
847
  pbar.update(20)
837
- #print("oswPath = "+oswPath)
838
848
  workflow = model.workflowJSON()
839
- workflow.setSeedFile(openstudio.openstudioutilitiescore.toPath(osmPath))
849
+ # DEBUGGING
850
+ #workflow.setSeedFile(openstudio.openstudioutilitiescore.toPath(osmPath))
851
+ workflow.setSeedFile(osmPath)
840
852
  pbar.update(30)
841
- #print("Seed File Set")
842
- workflow.setWeatherFile(openstudio.openstudioutilitiescore.toPath(weatherFilePath))
853
+ # DEBUGGING
854
+ #workflow.setWeatherFile(openstudio.openstudioutilitiescore.toPath(weatherFilePath))
855
+ workflow.setWeatherFile(weatherFilePath)
843
856
  pbar.update(40)
844
- #print("Weather File Set")
845
- workflow.saveAs(openstudio.openstudioutilitiescore.toPath(oswPath))
857
+ # DEBUGGING
858
+ #workflow.saveAs(openstudio.openstudioutilitiescore.toPath(oswPath))
859
+ workflow.saveAs(oswPath)
846
860
  pbar.update(50)
847
- #print("OSW File Saved")
848
861
  cmd = osBinaryPath+" run -w " + "\"" + oswPath + "\""
849
862
  pbar.update(60)
850
863
  os.system(cmd)
851
- #print("Simulation DONE")
852
864
  sqlPath = os.path.join(os.path.join(outputFolder,"run"), "eplusout.sql")
853
865
  pbar.update(100)
854
- #print("sqlPath = "+sqlPath)
855
- osSqlFile = openstudio.SqlFile(openstudio.openstudioutilitiescore.toPath(sqlPath))
866
+ # DEBUGGING
867
+ #osSqlFile = openstudio.SqlFile(openstudio.openstudioutilitiescore.toPath(sqlPath))
868
+ osSqlFile = openstudio.SqlFile(sqlPath)
856
869
  model.setSqlFile(osSqlFile)
857
870
  pbar.close()
858
871
  return model
topologicpy/PyG.py CHANGED
@@ -30,11 +30,27 @@ from sklearn.metrics import accuracy_score
30
30
  from tqdm.auto import tqdm
31
31
  import gc
32
32
 
33
+ import torch
34
+ from torch.utils.data import Dataset
35
+
36
+ import torch
37
+ from torch.utils.data import Dataset
33
38
 
34
39
  class CustomGraphDataset(Dataset):
35
- def __init__(self, root, node_level=False, graph_level=True, node_attr_key='feat',
36
- edge_attr_key='feat', transform=None, pre_transform=None):
37
- super(CustomGraphDataset, self).__init__(root, transform, pre_transform)
40
+ def __init__(self, root=None, data_list=None, indices=None, node_level=False, graph_level=True,
41
+ node_attr_key='feat', edge_attr_key='feat'):
42
+ """
43
+ Initializes the CustomGraphDataset.
44
+
45
+ Parameters:
46
+ - root: Root directory of the dataset (used only if data_list is None)
47
+ - data_list: List of preprocessed data objects (used if provided)
48
+ - indices: List of indices to select a subset of the data
49
+ - node_level: Boolean flag indicating if the dataset is node-level
50
+ - graph_level: Boolean flag indicating if the dataset is graph-level
51
+ - node_attr_key: Key for node attributes
52
+ - edge_attr_key: Key for edge attributes
53
+ """
38
54
  assert not (node_level and graph_level), "Both node_level and graph_level cannot be True at the same time"
39
55
  assert node_level or graph_level, "Both node_level and graph_level cannot be False at the same time"
40
56
 
@@ -43,15 +59,20 @@ class CustomGraphDataset(Dataset):
43
59
  self.node_attr_key = node_attr_key
44
60
  self.edge_attr_key = edge_attr_key
45
61
 
46
- self.graph_df = pd.read_csv(os.path.join(root, 'graphs.csv'))
47
- self.nodes_df = pd.read_csv(os.path.join(root, 'nodes.csv'))
48
- self.edges_df = pd.read_csv(os.path.join(root, 'edges.csv'))
49
-
50
- self.data_list = self.process_all()
62
+ if data_list is not None:
63
+ self.data_list = data_list # Use the provided data list
64
+ elif root is not None:
65
+ # Load and process data from root directory if data_list is not provided
66
+ self.graph_df = pd.read_csv(os.path.join(root, 'graphs.csv'))
67
+ self.nodes_df = pd.read_csv(os.path.join(root, 'nodes.csv'))
68
+ self.edges_df = pd.read_csv(os.path.join(root, 'edges.csv'))
69
+ self.data_list = self.process_all()
70
+ else:
71
+ raise ValueError("Either a root directory or a data_list must be provided.")
51
72
 
52
- @property
53
- def raw_file_names(self):
54
- return ['graphs.csv', 'nodes.csv', 'edges.csv']
73
+ # Filter data_list based on indices if provided
74
+ if indices is not None:
75
+ self.data_list = [self.data_list[i] for i in indices]
55
76
 
56
77
  def process_all(self):
57
78
  data_list = []
@@ -73,12 +94,9 @@ class CustomGraphDataset(Dataset):
73
94
  else:
74
95
  edge_attr = None
75
96
 
76
-
77
-
78
97
  if self.graph_level:
79
98
  label_value = self.graph_df[self.graph_df['graph_id'] == graph_id]['label'].values[0]
80
99
 
81
- # Check if the label is an integer or a float and cast accordingly
82
100
  if isinstance(label_value, int):
83
101
  y = torch.tensor([label_value], dtype=torch.long)
84
102
  elif isinstance(label_value, float):
@@ -89,7 +107,6 @@ class CustomGraphDataset(Dataset):
89
107
  elif self.node_level:
90
108
  label_values = graph_nodes['label'].values
91
109
 
92
- # Check if the labels are integers or floats and cast accordingly
93
110
  if issubclass(label_values.dtype.type, int):
94
111
  y = torch.tensor(label_values, dtype=torch.long)
95
112
  elif issubclass(label_values.dtype.type, float):
@@ -97,12 +114,6 @@ class CustomGraphDataset(Dataset):
97
114
  else:
98
115
  raise ValueError(f"Unexpected label types: {label_values.dtype}. Expected int or float.")
99
116
 
100
-
101
- # if self.graph_level:
102
- # y = torch.tensor([self.graph_df[self.graph_df['graph_id'] == graph_id]['label'].values[0]], dtype=torch.long)
103
- # elif self.node_level:
104
- # y = torch.tensor(graph_nodes['label'].values, dtype=torch.long)
105
-
106
117
  data = Data(x=x, edge_index=edge_index, y=y)
107
118
  if edge_attr is not None:
108
119
  data.edge_attr = edge_attr
@@ -111,14 +122,103 @@ class CustomGraphDataset(Dataset):
111
122
 
112
123
  return data_list
113
124
 
114
- def len(self):
125
+ def __len__(self):
115
126
  return len(self.data_list)
116
127
 
117
- def get(self, idx):
128
+ def __getitem__(self, idx):
118
129
  return self.data_list[idx]
119
130
 
120
- def __getitem__(self, idx):
121
- return self.get(idx)
131
+
132
+
133
+
134
+ # class CustomGraphDataset(Dataset):
135
+ # def __init__(self, root, node_level=False, graph_level=True, node_attr_key='feat',
136
+ # edge_attr_key='feat', transform=None, pre_transform=None):
137
+ # super(CustomGraphDataset, self).__init__(root, transform, pre_transform)
138
+ # assert not (node_level and graph_level), "Both node_level and graph_level cannot be True at the same time"
139
+ # assert node_level or graph_level, "Both node_level and graph_level cannot be False at the same time"
140
+
141
+ # self.node_level = node_level
142
+ # self.graph_level = graph_level
143
+ # self.node_attr_key = node_attr_key
144
+ # self.edge_attr_key = edge_attr_key
145
+
146
+ # self.graph_df = pd.read_csv(os.path.join(root, 'graphs.csv'))
147
+ # self.nodes_df = pd.read_csv(os.path.join(root, 'nodes.csv'))
148
+ # self.edges_df = pd.read_csv(os.path.join(root, 'edges.csv'))
149
+
150
+ # self.data_list = self.process_all()
151
+
152
+ # @property
153
+ # def raw_file_names(self):
154
+ # return ['graphs.csv', 'nodes.csv', 'edges.csv']
155
+
156
+ # def process_all(self):
157
+ # data_list = []
158
+ # for graph_id in self.graph_df['graph_id'].unique():
159
+ # graph_nodes = self.nodes_df[self.nodes_df['graph_id'] == graph_id]
160
+ # graph_edges = self.edges_df[self.edges_df['graph_id'] == graph_id]
161
+
162
+ # if self.node_attr_key in graph_nodes.columns and not graph_nodes[self.node_attr_key].isnull().all():
163
+ # x = torch.tensor(graph_nodes[self.node_attr_key].values.tolist(), dtype=torch.float)
164
+ # if x.ndim == 1:
165
+ # x = x.unsqueeze(1) # Ensure x has shape [num_nodes, *]
166
+ # else:
167
+ # x = None
168
+
169
+ # edge_index = torch.tensor(graph_edges[['src_id', 'dst_id']].values.T, dtype=torch.long)
170
+
171
+ # if self.edge_attr_key in graph_edges.columns and not graph_edges[self.edge_attr_key].isnull().all():
172
+ # edge_attr = torch.tensor(graph_edges[self.edge_attr_key].values.tolist(), dtype=torch.float)
173
+ # else:
174
+ # edge_attr = None
175
+
176
+
177
+
178
+ # if self.graph_level:
179
+ # label_value = self.graph_df[self.graph_df['graph_id'] == graph_id]['label'].values[0]
180
+
181
+ # # Check if the label is an integer or a float and cast accordingly
182
+ # if isinstance(label_value, int):
183
+ # y = torch.tensor([label_value], dtype=torch.long)
184
+ # elif isinstance(label_value, float):
185
+ # y = torch.tensor([label_value], dtype=torch.float)
186
+ # else:
187
+ # raise ValueError(f"Unexpected label type: {type(label_value)}. Expected int or float.")
188
+
189
+ # elif self.node_level:
190
+ # label_values = graph_nodes['label'].values
191
+
192
+ # # Check if the labels are integers or floats and cast accordingly
193
+ # if issubclass(label_values.dtype.type, int):
194
+ # y = torch.tensor(label_values, dtype=torch.long)
195
+ # elif issubclass(label_values.dtype.type, float):
196
+ # y = torch.tensor(label_values, dtype=torch.float)
197
+ # else:
198
+ # raise ValueError(f"Unexpected label types: {label_values.dtype}. Expected int or float.")
199
+
200
+
201
+ # # if self.graph_level:
202
+ # # y = torch.tensor([self.graph_df[self.graph_df['graph_id'] == graph_id]['label'].values[0]], dtype=torch.long)
203
+ # # elif self.node_level:
204
+ # # y = torch.tensor(graph_nodes['label'].values, dtype=torch.long)
205
+
206
+ # data = Data(x=x, edge_index=edge_index, y=y)
207
+ # if edge_attr is not None:
208
+ # data.edge_attr = edge_attr
209
+
210
+ # data_list.append(data)
211
+
212
+ # return data_list
213
+
214
+ # def len(self):
215
+ # return len(self.data_list)
216
+
217
+ # def get(self, idx):
218
+ # return self.data_list[idx]
219
+
220
+ # def __getitem__(self, idx):
221
+ # return self.get(idx)
122
222
 
123
223
  class _Hparams:
124
224
  def __init__(self, model_type="ClassifierHoldout", optimizer_str="Adam", amsgrad=False, betas=(0.9, 0.999), eps=1e-6, lr=0.001, lr_decay= 0, maximize=False, rho=0.9, weight_decay=0, cv_type="Holdout", split=[0.8,0.1, 0.1], k_folds=5, hl_widths=[32], conv_layer_type='SAGEConv', pooling="AvgPooling", batch_size=32, epochs=1,
@@ -375,7 +475,8 @@ class _GraphRegressorKFold:
375
475
 
376
476
  def _initialize_model(self, hparams, dataset):
377
477
  if hparams.conv_layer_type.lower() == 'sageconv':
378
- return _SAGEConv(dataset.num_node_features, hparams.hl_widths, 1, hparams.pooling).to(self.device)
478
+ return _SAGEConv(dataset[0].num_node_features, hparams.hl_widths, 1, hparams.pooling).to(self.device)
479
+ #return _SAGEConv(dataset.num_node_features, hparams.hl_widths, 1, hparams.pooling).to(self.device)
379
480
  else:
380
481
  raise NotImplementedError
381
482
 
@@ -1485,7 +1586,7 @@ class PyG:
1485
1586
  """
1486
1587
 
1487
1588
  import torch
1488
- from torch.utils.data import random_split, Subset
1589
+ from torch.utils.data import random_split
1489
1590
  train_ratio, val_ratio, test_ratio = split
1490
1591
  assert abs(train_ratio + val_ratio + test_ratio - 1.0) < 1e-6, "Ratios must add up to 1."
1491
1592
 
@@ -1506,9 +1607,10 @@ class PyG:
1506
1607
  val_indices = indices[train_len:train_len + val_len]
1507
1608
  test_indices = indices[train_len + val_len:train_len + val_len + test_len]
1508
1609
 
1509
- train_dataset = Subset(dataset, train_indices)
1510
- val_dataset = Subset(dataset, val_indices)
1511
- test_dataset = Subset(dataset, test_indices)
1610
+ # Create new instances of CustomGraphDataset using the indices
1611
+ train_dataset = CustomGraphDataset(data_list=dataset.data_list, indices=train_indices)
1612
+ val_dataset = CustomGraphDataset(data_list=dataset.data_list, indices=val_indices)
1613
+ test_dataset = CustomGraphDataset(data_list=dataset.data_list, indices=test_indices)
1512
1614
 
1513
1615
  return train_dataset, val_dataset, test_dataset
1514
1616
 
topologicpy/Topology.py CHANGED
@@ -2627,6 +2627,7 @@ class Topology():
2627
2627
  if ap != None:
2628
2628
  apertures.append(ap)
2629
2629
  context = Context.ByTopologyParameters(topology, u=0.5, v=0.5, w=0.5)
2630
+
2630
2631
  for ap in apertures:
2631
2632
  _ = Aperture.ByTopologyContext(ap, context)
2632
2633
  return topology
@@ -6308,7 +6309,7 @@ class Topology():
6308
6309
  rot_vertices = [Vertex.ByCoordinates(rot_v) for rot_v in rot_vertices]
6309
6310
  new_topology = Topology.ReplaceVertices(topology, verticesA=Topology.Vertices(topology), verticesB=rot_vertices)
6310
6311
  new_topology = Topology.SelfMerge(new_topology, tolerance=tolerance)
6311
- if len(Dictionary.Keys(d) > 0):
6312
+ if len(Dictionary.Keys(d)) > 0:
6312
6313
  new_topology = Topology.SetDictionary(new_topology, d)
6313
6314
  return new_topology
6314
6315
  if len(Dictionary.Keys(d)) > 0:
@@ -7875,7 +7876,6 @@ class Topology():
7875
7876
  if Topology.IsInstance(topology, "Cell"):
7876
7877
  sinkCells = [topology]
7877
7878
  elif hidimSink >= Topology.TypeID("Cell"):
7878
- print("Transfering Dictionaries to Cells")
7879
7879
  sinkCells = Topology.Cells(topology)
7880
7880
  _ = Topology.TransferDictionaries(selectors, sinkCells, tolerance=tolerance, numWorkers=numWorkers)
7881
7881
  return topology
topologicpy/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = '0.7.43'
1
+ __version__ = '0.7.44'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: topologicpy
3
- Version: 0.7.43
3
+ Version: 0.7.44
4
4
  Summary: An Advanced Spatial Modelling and Analysis Software Library for Architecture, Engineering, and Construction.
5
5
  Author-email: Wassim Jabi <wassim.jabi@gmail.com>
6
6
  License: MIT License
@@ -8,7 +8,7 @@ topologicpy/Context.py,sha256=ppApYKngZZCQBFWaxIMi2z2dokY23c935IDCBosxDAE,3055
8
8
  topologicpy/DGL.py,sha256=Dd6O08D-vSxpjHYgKm45JpKiaeGvWlg1BRMzYMAXGNc,138991
9
9
  topologicpy/Dictionary.py,sha256=KqJ29YyE23Y3Xc6XmKLSCZXRfBvm-OEOxlMZ4dt-rfM,27094
10
10
  topologicpy/Edge.py,sha256=vhYHkobSLGSWV-oe2oJFFDobqFToDyb7s71yQ840AAA,65166
11
- topologicpy/EnergyModel.py,sha256=ni0H1JgvLl1-q90yK9Sm1qj5P1fTuidlimEIcwuj6qE,53287
11
+ topologicpy/EnergyModel.py,sha256=XcCP55VW5WHDIIKcURijmBOZEgNUDEn_V9h5EejkntA,53876
12
12
  topologicpy/Face.py,sha256=d1Im4ogxuaVmZyb6hgv5muwQwahLtGzOar_a3og1a_I,115376
13
13
  topologicpy/Graph.py,sha256=p3VoVH6yygNV2wwzpsi4tm6yOfwRbtmsbnsAu2opLjQ,393517
14
14
  topologicpy/Grid.py,sha256=3-sn7CHWGcXk18XCnHjsUttNJTWwmN63g_Insj__p04,18218
@@ -18,18 +18,18 @@ topologicpy/Matrix.py,sha256=umgR7An919-wGInXJ1wpqnoQ2jCPdyMe2rcWTZ16upk,8079
18
18
  topologicpy/Neo4j.py,sha256=YvtF7RYUMATEZ8iHwFwK_MOxEDyARby2DTI2CCK6-cI,19694
19
19
  topologicpy/Plotly.py,sha256=U6Lo7hyDoStRKQXqlhb2LM-rR_bfBulxetRT2wMBmhI,105391
20
20
  topologicpy/Polyskel.py,sha256=EFsuh2EwQJGPLiFUjvtXmAwdX-A4r_DxP5hF7Qd3PaU,19829
21
- topologicpy/PyG.py,sha256=Dd0fiEbM_KR-sEHKCodmURBFFvckB6j7x4oBcCC5Q2o,102171
21
+ topologicpy/PyG.py,sha256=0yeECsMz-dqhhZSv52s_xPCO_3BcEXUK7z1YFDN9qoo,106987
22
22
  topologicpy/Shell.py,sha256=NZyHYTvV0pXx18AoMbVs8y-7if8teETItv5ZOJq6gzE,84672
23
23
  topologicpy/Speckle.py,sha256=rUS6PCaxIjEF5_fUruxvMH47FMKg-ohcoU0qAUb-yNM,14267
24
24
  topologicpy/Sun.py,sha256=InnKtX8eKwtAgcScuABH6yp0ljmWh5m_fDR4-n3jJMY,36869
25
- topologicpy/Topology.py,sha256=5KGQ8jSiURMk9syoMLc3mrIONCfj_pfvCfHTKgPcLOM,366047
25
+ topologicpy/Topology.py,sha256=RFZPKx15qM53skLavdMwL_YnJkDIinOnz3CLAY5OsWE,366001
26
26
  topologicpy/Vector.py,sha256=WQQUbwrg7VKImtxuBUi2i-FRiPT77WlrzLP05gdXKM8,33079
27
27
  topologicpy/Vertex.py,sha256=EQdVYHmW85_pZdHZB3N8pEi0GiadCCkF3z_oqohA7B0,71161
28
28
  topologicpy/Wire.py,sha256=9EJE0Iq3nGz5X7Suy6xxjmuOpfV49By6WH98UAL_7m4,153532
29
29
  topologicpy/__init__.py,sha256=D7ky87CAQMiS2KE6YLvcTLkTgA2PY7rASe6Z23pjp9k,872
30
- topologicpy/version.py,sha256=7JOl9BjjPK0ib5M5rAuj9I5xjEoYF6YsFAS_dvAYEzg,23
31
- topologicpy-0.7.43.dist-info/LICENSE,sha256=BRNw73R2WdDBICtwhI3wm3cxsaVqLTAGuRwrTltcfxs,1068
32
- topologicpy-0.7.43.dist-info/METADATA,sha256=NCprd1lCZf1afHBHxA5uol5btFYvJFZeiIdoIJtQ5aI,10916
33
- topologicpy-0.7.43.dist-info/WHEEL,sha256=HiCZjzuy6Dw0hdX5R3LCFPDmFS4BWl8H-8W39XfmgX4,91
34
- topologicpy-0.7.43.dist-info/top_level.txt,sha256=J30bDzW92Ob7hw3zA8V34Jlp-vvsfIkGzkr8sqvb4Uw,12
35
- topologicpy-0.7.43.dist-info/RECORD,,
30
+ topologicpy/version.py,sha256=2Sw5dX1m7XzP13Ernw7oNdPR5WsUzOMJ7VZ-QyJpf9o,23
31
+ topologicpy-0.7.44.dist-info/LICENSE,sha256=BRNw73R2WdDBICtwhI3wm3cxsaVqLTAGuRwrTltcfxs,1068
32
+ topologicpy-0.7.44.dist-info/METADATA,sha256=N7KPudecCpJl9CdmpNEfoLiXYGpxcXZwegs6AvC1HTo,10916
33
+ topologicpy-0.7.44.dist-info/WHEEL,sha256=HiCZjzuy6Dw0hdX5R3LCFPDmFS4BWl8H-8W39XfmgX4,91
34
+ topologicpy-0.7.44.dist-info/top_level.txt,sha256=J30bDzW92Ob7hw3zA8V34Jlp-vvsfIkGzkr8sqvb4Uw,12
35
+ topologicpy-0.7.44.dist-info/RECORD,,