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

from OCC.Core.Standard import *
from OCC.Core.NCollection import *
from OCC.Core.TopoDS import *
from OCC.Core.gp import *
from OCC.Core.Geom import *
from OCC.Core.TColgp import *
from OCC.Core.TopAbs import *
from OCC.Core.BOPAlgo import *
from OCC.Core.TopTools import *
from OCC.Core.BRepBuilderAPI import *
from OCC.Core.TColGeom import *
from OCC.Core.LocOpe import *


class BRepFeat_Status(IntEnum):
	BRepFeat_NoError: int = ...
	BRepFeat_InvalidPlacement: int = ...
	BRepFeat_HoleTooLong: int = ...
BRepFeat_NoError = BRepFeat_Status.BRepFeat_NoError
BRepFeat_InvalidPlacement = BRepFeat_Status.BRepFeat_InvalidPlacement
BRepFeat_HoleTooLong = BRepFeat_Status.BRepFeat_HoleTooLong

class BRepFeat_StatusError(IntEnum):
	BRepFeat_OK: int = ...
	BRepFeat_BadDirect: int = ...
	BRepFeat_BadIntersect: int = ...
	BRepFeat_EmptyBaryCurve: int = ...
	BRepFeat_EmptyCutResult: int = ...
	BRepFeat_FalseSide: int = ...
	BRepFeat_IncDirection: int = ...
	BRepFeat_IncSlidFace: int = ...
	BRepFeat_IncParameter: int = ...
	BRepFeat_IncTypes: int = ...
	BRepFeat_IntervalOverlap: int = ...
	BRepFeat_InvFirstShape: int = ...
	BRepFeat_InvOption: int = ...
	BRepFeat_InvShape: int = ...
	BRepFeat_LocOpeNotDone: int = ...
	BRepFeat_LocOpeInvNotDone: int = ...
	BRepFeat_NoExtFace: int = ...
	BRepFeat_NoFaceProf: int = ...
	BRepFeat_NoGluer: int = ...
	BRepFeat_NoIntersectF: int = ...
	BRepFeat_NoIntersectU: int = ...
	BRepFeat_NoParts: int = ...
	BRepFeat_NoProjPt: int = ...
	BRepFeat_NotInitialized: int = ...
	BRepFeat_NotYetImplemented: int = ...
	BRepFeat_NullRealTool: int = ...
	BRepFeat_NullToolF: int = ...
	BRepFeat_NullToolU: int = ...
BRepFeat_OK = BRepFeat_StatusError.BRepFeat_OK
BRepFeat_BadDirect = BRepFeat_StatusError.BRepFeat_BadDirect
BRepFeat_BadIntersect = BRepFeat_StatusError.BRepFeat_BadIntersect
BRepFeat_EmptyBaryCurve = BRepFeat_StatusError.BRepFeat_EmptyBaryCurve
BRepFeat_EmptyCutResult = BRepFeat_StatusError.BRepFeat_EmptyCutResult
BRepFeat_FalseSide = BRepFeat_StatusError.BRepFeat_FalseSide
BRepFeat_IncDirection = BRepFeat_StatusError.BRepFeat_IncDirection
BRepFeat_IncSlidFace = BRepFeat_StatusError.BRepFeat_IncSlidFace
BRepFeat_IncParameter = BRepFeat_StatusError.BRepFeat_IncParameter
BRepFeat_IncTypes = BRepFeat_StatusError.BRepFeat_IncTypes
BRepFeat_IntervalOverlap = BRepFeat_StatusError.BRepFeat_IntervalOverlap
BRepFeat_InvFirstShape = BRepFeat_StatusError.BRepFeat_InvFirstShape
BRepFeat_InvOption = BRepFeat_StatusError.BRepFeat_InvOption
BRepFeat_InvShape = BRepFeat_StatusError.BRepFeat_InvShape
BRepFeat_LocOpeNotDone = BRepFeat_StatusError.BRepFeat_LocOpeNotDone
BRepFeat_LocOpeInvNotDone = BRepFeat_StatusError.BRepFeat_LocOpeInvNotDone
BRepFeat_NoExtFace = BRepFeat_StatusError.BRepFeat_NoExtFace
BRepFeat_NoFaceProf = BRepFeat_StatusError.BRepFeat_NoFaceProf
BRepFeat_NoGluer = BRepFeat_StatusError.BRepFeat_NoGluer
BRepFeat_NoIntersectF = BRepFeat_StatusError.BRepFeat_NoIntersectF
BRepFeat_NoIntersectU = BRepFeat_StatusError.BRepFeat_NoIntersectU
BRepFeat_NoParts = BRepFeat_StatusError.BRepFeat_NoParts
BRepFeat_NoProjPt = BRepFeat_StatusError.BRepFeat_NoProjPt
BRepFeat_NotInitialized = BRepFeat_StatusError.BRepFeat_NotInitialized
BRepFeat_NotYetImplemented = BRepFeat_StatusError.BRepFeat_NotYetImplemented
BRepFeat_NullRealTool = BRepFeat_StatusError.BRepFeat_NullRealTool
BRepFeat_NullToolF = BRepFeat_StatusError.BRepFeat_NullToolF
BRepFeat_NullToolU = BRepFeat_StatusError.BRepFeat_NullToolU

