topologicpy 0.8.30__py3-none-any.whl → 0.8.33__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
@@ -301,7 +301,7 @@ class Cell():
301
301
 
302
302
  @staticmethod
303
303
  def ByThickenedFace(face, thickness: float = 1.0, bothSides: bool = True, reverse: bool = False,
304
- planarize: bool = False, tolerance: float = 0.0001):
304
+ planarize: bool = False, tolerance: float = 0.0001, silent: bool = False):
305
305
  """
306
306
  Creates a cell by thickening the input face.
307
307
 
@@ -319,6 +319,8 @@ class Cell():
319
319
  If set to True, the input faces of the input shell are planarized before building the cell. Otherwise, they are not. The default is False.
320
320
  tolerance : float , optional
321
321
  The desired tolerance. The default is 0.0001.
322
+ silent : bool , optional
323
+ If set to True, no error and warning messages are printed. Otherwise, they are. The default is False.
322
324
 
323
325
  Returns
324
326
  -------
@@ -348,15 +350,15 @@ class Cell():
348
350
  bottomEdges = Topology.Edges(bottomFace)
349
351
  for bottomEdge in bottomEdges:
350
352
  topEdge = Topology.Translate(bottomEdge, faceNormal[0]*thickness, faceNormal[1]*thickness, faceNormal[2]*thickness)
351
- sideEdge1 = Edge.ByVertices([Edge.StartVertex(bottomEdge), Edge.StartVertex(topEdge)], tolerance=tolerance, silent=True)
352
- sideEdge2 = Edge.ByVertices([Edge.EndVertex(bottomEdge), Edge.EndVertex(topEdge)], tolerance=tolerance, silent=True)
353
+ sideEdge1 = Edge.ByVertices([Edge.StartVertex(bottomEdge), Edge.StartVertex(topEdge)], tolerance=tolerance, silent=silent)
354
+ sideEdge2 = Edge.ByVertices([Edge.EndVertex(bottomEdge), Edge.EndVertex(topEdge)], tolerance=tolerance, silent=silent)
353
355
  cellWire = Topology.SelfMerge(Cluster.ByTopologies([bottomEdge, sideEdge1, topEdge, sideEdge2]), tolerance=tolerance)
354
356
  cellFaces.append(Face.ByWire(cellWire, tolerance=tolerance))
355
357
  return Cell.ByFaces(cellFaces, planarize=planarize, tolerance=tolerance)
356
358
 
357
359
  @staticmethod
358
360
  def ByThickenedShell(shell, direction: list = [0, 0, 1], thickness: float = 1.0, bothSides: bool = True, reverse: bool = False,
359
- planarize: bool = False, tolerance: float = 0.0001):
361
+ planarize: bool = False, tolerance: float = 0.0001, silent: bool = False):
360
362
  """
361
363
  Creates a cell by thickening the input shell. The shell must be open.
362
364
 
@@ -374,6 +376,8 @@ class Cell():
374
376
  If set to True, the input faces of the input shell are planarized before building the cell. Otherwise, they are not. The default is False.
375
377
  tolerance : float , optional
376
378
  The desired tolerance. The default is 0.0001.
379
+ silent : bool , optional
380
+ If set to True, no error and warning messages are printed. Otherwise, they are. The default is False.
377
381
 
378
382
  Returns
379
383
  -------
@@ -388,7 +392,8 @@ class Cell():
388
392
  from topologicpy.Cluster import Cluster
389
393
  from topologicpy.Topology import Topology
390
394
  if not Topology.IsInstance(shell, "Shell"):
391
- print("Cell.ByThickenedShell - Error: The input shell parameter is not a valid topologic Shell. Returning None.")
395
+ if not silent:
396
+ print("Cell.ByThickenedShell - Error: The input shell parameter is not a valid topologic Shell. Returning None.")
392
397
  return None
393
398
  if reverse == True and bothSides == False:
394
399
  thickness = -thickness
@@ -403,8 +408,8 @@ class Cell():
403
408
  bottomEdges = Wire.Edges(bottomWire)
404
409
  for bottomEdge in bottomEdges:
405
410
  topEdge = Topology.Translate(bottomEdge, direction[0]*thickness, direction[1]*thickness, direction[2]*thickness)
406
- sideEdge1 = Edge.ByVertices([Edge.StartVertex(bottomEdge), Edge.StartVertex(topEdge)], tolerance=tolerance, silent=True)
407
- sideEdge2 = Edge.ByVertices([Edge.EndVertex(bottomEdge), Edge.EndVertex(topEdge)], tolerance=tolerance, silent=True)
411
+ sideEdge1 = Edge.ByVertices([Edge.StartVertex(bottomEdge), Edge.StartVertex(topEdge)], tolerance=tolerance, silent=silent)
412
+ sideEdge2 = Edge.ByVertices([Edge.EndVertex(bottomEdge), Edge.EndVertex(topEdge)], tolerance=tolerance, silent=silent)
408
413
  cellWire = Topology.SelfMerge(Cluster.ByTopologies([bottomEdge, sideEdge1, topEdge, sideEdge2]), tolerance=tolerance)
409
414
  cellFace = Face.ByWire(cellWire, tolerance=tolerance)
410
415
  cellFaces.append(cellFace)
@@ -643,6 +648,80 @@ class Cell():
643
648
  capsule = Topology.Place(capsule, originA=Vertex.Origin(), originB=origin)
644
649
  return capsule
645
650
 
651
+ @staticmethod
652
+ def CHS(origin= None, radius: float = 1.0, height: float = 1.0, thickness: float = 0.25, sides: int = 16, direction: list = [0, 0, 1], placement: str = "center", tolerance: float = 0.0001, silent: bool = False):
653
+ """
654
+ Creates a circular hollow section (CHS).
655
+
656
+ Parameters
657
+ ----------
658
+ origin : topologic_core.Vertex, optional
659
+ The location of the origin of the CHS. The default is None which results in the CHS being placed at (0, 0, 0).
660
+ radius : float , optional
661
+ The outer radius of the CHS. The default is 1.0.
662
+ thickness : float , optional
663
+ The thickness of the CHS. The default is 0.25.
664
+ height : float , optional
665
+ The height of the CHS. The default is 1.0.
666
+ sides : int , optional
667
+ The desired number of sides of the CSH. The default is 16.
668
+ direction : list , optional
669
+ The vector representing the up direction of the RHS. The default is [0, 0, 1].
670
+ placement : str , optional
671
+ The description of the placement of the origin of the RHS. This can be "center", "bottom", "top", "lowerleft", "upperleft", "lowerright", "upperright". It is case insensitive. The default is "center".
672
+ tolerance : float , optional
673
+ The desired tolerance. The default is 0.0001.
674
+ silent : bool , optional
675
+ If set to True, no error and warning messages are printed. Otherwise, they are. The default is False.
676
+
677
+ Returns
678
+ -------
679
+ topologic_core.Cell
680
+ The created cell.
681
+
682
+ """
683
+ from topologicpy.Vertex import Vertex
684
+ from topologicpy.Face import Face
685
+ from topologicpy.Topology import Topology
686
+
687
+ if 2*thickness >= radius:
688
+ if not silent:
689
+ print("Cell.CHS - Error: Twice the thickness value is larger than or equal to the width value. Returning None.")
690
+ return None
691
+ if origin == None:
692
+ origin = Vertex.Origin()
693
+ bottom_face = Face.CHS(origin = Vertex.Origin(),radius=radius, thickness=thickness, sides=sides, direction=[0,0,1], placement="center", tolerance=tolerance, silent=silent)
694
+ return_cell = Cell.ByThickenedFace(bottom_face, thickness=height, bothSides=True, reverse=False,
695
+ planarize = False, tolerance=tolerance, silent=silent)
696
+ xOffset = 0
697
+ yOffset = 0
698
+ zOffset = 0
699
+ if placement.lower() == "bottom":
700
+ zOffset = height*0.5
701
+ elif placement.lower() == "top":
702
+ zOffset = -height*0.5
703
+ elif placement.lower() == "lowerleft":
704
+ xOffset = radius
705
+ yOffset = radius
706
+ zOffset = height*0.5
707
+ elif placement.lower() == "upperleft":
708
+ xOffset = radius
709
+ yOffset = -radius
710
+ zOffset = -height*0.5
711
+ elif placement.lower() == "lowerright":
712
+ xOffset = -radius
713
+ yOffset = radius
714
+ zOffset = height*0.5
715
+ elif placement.lower() == "upperright":
716
+ xOffset = -radius
717
+ yOffset = -radius
718
+ zOffset = -height*0.5
719
+ return_cell = Topology.Translate(return_cell, x=xOffset, y=yOffset, z=zOffset)
720
+ return_cell = Topology.Place(return_cell, originA=Vertex.Origin(), originB=origin)
721
+ if direction != [0, 0, 1]:
722
+ return_cell = Topology.Orient(return_cell, origin=origin, dirA=[0, 0, 1], dirB=direction)
723
+ return return_cell
724
+
646
725
  @staticmethod
