import typing, abc
from SIMULTAN.Projects import ProjectData
from System.IO import FileInfo
from System.Collections.Generic import List_1, IEnumerable_1, KeyValuePair_2
from SIMULTAN.Data.SimNetworks import SimNetwork, BaseSimNetworkElement, SimNetworkBlock, SimNetworkConnector, SimNetworkPort
from SIMULTAN.Data.Components import SimBaseParameter, SimBoolParameter, SimChildComponentEntry, SimComponent, SimDoubleParameter, SimEnumParameter, SimInstancePlacementGeometry, SimInstancePlacementNetwork, SimInstancePlacementSimNetwork, SimComponentInstance, SimInstanceSize, SimIntegerParameter, SimSlot, SimStringParameter
from SIMULTAN.Data.SimMath import SimPoint, SimQuaternion, SimVector3D
from SIMULTAN.Data.Taxonomy import SimTaxonomyEntryOrString, SimTaxonomyEntryReference

class JSONExporter(abc.ABC):
    @staticmethod
    def Export(projectData: ProjectData, fileToSave: FileInfo) -> None: ...
    @staticmethod
    def ExportNetworks(projectData: ProjectData, networks: List_1[SimNetwork], fileToSave: FileInfo) -> None: ...


class JSONExportHelpers(abc.ABC):
    @staticmethod
    def GetRootNetwork(element: BaseSimNetworkElement) -> SimNetwork: ...


class ProjectSerializable:
    @typing.overload
    def __init__(self, projectData: ProjectData) -> None: ...
    @typing.overload
    def __init__(self, projectData: ProjectData, components: List_1[SimComponentSerializable], networks: List_1[SimNetworkSerializable]) -> None: ...
    @property
    def Components(self) -> List_1[SimComponentSerializable]: ...
    @Components.setter
    def Components(self, value: List_1[SimComponentSerializable]) -> List_1[SimComponentSerializable]: ...
    @property
    def FileVersion(self) -> int: ...
    @property
    def GlobalId(self) -> str: ...
    @GlobalId.setter
    def GlobalId(self, value: str) -> str: ...
    @property
    def SimNetworks(self) -> List_1[SimNetworkSerializable]: ...
    @SimNetworks.setter
    def SimNetworks(self, value: List_1[SimNetworkSerializable]) -> List_1[SimNetworkSerializable]: ...


class SimBaseParameterSerializable(abc.ABC):
    def __init__(self, param: SimBaseParameter) -> None: ...
    @property
    def Category(self) -> str: ...
    @Category.setter
    def Category(self, value: str) -> str: ...
    @property
    def Description(self) -> str: ...
    @Description.setter
    def Description(self, value: str) -> str: ...
    @property
    def Id(self) -> int: ...
    @Id.setter
    def Id(self, value: int) -> int: ...
    @property
    def IsAutomaticallyGenerated(self) -> bool: ...
    @IsAutomaticallyGenerated.setter
    def IsAutomaticallyGenerated(self, value: bool) -> bool: ...
    @property
    def Name(self) -> SimTaxonomyEntryOrStringSerializable: ...
    @Name.setter
    def Name(self, value: SimTaxonomyEntryOrStringSerializable) -> SimTaxonomyEntryOrStringSerializable: ...
    @property
    def Value(self) -> str: ...
    @Value.setter
    def Value(self, value: str) -> str: ...


class SimBoolParameterSerializable(SimBaseParameterSerializable):
    def __init__(self, param: SimBoolParameter) -> None: ...
    @property
    def Category(self) -> str: ...
    @Category.setter
    def Category(self, value: str) -> str: ...
    @property
    def Description(self) -> str: ...
    @Description.setter
    def Description(self, value: str) -> str: ...
    @property
    def Id(self) -> int: ...
    @Id.setter
    def Id(self, value: int) -> int: ...
    @property
    def IsAutomaticallyGenerated(self) -> bool: ...
    @IsAutomaticallyGenerated.setter
    def IsAutomaticallyGenerated(self, value: bool) -> bool: ...
    @property
    def Name(self) -> SimTaxonomyEntryOrStringSerializable: ...
    @Name.setter
    def Name(self, value: SimTaxonomyEntryOrStringSerializable) -> SimTaxonomyEntryOrStringSerializable: ...
    @property
    def Value(self) -> str: ...
    @Value.setter
    def Value(self, value: str) -> str: ...