class BRepFeat_PerfSelection(IntEnum):
	BRepFeat_NoSelection: int = ...
	BRepFeat_SelectionFU: int = ...
	BRepFeat_SelectionU: int = ...
	BRepFeat_SelectionSh: int = ...
	BRepFeat_SelectionShU: int = ...
BRepFeat_NoSelection = BRepFeat_PerfSelection.BRepFeat_NoSelection
BRepFeat_SelectionFU = BRepFeat_PerfSelection.BRepFeat_SelectionFU
BRepFeat_SelectionU = BRepFeat_PerfSelection.BRepFeat_SelectionU
BRepFeat_SelectionSh = BRepFeat_PerfSelection.BRepFeat_SelectionSh
BRepFeat_SelectionShU = BRepFeat_PerfSelection.BRepFeat_SelectionShU

class brepfeat:
	@staticmethod
	def Barycenter(S: TopoDS_Shape, Pt: gp_Pnt) -> None: ...
	@staticmethod
	def FaceUntil(S: TopoDS_Shape, F: TopoDS_Face) -> None: ...
	@staticmethod
	def IsInside(F1: TopoDS_Face, F2: TopoDS_Face) -> bool: ...
	@staticmethod
	def ParametricBarycenter(S: TopoDS_Shape, C: Geom_Curve) -> float: ...
	@staticmethod
	def ParametricMinMax(S: TopoDS_Shape, C: Geom_Curve, Ori: Optional[bool] = False) -> Tuple[float, float, float, float, bool]: ...
	@staticmethod
	def SampleEdges(S: TopoDS_Shape, Pt: TColgp_SequenceOfPnt) -> None: ...
	@staticmethod
	def Tool(SRef: TopoDS_Shape, Fac: TopoDS_Face, Orf: TopAbs_Orientation) -> TopoDS_Solid: ...

class BRepFeat_Builder(BOPAlgo_BOP):
	def __init__(self) -> None: ...
	def CheckSolidImages(self) -> None: ...
	def Clear(self) -> None: ...
	@overload
	def FillRemoved(self) -> None: ...
	@overload
	def FillRemoved(self, theS: TopoDS_Shape, theM: TopTools_MapOfShape) -> None: ...
	@overload
	def Init(self, theShape: TopoDS_Shape) -> None: ...
	@overload
	def Init(self, theShape: TopoDS_Shape, theTool: TopoDS_Shape) -> None: ...
	def KeepPart(self, theS: TopoDS_Shape) -> None: ...
	def KeepParts(self, theIm: TopTools_ListOfShape) -> None: ...
	def PartsOfTool(self, theLT: TopTools_ListOfShape) -> None: ...
	def PerformResult(self) -> None: ...
	def RebuildEdge(self, theE: TopoDS_Shape, theF: TopoDS_Face, theME: TopTools_MapOfShape, aLEIm: TopTools_ListOfShape) -> None: ...
	def RebuildFaces(self) -> None: ...
	@overload
	def SetOperation(self, theFuse: int) -> None: ...
	@overload
	def SetOperation(self, theFuse: int, theFlag: bool) -> None: ...

