// Created on: 1992-05-07 // Created by: Jacques GOUSSARD // Copyright (c) 1992-1999 Matra Datavision // Copyright (c) 1999-2012 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. static Standard_Boolean TreatResultTorus(const IntSurf_Quadric& theQuad1, const IntSurf_Quadric& theQuad2, const IntAna_QuadQuadGeo& anInt, Standard_Boolean& bEmpty, IntPatch_SequenceOfLine& theSeqLin); //======================================================================= //function : IntCyTo //purpose : //======================================================================= Standard_Boolean IntCyTo(const IntSurf_Quadric& theQuad1, const IntSurf_Quadric& theQuad2, const Standard_Real theTolTang, const Standard_Boolean bReversed, Standard_Boolean& bEmpty, IntPatch_SequenceOfLine& theSeqLin) { const gp_Cylinder aCyl = bReversed ? theQuad2.Cylinder() : theQuad1.Cylinder(); const gp_Torus aTorus = bReversed ? theQuad1.Torus() : theQuad2.Torus(); // IntAna_QuadQuadGeo anInt(aCyl, aTorus, theTolTang); Standard_Boolean bRet = TreatResultTorus(theQuad1, theQuad2, anInt, bEmpty, theSeqLin); // return bRet; } //======================================================================= //function : IntCoTo //purpose : //======================================================================= Standard_Boolean IntCoTo(const IntSurf_Quadric& theQuad1, const IntSurf_Quadric& theQuad2, const Standard_Real theTolTang, const Standard_Boolean bReversed, Standard_Boolean& bEmpty, IntPatch_SequenceOfLine& theSeqLin) { const gp_Cone aCone = bReversed ? theQuad2.Cone() : theQuad1.Cone(); const gp_Torus aTorus = bReversed ? theQuad1.Torus() : theQuad2.Torus(); // IntAna_QuadQuadGeo anInt(aCone, aTorus, theTolTang); Standard_Boolean bRet = TreatResultTorus(theQuad1, theQuad2, anInt, bEmpty, theSeqLin); // return bRet; } //======================================================================= //function : IntSpTo //purpose : //======================================================================= Standard_Boolean IntSpTo(const IntSurf_Quadric& theQuad1, const IntSurf_Quadric& theQuad2, const Standard_Real theTolTang, const Standard_Boolean bReversed, Standard_Boolean& bEmpty, IntPatch_SequenceOfLine& theSeqLin) { const gp_Sphere aSphere = bReversed ? theQuad2.Sphere() : theQuad1.Sphere(); const gp_Torus aTorus = bReversed ? theQuad1.Torus() : theQuad2.Torus(); // IntAna_QuadQuadGeo anInt(aSphere, aTorus, theTolTang); Standard_Boolean bRet = TreatResultTorus(theQuad1, theQuad2, anInt, bEmpty, theSeqLin); // return bRet; } //======================================================================= //function : IntToTo //purpose : //======================================================================= Standard_Boolean IntToTo(const IntSurf_Quadric& theQuad1, const IntSurf_Quadric& theQuad2, const Standard_Real theTolTang, Standard_Boolean& bSameSurf, Standard_Boolean& bEmpty, IntPatch_SequenceOfLine& theSeqLin) { const gp_Torus aTorus1 = theQuad1.Torus(); const gp_Torus aTorus2 = theQuad2.Torus(); // IntAna_QuadQuadGeo anInt(aTorus1, aTorus2, theTolTang); Standard_Boolean bRet = anInt.IsDone(); if (bRet) { if (anInt.TypeInter() == IntAna_Same) { bEmpty = Standard_False; bSameSurf = Standard_True; } else { bRet = TreatResultTorus(theQuad1, theQuad2, anInt, bEmpty, theSeqLin); } } // return bRet; } //======================================================================= //function : TreatResultTorus //purpose : //======================================================================= static Standard_Boolean TreatResultTorus(const IntSurf_Quadric& theQuad1, const IntSurf_Quadric& theQuad2, const IntAna_QuadQuadGeo& anInt, Standard_Boolean& bEmpty, IntPatch_SequenceOfLine& theSeqLin) { Standard_Boolean bRet = anInt.IsDone(); // if (!bRet) { return bRet; } // IntAna_ResultType typint = anInt.TypeInter(); Standard_Integer NbSol = anInt.NbSolutions(); bEmpty = Standard_False; // switch (typint) { case IntAna_Empty : bEmpty = Standard_True; break; // case IntAna_Circle : { Standard_Integer i; IntSurf_TypeTrans trans1, trans2; gp_Vec Tgt; gp_Pnt ptref; // for (i = 1; i <= NbSol; ++i) { gp_Circ aC = anInt.Circle(i); if (theQuad1.TypeQuadric() == theQuad2.TypeQuadric()) { AdjustToSeam(theQuad1.Torus(), aC); } ElCLib::D1(0., aC, ptref, Tgt); Standard_Real qwe = Tgt.DotCross(theQuad2.Normale(ptref), theQuad1.Normale(ptref)); if(qwe> 0.00000001) { trans1 = IntSurf_Out; trans2 = IntSurf_In; } else if(qwe< -0.00000001) { trans1 = IntSurf_In; trans2 = IntSurf_Out; } else { trans1=trans2=IntSurf_Undecided; } // Handle(IntPatch_GLine) glig = new IntPatch_GLine(aC, Standard_False, trans1, trans2); theSeqLin.Append(glig); } } break; // case IntAna_NoGeometricSolution: default: bRet = Standard_False; break; } // return bRet; }