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

from OCC.Core.Standard import *
from OCC.Core.NCollection import *
from OCC.Core.Adaptor3d import *
from OCC.Core.TColStd import *
from OCC.Core.Adaptor2d import *
from OCC.Core.GeomAbs import *
from OCC.Core.Geom2d import *
from OCC.Core.Geom import *
from OCC.Core.AppCont import *
from OCC.Core.AppParCurves import *
from OCC.Core.TColgp import *
from OCC.Core.gp import *


class Approx_Array1OfAdHSurface:
    @overload
    def __init__(self) -> None: ...
    @overload
    def __init__(self, theLower: int, theUpper: int) -> None: ...
    def __getitem__(self, index: int) -> False: ...
    def __setitem__(self, index: int, value: False) -> None: ...
    def __len__(self) -> int: ...
    def __iter__(self) -> Iterator[False]: ...
    def next(self) -> False: ...
    __next__ = next
    def Init(self, theValue: False) -> None: ...
    def Size(self) -> int: ...
    def Length(self) -> int: ...
    def IsEmpty(self) -> bool: ...
    def Lower(self) -> int: ...
    def Upper(self) -> int: ...
    def IsDetectable(self) -> bool: ...
    def IsAllocated(self) -> bool: ...
    def First(self) -> False: ...
    def Last(self) -> False: ...
    def Value(self, theIndex: int) -> False: ...
    def SetValue(self, theIndex: int, theValue: False) -> None: ...

class Approx_Array1OfGTrsf2d:
    @overload
    def __init__(self) -> None: ...
    @overload
    def __init__(self, theLower: int, theUpper: int) -> None: ...
    def __getitem__(self, index: int) -> gp_GTrsf2d: ...
    def __setitem__(self, index: int, value: gp_GTrsf2d) -> None: ...
    def __len__(self) -> int: ...
    def __iter__(self) -> Iterator[gp_GTrsf2d]: ...
    def next(self) -> gp_GTrsf2d: ...
    __next__ = next
    def Init(self, theValue: gp_GTrsf2d) -> None: ...
    def Size(self) -> int: ...
    def Length(self) -> int: ...
    def IsEmpty(self) -> bool: ...
    def Lower(self) -> int: ...
    def Upper(self) -> int: ...
    def IsDetectable(self) -> bool: ...
    def IsAllocated(self) -> bool: ...
    def First(self) -> gp_GTrsf2d: ...
    def Last(self) -> gp_GTrsf2d: ...
    def Value(self, theIndex: int) -> gp_GTrsf2d: ...
    def SetValue(self, theIndex: int, theValue: gp_GTrsf2d) -> None: ...

class Approx_SequenceOfHArray1OfReal:
    def __init__(self) -> None: ...
    def __len__(self) -> int: ...
    def Size(self) -> int: ...
    def Clear(self) -> None: ...
    def First(self) -> False: ...
    def Last(self) -> False: ...
    def Length(self) -> int: ...
    def Append(self, theItem: False) -> False: ...
    def Prepend(self, theItem: False) -> False: ...
    def RemoveFirst(self) -> None: ...
    def Reverse(self) -> None: ...
    def Value(self, theIndex: int) -> False: ...
    def SetValue(self, theIndex: int, theValue: False) -> None: ...

class Approx_ParametrizationType(IntEnum):
    Approx_ChordLength: int = ...
    Approx_Centripetal: int = ...
    Approx_IsoParametric: int = ...

Approx_ChordLength = Approx_ParametrizationType.Approx_ChordLength
Approx_Centripetal = Approx_ParametrizationType.Approx_Centripetal
Approx_IsoParametric = Approx_ParametrizationType.Approx_IsoParametric

class Approx_Status(IntEnum):
    Approx_PointsAdded: int = ...
    Approx_NoPointsAdded: int = ...
    Approx_NoApproximation: int = ...

