// Reconstruction - A tool for building cad models from meshes
// Copyright (C) 2010-2026 Eric Bechet, Borhen Louhichi
//
// See the LICENSE file for license information and contributions.
// Please report all bugs and problems to <bechet@cadxfem.org>.

#ifndef APPROXAFUNC2VAR_H
#define APPROXAFUNC2VAR_H

#include "TColStd_HArray1OfReal.hxx"
#include "TColStd_HArray2OfReal.hxx"
#include "GeomAbs_IsoType.hxx"
#include "GeomAbs_Shape.hxx"
#include "AdvApp2Var_EvaluatorFunc2Var.hxx"
#include "AdvApprox_Cutting.hxx"
#include "AdvApp2Var_Criterion.hxx"
#include "Standard_ConstructionError.hxx"
#include "AdvApp2Var_Context.hxx"
#include "AdvApp2Var_Patch.hxx"
#include "AdvApp2Var_SequenceOfPatch.hxx"
#include "TColStd_SequenceOfReal.hxx"
#include "AdvApp2Var_Network.hxx"
#include "gp_XY.hxx"
#include "AdvApp2Var_Node.hxx"
#include "AdvApp2Var_SequenceOfNode.hxx"
#include "AdvApp2Var_Iso.hxx"
#include "AdvApp2Var_Strip.hxx"
#include "AdvApp2Var_SequenceOfStrip.hxx"
#include "AdvApp2Var_Framework.hxx"
#include "TColGeom_HArray1OfSurface.hxx"
#include "TColStd_HArray2OfInteger.hxx"
#include "Convert_GridPolynomialToPoles.hxx"
#include "Geom_BSplineSurface.hxx"
#include "TColgp_HArray2OfPnt.hxx"
#include "TColStd_HArray1OfInteger.hxx"
#include "TColStd_HArray1OfReal.hxx"

/// B le 01-10-2010
#include "Convert_GridPolynomes_ToPoles.h"



class ApproxAFunc2Var
{
public:
  // ------------------------------------------------------------------

  ApproxAFunc2Var(const Standard_Integer Num1DSS,
                  const Standard_Integer Num2DSS,
                  const Standard_Integer Num3DSS,
                  const Handle(TColStd_HArray1OfReal) & OneDTol,
                  const Handle(TColStd_HArray1OfReal) & TwoDTol,
                  const Handle(TColStd_HArray1OfReal) & ThreeDTol,
                  const Handle(TColStd_HArray2OfReal) & OneDTolFr,
                  const Handle(TColStd_HArray2OfReal) & TwoDTolFr,
                  const Handle(TColStd_HArray2OfReal) & ThreeDTolFr,
                  const Standard_Real FirstInU,
                  const Standard_Real LastInU,
                  const Standard_Real FirstInV,
                  const Standard_Real LastInV,
                  const GeomAbs_IsoType FavorIso,
                  const GeomAbs_Shape ContInU,
                  const GeomAbs_Shape ContInV,
                  const Standard_Integer PrecisCode,
                  const Standard_Integer MaxDegInU,
                  const Standard_Integer MaxDegInV,
                  const Standard_Integer MaxPatch,
                  const AdvApp2Var_EvaluatorFunc2Var& Func,
                  AdvApprox_Cutting& UChoice,
                  AdvApprox_Cutting& VChoice);

  ApproxAFunc2Var(const Standard_Integer Num1DSS,
                  const Standard_Integer Num2DSS,
                  const Standard_Integer Num3DSS,
                  const Handle(TColStd_HArray1OfReal) & OneDTol,
                  const Handle(TColStd_HArray1OfReal) & TwoDTol,
                  const Handle(TColStd_HArray1OfReal) & ThreeDTol,
                  const Handle(TColStd_HArray2OfReal) & OneDTolFr,
                  const Handle(TColStd_HArray2OfReal) & TwoDTolFr,
                  const Handle(TColStd_HArray2OfReal) & ThreeDTolFr,
                  const Standard_Real FirstInU,
                  const Standard_Real LastInU,
                  const Standard_Real FirstInV,
                  const Standard_Real LastInV,
                  const GeomAbs_IsoType FavorIso,
                  const GeomAbs_Shape ContInU,
                  const GeomAbs_Shape ContInV,
                  const Standard_Integer PrecisCode,
                  const Standard_Integer MaxDegInU,
                  const Standard_Integer MaxDegInV,
                  const Standard_Integer MaxPatch,
                  const AdvApp2Var_EvaluatorFunc2Var& Func,
                  const AdvApp2Var_Criterion& Crit,
                  AdvApprox_Cutting& UChoice,
                  AdvApprox_Cutting& VChoice);

  ~ApproxAFunc2Var();

  Handle(Geom_BSplineSurface) Surface(const Standard_Integer SSPIndex) const;
  Standard_Real MaxError(const Standard_Integer Dimension,const Standard_Integer SSPIndex) const;
  Standard_Real CritError(const Standard_Integer Dimension, const Standard_Integer SSPIndex) const;
  inline Standard_Boolean IsDone() const;
  inline Standard_Boolean HasResult() const;
  inline Standard_Integer UDegree() const;
  inline Standard_Integer VDegree() const;
  inline Standard_Integer NumSubSpaces(const Standard_Integer Dimension) const;