class SimChildComponentSerializable:
    def __init__(self, childComp: SimChildComponentEntry) -> None: ...
    @property
    def Component(self) -> SimComponentSerializable: ...
    @Component.setter
    def Component(self, value: SimComponentSerializable) -> SimComponentSerializable: ...
    @property
    def Slot(self) -> SimSlotSerializable: ...
    @Slot.setter
    def Slot(self, value: SimSlotSerializable) -> SimSlotSerializable: ...


class SimComponentSerializable:
    def __init__(self, component: SimComponent) -> None: ...
    @property
    def Components(self) -> List_1[SimChildComponentSerializable]: ...
    @Components.setter
    def Components(self, value: List_1[SimChildComponentSerializable]) -> List_1[SimChildComponentSerializable]: ...
    @property
    def Description(self) -> str: ...
    @Description.setter
    def Description(self, value: str) -> str: ...
    @property
    def Id(self) -> int: ...
    @Id.setter
    def Id(self, value: int) -> int: ...
    @property
    def Instances(self) -> List_1[SimInstanceSerializable]: ...
    @Instances.setter
    def Instances(self, value: List_1[SimInstanceSerializable]) -> List_1[SimInstanceSerializable]: ...
    @property
    def InstanceType(self) -> str: ...
    @InstanceType.setter
    def InstanceType(self, value: str) -> str: ...
    @property
    def Name(self) -> str: ...
    @Name.setter
    def Name(self, value: str) -> str: ...
    @property
    def Parameters(self) -> List_1[SimBaseParameterSerializable]: ...
    @Parameters.setter
    def Parameters(self, value: List_1[SimBaseParameterSerializable]) -> List_1[SimBaseParameterSerializable]: ...
    @property
    def Slots(self) -> IEnumerable_1[SimTaxonomyEntryReferenceSerializable]: ...
    @Slots.setter
    def Slots(self, value: IEnumerable_1[SimTaxonomyEntryReferenceSerializable]) -> IEnumerable_1[SimTaxonomyEntryReferenceSerializable]: ...


class SimDoubleParameterSerializable(SimBaseParameterSerializable):
    def __init__(self, param: SimDoubleParameter) -> None: ...
    @property
    def Category(self) -> str: ...
    @Category.setter
    def Category(self, value: str) -> str: ...
    @property
    def Description(self) -> str: ...
    @Description.setter
    def Description(self, value: str) -> str: ...
    @property
    def Id(self) -> int: ...
    @Id.setter
    def Id(self, value: int) -> int: ...
    @property
    def IsAutomaticallyGenerated(self) -> bool: ...
    @IsAutomaticallyGenerated.setter
    def IsAutomaticallyGenerated(self, value: bool) -> bool: ...
    @property
    def Name(self) -> SimTaxonomyEntryOrStringSerializable: ...
    @Name.setter
    def Name(self, value: SimTaxonomyEntryOrStringSerializable) -> SimTaxonomyEntryOrStringSerializable: ...
    @property
    def Unit(self) -> str: ...
    @Unit.setter
    def Unit(self, value: str) -> str: ...
    @property
    def Value(self) -> str: ...
    @Value.setter
    def Value(self, value: str) -> str: ...
    @property
    def ValueMax(self) -> str: ...
    @ValueMax.setter
    def ValueMax(self, value: str) -> str: ...
    @property
    def ValueMin(self) -> str: ...
    @ValueMin.setter
    def ValueMin(self, value: str) -> str: ...


class SimEnumParameterSerializable(SimBaseParameterSerializable):
    def __init__(self, param: SimEnumParameter) -> None: ...
    @property
    def Category(self) -> str: ...
    @Category.setter
    def Category(self, value: str) -> str: ...
    @property
    def Description(self) -> str: ...
    @Description.setter
    def Description(self, value: str) -> str: ...
    @property
    def Id(self) -> int: ...
    @Id.setter
    def Id(self, value: int) -> int: ...
    @property
    def IsAutomaticallyGenerated(self) -> bool: ...
    @IsAutomaticallyGenerated.setter
    def IsAutomaticallyGenerated(self, value: bool) -> bool: ...
    @property
    def Items(self) -> List_1[str]: ...
    @Items.setter
    def Items(self, value: List_1[str]) -> List_1[str]: ...
    @property
    def Name(self) -> SimTaxonomyEntryOrStringSerializable: ...
    @Name.setter
    def Name(self, value: SimTaxonomyEntryOrStringSerializable) -> SimTaxonomyEntryOrStringSerializable: ...
    @property
    def Value(self) -> str: ...
    @Value.setter
    def Value(self, value: str) -> str: ...


