from enum import IntEnum
from typing import overload, NewType, Optional, Tuple

from OCC.Core.Standard import *
from OCC.Core.NCollection import *
from OCC.Core.Message import *
from OCC.Core.TopoDS import *
from OCC.Core.Geom import *
from OCC.Core.GeomAbs import *
from OCC.Core.gp import *
from OCC.Core.TColGeom import *
from OCC.Core.TColStd import *
from OCC.Core.TopTools import *
from OCC.Core.TopAbs import *


class ShapeExtend_Status(IntEnum):
	ShapeExtend_OK: int = ...
	ShapeExtend_DONE1: int = ...
	ShapeExtend_DONE2: int = ...
	ShapeExtend_DONE3: int = ...
	ShapeExtend_DONE4: int = ...
	ShapeExtend_DONE5: int = ...
	ShapeExtend_DONE6: int = ...
	ShapeExtend_DONE7: int = ...
	ShapeExtend_DONE8: int = ...
	ShapeExtend_DONE: int = ...
	ShapeExtend_FAIL1: int = ...
	ShapeExtend_FAIL2: int = ...
	ShapeExtend_FAIL3: int = ...
	ShapeExtend_FAIL4: int = ...
	ShapeExtend_FAIL5: int = ...
	ShapeExtend_FAIL6: int = ...
	ShapeExtend_FAIL7: int = ...
	ShapeExtend_FAIL8: int = ...
	ShapeExtend_FAIL: int = ...
ShapeExtend_OK = ShapeExtend_Status.ShapeExtend_OK
ShapeExtend_DONE1 = ShapeExtend_Status.ShapeExtend_DONE1
ShapeExtend_DONE2 = ShapeExtend_Status.ShapeExtend_DONE2
ShapeExtend_DONE3 = ShapeExtend_Status.ShapeExtend_DONE3
ShapeExtend_DONE4 = ShapeExtend_Status.ShapeExtend_DONE4
ShapeExtend_DONE5 = ShapeExtend_Status.ShapeExtend_DONE5
ShapeExtend_DONE6 = ShapeExtend_Status.ShapeExtend_DONE6
ShapeExtend_DONE7 = ShapeExtend_Status.ShapeExtend_DONE7
ShapeExtend_DONE8 = ShapeExtend_Status.ShapeExtend_DONE8
ShapeExtend_DONE = ShapeExtend_Status.ShapeExtend_DONE
ShapeExtend_FAIL1 = ShapeExtend_Status.ShapeExtend_FAIL1
ShapeExtend_FAIL2 = ShapeExtend_Status.ShapeExtend_FAIL2
ShapeExtend_FAIL3 = ShapeExtend_Status.ShapeExtend_FAIL3
ShapeExtend_FAIL4 = ShapeExtend_Status.ShapeExtend_FAIL4
ShapeExtend_FAIL5 = ShapeExtend_Status.ShapeExtend_FAIL5
ShapeExtend_FAIL6 = ShapeExtend_Status.ShapeExtend_FAIL6
ShapeExtend_FAIL7 = ShapeExtend_Status.ShapeExtend_FAIL7
ShapeExtend_FAIL8 = ShapeExtend_Status.ShapeExtend_FAIL8
ShapeExtend_FAIL = ShapeExtend_Status.ShapeExtend_FAIL

class ShapeExtend_Parametrisation(IntEnum):
	ShapeExtend_Natural: int = ...
	ShapeExtend_Uniform: int = ...
	ShapeExtend_Unitary: int = ...
ShapeExtend_Natural = ShapeExtend_Parametrisation.ShapeExtend_Natural
ShapeExtend_Uniform = ShapeExtend_Parametrisation.ShapeExtend_Uniform
ShapeExtend_Unitary = ShapeExtend_Parametrisation.ShapeExtend_Unitary