Approx_PointsAdded = Approx_Status.Approx_PointsAdded
Approx_NoPointsAdded = Approx_Status.Approx_NoPointsAdded
Approx_NoApproximation = Approx_Status.Approx_NoApproximation

class Approx_Curve2d:
    def __init__(self, C2D: Adaptor2d_Curve2d, First: float, Last: float, TolU: float, TolV: float, Continuity: GeomAbs_Shape, MaxDegree: int, MaxSegments: int) -> None: ...
    def Curve(self) -> Geom2d_BSplineCurve: ...
    def HasResult(self) -> bool: ...
    def IsDone(self) -> bool: ...
    def MaxError2dU(self) -> float: ...
    def MaxError2dV(self) -> float: ...

class Approx_Curve3d:
    def __init__(self, Curve: Adaptor3d_Curve, Tol3d: float, Order: GeomAbs_Shape, MaxSegments: int, MaxDegree: int) -> None: ...
    def Curve(self) -> Geom_BSplineCurve: ...
    def Dump(self) -> str: ...
    def HasResult(self) -> bool: ...
    def IsDone(self) -> bool: ...
    def MaxError(self) -> float: ...

class Approx_CurveOnSurface:
    @overload
    def __init__(self, C2D: Adaptor2d_Curve2d, Surf: Adaptor3d_Surface, First: float, Last: float, Tol: float, Continuity: GeomAbs_Shape, MaxDegree: int, MaxSegments: int, Only3d: Optional[bool] = False, Only2d: Optional[bool] = False) -> None: ...
    @overload
    def __init__(self, theC2D: Adaptor2d_Curve2d, theSurf: Adaptor3d_Surface, theFirst: float, theLast: float, theTol: float) -> None: ...
    def Curve2d(self) -> Geom2d_BSplineCurve: ...
    def Curve3d(self) -> Geom_BSplineCurve: ...
    def HasResult(self) -> bool: ...
    def IsDone(self) -> bool: ...
    def MaxError2dU(self) -> float: ...
    def MaxError2dV(self) -> float: ...
    def MaxError3d(self) -> float: ...
    def Perform(self, theMaxSegments: int, theMaxDegree: int, theContinuity: GeomAbs_Shape, theOnly3d: Optional[bool] = False, theOnly2d: Optional[bool] = False) -> None: ...

class Approx_CurvilinearParameter:
    @overload
    def __init__(self, C3D: Adaptor3d_Curve, Tol: float, Order: GeomAbs_Shape, MaxDegree: int, MaxSegments: int) -> None: ...
    @overload
    def __init__(self, C2D: Adaptor2d_Curve2d, Surf: Adaptor3d_Surface, Tol: float, Order: GeomAbs_Shape, MaxDegree: int, MaxSegments: int) -> None: ...
    @overload
    def __init__(self, C2D1: Adaptor2d_Curve2d, Surf1: Adaptor3d_Surface, C2D2: Adaptor2d_Curve2d, Surf2: Adaptor3d_Surface, Tol: float, Order: GeomAbs_Shape, MaxDegree: int, MaxSegments: int) -> None: ...
    def Curve2d1(self) -> Geom2d_BSplineCurve: ...
    def Curve2d2(self) -> Geom2d_BSplineCurve: ...
    def Curve3d(self) -> Geom_BSplineCurve: ...
    def Dump(self) -> str: ...
    def HasResult(self) -> bool: ...
    def IsDone(self) -> bool: ...
    def MaxError2d1(self) -> float: ...
    def MaxError2d2(self) -> float: ...
    def MaxError3d(self) -> float: ...

