// Created on: 1994-09-21 // Created by: Laurent BOURESCHE // Copyright (c) 1994-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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef DRAW #include #endif #ifdef OCCT_DEBUG #include OSD_Chronometer simul, elspine, chemine; #endif //********************************* // timing of the simulation //********************************* static Standard_Boolean ChFi3d_traceCHRON = Standard_False; void ChFi3d_SettraceCHRON(const Standard_Boolean b) { ChFi3d_traceCHRON = b; } Standard_Boolean ChFi3d_GettraceCHRON() { return ChFi3d_traceCHRON; } //********************************* // trace a line of path //********************************* static Standard_Boolean ChFi3d_traceDRAWWALK = Standard_False; void ChFi3d_SettraceDRAWWALK(const Standard_Boolean b) { ChFi3d_traceDRAWWALK = b; } Standard_Boolean ChFi3d_GettraceDRAWWALK() { return ChFi3d_traceDRAWWALK; } //********************************** // trace a line of intersection //********************************** static Standard_Boolean ChFi3d_traceDRAWINT = Standard_False; void ChFi3d_SettraceDRAWINT(const Standard_Boolean b) { ChFi3d_traceDRAWINT = b; } Standard_Boolean ChFi3d_GettraceDRAWINT() { return ChFi3d_traceDRAWINT; } //************************************************* // return surfaces of approximated fillets. //************************************************* static Standard_Boolean ChFi3d_traceDRAWFIL = Standard_False; void ChFi3d_SettraceDRAWFIL(const Standard_Boolean b) { ChFi3d_traceDRAWFIL = b; } Standard_Boolean ChFi3d_GettraceDRAWFIL() { return ChFi3d_traceDRAWFIL; } //************************************************* // return extended faces for the path. //************************************************* static Standard_Boolean ChFi3d_traceDRAWENLARGE = Standard_False; void ChFi3d_SettraceDRAWENLARGE(const Standard_Boolean b) { ChFi3d_traceDRAWENLARGE = b; } Standard_Boolean ChFi3d_GettraceDRAWENLARGE() { return ChFi3d_traceDRAWENLARGE; } //************************************************* // return the guideline for the triple corners. //************************************************* static Standard_Boolean ChFi3d_traceDRAWSPINE = Standard_False; void ChFi3d_SettraceDRAWSPINE(const Standard_Boolean b) { ChFi3d_traceDRAWSPINE = b; } Standard_Boolean ChFi3d_GettraceDRAWSPINE() { return ChFi3d_traceDRAWSPINE; } //************************************************* // set the type of guideline for the triple corners. //************************************************* void ChFi3d_SetcontextSPINEBEZIER(const Standard_Boolean b); void ChFi3d_SetcontextSPINECIRCLE(const Standard_Boolean b); void ChFi3d_SetcontextSPINECE(const Standard_Boolean b); static Standard_Boolean ChFi3d_contextSPINEBEZIER = Standard_False; void ChFi3d_SetcontextSPINEBEZIER(const Standard_Boolean b) { ChFi3d_contextSPINEBEZIER = b; if (b) { ChFi3d_SetcontextSPINECIRCLE(Standard_False); ChFi3d_SetcontextSPINECE(Standard_False); } } Standard_Boolean ChFi3d_GetcontextSPINEBEZIER() { return ChFi3d_contextSPINEBEZIER; } static Standard_Boolean ChFi3d_contextSPINECIRCLE = Standard_False; void ChFi3d_SetcontextSPINECIRCLE(const Standard_Boolean b) { ChFi3d_contextSPINECIRCLE = b; if (b) { ChFi3d_SetcontextSPINEBEZIER(Standard_False); ChFi3d_SetcontextSPINECE(Standard_False); } } Standard_Boolean ChFi3d_GetcontextSPINECIRCLE() { return ChFi3d_contextSPINECIRCLE; } static Standard_Boolean ChFi3d_contextSPINECE = Standard_False; void ChFi3d_SetcontextSPINECE(const Standard_Boolean b) { ChFi3d_contextSPINECE = b; if (b) { ChFi3d_SetcontextSPINEBEZIER(Standard_False); ChFi3d_SetcontextSPINECIRCLE(Standard_False); } } Standard_Boolean ChFi3d_GetcontextSPINECE() { return ChFi3d_contextSPINECE; } //************************************************* // Forced passage by the path for KPart //************************************************* static Standard_Boolean ChFi3d_contextFORCEBLEND = Standard_False; void ChFi3d_SetcontextFORCEBLEND(const Standard_Boolean b) { ChFi3d_contextFORCEBLEND = b; } Standard_Boolean ChFi3d_GetcontextFORCEBLEND() { return ChFi3d_contextFORCEBLEND; } static Standard_Boolean ChFi3d_contextFORCEFILLING = Standard_False; void ChFi3d_SetcontextFORCEFILLING(const Standard_Boolean b) { ChFi3d_contextFORCEFILLING = b; } Standard_Boolean ChFi3d_GetcontextFORCEFILLING() { return ChFi3d_contextFORCEFILLING; } //************************************************* // No optimization for approx //************************************************* static Standard_Boolean ChFi3d_contextNOOPT = Standard_False; void ChFi3d_SetcontextNOOPT(const Standard_Boolean b) { ChFi3d_contextNOOPT = b; } Standard_Boolean ChFi3d_GetcontextNOOPT() { return ChFi3d_contextNOOPT; } #ifdef OCCT_DEBUG // *********************************************** // initialization and result of a chrono //************************************************ Standard_EXPORT void ChFi3d_InitChron(OSD_Chronometer& ch) { ch.Reset(); ch.Start(); } Standard_EXPORT void ChFi3d_ResultChron(OSD_Chronometer& ch, Standard_Real& time) { Standard_Real tch; ch.Stop(); ch.Show(tch); time = time + tch; } #endif //============================================================== // function : ChFi3d_CheckSurfData // purpose : function allows to trace SurfData to check // construction of all elements, namely pcurves //============================================================== #ifdef DRAW static Standard_Integer NbSD = 0; #endif void ChFi3d_CheckSurfData(const TopOpeBRepDS_DataStructure& DStr, const Handle(ChFiDS_SurfData)& Data) { // trace of the surface defined by the chamfer or the fillet // corresponding to SurfData Handle(Geom_Surface) surf = (DStr.Surface(Data->Surf())).Surface(); if (!surf.IsNull()) { BRep_Builder B; TopoDS_Face F; B.MakeFace(F, surf, 0.); TopoDS_Wire W; B.MakeWire(W); TopoDS_Vertex V1, V2, V3, V4; B.MakeVertex(V1, Data->VertexFirstOnS1().Point(), 0.); B.MakeVertex(V2, Data->VertexLastOnS1().Point(), 0.); B.MakeVertex(V3, Data->VertexLastOnS2().Point(), 0.); B.MakeVertex(V4, Data->VertexFirstOnS2().Point(), 0.); TopoDS_Edge E1, E2, E3, E4; B.MakeEdge(E1); B.MakeEdge(E2); B.MakeEdge(E3); B.MakeEdge(E4); B.UpdateEdge(E1, Data->InterferenceOnS1().PCurveOnSurf(), F, 0.); B.UpdateEdge(E3, Data->InterferenceOnS2().PCurveOnSurf(), F, 0.); V1.Orientation(TopAbs_FORWARD); B.Add(E1, V1); B.UpdateVertex(V1, Data->InterferenceOnS1().FirstParameter(), E1, 0.); V2.Orientation(TopAbs_REVERSED); B.Add(E1, V2); B.UpdateVertex(V2, Data->InterferenceOnS1().LastParameter(), E1, 0.); V4.Orientation(TopAbs_FORWARD); B.Add(E3, V4); B.UpdateVertex(V4, Data->InterferenceOnS2().FirstParameter(), E3, 0.); V3.Orientation(TopAbs_REVERSED); B.Add(E3, V3); B.UpdateVertex(V3, Data->InterferenceOnS2().LastParameter(), E3, 0.); gp_Pnt2d pp1, pp2, pp3, pp4; pp1 = Data->InterferenceOnS1().PCurveOnSurf()->Value(Data->InterferenceOnS1().FirstParameter()); pp2 = Data->InterferenceOnS1().PCurveOnSurf()->Value(Data->InterferenceOnS1().LastParameter()); pp3 = Data->InterferenceOnS2().PCurveOnSurf()->Value(Data->InterferenceOnS2().LastParameter()); pp4 = Data->InterferenceOnS2().PCurveOnSurf()->Value(Data->InterferenceOnS2().FirstParameter()); gp_Dir2d d1(gp_Vec2d(pp1, pp4)); gp_Dir2d d2(gp_Vec2d(pp2, pp3)); Handle(Geom2d_Line) l1 = new Geom2d_Line(pp1, d1); Handle(Geom2d_Line) l2 = new Geom2d_Line(pp2, d2); B.UpdateEdge(E4, l1, F, 0.); V1.Orientation(TopAbs_FORWARD); B.Add(E4, V1); B.UpdateVertex(V1, 0., E4, 0.); V4.Orientation(TopAbs_REVERSED); B.Add(E4, V4); B.UpdateVertex(V4, pp4.Distance(pp1), E4, 0.); B.UpdateEdge(E2, l2, F, 0.); V2.Orientation(TopAbs_FORWARD); B.Add(E2, V2); B.UpdateVertex(V2, 0., E2, 0.); V3.Orientation(TopAbs_REVERSED); B.Add(E2, V3); B.UpdateVertex(V3, pp3.Distance(pp2), E2, 0.); gp_Pnt pw1, pw2, ppp; ppp = surf->Value(pp1.X(), pp1.Y()); pw1 = surf->Value(0.9 * pp1.X() + 0.1 * pp2.X(), 0.9 * pp1.Y() + 0.1 * pp2.Y()); pw2 = surf->Value(0.9 * pp1.X() + 0.1 * pp4.X(), 0.9 * pp1.Y() + 0.1 * pp4.Y()); gp_Vec vv1(ppp, pw1); gp_Vec vv2(ppp, pw2); gp_Vec Vwire = vv1 ^ vv2; surf->D1(pp1.X(), pp1.Y(), pw1, vv1, vv2); gp_Vec Vsurf = vv1 ^ vv2; Standard_Boolean rev = Vsurf.Dot(Vwire) <= 0.; E1.Orientation(TopAbs_FORWARD); E2.Orientation(TopAbs_FORWARD); E3.Orientation(TopAbs_REVERSED); E4.Orientation(TopAbs_REVERSED); if (rev) { E1.Orientation(TopAbs_REVERSED); E2.Orientation(TopAbs_REVERSED); E3.Orientation(TopAbs_FORWARD); E4.Orientation(TopAbs_FORWARD); } B.Add(W, E1); B.Add(W, E2); B.Add(W, E3); B.Add(W, E4); W.Orientation(TopAbs_FORWARD); B.Add(F, W); #ifdef DRAW // char name[100]; char* name = new char[100]; sprintf(name, "fillet_%d", NbSD++); DBRep::Set(name, F); #endif } }