647
726
  def Compactness(cell, reference = "sphere", mantissa: int = 6) -> float:
648
727
  """
@@ -849,7 +928,357 @@ class Cell():
849
928
  except:
850
929
  print("Cell.ContainmentStatus - Error: Could not determine containment status. Returning None.")
851
930
  return None
852
-
931
+
932
+ @staticmethod
933
+ def CrossShape(origin=None,
934
+ width=1,
935
+ length=1,
936
+ height=1,
937
+ a=0.25,
938
+ b=0.25,
939
+ c=None,
940
+ d=None,
941
+ flipHorizontal = False,
942
+ flipVertical = False,
943
+ direction=[0,0,1],
944
+ placement="center",
945
+ tolerance=0.0001,
946
+ silent=False):
947
+ """
948
+ Creates a Cross-shape.
949
+
950
+ Parameters
951
+ ----------
952
+ origin : topologic_core.Vertex , optional
953
+ The location of the origin of the T-shape. The default is None which results in the Cross-shape being placed at (0, 0, 0).
954
+ width : float , optional
955
+ The overall width of the Cross-shape. The default is 1.0.
956
+ length : float , optional
957
+ The overall length of the Cross-shape. The default is 1.0.
958
+ height : float , optional
959
+ The overall height of the C-shape. The default is 1.0.
960
+ a : float , optional
961
+ The hortizontal thickness of the vertical arm of the Cross-shape. The default is 0.25.
962
+ b : float , optional
963
+ The vertical thickness of the horizontal arm of the Cross-shape. The default is 0.25.
964
+ c : float , optional
965
+ The distance of the vertical symmetry axis measured from the left side of the Cross-shape. The default is None which results in the Cross-shape being symmetrical on the Y-axis.
966
+ d : float , optional
967
+ The distance of the horizontal symmetry axis measured from the bottom side of the Cross-shape. The default is None which results in the Cross-shape being symmetrical on the X-axis.
968
+ direction : list , optional
969
+ The vector representing the up direction of the Cross-shape. The default is [0, 0, 1].
970
+ placement : str , optional
971
+ The description of the placement of the origin of the Cross-shape. This can be "center", "lowerleft", "upperleft", "lowerright", "upperright". It is case insensitive. The default is "center".
972
+ tolerance : float , optional
973
+ The desired tolerance. The default is 0.0001.
974
+ silent : bool , optional
975
+ If set to True, no error and warning messages are printed. Otherwise, they are. The default is False.
976
+
977
+ Returns
978
+ -------
979
+ topologic_core.Cell
980
+ The created Cross-shape cell.
981
+
982
+ """
983
+ from topologicpy.Vertex import Vertex
984
+ from topologicpy.Face import Face
985
+ from topologicpy.Topology import Topology
986
+
987
+ if not isinstance(width, int) and not isinstance(width, float):
988
+ if not silent:
989
+ print("Cell.CrossShape - Error: The width input parameter is not a valid number. Returning None.")
990
+ return None
991
+ if not isinstance(length, int) and not isinstance(length, float):
992
+ if not silent:
993
+ print("Cell.CrossShape - Error: The length input parameter is not a valid number. Returning None.")
994
+ return None
995
+ if not isinstance(a, int) and not isinstance(a, float):
996
+ if not silent:
997
+ print("Cell.CrossShape - Error: The a input parameter is not a valid number. Returning None.")
998
+ return None
999
+ if not isinstance(b, int) and not isinstance(b, float):
1000
+ if not silent:
1001
+ print("Cell.CrossShape - Error: The b input parameter is not a valid number. Returning None.")
1002
+ return None
1003
+ if c == None:
1004
+ c = width/2
1005
+ if d == None:
1006
+ d = length/2
1007
+ if not isinstance(c, int) and not isinstance(c, float):
1008
+ if not silent:
1009
+ print("Cell.CrossShape - Error: The c input parameter is not a valid number. Returning None.")
1010
+ return None
1011
+ if not isinstance(d, int) and not isinstance(d, float):
1012
+ if not silent:
1013
+ print("Cell.CrossShape - Error: The d input parameter is not a valid number. Returning None.")
1014
+ if width <= tolerance:
1015
+ if not silent:
1016
+ print("Cell.CrossShape - Error: The width input parameter must be a positive number greater than the tolerance input parameter. Returning None.")
1017
+ return None
1018
+ if length <= tolerance:
1019
+ if not silent:
1020
+ print("Cell.CrossShape - Error: The length input parameter must be a positive number greater than the tolerance input parameter. Returning None.")
1021
+ return None
1022
+ if a <= tolerance:
1023
+ if not silent:
1024
+ print("Cell.CrossShape - Error: The a input parameter must be a positive number greater than the tolerance input parameter. Returning None.")
1025
+ return None
1026
+ if b <= tolerance:
1027
+ if not silent:
1028
+ print("Cell.CrossShape - Error: The b input parameter must be a positive number greater than the tolerance input parameter. Returning None.")
1029
+ return None
1030
+ if c <= tolerance:
1031
+ if not silent:
1032
+ print("Cell.CrossShape - Error: The c input parameter must be a positive number greater than the tolerance input parameter. Returning None.")
1033
+ return None
1034
+ if d <= tolerance:
1035
+ if not silent:
1036
+ print("Cell.CrossShape - Error: The d input parameter must be a positive number greater than the tolerance input parameter. Returning None.")
1037
+ return None
1038
+ if a >= (width - tolerance*2):
1039
+ if not silent:
1040
+ print("Cell.CrossShape - Error: The a input parameter must be less than the width input parameter. Returning None.")
1041
+ return None
1042
+ if b >= (length - tolerance*2):
1043
+ if not silent:
1044
+ print("Cell.CrossShape - Error: The b input parameter must be less than the length input parameter. Returning None.")
1045
+ return None
1046
+ if c <= (tolerance + a/2):
1047
+ if not silent:
1048
+ print("Cell.CrossShape - Error: The c input parameter must be more than half the a input parameter. Returning None.")
1049
+ return None
1050
+ if d <= (tolerance + b/2):
1051
+ if not silent:
1052
+ print("Cell.CrossShape - Error: The c input parameter must be more than half the b input parameter. Returning None.")
1053
+ return None
1054
+ if c >= (width - tolerance - a/2):
1055
+ if not silent:
1056
+ print("Cell.CrossShape - Error: The c input parameter must be less than the width minus half the a input parameter. Returning None.")
1057
+ return None
1058
+ if d >= (length - tolerance - b/2):
1059
+ if not silent:
1060
+ print("Cell.CrossShape - Error: The c input parameter must be less than the width minus half the b input parameter. Returning None.")
1061
+ return None
1062
+ if origin == None:
1063
+ origin = Vertex.Origin()
1064
+ if not Topology.IsInstance(origin, "vertex"):
1065
+ if not silent:
1066
+ print("Cell.CrossShape - Error: The origin input parameter is not a valid topologic vertex. Returning None.")
1067
+ return None
1068
+ if not isinstance(direction, list):
1069
+ if not silent:
1070
+ print("Cell.CrossShape - Error: The direction input parameter is not a valid list. Returning None.")
1071
+ return None
1072
+ if not len(direction) == 3:
1073
+ if not silent:
1074
+ print("Cell.CrossShape - Error: The direction input parameter is not a valid vector. Returning None.")
1075
+ return None
1076
+ cross_shape_face = Face.CrossShape(origin=origin,
1077
+ width=width,
1078
+ length=length,
1079
+ a=a,
1080
+ b=b,
1081
+ c=c,
1082
+ d=d,
1083
+ flipHorizontal=flipHorizontal,
1084
+ flipVertical=flipVertical,
1085
+ direction=direction,
1086
+ placement=placement,
1087
+ tolerance=tolerance,
1088
+ silent=silent)
1089
+ return_cell = Cell.ByThickenedFace(cross_shape_face, thickness=height, bothSides=True, reverse=False,
1090
+ planarize = False, tolerance=tolerance, silent=silent)
1091
+ xOffset = 0
1092
+ yOffset = 0
1093
+ zOffset = 0
1094
+ if placement.lower() == "bottom":
1095
+ zOffset = height*0.5
1096
+ elif placement.lower() == "top":
1097
+ zOffset = -height*0.5
1098
+ elif placement.lower() == "lowerleft":
1099
+ xOffset = width*0.5
1100
+ yOffset = length*0.5
1101
+ zOffset = height*0.5
1102
+ elif placement.lower() == "upperleft":
1103
+ xOffset = width*0.5
1104
+ yOffset = -length*0.5
1105
+ zOffset = -height*0.5
1106
+ elif placement.lower() == "lowerright":
1107
+ xOffset = -width*0.5
1108
+ yOffset = length*0.5
1109
+ zOffset = height*0.5
1110
+ elif placement.lower() == "upperright":
1111
+ xOffset = -width*0.5
1112
+ yOffset = -length*0.5
1113
+ zOffset = -height*0.5
1114
+ return_cell = Topology.Translate(return_cell, x=xOffset, y=yOffset, z=zOffset)
1115
+ return_cell = Topology.Place(return_cell, originA=Vertex.Origin(), originB=origin)
1116
+ if direction != [0, 0, 1]:
1117
+ return_cell = Topology.Orient(return_cell, origin=origin, dirA=[0, 0, 1], dirB=direction)
1118
+ return return_cell
1119
+
1120
+ @staticmethod
1121
+ def CShape(origin=None,
1122
+ width=1,
1123
+ length=1,
1124
+ height=1,
1125
+ a=0.25,
1126
+ b=0.25,
1127
+ c=0.25,
1128
+ flipHorizontal = False,
1129
+ flipVertical = False,
1130
+ direction=[0,0,1],
1131
+ placement="center",
1132
+ tolerance=0.0001,
1133
+ silent=False):
1134
+ """
1135
+ Creates a C-shape.
1136
+
1137
+ Parameters
1138
+ ----------
1139
+ origin : topologic_core.Vertex , optional
1140
+ The location of the origin of the C-shape. The default is None which results in the C-shape being placed at (0, 0, 0).
1141
+ width : float , optional
1142
+ The overall width of the C-shape. The default is 1.0.
1143
+ length : float , optional
1144
+ The overall length of the C-shape. The default is 1.0.
1145
+ height : float , optional
1146
+ The overall height of the C-shape. The default is 1.0.
1147
+ a : float , optional
1148
+ The hortizontal thickness of the vertical arm of the C-shape. The default is 0.25.
1149
+ b : float , optional
1150
+ The vertical thickness of the bottom horizontal arm of the C-shape. The default is 0.25.
1151
+ c : float , optional
1152
+ The vertical thickness of the top horizontal arm of the C-shape. The default is 0.25.
1153
+ direction : list , optional
1154
+ The vector representing the up direction of the C-shape. The default is [0, 0, 1].
1155
+ placement : str , optional
1156
+ The description of the placement of the origin of the C-shape. This can be "center", "lowerleft", "upperleft", "lowerright", "upperright". It is case insensitive. The default is "center".
1157
+ tolerance : float , optional
1158
+ The desired tolerance. The default is 0.0001.
1159
+ silent : bool , optional
1160
+ If set to True, no error and warning messages are printed. Otherwise, they are. The default is False.
1161
+
1162
+ Returns
1163
+ -------
1164
+ topologic_core.Cell
1165
+ The created C-shape cell.
1166
+
1167
+ """
1168
+ from topologicpy.Vertex import Vertex
1169
+ from topologicpy.Face import Face
1170
+ from topologicpy.Topology import Topology
1171
+
1172
+ if not isinstance(width, int) and not isinstance(width, float):
1173
+ if not silent:
1174
+ print("Cell.CShape - Error: The width input parameter is not a valid number. Returning None.")
1175
+ return None
1176
+ if not isinstance(length, int) and not isinstance(length, float):
1177
+ if not silent:
1178
+ print("Cell.CShape - Error: The length input parameter is not a valid number. Returning None.")
1179
+ return None
1180
+ if not isinstance(height, int) and not isinstance(height, float):
1181
+ if not silent:
1182
+ print("Cell.CShape - Error: The height input parameter is not a valid number. Returning None.")
1183
+ return None
1184
+ if not isinstance(a, int) and not isinstance(a, float):
1185
+ if not silent:
1186
+ print("Cell.CShape - Error: The a input parameter is not a valid number. Returning None.")
1187
+ return None
1188
+ if not isinstance(b, int) and not isinstance(b, float):
1189
+ if not silent:
1190
+ print("Cell.CShape - Error: The b input parameter is not a valid number. Returning None.")
1191
+ return None
1192
+ if width <= tolerance:
1193
+ if not silent:
1194
+ print("Cell.CShape - Error: The width input parameter must be a positive number greater than the tolerance input parameter. Returning None.")
1195
+ return None
1196
+ if length <= tolerance:
1197
+ if not silent:
1198
+ print("Cell.CShape - Error: The length input parameter must be a positive number greater than the tolerance input parameter. Returning None.")
1199
+ return None
1200
+ if height <= tolerance:
1201
+ if not silent:
1202
+ print("Cell.CShape - Error: The height input parameter must be a positive number greater than the tolerance input parameter. Returning None.")
1203
+ return None
1204
+ if a <= tolerance:
1205
+ if not silent:
1206
+ print("Cell.CShape - Error: The a input parameter must be a positive number greater than the tolerance input parameter. Returning None.")
1207
+ return None
1208
+ if b <= tolerance:
1209
+ if not silent:
1210
+ print("Cell.CShape - Error: The b input parameter must be a positive number greater than the tolerance input parameter. Returning None.")
1211
+ return None
1212
+ if c <= tolerance:
1213
+ if not silent:
1214
+ print("Cell.CShape - Error: The c input parameter must be a positive number greater than the tolerance input parameter. Returning None.")
1215
+ return None
1216
+ if a >= (width - tolerance):
1217
+ if not silent:
1218
+ print("Cell.CShape - Error: The a input parameter must be less than the width input parameter. Returning None.")
1219
+ return None
1220
+ if b+c >= (length - tolerance):
1221
+ if not silent:
1222
+ print("Cell.CShape - Error: The b and c input parameters must add to less than the length input parameter. Returning None.")
1223
+ return None
1224
+ if origin == None:
1225
+ origin = Vertex.Origin()
1226
+ if not Topology.IsInstance(origin, "vertex"):
1227
+ if not silent:
1228
+ print("Cell.CShape - Error: The origin input parameter is not a valid topologic vertex. Returning None.")
1229
+ return None
1230
+ if not isinstance(direction, list):
1231
+ if not silent:
1232
+ print("Cell.CShape - Error: The direction input parameter is not a valid list. Returning None.")
1233
+ return None
1234
+ if not len(direction) == 3:
1235
+ if not silent:
1236
+ print("Cell.CShape - Error: The direction input parameter is not a valid vector. Returning None.")
1237
+ return None
1238
+ c_shape_face = Face.CShape(origin=origin,
1239
+ width=width,
1240
+ length=length,
1241
+ a=a,
1242
+ b=b,
1243
+ c=c,
1244
+ flipHorizontal=flipHorizontal,
1245
+ flipVertical=flipVertical,
1246
+ direction=[0,0,1],
1247
+ placement="center",
1248
+ tolerance=tolerance,
1249
+ silent=silent)
1250
+
1251
+ return_cell = Cell.ByThickenedFace(c_shape_face, thickness=height, bothSides=True, reverse=False,
1252
+ planarize = False, tolerance=tolerance, silent=silent)
1253
+ xOffset = 0
1254
+ yOffset = 0
1255
+ zOffset = 0
1256
+ if placement.lower() == "bottom":
1257
+ zOffset = height*0.5
1258
+ elif placement.lower() == "top":
1259
+ zOffset = -height*0.5
1260
+ elif placement.lower() == "lowerleft":
1261
+ xOffset = width*0.5
1262
+ yOffset = length*0.5
1263
+ zOffset = height*0.5
1264
+ elif placement.lower() == "upperleft":
1265
+ xOffset = width*0.5
1266
+ yOffset = -length*0.5
1267
+ zOffset = -height*0.5
1268
+ elif placement.lower() == "lowerright":
1269
+ xOffset = -width*0.5
1270
+ yOffset = length*0.5
1271
+ zOffset = height*0.5
1272
+ elif placement.lower() == "upperright":
1273
+ xOffset = -width*0.5
1274
+ yOffset = -length*0.5
1275
+ zOffset = -height*0.5
1276
+ return_cell = Topology.Translate(return_cell, x=xOffset, y=yOffset, z=zOffset)
1277
+ return_cell = Topology.Place(return_cell, originA=Vertex.Origin(), originB=origin)
1278
+ if direction != [0, 0, 1]:
1279
+ return_cell = Topology.Orient(return_cell, origin=origin, dirA=[0, 0, 1], dirB=direction)
1280
+ return return_cell
1281
+
853
1282
  @staticmethod
854
1283
  def Cube(origin = None,
855
1284
  size: float = 1,
@@ -1542,10 +1971,157 @@ class Cell():
1542
1971
  return None
1543
1972
 
1544
1973
  @staticmethod
1545
- def IsOnBoundary(cell, vertex, tolerance: float = 0.0001) -> bool:
1546
- """
1547
- Returns True if the input vertex is on the boundary of the input cell. Returns False otherwise.
1548
-
1974
+ def IShape(origin=None,
1975
+ width=1,
1976
+ length=1,
1977
+ height=1,
1978
+ a=0.25,
1979
+ b=0.25,
1980
+ c=0.25,
1981
+ flipHorizontal = False,
1982
+ flipVertical = False,
1983
+ direction=[0,0,1],
1984
+ placement="center",
1985
+ tolerance=0.0001,
1986
+ silent=False):
1987
+ """
1988
+ Creates an I-shape cell.
1989
+
1990
+ Parameters
1991
+ ----------
1992
+ origin : topologic_core.Vertex , optional
1993
+ The location of the origin of the I-shape. The default is None which results in the I-shape being placed at (0, 0, 0).
1994
+ width : float , optional
1995
+ The overall width of the I-shape. The default is 1.0.
1996
+ length : float , optional
1997
+ The overall length of the I-shape. The default is 1.0.
1998
+ a : float , optional
1999
+ The hortizontal thickness of the central vertical arm of the I-shape. The default is 0.25.
2000
+ b : float , optional
2001
+ The vertical thickness of the bottom horizontal arm of the I-shape. The default is 0.25.
2002
+ c : float , optional
2003
+ The vertical thickness of the top horizontal arm of the I-shape. The default is 0.25.
2004
+ direction : list , optional
2005
+ The vector representing the up direction of the I-shape. The default is [0, 0, 1].
2006
+ placement : str , optional
2007
+ The description of the placement of the origin of the I-shape. This can be "center", "bottom", "top", "lowerleft", "upperleft", "lowerright", "upperright". It is case insensitive. The default is "center".
2008
+ tolerance : float , optional
2009
+ The desired tolerance. The default is 0.0001.
2010
+ silent : bool , optional
2011
+ If set to True, no error and warning messages are printed. Otherwise, they are. The default is False.
2012
+
2013
+ Returns
2014
+ -------
2015
+ topologic_core.Cell
2016
+ The created I-shape cell.
2017
+
2018
+ """
2019
+ from topologicpy.Vertex import Vertex
2020
+ from topologicpy.Face import Face
2021
+ from topologicpy.Topology import Topology
2022
+
2023
+ if not isinstance(width, int) and not isinstance(width, float):
2024
+ if not silent:
2025
+ print("Cell.IShape - Error: The width input parameter is not a valid number. Returning None.")
2026
+ return None
2027
+ if not isinstance(length, int) and not isinstance(length, float):
2028
+ if not silent:
2029
+ print("Cell.IShape - Error: The length input parameter is not a valid number. Returning None.")
2030
+ return None
2031
+ if not isinstance(a, int) and not isinstance(a, float):
2032
+ if not silent:
2033
+ print("Cell.IShape - Error: The a input parameter is not a valid number. Returning None.")
2034
+ return None
2035
+ if not isinstance(b, int) and not isinstance(b, float):
2036
+ if not silent:
2037
+ print("Cell.IShape - Error: The b input parameter is not a valid number. Returning None.")
2038
+ return None
2039
+ if width <= tolerance:
2040
+ if not silent:
2041
+ print("Cell.IShape - Error: The width input parameter must be a positive number greater than the tolerance input parameter. Returning None.")
2042
+ return None
2043
+ if length <= tolerance:
2044
+ if not silent:
2045
+ print("Cell.IShape - Error: The length input parameter must be a positive number greater than the tolerance input parameter. Returning None.")
2046
+ return None
2047
+ if a <= tolerance:
2048
+ if not silent:
2049
+ print("Cell.IShape - Error: The a input parameter must be a positive number greater than the tolerance input parameter. Returning None.")
2050
+ return None
2051
+ if b <= tolerance:
2052
+ if not silent:
2053
+ print("Cell.IShape - Error: The b input parameter must be a positive number greater than the tolerance input parameter. Returning None.")
2054
+ return None
2055
+ if a >= (width - tolerance):
2056
+ if not silent:
2057
+ print("Cell.IShape - Error: The a input parameter must be less than the width input parameter. Returning None.")
2058
+ return None
2059
+ if b+c >= (length - tolerance):
2060
+ if not silent:
2061
+ print("Cell.IShape - Error: The b and c input parameters must add to less than the length input parameter. Returning None.")
2062
+ return None
2063
+ if origin == None:
2064
+ origin = Vertex.Origin()
2065
+ if not Topology.IsInstance(origin, "vertex"):
2066
+ if not silent:
2067
+ print("Cell.IShape - Error: The origin input parameter is not a valid topologic vertex. Returning None.")
2068
+ return None
2069
+ if not isinstance(direction, list):
2070
+ if not silent:
2071
+ print("Cell.IShape - Error: The direction input parameter is not a valid list. Returning None.")
2072
+ return None
2073
+ if not len(direction) == 3:
2074
+ if not silent:
2075
+ print("Cell.IShape - Error: The direction input parameter is not a valid vector. Returning None.")
2076
+ return None
2077
+ i_shape_face = Face.IShape(origin=origin,
2078
+ width=width,
2079
+ length=length,
2080
+ a=a,
2081
+ b=b,
2082
+ c=c,
2083
+ flipHorizontal=flipHorizontal,
2084
+ flipVertical=flipVertical,
2085
+ direction=direction,
2086
+ placement=placement,
2087
+ tolerance=tolerance,
2088
+ silent=silent)
2089
+ return_cell = Cell.ByThickenedFace(i_shape_face, thickness=height, bothSides=True, reverse=False,
2090
+ planarize = False, tolerance=tolerance, silent=silent)
2091
+ xOffset = 0
2092
+ yOffset = 0
2093
+ zOffset = 0
2094
+ if placement.lower() == "bottom":
2095
+ zOffset = height*0.5
2096
+ elif placement.lower() == "top":
2097
+ zOffset = -height*0.5
2098
+ elif placement.lower() == "lowerleft":
2099
+ xOffset = width*0.5
2100
+ yOffset = length*0.5
2101
+ zOffset = height*0.5
2102
+ elif placement.lower() == "upperleft":
2103
+ xOffset = width*0.5
2104
+ yOffset = -length*0.5
2105
+ zOffset = -height*0.5
2106
+ elif placement.lower() == "lowerright":
2107
+ xOffset = -width*0.5
2108
+ yOffset = length*0.5
2109
+ zOffset = height*0.5
2110
+ elif placement.lower() == "upperright":
2111
+ xOffset = -width*0.5
2112
+ yOffset = -length*0.5
2113
+ zOffset = -height*0.5
2114
+ return_cell = Topology.Translate(return_cell, x=xOffset, y=yOffset, z=zOffset)
2115
+ return_cell = Topology.Place(return_cell, originA=Vertex.Origin(), originB=origin)
2116
+ if direction != [0, 0, 1]:
2117
+ return_cell = Topology.Orient(return_cell, origin=origin, dirA=[0, 0, 1], dirB=direction)
2118
+ return return_cell
2119
+
2120
+ @staticmethod
2121
+ def IsOnBoundary(cell, vertex, tolerance: float = 0.0001) -> bool:
2122
+ """
2123
+ Returns True if the input vertex is on the boundary of the input cell. Returns False otherwise.
2124
+
1549
2125
  Parameters
1550
2126
  ----------
1551
2127
  cell : topologic_core.Cell
@@ -1575,6 +2151,160 @@ class Cell():
1575
2151
  print("Cell.IsOnBoundary - Error: Could not determine if the input vertex is on the boundary of the input cell. Returning None.")
1576
2152
  return None
1577
2153
 
2154
+ @staticmethod
2155
+ def LShape(origin=None,
2156
+ width=1,
2157
+ length=1,
2158
+ height=1,
2159
+ a=0.25,
2160
+ b=0.25,
2161
+ flipHorizontal = False,
2162
+ flipVertical = False,
2163
+ direction=[0,0,1],
2164
+ placement="center",
2165
+ tolerance=0.0001,
2166
+ silent=False):
2167
+ """
2168
+ Creates an L-shape.
2169
+
2170
+ Parameters
2171
+ ----------
2172
+ origin : topologic_core.Vertex , optional
2173
+ The location of the origin of the L-shape. The default is None which results in the L-shape being placed at (0, 0, 0).
2174
+ width : float , optional
2175
+ The overall width of the L-shape. The default is 1.0.
2176
+ length : float , optional
2177
+ The overall length of the L-shape. The default is 1.0.
2178
+ height : float , optional
2179
+ The overall height of the L-shape. The default is 1.0.
2180
+ a : float , optional
2181
+ The hortizontal thickness of the vertical arm of the L-shape. The default is 0.25.
2182
+ b : float , optional
2183
+ The vertical thickness of the horizontal arm of the L-shape. The default is 0.25.
2184
+ direction : list , optional
2185
+ The vector representing the up direction of the L-shape. The default is [0, 0, 1].
2186
+ placement : str , optional
2187
+ The description of the placement of the origin of the L-shape. This can be "center", "bottom", "top", "lowerleft", "upperleft", "lowerright", "upperright". It is case insensitive. The default is "center".
2188
+ tolerance : float , optional
2189
+ The desired tolerance. The default is 0.0001.
2190
+ silent : bool , optional
2191
+ If set to True, no error and warning messages are printed. Otherwise, they are. The default is False.
2192
+
2193
+ Returns
2194
+ -------
2195
+ topologic_core.Cell
2196
+ The created L-shape cell.
2197
+
2198
+ """
2199
+ from topologicpy.Vertex import Vertex
2200
+ from topologicpy.Face import Face
2201
+ from topologicpy.Topology import Topology
2202
+
2203
+ if not isinstance(width, int) and not isinstance(width, float):
2204
+ if not silent:
2205
+ print("Cell.LShape - Error: The width input parameter is not a valid number. Returning None.")
2206
+ return None
2207
+ if not isinstance(length, int) and not isinstance(length, float):
2208
+ if not silent:
2209
+ print("Cell.LShape - Error: The length input parameter is not a valid number. Returning None.")
2210
+ return None
2211
+ if not isinstance(height, int) and not isinstance(height, float):
2212
+ if not silent:
2213
+ print("Cell.LShape - Error: The height input parameter is not a valid number. Returning None.")
2214
+ return None
2215
+ if not isinstance(a, int) and not isinstance(a, float):
2216
+ if not silent:
2217
+ print("Cell.LShape - Error: The a input parameter is not a valid number. Returning None.")
2218
+ return None
2219
+ if not isinstance(b, int) and not isinstance(b, float):
2220
+ if not silent:
2221
+ print("Cell.LShape - Error: The b input parameter is not a valid number. Returning None.")
2222
+ return None
2223
+ if width <= tolerance:
2224
+ if not silent:
2225
+ print("Cell.LShape - Error: The width input parameter must be a positive number greater than the tolerance input parameter. Returning None.")
2226
+ return None
2227
+ if length <= tolerance:
2228
+ if not silent:
2229
+ print("Cell.LShape - Error: The length input parameter must be a positive number greater than the tolerance input parameter. Returning None.")
2230
+ return None
2231
+ if height <= tolerance:
2232
+ if not silent:
2233
+ print("Cell.LShape - Error: The height input parameter must be a positive number greater than the tolerance input parameter. Returning None.")
2234
+ return None
2235
+ if a <= tolerance:
2236
+ if not silent:
2237
+ print("Cell.LShape - Error: The a input parameter must be a positive number greater than the tolerance input parameter. Returning None.")
2238
+ return None
2239
+ if b <= tolerance:
2240
+ if not silent:
2241
+ print("Cell.LShape - Error: The b input parameter must be a positive number greater than the tolerance input parameter. Returning None.")
2242
+ return None
2243
+ if a >= (width - tolerance):
2244
+ if not silent:
2245
+ print("Cell.LShape - Error: The a input parameter must be less than the width input parameter. Returning None.")
2246
+ return None
2247
+ if b >= (length - tolerance):
2248
+ if not silent:
2249
+ print("Cell.LShape - Error: The b input parameter must be less than the length input parameter. Returning None.")
2250
+ return None
2251
+ if origin == None:
2252
+ origin = Vertex.Origin()
2253
+ if not Topology.IsInstance(origin, "vertex"):
2254
+ if not silent:
2255
+ print("Cell.LShape - Error: The origin input parameter is not a valid topologic vertex. Returning None.")
2256
+ return None
2257
+ if not isinstance(direction, list):
2258
+ if not silent:
2259
+ print("Cell.LShape - Error: The direction input parameter is not a valid list. Returning None.")
2260
+ return None
2261
+ if not len(direction) == 3:
2262
+ if not silent:
2263
+ print("Cell.LShape - Error: The direction input parameter is not a valid vector. Returning None.")
2264
+ return None
2265
+ l_shape_face = Face.LShape(origin=origin,
2266
+ width=width,
2267
+ length=length,
2268
+ a=a,
2269
+ b=b,
2270
+ flipHorizontal=flipHorizontal,
2271
+ flipVertical=flipVertical,
2272
+ direction=[0,0,1],
2273
+ placement="center",
2274
+ tolerance=tolerance,
2275
+ silent=silent)
2276
+
2277
+ return_cell = Cell.ByThickenedFace(l_shape_face, thickness=height, bothSides=True, reverse=False,
2278
+ planarize = False, tolerance=tolerance, silent=silent)
2279
+ xOffset = 0
2280
+ yOffset = 0
2281
+ zOffset = 0
2282
+ if placement.lower() == "bottom":
2283
+ zOffset = height*0.5
2284
+ elif placement.lower() == "top":
2285
+ zOffset = -height*0.5
2286
+ elif placement.lower() == "lowerleft":
2287
+ xOffset = width*0.5
2288
+ yOffset = length*0.5
2289
+ zOffset = height*0.5
2290
+ elif placement.lower() == "upperleft":
2291
+ xOffset = width*0.5
2292
+ yOffset = -length*0.5
2293
+ zOffset = -height*0.5
2294
+ elif placement.lower() == "lowerright":
2295
+ xOffset = -width*0.5
2296
+ yOffset = length*0.5
2297
+ zOffset = height*0.5
2298
+ elif placement.lower() == "upperright":
2299
+ xOffset = -width*0.5
2300
+ yOffset = -length*0.5
2301
+ zOffset = -height*0.5
2302
+ return_cell = Topology.Translate(return_cell, x=xOffset, y=yOffset, z=zOffset)
2303
+ return_cell = Topology.Place(return_cell, originA=Vertex.Origin(), originB=origin)
2304
+ if direction != [0, 0, 1]:
2305
+ return_cell = Topology.Orient(return_cell, origin=origin, dirA=[0, 0, 1], dirB=direction)
2306
+ return return_cell
2307
+
1578
2308
  @staticmethod
1579
2309
  def Octahedron(origin= None, radius: float = 0.5,
1580
2310
  direction: list = [0, 0, 1], placement: str ="center", tolerance: float = 0.0001):
@@ -2023,6 +2753,102 @@ class Cell():
2023
2753
  clean_faces.append(Face.RemoveCollinearEdges(face, angTolerance=angTolerance, tolerance=tolerance))
2024
2754
  return Cell.ByFaces(clean_faces, tolerance=tolerance)
2025
2755
 
2756
+ @staticmethod
2757
+ def RHS(origin= None, width: float = 1.0, length: float = 1.0, height: float = 1.0, thickness: float = 0.25, outerFillet: float = 0.0, innerFillet: float = 0.0, sides: int = 16, direction: list = [0, 0, 1], placement: str = "center", tolerance: float = 0.0001, silent: bool = False):
2758
+ """
2759
+ Creates a rectangluar hollow section (RHS).
2760
+
2761
+ Parameters
2762
+ ----------
2763
+ origin : topologic_core.Vertex, optional
2764
+ The location of the origin of the RHS. The default is None which results in the RHS being placed at (0, 0, 0).
2765
+ width : float , optional
2766
+ The width of the RHS. The default is 1.0.
2767
+ length : float , optional
2768
+ The length of the RHS. The default is 1.0.
2769
+ thickness : float , optional
2770
+ The thickness of the RHS. The default is 0.25.
2771
+ height : float , optional
2772
+ The height of the RHS. The default is 1.0.
2773
+ outerFillet : float , optional
2774
+ The outer fillet multiplication factor based on the thickness (e.g. 1t). The default is 0.
2775
+ innerFillet : float , optional
2776
+ The inner fillet multiplication factor based on the thickness (e.g. 1.5t). The default is 0.
2777
+ sides : int , optional
2778
+ The desired number of sides of the fillets. The default is 16.
2779
+ direction : list , optional
2780
+ The vector representing the up direction of the RHS. The default is [0, 0, 1].
2781
+ placement : str , optional
2782
+ The description of the placement of the origin of the RHS. This can be "center", "bottom", "top", "lowerleft", "upperleft", "lowerright", "upperright". It is case insensitive. The default is "center".
2783
+ tolerance : float , optional
2784
+ The desired tolerance. The default is 0.0001.
2785
+ silent : bool , optional
2786
+ If set to True, no error and warning messages are printed. Otherwise, they are. The default is False.
2787
+
2788
+ Returns
2789
+ -------
2790
+ topologic_core.Cell
2791
+ The created cell.
2792
+
2793
+ """
2794
+ from topologicpy.Vertex import Vertex
2795
+ from topologicpy.Face import Face
2796
+ from topologicpy.Topology import Topology
2797
+
2798
+ if 2*thickness >= width:
2799
+ if not silent:
2800
+ print("Cell.RHS - Error: Twice the thickness value is larger than or equal to the width value. Returning None.")
2801
+ return None
2802
+ if 2*thickness >= width:
2803
+ if not silent:
2804
+ print("Cell.RHS - Error: Twice the thickness value is larger than or equal to the length value. Returning None.")
2805
+ return None
2806
+ outer_dimension = min(width, length)
2807
+ fillet_dimension = 2*outerFillet*thickness
2808
+ if fillet_dimension > outer_dimension:
2809
+ if not silent:
2810
+ print("Cell.RHS = Error: The outer fillet radius input value is too large given the desired dimensions of the RHS. Returning None.")
2811
+ return None
2812
+ inner_dimension = min(width, length) - 2*thickness
2813
+ fillet_dimension = 2*innerFillet*thickness
2814
+ if fillet_dimension > inner_dimension:
2815
+ if not silent:
2816
+ print("Cell.RHS = Error: The inner fillet radius input value is too large given the desired dimensions of the RHS. Returning None.")
2817
+ return None
2818
+ if origin == None:
2819
+ origin = Vertex.Origin()
2820
+ bottom_face = Face.RHS(origin = Vertex.Origin(), width=width, length=length, thickness=thickness, outerFillet=outerFillet, innerFillet=innerFillet, sides=sides, direction=[0,0,1], placement="center", tolerance=tolerance, silent=silent)
2821
+ return_cell = Cell.ByThickenedFace(bottom_face, thickness=height, bothSides=True, reverse=False,
2822
+ planarize = False, tolerance=tolerance, silent=silent)
2823
+ xOffset = 0
2824
+ yOffset = 0
2825
+ zOffset = 0
2826
+ if placement.lower() == "bottom":
2827
+ zOffset = height*0.5
2828
+ elif placement.lower() == "top":
2829
+ zOffset = -height*0.5
2830
+ elif placement.lower() == "lowerleft":
2831
+ xOffset = width*0.5
2832
+ yOffset = length*0.5
2833
+ zOffset = height*0.5
2834
+ elif placement.lower() == "upperleft":
2835
+ xOffset = width*0.5
2836
+ yOffset = -length*0.5
2837
+ zOffset = -height*0.5
2838
+ elif placement.lower() == "lowerright":
2839
+ xOffset = -width*0.5
2840
+ yOffset = length*0.5
2841
+ zOffset = height*0.5
2842
+ elif placement.lower() == "upperright":
2843
+ xOffset = -width*0.5
2844
+ yOffset = -length*0.5
2845
+ zOffset = -height*0.5
2846
+ return_cell = Topology.Translate(return_cell, x=xOffset, y=yOffset, z=zOffset)
2847
+ return_cell = Topology.Place(return_cell, originA=Vertex.Origin(), originB=origin)
2848
+ if direction != [0, 0, 1]:
2849
+ return_cell = Topology.Orient(return_cell, origin=origin, dirA=[0, 0, 1], dirB=direction)
2850
+ return return_cell
2851
+
2026
2852
  @staticmethod
2027
2853
  def Roof(face, angle: float = 45, epsilon: float = 0.01 , tolerance: float = 0.001):
2028
2854
  """
