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

from OCC.Core.Standard import *
from OCC.Core.NCollection import *
from OCC.Core.TColStd import *
from OCC.Core.TopoDS import *
from OCC.Core.gp import *
from OCC.Core.TopAbs import *
from OCC.Core.Adaptor3d import *
from OCC.Core.BRepAdaptor import *
from OCC.Core.Adaptor2d import *

BRepTopAdaptor_SeqOfPtr = NewType('BRepTopAdaptor_SeqOfPtr', TColStd_SequenceOfAddress)

class BRepTopAdaptor_FClass2d:
	def __init__(self, F: TopoDS_Face, Tol: float) -> None: ...
	def Copy(self, Other: BRepTopAdaptor_FClass2d) -> BRepTopAdaptor_FClass2d: ...
	def Destroy(self) -> None: ...
	def Perform(self, Puv: gp_Pnt2d, RecadreOnPeriodic: Optional[bool] = True) -> TopAbs_State: ...
	def PerformInfinitePoint(self) -> TopAbs_State: ...
	def TestOnRestriction(self, Puv: gp_Pnt2d, Tol: float, RecadreOnPeriodic: Optional[bool] = True) -> TopAbs_State: ...

class BRepTopAdaptor_HVertex(Adaptor3d_HVertex):
	def __init__(self, Vtx: TopoDS_Vertex, Curve: BRepAdaptor_HCurve2d) -> None: ...
	def ChangeVertex(self) -> TopoDS_Vertex: ...
	def IsSame(self, Other: Adaptor3d_HVertex) -> bool: ...
	def Orientation(self) -> TopAbs_Orientation: ...
	def Parameter(self, C: Adaptor2d_HCurve2d) -> float: ...
	def Resolution(self, C: Adaptor2d_HCurve2d) -> float: ...
	def Value(self) -> gp_Pnt2d: ...
	def Vertex(self) -> TopoDS_Vertex: ...

class BRepTopAdaptor_Tool:
	@overload
	def __init__(self) -> None: ...
	@overload
	def __init__(self, F: TopoDS_Face, Tol2d: float) -> None: ...
	@overload
	def __init__(self, Surface: Adaptor3d_HSurface, Tol2d: float) -> None: ...
	def Destroy(self) -> None: ...
	def GetSurface(self) -> Adaptor3d_HSurface: ...
	def GetTopolTool(self) -> BRepTopAdaptor_TopolTool: ...
	@overload
	def Init(self, F: TopoDS_Face, Tol2d: float) -> None: ...
	@overload
	def Init(self, Surface: Adaptor3d_HSurface, Tol2d: float) -> None: ...
	def SetTopolTool(self, TT: BRepTopAdaptor_TopolTool) -> None: ...

class BRepTopAdaptor_TopolTool(Adaptor3d_TopolTool):
	@overload
	def __init__(self) -> None: ...
	@overload
	def __init__(self, Surface: Adaptor3d_HSurface) -> None: ...
	def Classify(self, P2d: gp_Pnt2d, Tol: float, RecadreOnPeriodic: Optional[bool] = True) -> TopAbs_State: ...
	def ComputeSamplePoints(self) -> None: ...
	def Destroy(self) -> None: ...
	def DomainIsInfinite(self) -> bool: ...
	def Edge(self) -> None: ...
	def Has3d(self) -> bool: ...
	def Init(self) -> None: ...
	def InitVertexIterator(self) -> None: ...
	@overload
	def Initialize(self) -> None: ...
	@overload
	def Initialize(self, S: Adaptor3d_HSurface) -> None: ...
	@overload
	def Initialize(self, Curve: Adaptor2d_HCurve2d) -> None: ...
	def IsThePointOn(self, P2d: gp_Pnt2d, Tol: float, RecadreOnPeriodic: Optional[bool] = True) -> bool: ...
	def More(self) -> bool: ...
	def MoreVertex(self) -> bool: ...
	def NbSamples(self) -> int: ...
	def NbSamplesU(self) -> int: ...
	def NbSamplesV(self) -> int: ...
	def Next(self) -> None: ...
	def NextVertex(self) -> None: ...
	@overload
	def Orientation(self, C: Adaptor2d_HCurve2d) -> TopAbs_Orientation: ...
	@overload
	def Orientation(self, C: Adaptor3d_HVertex) -> TopAbs_Orientation: ...
	def Pnt(self, V: Adaptor3d_HVertex) -> gp_Pnt: ...
	def SamplePoint(self, Index: int, P2d: gp_Pnt2d, P3d: gp_Pnt) -> None: ...
	@overload
	def Tol3d(self, C: Adaptor2d_HCurve2d) -> float: ...
	@overload
	def Tol3d(self, V: Adaptor3d_HVertex) -> float: ...
	def Value(self) -> Adaptor2d_HCurve2d: ...
	def Vertex(self) -> Adaptor3d_HVertex: ...

# harray1 classes
# harray2 classes
# hsequence classes