class Approx_CurvlinFunc(Standard_Transient):
    @overload
    def __init__(self, C: Adaptor3d_Curve, Tol: float) -> None: ...
    @overload
    def __init__(self, C2D: Adaptor2d_Curve2d, S: Adaptor3d_Surface, Tol: float) -> None: ...
    @overload
    def __init__(self, C2D1: Adaptor2d_Curve2d, C2D2: Adaptor2d_Curve2d, S1: Adaptor3d_Surface, S2: Adaptor3d_Surface, Tol: float) -> None: ...
    def EvalCase1(self, S: float, Order: int, Result: TColStd_Array1OfReal) -> bool: ...
    def EvalCase2(self, S: float, Order: int, Result: TColStd_Array1OfReal) -> bool: ...
    def EvalCase3(self, S: float, Order: int, Result: TColStd_Array1OfReal) -> bool: ...
    def FirstParameter(self) -> float: ...
    def GetLength(self) -> float: ...
    def GetSParameter(self, U: float) -> float: ...
    def GetUParameter(self, C: Adaptor3d_Curve, S: float, NumberOfCurve: int) -> float: ...
    def Intervals(self, T: TColStd_Array1OfReal, S: GeomAbs_Shape) -> None: ...
    def LastParameter(self) -> float: ...
    @overload
    def Length(self) -> None: ...
    @overload
    def Length(self, C: Adaptor3d_Curve, FirstU: float, LasrU: float) -> float: ...
    def NbIntervals(self, S: GeomAbs_Shape) -> int: ...
    def SetTol(self, Tol: float) -> None: ...
    def Trim(self, First: float, Last: float, Tol: float) -> None: ...

class Approx_FitAndDivide:
    @overload
    def __init__(self, Line: AppCont_Function, degreemin: Optional[int] = 3, degreemax: Optional[int] = 8, Tolerance3d: Optional[float] = 1.0e-5, Tolerance2d: Optional[float] = 1.0e-5, cutting: Optional[bool] = False, FirstC: Optional[AppParCurves_Constraint] = AppParCurves_TangencyPoint, LastC: Optional[AppParCurves_Constraint] = AppParCurves_TangencyPoint) -> None: ...
    @overload
    def __init__(self, degreemin: Optional[int] = 3, degreemax: Optional[int] = 8, Tolerance3d: Optional[float] = 1.0e-05, Tolerance2d: Optional[float] = 1.0e-05, cutting: Optional[bool] = False, FirstC: Optional[AppParCurves_Constraint] = AppParCurves_TangencyPoint, LastC: Optional[AppParCurves_Constraint] = AppParCurves_TangencyPoint) -> None: ...
    def Error(self, Index: int) -> Tuple[float, float]: ...
    def IsAllApproximated(self) -> bool: ...
    def IsToleranceReached(self) -> bool: ...
    def NbMultiCurves(self) -> int: ...
    def Parameters(self, Index: int) -> Tuple[float, float]: ...
    def Perform(self, Line: AppCont_Function) -> None: ...
    def SetConstraints(self, FirstC: AppParCurves_Constraint, LastC: AppParCurves_Constraint) -> None: ...
    def SetDegrees(self, degreemin: int, degreemax: int) -> None: ...
    def SetHangChecking(self, theHangChecking: bool) -> None: ...
    def SetInvOrder(self, theInvOrder: bool) -> None: ...
    def SetMaxSegments(self, theMaxSegments: int) -> None: ...
    def SetTolerances(self, Tolerance3d: float, Tolerance2d: float) -> None: ...
    def Value(self, Index: Optional[int] = 1) -> AppParCurves_MultiCurve: ...

