1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-06 18:26:22 +03:00
occt/src/Interface/Interface_CheckTool.cxx
abv 0ebe5b0a7f 0031501: Foundation Classes, Message_Printer - remove theToPutEndl argument -- preparation
Operators << for Handle(Message_Messenger) are removed; their use is replaced by use of Message_Messenger::StreamBuffer
Message_Messenger has been replaced by Standard_OStream within Interface_InterfaceModel,IFSelect,IGES,STEP dump interfaces.
2020-05-09 17:22:13 +03:00

502 lines
16 KiB
C++

// 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 <Interface_Check.hxx>
#include <Interface_CheckFailure.hxx>
#include <Interface_CheckIterator.hxx>
#include <Interface_CheckTool.hxx>
#include <Interface_EntityIterator.hxx>
#include <Interface_GeneralModule.hxx>
#include <Interface_Graph.hxx>
#include <Interface_GTool.hxx>
#include <Interface_HGraph.hxx>
#include <Interface_InterfaceModel.hxx>
#include <Interface_Macros.hxx>
#include <Interface_Protocol.hxx>
#include <Interface_ReportEntity.hxx>
#include <Interface_ShareTool.hxx>
#include <Standard_ErrorHandler.hxx>
#include <Standard_Failure.hxx>
#include <Standard_Transient.hxx>
#include <TCollection_HAsciiString.hxx>
#ifdef _WIN32
#include <OSD_Exception.hxx>
#else
#include <OSD_Signal.hxx>
#endif
#include <stdio.h>
static int errh = 1;
static void raisecheck (Standard_Failure& theException,Handle(Interface_Check)& ach)
{
char mess[100];
sprintf (mess,"** Exception Raised during Check : %s **",
theException.DynamicType()->Name());
ach->AddFail(mess);
#ifdef _WIN32
if (theException.IsKind(STANDARD_TYPE(OSD_Exception))) {
#else
if (theException.IsKind(STANDARD_TYPE(OSD_Signal))) {
#endif
theException.SetMessageString("System Signal received, check interrupt");
throw theException;
}
}
// thestat : evite a CheckSuccess de refaire un calcul prealablement fait :
// bit valeur 1 : Verify fait, valeur 4 : et ilya des erreurs
// bit valeur 2 : Analyse fait, valeur 8 : et ilya des erreurs
//=======================================================================
//function : Interface_CheckTool
//purpose :
//=======================================================================
Interface_CheckTool::Interface_CheckTool(const Handle(Interface_InterfaceModel)& model,
const Handle(Interface_Protocol)& protocol)
: thegtool ( new Interface_GTool(protocol,model->NbEntities()) ) ,
theshare (model,protocol)
{
thestat = 0;
}
//=======================================================================
//function : Interface_CheckTool
//purpose :
//=======================================================================
Interface_CheckTool::Interface_CheckTool(const Handle(Interface_InterfaceModel)& model)
: thegtool(model->GTool()) , theshare (model,model->GTool())
{
thestat = 0;
thegtool->Reservate(model->NbEntities());
}
//=======================================================================
//function : Interface_CheckTool
//purpose :
//=======================================================================
Interface_CheckTool::Interface_CheckTool(const Interface_Graph& graph)
: thegtool(graph.Model()->GTool()) , theshare (graph)
{
}
//=======================================================================
//function : Interface_CheckTool
//purpose :
//=======================================================================
Interface_CheckTool::Interface_CheckTool(const Handle(Interface_HGraph)& hgraph)
: thegtool(hgraph->Graph().Model()->GTool()) , theshare (hgraph)
{
}
//=======================================================================
//function : FillCheck
//purpose :
//=======================================================================
void Interface_CheckTool::FillCheck(const Handle(Standard_Transient)& ent,
const Interface_ShareTool& sh,
Handle(Interface_Check)& ach)
{
Handle(Interface_GeneralModule) module;
Standard_Integer CN;
if (thegtool->Select(ent,module,CN)) {
// Sans try/catch (fait par l appelant, evite try/catch en boucle)
if (!errh) {
module->CheckCase(CN,ent,sh,ach);
return;
}
// Avec try/catch
try {
OCC_CATCH_SIGNALS
module->CheckCase(CN,ent,sh,ach);
}
catch (Standard_Failure& anException) {
raisecheck(anException,ach);
}
}
else {
DeclareAndCast(Interface_ReportEntity,rep,ent);
if (rep.IsNull()) return;
ach = rep->Check();
}
if (theshare.Graph().HasShareErrors(ent))
ach->AddFail("** Shared Items unknown from the containing Model");
}
//=======================================================================
//function : Print
//purpose :
//=======================================================================
void Interface_CheckTool::Print(const Handle(Interface_Check)& ach,
Standard_OStream& S) const
{
Standard_Integer i, nb;
nb = ach->NbFails();
if (nb > 0) S << " Fail Messages : " << nb << " :\n";
for (i = 1; i <= nb; i ++) {
S << ach->Fail(i)->String() << "\n";
}
nb = ach->NbWarnings();
if (nb > 0) S << " Warning Messages : " << nb << " :\n";
for (i = 1; i <= nb; i ++) {
S << ach->Warning(i)->String() << "\n";
}
}
//=======================================================================
//function : Print
//purpose :
//=======================================================================
void Interface_CheckTool::Print(const Interface_CheckIterator& list,
Standard_OStream& S) const
{
Handle(Interface_InterfaceModel) model = theshare.Model();
list.Print(S,model,Standard_False);
}
// .... Check General sur un Modele ....
// Check : Une Entite d un Modele, designee par son rang
//=======================================================================
//function : Check
//purpose :
//=======================================================================
Handle(Interface_Check) Interface_CheckTool::Check(const Standard_Integer num)
{
Handle(Interface_InterfaceModel) model = theshare.Model();
Handle(Standard_Transient) ent = model->Value(num);
Handle(Interface_Check) ach = new Interface_Check(ent); // non filtre par "Warning" : tel quel
errh = 1;
FillCheck(ent,theshare,ach);
return ach;
}
// CheckSuccess : test passe-passe pas, sur CheckList(Fail) des Entites
//=======================================================================
//function : CheckSuccess
//purpose :
//=======================================================================
void Interface_CheckTool::CheckSuccess (const Standard_Boolean reset)
{
if (reset) thestat = 0;
if (thestat > 3) throw Interface_CheckFailure // deja teste avec erreur
("Interface Model : Global Check");
Handle(Interface_InterfaceModel) model = theshare.Model();
if (model->GlobalCheck()->NbFails() > 0) throw Interface_CheckFailure("Interface Model : Global Check");
Handle(Interface_Check) modchk = new Interface_Check;
model->VerifyCheck(modchk);
if (!model->Protocol().IsNull()) model->Protocol()->GlobalCheck (theshare.Graph(),modchk);
if (modchk->HasFailed()) throw Interface_CheckFailure("Interface Model : Verify Check");
if (thestat == 3) return; // tout teste et ca passe
errh = 0; // Pas de try/catch, car justement on raise
Standard_Integer nb = model->NbEntities();
for (Standard_Integer i = 1; i <= nb; i ++) {
if (model->IsErrorEntity(i)) throw Interface_CheckFailure("Interface Model : an Entity is recorded as Erroneous");
Handle(Standard_Transient) ent = model->Value(i);
if (thestat & 1) {
if (!model->IsErrorEntity(i)) continue; // deja verify, reste analyse
}
if (thestat & 2) {
if ( model->IsErrorEntity(i)) continue; // deja analyse, reste verify
}
Handle(Interface_Check) ach = new Interface_Check(ent);
FillCheck(ent,theshare,ach);
if (ach->HasFailed()) throw Interface_CheckFailure("Interface Model : Check on an Entity has Failed");
}
}
// CompleteCheckList : Tous Tests : GlobalCheck, Analyse-Verify en Fail ou en
// Warning; plus les Unknown Entities (par Check vide)
//=======================================================================
//function : CompleteCheckList
//purpose :
//=======================================================================
Interface_CheckIterator Interface_CheckTool::CompleteCheckList ()
{
thestat = 3;
Handle(Interface_InterfaceModel) model = theshare.Model();
Interface_CheckIterator res;
res.SetModel(model);
Handle(Interface_Check) globch = model->GlobalCheck(); // GlobalCheck Statique
if (!model->Protocol().IsNull()) model->Protocol()->GlobalCheck (theshare.Graph(),globch);
model->VerifyCheck(globch); // GlobalCheck Dynamique
if (globch->HasFailed() || globch->HasWarnings()) res.Add(globch,0);
if (globch->HasFailed()) thestat |= 12;
Standard_Integer i=0,n0 = 1, nb = model->NbEntities();
errh = 0;
while (n0 <= nb) {
Handle(Interface_Check) ach = new Interface_Check;
Handle(Standard_Transient) ent;
try {
OCC_CATCH_SIGNALS
for (i = n0; i <= nb; i ++) {
ach->Clear();
ent = model->Value(i);
ach->SetEntity(ent);
if (model->IsReportEntity(i)) {
ach = model->ReportEntity(i)->Check(); // INCLUT Unknown
if (ach->HasFailed()) // FAIL : pas de Check semantique
{ res.Add(ach,i); ach = new Interface_Check; thestat |= 12; continue; }
}
if (!model->HasSemanticChecks()) FillCheck(ent,theshare,ach);
else ach->GetMessages (model->Check (i,Standard_False));
if (ach->HasFailed() || ach->HasWarnings())
{ res.Add(ach,i); ach = new Interface_Check; if (ach->HasFailed()) thestat |= 12; }
}
n0 = nb+1;
}
catch(Standard_Failure& anException) {
n0 = i+1;
raisecheck(anException,ach);
res.Add(ach,i); thestat |= 12;
}
}
return res;
}
// CheckList : Check Fail sur Entites, en Analyse (Read time) ou Verify
//=======================================================================
//function : CheckList
//purpose :
//=======================================================================
Interface_CheckIterator Interface_CheckTool::CheckList ()
{
thestat = 3;
Handle(Interface_InterfaceModel) model = theshare.Model();
Interface_CheckIterator res;
res.SetModel(model);
Standard_Integer i=0, n0 = 1, nb = model->NbEntities();
Handle(Interface_Check) globch = model->GlobalCheck();
if (!model->Protocol().IsNull()) model->Protocol()->GlobalCheck (theshare.Graph(),globch);
model->VerifyCheck(globch);
if (globch->HasFailed()) { thestat |= 12; res.Add(globch,0); }
errh = 0;
while (n0 <= nb) {
Handle(Interface_Check) ach = new Interface_Check;
Handle(Standard_Transient) ent;
try {
OCC_CATCH_SIGNALS
for (i = n0; i <= nb; i ++) {
if (model->IsReportEntity(i)) {
ach = model->ReportEntity(i)->Check();
if (ach->HasFailed()) { thestat |= 12; res.Add(ach,i); }
}
else {
ent = model->Value(i);
ach->Clear();
ach->SetEntity(ent);
if (!model->HasSemanticChecks()) FillCheck(ent,theshare,ach);
else ach = model->Check (i,Standard_False);
if (ach->HasFailed()) { thestat |= 12; res.Add(ach,i); }
}
}
n0 = nb+1;
}
catch(Standard_Failure& anException) {
n0 = i+1;
raisecheck(anException,ach);
res.Add(ach,i); thestat |= 12;
}
}
return res;
}
// AnalyseCheckList : Fail au chargement des Entites (Read time)
//=======================================================================
//function : AnalyseCheckList
//purpose :
//=======================================================================
Interface_CheckIterator Interface_CheckTool::AnalyseCheckList ()
{
thestat = 2;
Handle(Interface_InterfaceModel) model = theshare.Model();
Interface_CheckIterator res;
res.SetModel(model);
Standard_Integer i=0, n0 = 1, nb = model->NbEntities();
errh = 0;
while (n0 <= nb) {
Handle(Interface_Check) ach = new Interface_Check;
try {
OCC_CATCH_SIGNALS
for (i = n0; i <= nb; i ++) {
if (!model->IsReportEntity(i)) continue;
Handle(Interface_ReportEntity) rep = model->ReportEntity(i);
ach = rep->Check();
if (ach->HasFailed() || ach->HasWarnings())
{ thestat |= 8; res.Add(ach,i); }
}
n0 = nb+1;
}
catch(Standard_Failure& anException) {
n0 = i+1;
raisecheck(anException,ach);
res.Add(ach,i); thestat |= 8;
}
}
return res;
}
// VerifyCheckList : Fail/Warning sur Analyse (Entites chargees OK. Valides ?)
//=======================================================================
//function : VerifyCheckList
//purpose :
//=======================================================================
Interface_CheckIterator Interface_CheckTool::VerifyCheckList ()
{
thestat = 1;
Handle(Interface_InterfaceModel) model = theshare.Model();
Interface_CheckIterator res;
res.SetModel(model);
Standard_Integer i=0, n0 = 1, nb = model->NbEntities();
errh = 0;
while (n0 <= nb) {
Handle(Standard_Transient) ent;
Handle(Interface_Check) ach = new Interface_Check;
try {
OCC_CATCH_SIGNALS
for (i = n0; i <= nb; i ++) {
if (model->IsErrorEntity(i)) continue;
ent = model->Value(i);
ach->Clear();
ach->SetEntity(ent);
if (!model->HasSemanticChecks()) FillCheck(ent,theshare,ach);
else ach = model->Check (i,Standard_False);
if (ach->HasFailed() || ach->HasWarnings())
{ thestat |= 4; res.Add(ach,i); }
}
n0 = nb+1;
}
catch(Standard_Failure& anException) {
n0 = i+1;
raisecheck(anException,ach);
res.Add(ach,i); thestat |= 4;
}
}
return res;
}
// Warnings sur Entites (Read time ou apres)
//=======================================================================
//function : WarningCheckList
//purpose :
//=======================================================================
Interface_CheckIterator Interface_CheckTool::WarningCheckList ()
{
thestat = 3;
Handle(Interface_InterfaceModel) model = theshare.Model();
Interface_CheckIterator res;
res.SetModel(model);
Standard_Integer i=0, n0 = 1, nb = model->NbEntities();
errh = 0;
while (n0 <= nb) {
Handle(Interface_Check) ach = new Interface_Check;
Handle(Standard_Transient) ent;
try {
OCC_CATCH_SIGNALS
for (i = n0; i <= nb; i ++) {
ach->Clear();
ach->SetEntity (ent);
if (model->IsReportEntity(i)) {
Handle(Interface_ReportEntity) rep = model->ReportEntity(i);
if (rep->IsError()) { thestat |= 12; continue; }
ach = rep->Check();
}
ent = model->Value(i);
if (!model->HasSemanticChecks()) FillCheck(ent,theshare,ach);
else ach = model->Check (i,Standard_False);
if (ach->HasFailed()) thestat |= 12;
else if (ach->HasWarnings()) res.Add(ach,i);
}
n0 = nb+1;
}
catch(Standard_Failure& anException) {
n0 = i+1;
raisecheck(anException,ach);
res.Add(ach,i); thestat |= 12;
}
}
return res;
}
//=======================================================================
//function : UnknownEntities
//purpose :
//=======================================================================
Interface_EntityIterator Interface_CheckTool::UnknownEntities ()
{
Handle(Interface_InterfaceModel) model = theshare.Model();
Interface_EntityIterator res;
Standard_Integer nb = model->NbEntities();
for (Standard_Integer i = 1; i <= nb; i ++) {
if (model->IsUnknownEntity(i)) res.GetOneItem(model->Value(i));
}
return res;
}