import typing, clr, abc
from SIMULTAN.Data import SimNamedObject_1, SimId, SimManagedCollection_1, IReferenceLocation
from System import Guid, Array_1, EventArgs, MulticastDelegate, IAsyncResult, AsyncCallback, DateTime, ValueTuple_2, ValueTuple_3
from System.Collections.Generic import ICollection_1, List_1, HashSet_1, IEnumerable_1, Dictionary_2, IDictionary_2, KeyValuePair_2, IEnumerator_1
from SIMULTAN.Utils import RowColumnRange, IntIndex3D, Range3D
from SIMULTAN.Data.SimMath import SimPoint4D, SimPoint3D, SimRect
from System.Collections.ObjectModel import ObservableCollection_1
from System.Reflection import MethodInfo
from System.ComponentModel import INotifyPropertyChanged
from SIMULTAN.Data.Components import SimBaseParameter, SimParameterValueSource, SimComponentCollection
from SIMULTAN.Projects import ProjectData
from System.Collections.Specialized import INotifyCollectionChanged
from SIMULTAN.Data.Users import SimUser

class SimAggregationFunction(typing.SupportsInt):
    @typing.overload
    def __init__(self, value : int) -> None: ...
    @typing.overload
    def __init__(self, value : int, force_if_true: bool) -> None: ...
    def __int__(self) -> int: ...
    
    # Values:
    Sum : SimAggregationFunction # 0
    Average : SimAggregationFunction # 1
    Min : SimAggregationFunction # 2
    Max : SimAggregationFunction # 3
    Count : SimAggregationFunction # 4


class SimAggregationFunctionExtensions(abc.ABC):
    @staticmethod
    def FromStringRepresentation(representation: str) -> SimAggregationFunction: ...
    @staticmethod
    def ToStringRepresentation(aggregationFunction: SimAggregationFunction) -> str: ...


class SimMultiValue(SimNamedObject_1[SimMultiValueCollection]):
    @property
    def CanInterpolate(self) -> bool: ...
    @CanInterpolate.setter
    def CanInterpolate(self, value: bool) -> bool: ...
    @property
    def Description(self) -> str: ...
    @Description.setter
    def Description(self, value: str) -> str: ...
    @property
    def Factory(self) -> SimMultiValueCollection: ...
    @Factory.setter
    def Factory(self, value: SimMultiValueCollection) -> SimMultiValueCollection: ...
    @property
    def GlobalID(self) -> Guid: ...
    @property
    def Id(self) -> SimId: ...
    @Id.setter
    def Id(self, value: SimId) -> SimId: ...
    @property
    def LocalID(self) -> int: ...
    @property
    def MVType(self) -> SimMultiValueType: ...
    @property
    def Name(self) -> str: ...
    @Name.setter
    def Name(self, value: str) -> str: ...
    @property
    def UnitX(self) -> str: ...
    @UnitX.setter
    def UnitX(self, value: str) -> str: ...
    @property
    def UnitY(self) -> str: ...
    @UnitY.setter
    def UnitY(self, value: str) -> str: ...
    @property
    def UnitZ(self) -> str: ...
    @UnitZ.setter
    def UnitZ(self, value: str) -> str: ...
    @abc.abstractmethod
    def Clone(self) -> SimMultiValue: ...
    # Skipped CreateNewPointer due to it being static, abstract and generic.

    CreateNewPointer : CreateNewPointer_MethodGroup
    class CreateNewPointer_MethodGroup:
        @typing.overload
        def __call__(self) -> SimMultiValueParameterSource:...
        @typing.overload
        def __call__(self, source: SimMultiValueParameterSource) -> SimMultiValueParameterSource:...



