// Created on: 1992-11-24
// Created by: Laurent BUCHARD
// Copyright (c) 1992-1999 Matra Datavision
// Copyright (c) 1999-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.

#include <IntCurve_IntConicConic.hxx>
#include <gp_Lin2d.hxx>
#include <gp_Circ2d.hxx>
#include <gp_Elips2d.hxx>
#include <gp_Parab2d.hxx>
#include <gp_Hypr2d.hxx>
#include <Precision.hxx>	



IntCurve_UserIntConicCurveGen::IntCurve_UserIntConicCurveGen () {
  done = Standard_False;
}
//-------------------------------------------------------------------------------------
IntCurve_UserIntConicCurveGen::IntCurve_UserIntConicCurveGen (const gp_Lin2d& Lin1,
							      const IntRes2d_Domain& D1,
							      const ThePCurve& C2,
							      const IntRes2d_Domain& D2,
							      const Standard_Real TolConf,
							      const Standard_Real Tol) {
  Perform(Lin1,D1,C2,D2,TolConf,Tol);
}
//-------------------------------------------------------------------------------------
IntCurve_UserIntConicCurveGen::IntCurve_UserIntConicCurveGen (const gp_Circ2d& Circ1,
							      const IntRes2d_Domain& D1,
							      const ThePCurve& C2,
							      const IntRes2d_Domain& D2,
							      const Standard_Real TolConf,
							      const Standard_Real Tol) {
  Perform(Circ1,D1,C2,D2,TolConf,Tol);
}
//-------------------------------------------------------------------------------------
IntCurve_UserIntConicCurveGen::IntCurve_UserIntConicCurveGen (const gp_Parab2d& Parab1,
							      const IntRes2d_Domain& D1,
							      const ThePCurve& C2,
							      const IntRes2d_Domain& D2,
							      const Standard_Real TolConf,
							      const Standard_Real Tol) {
  Perform(Parab1,D1,C2,D2,TolConf,Tol);
}
//-------------------------------------------------------------------------------------
IntCurve_UserIntConicCurveGen::IntCurve_UserIntConicCurveGen (const gp_Elips2d& Elips1,
							      const IntRes2d_Domain& D1,
							      const ThePCurve& C2,
							      const IntRes2d_Domain& D2,
							      const Standard_Real TolConf,
							      const Standard_Real Tol) {
  Perform(Elips1,D1,C2,D2,TolConf,Tol);
}
//-------------------------------------------------------------------------------------
IntCurve_UserIntConicCurveGen::IntCurve_UserIntConicCurveGen (const gp_Hypr2d& Hyper1,
							      const IntRes2d_Domain& D1,
							      const ThePCurve& C2,
							      const IntRes2d_Domain& D2,
							      const Standard_Real TolConf,
							      const Standard_Real Tol) {
  Perform(Hyper1,D1,C2,D2,TolConf,Tol);
}
//-------------------------------------------------------------------------------------  


