Skip to content

Commit c41963e

Browse files
committed
Refactor CreateSlabs and CreatePolylines methods to accept Polyline objects
1 parent b75e3f8 commit c41963e

1 file changed

Lines changed: 78 additions & 27 deletions

File tree

src/perisso/tapir_commands.py

Lines changed: 78 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import os
66
from .connection import acc, act
77
from .enums import ElType, AttrType, ProjectInfo
8-
from .types import Vector, Coordinate, Color
8+
from .types import Vector, Coordinate, Polyline, Color
99

1010

1111
def _printcol(text: str):
@@ -563,32 +563,68 @@ def CreateColumns(self, coors: List[Coordinate]) -> dict:
563563

564564
def CreateSlabs(
565565
self,
566-
coors: List[Coordinate] | Dict,
567-
arcs: List[Dict] = [],
568-
holes: List[Dict] = [],
566+
polylines: List[Polyline] | Polyline,
567+
holes: List[Polyline] = None,
569568
level: float = 0.0,
570569
) -> dict:
571570
"""Creates Slab elements based on the given parameters.
572571
573572
Args:
574-
coors (`List[Coordinate] | Dict`): Coordinates as Coordinate object in a list, or a ready made dict.
575-
arcs: Looks like this: `[{"begIndex": 0, "endIndex": 1, "arcAngle": 3.14}]`"""
576-
name_ = inspect.currentframe().f_code.co_name
577-
if level is None:
578-
# if explicitely not providing level it should be stored in the coordinates
579-
level = coors[0].z
580-
if not isinstance(coors, dict):
581-
coors = [coor.to_2d().to_dict() for coor in coors]
582-
params = {
583-
"slabsData": [
584-
{
585-
"level": level,
586-
"polygonCoordinates": coors,
587-
"polygonArcs": arcs,
588-
"holes": holes,
589-
}
590-
]
591-
}
573+
polylines: Polyline objects defining the slab boundary, or list of Polylines for multiple slabs.
574+
holes: Optional list of Polyline objects defining holes in the slab.
575+
level (`float`): Z-level of the slab.
576+
577+
Note: All polylines will be automatically closed for slab creation.
578+
"""
579+
name_ = inspect.currentframe().f_code.co_name
580+
581+
# Handle single Polyline or list of Polylines
582+
if isinstance(polylines, Polyline):
583+
polylines = [polylines]
584+
585+
slabs_data = []
586+
for polyline in polylines:
587+
# Ensure the polyline is closed for slab creation
588+
if not polyline.is_closed:
589+
polyline.close()
590+
591+
# Convert polyline to dictionary format
592+
polyline_dict = polyline.to_dict()
593+
594+
# Prepare holes data
595+
holes_data = []
596+
if holes:
597+
for hole in holes:
598+
if isinstance(hole, Polyline):
599+
# Ensure hole polylines are also closed
600+
if not hole.is_closed:
601+
hole.close()
602+
603+
hole_dict = hole.to_dict()
604+
hole_data = {"polygonCoordinates": hole_dict["coordinates"]}
605+
606+
# Add arcs if they exist for this hole
607+
if "arcs" in hole_dict:
608+
hole_data["polygonArcs"] = hole_dict["arcs"]
609+
610+
holes_data.append(hole_data)
611+
else:
612+
raise TypeError("Holes must be Polyline objects")
613+
614+
# Build slab data structure
615+
slab_data = {
616+
"level": level,
617+
"polygonCoordinates": polyline_dict["coordinates"],
618+
"holes": holes_data,
619+
}
620+
621+
# Add arcs if they exist
622+
if "arcs" in polyline_dict:
623+
slab_data["polygonArcs"] = polyline_dict["arcs"]
624+
625+
slabs_data.append(slab_data)
626+
627+
params = {"slabsData": slabs_data}
592628
return self._run(name_, params)
593629

594630
def CreateZones(self, coors: List[Coordinate]) -> dict:
@@ -600,13 +636,28 @@ def CreateZones(self, coors: List[Coordinate]) -> dict:
600636
name_ = inspect.currentframe().f_code.co_name
601637
return self._run(name_, params)
602638

603-
def CreatePolylines(self, coors: List[Coordinate]) -> dict:
639+
def CreatePolylines(
640+
self, polylines: List[Polyline] | Polyline, floorInd: int = None
641+
) -> dict:
604642
"""Creates Polyline elements based on the given parameters."""
605-
raise NotImplementedError
606-
params = {
607-
"columnsData": [{"coordinates": coor.to_3d().to_dict()} for coor in coors]
608-
}
609643
name_ = inspect.currentframe().f_code.co_name
644+
645+
# Handle single Polyline or list of Polylines
646+
if isinstance(polylines, Polyline):
647+
polylines = [polylines]
648+
649+
polylines_data = []
650+
for polyline in polylines:
651+
# Convert polyline to dictionary format
652+
polyline_dict = polyline.to_dict()
653+
654+
# Add floor index if specified
655+
if floorInd is not None:
656+
polyline_dict["floorInd"] = floorInd
657+
658+
polylines_data.append(polyline_dict)
659+
660+
params = {"polylinesData": polylines_data}
610661
return self._run(name_, params)
611662

612663
def CreateObjects(self, coors: List[Coordinate]) -> dict:

0 commit comments

Comments
 (0)