class SimMultiValueBigTable(SimMultiValue):
    @typing.overload
    def __init__(self, name: str, unitColumns: str, unitRows: str, columnHeaders: ICollection_1[SimMultiValueBigTableHeader], rowHeaders: ICollection_1[SimMultiValueBigTableHeader], values: List_1[List_1[typing.Any]], checkValueTypes: bool = ...) -> None: ...
    @typing.overload
    def __init__(self, name: str, unitColumns: str, unitRows: str, columnHeaders: ICollection_1[SimMultiValueBigTableHeader], rowHeaders: ICollection_1[SimMultiValueBigTableHeader], values: List_1[List_1[float]], checkValueTypes: bool = ...) -> None: ...
    @typing.overload
    def __init__(self, name: str, unitColumns: str, unitRows: str, columnHeaders: ICollection_1[SimMultiValueBigTableHeader], rowHeaders: ICollection_1[SimMultiValueBigTableHeader], values: Array_1[typing.Any], checkValueTypes: bool = ...) -> None: ...
    @typing.overload
    def __init__(self, name: str, unitColumns: str, unitRows: str, columnHeaders: ICollection_1[SimMultiValueBigTableHeader], rowHeaders: ICollection_1[SimMultiValueBigTableHeader], values: Array_1[float], checkValueTypes: bool = ...) -> None: ...
    @property
    def AdditionalInfo(self) -> str: ...
    @AdditionalInfo.setter
    def AdditionalInfo(self, value: str) -> str: ...
    @property
    def CanInterpolate(self) -> bool: ...
    @CanInterpolate.setter
    def CanInterpolate(self, value: bool) -> bool: ...
    @property
    def ColumnHeaders(self) -> SimMultiValueBigTable.HeaderCollection: ...
    @ColumnHeaders.setter
    def ColumnHeaders(self, value: SimMultiValueBigTable.HeaderCollection) -> SimMultiValueBigTable.HeaderCollection: ...
    @property
    def DefaultPointer(self) -> SimMultiValueParameterSource: ...
    @property
    def Description(self) -> str: ...
    @Description.setter
    def Description(self, value: str) -> str: ...
    @property
    def Factory(self) -> SimMultiValueCollection: ...
    @Factory.setter
    def Factory(self, value: SimMultiValueCollection) -> SimMultiValueCollection: ...
    @property
    def GlobalID(self) -> Guid: ...
    @property
    def Id(self) -> SimId: ...
    @Id.setter
    def Id(self, value: SimId) -> SimId: ...
    @property
    def Item(self) -> typing.Any: ...
    @Item.setter
    def Item(self, value: typing.Any) -> typing.Any: ...
    @property
    def LocalID(self) -> int: ...
    @property
    def MVType(self) -> SimMultiValueType: ...
    @property
    def Name(self) -> str: ...
    @Name.setter
    def Name(self, value: str) -> str: ...
    @property
    def RowHeaders(self) -> SimMultiValueBigTable.HeaderCollection: ...
    @RowHeaders.setter
    def RowHeaders(self, value: SimMultiValueBigTable.HeaderCollection) -> SimMultiValueBigTable.HeaderCollection: ...
    @classmethod
    @property
    def SupportedValueTypes(cls) -> HashSet_1[typing.Type[typing.Any]]: ...
    @property
    def UnitX(self) -> str: ...
    @UnitX.setter
    def UnitX(self, value: str) -> str: ...
    @property
    def UnitY(self) -> str: ...
    @UnitY.setter
    def UnitY(self, value: str) -> str: ...
    @property
    def UnitZ(self) -> str: ...
    @UnitZ.setter
    def UnitZ(self, value: str) -> str: ...
    def Clone(self) -> SimMultiValue: ...
    def Count(self, dimension: int) -> int: ...
    def GetColumn(self, idx: int) -> IEnumerable_1[typing.Any]: ...
    def GetDoubleRange(self, range: RowColumnRange) -> Array_1[float]: ...
    def GetRow(self, idx: int) -> IEnumerable_1[typing.Any]: ...
    def Resize(self, rows: int, columns: int) -> None: ...
    # Skipped CreateNewPointer due to it being static, abstract and generic.

    CreateNewPointer : CreateNewPointer_MethodGroup
    class CreateNewPointer_MethodGroup:
        @typing.overload
        def __call__(self) -> SimMultiValueParameterSource:...
        @typing.overload
        def __call__(self, source: SimMultiValueParameterSource) -> SimMultiValueParameterSource:...

    # Skipped GetRange due to it being static, abstract and generic.

    GetRange : GetRange_MethodGroup
    class GetRange_MethodGroup:
        def __getitem__(self, t:typing.Type[GetRange_1_T1]) -> GetRange_1[GetRange_1_T1]: ...

        GetRange_1_T1 = typing.TypeVar('GetRange_1_T1')
        class GetRange_1(typing.Generic[GetRange_1_T1]):
            GetRange_1_T = SimMultiValueBigTable.GetRange_MethodGroup.GetRange_1_T1
            def __call__(self, _range_definition: SimPoint4D) -> List_1[List_1[GetRange_1_T]]:...

        @typing.overload
        def __call__(self, _range_definition: SimPoint4D) -> List_1[List_1[typing.Any]]:...
        @typing.overload
        def __call__(self, range: RowColumnRange) -> Array_1[typing.Any]:...

    # Skipped ReplaceData due to it being static, abstract and generic.

    ReplaceData : ReplaceData_MethodGroup
    class ReplaceData_MethodGroup:
        @typing.overload
        def __call__(self, source: SimMultiValueBigTable) -> None:...
        @typing.overload
        def __call__(self, columnHeaders: ICollection_1[SimMultiValueBigTableHeader], rowHeaders: ICollection_1[SimMultiValueBigTableHeader], values: List_1[List_1[float]]) -> None:...
        @typing.overload
        def __call__(self, columnHeaders: ICollection_1[SimMultiValueBigTableHeader], rowHeaders: ICollection_1[SimMultiValueBigTableHeader], values: List_1[List_1[typing.Any]], checkValueTypes: bool = ...) -> None:...


    class HeaderCollection(ObservableCollection_1[SimMultiValueBigTableHeader]):
        @property
        def Count(self) -> int: ...
        @property
        def Item(self) -> SimMultiValueBigTableHeader: ...
        @Item.setter
        def Item(self, value: SimMultiValueBigTableHeader) -> SimMultiValueBigTableHeader: ...


    class HeaderValueChangedEventArgs(EventArgs):
        def __init__(self, index: int, axis: SimMultiValueBigTableHeader.AxisEnum) -> None: ...
        @property
        def Axis(self) -> SimMultiValueBigTableHeader.AxisEnum: ...
        @property
        def Index(self) -> int: ...


    class ResizeDirection(typing.SupportsInt):
        @typing.overload
        def __init__(self, value : int) -> None: ...
        @typing.overload
        def __init__(self, value : int, force_if_true: bool) -> None: ...
        def __int__(self) -> int: ...
        
        # Values:
        Rows : SimMultiValueBigTable.ResizeDirection # 1
        Columns : SimMultiValueBigTable.ResizeDirection # 2
        Both : SimMultiValueBigTable.ResizeDirection # 3


    class ResizeEventArgs(EventArgs):
        def __init__(self, direction: SimMultiValueBigTable.ResizeDirection, rowStartIndex: int, columnStartIndex: int) -> None: ...
        @property
        def ColumnStartIndex(self) -> int: ...
        @property
        def ResizeDirection(self) -> SimMultiValueBigTable.ResizeDirection: ...
        @property
        def RowStartIndex(self) -> int: ...


    class ValueChangedEventArgs(EventArgs):
        def __init__(self, row: int, column: int) -> None: ...
        @property
        def Column(self) -> int: ...
        @Column.setter
        def Column(self, value: int) -> int: ...
        @property
        def Row(self) -> int: ...
        @Row.setter
        def Row(self, value: int) -> int: ...


    class ValueChangedEventHandler(MulticastDelegate):
        def __init__(self, object: typing.Any, method: int) -> None: ...
        @property
        def Method(self) -> MethodInfo: ...
        @property
        def Target(self) -> typing.Any: ...
        def BeginInvoke(self, sender: typing.Any, args: SimMultiValueBigTable.ValueChangedEventArgs, callback: AsyncCallback, object: typing.Any) -> IAsyncResult: ...
        def EndInvoke(self, result: IAsyncResult) -> None: ...
        def Invoke(self, sender: typing.Any, args: SimMultiValueBigTable.ValueChangedEventArgs) -> None: ...