class shapeextend:
	@staticmethod
	def DecodeStatus(flag: int, status: ShapeExtend_Status) -> bool: ...
	@staticmethod
	def EncodeStatus(status: ShapeExtend_Status) -> int: ...
	@staticmethod
	def Init() -> None: ...

class ShapeExtend_BasicMsgRegistrator(Standard_Transient):
	def __init__(self) -> None: ...
	@overload
	def Send(self, object: Standard_Transient, message: Message_Msg, gravity: Message_Gravity) -> None: ...
	@overload
	def Send(self, shape: TopoDS_Shape, message: Message_Msg, gravity: Message_Gravity) -> None: ...
	@overload
	def Send(self, message: Message_Msg, gravity: Message_Gravity) -> None: ...

class ShapeExtend_ComplexCurve(Geom_Curve):
	def CheckConnectivity(self, Preci: float) -> bool: ...
	def Continuity(self) -> GeomAbs_Shape: ...
	def Curve(self, index: int) -> Geom_Curve: ...
	def D0(self, U: float, P: gp_Pnt) -> None: ...
	def D1(self, U: float, P: gp_Pnt, V1: gp_Vec) -> None: ...
	def D2(self, U: float, P: gp_Pnt, V1: gp_Vec, V2: gp_Vec) -> None: ...
	def D3(self, U: float, P: gp_Pnt, V1: gp_Vec, V2: gp_Vec, V3: gp_Vec) -> None: ...
	def DN(self, U: float, N: int) -> gp_Vec: ...
	def FirstParameter(self) -> float: ...
	def GetScaleFactor(self, ind: int) -> float: ...
	def IsCN(self, N: int) -> bool: ...
	def IsClosed(self) -> bool: ...
	def IsPeriodic(self) -> bool: ...
	def LastParameter(self) -> float: ...
	def LocalToGlobal(self, index: int, Ulocal: float) -> float: ...
	def LocateParameter(self, U: float) -> Tuple[int, float]: ...
	def NbCurves(self) -> int: ...
	def ReversedParameter(self, U: float) -> float: ...
	def Transform(self, T: gp_Trsf) -> None: ...