//----------------------------------------------------------------------
void IntCurve_UserIntConicCurveGen::Perform (const gp_Lin2d& Lin1,
					     const IntRes2d_Domain& D1,
					     const ThePCurve& C2,
					     const IntRes2d_Domain& D2,
					     const Standard_Real TolConf,
					     const Standard_Real Tol) {
  this->ResetFields();
  Standard_Integer NbInterC2 = ThePCurveTool::NbIntervals(C2);
  if(NbInterC2 > 1) { 
    Standard_Real ParamInf,ParamSup;
    Standard_Real D2FirstParam = D2.FirstParameter();
    Standard_Real D2LastParam  = D2.LastParameter();
    Standard_Boolean Ok = Standard_True;
    param1inf = (D1.HasFirstPoint()) ? D1.FirstParameter() : -Precision::Infinite();
    param1sup = (D1.HasLastPoint()) ?  D1.LastParameter()  : Precision::Infinite();
    param2inf = ThePCurveTool::FirstParameter(C2);
    param2sup = ThePCurveTool::LastParameter(C2);
    IntRes2d_Domain DomainC2NumInter;

    TColStd_Array1OfReal Tab2(1,NbInterC2+1);
    ThePCurveTool::Intervals(C2,Tab2);    

    for(Standard_Integer NumInterC2=1; Ok && (NumInterC2 <= NbInterC2);NumInterC2++) { 
      ThePCurveTool::GetInterval(C2,NumInterC2,Tab2,ParamInf,ParamSup);
      if((ParamInf > D2LastParam)||(ParamSup < D2FirstParam)) Ok=Standard_False; 
      else { 
	if(ParamInf < D2FirstParam) ParamInf = D2FirstParam;
	if(ParamSup > D2LastParam)  ParamSup = D2LastParam; 
	if((ParamSup - ParamInf) > RealEpsilon()) { 
	  DomainC2NumInter.SetValues(ThePCurveTool::Value(C2,ParamInf),
				     ParamInf,
				     D2.FirstTolerance(),
				     ThePCurveTool::Value(C2,ParamSup),
				     ParamSup,
				     D2.LastTolerance());
	  InternalPerform(Lin1,D1,C2,DomainC2NumInter,TolConf,Tol,Standard_True);
	}
      }
    }
  }
  else { 
    InternalPerform(Lin1,D1,C2,D2,TolConf,Tol,Standard_False);
  }
}
//--------------------------------------------------------------------------------
void IntCurve_UserIntConicCurveGen::Perform (const gp_Circ2d& Circ1,
					     const IntRes2d_Domain& D1,
					     const ThePCurve& C2,
					     const IntRes2d_Domain& D2,
					     const Standard_Real TolConf,
					     const Standard_Real Tol) {
  this->ResetFields();
  Standard_Integer NbInterC2 = ThePCurveTool::NbIntervals(C2);
  if(NbInterC2 > 1) {
    Standard_Real ParamInf,ParamSup;
    Standard_Real D2FirstParam = D2.FirstParameter();
    Standard_Real D2LastParam  = D2.LastParameter();
    Standard_Boolean Ok = Standard_True;
    
    param1inf = (D1.HasFirstPoint()) ? D1.FirstParameter() : -Precision::Infinite();
    param1sup = (D1.HasLastPoint()) ?  D1.LastParameter()  : Precision::Infinite();
    param2inf = ThePCurveTool::FirstParameter(C2);
    param2sup = ThePCurveTool::LastParameter(C2);
    IntRes2d_Domain DomainC2NumInter;
    
    TColStd_Array1OfReal Tab2(1,NbInterC2+1);
    ThePCurveTool::Intervals(C2,Tab2);    
    
    
    for(Standard_Integer NumInterC2=1; Ok && (NumInterC2<=NbInterC2);NumInterC2++) { 
      ThePCurveTool::GetInterval(C2,NumInterC2,Tab2,ParamInf,ParamSup);
      if((ParamInf > D2LastParam)||(ParamSup < D2FirstParam)) Ok=Standard_False; 
      else { 
	if(ParamInf < D2FirstParam) ParamInf = D2FirstParam;
	if(ParamSup > D2LastParam)  ParamSup = D2LastParam; 
	if((ParamSup - ParamInf) > RealEpsilon()) { 
	  DomainC2NumInter.SetValues(ThePCurveTool::Value(C2,ParamInf),
				     ParamInf,
				     D2.FirstTolerance(),
				     ThePCurveTool::Value(C2,ParamSup),
				     ParamSup,
				     D2.LastTolerance());
	  InternalPerform(Circ1,D1,C2,DomainC2NumInter,TolConf,Tol,Standard_True);
	}
      }
    }
  }
  else { 
    InternalPerform(Circ1,D1,C2,D2,TolConf,Tol,Standard_False);
  }
}
//--------------------------------------------------------------------------------
void IntCurve_UserIntConicCurveGen::Perform (const gp_Parab2d& Parab1,
					     const IntRes2d_Domain& D1,
					     const ThePCurve& C2,
					     const IntRes2d_Domain& D2,
					     const Standard_Real TolConf,
					     const Standard_Real Tol) {
  this->ResetFields();
  Standard_Integer NbInterC2 = ThePCurveTool::NbIntervals(C2);  
  if(NbInterC2 > 1) {
    Standard_Real ParamInf,ParamSup;
    Standard_Real D2FirstParam = D2.FirstParameter();
    Standard_Real D2LastParam  = D2.LastParameter();
    Standard_Boolean Ok = Standard_True;
    param1inf = (D1.HasFirstPoint()) ? D1.FirstParameter() : -Precision::Infinite();
    param1sup = (D1.HasLastPoint()) ?  D1.LastParameter()  : Precision::Infinite();
    param2inf = ThePCurveTool::FirstParameter(C2);
    param2sup = ThePCurveTool::LastParameter(C2);
    IntRes2d_Domain DomainC2NumInter;

    TColStd_Array1OfReal Tab2(1,NbInterC2+1);
    ThePCurveTool::Intervals(C2,Tab2);    
 
    for(Standard_Integer NumInterC2=1; Ok && (NumInterC2<=NbInterC2);NumInterC2++) { 
      ThePCurveTool::GetInterval(C2,NumInterC2,Tab2,ParamInf,ParamSup);
      if((ParamInf > D2LastParam)||(ParamSup < D2FirstParam)) Ok=Standard_False; 
      else { 
	if(ParamInf < D2FirstParam) ParamInf = D2FirstParam;
	if(ParamSup > D2LastParam)  ParamSup = D2LastParam; 
	if((ParamSup - ParamInf) > RealEpsilon()) { 
	  DomainC2NumInter.SetValues(ThePCurveTool::Value(C2,ParamInf),
				     ParamInf,
				     D2.FirstTolerance(),
				     ThePCurveTool::Value(C2,ParamSup),
				     ParamSup,
				     D2.LastTolerance());
	  InternalPerform(Parab1,D1,C2,DomainC2NumInter,TolConf,Tol,Standard_True);
	}
      }
    }
  }
  else { 
    InternalPerform(Parab1,D1,C2,D2,TolConf,Tol,Standard_False);
  }
}
//--------------------------------------------------------------------------------
void IntCurve_UserIntConicCurveGen::Perform (const gp_Elips2d& Elips1,
					     const IntRes2d_Domain& D1,
					     const ThePCurve& C2,
					     const IntRes2d_Domain& D2,
					     const Standard_Real TolConf,
					     const Standard_Real Tol) {
  this->ResetFields();
  Standard_Integer NbInterC2 = ThePCurveTool::NbIntervals(C2);  
  if(NbInterC2 > 1) {
    Standard_Real ParamInf,ParamSup;
    Standard_Real D2FirstParam = D2.FirstParameter();
    Standard_Real D2LastParam  = D2.LastParameter();
    Standard_Boolean Ok = Standard_True;
    param1inf = (D1.HasFirstPoint()) ? D1.FirstParameter() : -Precision::Infinite();
    param1sup = (D1.HasLastPoint()) ?  D1.LastParameter()  : Precision::Infinite();
    param2inf = ThePCurveTool::FirstParameter(C2);
    param2sup = ThePCurveTool::LastParameter(C2);
    IntRes2d_Domain DomainC2NumInter;

    TColStd_Array1OfReal Tab2(1,NbInterC2+1);
    ThePCurveTool::Intervals(C2,Tab2);    

    for(Standard_Integer NumInterC2=1; Ok && (NumInterC2<=NbInterC2);NumInterC2++) { 
      ThePCurveTool::GetInterval(C2,NumInterC2,Tab2,ParamInf,ParamSup);
      if((ParamInf > D2LastParam)||(ParamSup < D2FirstParam)) Ok=Standard_False; 
      else { 
	if(ParamInf < D2FirstParam) ParamInf = D2FirstParam;
	if(ParamSup > D2LastParam)  ParamSup = D2LastParam; 
	if((ParamSup - ParamInf) > RealEpsilon()) { 
	  DomainC2NumInter.SetValues(ThePCurveTool::Value(C2,ParamInf),
				     ParamInf,
				     D2.FirstTolerance(),
				     ThePCurveTool::Value(C2,ParamSup),
				     ParamSup,
				     D2.LastTolerance());
	  InternalPerform(Elips1,D1,C2,DomainC2NumInter,TolConf,Tol,Standard_True);
	}
      }
    }
  }
  else { 
    InternalPerform(Elips1,D1,C2,D2,TolConf,Tol,Standard_False);
  }
}
//--------------------------------------------------------------------------------
void IntCurve_UserIntConicCurveGen::Perform (const gp_Hypr2d& Hyper1,
					     const IntRes2d_Domain& D1,
					     const ThePCurve& C2,
					     const IntRes2d_Domain& D2,
					     const Standard_Real TolConf,
					     const Standard_Real Tol) {
  this->ResetFields();
  Standard_Integer NbInterC2 = ThePCurveTool::NbIntervals(C2);  
  if(NbInterC2 > 1) {
    Standard_Real ParamInf,ParamSup;
    Standard_Real D2FirstParam = D2.FirstParameter();
    Standard_Real D2LastParam  = D2.LastParameter();
    Standard_Boolean Ok = Standard_True;
    param1inf = (D1.HasFirstPoint()) ? D1.FirstParameter() : -Precision::Infinite();
    param1sup = (D1.HasLastPoint()) ?  D1.LastParameter()  : Precision::Infinite();
    param2inf = ThePCurveTool::FirstParameter(C2);
    param2sup = ThePCurveTool::LastParameter(C2);
    IntRes2d_Domain DomainC2NumInter;
    
    TColStd_Array1OfReal Tab2(1,NbInterC2+1);
    ThePCurveTool::Intervals(C2,Tab2);    

    for(Standard_Integer NumInterC2=1; Ok && (NumInterC2<=NbInterC2);NumInterC2++) { 
      ThePCurveTool::GetInterval(C2,NumInterC2,Tab2,ParamInf,ParamSup);
      if((ParamInf > D2LastParam)||(ParamSup < D2FirstParam)) Ok=Standard_False; 
      else { 
	if(ParamInf < D2FirstParam) ParamInf = D2FirstParam;
	if(ParamSup > D2LastParam)  ParamSup = D2LastParam; 
	if((ParamSup - ParamInf) > RealEpsilon()) { 
	  DomainC2NumInter.SetValues(ThePCurveTool::Value(C2,ParamInf),
				     ParamInf,
				     D2.FirstTolerance(),
				     ThePCurveTool::Value(C2,ParamSup),
				     ParamSup,
				     D2.LastTolerance());
	  InternalPerform(Hyper1,D1,C2,DomainC2NumInter,TolConf,Tol,Standard_True);
	}
      }
    }
  }
  else { 
    InternalPerform(Hyper1,D1,C2,D2,TolConf,Tol,Standard_False);
  }
}