@@ -2146,6 +2972,76 @@ class Cell():
2146
2972
  _ = cell.Shells(None, shells) # Hook to Core
2147
2973
  return shells
2148
2974
 
2975
+ @staticmethod
2976
+ def SHS(origin= None, size: float = 1.0, height: float = 1.0, thickness: float = 0.25, outerFillet: float = 0.0, innerFillet: float = 0.0, sides: int = 16, direction: list = [0, 0, 1], placement: str = "center", tolerance: float = 0.0001, silent: bool = False):
2977
+ """
2978
+ Creates a square hollow section (SHS).
2979
+
2980
+ Parameters
2981
+ ----------
2982
+ origin : topologic_core.Vertex, optional
2983
+ The location of the origin of the SHS. The default is None which results in the SHS being placed at (0, 0, 0).
2984
+ size : float , optional
2985
+ The size of the SHS. The default is 1.0.
2986
+ length : float , optional
2987
+ The length of the SHS. The default is 1.0.
2988
+ thickness : float , optional
2989
+ The thickness of the SHS. The default is 0.25.
2990
+ height : float , optional
2991
+ The height of the SHS. The default is 1.0.
2992
+ outerFillet : float , optional
2993
+ The outer fillet multiplication factor based on the thickness (e.g. 1t). The default is 0.
2994
+ innerFillet : float , optional
2995
+ The inner fillet multiplication factor based on the thickness (e.g. 1.5t). The default is 0.
2996
+ sides : int , optional
2997
+ The desired number of sides of the fillets. The default is 16.
2998
+ direction : list , optional
2999
+ The vector representing the up direction of the SHS. The default is [0, 0, 1].
3000
+ placement : str , optional
3001
+ The description of the placement of the origin of the RHS. This can be "center", "bottom", "top", "lowerleft", "upperleft", "lowerright", "upperright". It is case insensitive. The default is "center".
3002
+ tolerance : float , optional
3003
+ The desired tolerance. The default is 0.0001.
3004
+ silent : bool , optional
3005
+ If set to True, no error and warning messages are printed. Otherwise, they are. The default is False.
3006
+
3007
+ Returns
3008
+ -------
3009
+ topologic_core.Cell
3010
+ The created cell.
3011
+
3012
+ """
3013
+ from topologicpy.Vertex import Vertex
3014
+ from topologicpy.Face import Face
3015
+ from topologicpy.Topology import Topology
3016
+
3017
+ if 2*thickness >= size:
3018
+ if not silent:
3019
+ print("Cell.SHS - Error: Twice the thickness value is larger than or equal to the size value. Returning None.")
3020
+ return None
3021
+ fillet_dimension = 2*outerFillet*thickness
3022
+ if fillet_dimension > size:
3023
+ if not silent:
3024
+ print("Cell.SHS = Error: The outer fillet radius input value is too large given the desired dimensions of the RHS. Returning None.")
3025
+ return None
3026
+ inner_dimension = size - 2*thickness
3027
+ fillet_dimension = 2*innerFillet*thickness
3028
+ if fillet_dimension > inner_dimension:
3029
+ if not silent:
3030
+ print("Cell.SHS = Error: The inner fillet radius input value is too large given the desired dimensions of the RHS. Returning None.")
3031
+ return None
3032
+ return Cell.RHS(origin= origin,
3033
+ width = size,
3034
+ length = size,
3035
+ height = height,
3036
+ thickness = thickness,
3037
+ outerFillet = outerFillet,
3038
+ innerFillet = innerFillet,
3039
+ sides = sides,
3040
+ direction = direction,
3041
+ placement = placement,
3042
+ tolerance = tolerance,
3043
+ silent = silent)
3044
+
2149
3045
  @staticmethod
