1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-21 10:13:43 +03:00
occt/src/BRepTest/BRepTest_FillingCommands.cxx
ski 9775fa6110 0026937: Eliminate NO_CXX_EXCEPTION macro support
Macro NO_CXX_EXCEPTION was removed from code.
Method Raise() was replaced by explicit throw statement.
Method Standard_Failure::Caught() was replaced by normal C++mechanism of exception transfer.
Method Standard_Failure::Caught() is deprecated now.
Eliminated empty constructors.
Updated samples.
Eliminate empty method ChangeValue from NCollection_Map class.
Removed not operable methods from NCollection classes.
2017-02-02 16:35:54 +03:00

742 lines
23 KiB
C++

// Created on: 1996-07-10
// Created by: Joelle CHAUVET
// Copyright (c) 1996-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.
// Modified: Wed Mar 5 09:45:42 1997
// by: Joelle CHAUVET
// G1134 : new command "approxplate"
// Modified: Thu Jun 12 16:51:36 1997
// by: Jerome LEMONIER
// Mise a jour suite a la modification des methodes Curves2d
// et Sense GeomPlate_BuildPlateSurface.
// Modified: Mon Nov 3 10:24:07 1997
// utilisation de BRepFill_CurveConstraint
#include <GeometryTest.hxx>
#include <Draw_Interpretor.hxx>
#include <Draw_Appli.hxx>
#include <DrawTrSurf.hxx>
#include <TopAbs_ShapeEnum.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS_Face.hxx>
#include <TopExp_Explorer.hxx>
#include <TopExp.hxx>
#include <BRepAdaptor_HSurface.hxx>
#include <BRepAdaptor_HCurve2d.hxx>
#include <BRepAdaptor_HCurve.hxx>
#include <BRepAdaptor_Surface.hxx>
#include <BRepAdaptor_Curve2d.hxx>
#include <BRepAdaptor_Curve.hxx>
#include <BRepTest.hxx>
#include <DBRep.hxx>
#include <Adaptor3d_HCurveOnSurface.hxx>
#include <Adaptor3d_CurveOnSurface.hxx>
#include <TColStd_HArray1OfInteger.hxx>
#include <BRep_Tool.hxx>
#include <BRepLib.hxx>
#include <BRep_Builder.hxx>
#include <GeomPlate_BuildPlateSurface.hxx>
#include <GeomPlate_BuildAveragePlane.hxx>
#include <GeomPlate_Surface.hxx>
#include <GeomPlate_BuildAveragePlane.hxx>
#include <GeomPlate_HArray1OfHCurve.hxx>
#include <GeomPlate_MakeApprox.hxx>
#include <GeomPlate_PlateG0Criterion.hxx>
#include <GeomPlate_PlateG1Criterion.hxx>
#include <BRepFill_CurveConstraint.hxx>
#include <GeomPlate_PointConstraint.hxx>
#include <GeomAdaptor_HSurface.hxx>
#include <Geom_Surface.hxx>
#include <TopoDS_Wire.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <BRepBuilderAPI_MakeWire.hxx>
#include <BRepBuilderAPI_WireError.hxx>
#include <BRepBuilderAPI_MakeFace.hxx>
#include <TColGeom2d_HArray1OfCurve.hxx>
#include <AdvApp2Var_ApproxAFunc2Var.hxx>
#include <AdvApp2Var_Context.hxx>
#include <AdvApprox_PrefCutting.hxx>
#include <AdvApprox_Cutting.hxx>
#include <AdvApprox_DichoCutting.hxx>
#include <Geom_BSplineSurface.hxx>
#include <TColStd_HArray1OfReal.hxx>
#include <TColStd_HArray2OfReal.hxx>
#include <TColgp_SequenceOfXY.hxx>
#include <TColgp_SequenceOfXYZ.hxx>
#include <BRepAdaptor_HCurve.hxx>
#include <Adaptor3d_HIsoCurve.hxx>
#include <Extrema_ExtPS.hxx>
#include <Extrema_POnSurf.hxx>
#include <Geom_Plane.hxx>
#include <BRepOffsetAPI_MakeFilling.hxx>
#include <TCollection_AsciiString.hxx>
#include <Geom2d_TrimmedCurve.hxx>
#include <GeomConvert_ApproxSurface.hxx>
#include <stdio.h>
#include <gp_Pnt.hxx>
// pour mes tests
#ifdef OCCT_DEBUG
#include <OSD_Chronometer.hxx>
#include <Geom_Line.hxx>
#endif
const Standard_Integer defDegree = 3;
const Standard_Integer defNbPtsOnCur = 10;
const Standard_Integer defNbIter = 3;
const Standard_Boolean defAnisotropie = Standard_False;
const Standard_Real defTol2d = 0.00001;
const Standard_Real defTol3d = 0.0001;
const Standard_Real defTolAng = 0.01;
const Standard_Real defTolCurv = 0.1;
const Standard_Integer defMaxDeg = 8;
const Standard_Integer defMaxSegments = 9;
Standard_Integer Degree = defDegree;
Standard_Integer NbPtsOnCur = defNbPtsOnCur ;
Standard_Integer NbIter = defNbIter;
Standard_Boolean Anisotropie = defAnisotropie ;
Standard_Real Tol2d = defTol2d;
Standard_Real Tol3d = defTol3d;
Standard_Real TolAng = defTolAng;
Standard_Real TolCurv = defTolCurv;
Standard_Integer MaxDeg = defMaxDeg;
Standard_Integer MaxSegments = defMaxSegments;
////////////////////////////////////////////////////////////////////////////////
// commande plate : resultat face sur surface plate
////////////////////////////////////////////////////////////////////////////////
static Standard_Integer plate (Draw_Interpretor & di,Standard_Integer n,const char** a)
{
if (n < 8 ) return 1;
Standard_Integer NbCurFront=Draw::Atoi(a[3]);
Handle(GeomPlate_HArray1OfHCurve) Fronts = new GeomPlate_HArray1OfHCurve(1,NbCurFront);
Handle(TColStd_HArray1OfInteger) Tang = new TColStd_HArray1OfInteger(1,NbCurFront);
Handle(TColStd_HArray1OfInteger) NbPtsCur = new TColStd_HArray1OfInteger(1,NbCurFront);
BRep_Builder B;
GeomPlate_BuildPlateSurface Henri(3,15,2);
Standard_Integer i;
for (i=1; i<=NbCurFront ; i++) {
TopoDS_Shape aLocalEdge(DBRep::Get(a[3*i+1],TopAbs_EDGE));
TopoDS_Edge E = TopoDS::Edge(aLocalEdge);
// TopoDS_Edge E = TopoDS::Edge(DBRep::Get(a[3*i+1],TopAbs_EDGE));
if(E.IsNull()) return 1;
TopoDS_Shape aLocalFace(DBRep::Get(a[3*i+2],TopAbs_FACE));
TopoDS_Face F = TopoDS::Face(aLocalFace);
// TopoDS_Face F = TopoDS::Face(DBRep::Get(a[3*i+2],TopAbs_FACE));
if(F.IsNull()) return 1;
Standard_Integer T = Draw::Atoi(a[3*i+3]);
Tang->SetValue(i,T);
NbPtsCur->SetValue(i,Draw::Atoi(a[2]));
Handle(BRepAdaptor_HSurface) S = new BRepAdaptor_HSurface();
S->ChangeSurface().Initialize(F);
Handle(BRepAdaptor_HCurve2d) C = new BRepAdaptor_HCurve2d();
C->ChangeCurve2d().Initialize(E,F);
Adaptor3d_CurveOnSurface ConS(C,S);
Handle (Adaptor3d_HCurveOnSurface) HConS = new Adaptor3d_HCurveOnSurface(ConS);
Fronts->SetValue(i,HConS);
Handle(GeomPlate_CurveConstraint) Cont
= new BRepFill_CurveConstraint(HConS,
Tang->Value(i),
NbPtsCur->Value(i));
Henri.Add(Cont);
}
Henri.Perform();
Standard_Real ErrG0 = 1.1*Henri.G0Error();
//cout<<" dist. max = "<<Henri.G0Error()<<" ; angle max = "<<Henri.G1Error()<<endl;
di<<" dist. max = "<<Henri.G0Error()<<" ; angle max = "<<Henri.G1Error()<<"\n";
BRepBuilderAPI_MakeWire MW;
for (i=1 ; i<=NbCurFront ; i++) {
Standard_Integer iInOrder=Henri.Order()->Value(i);
TopoDS_Edge E;
if (Henri.Sense()->Value(iInOrder)==1) {
BRepBuilderAPI_MakeEdge ME(Henri.Curves2d()->Value(iInOrder),
Henri.Surface(),
Fronts->Value(iInOrder)->LastParameter(),
Fronts->Value(iInOrder)->FirstParameter());
E = ME.Edge();
}
else {
BRepBuilderAPI_MakeEdge ME(Henri.Curves2d()->Value(iInOrder),
Henri.Surface(),
Fronts->Value(iInOrder)->FirstParameter(),
Fronts->Value(iInOrder)->LastParameter());
E = ME.Edge();
}
B.UpdateVertex(TopExp::FirstVertex(E), ErrG0);
B.UpdateVertex(TopExp::LastVertex(E), ErrG0);
BRepLib::BuildCurve3d(E);
char name[100];
Sprintf(name,"Edge_%d", i);
DBRep::Set(name, E);
MW.Add(E);
if (MW.IsDone()==Standard_False) {
throw Standard_Failure("mkWire is over ");
}
}
TopoDS_Wire W;
W=MW.Wire();
if (!(W.Closed())) throw Standard_Failure("Wire is not closed");
BRepBuilderAPI_MakeFace MF(Henri.Surface(),W,Standard_True);
DBRep::Set(a[1],MF.Face());
return 0;
}
////////////////////////////////////////////////////////////////////////////////
// commande gplate : resultat face egale a la surface approchee
////////////////////////////////////////////////////////////////////////////////
static Standard_Integer gplate (Draw_Interpretor & ,Standard_Integer n,const char** a)
{
if (n < 6 ) return 1;
Standard_Integer NbCurFront=Draw::Atoi(a[2]),
NbPointConstraint=Draw::Atoi(a[3]);
GeomPlate_BuildPlateSurface Henri(3,15,2);
Standard_Integer i;
Standard_Integer Conti;
Standard_Integer Indice=4;
//Surface d'init
TopoDS_Shape aLocalFace(DBRep::Get(a[Indice++],TopAbs_FACE));
TopoDS_Face SI = TopoDS::Face(aLocalFace);
// TopoDS_Face SI = TopoDS::Face(DBRep::Get(a[Indice++],TopAbs_FACE));
if(SI.IsNull())
Indice--;
else
{ Handle(BRepAdaptor_HSurface) HSI = new BRepAdaptor_HSurface();
HSI->ChangeSurface().Initialize(SI);
Henri.LoadInitSurface( BRep_Tool::Surface(HSI->ChangeSurface().Face()));
}
for (i=1; i<=NbCurFront ; i++) {
TopoDS_Shape aLocalShape(DBRep::Get(a[Indice++],TopAbs_EDGE));
TopoDS_Edge E = TopoDS::Edge(aLocalShape);
// TopoDS_Edge E = TopoDS::Edge(DBRep::Get(a[Indice++],TopAbs_EDGE));
if(E.IsNull()) return 1;
Conti=Draw::Atoi(a[Indice++]);
if ((Conti==0)||(Conti==-1))
{ Handle(BRepAdaptor_HCurve) C = new BRepAdaptor_HCurve();
C->ChangeCurve().Initialize(E);
const Handle(Adaptor3d_HCurve)& aC = C; // to avoid ambiguity
Handle(GeomPlate_CurveConstraint) Cont= new BRepFill_CurveConstraint(aC,Conti);
Henri.Add(Cont);
}
else
{
aLocalFace = DBRep::Get(a[Indice++],TopAbs_FACE);
TopoDS_Face F = TopoDS::Face(aLocalFace);
// TopoDS_Face F = TopoDS::Face(DBRep::Get(a[Indice++],TopAbs_FACE));
if(F.IsNull())
return 1;
Handle(BRepAdaptor_HSurface) S = new BRepAdaptor_HSurface();
S->ChangeSurface().Initialize(F);
Handle(BRepAdaptor_HCurve2d) C = new BRepAdaptor_HCurve2d();
C->ChangeCurve2d().Initialize(E,F);
Adaptor3d_CurveOnSurface ConS(C,S);
Handle (Adaptor3d_HCurveOnSurface) HConS = new Adaptor3d_HCurveOnSurface(ConS);
Handle(GeomPlate_CurveConstraint) Cont= new BRepFill_CurveConstraint(HConS,Conti);
Henri.Add(Cont);
}
}
for (i=1; i<=NbPointConstraint ; i++)
{
// gp_Pnt P1,P2,P3;
gp_Pnt P1;
// gp_Vec V1,V2,V3,V4,V5;
if (DrawTrSurf::GetPoint(a[Indice], P1) )
{ Conti=0;
Handle(GeomPlate_PointConstraint) PCont= new GeomPlate_PointConstraint(P1,0);
Henri.Add(PCont);
Indice++;
}
else
{ Standard_Real u=Draw::Atof(a[Indice++]),
v=Draw::Atof(a[Indice++]);
Conti=Draw::Atoi(a[Indice++]);
aLocalFace = DBRep::Get(a[Indice++],TopAbs_FACE);
TopoDS_Face F = TopoDS::Face(aLocalFace);
// TopoDS_Face F = TopoDS::Face(DBRep::Get(a[Indice++],TopAbs_FACE));
if(F.IsNull())
return 1;
Handle(BRepAdaptor_HSurface) HF = new BRepAdaptor_HSurface();
HF->ChangeSurface().Initialize(F);
Handle(GeomPlate_PointConstraint) PCont= new GeomPlate_PointConstraint(u,v,BRep_Tool::Surface(HF->ChangeSurface().Face()),Conti,0.001,0.001,0.001);
Henri.Add(PCont);
}
}
Henri.Perform();
Standard_Integer nbcarreau=9;
Standard_Integer degmax=8;
Standard_Real seuil;
Handle(GeomPlate_Surface) gpPlate = Henri.Surface();
TColgp_SequenceOfXY S2d;
TColgp_SequenceOfXYZ S3d;
S2d.Clear();
S3d.Clear();
Henri.Disc2dContour(4,S2d);
Henri.Disc3dContour(4,0,S3d);
seuil = Max(0.0001,10*Henri.G0Error());
GeomPlate_PlateG0Criterion critere (S2d,S3d,seuil);
GeomPlate_MakeApprox Mapp(gpPlate,critere,0.0001,nbcarreau,degmax);
Handle (Geom_Surface) Surf (Mapp.Surface());
Standard_Real Umin, Umax, Vmin, Vmax;
Henri.Surface()->Bounds( Umin, Umax, Vmin, Vmax);
BRepBuilderAPI_MakeFace MF(Surf, Umin, Umax, Vmin, Vmax, Precision::Confusion());
DBRep::Set(a[1],MF.Face());
return 0;
}
////////////////////////////////////////////////////////////////////////////////
// commande approxplate : resultat face sur surface approchee
////////////////////////////////////////////////////////////////////////////////
static Standard_Integer approxplate (Draw_Interpretor & di,Standard_Integer n,const char** a)
{
if (n < 9 ) return 1;
Standard_Integer NbMedium=Draw::Atoi(a[2]);
Standard_Integer NbCurFront=Draw::Atoi(a[3]);
Handle(GeomPlate_HArray1OfHCurve) Fronts = new GeomPlate_HArray1OfHCurve(1,NbCurFront);
Handle(TColStd_HArray1OfInteger) Tang = new TColStd_HArray1OfInteger(1,NbCurFront);
Handle(TColStd_HArray1OfInteger) NbPtsCur = new TColStd_HArray1OfInteger(1,NbCurFront);
GeomPlate_BuildPlateSurface Henri(3,15,2);
Standard_Integer i;
for (i=1; i<=NbCurFront ; i++) {
TopoDS_Shape aLocalShape(DBRep::Get(a[3*i+1],TopAbs_EDGE));
TopoDS_Edge E = TopoDS::Edge(aLocalShape);
// TopoDS_Edge E = TopoDS::Edge(DBRep::Get(a[3*i+1],TopAbs_EDGE));
if(E.IsNull()) return 1;
TopoDS_Shape aLocalFace(DBRep::Get(a[3*i+2],TopAbs_FACE));
TopoDS_Face F = TopoDS::Face(aLocalFace);
// TopoDS_Face F = TopoDS::Face(DBRep::Get(a[3*i+2],TopAbs_FACE));
if(F.IsNull()) return 1;
Standard_Integer T = Draw::Atoi(a[3*i+3]);
Tang->SetValue(i,T);
NbPtsCur->SetValue(i,NbMedium);
Handle(BRepAdaptor_HSurface) S = new BRepAdaptor_HSurface();
S->ChangeSurface().Initialize(F);
Handle(BRepAdaptor_HCurve2d) C = new BRepAdaptor_HCurve2d();
C->ChangeCurve2d().Initialize(E,F);
Adaptor3d_CurveOnSurface ConS(C,S);
Handle (Adaptor3d_HCurveOnSurface) HConS = new Adaptor3d_HCurveOnSurface(ConS);
Fronts->SetValue(i,HConS);
Handle(GeomPlate_CurveConstraint) Cont
= new BRepFill_CurveConstraint(HConS,
Tang->Value(i),
NbPtsCur->Value(i));
Henri.Add(Cont);
}
Henri.Perform();
Standard_Real dmax = Henri.G0Error(),
anmax = Henri.G1Error();
//cout<<" dist. max = "<<dmax<<" ; angle max = "<<anmax<<endl;
di<<" dist. max = "<<dmax<<" ; angle max = "<<anmax<<"\n";
Tol3d = Draw::Atof(a[3*NbCurFront+4]);
Standard_Integer Nbmax = Draw::Atoi(a[3*NbCurFront+5]);
Standard_Integer degmax = Draw::Atoi(a[3*NbCurFront+6]);
Standard_Integer CritOrder = Draw::Atoi(a[3*NbCurFront+7]);
Handle(GeomPlate_Surface) surf = Henri.Surface();
Handle(Geom_BSplineSurface) support;
if (CritOrder==-1) {
GeomPlate_MakeApprox MApp(surf,Tol3d,Nbmax,degmax,dmax,-1);
support = MApp.Surface();
}
else if (CritOrder>=0) {
TColgp_SequenceOfXY S2d;
TColgp_SequenceOfXYZ S3d;
S2d.Clear();
S3d.Clear();
Standard_Real seuil;
if (CritOrder==0) {
Henri.Disc2dContour(4,S2d);
Henri.Disc3dContour(4,0,S3d);
seuil = Max(Tol3d,dmax*10);
GeomPlate_PlateG0Criterion Crit0(S2d,S3d,seuil);
GeomPlate_MakeApprox MApp(surf,Crit0,Tol3d,Nbmax,degmax);
support = MApp.Surface();
}
else if (CritOrder==1) {
Henri.Disc2dContour(4,S2d);
Henri.Disc3dContour(4,1,S3d);
seuil = Max(Tol3d,anmax*10);
GeomPlate_PlateG1Criterion Crit1(S2d,S3d,seuil);
GeomPlate_MakeApprox MApp(surf,Crit1,Tol3d,Nbmax,degmax);
support = MApp.Surface();
}
}
BRepBuilderAPI_MakeWire MW;
BRep_Builder B;
for (i=1 ; i<=NbCurFront ; i++) {
Standard_Integer iInOrder=Henri.Order()->Value(i);
TopoDS_Edge E;
if (Henri.Sense()->Value(iInOrder)==1) {
BRepBuilderAPI_MakeEdge ME(Henri.Curves2d()->Value(iInOrder),
support,
Fronts->Value(iInOrder)->LastParameter(),
Fronts->Value(iInOrder)->FirstParameter());
E = ME.Edge();
}
else {
BRepBuilderAPI_MakeEdge ME(Henri.Curves2d()->Value(iInOrder),
support,
Fronts->Value(iInOrder)->FirstParameter(),
Fronts->Value(iInOrder)->LastParameter());
E = ME.Edge();
}
B.UpdateVertex(TopExp::FirstVertex(E), dmax);
B.UpdateVertex(TopExp::LastVertex(E), dmax);
BRepLib::BuildCurve3d(E);
MW.Add(E);
if (MW.IsDone()==Standard_False) {
throw Standard_Failure("mkWire is over ");
}
}
TopoDS_Wire W;
W=MW.Wire();
if (!(W.Closed())) throw Standard_Failure("Wire is not closed");
BRepBuilderAPI_MakeFace MF(support,W,Standard_True);
DBRep::Set(a[1],MF.Face());
return 0;
}
static Standard_Integer filling( Draw_Interpretor & di, Standard_Integer n, const char** a )
{
#ifdef OCCT_DEBUG
// Chronmetrage
OSD_Chronometer Chrono;
Chrono.Reset();
Chrono.Start();
#endif
if (n < 7) return 1;
Standard_Integer NbBounds = Draw::Atoi( a[2] );
Standard_Integer NbConstraints = Draw::Atoi( a[3] );
Standard_Integer NbPoints = Draw::Atoi( a[4] );
BRepOffsetAPI_MakeFilling MakeFilling( Degree,
NbPtsOnCur,
NbIter,
Anisotropie,
Tol2d,
Tol3d,
TolAng,
TolCurv,
MaxDeg,
MaxSegments );
//TopoDS_Shape aLocalFace(DBRep::Get( a[5], TopAbs_FACE ) );
//TopoDS_Face InitFace = TopoDS::Face( aLocalFace);
TopoDS_Face InitFace = TopoDS::Face( DBRep::Get(a[5], TopAbs_FACE) );
if (! InitFace.IsNull())
MakeFilling.LoadInitSurface( InitFace );
Standard_Integer i = (InitFace.IsNull())? 5 : 6, k;
TopoDS_Edge E;
TopoDS_Face F;
gp_Pnt Point;
Standard_Integer Order;
for (k = 1; k <= NbBounds; k++)
{
E.Nullify();
F.Nullify();
//TopoDS_Shape aLocalEdge(DBRep::Get( a[i], TopAbs_EDGE ));
//E = TopoDS::Edge(aLocalEdge);
E = TopoDS::Edge( DBRep::Get(a[i], TopAbs_EDGE) );
if (! E.IsNull())
i++;
//aLocalFace = DBRep::Get( a[i], TopAbs_FACE ) ;
//F = TopoDS::Face(aLocalFace);
F = TopoDS::Face( DBRep::Get(a[i], TopAbs_FACE) );
if (! F.IsNull())
i++;
Order = Draw::Atoi( a[i++] );
if (! E.IsNull() && ! F.IsNull())
MakeFilling.Add( E, F, (GeomAbs_Shape)Order );
else if (E.IsNull())
{
if (F.IsNull())
{
//cout<<endl<<"Wrong parameters"<<endl<<endl;
di<<"\nWrong parameters\n\n";
return 1;
}
else
MakeFilling.Add( F, (GeomAbs_Shape)Order );
}
else
MakeFilling.Add( E, (GeomAbs_Shape)Order );
}
for (k = 1; k <= NbConstraints; k++)
{
E.Nullify();
F.Nullify();
//TopoDS_Shape aLocalEdge(DBRep::Get( a[i++], TopAbs_EDGE ));
//E = TopoDS::Edge( aLocalEdge);
E = TopoDS::Edge( DBRep::Get(a[i++], TopAbs_EDGE) );
if (E.IsNull())
{
//cout<<"Wrong parameters"<<endl;
di<<"Wrong parameters\n";
return 1;
}
//TopoDS_Shape alocalFace(DBRep::Get( a[i], TopAbs_FACE ) );
//F = TopoDS::Face( alocalFace);
F = TopoDS::Face( DBRep::Get(a[i], TopAbs_FACE) );
if (! F.IsNull())
i++;
Order = Draw::Atoi( a[i++] );
if (F.IsNull())
MakeFilling.Add( E, (GeomAbs_Shape)Order, Standard_False );
else
MakeFilling.Add( E, F, (GeomAbs_Shape)Order, Standard_False );
}
for (k = 1; k <= NbPoints; k++)
{
if (DrawTrSurf::GetPoint( a[i], Point ))
{
MakeFilling.Add( Point );
i++;
}
else
{
Standard_Real U = Draw::Atof( a[i++] ), V = Draw::Atof( a[i++] );
//aLocalFace = DBRep::Get( a[i++], TopAbs_FACE );
//F = TopoDS::Face( aLocalFace);
F = TopoDS::Face( DBRep::Get(a[i++], TopAbs_FACE));
if (F.IsNull())
{
//cout<<"Wrong parameters"<<endl;
di<<"Wrong parameters\n";
return 1;
}
Order = Draw::Atoi( a[i++] );
MakeFilling.Add( U, V, F, (GeomAbs_Shape)Order );
}
}
MakeFilling.Build();
if (! MakeFilling.IsDone())
{
//cout<<"filling failed"<<endl;
di<<"filling failed\n";
return 0;
}
Standard_Real dmax = MakeFilling.G0Error(),
angmax = MakeFilling.G1Error(),
curvmax = MakeFilling.G2Error();
//cout<<" dist. max = "<<dmax<<" ; angle max = "<<angmax<<" ; diffcurv max = "<<curvmax<<endl;
di<<" dist. max = "<<dmax<<" ; angle max = "<<angmax<<" ; diffcurv max = "<<curvmax<<"\n";
TopoDS_Face ResFace= TopoDS::Face( MakeFilling.Shape() );
DBRep::Set( a[1], ResFace );
#ifdef OCCT_DEBUG
Chrono.Stop();
Standard_Real Tps;
Chrono.Show(Tps);
//cout<<"*** FIN DE FILLING ***"<<endl;
//cout<<"Temps de calcul : "<<Tps<<endl;
di<<"*** FIN DE FILLING ***\n";
di<<"Temps de calcul : "<<Tps<<"\n";
#endif
return 0;
}
static Standard_Integer fillingparam( Draw_Interpretor & di, Standard_Integer n, const char** a )
{
if ( n == 1) {
//cout << "fillingparam : options are" <<endl;
//cout << "-l : to list current values" << endl;
//cout << "-i : to set default values" << endl;
//cout << "-r deg nbPonC nbIt anis : to set filling options" <<endl;
//cout << "-c t2d t3d tang tcur : to set tolerances" << endl;
//cout << "-a maxdeg maxseg : Approximation option" << endl;
di << "fillingparam : options are" <<"\n";
di << "-l : to list current values\n";
di << "-i : to set default values" << "\n";
di << "-r deg nbPonC nbIt anis : to set filling options\n";
di << "-c t2d t3d tang tcur : to set tolerances\n";
di << "-a maxdeg maxseg : Approximation option\n";
}
else if (n > 1)
{
TCollection_AsciiString AS( a[1] );
AS.LowerCase();
const char* flag = AS.ToCString();
if (strcmp( flag, "-l" ) == 0 && n == 2)
{
//cout<<endl;
//cout<<"Degree = "<<Degree<<endl;
//cout<<"NbPtsOnCur = "<<NbPtsOnCur<<endl;
//cout<<"NbIter = "<<NbIter<<endl;
//cout<<"Anisotropie = "<<Anisotropie<<endl<<endl;
//
//cout<<"Tol2d = "<<Tol2d<<endl;
//cout<<"Tol3d = "<<Tol3d<<endl;
//cout<<"TolAng = "<<TolAng<<endl;
//cout<<"TolCurv = "<<TolCurv<<endl<<endl;
//
//cout<<"MaxDeg = "<<MaxDeg<<endl;
//cout<<"MaxSegments = "<<MaxSegments<<endl<<endl;
di<<"\n";
di<<"Degree = "<<Degree<<"\n";
di<<"NbPtsOnCur = "<<NbPtsOnCur<<"\n";
di<<"NbIter = "<<NbIter<<"\n";
di<<"Anisotropie = "<< (Standard_Integer) Anisotropie<<"\n\n";
di<<"Tol2d = "<<Tol2d<<"\n";
di<<"Tol3d = "<<Tol3d<<"\n";
di<<"TolAng = "<<TolAng<<"\n";
di<<"TolCurv = "<<TolCurv<<"\n\n";
di<<"MaxDeg = "<<MaxDeg<<"\n";
di<<"MaxSegments = "<<MaxSegments<<"\n\n";
}
else if (strcmp( flag, "-i" ) == 0 && n == 2)
{
Degree = defDegree;
NbPtsOnCur = defNbPtsOnCur;
NbIter = defNbIter;
Anisotropie = defAnisotropie;
Tol2d = defTol2d;
Tol3d = defTol3d;
TolAng = defTolAng;
TolCurv = defTolCurv;
MaxDeg = defMaxDeg;
MaxSegments = defMaxSegments;
}
else if (strcmp( flag, "-r" ) == 0 && n == 6)
{
Degree = Draw::Atoi( a[2] );
NbPtsOnCur = Draw::Atoi( a[3] );
NbIter = Draw::Atoi( a[4] );
Anisotropie = Draw::Atoi( a[5] ) != 0;
}
else if (strcmp( flag, "-c" ) == 0 && n == 6)
{
Tol2d = Draw::Atof( a[2] );
Tol3d = Draw::Atof( a[3] );
TolAng = Draw::Atof( a[4] );
TolCurv = Draw::Atof( a[5] );
}
else if (strcmp( flag, "-a" ) == 0 && n == 4)
{
MaxDeg = Draw::Atoi( a[2] );
MaxSegments = Draw::Atoi( a[3] );
}
else
{
//cout<<"Wrong parameters"<<endl;
di<<"Wrong parameters\n";
return 1;
}
}
return 0;
}
void BRepTest::FillingCommands(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 filling topology commands";
theCommands.Add("plate",
"plate result nbrpntoncurve nbrcurfront edge face tang (0:vif;1:tang) ...",
__FILE__,
plate,
g) ;
theCommands.Add("gplate",
"gplate result nbrcurfront nbrpntconst [SurfInit] [edge 0] [edge tang (1:G1;2:G2) surf]... [point] [u v tang (1:G1;2:G2) surf] ...",
__FILE__,
gplate,
g) ;
theCommands.Add("approxplate",
"approxplate result nbrpntoncurve nbrcurfront edge face tang (0:vif;1:tang) ... tol nmax degmax crit",
__FILE__,
approxplate,
g) ;
theCommands.Add("filling",
"filling result nbB nbC nbP [SurfInit] [edge][face]order... edge[face]order... point/u v face order...",
__FILE__,
filling,
g) ;
theCommands.Add("fillingparam",
"fillingparam : no arg give help",
__FILE__,
fillingparam,
g) ;
}