//----------------------------------------------------------------------
//-- InternalPerform 
//-- Suppose des Courbes Lin...Hypr
//-- Si Composite == True 
//--     Les Resultats sont Ajoutes 
//-- Sinon
//--     Les Resultats sont Copies
//----------------------------------------------------------------------
void IntCurve_UserIntConicCurveGen::InternalPerform (const gp_Lin2d& Lin1,
						     const IntRes2d_Domain& D1,
						     const ThePCurve& C2,
						     const IntRes2d_Domain& D2,
						     const Standard_Real TolConf,
						     const Standard_Real Tol,
						     const Standard_Boolean Composite) {

  GeomAbs_CurveType typ2 = ThePCurveTool::GetType(C2);
  
  switch (typ2) {
    
  case GeomAbs_Line:
    {
      intconiconi.SetReversedParameters(Standard_False);
      intconiconi.Perform(Lin1,D1,ThePCurveTool::Line(C2),D2,TolConf,Tol);
      if(Composite)    { this->Append(intconiconi,
				      param1inf,
				      param1sup,
				      param2inf,
				      param2sup);  }
      else             { this->SetValues(intconiconi); }
    }
    break;
    
  case GeomAbs_Circle:
    {
      intconiconi.SetReversedParameters(Standard_False);
      intconiconi.Perform(Lin1,D1,ThePCurveTool::Circle(C2),D2,TolConf,Tol);
      if(Composite)    { this->Append(intconiconi,
				      param1inf,
				      param1sup,
				      param2inf,
				      param2sup);  }
      else             { this->SetValues(intconiconi); }
    }
    break;
    
  case GeomAbs_Ellipse:
    {
      intconiconi.SetReversedParameters(Standard_False);
      intconiconi.Perform(Lin1,D1,ThePCurveTool::Ellipse(C2),D2,TolConf,Tol);
      if(Composite)    { this->Append(intconiconi,
				      param1inf,
				      param1sup,
				      param2inf,
				      param2sup);  }
      else             { this->SetValues(intconiconi); }
    }
    break;
    
  case GeomAbs_Parabola:
    {
      intconiconi.SetReversedParameters(Standard_False);
      intconiconi.Perform(Lin1,D1,ThePCurveTool::Parabola(C2),D2,TolConf,Tol);
      if(Composite)    { this->Append(intconiconi,
				      param1inf,
				      param1sup,
				      param2inf,
				      param2sup);  }
      else             { this->SetValues(intconiconi); }
    }
    break;
    
  case GeomAbs_Hyperbola:
    {
      intconiconi.SetReversedParameters(Standard_False);
      intconiconi.Perform(Lin1,D1,ThePCurveTool::Hyperbola(C2),D2,TolConf,Tol);
      if(Composite)    { this->Append(intconiconi,
				      param1inf,
				      param1sup,
				      param2inf,
				      param2sup);  }
      else             { this->SetValues(intconiconi); }
    }
    break;
    
  default: 
    {
      intconicurv.SetReversedParameters(Standard_False);
      intconicurv.Perform(Lin1,D1,C2,D2,TolConf,Tol);
      if(Composite)    { this->Append(intconicurv,
				      param1inf,
				      param1sup,
				      param2inf,
				      param2sup);  }
      else             { this->SetValues(intconicurv); }
    }
    break;
  }
}
  