class ShapeExtend_CompositeSurface(Geom_Surface):
	@overload
	def __init__(self) -> None: ...
	@overload
	def __init__(self, GridSurf: TColGeom_HArray2OfSurface, param: Optional[ShapeExtend_Parametrisation] = ShapeExtend_Natural) -> None: ...
	@overload
	def __init__(self, GridSurf: TColGeom_HArray2OfSurface, UJoints: TColStd_Array1OfReal, VJoints: TColStd_Array1OfReal) -> None: ...
	def Bounds(self) -> Tuple[float, float, float, float]: ...
	def CheckConnectivity(self, prec: float) -> bool: ...
	def ComputeJointValues(self, param: Optional[ShapeExtend_Parametrisation] = ShapeExtend_Natural) -> None: ...
	def Continuity(self) -> GeomAbs_Shape: ...
	def Copy(self) -> Geom_Geometry: ...
	def D0(self, U: float, V: float, P: gp_Pnt) -> None: ...
	def D1(self, U: float, V: float, P: gp_Pnt, D1U: gp_Vec, D1V: gp_Vec) -> None: ...
	def D2(self, U: float, V: float, P: gp_Pnt, D1U: gp_Vec, D1V: gp_Vec, D2U: gp_Vec, D2V: gp_Vec, D2UV: gp_Vec) -> None: ...
	def D3(self, U: float, V: float, P: gp_Pnt, D1U: gp_Vec, D1V: gp_Vec, D2U: gp_Vec, D2V: gp_Vec, D2UV: gp_Vec, D3U: gp_Vec, D3V: gp_Vec, D3UUV: gp_Vec, D3UVV: gp_Vec) -> None: ...
	def DN(self, U: float, V: float, Nu: int, Nv: int) -> gp_Vec: ...
	def GlobalToLocal(self, i: int, j: int, UV: gp_Pnt2d) -> gp_Pnt2d: ...
	def GlobalToLocalTransformation(self, i: int, j: int, Trsf: gp_Trsf2d) -> Tuple[bool, float]: ...
	@overload
	def Init(self, GridSurf: TColGeom_HArray2OfSurface, param: Optional[ShapeExtend_Parametrisation] = ShapeExtend_Natural) -> bool: ...
	@overload
	def Init(self, GridSurf: TColGeom_HArray2OfSurface, UJoints: TColStd_Array1OfReal, VJoints: TColStd_Array1OfReal) -> bool: ...
	def IsCNu(self, N: int) -> bool: ...
	def IsCNv(self, N: int) -> bool: ...
	def IsUClosed(self) -> bool: ...
	def IsUPeriodic(self) -> bool: ...
	def IsVClosed(self) -> bool: ...
	def IsVPeriodic(self) -> bool: ...
	def LocalToGlobal(self, i: int, j: int, uv: gp_Pnt2d) -> gp_Pnt2d: ...
	def LocateUParameter(self, U: float) -> int: ...
	def LocateUVPoint(self, pnt: gp_Pnt2d) -> Tuple[int, int]: ...
	def LocateVParameter(self, V: float) -> int: ...
	def NbUPatches(self) -> int: ...
	def NbVPatches(self) -> int: ...
	@overload
	def Patch(self, i: int, j: int) -> Geom_Surface: ...
	@overload
	def Patch(self, U: float, V: float) -> Geom_Surface: ...
	@overload
	def Patch(self, pnt: gp_Pnt2d) -> Geom_Surface: ...
	def Patches(self) -> TColGeom_HArray2OfSurface: ...
	def SetUFirstValue(self, UFirst: float) -> None: ...
	def SetUJointValues(self, UJoints: TColStd_Array1OfReal) -> bool: ...
	def SetVFirstValue(self, VFirst: float) -> None: ...
	def SetVJointValues(self, VJoints: TColStd_Array1OfReal) -> bool: ...
	def Transform(self, T: gp_Trsf) -> None: ...
	def UGlobalToLocal(self, i: int, j: int, U: float) -> float: ...
	def UIso(self, U: float) -> Geom_Curve: ...
	def UJointValue(self, i: int) -> float: ...
	def UJointValues(self) -> TColStd_HArray1OfReal: ...
	def ULocalToGlobal(self, i: int, j: int, u: float) -> float: ...
	def UReverse(self) -> None: ...
	def UReversedParameter(self, U: float) -> float: ...
	def VGlobalToLocal(self, i: int, j: int, V: float) -> float: ...
	def VIso(self, V: float) -> Geom_Curve: ...
	def VJointValue(self, j: int) -> float: ...
	def VJointValues(self) -> TColStd_HArray1OfReal: ...
	def VLocalToGlobal(self, i: int, j: int, v: float) -> float: ...
	def VReverse(self) -> None: ...
	def VReversedParameter(self, V: float) -> float: ...
	def Value(self, pnt: gp_Pnt2d) -> gp_Pnt: ...

class ShapeExtend_Explorer:
	def __init__(self) -> None: ...
	def CompoundFromSeq(self, seqval: TopTools_HSequenceOfShape) -> TopoDS_Shape: ...
	def DispatchList(self, list: TopTools_HSequenceOfShape, vertices: TopTools_HSequenceOfShape, edges: TopTools_HSequenceOfShape, wires: TopTools_HSequenceOfShape, faces: TopTools_HSequenceOfShape, shells: TopTools_HSequenceOfShape, solids: TopTools_HSequenceOfShape, compsols: TopTools_HSequenceOfShape, compounds: TopTools_HSequenceOfShape) -> None: ...
	def ListFromSeq(self, seqval: TopTools_HSequenceOfShape, lisval: TopTools_ListOfShape, clear: Optional[bool] = True) -> None: ...
	def SeqFromCompound(self, comp: TopoDS_Shape, expcomp: bool) -> TopTools_HSequenceOfShape: ...
	def SeqFromList(self, lisval: TopTools_ListOfShape) -> TopTools_HSequenceOfShape: ...
	def ShapeType(self, shape: TopoDS_Shape, compound: bool) -> TopAbs_ShapeEnum: ...
	def SortedCompound(self, shape: TopoDS_Shape, type: TopAbs_ShapeEnum, explore: bool, compound: bool) -> TopoDS_Shape: ...