class BRepFeat_Form(BRepBuilderAPI_MakeShape):
	def BarycCurve(self) -> Geom_Curve: ...
	def BasisShapeValid(self) -> None: ...
	def CurrentStatusError(self) -> BRepFeat_StatusError: ...
	def Curves(self, S: TColGeom_SequenceOfCurve) -> None: ...
	def FirstShape(self) -> TopTools_ListOfShape: ...
	def Generated(self, S: TopoDS_Shape) -> TopTools_ListOfShape: ...
	def GeneratedShapeValid(self) -> None: ...
	def GluedFacesValid(self) -> None: ...
	def IsDeleted(self, S: TopoDS_Shape) -> bool: ...
	def LastShape(self) -> TopTools_ListOfShape: ...
	def Modified(self, F: TopoDS_Shape) -> TopTools_ListOfShape: ...
	def NewEdges(self) -> TopTools_ListOfShape: ...
	def PerfSelectionValid(self) -> None: ...
	def ShapeFromValid(self) -> None: ...
	def ShapeUntilValid(self) -> None: ...
	def SketchFaceValid(self) -> None: ...
	def TgtEdges(self) -> TopTools_ListOfShape: ...

class BRepFeat_Gluer(BRepBuilderAPI_MakeShape):
	@overload
	def __init__(self) -> None: ...
	@overload
	def __init__(self, Snew: TopoDS_Shape, Sbase: TopoDS_Shape) -> None: ...
	def BasisShape(self) -> TopoDS_Shape: ...
	@overload
	def Bind(self, Fnew: TopoDS_Face, Fbase: TopoDS_Face) -> None: ...
	@overload
	def Bind(self, Enew: TopoDS_Edge, Ebase: TopoDS_Edge) -> None: ...
	def Build(self) -> None: ...
	def GluedShape(self) -> TopoDS_Shape: ...
	def Init(self, Snew: TopoDS_Shape, Sbase: TopoDS_Shape) -> None: ...
	def IsDeleted(self, F: TopoDS_Shape) -> bool: ...
	def Modified(self, F: TopoDS_Shape) -> TopTools_ListOfShape: ...
	def OpeType(self) -> LocOpe_Operation: ...

class BRepFeat_RibSlot(BRepBuilderAPI_MakeShape):
	@staticmethod
	def ChoiceOfFaces(faces: TopTools_ListOfShape, cc: Geom_Curve, par: float, bnd: float, Pln: Geom_Plane) -> TopoDS_Face: ...
	def CurrentStatusError(self) -> BRepFeat_StatusError: ...
	def FacesForDraft(self) -> TopTools_ListOfShape: ...
	def FirstShape(self) -> TopTools_ListOfShape: ...
	def Generated(self, S: TopoDS_Shape) -> TopTools_ListOfShape: ...
	@staticmethod
	def IntPar(C: Geom_Curve, P: gp_Pnt) -> float: ...
	def IsDeleted(self, F: TopoDS_Shape) -> bool: ...
	def LastShape(self) -> TopTools_ListOfShape: ...
	def Modified(self, F: TopoDS_Shape) -> TopTools_ListOfShape: ...
	def NewEdges(self) -> TopTools_ListOfShape: ...
	def TgtEdges(self) -> TopTools_ListOfShape: ...

class BRepFeat_SplitShape(BRepBuilderAPI_MakeShape):
	@overload
	def __init__(self) -> None: ...
	@overload
	def __init__(self, S: TopoDS_Shape) -> None: ...
	@overload
	def Add(self, theEdges: TopTools_SequenceOfShape) -> bool: ...
	@overload
	def Add(self, W: TopoDS_Wire, F: TopoDS_Face) -> None: ...
	@overload
	def Add(self, E: TopoDS_Edge, F: TopoDS_Face) -> None: ...
	@overload
	def Add(self, Comp: TopoDS_Compound, F: TopoDS_Face) -> None: ...
	@overload
	def Add(self, E: TopoDS_Edge, EOn: TopoDS_Edge) -> None: ...
	def Build(self) -> None: ...
	def DirectLeft(self) -> TopTools_ListOfShape: ...
	def Init(self, S: TopoDS_Shape) -> None: ...
	def IsDeleted(self, S: TopoDS_Shape) -> bool: ...
	def Left(self) -> TopTools_ListOfShape: ...
	def Modified(self, F: TopoDS_Shape) -> TopTools_ListOfShape: ...
	def Right(self) -> TopTools_ListOfShape: ...
	def SetCheckInterior(self, ToCheckInterior: bool) -> None: ...