class SimMultiValueBigTableHeader(INotifyPropertyChanged):
    def __init__(self, name: str, unit: str) -> None: ...
    @property
    def Name(self) -> str: ...
    @Name.setter
    def Name(self, value: str) -> str: ...
    @property
    def Unit(self) -> str: ...
    @Unit.setter
    def Unit(self, value: str) -> str: ...
    def Clone(self) -> SimMultiValueBigTableHeader: ...

    class AxisEnum(typing.SupportsInt):
        @typing.overload
        def __init__(self, value : int) -> None: ...
        @typing.overload
        def __init__(self, value : int, force_if_true: bool) -> None: ...
        def __int__(self) -> int: ...
        
        # Values:
        Rows : SimMultiValueBigTableHeader.AxisEnum # 0
        Columns : SimMultiValueBigTableHeader.AxisEnum # 1
        Undefined : SimMultiValueBigTableHeader.AxisEnum # -1



class SimMultiValueBigTableParameterSource(SimMultiValueParameterSource):
    def __init__(self, table: SimMultiValueBigTable, row: int, column: int) -> None: ...
    @property
    def Column(self) -> int: ...
    @Column.setter
    def Column(self, value: int) -> int: ...
    @property
    def Row(self) -> int: ...
    @Row.setter
    def Row(self, value: int) -> int: ...
    @property
    def Table(self) -> SimMultiValueBigTable: ...
    @property
    def TargetParameter(self) -> SimBaseParameter: ...
    @TargetParameter.setter
    def TargetParameter(self, value: SimBaseParameter) -> SimBaseParameter: ...
    @property
    def ValueField(self) -> SimMultiValue: ...
    def Clone(self) -> SimParameterValueSource: ...
    def GetValue(self) -> typing.Any: ...
    def IsSamePointer(self, other: SimMultiValueParameterSource) -> bool: ...
    def SetFromParameters(self, axisValueX: float, axisValueY: float, axisValueZ: float, gs: str) -> None: ...


