////////////////////////////////////////////////////////////////////////////////
/** 
  \file
  \brief \ru Методы построения каркаса.
         \en Functions for wire frame creation. \~
*/
////////////////////////////////////////////////////////////////////////////////

#ifndef __ACTION_WIREFRAME_H
#define __ACTION_WIREFRAME_H


#include <wire_frame.h>

class MATH_CLASS MbWireFrameFilletsParams;
class MATH_CLASS MbNurbsWireFrameParams;
class MATH_CLASS MbTrimmedWireFrameParams;
class MATH_CLASS MbWireFrameProjParams;
class MATH_CLASS MbWireFrameProjResult;


//------------------------------------------------------------------------------
/** \brief \ru Создать скругленный каркас.
           \en Create a filleted wire frame. \~
  \details \ru Создать каркас в виде плавного соединения (скругления) всех ребер каркаса. \n
               Если два ребра в каркасе гладко стыкуются, в этом стыке скругление не делается, радиус игнорируется. \n
           \en Create a wire frame as fillet of all the edges of a wire frame. \n
               If two edges in wire frame are smoothly connected, the fillet is not created at this joint, the radius is ignored. \n \~
  \param[in] wireframe - \ru Исходный каркас.
                         \en The initial wire frame. \~
  \param[in] sameEdges - \ru Режим копирования входного каркаса.
                         \en Whether to copy the input wire frame. \~
  \param[in] params - \ru Параметры скругления.
                      \en A fillet parameters. \~
  \param[out] result - \ru Скругленный каркас.
                       \en The filleted wire frame. \~
  \return \ru Возвращает код результата операции.
          \en Returns operation result code. \~
  \warning \ru В разработке.
           \en Under development. \~
  \ingroup WireFrame_Modeling
*/
// ---
MATH_FUNC( MbResultType ) CreateWireFrameFillets(       c3d::WireFrameSPtr &       wireframe,
                                                        MbeCopyMode                sameEdges,
                                                  const MbWireFrameFilletsParams & params,
                                                        c3d::WireFrameSPtr &       result );


//------------------------------------------------------------------------------
/** \brief \ru Построить NURBS копию каркаса.
           \en Construct a NURBS copy of a wire frame. \~
  \details \ru Строит проволочный каркас, содержащий NURBS кривые, аппроксимирующие заданный каркас. 
     По возможности, строит точные кривые, возможно, с кратными узлами.
     Количеством узлов для NURBS определяется в зависимости от кривой.
            \en Constructs a wire frame contains NURBS curves which approximates a given wire frame.
     If it is possible, constructs the accurate curves, perhaps with multiple knots.
     The number of knots for NURBS is defined depending on the curve. \~
  \param[in] wireFrame - \ru Исходный каркас.
                         \en The initial wire frame. \~
  \param[in] sameWire - \ru Режим копирования входного каркаса.
                        \en Whether to copy the input wire frame. \~
  \param[in] params - \ru Параметры скругления.
                      \en A fillet parameters. \~
  \param[out] result - \ru Построенный каркас с NURBS кривыми или nullptr при неуспешном построении.
                       \en he constructed wire frame with NURBS curve or nullptr in a case of failure. \~
  \return \ru Возвращает код результата операции.
          \en Returns operation result code. \~
  \warning \ru В разработке.
           \en Under development. \~
*/
// ---
MATH_FUNC( MbResultType ) CreateNurbsWireFrame(       c3d::WireFrameSPtr &     wireFrame, 
                                                      MbeCopyMode              sameWire,
                                                const MbNurbsWireFrameParams & params, 
                                                      c3d::WireFrameSPtr &     result );


//------------------------------------------------------------------------------
/** \brief \ru Создать усеченный каркас.
           \en Create trimmed wire frame. \~
  \details \ru Создать каркас в виде связной цепочки ребер исходного каркаса, заключенной между заданными точками усечения. \n
               Исходный каркас должен быть нормализован.\n
           \en Create a wire frame in the form of a connected chain of edges of the original wire frame enclosed between truncation points. \n 
               Init wire frame should be normalized. \n \~
  \param[in] wireframe - \ru Исходный каркас.
                         \en The initial wire frame. \~
  \param[in] sameEdges - \ru Режим копирования входного каркаса.
                         \en Whether to copy the input wire frame. \~
  \param[in] params - \ru Параметры усечения.
                      \en Trimmed parameters. \~
  \param[out] result - \ru Усеченный каркас.
                       \en The trimmed wire frame. \~
  \return \ru Возвращает код результата операции.
          \en Returns operation result code. \~
  \warning \ru В разработке.
           \en Under development. \~
  \ingroup WireFrame_Modeling
*/
// ---
MATH_FUNC( MbResultType ) CreateTrimmedWireFrame(       c3d::WireFrameSPtr &       wireframe,
                                                        MbeCopyMode                sameEdges,
                                                  const MbTrimmedWireFrameParams & params,
                                                        c3d::WireFrameSPtr &       result );


//------------------------------------------------------------------------------
/** \brief  \ru Найти проекцию точки на проволочный каркас.
            \en Find the point projection to the wire frame. \~
    \details \ru Найти ближайшую проекцию точки на проволочный каркас в диапазоне изменения параметра или на его продолжении.
                 Аналог MbContour3D::NearPointProjection().
                 Проволочный каркас должен быть нормализован.
             \en Find the nearest projection of a point to the wire frame within the parameter range or its extension.
                 Analogue of MbContour3D::NearPointProjection().
                 The wire frame must be normalized. \~
    \param[in] wireFrame - \ru Проволочный каркас для поиска проекции.
                           \en Wire frame for searching projection. \~
    \param[in] params - \ru Параметры операции.
                        \en Operation parameters. \~
    \param[in] result - \ru Результаты операции.
                        \en Results of the operation. \~
    \return \ru Код результата операции.
            \en Operation result code. \~
  */
// ---
MATH_FUNC( MbResultType ) NearPointProjection( const MbWireFrame &           wireFrame,
                                               const MbWireFrameProjParams & params,
                                                     MbWireFrameProjResult & result );


#endif // __ACTION_WIREFRAME_H
