Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
858dd02feThis file is pinned to the selected release. Download the original to open it in your design tool.
// 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 <stdio.h>
#include <BRepTest.hxx>
#include <GeometryTest.hxx>
#include <DrawTrSurf.hxx>
#include <DBRep.hxx>
#include <Draw_Interpretor.hxx>
#include <Draw_Appli.hxx>
#include <BRepLib.hxx>
#include <BRepTools_Quilt.hxx>
#include <BRepAdaptor_Curve.hxx>
#include <BRepBuilderAPI_MakeFace.hxx>
#include <BRepBuilderAPI_MakeShell.hxx>
#include <BRepBuilderAPI_Sewing.hxx>
#include <BRepOffsetAPI_FindContigousEdges.hxx>
#include <TopExp_Explorer.hxx>
#include <TopoDS.hxx>
#include <TCollection_AsciiString.hxx>
#include <Geom_Surface.hxx>
#include <Geom2d_TrimmedCurve.hxx>
#include <TopTools_SequenceOfShape.hxx>
#include <Precision.hxx>
#include <Draw_ProgressIndicator.hxx>
#include <BRepBuilderAPI_FastSewing.hxx>
#include <GeomAPI_ProjectPointOnSurf.hxx>
#include <Message.hxx>
//-----------------------------------------------------------------------
// suppressarg : suppress a[d],modifie na--
//-----------------------------------------------------------------------
static void suppressarg(Standard_Integer& na, const char** a, const Standard_Integer d)
{
for (Standard_Integer i = d; i < na; i++)
{
a[i] = a[i + 1];
a[i + 1] = NULL;
}
na--;
}
//=======================================================================
// mkface
//=======================================================================
static Standard_Integer mkface(Draw_Interpretor&, Standard_Integer n, const char** a)
{
if (n < 3)
return 1;
Handle(Geom_Surface) S = DrawTrSurf::GetSurface(a[2]);
if (S.IsNull())
{
Message::SendFail() << a[2] << " is not a surface";
return 1;
}
Standard_Boolean mkface = a[0][2] == 'f';
TopoDS_Shape res;
Standard_Boolean Segment = Standard_False;
if (!mkface && (n == 4 || n == 8))
{
Segment = !strcmp(a[n - 1], "1");
n--;
}
if (n == 3)
{
if (mkface)
res = BRepBuilderAPI_MakeFace(S, Precision::Confusion());
else
res = BRepBuilderAPI_MakeShell(S, Segment);
}
else if (n <= 5)
{
if (!mkface)
return 1;
Standard_Boolean orient = (n == 4);
TopoDS_Shape W = DBRep::Get(a[3], TopAbs_WIRE);
if (W.IsNull())
return 1;
res = BRepBuilderAPI_MakeFace(S, TopoDS::Wire(W), orient);
}
else
{
if (mkface)
res = BRepBuilderAPI_MakeFace(S,
Draw::Atof(a[3]),
Draw::Atof(a[4]),
Draw::Atof(a[5]),
Draw::Atof(a[6]),
Precision::Confusion());
else
res = BRepBuilderAPI_MakeShell(S,
Draw::Atof(a[3]),
Draw::Atof(a[4]),
Draw::Atof(a[5]),
Draw::Atof(a[6]),
Segment);
}
DBRep::Set(a[1], res);
return 0;
}
//=======================================================================
// quilt
//=======================================================================
static Standard_Integer quilt(Draw_Interpretor&, Standard_Integer n, const char** a)
{
if (n < 4)
return 1;
BRepTools_Quilt Q;
Standard_Integer i = 2;
while (i < n)
{
TopoDS_Shape S = DBRep::Get(a[i]);
if (!S.IsNull())
{
if (S.ShapeType() == TopAbs_EDGE)
{
if (i + 1 < n)
{
TopoDS_Shape E = DBRep::Get(a[i + 1]);
if (!E.IsNull())
{
if (E.ShapeType() == TopAbs_EDGE)
{
i++;
Q.Bind(TopoDS::Edge(S), TopoDS::Edge(E));
}
}
}
}
if (S.ShapeType() == TopAbs_VERTEX)
{
if (i + 1 < n)
{
TopoDS_Shape E = DBRep::Get(a[i + 1]);
if (!E.IsNull())
{
if (E.ShapeType() == TopAbs_VERTEX)
{
i++;
Q.Bind(TopoDS::Vertex(S), TopoDS::Vertex(E));
}
}
}
}
else
{
Q.Add(S);
}
}
i++;
}
DBRep::Set(a[1], Q.Shells());
return 0;
}
//=======================================================================
// mksurface
//=======================================================================
static Standard_Integer mksurface(Draw_Interpretor&, Standard_Integer n, const char** a)
{
if (n < 3)
return 1;
TopoDS_Shape S = DBRep::Get(a[2], TopAbs_FACE);
if (S.IsNull())
return 1;
TopLoc_Location L;
Handle(Geom_Surface) C = BRep_Tool::Surface(TopoDS::Face(S), L);
DrawTrSurf::Set(a[1], C->Transformed(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; ia < n; ia++)
{
if (!strcasecmp(a[ia], "-mute"))
{
suppressarg(n, a, ia);
mute = Standard_True;
}
}
if (n == 2)
{
// pcurves of a face
TopoDS_Shape S = DBRep::Get(a[1], TopAbs_FACE);
if (S.IsNull())
return 1;
if (!mute)
DBRep_WriteColorOrientation();
Draw_Color col, savecol = DrawTrSurf_CurveColor(Draw_rouge);
char* name = new char[100];
Standard_Real f, l;
S.Orientation(TopAbs_FORWARD);
TopExp_Explorer ex(S, TopAbs_EDGE);
for (Standard_Integer i = 1; ex.More(); ex.Next(), i++)
{
const Handle(Geom2d_Curve) c =
BRep_Tool::CurveOnSurface(TopoDS::Edge(ex.Current()), TopoDS::Face(S), f, l);
if (c.IsNull())
{
std::cout << "Error: Edge " << i << " does not have pcurve" << std::endl;
continue;
}
col = DBRep_ColorOrientation(ex.Current().Orientation());
DrawTrSurf_CurveColor(col);
Sprintf(name, "%s_%d", a[1], i);
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();
}
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: +<parameter> "
"<value>\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: <symbol><parameter>\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->Start());
aSewing.Dump();
const TopoDS_Shape& aRes = aSewing.SewedShape();
if (!aRes.IsNull())
DBRep::Set(theArgv[1], aRes);
return 0;
}
//=================================================================================================
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 <value>] <list_of_faces>\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<Standard_Integer>(aStatus)) << ")\n";
aFS.GetStatuses(&std::cout);
}
aFS.Perform();
aStatus = aFS.GetStatuses();
if (aStatus)
{
theDI << "Error: There are some problems while performing ("
<< (static_cast<Standard_Integer>(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)
{
Message::SendFail()
<< "Invalid number of arguments. Should be: checkedgeregularity edge face1 [face2]";
return 1;
}
TopoDS_Shape anEdge = DBRep::Get(argv[1], TopAbs_EDGE);
TopoDS_Shape aFace1 = DBRep::Get(argv[2], TopAbs_FACE);
TopoDS_Shape aFace2 = (argc > 3 ? DBRep::Get(argv[3], TopAbs_FACE) : aFace1);
if (anEdge.IsNull() || aFace1.IsNull() || aFace2.IsNull())
{
Message::SendFail()
<< "Invalid number of arguments. Should be: getedgeregularity edge face1 [face2]";
return 1;
}
GeomAbs_Shape aRegularity =
BRep_Tool::Continuity(TopoDS::Edge(anEdge), TopoDS::Face(aFace1), TopoDS::Face(aFace2));
TCollection_AsciiString aStrReg("Regularity of edge : ");
switch (aRegularity)
{
default:
case GeomAbs_C0:
aStrReg += "C0";
break;
case GeomAbs_G1:
aStrReg += "G1";
break;
case GeomAbs_C1:
aStrReg += "C1";
break;
case GeomAbs_G2:
aStrReg += "G2";
break;
case GeomAbs_C2:
aStrReg += "C2";
break;
case GeomAbs_C3:
aStrReg += "C3";
break;
case GeomAbs_CN:
aStrReg += "CN";
break;
};
di << aStrReg.ToCString() << "\n";
return 0; // Done
}
//=================================================================================================
static Standard_Integer projponf(Draw_Interpretor& di, Standard_Integer n, const char** a)
{
if (n < 3 || n > 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;
}
//=================================================================================================
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 <value>] <list_of_faces>",
__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);
}