class SimMultiValueCollection(SimManagedCollection_1[SimMultiValue]):
    def __init__(self, owner: ProjectData) -> None: ...
    @property
    def CalledFromLocation(self) -> IReferenceLocation: ...
    @property
    def Count(self) -> int: ...
    @property
    def HasChanges(self) -> bool: ...
    @property
    def Item(self) -> SimMultiValue: ...
    @Item.setter
    def Item(self, value: SimMultiValue) -> SimMultiValue: ...
    @property
    def LastChange(self) -> DateTime: ...
    @property
    def ProjectData(self) -> ProjectData: ...
    def EndLoading(self) -> None: ...
    def GetByID(self, _location: Guid, _id: int) -> SimMultiValue: ...
    def Merge(self, source: SimMultiValueCollection) -> Dictionary_2[int, int]: ...
    def RemoveUnused(self, components: SimComponentCollection, _excluded_from_removal: IEnumerable_1[SimMultiValue]) -> None: ...
    def StartLoading(self) -> None: ...


class SimMultiValueField3D(SimMultiValue):
    @typing.overload
    def __init__(self, id: int, name: str, xaxis: IEnumerable_1[float], unitX: str, yaxis: IEnumerable_1[float], unitY: str, zaxis: IEnumerable_1[float], unitZ: str, data: IDictionary_2[SimPoint3D, float], canInterpolate: bool) -> None: ...
    @typing.overload
    def __init__(self, name: str, xaxis: IEnumerable_1[float], unitX: str, yaxis: IEnumerable_1[float], unitY: str, zaxis: IEnumerable_1[float], unitZ: str, data: IEnumerable_1[float], canInterpolate: bool) -> None: ...
    @property
    def CanInterpolate(self) -> bool: ...
    @CanInterpolate.setter
    def CanInterpolate(self, value: bool) -> bool: ...
    @property
    def DefaultPointer(self) -> SimMultiValueParameterSource: ...
    @property
    def Description(self) -> str: ...
    @Description.setter
    def Description(self, value: str) -> str: ...
    @property
    def Factory(self) -> SimMultiValueCollection: ...
    @Factory.setter
    def Factory(self, value: SimMultiValueCollection) -> SimMultiValueCollection: ...
    @property
    def Field(self) -> IEnumerable_1[KeyValuePair_2[IntIndex3D, float]]: ...
    @property
    def GlobalID(self) -> Guid: ...
    @property
    def Id(self) -> SimId: ...
    @Id.setter
    def Id(self, value: SimId) -> SimId: ...
    @property
    def Item(self) -> float: ...
    @Item.setter
    def Item(self, value: float) -> float: ...
    @property
    def Item(self) -> float: ...
    @Item.setter
    def Item(self, value: float) -> float: ...
    @property
    def Length(self) -> int: ...
    @property
    def LocalID(self) -> int: ...
    @property
    def MVType(self) -> SimMultiValueType: ...
    @property
    def Name(self) -> str: ...
    @Name.setter
    def Name(self, value: str) -> str: ...
    @property
    def UnitX(self) -> str: ...
    @UnitX.setter
    def UnitX(self, value: str) -> str: ...
    @property
    def UnitY(self) -> str: ...
    @UnitY.setter
    def UnitY(self, value: str) -> str: ...
    @property
    def UnitZ(self) -> str: ...
    @UnitZ.setter
    def UnitZ(self, value: str) -> str: ...
    @property
    def XAxis(self) -> SimMultiValueField3D.AxisCollection: ...
    @property
    def YAxis(self) -> SimMultiValueField3D.AxisCollection: ...
    @property
    def ZAxis(self) -> SimMultiValueField3D.AxisCollection: ...
    def AxisPositionFromValue(self, axis: SimMultiValueField3D.Axis, value: float) -> float: ...
    def Clone(self) -> SimMultiValue: ...
    def GetAxis(self, axis: SimMultiValueField3D.Axis) -> ObservableCollection_1[float]: ...
    def GetValue(self, position: SimPoint3D) -> float: ...
    # Skipped Count due to it being static, abstract and generic.

    Count : Count_MethodGroup
    class Count_MethodGroup:
        @typing.overload
        def __call__(self, dimension: int) -> int:...
        @typing.overload
        def __call__(self, axis: SimMultiValueField3D.Axis) -> int:...

    # Skipped CreateNewPointer due to it being static, abstract and generic.

    CreateNewPointer : CreateNewPointer_MethodGroup
    class CreateNewPointer_MethodGroup:
        @typing.overload
        def __call__(self) -> SimMultiValueParameterSource:...
        @typing.overload
        def __call__(self, source: SimMultiValueParameterSource) -> SimMultiValueParameterSource:...

    # Skipped ValueFromAxisPosition due to it being static, abstract and generic.

    ValueFromAxisPosition : ValueFromAxisPosition_MethodGroup
    class ValueFromAxisPosition_MethodGroup:
        @typing.overload
        def __call__(self, axis: SimMultiValueField3D.Axis, axisPosition: float) -> float:...
        @typing.overload
        def __call__(self, axis: SimMultiValueField3D.Axis, axisPosition: float, isOutside: clr.Reference[bool]) -> float:...


    class Axis(typing.SupportsInt):
        @typing.overload
        def __init__(self, value : int) -> None: ...
        @typing.overload
        def __init__(self, value : int, force_if_true: bool) -> None: ...
        def __int__(self) -> int: ...
        
        # Values:
        X : SimMultiValueField3D.Axis # 0
        Y : SimMultiValueField3D.Axis # 1
        Z : SimMultiValueField3D.Axis # 2


    class AxisCollection(ObservableCollection_1[float]):
        @property
        def Count(self) -> int: ...
        @property
        def Item(self) -> float: ...
        @Item.setter
        def Item(self, value: float) -> float: ...


    class ValueChangedEventArgs(EventArgs):
        def __init__(self, range: Range3D) -> None: ...
        @property
        def Range(self) -> Range3D: ...
        @Range.setter
        def Range(self, value: Range3D) -> Range3D: ...


    class ValueChangedEventHandler(MulticastDelegate):
        def __init__(self, object: typing.Any, method: int) -> None: ...
        @property
        def Method(self) -> MethodInfo: ...
        @property
        def Target(self) -> typing.Any: ...
        def BeginInvoke(self, sender: typing.Any, args: SimMultiValueField3D.ValueChangedEventArgs, callback: AsyncCallback, object: typing.Any) -> IAsyncResult: ...
        def EndInvoke(self, result: IAsyncResult) -> None: ...
        def Invoke(self, sender: typing.Any, args: SimMultiValueField3D.ValueChangedEventArgs) -> None: ...



