Source code for viiapackage.strengthening.helper_functions.merge_openings_by_local_axis

### ===================================================================================================================
###   viia_merge_openings
### ===================================================================================================================
# Copyright ©VIIA 2024

### ===================================================================================================================
###   1. Import modules
### ===================================================================================================================

# General imports
from typing import List

# References for functions and classes in the fem-client
from rhdhv_fem.fem_math import fem_distance_coordinates, fem_unit_vector_2_points, fem_unit_vector, fem_smaller


### ===================================================================================================================
###   2. Function to merge the openings
### ===================================================================================================================

[docs]def viia_merge_openings(sorted_openings, local_axis, min_distance=0.0) -> List[List[float]]: """ This function merges openings that overlap in the direction of the localAxis. The openings must be sorted with respect to the defined local axis and also be aligned on this axis. It returns the sorted list that contains the extreme x- and y-coordinates of the merged openings. Input: - sorted_openings (list with lists of lists of 3 floats): openings sorted and aligned with respect to the local_axis. - local_axis (list of 3 floats): ntb - min_distance (float): between consecutive openings, if less or equal distance, openings are merged. Output: - Returns a list with lists of 3 floats. For example: >>> viia_merge_openings([[[1.0, 0.0, 0.0], [2.0, 0.0, 0.0]], [[1.8, 0.0, 0.0], [3.0, 0.0, 0.0]]], [1.0, 0.0, 0.0]) Returns the list: [[[1.0, 0.0, 0.0], [3.0, 0.0, 0.0]]] """ if len(sorted_openings) > 1: mergecounter = 0 # Iterate through sortedOpenings for i in range(len(sorted_openings) - 1): # Compute distance and unit vector between end point of current opening and points of next opening distanceOpenings10 = fem_distance_coordinates(sorted_openings[i - mergecounter][1], sorted_openings[i + 1 - mergecounter][0]) distanceOpenings11 = fem_distance_coordinates(sorted_openings[i - mergecounter][1], sorted_openings[i + 1 - mergecounter][1]) if distanceOpenings10 != 0: uvOpenings10 = fem_unit_vector_2_points(sorted_openings[i - mergecounter][1], sorted_openings[i + 1 - mergecounter][0]) else: uvOpenings10 = [0.0, 0.0, 0.0] if distanceOpenings11 != 0: uvOpenings11 = fem_unit_vector_2_points(sorted_openings[i - mergecounter][1], sorted_openings[i + 1 - mergecounter][1]) else: uvOpenings11 = [0.0, 0.0, 0.0] # If distanceOpenings zero # Merge sortedOpenings if distanceOpenings10 == 0: sorted_openings[i - mergecounter] = [sorted_openings[i - mergecounter][0], sorted_openings[i + 1 - mergecounter][1]] del sorted_openings[i + 1 - mergecounter] mergecounter += 1 continue # If uvOpenings10 is the reversed localXAxis, i.e.consecutive sortedOpenings overlap elif uvOpenings10 == fem_unit_vector([-local_axis[0], -local_axis[1], -local_axis[2]]): # If uvOpenings11 also the reversed localXAxis, endpoint of opening nr i lies behind endpoint of # opening i+1 # Only remove opening i+1 if uvOpenings11 == fem_unit_vector([-local_axis[0], -local_axis[1], -local_axis[2]]): del sorted_openings[i + 1 - mergecounter] mergecounter += 1 continue # Else, merge sortedOpenings else: sorted_openings[i - mergecounter] = [sorted_openings[i - mergecounter][0], sorted_openings[i + 1 - mergecounter][1]] del sorted_openings[i + 1 - mergecounter] mergecounter += 1 continue # If distanceOpenings10 lower than minDistance, merge openings elif fem_smaller(distanceOpenings10, min_distance): sorted_openings[i - mergecounter] = [sorted_openings[i - mergecounter][0], sorted_openings[i + 1 - mergecounter][1]] del sorted_openings[i + 1 - mergecounter] mergecounter += 1 continue return sorted_openings
### =================================================================================================================== ### 3. End of script ### ===================================================================================================================