class Approx_FitAndDivide2d:
    @overload
    def __init__(self, Line: AppCont_Function, degreemin: Optional[int] = 3, degreemax: Optional[int] = 8, Tolerance3d: Optional[float] = 1.0e-5, Tolerance2d: Optional[float] = 1.0e-5, cutting: Optional[bool] = False, FirstC: Optional[AppParCurves_Constraint] = AppParCurves_TangencyPoint, LastC: Optional[AppParCurves_Constraint] = AppParCurves_TangencyPoint) -> None: ...
    @overload
    def __init__(self, degreemin: Optional[int] = 3, degreemax: Optional[int] = 8, Tolerance3d: Optional[float] = 1.0e-05, Tolerance2d: Optional[float] = 1.0e-05, cutting: Optional[bool] = False, FirstC: Optional[AppParCurves_Constraint] = AppParCurves_TangencyPoint, LastC: Optional[AppParCurves_Constraint] = AppParCurves_TangencyPoint) -> None: ...
    def Error(self, Index: int) -> Tuple[float, float]: ...
    def IsAllApproximated(self) -> bool: ...
    def IsToleranceReached(self) -> bool: ...
    def NbMultiCurves(self) -> int: ...
    def Parameters(self, Index: int) -> Tuple[float, float]: ...
    def Perform(self, Line: AppCont_Function) -> None: ...
    def SetConstraints(self, FirstC: AppParCurves_Constraint, LastC: AppParCurves_Constraint) -> None: ...
    def SetDegrees(self, degreemin: int, degreemax: int) -> None: ...
    def SetHangChecking(self, theHangChecking: bool) -> None: ...
    def SetInvOrder(self, theInvOrder: bool) -> None: ...
    def SetMaxSegments(self, theMaxSegments: int) -> None: ...
    def SetTolerances(self, Tolerance3d: float, Tolerance2d: float) -> None: ...
    def Value(self, Index: Optional[int] = 1) -> AppParCurves_MultiCurve: ...

class Approx_MCurvesToBSpCurve:
    def __init__(self) -> None: ...
    def Append(self, MC: AppParCurves_MultiCurve) -> None: ...
    def ChangeValue(self) -> AppParCurves_MultiBSpCurve: ...
    @overload
    def Perform(self) -> None: ...
    @overload
    def Perform(self, TheSeq: AppParCurves_SequenceOfMultiCurve) -> None: ...
    def Reset(self) -> None: ...
    def Value(self) -> AppParCurves_MultiBSpCurve: ...

class Approx_SameParameter:
    @overload
    def __init__(self, C3D: Geom_Curve, C2D: Geom2d_Curve, S: Geom_Surface, Tol: float) -> None: ...
    @overload
    def __init__(self, C3D: Adaptor3d_Curve, C2D: Geom2d_Curve, S: Adaptor3d_Surface, Tol: float) -> None: ...
    @overload
    def __init__(self, C3D: Adaptor3d_Curve, C2D: Adaptor2d_Curve2d, S: Adaptor3d_Surface, Tol: float) -> None: ...
    def Curve2d(self) -> Geom2d_Curve: ...
    def Curve3d(self) -> Adaptor3d_Curve: ...
    def CurveOnSurface(self) -> Adaptor3d_CurveOnSurface: ...
    def IsDone(self) -> bool: ...
    def IsSameParameter(self) -> bool: ...
    def TolReached(self) -> float: ...

class Approx_SweepApproximation:
    def __init__(self, Func: Approx_SweepFunction) -> None: ...
    def Average2dError(self, Index: int) -> float: ...
    def AverageErrorOnSurf(self) -> float: ...
    def Curve2d(self, Index: int, TPoles: TColgp_Array1OfPnt2d, TKnots: TColStd_Array1OfReal, TMults: TColStd_Array1OfInteger) -> None: ...
    def Curve2dPoles(self, Index: int) -> TColgp_Array1OfPnt2d: ...
    def Curves2dDegree(self) -> int: ...
    def Curves2dKnots(self) -> TColStd_Array1OfReal: ...
    def Curves2dMults(self) -> TColStd_Array1OfInteger: ...
    def Curves2dShape(self) -> Tuple[int, int, int]: ...
    def Dump(self) -> str: ...
    def Eval(self, Parameter: float, DerivativeRequest: int, First: float, Last: float) -> Tuple[int, float]: ...
    def IsDone(self) -> bool: ...
    def Max2dError(self, Index: int) -> float: ...
    def MaxErrorOnSurf(self) -> float: ...
    def NbCurves2d(self) -> int: ...
    def Perform(self, First: float, Last: float, Tol3d: float, BoundTol: float, Tol2d: float, TolAngular: float, Continuity: Optional[GeomAbs_Shape] = GeomAbs_C0, Degmax: Optional[int] = 11, Segmax: Optional[int] = 50) -> None: ...
    def SurfPoles(self) -> TColgp_Array2OfPnt: ...
    def SurfShape(self) -> Tuple[int, int, int, int, int, int]: ...
    def SurfUKnots(self) -> TColStd_Array1OfReal: ...
    def SurfUMults(self) -> TColStd_Array1OfInteger: ...
    def SurfVKnots(self) -> TColStd_Array1OfReal: ...
    def SurfVMults(self) -> TColStd_Array1OfInteger: ...
    def SurfWeights(self) -> TColStd_Array2OfReal: ...
    def Surface(self, TPoles: TColgp_Array2OfPnt, TWeights: TColStd_Array2OfReal, TUKnots: TColStd_Array1OfReal, TVKnots: TColStd_Array1OfReal, TUMults: TColStd_Array1OfInteger, TVMults: TColStd_Array1OfInteger) -> None: ...
    def TolCurveOnSurf(self, Index: int) -> float: ...
    def UDegree(self) -> int: ...
    def VDegree(self) -> int: ...

