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

from OCC.Core.Standard import *
from OCC.Core.NCollection import *
from OCC.Core.BRep import *
from OCC.Core.TopoDS import *
from OCC.Core.gp import *
from OCC.Core.Geom import *
from OCC.Core.Geom2d import *


class BRepPrim_Direction(IntEnum):
    BRepPrim_XMin: int = ...
    BRepPrim_XMax: int = ...
    BRepPrim_YMin: int = ...
    BRepPrim_YMax: int = ...
    BRepPrim_ZMin: int = ...
    BRepPrim_ZMax: int = ...

BRepPrim_XMin = BRepPrim_Direction.BRepPrim_XMin
BRepPrim_XMax = BRepPrim_Direction.BRepPrim_XMax
BRepPrim_YMin = BRepPrim_Direction.BRepPrim_YMin
BRepPrim_YMax = BRepPrim_Direction.BRepPrim_YMax
BRepPrim_ZMin = BRepPrim_Direction.BRepPrim_ZMin
BRepPrim_ZMax = BRepPrim_Direction.BRepPrim_ZMax

class BRepPrim_Builder:
    @overload
    def __init__(self) -> None: ...
    @overload
    def __init__(self, B: BRep_Builder) -> None: ...
    @overload
    def AddEdgeVertex(self, E: TopoDS_Edge, V: TopoDS_Vertex, P: float, direct: bool) -> None: ...
    @overload
    def AddEdgeVertex(self, E: TopoDS_Edge, V: TopoDS_Vertex, P1: float, P2: float) -> None: ...
    def AddFaceWire(self, F: TopoDS_Face, W: TopoDS_Wire) -> None: ...
    def AddShellFace(self, Sh: TopoDS_Shell, F: TopoDS_Face) -> None: ...
    def AddWireEdge(self, W: TopoDS_Wire, E: TopoDS_Edge, direct: bool) -> None: ...
    def Builder(self) -> BRep_Builder: ...
    def CompleteEdge(self, E: TopoDS_Edge) -> None: ...
    def CompleteFace(self, F: TopoDS_Face) -> None: ...
    def CompleteShell(self, S: TopoDS_Shell) -> None: ...
    def CompleteWire(self, W: TopoDS_Wire) -> None: ...
    def MakeDegeneratedEdge(self, E: TopoDS_Edge) -> None: ...
    @overload
    def MakeEdge(self, E: TopoDS_Edge, L: gp_Lin) -> None: ...
    @overload
    def MakeEdge(self, E: TopoDS_Edge, C: gp_Circ) -> None: ...
    def MakeFace(self, F: TopoDS_Face, P: gp_Pln) -> None: ...
    def MakeShell(self, S: TopoDS_Shell) -> None: ...
    def MakeVertex(self, V: TopoDS_Vertex, P: gp_Pnt) -> None: ...
    def MakeWire(self, W: TopoDS_Wire) -> None: ...
    def ReverseFace(self, F: TopoDS_Face) -> None: ...
    @overload
    def SetPCurve(self, E: TopoDS_Edge, F: TopoDS_Face, L: gp_Lin2d) -> None: ...
    @overload
    def SetPCurve(self, E: TopoDS_Edge, F: TopoDS_Face, L1: gp_Lin2d, L2: gp_Lin2d) -> None: ...
    @overload
    def SetPCurve(self, E: TopoDS_Edge, F: TopoDS_Face, C: gp_Circ2d) -> None: ...
    def SetParameters(self, E: TopoDS_Edge, V: TopoDS_Vertex, P1: float, P2: float) -> None: ...

class BRepPrim_FaceBuilder:
    @overload
    def __init__(self) -> None: ...
    @overload
    def __init__(self, B: BRep_Builder, S: Geom_Surface) -> None: ...
    @overload
    def __init__(self, B: BRep_Builder, S: Geom_Surface, UMin: float, UMax: float, VMin: float, VMax: float) -> None: ...
    def Edge(self, I: int) -> TopoDS_Edge: ...
    def Face(self) -> TopoDS_Face: ...
    @overload
    def Init(self, B: BRep_Builder, S: Geom_Surface) -> None: ...
    @overload
    def Init(self, B: BRep_Builder, S: Geom_Surface, UMin: float, UMax: float, VMin: float, VMax: float) -> None: ...
    def Vertex(self, I: int) -> TopoDS_Vertex: ...

