// Created on: 1993-07-22 // Created by: Remi LEQUETTE // Copyright (c) 1993-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 #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef _WIN32 //#define strcasecmp strcmp Already defined #include #endif //----------------------------------------------------------------------- // suppressarg : suppress a[d],modifie na-- //----------------------------------------------------------------------- static void suppressarg(Standard_Integer& na,const char** a,const Standard_Integer d) { for(Standard_Integer i=d;iTransformed(L.Transformation())); return 0; } //======================================================================= // mkplane //======================================================================= static Standard_Integer mkplane(Draw_Interpretor& theDI, Standard_Integer n, const char** a) { if (n < 3) return 1; TopoDS_Shape S = DBRep::Get(a[2],TopAbs_WIRE); if (S.IsNull()) return 1; Standard_Boolean OnlyPlane = Standard_False; if ( n == 4) { OnlyPlane = !strcmp(a[3],"1"); } BRepBuilderAPI_MakeFace aMF(TopoDS::Wire(S), OnlyPlane); switch(aMF.Error()) { case BRepBuilderAPI_FaceDone: DBRep::Set(a[1],aMF.Face()); break; case BRepBuilderAPI_NoFace: theDI << "Error. mkplane has been finished with \"No Face\" status.\n"; break; case BRepBuilderAPI_NotPlanar: theDI << "Error. mkplane has been finished with \"Not Planar\" status.\n"; break; case BRepBuilderAPI_CurveProjectionFailed: theDI << "Error. mkplane has been finished with \"Fail in projection curve\" status.\n"; break; case BRepBuilderAPI_ParametersOutOfRange: theDI << "Error. mkplane has been finished with \"Parameters are out of range\" status.\n"; break; default: theDI << "Error. Undefined status. Please check the code.\n"; break; } return 0; } //======================================================================= // pcurve //======================================================================= Standard_IMPORT Draw_Color DrawTrSurf_CurveColor(const Draw_Color col); Standard_IMPORT void DBRep_WriteColorOrientation (); Standard_IMPORT Draw_Color DBRep_ColorOrientation (const TopAbs_Orientation Or); static Standard_Integer pcurve(Draw_Interpretor& , Standard_Integer n, const char** a) { Standard_Boolean mute = Standard_False; for(Standard_Integer ia=1;iaFirstParameter(), lr = c->LastParameter(); Standard_Boolean IsPeriodic = c->IsPeriodic(); if (c->DynamicType() == STANDARD_TYPE(Geom2d_TrimmedCurve)) { const Handle(Geom2d_Curve)& aC = Handle(Geom2d_TrimmedCurve)::DownCast (c)->BasisCurve(); IsPeriodic = aC->IsPeriodic(); fr = aC->FirstParameter(); lr = aC->LastParameter(); } if(!IsPeriodic && ((fr - f > Precision::PConfusion()) || (l - lr > Precision::PConfusion()))) { DrawTrSurf::Set(name, c); } else { DrawTrSurf::Set(name,new Geom2d_TrimmedCurve(c,f,l)); } } DrawTrSurf_CurveColor(savecol); } else if (n >= 4) { TopoDS_Shape SE = DBRep::Get(a[2],TopAbs_EDGE); if (SE.IsNull()) return 1; TopoDS_Shape SF = DBRep::Get(a[3],TopAbs_FACE); if (SF.IsNull()) return 1; Draw_Color col, savecol = DrawTrSurf_CurveColor(Draw_rouge); Standard_Real f,l; const Handle(Geom2d_Curve) c = BRep_Tool::CurveOnSurface (TopoDS::Edge(SE),TopoDS::Face(SF),f,l); Standard_Real fr = c->FirstParameter(), lr = c->LastParameter(); Standard_Boolean IsPeriodic = c->IsPeriodic(); if (c->DynamicType() == STANDARD_TYPE(Geom2d_TrimmedCurve)) { const Handle(Geom2d_Curve)& aC = Handle(Geom2d_TrimmedCurve)::DownCast (c)->BasisCurve(); IsPeriodic = aC->IsPeriodic(); fr = aC->FirstParameter(); lr = aC->LastParameter(); } col = DBRep_ColorOrientation(SE.Orientation()); DrawTrSurf_CurveColor(col); if(!IsPeriodic && ((fr - f > Precision::PConfusion()) || (l - lr > Precision::PConfusion()))) { DrawTrSurf::Set(a[1], c); } else { DrawTrSurf::Set(a[1],new Geom2d_TrimmedCurve(c,f,l)); } DrawTrSurf_CurveColor(savecol); } else { return 1; } return 0; } //======================================================================= // sewing //======================================================================= static Standard_Integer sewing (Draw_Interpretor& theDi, Standard_Integer theArgc, const char** theArgv) { BRepBuilderAPI_Sewing aSewing; Standard_Integer aPar = 1; TopTools_SequenceOfShape aSeq; Standard_Real aTol = 1.0e-06; Standard_Boolean aSewingMode = Standard_True; Standard_Boolean anAnalysisMode = Standard_True; Standard_Boolean aCuttingMode = Standard_True; Standard_Boolean aNonManifoldMode = Standard_False; Standard_Boolean aSameParameterMode = Standard_True; Standard_Boolean aFloatingEdgesMode = Standard_False; Standard_Boolean aFaceMode = Standard_True; Standard_Boolean aSetMinTol = Standard_False; Standard_Real aMinTol = 0.; Standard_Real aMaxTol = Precision::Infinite(); for (Standard_Integer i = 2; i < theArgc; i++) { if (theArgv[i][0] == '-' || theArgv[i][0] == '+') { Standard_Boolean aVal = (theArgv[i][0] == '+' ? Standard_True : Standard_False); switch (tolower(theArgv[i][1])) { case 'm': { if (tolower(theArgv[i][2]) == 'i' && i+1 < theArgc) { if (Draw::Atof (theArgv[i+1])) { aMinTol = Draw::Atof (theArgv[++i]); aSetMinTol = Standard_True; } else { theDi << "Error! min tolerance can't possess the null value\n"; return (1); } } if (tolower(theArgv[i][2]) == 'a' && i+1 < theArgc) { if (Draw::Atof (theArgv[i+1])) aMaxTol = Draw::Atof (theArgv[++i]); else { theDi << "Error! max tolerance can't possess the null value\n"; return (1); } } } break; case 's': aSewingMode = aVal; break; case 'a': anAnalysisMode = aVal; break; case 'c': aCuttingMode = aVal; break; case 'n': aNonManifoldMode = aVal; break; case 'p': aSameParameterMode = aVal; break; case 'e': aFloatingEdgesMode = aVal; break; case 'f': aFaceMode = aVal; break; } } else { TopoDS_Shape aShape = DBRep::Get (theArgv[i]); if (!aShape.IsNull()) { aSeq.Append (aShape); aPar++; } else { if (Draw::Atof (theArgv[i])) aTol = Draw::Atof (theArgv[i]); } } } if (aPar < 2) { theDi << "Use: " << theArgv[0] << " result [tolerance] shape1 shape2 ... [min tolerance] [max tolerance] [switches]\n"; theDi << "To set user's value of min/max tolerances the following syntax is used: + \n"; theDi << "- parameters are identified by letters:\n"; theDi << " mint - min tolerance\n"; theDi << " maxt - max tolerance\n"; theDi << "Switches allow to tune other parameters of Sewing\n"; theDi << "The following syntax is used: \n"; theDi << "- symbol may be - to set parameter off, + to set on\n"; theDi << "- parameters are identified by letters:\n"; theDi << " s - mode for creating sewed shape\n"; theDi << " a - mode for analysis of input shapes\n"; theDi << " c - mode for cutting of free edges\n"; theDi << " n - mode for non manifold processing\n"; theDi << " p - mode for same parameter processing for edges\n"; theDi << " e - mode for sewing floating edges\n"; theDi << " f - mode for sewing faces\n"; return (1); } if (!aSetMinTol) aMinTol = aTol*1e-4; if (aTol < Precision::Confusion()) aTol = Precision::Confusion(); if (aMinTol < Precision::Confusion()) aMinTol = Precision::Confusion(); if (aMinTol > aTol) { theDi << "Error! min tolerance can't exceed working tolerance\n"; return (1); } if (aMaxTol < aTol) { theDi << "Error! max tolerance can't be less than working tolerance\n"; return (1); } aSewing.Init (aTol, aSewingMode, anAnalysisMode, aCuttingMode, aNonManifoldMode); aSewing.SetSameParameterMode (aSameParameterMode); aSewing.SetFloatingEdgesMode (aFloatingEdgesMode); aSewing.SetFaceMode (aFaceMode); aSewing.SetMinTolerance (aMinTol); aSewing.SetMaxTolerance (aMaxTol); for (Standard_Integer i = 1; i <= aSeq.Length(); i++) aSewing.Add(aSeq.Value(i)); Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator (theDi, 1); aSewing.Perform (aProgress); aSewing.Dump(); const TopoDS_Shape& aRes = aSewing.SewedShape(); if (!aRes.IsNull()) DBRep::Set(theArgv[1], aRes); return 0; } //======================================================================= //function : fastsewing //purpose : //======================================================================= Standard_Integer fastsewing (Draw_Interpretor& theDI, Standard_Integer theNArg, const char** theArgVal) { if(theNArg < 3) { // 0 1 2 3 4 theDI << "Use: fastsewing result [-tol ] \n"; return 1; } BRepBuilderAPI_FastSewing aFS; Standard_Integer aStartIndex = 2; if(!strcmp(theArgVal[aStartIndex], "-tol")) { aFS.SetTolerance(Draw::Atof (theArgVal[aStartIndex+1])); aStartIndex = 4; } for(Standard_Integer i = aStartIndex; i < theNArg; i++) { TopoDS_Shape aS = DBRep::Get(theArgVal[i]); if(!aFS.Add(aS)) { theDI << "Face is not added. See statuses.\n"; } } BRepBuilderAPI_FastSewing::FS_VARStatuses aStatus = aFS.GetStatuses(); if(aStatus) { theDI << "Error: There are some problems while adding (" << (static_cast(aStatus)) << ")\n"; aFS.GetStatuses(&std::cout); } aFS.Perform(); aStatus = aFS.GetStatuses(); if(aStatus) { theDI << "Error: There are some problems while performing (" << (static_cast(aStatus)) << ")\n"; aFS.GetStatuses(&std::cout); } DBRep::Set(theArgVal[1], aFS.GetResult()); return 0; } //======================================================================= // continuity //======================================================================= static Standard_Integer continuity (Draw_Interpretor& , Standard_Integer n, const char** a) { if (n < 2) return (1); BRepOffsetAPI_FindContigousEdges aFind; TopoDS_Shape sh = DBRep::Get(a[1]); Standard_Integer i=1; if (sh.IsNull()) { if (n < 3) return (1); Standard_Real tol = Draw::Atof(a[1]); aFind.Init(tol, Standard_False); i = 2; } while (i < n) { sh = DBRep::Get(a[i]); aFind.Add(sh); i++; } aFind.Perform(); aFind.Dump(); return 0; } //======================================================================= // encoderegularity //======================================================================= static Standard_Integer encoderegularity (Draw_Interpretor& , Standard_Integer n, const char** a) { if (n < 2) return 1; TopoDS_Shape sh = DBRep::Get(a[1]); if (sh.IsNull()) return 1; if (n==2) BRepLib::EncodeRegularity(sh); else { Standard_Real Tol = Draw::Atof(a[2]); Tol *= M_PI/180.; BRepLib::EncodeRegularity(sh, Tol); } return 0; } static Standard_Integer getedgeregul (Draw_Interpretor& di, Standard_Integer argc, const char** argv) { if( argc < 3) { std::cout<<"Invalid number of arguments. Should be: checkedgeregularity edge face1 [face2]"< 3 ? DBRep::Get(argv[3],TopAbs_FACE) : aFace1); if( anEdge.IsNull() || aFace1.IsNull() || aFace2.IsNull()) { std::cout<<"Invalid number of arguments. Should be: getedgeregularity edge face1 [face2]"< 5) { di << "Project point on the face.\n"; di << "Usage: projponf face pnt [extrema flag: -min/-max/-minmax] [extrema algo: -g(grad)/-t(tree)]\n"; return 1; } // get face TopoDS_Shape aS = DBRep::Get(a[1]); if (aS.IsNull()) { di << "the face is a null shape\n"; return 0; } // if (aS.ShapeType() != TopAbs_FACE) { di << "not a face\n"; return 0; } // const TopoDS_Face& aFace = *(TopoDS_Face*)&aS; // // get point gp_Pnt aP; DrawTrSurf::GetPoint(a[2], aP); // // get projection options // default values; Extrema_ExtAlgo anExtAlgo = Extrema_ExtAlgo_Grad; Extrema_ExtFlag anExtFlag = Extrema_ExtFlag_MINMAX; // for (Standard_Integer i = 3; i < n; ++i) { if (!strcasecmp(a[i], "-min")) { anExtFlag = Extrema_ExtFlag_MIN; } else if (!strcasecmp(a[i], "-max")) { anExtFlag = Extrema_ExtFlag_MAX; } else if (!strcasecmp(a[i], "-minmax")) { anExtFlag = Extrema_ExtFlag_MINMAX; } else if (!strcasecmp(a[i], "-t")) { anExtAlgo = Extrema_ExtAlgo_Tree; } else if (!strcasecmp(a[i], "-g")) { anExtAlgo = Extrema_ExtAlgo_Grad; } } // // get surface TopLoc_Location aLoc; const Handle(Geom_Surface)& aSurf = BRep_Tool::Surface(aFace, aLoc); // move point to surface location aP.Transform(aLoc.Transformation().Inverted()); // // get bounds of the surface Standard_Real aUMin, aUMax, aVMin, aVMax; aSurf->Bounds(aUMin, aUMax, aVMin, aVMax); // // initialize projector GeomAPI_ProjectPointOnSurf aProjPS; aProjPS.Init(aSurf, aUMin, aUMax, aVMin, aVMax); // set the options aProjPS.SetExtremaAlgo(anExtAlgo); aProjPS.SetExtremaFlag(anExtFlag); // perform projection aProjPS.Perform(aP); // if (aProjPS.NbPoints()) { // lower distance Standard_Real aDist = aProjPS.LowerDistance(); // lower distance parameters Standard_Real U, V; aProjPS.LowerDistanceParameters(U, V); // nearest point gp_Pnt aPProj = aProjPS.NearestPoint(); // translate projection point to face location aPProj.Transform(aLoc.Transformation()); // // print the projection values di << "proj dist = " << aDist << "\n"; di << "uvproj = " << U << " " << V << "\n"; di << "pproj = " << aPProj.X() << " " << aPProj.Y() << " " << aPProj.Z() << "\n"; } else { if (!aProjPS.IsDone()) { di << "projection failed\n"; } else { di << "no projection found\n"; } } return 0; } //======================================================================= //function : SurfaceCommands //purpose : //======================================================================= void BRepTest::SurfaceCommands(Draw_Interpretor& theCommands) { static Standard_Boolean done = Standard_False; if (done) return; done = Standard_True; DBRep::BasicCommands(theCommands); GeometryTest::SurfaceCommands(theCommands); const char* g = "Surface topology commands"; theCommands.Add("mkface", "mkface facename surfacename [ufirst ulast vfirst vlast] [wire [norient]]", __FILE__,mkface,g); theCommands.Add("mkshell", "mkshell shellname surfacename [ufirst ulast vfirst vlast] [segment 0/1]", __FILE__,mkface,g); theCommands.Add("quilt", "quilt compoundname shape1 edgeshape2 edgeshape1... shape2 edgeshape3 edgeshape1or2 ... shape3 ...", __FILE__,quilt,g); theCommands.Add("mksurface", "mksurface surfacename facename", __FILE__,mksurface,g); theCommands.Add("mkplane", "mkplane facename wirename [OnlyPlane 0/1]", __FILE__,mkplane,g); theCommands.Add("pcurve", "pcurve [name edgename] facename", __FILE__,pcurve,g); theCommands.Add("sewing", "sewing result [tolerance] shape1 shape2 ... [min tolerance] [max tolerance] [switches]", __FILE__,sewing, g); theCommands.Add("continuity", "continuity [tolerance] shape1 shape2 ...", __FILE__,continuity, g); theCommands.Add("encoderegularity", "encoderegularity shape [tolerance (in degree)]", __FILE__,encoderegularity, g); theCommands.Add ("fastsewing", "fastsewing result [-tol ] ", __FILE__, fastsewing, g); theCommands.Add ("getedgeregularity", "getedgeregularity edge face1 [face2]", __FILE__,getedgeregul,g); theCommands.Add ("projponf", "projponf face pnt [extrema flag: -min/-max/-minmax] [extrema algo: -g(grad)/-t(tree)]\n" "\t\tProject point on the face.", __FILE__, projponf, g); }