//----------------------------------------------------------------------
void IntCurve_UserIntConicCurveGen::InternalPerform (const gp_Circ2d& Circ1,
						     const IntRes2d_Domain& D1,
						     const ThePCurve& C2,
						     const IntRes2d_Domain& D2,
						     const Standard_Real TolConf,
						     const Standard_Real Tol,
						     const Standard_Boolean Composite) { 

  GeomAbs_CurveType typ2 = ThePCurveTool::GetType(C2);
  
  switch (typ2) {
    
  case GeomAbs_Line:
    {
      intconiconi.SetReversedParameters(Standard_True);
      intconiconi.Perform(ThePCurveTool::Line(C2),D2,Circ1,D1,TolConf,Tol);
      if(Composite)    { this->Append(intconiconi,
				      param1inf,
				      param1sup,
				      param2inf,
				      param2sup);  }
      else             { this->SetValues(intconiconi); }
    }
    break;
    
  case GeomAbs_Circle:
    {
      intconiconi.SetReversedParameters(Standard_False);
      intconiconi.Perform(Circ1,D1,ThePCurveTool::Circle(C2),D2,TolConf,Tol);
      if(Composite)    { this->Append(intconiconi,
				      param1inf,
				      param1sup,
				      param2inf,
				      param2sup);  }
      else             { this->SetValues(intconiconi); }
    }
    break;
    
  case GeomAbs_Ellipse:
    {
      intconiconi.SetReversedParameters(Standard_False);
      intconiconi.Perform(Circ1,D1,ThePCurveTool::Ellipse(C2),D2,TolConf,Tol);
      if(Composite)    { this->Append(intconiconi,
				      param1inf,
				      param1sup,
				      param2inf,
				      param2sup);  }
      else             { this->SetValues(intconiconi); }
    }
    break;
    
  case GeomAbs_Parabola:
    {
      intconiconi.SetReversedParameters(Standard_False);
      intconiconi.Perform(Circ1,D1,ThePCurveTool::Parabola(C2),D2,TolConf,Tol);
      if(Composite)    { this->Append(intconiconi,
				      param1inf,
				      param1sup,
				      param2inf,
				      param2sup);  }
      else             { this->SetValues(intconiconi); }
    }
    break;
    
  case GeomAbs_Hyperbola:
    {
      intconiconi.SetReversedParameters(Standard_False);
      intconiconi.Perform(Circ1,D1,ThePCurveTool::Hyperbola(C2),D2,TolConf,Tol);
      if(Composite)    { this->Append(intconiconi,
				      param1inf,
				      param1sup,
				      param2inf,
				      param2sup);  }
      else             { this->SetValues(intconiconi); }
    }
    break;
    
  default:
    {
      intconicurv.SetReversedParameters(Standard_False);
      intconicurv.Perform(Circ1,D1,C2,D2,TolConf,Tol);
      if(Composite)    { this->Append(intconicurv,
				      param1inf,
				      param1sup,
				      param2inf,
				      param2sup);  }
      else             { this->SetValues(intconicurv); }
    }
    break;  
  }
}
//----------------------------------------------------------------------
void IntCurve_UserIntConicCurveGen::InternalPerform (const gp_Elips2d& Elips1,
						     const IntRes2d_Domain& D1,
						     const ThePCurve& C2,
						     const IntRes2d_Domain& D2,
						     const Standard_Real TolConf,
						     const Standard_Real Tol,
						     const Standard_Boolean Composite) { 
  
  GeomAbs_CurveType typ2 = ThePCurveTool::GetType(C2);
    
  switch (typ2) {
    
  case GeomAbs_Line:
    {
      intconiconi.SetReversedParameters(Standard_True);
      intconiconi.Perform(ThePCurveTool::Line(C2),D2,Elips1,D1,TolConf,Tol);
      if(Composite)    { this->Append(intconiconi,
				      param1inf,
				      param1sup,
				      param2inf,
				      param2sup);  }
      else             { this->SetValues(intconiconi); }
    }
    break;
    
  case GeomAbs_Circle:
    {
      intconiconi.SetReversedParameters(Standard_True);
      intconiconi.Perform(ThePCurveTool::Circle(C2),D2,Elips1,D1,TolConf,Tol);
      if(Composite)    { this->Append(intconiconi,
				      param1inf,
				      param1sup,
				      param2inf,
				      param2sup);  }
      else             { this->SetValues(intconiconi); }
    }
    break;
    
  case GeomAbs_Ellipse:
    {
      intconiconi.SetReversedParameters(Standard_False);
      intconiconi.Perform(Elips1,D1,ThePCurveTool::Ellipse(C2),D2,TolConf,Tol);
      if(Composite)    { this->Append(intconiconi,
				      param1inf,
				      param1sup,
				      param2inf,
				      param2sup);  }
      else             { this->SetValues(intconiconi); }
    }
    break;
    
  case GeomAbs_Parabola:
    {
      intconiconi.SetReversedParameters(Standard_False);
      intconiconi.Perform(Elips1,D1,ThePCurveTool::Parabola(C2),D2,TolConf,Tol);
      if(Composite)    { this->Append(intconiconi,
				      param1inf,
				      param1sup,
				      param2inf,
				      param2sup);  }
      else             { this->SetValues(intconiconi); }
    }
    break;
    
  case GeomAbs_Hyperbola:
    {
      intconiconi.SetReversedParameters(Standard_False);
      intconiconi.Perform(Elips1,D1,ThePCurveTool::Hyperbola(C2),D2,
			  TolConf,Tol);
      if(Composite)    { this->Append(intconiconi,
				      param1inf,
				      param1sup,
				      param2inf,
				      param2sup);  }
      else             { this->SetValues(intconiconi); }
    }
    break;
    
  default:
    {
      intconicurv.SetReversedParameters(Standard_False);
      intconicurv.Perform(Elips1,D1,C2,D2,TolConf,Tol);
      if(Composite)    { this->Append(intconicurv,
				      param1inf,
				      param1sup,
				      param2inf,
				      param2sup);  }
      else             { this->SetValues(intconicurv); }
    }
    break;
  }
}