class BRepPrim_GWedge:
    @overload
    def __init__(self) -> None: ...
    @overload
    def __init__(self, B: BRepPrim_Builder, Axes: gp_Ax2, dx: float, dy: float, dz: float) -> None: ...
    @overload
    def __init__(self, B: BRepPrim_Builder, Axes: gp_Ax2, dx: float, dy: float, dz: float, ltx: float) -> None: ...
    @overload
    def __init__(self, B: BRepPrim_Builder, Axes: gp_Ax2, xmin: float, ymin: float, zmin: float, z2min: float, x2min: float, xmax: float, ymax: float, zmax: float, z2max: float, x2max: float) -> None: ...
    def Axes(self) -> gp_Ax2: ...
    def Close(self, d1: BRepPrim_Direction) -> None: ...
    def Edge(self, d1: BRepPrim_Direction, d2: BRepPrim_Direction) -> TopoDS_Edge: ...
    def Face(self, d1: BRepPrim_Direction) -> TopoDS_Face: ...
    def GetX2Max(self) -> float: ...
    def GetX2Min(self) -> float: ...
    def GetXMax(self) -> float: ...
    def GetXMin(self) -> float: ...
    def GetYMax(self) -> float: ...
    def GetYMin(self) -> float: ...
    def GetZ2Max(self) -> float: ...
    def GetZ2Min(self) -> float: ...
    def GetZMax(self) -> float: ...
    def GetZMin(self) -> float: ...
    def HasEdge(self, d1: BRepPrim_Direction, d2: BRepPrim_Direction) -> bool: ...
    def HasFace(self, d1: BRepPrim_Direction) -> bool: ...
    def HasVertex(self, d1: BRepPrim_Direction, d2: BRepPrim_Direction, d3: BRepPrim_Direction) -> bool: ...
    def HasWire(self, d1: BRepPrim_Direction) -> bool: ...
    def IsDegeneratedShape(self) -> bool: ...
    def IsInfinite(self, d1: BRepPrim_Direction) -> bool: ...
    def Line(self, d1: BRepPrim_Direction, d2: BRepPrim_Direction) -> gp_Lin: ...
    def Open(self, d1: BRepPrim_Direction) -> None: ...
    def Plane(self, d1: BRepPrim_Direction) -> gp_Pln: ...
    def Point(self, d1: BRepPrim_Direction, d2: BRepPrim_Direction, d3: BRepPrim_Direction) -> gp_Pnt: ...
    def Shell(self) -> TopoDS_Shell: ...
    def Vertex(self, d1: BRepPrim_Direction, d2: BRepPrim_Direction, d3: BRepPrim_Direction) -> TopoDS_Vertex: ...
    def Wire(self, d1: BRepPrim_Direction) -> TopoDS_Wire: ...

class BRepPrim_OneAxis:
    @overload
    def Angle(self) -> float: ...
    @overload
    def Angle(self, A: float) -> None: ...
    @overload
    def Axes(self) -> gp_Ax2: ...
    @overload
    def Axes(self, A: gp_Ax2) -> None: ...
    def AxisBottomVertex(self) -> TopoDS_Vertex: ...
    def AxisEdge(self) -> TopoDS_Edge: ...
    def AxisEndWire(self) -> TopoDS_Wire: ...
    def AxisStartWire(self) -> TopoDS_Wire: ...
    def AxisTopVertex(self) -> TopoDS_Vertex: ...
    def BottomEdge(self) -> TopoDS_Edge: ...
    def BottomEndVertex(self) -> TopoDS_Vertex: ...
    def BottomFace(self) -> TopoDS_Face: ...
    def BottomStartVertex(self) -> TopoDS_Vertex: ...
    def BottomWire(self) -> TopoDS_Wire: ...
    def EndBottomEdge(self) -> TopoDS_Edge: ...
    def EndEdge(self) -> TopoDS_Edge: ...
    def EndFace(self) -> TopoDS_Face: ...
    def EndTopEdge(self) -> TopoDS_Edge: ...
    def EndWire(self) -> TopoDS_Wire: ...
    def HasBottom(self) -> bool: ...
    def HasSides(self) -> bool: ...
    def HasTop(self) -> bool: ...
    def LateralEndWire(self) -> TopoDS_Wire: ...
    def LateralFace(self) -> TopoDS_Face: ...
    def LateralStartWire(self) -> TopoDS_Wire: ...
    def LateralWire(self) -> TopoDS_Wire: ...
    def MakeEmptyLateralFace(self) -> TopoDS_Face: ...
    def MakeEmptyMeridianEdge(self, Ang: float) -> TopoDS_Edge: ...
    def MeridianClosed(self) -> bool: ...
    def MeridianOnAxis(self, V: float) -> bool: ...
    def MeridianValue(self, V: float) -> gp_Pnt2d: ...
    def SetMeridianOffset(self, MeridianOffset: Optional[float] = 0) -> None: ...
    def SetMeridianPCurve(self, E: TopoDS_Edge, F: TopoDS_Face) -> None: ...
    def Shell(self) -> TopoDS_Shell: ...
    def StartBottomEdge(self) -> TopoDS_Edge: ...
    def StartEdge(self) -> TopoDS_Edge: ...
    def StartFace(self) -> TopoDS_Face: ...
    def StartTopEdge(self) -> TopoDS_Edge: ...
    def StartWire(self) -> TopoDS_Wire: ...
    def TopEdge(self) -> TopoDS_Edge: ...
    def TopEndVertex(self) -> TopoDS_Vertex: ...
    def TopFace(self) -> TopoDS_Face: ...
    def TopStartVertex(self) -> TopoDS_Vertex: ...
    def TopWire(self) -> TopoDS_Wire: ...
    @overload
    def VMax(self) -> float: ...
    @overload
    def VMax(self, V: float) -> None: ...
    def VMaxInfinite(self) -> bool: ...
    @overload
    def VMin(self) -> float: ...
    @overload
    def VMin(self, V: float) -> None: ...
    def VMinInfinite(self) -> bool: ...

