55import os
66from .connection import acc , act
77from .enums import ElType , AttrType , ProjectInfo
8- from .types import Vector , Coordinate , Color
8+ from .types import Vector , Coordinate , Polyline , Color
99
1010
1111def _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