//----------------------------------------------------------------------
void IntCurve_UserIntConicCurveGen::InternalPerform (const gp_Parab2d& Parab1,
						     const IntRes2d_Domain& D1,
						     const ThePCurve& C2,
						     const IntRes2d_Domain& D2,
						     const Standard_Real TolConf,
						     const Standard_Real Tol,
						     const Standard_Boolean Composite) { 

  GeomAbs_CurveType typ2 = ThePCurveTool::GetType(C2);
  
  switch (typ2) {
    
  case GeomAbs_Line:
    {
      intconiconi.SetReversedParameters(Standard_True);
      intconiconi.Perform(ThePCurveTool::Line(C2),D2,Parab1,D1,TolConf,Tol);
      if(Composite)    { this->Append(intconiconi,
				      param1inf,
				      param1sup,
				      param2inf,
				      param2sup);  }
      else             { this->SetValues(intconiconi); }
    }
    break;
    
  case GeomAbs_Circle:
    {
      intconiconi.SetReversedParameters(Standard_True);
      intconiconi.Perform(ThePCurveTool::Circle(C2),D2,Parab1,D1,TolConf,Tol);
      if(Composite)    { this->Append(intconiconi,
				      param1inf,
				      param1sup,
				      param2inf,
				      param2sup);  }
      else             { this->SetValues(intconiconi); }
    }
    break;
    
  case GeomAbs_Ellipse:
    {
      intconiconi.SetReversedParameters(Standard_True);
      intconiconi.Perform(ThePCurveTool::Ellipse(C2),D2,Parab1,D1,TolConf,Tol);
      if(Composite)    { this->Append(intconiconi,
				      param1inf,
				      param1sup,
				      param2inf,
				      param2sup);  }
      else             { this->SetValues(intconiconi); }
    }
    break;
    
  case GeomAbs_Parabola:
    {
      intconiconi.SetReversedParameters(Standard_False);
      intconiconi.Perform(Parab1,D1,ThePCurveTool::Parabola(C2),D2,TolConf,Tol);
      if(Composite)    { this->Append(intconiconi,
				      param1inf,
				      param1sup,
				      param2inf,
				      param2sup);  }
      else             { this->SetValues(intconiconi); }
    }
    break;
    
  case GeomAbs_Hyperbola:
    {
      intconiconi.SetReversedParameters(Standard_False);
      intconiconi.Perform(Parab1,D1,ThePCurveTool::Hyperbola(C2),D2,TolConf,Tol);
      if(Composite)    { this->Append(intconiconi,
				      param1inf,
				      param1sup,
				      param2inf,
				      param2sup);  }
      else             { this->SetValues(intconiconi); }
    }
    break;
    
  default:
    {
      intconicurv.SetReversedParameters(Standard_False);
      intconicurv.Perform(Parab1,D1,C2,D2,TolConf,Tol);
      if(Composite)    { this->Append(intconicurv,
				      param1inf,
				      param1sup,
				      param2inf,
				      param2sup);  }
      else             { this->SetValues(intconicurv); }
    }
    break;
  }
}
  