class BRepPrim_Revolution(BRepPrim_OneAxis):
    def __init__(self, A: gp_Ax2, VMin: float, VMax: float, M: Geom_Curve, PM: Geom2d_Curve) -> None: ...
    def MakeEmptyLateralFace(self) -> TopoDS_Face: ...
    def MakeEmptyMeridianEdge(self, Ang: float) -> TopoDS_Edge: ...
    def MeridianValue(self, V: float) -> gp_Pnt2d: ...
    def SetMeridianPCurve(self, E: TopoDS_Edge, F: TopoDS_Face) -> None: ...

class BRepPrim_Wedge(BRepPrim_GWedge):
    @overload
    def __init__(self) -> None: ...
    @overload
    def __init__(self, Axes: gp_Ax2, dx: float, dy: float, dz: float) -> None: ...
    @overload
    def __init__(self, Axes: gp_Ax2, dx: float, dy: float, dz: float, ltx: float) -> None: ...
    @overload
    def __init__(self, Axes: gp_Ax2, xmin: float, ymin: float, zmin: float, z2min: float, x2min: float, xmax: float, ymax: float, zmax: float, z2max: float, x2max: float) -> None: ...

class BRepPrim_Cone(BRepPrim_Revolution):
    @overload
    def __init__(self, Angle: float, Position: gp_Ax2, Height: float, Radius: Optional[float] = 0) -> None: ...
    @overload
    def __init__(self, Angle: float) -> None: ...
    @overload
    def __init__(self, Angle: float, Apex: gp_Pnt) -> None: ...
    @overload
    def __init__(self, Angle: float, Axes: gp_Ax2) -> None: ...
    @overload
    def __init__(self, R1: float, R2: float, H: float) -> None: ...
    @overload
    def __init__(self, Center: gp_Pnt, R1: float, R2: float, H: float) -> None: ...
    @overload
    def __init__(self, Axes: gp_Ax2, R1: float, R2: float, H: float) -> None: ...
    def MakeEmptyLateralFace(self) -> TopoDS_Face: ...

class BRepPrim_Cylinder(BRepPrim_Revolution):
    @overload
    def __init__(self, Position: gp_Ax2, Radius: float, Height: float) -> None: ...
    @overload
    def __init__(self, Radius: float) -> None: ...
    @overload
    def __init__(self, Center: gp_Pnt, Radius: float) -> None: ...
    @overload
    def __init__(self, Axes: gp_Ax2, Radius: float) -> None: ...
    @overload
    def __init__(self, R: float, H: float) -> None: ...
    @overload
    def __init__(self, Center: gp_Pnt, R: float, H: float) -> None: ...
    def MakeEmptyLateralFace(self) -> TopoDS_Face: ...

class BRepPrim_Sphere(BRepPrim_Revolution):
    @overload
    def __init__(self, Radius: float) -> None: ...
    @overload
    def __init__(self, Center: gp_Pnt, Radius: float) -> None: ...
    @overload
    def __init__(self, Axes: gp_Ax2, Radius: float) -> None: ...
    def MakeEmptyLateralFace(self) -> TopoDS_Face: ...

class BRepPrim_Torus(BRepPrim_Revolution):
    @overload
    def __init__(self, Position: gp_Ax2, Major: float, Minor: float) -> None: ...
    @overload
    def __init__(self, Major: float, Minor: float) -> None: ...
    @overload
    def __init__(self, Center: gp_Pnt, Major: float, Minor: float) -> None: ...
    def MakeEmptyLateralFace(self) -> TopoDS_Face: ...

# harray1 classes
# harray2 classes
# hsequence classes