class SimMultiValueField3DParameterSource(SimMultiValueParameterSource):
    def __init__(self, field3D: SimMultiValueField3D, axisValueX: float, axisValueY: float, axisValueZ: float) -> None: ...
    @property
    def AxisValueX(self) -> float: ...
    @property
    def AxisValueY(self) -> float: ...
    @property
    def AxisValueZ(self) -> float: ...
    @property
    def Field(self) -> SimMultiValueField3D: ...
    @property
    def TargetParameter(self) -> SimBaseParameter: ...
    @TargetParameter.setter
    def TargetParameter(self, value: SimBaseParameter) -> SimBaseParameter: ...
    @property
    def ValueField(self) -> SimMultiValue: ...
    def Clone(self) -> SimParameterValueSource: ...
    def GetValue(self) -> typing.Any: ...
    def IsSamePointer(self, other: SimMultiValueParameterSource) -> bool: ...
    def SetFromParameters(self, axisValueX: float, axisValueY: float, axisValueZ: float, gs: str) -> None: ...


class SimMultiValueFunction(SimMultiValue):
    @typing.overload
    def __init__(self, id: int, name: str, unitX: str, unitY: str, unitZ: str, bounds: SimRect, zaxis: IEnumerable_1[float], graphs: IEnumerable_1[SimMultiValueFunctionGraph]) -> None: ...
    @typing.overload
    def __init__(self, name: str, unitX: str, unitY: str, unitZ: str, bounds: SimRect, zaxis: IEnumerable_1[float], graphs: IEnumerable_1[SimMultiValueFunctionGraph]) -> None: ...
    @property
    def CanInterpolate(self) -> bool: ...
    @CanInterpolate.setter
    def CanInterpolate(self, value: bool) -> bool: ...
    @property
    def DefaultPointer(self) -> SimMultiValueParameterSource: ...
    @property
    def Description(self) -> str: ...
    @Description.setter
    def Description(self, value: str) -> str: ...
    @property
    def Factory(self) -> SimMultiValueCollection: ...
    @Factory.setter
    def Factory(self, value: SimMultiValueCollection) -> SimMultiValueCollection: ...
    @property
    def GlobalID(self) -> Guid: ...
    @property
    def Graphs(self) -> SimMultiValueFunction.GraphsCollection: ...
    @property
    def Id(self) -> SimId: ...
    @Id.setter
    def Id(self, value: SimId) -> SimId: ...
    @property
    def LocalID(self) -> int: ...
    @property
    def MVType(self) -> SimMultiValueType: ...
    @property
    def Name(self) -> str: ...
    @Name.setter
    def Name(self, value: str) -> str: ...
    @property
    def Range(self) -> Range3D: ...
    @Range.setter
    def Range(self, value: Range3D) -> Range3D: ...
    @property
    def UnitX(self) -> str: ...
    @UnitX.setter
    def UnitX(self, value: str) -> str: ...
    @property
    def UnitY(self) -> str: ...
    @UnitY.setter
    def UnitY(self, value: str) -> str: ...
    @property
    def UnitZ(self) -> str: ...
    @UnitZ.setter
    def UnitZ(self, value: str) -> str: ...
    @property
    def ZAxis(self) -> SimMultiValueFunction.ZAxisCollection: ...
    def Clone(self) -> SimMultiValue: ...
    # Skipped CreateNewPointer due to it being static, abstract and generic.

    CreateNewPointer : CreateNewPointer_MethodGroup
    class CreateNewPointer_MethodGroup:
        @typing.overload
        def __call__(self) -> SimMultiValueParameterSource:...
        @typing.overload
        def __call__(self, source: SimMultiValueParameterSource) -> SimMultiValueParameterSource:...

    # Skipped GetValue due to it being static, abstract and generic.

    GetValue : GetValue_MethodGroup
    class GetValue_MethodGroup:
        @typing.overload
        def __call__(self, position: SimPoint3D) -> float:...
        @typing.overload
        def __call__(self, position: SimPoint3D, tolerance: float) -> float:...
        @typing.overload
        def __call__(self, position: SimPoint3D, tolerance: float, isValid: clr.Reference[bool], closestPoint: clr.Reference[SimPoint3D], closestGraph: clr.Reference[SimMultiValueFunctionGraph]) -> float:...

    # Skipped Sample due to it being static, abstract and generic.

    Sample : Sample_MethodGroup
    class Sample_MethodGroup:
        @typing.overload
        def __call__(self, start: float, end: float, stepSize: float) -> ValueTuple_2[List_1[List_1[float]], List_1[str]]:...
        @typing.overload
        def __call__(self, start: float, end: float, stepSize: float, zIndex: int) -> ValueTuple_2[List_1[List_1[float]], List_1[str]]:...


    class GraphsCollection(ObservableCollection_1[SimMultiValueFunctionGraph]):
        def __init__(self, owner: SimMultiValueFunction, graphs: IEnumerable_1[SimMultiValueFunctionGraph]) -> None: ...
        @property
        def Count(self) -> int: ...
        @property
        def Item(self) -> SimMultiValueFunctionGraph: ...
        @Item.setter
        def Item(self, value: SimMultiValueFunctionGraph) -> SimMultiValueFunctionGraph: ...


    class ZAxisCollection(ObservableCollection_1[float]):
        def __init__(self, owner: SimMultiValueFunction, initialValues: IEnumerable_1[float]) -> None: ...
        @property
        def Count(self) -> int: ...
        @property
        def Item(self) -> float: ...
        @Item.setter
        def Item(self, value: float) -> float: ...