  /*
      Standard_Integer NbUPoles() const;
      Standard_Integer NbVPoles() const;
      const Handle_TColgp_HArray2OfPnt& Poles() const;
      //Standard_EXPORT   Standard_Integer UDegree() const;
      //Standard_EXPORT   Standard_Integer VDegree() const;
      Standard_Integer NbUKnots() const;
      Standard_Integer NbVKnots() const;
      const Handle_TColStd_HArray1OfReal& UKnots() const;
      const Handle_TColStd_HArray1OfReal& VKnots() const;
      const Handle_TColStd_HArray1OfInteger& UMultiplicities() const;
      const Handle_TColStd_HArray1OfInteger& VMultiplicities() const;
  */


private:

  Standard_Integer myNumSubSpaces[3];

  Handle_TColStd_HArray1OfReal my1DTolerances;
  Handle_TColStd_HArray1OfReal my2DTolerances;
  Handle_TColStd_HArray1OfReal my3DTolerances;
  Handle_TColStd_HArray2OfReal my1DTolOnFront;
  Handle_TColStd_HArray2OfReal my2DTolOnFront;
  Handle_TColStd_HArray2OfReal my3DTolOnFront;
  Standard_Real myFirstParInU;
  Standard_Real myLastParInU;
  Standard_Real myFirstParInV;
  Standard_Real myLastParInV;
  GeomAbs_IsoType myFavoriteIso;
  GeomAbs_Shape myContInU;
  GeomAbs_Shape myContInV;
  Standard_Integer myPrecisionCode;
  Standard_Integer myMaxDegInU;
  Standard_Integer myMaxDegInV;
  Standard_Integer myMaxPatches;
  AdvApp2Var_EvaluatorFunc2Var myEvaluator;
  Standard_Boolean myDone;
  Standard_Boolean myHasResult;
  AdvApp2Var_Context myConditions;
  AdvApp2Var_Network myResult;
  AdvApp2Var_Framework myConstraints;
  Handle_TColStd_HArray1OfReal my3DMaxError;
  Handle_TColStd_HArray1OfReal my3DAverageError;
  Handle_TColStd_HArray1OfReal my3DUFrontError;
  Handle_TColStd_HArray1OfReal my3DVFrontError;
  Standard_Real myCriterionError;
  Standard_Integer myDegreeInU;
  Standard_Integer myDegreeInV;
  Handle_TColGeom_HArray1OfSurface mySurfaces;
  Handle_TColStd_HArray1OfReal my1DMaxError;
  Handle_TColStd_HArray1OfReal my2DMaxError;
  Handle_TColStd_HArray1OfReal my2DAverageError;
  Handle_TColStd_HArray1OfReal my2DUFrontError;
  Handle_TColStd_HArray1OfReal my2DVFrontError;

  Handle_TColStd_HArray1OfReal my1DAverageError;
  Handle_TColStd_HArray1OfReal my1DUFrontError;
  Handle_TColStd_HArray1OfReal my1DVFrontError;

//Convert_GridPolynomialToPoles *CvP;



  void Init();
  void InitGrid(const Standard_Integer NbInt);
  void Perform(const AdvApprox_Cutting& UChoice,const AdvApprox_Cutting& VChoice,const AdvApp2Var_EvaluatorFunc2Var& Func);
  void Perform(const AdvApprox_Cutting& UChoice,const AdvApprox_Cutting& VChoice,const AdvApp2Var_EvaluatorFunc2Var& Func,const AdvApp2Var_Criterion& Crit);
  void ComputePatches(const AdvApprox_Cutting& UChoice,const AdvApprox_Cutting& VChoice,const AdvApp2Var_EvaluatorFunc2Var& Func);
  void ComputePatches(const AdvApprox_Cutting& UChoice,const AdvApprox_Cutting& VChoice,const AdvApp2Var_EvaluatorFunc2Var& Func,const AdvApp2Var_Criterion& Crit);
  void ComputeConstraints(const AdvApprox_Cutting& UChoice,const AdvApprox_Cutting& VChoice,const AdvApp2Var_EvaluatorFunc2Var& Func);
  void ComputeConstraints(const AdvApprox_Cutting& UChoice,const AdvApprox_Cutting& VChoice,const AdvApp2Var_EvaluatorFunc2Var& Func,const AdvApp2Var_Criterion& Crit);
  void Compute3DErrors();
  void ComputeCritError();
  void ConvertBS();
  Handle(TColStd_HArray1OfReal) MaxError(const Standard_Integer Dimension) const;
  Handle(TColStd_HArray1OfReal) AverageError(const Standard_Integer Dimension) const;
  Handle(TColStd_HArray1OfReal) UFrontError(const Standard_Integer Dimension) const;
  Handle(TColStd_HArray1OfReal) VFrontError(const Standard_Integer Dimension) const;
  Standard_Real AverageError(const Standard_Integer Dimension, const Standard_Integer SSPIndex) const;
  Standard_Real UFrontError(const Standard_Integer Dimension, const Standard_Integer SSPIndex) const;
  Standard_Real VFrontError(const Standard_Integer Dimension, const Standard_Integer SSPIndex) const;

  void Dump(Standard_OStream& o) const;






};


#endif