class Approx_SweepFunction(Standard_Transient):
    def BarycentreOfSurf(self) -> gp_Pnt: ...
    def D0(self, Param: float, First: float, Last: float, Poles: TColgp_Array1OfPnt, Poles2d: TColgp_Array1OfPnt2d, Weigths: TColStd_Array1OfReal) -> bool: ...
    def D1(self, Param: float, First: float, Last: float, Poles: TColgp_Array1OfPnt, DPoles: TColgp_Array1OfVec, Poles2d: TColgp_Array1OfPnt2d, DPoles2d: TColgp_Array1OfVec2d, Weigths: TColStd_Array1OfReal, DWeigths: TColStd_Array1OfReal) -> bool: ...
    def D2(self, Param: float, First: float, Last: float, Poles: TColgp_Array1OfPnt, DPoles: TColgp_Array1OfVec, D2Poles: TColgp_Array1OfVec, Poles2d: TColgp_Array1OfPnt2d, DPoles2d: TColgp_Array1OfVec2d, D2Poles2d: TColgp_Array1OfVec2d, Weigths: TColStd_Array1OfReal, DWeigths: TColStd_Array1OfReal, D2Weigths: TColStd_Array1OfReal) -> bool: ...
    def GetMinimalWeight(self, Weigths: TColStd_Array1OfReal) -> None: ...
    def GetTolerance(self, BoundTol: float, SurfTol: float, AngleTol: float, Tol3d: TColStd_Array1OfReal) -> None: ...
    def Intervals(self, T: TColStd_Array1OfReal, S: GeomAbs_Shape) -> None: ...
    def IsRational(self) -> bool: ...
    def Knots(self, TKnots: TColStd_Array1OfReal) -> None: ...
    def MaximalSection(self) -> float: ...
    def Mults(self, TMults: TColStd_Array1OfInteger) -> None: ...
    def Nb2dCurves(self) -> int: ...
    def NbIntervals(self, S: GeomAbs_Shape) -> int: ...
    def Resolution(self, Index: int, Tol: float) -> Tuple[float, float]: ...
    def SectionShape(self) -> Tuple[int, int, int]: ...
    def SetInterval(self, First: float, Last: float) -> None: ...
    def SetTolerance(self, Tol3d: float, Tol2d: float) -> None: ...

# harray1 classes

class Approx_HArray1OfAdHSurface(Approx_Array1OfAdHSurface, Standard_Transient):
    def __init__(self, theLower: int, theUpper: int) -> None: ...
    def Array1(self) -> Approx_Array1OfAdHSurface: ...


class Approx_HArray1OfGTrsf2d(Approx_Array1OfGTrsf2d, Standard_Transient):
    def __init__(self, theLower: int, theUpper: int) -> None: ...
    def Array1(self) -> Approx_Array1OfGTrsf2d: ...

# harray2 classes
# hsequence classes