class SimInstancePlacementGeometrySerializable(SimInstancePlacementSerializable):
    def __init__(self, placement: SimInstancePlacementGeometry) -> None: ...
    @property
    def FileId(self) -> int: ...
    @FileId.setter
    def FileId(self, value: int) -> int: ...
    @property
    def GeometryId(self) -> int: ...
    @GeometryId.setter
    def GeometryId(self, value: int) -> int: ...
    @property
    def InstanceType(self) -> str: ...
    @InstanceType.setter
    def InstanceType(self, value: str) -> str: ...


class SimInstancePlacementNetworkSerializable(SimInstancePlacementSerializable):
    def __init__(self, placement: SimInstancePlacementNetwork) -> None: ...
    @property
    def InstanceType(self) -> str: ...
    @InstanceType.setter
    def InstanceType(self, value: str) -> str: ...
    @property
    def NetworkElementId(self) -> int: ...
    @NetworkElementId.setter
    def NetworkElementId(self, value: int) -> int: ...
    @property
    def NetworkId(self) -> int: ...
    @NetworkId.setter
    def NetworkId(self, value: int) -> int: ...


class SimInstancePlacementSerializable(abc.ABC):
    @property
    def InstanceType(self) -> str: ...
    @InstanceType.setter
    def InstanceType(self, value: str) -> str: ...


class SimInstancePlacementSimNetworkSerializable(SimInstancePlacementSerializable):
    def __init__(self, placement: SimInstancePlacementSimNetwork) -> None: ...
    @property
    def InstanceType(self) -> str: ...
    @InstanceType.setter
    def InstanceType(self, value: str) -> str: ...
    @property
    def NetworkElementId(self) -> int: ...
    @NetworkElementId.setter
    def NetworkElementId(self, value: int) -> int: ...
    @property
    def NetworkId(self) -> int: ...
    @NetworkId.setter
    def NetworkId(self, value: int) -> int: ...


class SimInstanceSerializable:
    def __init__(self, instance: SimComponentInstance) -> None: ...
    @property
    def Id(self) -> int: ...
    @Id.setter
    def Id(self, value: int) -> int: ...
    @property
    def InstanceParameters(self) -> List_1[KeyValuePair_2[int, str]]: ...
    @InstanceParameters.setter
    def InstanceParameters(self, value: List_1[KeyValuePair_2[int, str]]) -> List_1[KeyValuePair_2[int, str]]: ...
    @property
    def InstanceRotation(self) -> SimQuaternionSerializable: ...
    @InstanceRotation.setter
    def InstanceRotation(self, value: SimQuaternionSerializable) -> SimQuaternionSerializable: ...
    @property
    def InstanceSize(self) -> SimInstanceSizeSerializable: ...
    @InstanceSize.setter
    def InstanceSize(self, value: SimInstanceSizeSerializable) -> SimInstanceSizeSerializable: ...
    @property
    def Name(self) -> str: ...
    @Name.setter
    def Name(self, value: str) -> str: ...
    @property
    def Placements(self) -> List_1[SimInstancePlacementSerializable]: ...
    @Placements.setter
    def Placements(self, value: List_1[SimInstancePlacementSerializable]) -> List_1[SimInstancePlacementSerializable]: ...


class SimInstanceSizeSerializable:
    def __init__(self, instanceSize: SimInstanceSize) -> None: ...
    @property
    def Max(self) -> SimVector3DSerializable: ...
    @Max.setter
    def Max(self, value: SimVector3DSerializable) -> SimVector3DSerializable: ...
    @property
    def Min(self) -> SimVector3DSerializable: ...
    @Min.setter
    def Min(self, value: SimVector3DSerializable) -> SimVector3DSerializable: ...


