Source code for datafusiontools.d_series_parser.d_stability_parser

from pathlib import Path
from typing import List

import geolib
import numpy as np


[docs]class DStabilityModel: """Class that creates a D-Stability model."""
[docs] @staticmethod def define_default_soil(): """Function that adds a default soil layer to the geolib model.""" soil = geolib.soils.Soil() soil.name = "Soil test" soil.code = "default_soil" soil.soil_weight_parameters.saturated_weight.mean = 10.2 soil.soil_weight_parameters.unsaturated_weight.mean = 10.2 return soil
[docs] @staticmethod def create_model(polygon_list: List, filename: str, soil_list: List = None): """Function that creates and saves a D-Stability model based on a polygon list. :param polygon_list: List of shapely polygons :param filename: Name of D-Stability file that is serialized. :param polygon_list: List of shapely polygons :param filename: Name of D-Stability file that is serialized :returns: A geolib D-Stability model """ # check types if not ( all( [ "shapely.geometry.polygon.Polygon" in str(type(polygon)) for polygon in polygon_list ] ) ): raise ValueError( "One or more elements of the list are not of type shapely.geometry.polygon.Polygon." ) # create model model = geolib.models.DStabilityModel() # define default calculation method bishop_analysis_method = ( geolib.models.dstability.analysis.DStabilityBishopAnalysisMethod( circle=geolib.models.dstability.analysis.DStabilityCircle( center=geolib.geometry.Point(x=20, z=3), radius=15 ) ) ) model.set_model(bishop_analysis_method) if soil_list == None: soil = DStabilityModel.define_default_soil() soil_id = model.add_soil(soil) # add layers layers_and_soils = [] for polygon_counter, polygon in enumerate(polygon_list): # create points layer_points = [] # extract exterior of polygon exterior = np.array(polygon.exterior.xy).T # points are rounded of to the third decimal exterior = [(round(coord[0], 3), round(coord[1], 3)) for coord in exterior] # remove duplicates exterior_no_duplicates = [] for coord in exterior: if coord not in exterior_no_duplicates: exterior_no_duplicates.append(coord) # create d-stability layer for counter_point, coords in enumerate(exterior_no_duplicates): layer_points.append( geolib.geometry.Point( x=round(coords[0], 3), z=round(coords[1], 3), label=f"layer_{polygon_counter}_{counter_point}", ) ) if soil_list == None: layers_and_soils.append( (layer_points, "default_soil", f"layer_{polygon_counter}") ) else: soil = geolib.soils.Soil(**soil_list[polygon_counter]) if not ( soil.code in [soil_applied.Code for soil_applied in model.soils.Soils] ): soil_id = model.add_soil(soil) layers_and_soils.append( (layer_points, soil.code, f"layer_{polygon_counter}") ) # add layers to model layer_ids = [] for layer, soil, layer_label in layers_and_soils: layer_id = model.add_layer(layer, soil, label=layer_label) layer_ids.append(layer_id) model.serialize(Path(filename)) return model