class BRepFeat_MakeCylindricalHole(BRepFeat_Builder):
	def __init__(self) -> None: ...
	def Build(self) -> None: ...
	@overload
	def Init(self, Axis: gp_Ax1) -> None: ...
	@overload
	def Init(self, S: TopoDS_Shape, Axis: gp_Ax1) -> None: ...
	@overload
	def Perform(self, Radius: float) -> None: ...
	@overload
	def Perform(self, Radius: float, PFrom: float, PTo: float, WithControl: Optional[bool] = True) -> None: ...
	def PerformBlind(self, Radius: float, Length: float, WithControl: Optional[bool] = True) -> None: ...
	def PerformThruNext(self, Radius: float, WithControl: Optional[bool] = True) -> None: ...
	def PerformUntilEnd(self, Radius: float, WithControl: Optional[bool] = True) -> None: ...
	def Status(self) -> BRepFeat_Status: ...

class BRepFeat_MakeDPrism(BRepFeat_Form):
	@overload
	def __init__(self, Sbase: TopoDS_Shape, Pbase: TopoDS_Face, Skface: TopoDS_Face, Angle: float, Fuse: int, Modify: bool) -> None: ...
	@overload
	def __init__(self) -> None: ...
	def Add(self, E: TopoDS_Edge, OnFace: TopoDS_Face) -> None: ...
	def BarycCurve(self) -> Geom_Curve: ...
	def BossEdges(self, sig: int) -> None: ...
	def Curves(self, S: TColGeom_SequenceOfCurve) -> None: ...
	def Init(self, Sbase: TopoDS_Shape, Pbase: TopoDS_Face, Skface: TopoDS_Face, Angle: float, Fuse: int, Modify: bool) -> None: ...
	def LatEdges(self) -> TopTools_ListOfShape: ...
	@overload
	def Perform(self, Height: float) -> None: ...
	@overload
	def Perform(self, Until: TopoDS_Shape) -> None: ...
	@overload
	def Perform(self, From: TopoDS_Shape, Until: TopoDS_Shape) -> None: ...
	def PerformFromEnd(self, FUntil: TopoDS_Shape) -> None: ...
	def PerformThruAll(self) -> None: ...
	def PerformUntilEnd(self) -> None: ...
	def PerformUntilHeight(self, Until: TopoDS_Shape, Height: float) -> None: ...
	def TopEdges(self) -> TopTools_ListOfShape: ...

class BRepFeat_MakeLinearForm(BRepFeat_RibSlot):
	@overload
	def __init__(self) -> None: ...
	@overload
	def __init__(self, Sbase: TopoDS_Shape, W: TopoDS_Wire, P: Geom_Plane, Direction: gp_Vec, Direction1: gp_Vec, Fuse: int, Modify: bool) -> None: ...
	def Add(self, E: TopoDS_Edge, OnFace: TopoDS_Face) -> None: ...
	def Init(self, Sbase: TopoDS_Shape, W: TopoDS_Wire, P: Geom_Plane, Direction: gp_Vec, Direction1: gp_Vec, Fuse: int, Modify: bool) -> None: ...
	def Perform(self) -> None: ...
	def Propagate(self, L: TopTools_ListOfShape, F: TopoDS_Face, FPoint: gp_Pnt, LPoint: gp_Pnt) -> Tuple[bool, bool]: ...

class BRepFeat_MakePipe(BRepFeat_Form):
	@overload
	def __init__(self) -> None: ...
	@overload
	def __init__(self, Sbase: TopoDS_Shape, Pbase: TopoDS_Shape, Skface: TopoDS_Face, Spine: TopoDS_Wire, Fuse: int, Modify: bool) -> None: ...
	def Add(self, E: TopoDS_Edge, OnFace: TopoDS_Face) -> None: ...
	def BarycCurve(self) -> Geom_Curve: ...
	def Curves(self, S: TColGeom_SequenceOfCurve) -> None: ...
	def Init(self, Sbase: TopoDS_Shape, Pbase: TopoDS_Shape, Skface: TopoDS_Face, Spine: TopoDS_Wire, Fuse: int, Modify: bool) -> None: ...
	@overload
	def Perform(self) -> None: ...
	@overload
	def Perform(self, Until: TopoDS_Shape) -> None: ...
	@overload
	def Perform(self, From: TopoDS_Shape, Until: TopoDS_Shape) -> None: ...