//----------------------------------------------------------------------
void IntCurve_UserIntConicCurveGen::InternalPerform (const gp_Hypr2d& Hyper1,
						     const IntRes2d_Domain& D1,
						     const ThePCurve& C2,
						     const IntRes2d_Domain& D2,
						     const Standard_Real TolConf,
						     const Standard_Real Tol,
						     const Standard_Boolean Composite) { 

  GeomAbs_CurveType typ2 = ThePCurveTool::GetType(C2);
  
  switch (typ2) {
    
  case GeomAbs_Line:
    {
      intconiconi.SetReversedParameters(Standard_True);
      intconiconi.Perform(ThePCurveTool::Line(C2),D2,Hyper1,D1,TolConf,Tol);
      if(Composite)    { this->Append(intconiconi,
				      param1inf,
				      param1sup,
				      param2inf,
				      param2sup);  }
      else             { this->SetValues(intconiconi); }
    }
    break;
    
  case GeomAbs_Circle:
    {
      intconiconi.SetReversedParameters(Standard_True);
      intconiconi.Perform(ThePCurveTool::Circle(C2),D2,Hyper1,D1,TolConf,Tol);
      if(Composite)    { this->Append(intconiconi,
				      param1inf,
				      param1sup,
				      param2inf,
				      param2sup);  }
      else             { this->SetValues(intconiconi); }
    }
    break;
    
  case GeomAbs_Ellipse:
    {
      intconiconi.SetReversedParameters(Standard_True);
      intconiconi.Perform(ThePCurveTool::Ellipse(C2),D2,Hyper1,D1,TolConf,Tol);
      if(Composite)    { this->Append(intconiconi,
				      param1inf,
				      param1sup,
				      param2inf,
				      param2sup);  }
      else             { this->SetValues(intconiconi); }
    }
    break;
    
  case GeomAbs_Parabola:
    {
      intconiconi.SetReversedParameters(Standard_True);
      intconiconi.Perform(ThePCurveTool::Parabola(C2),D2,Hyper1,D1,TolConf,Tol);
      if(Composite)    { this->Append(intconiconi,
				      param1inf,
				      param1sup,
				      param2inf,
				      param2sup);  }
      else             { this->SetValues(intconiconi); }
    }
    break;
    
  case GeomAbs_Hyperbola:
    {
      intconiconi.SetReversedParameters(Standard_False);
      intconiconi.Perform(Hyper1,D1,ThePCurveTool::Hyperbola(C2),D2,TolConf,Tol);
      if(Composite)    { this->Append(intconiconi,
				      param1inf,
				      param1sup,
				      param2inf,
				      param2sup);  }
      else             { this->SetValues(intconiconi); }
    }
    break;
    
  default:
    {
      intconicurv.SetReversedParameters(Standard_False);
      intconicurv.Perform(Hyper1,D1,
			  C2,D2,TolConf,Tol);
      if(Composite)    { this->Append(intconicurv,
				      param1inf,
				      param1sup,
				      param2inf,
				      param2sup);  }
      else             { this->SetValues(intconicurv); }
    }
    break;
  }
}
//--------------------------------------------------------------------------------
