# SPDX-License-Identifier: LGPL-2.1-or-later

# ***************************************************************************
# *   Copyright (c) 2009, 2010 Yorik van Havre <yorik@uncreated.net>        *
# *   Copyright (c) 2009, 2010 Ken Cline <cline@frii.com>                   *
# *                                                                         *
# *   This program is free software; you can redistribute it and/or modify  *
# *   it under the terms of the GNU Lesser General Public License (LGPL)    *
# *   as published by the Free Software Foundation; either version 2 of     *
# *   the License, or (at your option) any later version.                   *
# *   for detail see the LICENCE text file.                                 *
# *                                                                         *
# *   This program is distributed in the hope that it will be useful,       *
# *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
# *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
# *   GNU Library General Public License for more details.                  *
# *                                                                         *
# *   You should have received a copy of the GNU Library General Public     *
# *   License along with this program; if not, write to the Free Software   *
# *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  *
# *   USA                                                                   *
# *                                                                         *
# ***************************************************************************
"""Define geometry functions for manipulating shapes in the Draft Workbench.

These functions are used by different object creation functions
of the Draft Workbench, both in `Draft.py` and `DraftTools.py`.
They operate on the internal shapes (`Part::TopoShape`) of different objects
and on their subelements, that is, vertices, edges, and faces.
"""
## \defgroup DRAFTGEOMUTILS DraftGeomUtils
#  \ingroup UTILITIES
#  \brief Shape manipulation utilities for the Draft workbench
#
# Shapes manipulation utilities

## \addtogroup DRAFTGEOMUTILS
#  @{

__title__ = "FreeCAD Draft Workbench - Geometry library"
__author__ = "Yorik van Havre, Jacques-Antoine Gaudin, Ken Cline"
__url__ = ["https://www.freecad.org"]

# Doesn't need requisites
from draftgeoutils.linear_algebra import linearFromPoints, determinant

# Needs math, Part, and vector tools
from draftgeoutils.general import NORM

from draftgeoutils.general import (
    precision,
    vec,
    edg,
    getVerts,
    v1,
    isNull,
    isPtOnEdge,
    hasCurves,
    isAligned,
    getQuad,
    areColinear,
    hasOnlyWires,
    geomType,
    isValidPath,
    findClosest,
    getBoundaryAngles,
)

# Needs general functions
from draftgeoutils.geometry import (
    findPerpendicular,
    findDistance,
    getSplineNormal,
    get_spline_normal,
    getNormal,
    get_normal,
    get_shape_normal,
    getRotation,
    isPlanar,
    is_planar,
    calculatePlacement,
    mirror,
    are_coplanar,
    is_straight_line,
    mirror_matrix,
    uv_vectors_from_face,
    placement_from_face,
    placement_from_points,
    distance_to_plane,
    project_point_on_plane,
)

from draftgeoutils.edges import (
    findEdge,
    orientEdge,
    isSameLine,
    isLine,
    is_line,
    invert,
    findMidpoint,
    getTangent,
    get_referenced_edges,
)

from draftgeoutils.faces import (
    concatenate,
    getBoundary,
    isCoplanar,
    is_coplanar,
    bind,
    cleanFaces,
    removeSplitter,
)

from draftgeoutils.arcs import isClockwise, isWideAngle, arcFrom2Pts, arcFromSpline

from draftgeoutils.cuboids import isCubic, getCubicDimensions

# Needs geometry functions
from draftgeoutils.circle_inversion import pointInversion, polarInversion, circleInversion

# Needs edges functions
from draftgeoutils.sort_edges import sortEdges, sortEdgesOld

from draftgeoutils.intersections import findIntersection, wiresIntersect, connect, angleBisection

from draftgeoutils.wires import (
    findWires,
    findWiresOld,
    findWiresOld2,
    flattenWire,
    superWire,
    isReallyClosed,
    curvetowire,
    curvetosegment,
    rebaseWire,
    removeInterVertices,
    cleanProjection,
    tessellateProjection,
    get_placement_perpendicular_to_wire,
    get_extended_wire,
)

# Needs wires functions
from draftgeoutils.fillets import fillet, filletWire

# Needs intersections functions
from draftgeoutils.offsets import pocket2d, offset, offsetWire

from draftgeoutils.circles import (
    findClosestCircle,
    getCircleFromSpline,
    circlefrom1Line2Points,
    circlefrom2Lines1Point,
    circleFrom2LinesRadius,
    circleFrom3LineTangents,
    circleFromPointLineRadius,
    circleFrom2PointsRadius,
    findHomotheticCenterOfCircles,
    findRadicalAxis,
    findRadicalCenter,
)

from draftgeoutils.circles_apollonius import (
    outerSoddyCircle,
    innerSoddyCircle,
    circleFrom3CircleTangents,
)

# Needs circles_apollonius functions
# These functions are not imported because they are incomplete;
# they require pre-requisite functions that haven't been written
# from draftgeoutils.circles_incomplete import (circleFrom2tan1pt,
#                                               circleFrom2tan1rad,
#                                               circleFrom1tan2pt,
#                                               circleFrom1tan1pt1rad,
#                                               circleFrom3tan)

##  @}