class ShapeExtend_WireData(Standard_Transient):
	@overload
	def __init__(self) -> None: ...
	@overload
	def __init__(self, wire: TopoDS_Wire, chained: Optional[bool] = True, theManifoldMode: Optional[bool] = True) -> None: ...
	@overload
	def Add(self, edge: TopoDS_Edge, atnum: Optional[int] = 0) -> None: ...
	@overload
	def Add(self, wire: TopoDS_Wire, atnum: Optional[int] = 0) -> None: ...
	@overload
	def Add(self, wire: ShapeExtend_WireData, atnum: Optional[int] = 0) -> None: ...
	@overload
	def Add(self, shape: TopoDS_Shape, atnum: Optional[int] = 0) -> None: ...
	@overload
	def AddOriented(self, edge: TopoDS_Edge, mode: int) -> None: ...
	@overload
	def AddOriented(self, wire: TopoDS_Wire, mode: int) -> None: ...
	@overload
	def AddOriented(self, shape: TopoDS_Shape, mode: int) -> None: ...
	def Clear(self) -> None: ...
	def ComputeSeams(self, enforce: Optional[bool] = True) -> None: ...
	def Edge(self, num: int) -> TopoDS_Edge: ...
	def Index(self, edge: TopoDS_Edge) -> int: ...
	@overload
	def Init(self, other: ShapeExtend_WireData) -> None: ...
	@overload
	def Init(self, wire: TopoDS_Wire, chained: Optional[bool] = True, theManifoldMode: Optional[bool] = True) -> bool: ...
	def IsSeam(self, num: int) -> bool: ...
	def GetManifoldMode(self) -> bool: ...
	def SetManifoldMode(self, value: bool) -> None: ...
	def NbEdges(self) -> int: ...
	def NbNonManifoldEdges(self) -> int: ...
	def NonmanifoldEdge(self, num: int) -> TopoDS_Edge: ...
	def NonmanifoldEdges(self) -> TopTools_HSequenceOfShape: ...
	def Remove(self, num: Optional[int] = 0) -> None: ...
	@overload
	def Reverse(self) -> None: ...
	@overload
	def Reverse(self, face: TopoDS_Face) -> None: ...
	def Set(self, edge: TopoDS_Edge, num: Optional[int] = 0) -> None: ...
	def SetDegeneratedLast(self) -> None: ...
	def SetLast(self, num: int) -> None: ...
	def Wire(self) -> TopoDS_Wire: ...
	def WireAPIMake(self) -> TopoDS_Wire: ...

class ShapeExtend_MsgRegistrator(ShapeExtend_BasicMsgRegistrator):
	def __init__(self) -> None: ...
	def MapShape(self) -> ShapeExtend_DataMapOfShapeListOfMsg: ...
	def MapTransient(self) -> ShapeExtend_DataMapOfTransientListOfMsg: ...
	@overload
	def Send(self, object: Standard_Transient, message: Message_Msg, gravity: Message_Gravity) -> None: ...
	@overload
	def Send(self, shape: TopoDS_Shape, message: Message_Msg, gravity: Message_Gravity) -> None: ...

# harray1 classes
# harray2 classes
# hsequence classes

shapeextend_DecodeStatus = shapeextend.DecodeStatus
shapeextend_EncodeStatus = shapeextend.EncodeStatus
shapeextend_Init = shapeextend.Init