class BRepFeat_MakePrism(BRepFeat_Form):
	@overload
	def __init__(self) -> None: ...
	@overload
	def __init__(self, Sbase: TopoDS_Shape, Pbase: TopoDS_Shape, Skface: TopoDS_Face, Direction: gp_Dir, Fuse: int, Modify: bool) -> None: ...
	def Add(self, E: TopoDS_Edge, OnFace: TopoDS_Face) -> None: ...
	def BarycCurve(self) -> Geom_Curve: ...
	def Curves(self, S: TColGeom_SequenceOfCurve) -> None: ...
	def Init(self, Sbase: TopoDS_Shape, Pbase: TopoDS_Shape, Skface: TopoDS_Face, Direction: gp_Dir, Fuse: int, Modify: bool) -> None: ...
	@overload
	def Perform(self, Length: float) -> None: ...
	@overload
	def Perform(self, Until: TopoDS_Shape) -> None: ...
	@overload
	def Perform(self, From: TopoDS_Shape, Until: TopoDS_Shape) -> None: ...
	def PerformFromEnd(self, FUntil: TopoDS_Shape) -> None: ...
	def PerformThruAll(self) -> None: ...
	def PerformUntilEnd(self) -> None: ...
	def PerformUntilHeight(self, Until: TopoDS_Shape, Length: float) -> None: ...

class BRepFeat_MakeRevol(BRepFeat_Form):
	@overload
	def __init__(self) -> None: ...
	@overload
	def __init__(self, Sbase: TopoDS_Shape, Pbase: TopoDS_Shape, Skface: TopoDS_Face, Axis: gp_Ax1, Fuse: int, Modify: bool) -> None: ...
	def Add(self, E: TopoDS_Edge, OnFace: TopoDS_Face) -> None: ...
	def BarycCurve(self) -> Geom_Curve: ...
	def Curves(self, S: TColGeom_SequenceOfCurve) -> None: ...
	def Init(self, Sbase: TopoDS_Shape, Pbase: TopoDS_Shape, Skface: TopoDS_Face, Axis: gp_Ax1, Fuse: int, Modify: bool) -> None: ...
	@overload
	def Perform(self, Angle: float) -> None: ...
	@overload
	def Perform(self, Until: TopoDS_Shape) -> None: ...
	@overload
	def Perform(self, From: TopoDS_Shape, Until: TopoDS_Shape) -> None: ...
	def PerformThruAll(self) -> None: ...
	def PerformUntilAngle(self, Until: TopoDS_Shape, Angle: float) -> None: ...

class BRepFeat_MakeRevolutionForm(BRepFeat_RibSlot):
	@overload
	def __init__(self) -> None: ...
	@overload
	def __init__(self, Sbase: TopoDS_Shape, W: TopoDS_Wire, Plane: Geom_Plane, Axis: gp_Ax1, Height1: float, Height2: float, Fuse: int) -> bool: ...
	def Add(self, E: TopoDS_Edge, OnFace: TopoDS_Face) -> None: ...
	def Init(self, Sbase: TopoDS_Shape, W: TopoDS_Wire, Plane: Geom_Plane, Axis: gp_Ax1, Height1: float, Height2: float, Fuse: int) -> bool: ...
	def Perform(self) -> None: ...
	def Propagate(self, L: TopTools_ListOfShape, F: TopoDS_Face, FPoint: gp_Pnt, LPoint: gp_Pnt) -> Tuple[bool, bool]: ...

# harray1 classes
# harray2 classes
# hsequence classes

brepfeat_Barycenter = brepfeat.Barycenter
brepfeat_FaceUntil = brepfeat.FaceUntil
brepfeat_IsInside = brepfeat.IsInside
brepfeat_ParametricBarycenter = brepfeat.ParametricBarycenter
brepfeat_ParametricMinMax = brepfeat.ParametricMinMax
brepfeat_Print = brepfeat.Print
brepfeat_SampleEdges = brepfeat.SampleEdges
brepfeat_Tool = brepfeat.Tool
BRepFeat_RibSlot_ChoiceOfFaces = BRepFeat_RibSlot.ChoiceOfFaces
BRepFeat_RibSlot_IntPar = BRepFeat_RibSlot.IntPar
