1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-21 10:13:43 +03:00
occt/src/Interface/Interface_STAT.cxx
kgv 41d16f029b 0026547: Configuration - fix compilation errors on VS2015
Interface_STAT.cxx - rename local variable 'stat' to 'myStat' to avoid name collision.
OSD_FileNode.cxx - pass correct argument to va_start().
STEPConstruct_AP203Context::DefaultDateAndTime() - use _get_timezone() instead of global variable timezone on msvc.
Graphic3d_ArrayOfPrimitives::VertexColor() - fix reinterpret_cast() argument.

Small correction: OCC26481-linesarc.brep is equal to bug26296_linesarc.brep
2015-09-02 14:39:10 +03:00

239 lines
8.4 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_STAT.ixx>
#include <TCollection_AsciiString.hxx>
static Interface_STAT statvoid("");
static Interface_STAT statact ("");
static Standard_CString voidname = "";
Interface_STAT::Interface_STAT (const Standard_CString title)
{
thetitle = new TCollection_HAsciiString(title);
thetotal = 1.;
}
Interface_STAT::Interface_STAT (const Interface_STAT& other)
{ other.Internals (thetitle,thetotal, thephnam,thephw, thephdeb,thephfin, thestw); }
void Interface_STAT::Internals
(Handle(TCollection_HAsciiString)& tit, Standard_Real& total,
Handle(TColStd_HSequenceOfAsciiString)& phn,
Handle(TColStd_HSequenceOfReal)& phw,
Handle(TColStd_HSequenceOfInteger)& phdeb,
Handle(TColStd_HSequenceOfInteger)& phfin,
Handle(TColStd_HSequenceOfReal)& stw) const
{
tit = thetitle; total = thetotal; phn = thephnam; phw = thephw;
phdeb = thephdeb; phfin = thephfin; stw = thestw;
}
void Interface_STAT::AddPhase
(const Standard_Real weight, const Standard_CString name)
{
if (thephw.IsNull()) {
// 1re fois : vider les steps deja notees
thetotal = 0.;
thephnam = new TColStd_HSequenceOfAsciiString();
thephw = new TColStd_HSequenceOfReal();
thephdeb = new TColStd_HSequenceOfInteger();
thephfin = new TColStd_HSequenceOfInteger();
thestw = new TColStd_HSequenceOfReal();
}
thetotal += weight;
thephnam->Append (TCollection_AsciiString (name));
thephw->Append (weight);
thephdeb->Append (thestw->Length()+1);
thephfin->Append (0);
thestw->Append (0.);
}
void Interface_STAT::AddStep (const Standard_Real weight)
{
if (thephdeb.IsNull()) {
// 1re fois : pour default phase, au moins creer receptacle des steps
thephdeb = new TColStd_HSequenceOfInteger();
thephfin = new TColStd_HSequenceOfInteger();
thestw = new TColStd_HSequenceOfReal();
thephdeb->Append (thestw->Length()+1);
thephfin->Append (1);
thestw->Append (0.);
}
// A present, ajouter cette etape
Standard_Integer n0 = thephdeb->Value (thephdeb->Length());
// Ceci donne dans thestw le numero du cumul des etapes
thestw->ChangeValue (n0) += weight;
thestw->Append (weight); // on ajoute cette etape
thephfin->ChangeValue (thephfin->Length()) ++;
}
void Interface_STAT::Description
(Standard_Integer& nbphases,
Standard_Real& total, Standard_CString& title) const
{
nbphases = (thephw.IsNull() ? 1 : thephw->Length());
total = thetotal;
title = thetitle->ToCString();
}
void Interface_STAT::Phase
(const Standard_Integer num,
Standard_Integer& n0step, Standard_Integer& nbstep,
Standard_Real& weight, Standard_CString& name) const
{
if (thephdeb.IsNull()) {
// Pas de phase, pas d etape ... donc une seule ...
n0step = -1; nbstep = 1; weight = 1.; name = voidname;
}
if (thephw.IsNull()) {
// Pas de phase mais des etapes
weight = 1.; name = voidname;
} else if (num < 1 || num > thephdeb->Length()) return;
else {
// Phase
weight = thephw->Value(num); name = thephnam->Value(num).ToCString();
n0step = thephdeb->Value(num);
nbstep = thephfin->Value(num);
}
// Voyons pour cette phase
}
Standard_Real Interface_STAT::Step (const Standard_Integer num) const
{
if (thestw.IsNull()) return 1.;
if (num < 1 || num > thestw->Length()) return 1.;
return thestw->Value(num);
}
// ############### COMPTAGE ################
// Le comptage se fait sur la base suivante :
// TOTAL : total des poids des phases par rapport auquel calculer
// PHASES : poids des phases passees et poids de la phase en cours
// Ces poids sont a ramener au TOTAL
// PHASE COURANTE : nb d items et nb de cycles declares
// Nb d items deja passes (cycle complet)
// CYCLE COURANT : nb d items de ce cycle, total des poids des etapes
// Poids des etapes deja passees, de l etape en cours, n0 etape en cours
// ETAPE COURANTE : nb d items deja passes
static struct zestat {
Standard_CString itle, name;
Standard_Real otal, // total des poids des phases
oldph, // poids des phases deja passes
phw, // poids de la phase en cours
otph, // poids des etapes de la phase en cours (cycle en cours)
oldst, // poids des etapes deja passees (cycle en cours)
stw; // poids etape en cours
Standard_Integer nbph, // total nb de phases
numph, // n0 phase en cours
n0, n1, // n0 et nb etapes dans phase en cours
nbitp, // nb items total phase
nbcyc, // nb cycles total phase
olditp, // nb items deja passes (cycles passes) / phase
numcyc, // n0 cycle en cours / phase
nbitc, // nb items cycle en cours
numst, // n0 etape en cours / cycle
numitem; // nb items deja passes / etape courante
} TheStat;
void Interface_STAT::Start
(const Standard_Integer items, const Standard_Integer cycles) const
{
statact = *this;
statact.Description (TheStat.nbph, TheStat.otal, TheStat.itle);
TheStat.oldph = TheStat.phw = 0.; TheStat.numph = 0;
NextPhase (items,cycles);
}
void Interface_STAT::StartCount
(const Standard_Integer items, const Standard_CString name)
{
Interface_STAT statcount(name);
statcount.Start (items);
}
void Interface_STAT::NextPhase
(const Standard_Integer items, const Standard_Integer cycles)
{
// On cumule la phase precedente au total, on efface les donnees "locales"
TheStat.numcyc = TheStat.numst = TheStat.olditp = 0; TheStat.oldst = TheStat.stw = 0.;
if (TheStat.numph >= TheStat.nbph) { End(); return; }
TheStat.numph ++; TheStat.oldph += TheStat.phw; // cumule sur cette phase
TheStat.nbitp = items; TheStat.nbcyc = cycles;
statact.Phase(TheStat.numph, TheStat.n0, TheStat.n1, TheStat.phw, TheStat.name);
TheStat.otph = (TheStat.n1 > 1 ? statact.Step (TheStat.n0) : 1.);
// si un seul cycle, on le demarre; sinon, attendre NextCycle
TheStat.nbitc = 0;
if (cycles == 1) NextCycle (items);
}
void Interface_STAT::SetPhase
(const Standard_Integer items, const Standard_Integer cycles)
{ TheStat.nbitp = items; TheStat.nbcyc = cycles; }
void Interface_STAT::NextCycle (const Standard_Integer items)
{
// cumul de ce cycle sur les cycles deja passes, raz etapes
TheStat.numcyc ++; TheStat.olditp += TheStat.nbitc;
// if (stat.olditem > stat.nbitp) return;
TheStat.numst = 1;
TheStat.oldst = 0.;
TheStat.stw = (TheStat.n1 > 1 ? statact.Step(TheStat.n0 + 1) : TheStat.otph);
TheStat.nbitc = items; TheStat.numitem = 0;
}
void Interface_STAT::NextStep ()
{
if (TheStat.numst >= TheStat.n1) return;
TheStat.numst ++; TheStat.oldst += TheStat.stw;
TheStat.numitem = 0;
TheStat.stw = statact.Step (TheStat.n0 + TheStat.numst);
}
void Interface_STAT::NextItem (const Standard_Integer nbitems)
{ TheStat.numitem += nbitems; }
void Interface_STAT::End ()
{ TheStat.oldph = TheStat.otal; TheStat.phw = TheStat.stw = 0.; TheStat.itle = TheStat.name = voidname; }
// ########### QUERY ############
Standard_CString Interface_STAT::Where (const Standard_Boolean phase)
{ return (phase ? TheStat.name : TheStat.itle); }
Standard_Integer Interface_STAT::Percent (const Standard_Boolean phase)
{
if (TheStat.numitem > TheStat.nbitc) TheStat.numitem = TheStat.nbitc;
// on compte les items deja passes
Standard_Real enphase =
TheStat.olditp * TheStat.otph + // cycles complets passes
TheStat.nbitc * TheStat.oldst + // cycle courant, etapes completes passees
TheStat.numitem * TheStat.stw; // etape courante
// proportion pour cette phase
Standard_Real prophase = enphase / (TheStat.nbitp * TheStat.otph);
Standard_Integer res = Standard_Integer (prophase*100.);
if (phase) return res;
// voila pour cette phase
// comptage dans les phases
Standard_Real encours = (TheStat.oldph + TheStat.phw * prophase) / TheStat.otal;
res = Standard_Integer (encours * 100.);
return res;
}