class SimMultiValueFunctionGraph(INotifyPropertyChanged):
    def __init__(self, name: str, points: IEnumerable_1[SimPoint3D]) -> None: ...
    @property
    def Function(self) -> SimMultiValueFunction: ...
    @Function.setter
    def Function(self, value: SimMultiValueFunction) -> SimMultiValueFunction: ...
    @property
    def Name(self) -> str: ...
    @Name.setter
    def Name(self, value: str) -> str: ...
    @property
    def Points(self) -> SimMultiValueFunctionPointList: ...
    def Clone(self) -> SimMultiValueFunctionGraph: ...
    def ClosestPoint(self, position: SimPoint3D) -> ValueTuple_3[SimPoint3D, float, float]: ...
    def GetValueFromX(self, x: float, previouseY: float = ...) -> float: ...
    def Sample(self, start: float, end: float, stepSize: float) -> List_1[float]: ...


class SimMultiValueFunctionParameterSource(SimMultiValueParameterSource):
    def __init__(self, function: SimMultiValueFunction, graphName: str, axisValueX: float, axisValueY: float) -> None: ...
    @property
    def AxisValueX(self) -> float: ...
    @property
    def AxisValueY(self) -> float: ...
    @property
    def Function(self) -> SimMultiValueFunction: ...
    @property
    def GraphName(self) -> str: ...
    @property
    def TargetParameter(self) -> SimBaseParameter: ...
    @TargetParameter.setter
    def TargetParameter(self, value: SimBaseParameter) -> SimBaseParameter: ...
    @property
    def ValueField(self) -> SimMultiValue: ...
    def Clone(self) -> SimParameterValueSource: ...
    def GetValue(self) -> typing.Any: ...
    def IsSamePointer(self, other: SimMultiValueParameterSource) -> bool: ...
    def SetFromParameters(self, axisValueX: float, axisValueY: float, axisValueZ: float, gs: str) -> None: ...