class SimIntegerParameterSerializable(SimBaseParameterSerializable):
    def __init__(self, param: SimIntegerParameter) -> None: ...
    @property
    def Category(self) -> str: ...
    @Category.setter
    def Category(self, value: str) -> str: ...
    @property
    def Description(self) -> str: ...
    @Description.setter
    def Description(self, value: str) -> str: ...
    @property
    def Id(self) -> int: ...
    @Id.setter
    def Id(self, value: int) -> int: ...
    @property
    def IsAutomaticallyGenerated(self) -> bool: ...
    @IsAutomaticallyGenerated.setter
    def IsAutomaticallyGenerated(self, value: bool) -> bool: ...
    @property
    def Name(self) -> SimTaxonomyEntryOrStringSerializable: ...
    @Name.setter
    def Name(self, value: SimTaxonomyEntryOrStringSerializable) -> SimTaxonomyEntryOrStringSerializable: ...
    @property
    def Unit(self) -> str: ...
    @Unit.setter
    def Unit(self, value: str) -> str: ...
    @property
    def Value(self) -> str: ...
    @Value.setter
    def Value(self, value: str) -> str: ...
    @property
    def ValueMax(self) -> str: ...
    @ValueMax.setter
    def ValueMax(self, value: str) -> str: ...
    @property
    def ValueMin(self) -> str: ...
    @ValueMin.setter
    def ValueMin(self, value: str) -> str: ...


class SimNetworkBlockSerializable:
    def __init__(self, block: SimNetworkBlock) -> None: ...
    @property
    def Color(self) -> str: ...
    @Color.setter
    def Color(self, value: str) -> str: ...
    @property
    def Id(self) -> int: ...
    @Id.setter
    def Id(self, value: int) -> int: ...
    @property
    def Name(self) -> str: ...
    @Name.setter
    def Name(self, value: str) -> str: ...
    @property
    def Ports(self) -> List_1[SimNetworkPortSerializable]: ...
    @Ports.setter
    def Ports(self, value: List_1[SimNetworkPortSerializable]) -> List_1[SimNetworkPortSerializable]: ...
    @property
    def Position(self) -> SimPointSerializable: ...
    @Position.setter
    def Position(self, value: SimPointSerializable) -> SimPointSerializable: ...


class SimNetworkConnectorSerializable:
    def __init__(self, connector: SimNetworkConnector) -> None: ...
    @property
    def Color(self) -> str: ...
    @Color.setter
    def Color(self, value: str) -> str: ...
    @property
    def Source(self) -> int: ...
    @Source.setter
    def Source(self, value: int) -> int: ...
    @property
    def Target(self) -> int: ...
    @Target.setter
    def Target(self, value: int) -> int: ...


class SimNetworkPortSerializable:
    def __init__(self, port: SimNetworkPort) -> None: ...
    @property
    def Color(self) -> str: ...
    @Color.setter
    def Color(self, value: str) -> str: ...
    @property
    def Id(self) -> int: ...
    @Id.setter
    def Id(self, value: int) -> int: ...
    @property
    def Name(self) -> str: ...
    @Name.setter
    def Name(self, value: str) -> str: ...
    @property
    def PortType(self) -> str: ...
    @PortType.setter
    def PortType(self, value: str) -> str: ...


class SimNetworkSerializable:
    def __init__(self, network: SimNetwork) -> None: ...
    @property
    def Blocks(self) -> List_1[SimNetworkBlockSerializable]: ...
    @Blocks.setter
    def Blocks(self, value: List_1[SimNetworkBlockSerializable]) -> List_1[SimNetworkBlockSerializable]: ...
    @property
    def Color(self) -> str: ...
    @Color.setter
    def Color(self, value: str) -> str: ...
    @property
    def Connectors(self) -> List_1[SimNetworkConnectorSerializable]: ...
    @Connectors.setter
    def Connectors(self, value: List_1[SimNetworkConnectorSerializable]) -> List_1[SimNetworkConnectorSerializable]: ...
    @property
    def Id(self) -> int: ...
    @Id.setter
    def Id(self, value: int) -> int: ...
    @property
    def Name(self) -> str: ...
    @Name.setter
    def Name(self, value: str) -> str: ...
    @property
    def Ports(self) -> List_1[SimNetworkPortSerializable]: ...
    @Ports.setter
    def Ports(self, value: List_1[SimNetworkPortSerializable]) -> List_1[SimNetworkPortSerializable]: ...
    @property
    def Position(self) -> SimPointSerializable: ...
    @Position.setter
    def Position(self, value: SimPointSerializable) -> SimPointSerializable: ...
    @property
    def Subnetworks(self) -> List_1[SimNetworkSerializable]: ...
    @Subnetworks.setter
    def Subnetworks(self, value: List_1[SimNetworkSerializable]) -> List_1[SimNetworkSerializable]: ...
    @staticmethod
    def GetComponentInstances(network: SimNetwork) -> List_1[SimComponent]: ...


