### ===================================================================================================================
###   CLASS: ProbeCurve
### ===================================================================================================================
# Copyright ©VIIA 2025
### ===================================================================================================================
###   1. Import modules
### ===================================================================================================================
# General imports
from __future__ import annotations
from typing import TYPE_CHECKING, List
# References for functions and classes in the haskoning_structural package
from haskoning_structural.fem_DIANAutils import fem_conversion_set_result_plot
# References for functions and classes in the viiaPackage
if TYPE_CHECKING:
    from viiapackage.viiaStatus import ViiaProject
### ===================================================================================================================
###   2. Class ProbeCurve
### ===================================================================================================================
[docs]class ProbeCurve:
    """ This is the class for probe curves, specifying a line to collect the results on."""
    # Class variable, corresponding to the current default index of the probe curve in DIANA, will compose the name
    # of the curve
    count = 1
    def __init__(
            self, project: ViiaProject, start_point: List[float], end_point: List[float], result_case: List[str],
            view: List[str], steps: int = 10):
        """
        Input:
            - project (obj): VIIA project object containing collections of fem objects and project variables.
            - start_point (list of 3 floats): The start point coordinate for the probe curve.
            - end_point (list of 3 floats): The end point coordinate for the probe curve.
            - result_case (list of 3 str): Consists of the executed analysis name, output file name and the
              corresponding load-case name.
            - view (list of 2 str): First item is the name of the result contour, second item is its component.
            - steps (int): Number of segments for the probe curve. Default value is 10. Create 10 sample points.
        """
        self.project = project
        self.sta_point = start_point
        self.end_point = end_point
        # e.g. result_case = [ "A1 - Lineair statische analyse met fixed base", "OUTPUT_STATIC", "NLPO_equi_acc_+X" ]
        self.result_case = result_case
        # e.g. view = ["Distributed Forces/node", "Qxz"]
        self.view = view
        self.steps = steps
        # Set views
        fem_conversion_set_result_plot(
            project=project, plot_type='contours', result=self.view[0], component=self.view[1])
        project.haskoningDIANA.setResultCase(result_case)
[docs]    def get_values(self, average: bool = False):
        """ Method of ProbeCurve class to evaluate the result value between the start point and end point."""
        # Set curves index based on the existing ones
        default_idx = f'RESULT/PROBE/CURVES({ProbeCurve.count})/COORDS'
        coord = self.sta_point + self.end_point
        # Create curves
        self.project.haskoningDIANA.setViewSettingValue(self.project.haskoningDIANA.activeViewSetting(), default_idx, coord)
        # Set the stepsize
        self.project.haskoningDIANA.setViewSettingValue(
            self.project.haskoningDIANA.activeViewSetting(), f'RESULT/PROBE/CURVES({ProbeCurve.count})/NUMINT', self.steps)
        # Get the curve value
        # Default name of probe curve is 'probe-curve'
        if ProbeCurve.count == 1:
            result = self.project.haskoningDIANA.probeCurveSampleValues('probe-curve')
            if average:
                # Mean
                # Duplicate values due to openings are removed
                result = sum(set(list(result))) / len(set(list(result)))
        else:
            result = self.project.haskoningDIANA.probeCurveSampleValues(f'probe-curve {ProbeCurve.count}')
            if average:
                # Mean - Duplicate values due to openings are removed
                result = sum(set(list(result))) / len(set(list(result)))
        # Increment for the index
        ProbeCurve.count += 1
        return result 
[docs]    def remove_all_curves(self):
        """ Method of ProbeCurve class to remove all the existing probe curves."""
        for curve_idx in range(1, ProbeCurve.count + 1):
            self.project.haskoningDIANA.clearViewSettingValue(
                self.project.haskoningDIANA.activeViewSetting(), f'RESULT/PROBE/CURVES({curve_idx})')  
### ===================================================================================================================
###   4. End of script
### ===================================================================================================================