class SimMultiValueFunctionPointList(IEnumerable_1[SimPoint3D], INotifyCollectionChanged):
    def __init__(self, graph: SimMultiValueFunctionGraph, points: IEnumerable_1[SimPoint3D]) -> None: ...
    @property
    def Count(self) -> int: ...
    @property
    def Item(self) -> SimPoint3D: ...
    @Item.setter
    def Item(self, value: SimPoint3D) -> SimPoint3D: ...
    def Add(self, item: SimPoint3D) -> None: ...
    def GetEnumerator(self) -> IEnumerator_1[SimPoint3D]: ...
    def Insert(self, index: int, item: SimPoint3D) -> None: ...
    def RemoveAt(self, index: int) -> None: ...


class SimMultiValueParameterSource(SimParameterValueSource):
    @property
    def TargetParameter(self) -> SimBaseParameter: ...
    @TargetParameter.setter
    def TargetParameter(self, value: SimBaseParameter) -> SimBaseParameter: ...
    @property
    def ValueField(self) -> SimMultiValue: ...
    def CreateValuePointerParameters(self, user: SimUser) -> None: ...
    @abc.abstractmethod
    def GetValue(self) -> typing.Any: ...
    @abc.abstractmethod
    def IsSamePointer(self, other: SimMultiValueParameterSource) -> bool: ...
    @abc.abstractmethod
    def SetFromParameters(self, axisValueX: float, axisValueY: float, axisValueZ: float, graphName: str) -> None: ...


class SimMultiValueType(typing.SupportsInt):
    @typing.overload
    def __init__(self, value : int) -> None: ...
    @typing.overload
    def __init__(self, value : int, force_if_true: bool) -> None: ...
    def __int__(self) -> int: ...
    
    # Values:
    Function : SimMultiValueType # 0
    Field3D : SimMultiValueType # 1
    BigTable : SimMultiValueType # 2