class SimPointSerializable:
    def __init__(self, point: SimPoint) -> None: ...
    @property
    def X(self) -> float: ...
    @X.setter
    def X(self, value: float) -> float: ...
    @property
    def Y(self) -> float: ...
    @Y.setter
    def Y(self, value: float) -> float: ...


class SimQuaternionSerializable:
    def __init__(self, vector: SimQuaternion) -> None: ...
    @property
    def W(self) -> float: ...
    @W.setter
    def W(self, value: float) -> float: ...
    @property
    def X(self) -> float: ...
    @X.setter
    def X(self, value: float) -> float: ...
    @property
    def Y(self) -> float: ...
    @Y.setter
    def Y(self, value: float) -> float: ...
    @property
    def Z(self) -> float: ...
    @Z.setter
    def Z(self, value: float) -> float: ...


class SimSlotSerializable:
    def __init__(self, slot: SimSlot) -> None: ...
    @property
    def Slot(self) -> SimTaxonomyEntryReferenceSerializable: ...
    @Slot.setter
    def Slot(self, value: SimTaxonomyEntryReferenceSerializable) -> SimTaxonomyEntryReferenceSerializable: ...
    @property
    def SlotExtension(self) -> str: ...
    @SlotExtension.setter
    def SlotExtension(self, value: str) -> str: ...


class SimStringParameterSerializable(SimBaseParameterSerializable):
    def __init__(self, param: SimStringParameter) -> None: ...
    @property
    def Category(self) -> str: ...
    @Category.setter
    def Category(self, value: str) -> str: ...
    @property
    def Description(self) -> str: ...
    @Description.setter
    def Description(self, value: str) -> str: ...
    @property
    def Id(self) -> int: ...
    @Id.setter
    def Id(self, value: int) -> int: ...
    @property
    def IsAutomaticallyGenerated(self) -> bool: ...
    @IsAutomaticallyGenerated.setter
    def IsAutomaticallyGenerated(self, value: bool) -> bool: ...
    @property
    def Name(self) -> SimTaxonomyEntryOrStringSerializable: ...
    @Name.setter
    def Name(self, value: SimTaxonomyEntryOrStringSerializable) -> SimTaxonomyEntryOrStringSerializable: ...
    @property
    def Value(self) -> str: ...
    @Value.setter
    def Value(self, value: str) -> str: ...


class SimTaxonomyEntryOrStringSerializable:
    def __init__(self, entry: SimTaxonomyEntryOrString) -> None: ...
    @property
    def TaxonomyEntry(self) -> SimTaxonomyEntryReferenceSerializable: ...
    @TaxonomyEntry.setter
    def TaxonomyEntry(self, value: SimTaxonomyEntryReferenceSerializable) -> SimTaxonomyEntryReferenceSerializable: ...
    @property
    def Text(self) -> str: ...
    @Text.setter
    def Text(self, value: str) -> str: ...


class SimTaxonomyEntryReferenceSerializable:
    def __init__(self, reference: SimTaxonomyEntryReference) -> None: ...
    @property
    def TaxonomyEntryKey(self) -> str: ...
    @TaxonomyEntryKey.setter
    def TaxonomyEntryKey(self, value: str) -> str: ...
    @property
    def TaxonomyKey(self) -> str: ...
    @TaxonomyKey.setter
    def TaxonomyKey(self, value: str) -> str: ...


class SimVector3DSerializable:
    def __init__(self, vector: SimVector3D) -> None: ...
    @property
    def X(self) -> float: ...
    @X.setter
    def X(self, value: float) -> float: ...
    @property
    def Y(self) -> float: ...
    @Y.setter
    def Y(self, value: float) -> float: ...
    @property
    def Z(self) -> float: ...
    @Z.setter
    def Z(self, value: float) -> float: ...