2150
3046
  def Sphere(origin= None, radius: float = 0.5, uSides: int = 16, vSides: int = 8, direction: list = [0, 0, 1],
2151
3047
  placement: str = "center", tolerance: float = 0.0001):
@@ -2425,6 +3321,203 @@ class Cell():
2425
3321
  torus = Topology.Place(torus, originA=Vertex.Origin(), originB=origin)
2426
3322
  return torus
2427
3323
 
3324
+ @staticmethod
3325
+ def TShape(origin=None,
3326
+ width=1,
3327
+ length=1,
3328
+ height=1,
3329
+ a=0.25,
3330
+ b=0.25,
3331
+ flipHorizontal = False,
3332
+ flipVertical = False,
3333
+ direction=[0,0,1],
3334
+ placement="center",
3335
+ tolerance=0.0001,
3336
+ silent=False):
3337
+ """
3338
+ Creates a T-shape cell.
3339
+
3340
+ Parameters
3341
+ ----------
3342
+ origin : topologic_core.Vertex , optional
3343
+ The location of the origin of the T-shape. The default is None which results in the T-shape being placed at (0, 0, 0).
3344
+ width : float , optional
3345
+ The overall width of the T-shape. The default is 1.0.
3346
+ length : float , optional
3347
+ The overall length of the T-shape. The default is 1.0.
3348
+ height : float , optional
3349
+ the overall height of the T-shape. The default is 1.0.
3350
+ a : float , optional
3351
+ The hortizontal thickness of the vertical arm of the T-shape. The default is 0.25.
3352
+ b : float , optional
3353
+ The vertical thickness of the horizontal arm of the T-shape. The default is 0.25.
3354
+ direction : list , optional
3355
+ The vector representing the up direction of the T-shape. The default is [0, 0, 1].
3356
+ placement : str , optional
3357
+ The description of the placement of the origin of the T-shape. This can be "center", "lowerleft", "upperleft", "lowerright", "upperright". It is case insensitive. The default is "center".
3358
+ tolerance : float , optional
3359
+ The desired tolerance. The default is 0.0001.
3360
+ silent : bool , optional
3361
+ If set to True, no error and warning messages are printed. Otherwise, they are. The default is False.
3362
+
3363
+ Returns
3364
+ -------
3365
+ topologic_core.Face
3366
+ The created T-shape.
3367
+
3368
+ """
3369
+ from topologicpy.Vertex import Vertex
3370
+ from topologicpy.Face import Face
3371
+ from topologicpy.Topology import Topology
3372
+
3373
+ if not isinstance(width, int) and not isinstance(width, float):
3374
+ if not silent:
3375
+ print("Cell.TShape - Error: The width input parameter is not a valid number. Returning None.")
3376
+ return None
3377
+ if not isinstance(length, int) and not isinstance(length, float):
3378
+ if not silent:
3379
+ print("Cell.TShape - Error: The length input parameter is not a valid number. Returning None.")
3380
+ return None
3381
+ if not isinstance(a, int) and not isinstance(a, float):
3382
+ if not silent:
3383
+ print("Cell.TShape - Error: The a input parameter is not a valid number. Returning None.")
3384
+ return None
3385
+ if not isinstance(b, int) and not isinstance(b, float):
3386
+ if not silent:
3387
+ print("Cell.LShape - Error: The b input parameter is not a valid number. Returning None.")
3388
+ return None
3389
+ if width <= tolerance:
3390
+ if not silent:
3391
+ print("Cell.TShape - Error: The width input parameter must be a positive number greater than the tolerance input parameter. Returning None.")
3392
+ return None
3393
+ if length <= tolerance:
3394
+ if not silent:
3395
+ print("Cell.TShape - Error: The length input parameter must be a positive number greater than the tolerance input parameter. Returning None.")
3396
+ return None
3397
+ if a <= tolerance:
3398
+ if not silent:
3399
+ print("Cell.TShape - Error: The a input parameter must be a positive number greater than the tolerance input parameter. Returning None.")
3400
+ return None
3401
+ if b <= tolerance:
3402
+ if not silent:
3403
+ print("Cell.TShape - Error: The b input parameter must be a positive number greater than the tolerance input parameter. Returning None.")
3404
+ return None
3405
+ if a >= (width - tolerance):
3406
+ if not silent:
3407
+ print("Cell.TShape - Error: The a input parameter must be less than the width input parameter. Returning None.")
3408
+ return None
3409
+ if b >= (length - tolerance):
3410
+ if not silent:
3411
+ print("Cell.TShape - Error: The b input parameter must be less than the length input parameter. Returning None.")
3412
+ return None
3413
+ if origin == None:
3414
+ origin = Vertex.Origin()
3415
+ if not Topology.IsInstance(origin, "vertex"):
3416
+ if not silent:
3417
+ print("Cell.TShape - Error: The origin input parameter is not a valid topologic vertex. Returning None.")
3418
+ return None
3419
+ if not isinstance(direction, list):
3420
+ if not silent:
3421
+ print("Cell.TShape - Error: The direction input parameter is not a valid list. Returning None.")
3422
+ return None
3423
+ if not len(direction) == 3:
3424
+ if not silent:
3425
+ print("Cell.TShape - Error: The direction input parameter is not a valid vector. Returning None.")
3426
+ return None
3427
+ t_shape_face = Face.TShape(origin=origin,
3428
+ width=width,
3429
+ length=length,
3430
+ a=a,
3431
+ b=b,
3432
+ flipHorizontal=flipHorizontal,
3433
+ flipVertical=flipVertical,
3434
+ direction=direction,
3435
+ placement=placement,
3436
+ tolerance=tolerance,
3437
+ silent=silent)
3438
+ return_cell = Cell.ByThickenedFace(t_shape_face, thickness=height, bothSides=True, reverse=False,
3439
+ planarize = False, tolerance=tolerance, silent=silent)
3440
+ xOffset = 0
3441
+ yOffset = 0
3442
+ zOffset = 0
3443
+ if placement.lower() == "bottom":
3444
+ zOffset = height*0.5
3445
+ elif placement.lower() == "top":
3446
+ zOffset = -height*0.5
3447
+ elif placement.lower() == "lowerleft":
3448
+ xOffset = width*0.5
3449
+ yOffset = length*0.5
3450
+ zOffset = height*0.5
3451
+ elif placement.lower() == "upperleft":
3452
+ xOffset = width*0.5
3453
+ yOffset = -length*0.5
3454
+ zOffset = -height*0.5
3455
+ elif placement.lower() == "lowerright":
3456
+ xOffset = -width*0.5
3457
+ yOffset = length*0.5
3458
+ zOffset = height*0.5
3459
+ elif placement.lower() == "upperright":
3460
+ xOffset = -width*0.5
3461
+ yOffset = -length*0.5
3462
+ zOffset = -height*0.5
3463
+ return_cell = Topology.Translate(return_cell, x=xOffset, y=yOffset, z=zOffset)
3464
+ return_cell = Topology.Place(return_cell, originA=Vertex.Origin(), originB=origin)
3465
+ if direction != [0, 0, 1]:
3466
+ return_cell = Topology.Orient(return_cell, origin=origin, dirA=[0, 0, 1], dirB=direction)
3467
+ return return_cell
3468
+
3469
+ @staticmethod
3470
+ def Tube(origin= None, radius: float = 1.0, height: float = 1.0, thickness: float = 0.25, sides: int = 16, direction: list = [0, 0, 1], placement: str = "center", tolerance: float = 0.0001, silent: bool = False):
3471
+ """
3472
+ Creates a Tube. This method is an alias for the circular hollow section (CHS).
3473
+
3474
+ Parameters
3475
+ ----------
3476
+ origin : topologic_core.Vertex, optional
3477
+ The location of the origin of the CHS. The default is None which results in the CHS being placed at (0, 0, 0).
3478
+ radius : float , optional
3479
+ The outer radius of the CHS. The default is 1.0.
3480
+ thickness : float , optional
3481
+ The thickness of the CHS. The default is 0.25.
3482
+ height : float , optional
3483
+ The height of the CHS. The default is 1.0.
3484
+ sides : int , optional
3485
+ The desired number of sides of the CSH. The default is 16.
3486
+ direction : list , optional
3487
+ The vector representing the up direction of the RHS. The default is [0, 0, 1].
3488
+ placement : str , optional
3489
+ The description of the placement of the origin of the RHS. This can be "center", "bottom", "top", "lowerleft", "upperleft", "lowerright", "upperright". It is case insensitive. The default is "center".
3490
+ tolerance : float , optional
3491
+ The desired tolerance. The default is 0.0001.
3492
+ silent : bool , optional
3493
+ If set to True, no error and warning messages are printed. Otherwise, they are. The default is False.
3494
+
3495
+ Returns
3496
+ -------
3497
+ topologic_core.Cell
3498
+ The created cell.
3499
+
3500
+ """
3501
+ from topologicpy.Vertex import Vertex
3502
+ from topologicpy.Face import Face
3503
+ from topologicpy.Topology import Topology
3504
+
3505
+ if thickness >= radius:
3506
+ if not silent:
3507
+ print("Cell.Tube - Error: The thickness value is larger than or equal to the outer radius value. Returning None.")
3508
+ return None
3509
+ if origin == None:
3510
+ origin = Vertex.Origin()
3511
+ return Cell.CHS(origin=origin,
3512
+ radius=radius,
3513
+ height=height,
3514
+ thickness=thickness,
3515
+ sides=sides,
3516
+ direction=direction,
3517
+ placement=placement,
3518
+ tolerance=tolerance,
3519
+ silent=silent)
3520
+
2428
3521
  @staticmethod
2429
3522
  def Vertices(cell) -> list:
2430
3523
  """